mirror of
				https://gitee.com/hhyykk/ipms-sjy-ui.git
				synced 2025-11-04 04:08:44 +08:00 
			
		
		
		
	重构:商品详情界面的路由、文件路径
This commit is contained in:
		@@ -195,22 +195,6 @@ const remainingRouter: AppRouteRecordRaw[] = [
 | 
				
			|||||||
      noTagsView: true
 | 
					      noTagsView: true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    path: '/trade/order',
 | 
					 | 
				
			||||||
    component: Layout,
 | 
					 | 
				
			||||||
    name: 'order',
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      hidden: true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: 'detail',
 | 
					 | 
				
			||||||
        name: 'TradeOrderDetail',
 | 
					 | 
				
			||||||
        component: () => import('@/views/mall/trade/order/tradeOrderDetail.vue'),
 | 
					 | 
				
			||||||
        meta: { title: '订单详情', hidden: true }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    path: '/403',
 | 
					    path: '/403',
 | 
				
			||||||
    component: () => import('@/views/Error/403.vue'),
 | 
					    component: () => import('@/views/Error/403.vue'),
 | 
				
			||||||
@@ -356,7 +340,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
 | 
				
			|||||||
    children: [
 | 
					    children: [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: 'spu/add',
 | 
					        path: 'spu/add',
 | 
				
			||||||
        component: () => import('@/views/mall/product/spu/addForm.vue'),
 | 
					        component: () => import('@/views/mall/product/spu/form/index.vue'),
 | 
				
			||||||
        name: 'ProductSpuAdd',
 | 
					        name: 'ProductSpuAdd',
 | 
				
			||||||
        meta: {
 | 
					        meta: {
 | 
				
			||||||
          noCache: true,
 | 
					          noCache: true,
 | 
				
			||||||
@@ -369,7 +353,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: 'spu/edit/:spuId(\\d+)',
 | 
					        path: 'spu/edit/:spuId(\\d+)',
 | 
				
			||||||
        component: () => import('@/views/mall/product/spu/addForm.vue'),
 | 
					        component: () => import('@/views/mall/product/spu/form/index.vue'),
 | 
				
			||||||
        name: 'ProductSpuEdit',
 | 
					        name: 'ProductSpuEdit',
 | 
				
			||||||
        meta: {
 | 
					        meta: {
 | 
				
			||||||
          noCache: true,
 | 
					          noCache: true,
 | 
				
			||||||
@@ -382,7 +366,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: 'spu/detail/:spuId(\\d+)',
 | 
					        path: 'spu/detail/:spuId(\\d+)',
 | 
				
			||||||
        component: () => import('@/views/mall/product/spu/addForm.vue'),
 | 
					        component: () => import('@/views/mall/product/spu/form/index.vue'),
 | 
				
			||||||
        name: 'ProductSpuDetail',
 | 
					        name: 'ProductSpuDetail',
 | 
				
			||||||
        meta: {
 | 
					        meta: {
 | 
				
			||||||
          noCache: true,
 | 
					          noCache: true,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,5 @@
 | 
				
			|||||||
import BasicInfoForm from './BasicInfoForm.vue'
 | 
					 | 
				
			||||||
import DescriptionForm from './DescriptionForm.vue'
 | 
					 | 
				
			||||||
import OtherSettingsForm from './OtherSettingsForm.vue'
 | 
					 | 
				
			||||||
import ProductAttributes from './ProductAttributes.vue'
 | 
					 | 
				
			||||||
import ProductPropertyAddForm from './ProductPropertyAddForm.vue'
 | 
					 | 
				
			||||||
import SkuList from './SkuList.vue'
 | 
					import SkuList from './SkuList.vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Spu } from '@/api/mall/product/spu'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface PropertyAndValues {
 | 
					interface PropertyAndValues {
 | 
				
			||||||
  id: number
 | 
					  id: number
 | 
				
			||||||
  name: string
 | 
					  name: string
 | 
				
			||||||
@@ -29,42 +22,4 @@ interface RuleConfig {
 | 
				
			|||||||
  message: string
 | 
					  message: string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					export { SkuList, PropertyAndValues, RuleConfig }
 | 
				
			||||||
 * 获得商品的规格列表
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @param spu
 | 
					 | 
				
			||||||
 * @return PropertyAndValues 规格列表
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
const getPropertyList = (spu: Spu): PropertyAndValues[] => {
 | 
					 | 
				
			||||||
  //  直接拿返回的 skus 属性逆向生成出 propertyList
 | 
					 | 
				
			||||||
  const properties: PropertyAndValues[] = []
 | 
					 | 
				
			||||||
  // 只有是多规格才处理
 | 
					 | 
				
			||||||
  if (spu.specType) {
 | 
					 | 
				
			||||||
    spu.skus?.forEach((sku) => {
 | 
					 | 
				
			||||||
      sku.properties?.forEach(({ propertyId, propertyName, valueId, valueName }) => {
 | 
					 | 
				
			||||||
        // 添加属性
 | 
					 | 
				
			||||||
        if (!properties?.some((item) => item.id === propertyId)) {
 | 
					 | 
				
			||||||
          properties.push({ id: propertyId!, name: propertyName!, values: [] })
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 添加属性值
 | 
					 | 
				
			||||||
        const index = properties?.findIndex((item) => item.id === propertyId)
 | 
					 | 
				
			||||||
        if (!properties[index].values?.some((value) => value.id === valueId)) {
 | 
					 | 
				
			||||||
          properties[index].values?.push({ id: valueId!, name: valueName! })
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return properties
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export {
 | 
					 | 
				
			||||||
  BasicInfoForm,
 | 
					 | 
				
			||||||
  DescriptionForm,
 | 
					 | 
				
			||||||
  OtherSettingsForm,
 | 
					 | 
				
			||||||
  ProductAttributes,
 | 
					 | 
				
			||||||
  ProductPropertyAddForm,
 | 
					 | 
				
			||||||
  SkuList,
 | 
					 | 
				
			||||||
  getPropertyList,
 | 
					 | 
				
			||||||
  PropertyAndValues,
 | 
					 | 
				
			||||||
  RuleConfig
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -175,13 +175,17 @@ import { propTypes } from '@/utils/propTypes'
 | 
				
			|||||||
import { checkSelectedNode, defaultProps, handleTree, treeToString } from '@/utils/tree'
 | 
					import { checkSelectedNode, defaultProps, handleTree, treeToString } from '@/utils/tree'
 | 
				
			||||||
import { createImageViewer } from '@/components/ImageViewer'
 | 
					import { createImageViewer } from '@/components/ImageViewer'
 | 
				
			||||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 | 
					import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 | 
				
			||||||
import { UploadImg, UploadImgs } from '@/components/UploadFile'
 | 
					import { PropertyAndValues, SkuList } from '@/views/mall/product/spu/components/index.ts'
 | 
				
			||||||
import { getPropertyList, ProductAttributes, ProductPropertyAddForm, SkuList } from './index'
 | 
					import ProductAttributes from './ProductAttributes.vue'
 | 
				
			||||||
 | 
					import ProductPropertyAddForm from './ProductPropertyAddForm.vue'
 | 
				
			||||||
import { basicInfoSchema } from './spu.data'
 | 
					import { basicInfoSchema } from './spu.data'
 | 
				
			||||||
import type { Spu } from '@/api/mall/product/spu'
 | 
					import type { Spu } from '@/api/mall/product/spu'
 | 
				
			||||||
import * as ProductCategoryApi from '@/api/mall/product/category'
 | 
					import * as ProductCategoryApi from '@/api/mall/product/category'
 | 
				
			||||||
import { getSimpleBrandList } from '@/api/mall/product/brand'
 | 
					import * as ProductBrandApi from '@/api/mall/product/brand'
 | 
				
			||||||
import { getSimpleTemplateList } from '@/api/mall/trade/delivery/expressTemplate/index'
 | 
					import * as ExpressTemplateApi from '@/api/mall/trade/delivery/expressTemplate'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defineOptions({ name: 'ProductSpuBasicInfoForm' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ====== 商品详情相关操作 ======
 | 
					// ====== 商品详情相关操作 ======
 | 
				
			||||||
const { allSchemas } = useCrudSchemas(basicInfoSchema)
 | 
					const { allSchemas } = useCrudSchemas(basicInfoSchema)
 | 
				
			||||||
/** 商品图预览 */
 | 
					/** 商品图预览 */
 | 
				
			||||||
@@ -198,9 +202,36 @@ const imagePreview = (args) => {
 | 
				
			|||||||
    urlList
 | 
					    urlList
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
// ====== end ======
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
defineOptions({ name: 'ProductSpuBasicInfoForm' })
 | 
					/**
 | 
				
			||||||
 | 
					 * 获得商品的规格列表
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param spu
 | 
				
			||||||
 | 
					 * @return PropertyAndValues 规格列表
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					const getPropertyList = (spu: Spu): PropertyAndValues[] => {
 | 
				
			||||||
 | 
					  //  直接拿返回的 skus 属性逆向生成出 propertyList
 | 
				
			||||||
 | 
					  const properties: PropertyAndValues[] = []
 | 
				
			||||||
 | 
					  // 只有是多规格才处理
 | 
				
			||||||
 | 
					  if (spu.specType) {
 | 
				
			||||||
 | 
					    spu.skus?.forEach((sku) => {
 | 
				
			||||||
 | 
					      sku.properties?.forEach(({ propertyId, propertyName, valueId, valueName }) => {
 | 
				
			||||||
 | 
					        // 添加属性
 | 
				
			||||||
 | 
					        if (!properties?.some((item) => item.id === propertyId)) {
 | 
				
			||||||
 | 
					          properties.push({ id: propertyId!, name: propertyName!, values: [] })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 添加属性值
 | 
				
			||||||
 | 
					        const index = properties?.findIndex((item) => item.id === propertyId)
 | 
				
			||||||
 | 
					        if (!properties[index].values?.some((value) => value.id === valueId)) {
 | 
				
			||||||
 | 
					          properties[index].values?.push({ id: valueId!, name: valueName! })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return properties
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ====== end ======
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const message = useMessage() // 消息弹窗
 | 
					const message = useMessage() // 消息弹窗
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -346,8 +377,8 @@ onMounted(async () => {
 | 
				
			|||||||
  const data = await ProductCategoryApi.getCategoryList({})
 | 
					  const data = await ProductCategoryApi.getCategoryList({})
 | 
				
			||||||
  categoryList.value = handleTree(data, 'id', 'parentId')
 | 
					  categoryList.value = handleTree(data, 'id', 'parentId')
 | 
				
			||||||
  // 获取商品品牌列表
 | 
					  // 获取商品品牌列表
 | 
				
			||||||
  brandList.value = await getSimpleBrandList()
 | 
					  brandList.value = await ProductBrandApi.getSimpleBrandList()
 | 
				
			||||||
  // 获取运费模版
 | 
					  // 获取运费模版
 | 
				
			||||||
  deliveryTemplateList.value = await getSimpleTemplateList()
 | 
					  deliveryTemplateList.value = await ExpressTemplateApi.getSimpleTemplateList()
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
@@ -39,13 +39,12 @@
 | 
				
			|||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { cloneDeep } from 'lodash-es'
 | 
					import { cloneDeep } from 'lodash-es'
 | 
				
			||||||
import { useTagsViewStore } from '@/store/modules/tagsView'
 | 
					import { useTagsViewStore } from '@/store/modules/tagsView'
 | 
				
			||||||
import { BasicInfoForm, DescriptionForm, OtherSettingsForm } from './components'
 | 
					 | 
				
			||||||
// 业务api
 | 
					 | 
				
			||||||
import * as ProductSpuApi from '@/api/mall/product/spu'
 | 
					import * as ProductSpuApi from '@/api/mall/product/spu'
 | 
				
			||||||
 | 
					import BasicInfoForm from './BasicInfoForm.vue'
 | 
				
			||||||
 | 
					import DescriptionForm from './DescriptionForm.vue'
 | 
				
			||||||
 | 
					import OtherSettingsForm from './OtherSettingsForm.vue'
 | 
				
			||||||
import { convertToInteger, floatToFixed2, formatToFraction } from '@/utils'
 | 
					import { convertToInteger, floatToFixed2, formatToFraction } from '@/utils'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO @芋艿:后续稍微调整下;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
defineOptions({ name: 'ProductSpuForm' })
 | 
					defineOptions({ name: 'ProductSpuForm' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const { t } = useI18n() // 国际化
 | 
					const { t } = useI18n() // 国际化
 | 
				
			||||||
		Reference in New Issue
	
	Block a user