weixin_52219567 2 luni în urmă
părinte
comite
19a447a8a0

+ 18 - 1
package.json

@@ -7,7 +7,24 @@
   "license": "MIT",
   "type": "module",
   "scripts": {
-    "dev": "vite serve --mode development",
+    "dev:www": "vite --port 5101",
+    "dev:b":   "vite --port 5102",
+    "dev:mro":   "vite --port 5103",
+    "dev:fuli":   "vite --port 5104",
+    "dev:reg":   "vite --port 5105",
+    "dev:breg":   "vite --port 5106",
+    "dev:greg":   "vite --port 5107",
+    "dev:passport":   "vite --port 5108",
+    "dev:search":   "vite --port 5109",
+    "dev:item":   "vite --port 5110",
+    "dev:cart":   "vite --port 5111",
+    "dev:trad":   "vite --port 5112",
+    "dev:payc":   "vite --port 5113",
+    "dev:order":   "vite --port 5114",
+    "dev:plan":   "vite --port 5115",
+    "dev:plan_info":   "vite --port 5116",
+    "dev:i":   "vite --port 5117",
+    "dev:easybuv": "vite --port 5118",
     "build:prod": "vite build --mode production",
     "build:dev": "vite build --mode development",
     "preview": "vite preview",

+ 58 - 3
src/api/goods/index.ts

@@ -18,12 +18,67 @@ export const addProductShoppingCart = (params: any) => {
   });
 };
 
-
-//查询商品购物车列表
+//查询购物车的商品
 
 export const shoppingCartList = (params: any) => {
   return request({
-    url: '/product/shoppingCart/list',
+    url: '/product/myProduct/getProductShoppingCartPage',
+    method: 'get'
+  });
+};
+
+//删除购物车商品
+
+export const deleteProductShoppingCart = (ids: any) => {
+  return request({
+    url: '/product/myProduct/deleteProductShoppingCart/' + ids,
+    method: 'delete'
+  });
+};
+
+//新增商品浏览记录
+
+export const addProductBrowsingHistory = (id: any) => {
+  return request({
+    url: '/product/myProduct/addProductBrowsingHistory/' + id,
+    method: 'post'
+  });
+};
+
+//查询商品是否在默认收藏夹收藏
+
+export const isProductInDefaultCollect = (id: any) => {
+  return request({
+    url: '/product/myProduct/isProductInDefaultCollect/' + id,
     method: 'get'
   });
 };
+
+//新增商品收藏夹
+
+export const addProductCollect = (params: any) => {
+  return request({
+    url: '/product/myProduct/addProductCollect',
+    method: 'post',
+    data: params
+  });
+};
+
+//查询商品收藏夹列表
+
+export const favoritesList = (params: any) => {
+  return request({
+    url: '/product/favorites/list',
+    method: 'get'
+  });
+};
+
+//取消收藏
+
+export const cancelProductCollect = (query: any) => {
+  return request({
+    url: '/product/myProduct/cancelProductCollect',
+    method: 'delete',
+    params: query
+  });
+};

+ 10 - 0
src/api/search/index.ts

@@ -0,0 +1,10 @@
+import request from '@/utils/request';
+
+//列表
+export const getPcProductPage = (query: any) => {
+  return request({
+    url: '/product/indexProduct/getPcProductPage',
+    method: 'get',
+    params: query
+  });
+};

+ 4 - 2
src/layout/components/search.vue

@@ -7,13 +7,13 @@
         <div class="search-div flex-row-start">
           <div class="search-input flex-row-center">
             <el-input class="el-input" v-model="input" placeholder="搜索商品、品牌、分类..." />
-            <div class="bnt flex-row-center">
+            <div class="bnt flex-row-center" @click="onPath('/search')">
               <el-icon color="#ffffff" size="20">
                 <Search />
               </el-icon>
             </div>
           </div>
-          <div class="cat-bos flex-row-center">
+          <div class="cat-bos flex-row-center" @click="onPath('/cart')">
             <img src="@/assets/images/layout/layout4.png" alt="" />
             <span>我的购物车</span>
           </div>
@@ -34,6 +34,7 @@
 </template>
 
 <script setup lang="ts">
+import { onPath } from '@/utils/siteConfig';
 const input = ref('');
 const route = useRoute();
 const meta = ref<any>({});
@@ -105,6 +106,7 @@ watch(route, () => {
           margin-left: 24px;
           font-size: 16px;
           color: #e7000b;
+          cursor: pointer;
 
           img {
             width: 16px;

+ 11 - 9
src/layout/components/workbench.vue

@@ -26,6 +26,7 @@
 import { ref, computed, watch, onMounted } from 'vue';
 import { useRouter, useRoute } from 'vue-router';
 import { ArrowDown, ArrowRight, RefreshRight, Van, Medal } from '@element-plus/icons-vue';
+import { onPath } from '@/utils/siteConfig';
 
 const router = useRouter();
 const route = useRoute();
@@ -38,7 +39,7 @@ const menuList = [
     children: [
       { path: '/enterprise/companyInfo', title: '企业信息' },
       { path: '/enterprise/messageNotice', title: '消息通知' },
-      { path: '/enterprise/addressManage', title: '地址管理' },
+      { path: '/easybuv', title: '地址管理' },
       { path: '/enterprise/invoiceManage', title: '发票抬头管理' },
       { path: '/enterprise/purchasePlan', title: '专属采购方案' },
       { path: '/enterprise/agreementSupply', title: '协议供货' },
@@ -48,15 +49,15 @@ const menuList = [
     ]
   },
   {
-    path: '/trade',
+    path: '/order',
     title: '交易管理',
     icon: 'ShoppingCart',
     children: [
-      { path: '/trade/orderManage', title: '订单管理' },
-      { path: '/trade/orderAudit', title: '审核订单' },
-      { path: '/trade/afterSale', title: '售后服务' },
-      { path: '/trade/batchOrder', title: '批量下单' },
-      { path: '/trade/orderEvaluation', title: '订单评价' }
+      { path: '/order/orderManage', title: '订单管理' },
+      { path: '/order/orderAudit', title: '审核订单' },
+      { path: '/order/afterSale', title: '售后服务' },
+      { path: '/order/batchOrder', title: '批量下单' },
+      { path: '/order/orderEvaluation', title: '订单评价' }
     ]
   },
   {
@@ -64,7 +65,7 @@ const menuList = [
     title: '组织管理',
     icon: 'OfficeBuilding',
     children: [
-      { path: '/organization/personalInfo', title: '个人信息' },
+      { path: '/i', title: '个人信息' },
       { path: '/organization/deptManage', title: '部门管理' },
       { path: '/organization/staffManage', title: '人员管理' },
       { path: '/organization/roleManage', title: '角色管理' },
@@ -153,7 +154,8 @@ const toggleMenu = (path: string) => {
 };
 
 const handleMenuSelect = (path: string) => {
-  router.push(path);
+  onPath(path);
+  // router.push(path);
 };
 
 const handleSearch = (keyword: string) => {

+ 33 - 35
src/permission.ts

@@ -3,63 +3,61 @@ import router from './router';
 import NProgress from 'nprogress';
 import 'nprogress/nprogress.css';
 import { getToken } from '@/utils/auth';
-import { isHttp, isPathMatch } from '@/utils/validate';
-import { isRelogin } from '@/utils/request';
+import { isPathMatch } from '@/utils/validate';
 import { useUserStore } from '@/store/modules/user';
-import { useSettingsStore } from '@/store/modules/settings';
-import { usePermissionStore } from '@/store/modules/permission';
 import { ElMessage } from 'element-plus/es';
+import { getCurrentSite, SITE_ROUTES } from '@/utils/siteConfig';
 
 NProgress.configure({ showSpinner: false });
-const whiteList = ['/login', '/register', '/social-callback', '/register*', '/register/*'];
+const whiteList = ['/login', '/register', '/social-callback', '/register*', '/register/*', '/index', '/'];
 
 const isWhiteList = (path: string) => {
   return whiteList.some((pattern) => isPathMatch(pattern, path));
 };
 
+// 获取主站完整 URL(用于跨域跳转)
+function getMainSiteUrl(path: any) {
+  if (import.meta.env.PROD) {
+    return `https://www.yoe365.com${path}`;
+  } else {
+    return `http://localhost:5101${path}`;
+  }
+}
+
 router.beforeEach(async (to, from, next) => {
   NProgress.start();
+  const site = getCurrentSite();
+  const allowedPaths = SITE_ROUTES[site];
+  const host = window.location.hostname;
+  const port = window.location.port;
   if (getToken()) {
-    to.meta.title && useSettingsStore().setTitle(to.meta.title as string);
-    /* has token*/
-    if (to.path === '/login') {
-      next({ path: '/' });
+    const [err] = await tos(useUserStore().getInfo());
+    if (err) {
+      await useUserStore().logout();
+      ElMessage.error(err);
+      window.location.href = getMainSiteUrl('/index');
       NProgress.done();
-    } else if (isWhiteList(to.path)) {
-      next();
     } else {
-      if (useUserStore().roles.length === 0) {
-        isRelogin.show = true;
-        // 判断当前用户是否已拉取完user_info信息
-        const [err] = await tos(useUserStore().getInfo());
-        if (err) {
-          await useUserStore().logout();
-          ElMessage.error(err);
-          next({ path: '/' });
-        } else {
-          isRelogin.show = false;
-          const accessRoutes = await usePermissionStore().generateRoutes();
-          // 根据roles权限生成可访问的路由表
-          accessRoutes.forEach((route) => {
-            if (!isHttp(route.path)) {
-              router.addRoute(route); // 动态添加可访问路由表
-            }
-          });
-          // @ts-expect-error hack方法 确保addRoutes已完成
-          next({ path: to.path, replace: true, params: to.params, query: to.query, hash: to.hash, name: to.name as string }); // hack方法 确保addRoutes已完成
-        }
+      if (!allowedPaths.includes(to.path)) {
+        console.warn(`[${site}] 禁止访问 ${to.path}`);
+        window.location.href = getMainSiteUrl('/index');
+        NProgress.done();
       } else {
         next();
+        NProgress.done();
       }
     }
   } else {
     // 没有token
     if (isWhiteList(to.path)) {
-      // 在免登录白名单,直接进入
-      next();
+      if (host == 'www.yoe365.com' || port == '5101') {
+        next();
+      } else {
+        window.location.href = getMainSiteUrl(to.path);
+      }
+      NProgress.done();
     } else {
-      const redirect = encodeURIComponent(to.fullPath || '/');
-      next(`/login?redirect=${redirect}`); // 否则全部重定向到登录页
+      window.location.href = getMainSiteUrl('/index');
       NProgress.done();
     }
   }

+ 113 - 76
src/router/index.ts

@@ -66,55 +66,139 @@ export const constantRoutes: RouteRecordRaw[] = [
         path: '/index',
         component: () => import('@/views/index.vue'),
         name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true, nav: true }
+        meta: { title: '优易365', icon: 'dashboard', affix: true, nav: true }
       },
       {
-        path: 'solve/index',
-        component: () => import('@/views/solve/index.vue'),
-        name: 'solveIndex',
-        meta: { title: '解决方案', nav: true, breadcrumb: true }
+        path: '/indexB',
+        component: () => import('@/views/home/index-b.vue'),
+        name: 'IndexB',
+        meta: { title: '企业购商城', icon: 'dashboard', affix: true, nav: true }
       },
       {
-        path: 'solve/info',
-        component: () => import('@/views/solve/info.vue'),
-        name: 'solveInfo',
-        meta: { title: '解决方案详情', nav: true, breadcrumb: true, navList: [{ title: '解决方案', url: '/solve/index' }] }
+        path: '/indexMro',
+        component: () => import('@/views/home/index-mro.vue'),
+        name: 'IndexMro',
+        meta: { title: '工业品商城', icon: 'dashboard', affix: true, nav: true }
       },
       {
-        path: 'solve/real',
-        component: () => import('@/views/solve/real.vue'),
-        name: 'solveReal',
-        meta: { title: '资讯详情', nav: true, breadcrumb: true, breadcrumbColor: '#F4F4F4' }
+        path: '/indexFuli',
+        component: () => import('@/views/home/index-fuli.vue'),
+        name: 'IndexFuli',
+        meta: { title: '福礼商城', icon: 'dashboard', affix: true, nav: true }
+      },
+      {
+        path: '/reg',
+        component: () => import('@/views/reg/index.vue'),
+        name: 'Reg',
+        meta: { title: '个人注册', icon: 'dashboard', affix: true, nav: true }
+      },
+      {
+        path: '/breg',
+        component: () => import('@/views/breg/index.vue'),
+        name: 'Breg',
+        meta: { title: '企业注册', header: 'hide', search: 'hide' }
+      },
+      {
+        path: '/greg',
+        component: () => import('@/views/greg/index.vue'),
+        name: 'Greg',
+        meta: { title: '供应商注册', header: 'hide', search: 'hide' }
+      },
+      {
+        path: '/search',
+        component: () => import('@/views/search/index.vue'),
+        name: 'Search',
+        meta: { title: '搜索', icon: 'dashboard', affix: true, nav: true }
       },
       {
-        path: 'shop/info',
-        component: () => import('@/views/shop/info.vue'),
-        name: 'shopInfo',
+        path: '/item',
+        component: () => import('@/views/item/index.vue'),
+        name: 'Item',
         meta: { title: '商品详情', nav: true, breadcrumb: true, breadcrumbColor: '#F4F4F4' }
       },
       {
-        path: 'shop/cart',
-        component: () => import('@/views/shop/cart.vue'),
-        name: 'shopCart',
+        path: '/cart',
+        component: () => import('@/views/cart/index.vue'),
+        name: 'Cart',
         meta: { title: '我的购物车', nav: true }
       },
       {
-        path: 'shop/create',
-        component: () => import('@/views/shop/create.vue'),
-        name: 'shopCreate',
+        path: '/trad',
+        component: () => import('@/views/trad/index.vue'),
+        name: 'Trad',
         meta: { title: '确认订单信息', nav: true }
       },
       {
-        path: 'shop/pay',
-        component: () => import('@/views/shop/pay.vue'),
+        path: '/payc',
+        component: () => import('@/views/payc/index.vue'),
         name: 'shopPay',
         meta: { title: '支付订单', nav: true }
       },
       {
-        path: 'register/enterprise',
-        component: () => import('@/views/register/enterprise.vue'),
-        name: 'registerEnterprise',
-        meta: { title: '企业注册', header: 'hide', search: 'hide' }
+        path: 'solve/real',
+        component: () => import('@/views/solve/real.vue'),
+        name: 'solveReal',
+        meta: { title: '资讯详情', nav: true, breadcrumb: true, breadcrumbColor: '#F4F4F4' }
+      },
+      {
+        path: '/order/orderManage',
+        name: 'OrderManage',
+        component: () => import('@/views/order/orderManage/index.vue'),
+        meta: { title: '订单管理', workbench: true }
+      },
+      {
+        path: '/order/orderManage/detail/:orderNo',
+        name: 'OrderDetail',
+        component: () => import('@/views/order/orderManage/detail.vue'),
+        meta: { title: '订单详情', hidden: true, workbench: true }
+      },
+      {
+        path: '/order/orderAudit',
+        name: 'OrderAudit',
+        component: () => import('@/views/order/orderAudit/index.vue'),
+        meta: { title: '审核订单', workbench: true }
+      },
+      {
+        path: '/order/afterSale',
+        name: 'AfterSale',
+        component: () => import('@/views/order/afterSale/index.vue'),
+        meta: { title: '售后服务', workbench: true }
+      },
+      {
+        path: '/order/batchOrder',
+        name: 'BatchOrder',
+        component: () => import('@/views/order/batchOrder/index.vue'),
+        meta: { title: '批量下单', workbench: true }
+      },
+      {
+        path: '/order/orderEvaluation',
+        name: 'OrderEvaluation',
+        component: () => import('@/views/order/orderEvaluation/index.vue'),
+        meta: { title: '订单评价', workbench: true }
+      },
+      {
+        path: '/plan',
+        component: () => import('@/views/plan/index.vue'),
+        name: 'Plan',
+        meta: { title: '解决方案', nav: true, breadcrumb: true }
+      },
+      {
+        path: '/plan_info',
+        component: () => import('@/views/plan_info/index.vue'),
+        name: 'PlanInfo',
+        meta: { title: '解决方案详情', nav: true, breadcrumb: true, navList: [{ title: '解决方案', url: '/plan' }] }
+      },
+      {
+        path: '/i',
+        name: 'I',
+        component: () => import('@/views/i/index.vue'),
+        meta: { title: '个人信息', workbench: true }
+      },
+      {
+        path: '/easybuv',
+        name: 'Easybuv',
+        component: () => import('@/views/easybuv/index.vue'),
+        meta: { title: '地址管理', workbench: true }
       },
       {
         path: 'enterprise/companyInfo',
@@ -158,12 +242,7 @@ export const constantRoutes: RouteRecordRaw[] = [
         component: () => import('@/views/enterprise/messageNotice/index.vue'),
         meta: { title: '消息通知', workbench: true }
       },
-      {
-        path: 'enterprise/addressManage',
-        name: 'AddressManage',
-        component: () => import('@/views/enterprise/addressManage/index.vue'),
-        meta: { title: '地址管理', workbench: true }
-      },
+
       {
         path: 'enterprise/invoiceManage',
         name: 'InvoiceManage',
@@ -200,48 +279,6 @@ export const constantRoutes: RouteRecordRaw[] = [
         component: () => import('@/views/enterprise/myFootprint/index.vue'),
         meta: { title: '我的足迹', workbench: true }
       },
-      {
-        path: 'trade/orderManage',
-        name: 'OrderManage',
-        component: () => import('@/views/trade/orderManage/index.vue'),
-        meta: { title: '订单管理', workbench: true }
-      },
-      {
-        path: 'trade/orderManage/detail/:orderNo',
-        name: 'OrderDetail',
-        component: () => import('@/views/trade/orderManage/detail.vue'),
-        meta: { title: '订单详情', hidden: true, workbench: true }
-      },
-      {
-        path: 'trade/orderAudit',
-        name: 'OrderAudit',
-        component: () => import('@/views/trade/orderAudit/index.vue'),
-        meta: { title: '审核订单', workbench: true }
-      },
-      {
-        path: 'trade/afterSale',
-        name: 'AfterSale',
-        component: () => import('@/views/trade/afterSale/index.vue'),
-        meta: { title: '售后服务', workbench: true }
-      },
-      {
-        path: 'trade/batchOrder',
-        name: 'BatchOrder',
-        component: () => import('@/views/trade/batchOrder/index.vue'),
-        meta: { title: '批量下单', workbench: true }
-      },
-      {
-        path: 'trade/orderEvaluation',
-        name: 'OrderEvaluation',
-        component: () => import('@/views/trade/orderEvaluation/index.vue'),
-        meta: { title: '订单评价', workbench: true }
-      },
-      {
-        path: 'organization/personalInfo',
-        name: 'PersonalInfo',
-        component: () => import('@/views/organization/personalInfo/index.vue'),
-        meta: { title: '个人信息', workbench: true }
-      },
       {
         path: 'organization/deptManage',
         name: 'DeptManage',

+ 2 - 0
src/types/components.d.ts

@@ -22,7 +22,9 @@ declare module 'vue' {
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCarousel: typeof import('element-plus/es')['ElCarousel']
     ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
+    ElCascader: typeof import('element-plus/es')['ElCascader']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']

+ 0 - 1
src/utils/auth.ts

@@ -4,7 +4,6 @@ const tokenStorage = useStorage<null | string>(TokenKey, null);
 
 // TODO: 临时测试用的固定token,正式环境需要删除
 const TEST_TOKEN = '';
-
 export const getToken = () => tokenStorage.value || TEST_TOKEN;
 
 export const setToken = (access_token: string) => (tokenStorage.value = access_token);

+ 40 - 22
src/utils/request.ts

@@ -10,6 +10,7 @@ import FileSaver from 'file-saver';
 import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto';
 import { encrypt, decrypt } from '@/utils/jsencrypt';
 import router from '@/router';
+import { getApiBase } from '@/utils/siteConfig';
 
 const encryptHeader = 'encrypt-key';
 let downloadLoadingInstance: LoadingInstance;
@@ -26,7 +27,9 @@ axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
 axios.defaults.headers['clientid'] = import.meta.env.VITE_APP_CLIENT_ID;
 // 创建 axios 实例
 const service = axios.create({
-  baseURL: import.meta.env.VITE_APP_BASE_API,
+  // baseURL: import.meta.env.VITE_APP_BASE_API,
+  baseURL: getApiBase(),
+  // withCredentials: true,
   timeout: 50000,
   transitional: {
     // 超时错误更明确
@@ -34,10 +37,18 @@ const service = axios.create({
   }
 });
 
+// 获取主站完整 URL(用于跨域跳转)
+function getMainSiteUrl(path: any) {
+  if (import.meta.env.PROD) {
+    return `https://www.yoe365.com${path}`;
+  } else {
+    return `http://localhost:5101${path}`;
+  }
+}
+
 // 请求拦截器
 service.interceptors.request.use(
   (config: InternalAxiosRequestConfig) => {
-
     const isToken = config.headers?.isToken === false;
     // 是否需要防止数据重复提交
     const isRepeatSubmit = config.headers?.repeatSubmit === false;
@@ -127,26 +138,33 @@ service.interceptors.response.use(
     }
     if (code === 401) {
       // prettier-ignore
-      if (!isRelogin.show) {
-        isRelogin.show = true;
-        ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
-          confirmButtonText: '重新登录',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(() => {
-          isRelogin.show = false;
-          useUserStore().logout().then(() => {
-            router.replace({
-              path: '/login',
-              query: {
-                redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
-              }
-            })
-          });
-        }).catch(() => {
-          isRelogin.show = false;
-        });
-      }
+      // if (!isRelogin.show) {
+      //   isRelogin.show = true;
+      //   useUserStore().logout().then(() => {
+      //     window.location.href = getMainSiteUrl('/index');
+      //   });
+
+      // ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+      //   confirmButtonText: '重新登录',
+      //   cancelButtonText: '取消',
+      //   type: 'warning'
+      // }).then(() => {
+      //   isRelogin.show = false;
+      //   useUserStore().logout().then(() => {
+      //     router.replace({
+      //       path: '/login',
+      //       query: {
+      //         redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
+      //       }
+      //     })
+      //   });
+      // }).catch(() => {
+      //   isRelogin.show = false;
+      // });
+      // }
+      useUserStore().logout().then(() => {
+        window.location.href = getMainSiteUrl('/index');
+      });
       return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
     } else if (code === HttpStatus.SERVER_ERROR) {
       ElMessage({ message: msg, type: 'error' });

+ 179 - 0
src/utils/siteConfig.ts

@@ -0,0 +1,179 @@
+// src/utils/site.ts
+
+// 开发环境:端口 → 站点
+const DEV_PORT_MAP: Record<string, any> = {
+  '5101': 'www',
+  '5102': 'b',
+  '5103': 'mro',
+  '5104': 'fuli',
+  '5105': 'reg',
+  '5106': 'breg',
+  '5107': 'greg',
+  '5108': 'passport',
+  '5109': 'search',
+  '5110': 'item',
+  '5111': 'cart',
+  '5112': 'trad',
+  '5113': 'payc',
+  '5114': 'order',
+  '5115': 'plan',
+  '5116': 'plan_info',
+  '5117': 'i',
+  '5118': 'easybuv'
+};
+
+// 每个站点允许的路由
+export const SITE_ROUTES: Record<any, string[]> = {
+  www: ['/', '/index'], //优易365主站
+  b: ['/indexB'], //企业购商城
+  mro: ['/indexMro'], //工业品商城
+  fuli: ['/indexFuli'], //福礼商城
+  reg: ['/reg'], //个人注册
+  breg: ['/breg'], //企业注册
+  greg: ['/greg'], //供应商注册
+  passport: ['/login'], //登录页
+  search: ['/search'], //搜索
+  item: ['/item'], //商品详情,
+  cart: ['/cart'], //商品详情
+  trad: ['/trad'], //确认订单信息
+  payc: ['/payc'], //支付订单
+  order: ['/order/orderManage', '/order/orderManage/detail', '/order/orderAudit', '/order/afterSale', '/order/batchOrder', '/order/orderEvaluation'], //订单列表
+  plan: ['/plan'], //解决方案
+  plan_info: ['/plan_info'], //信息展示
+  i: ['/i'], //个人信息
+  easybuv: ['/easybuv'] //地址管理
+};
+
+// 获取当前站点(开发用端口,线上用域名)
+export function getCurrentSite(): any {
+  if (import.meta.env.PROD) {
+    // 线上:根据域名判断
+    const host = window.location.hostname;
+    if (host === 'b.yoe365.com') return 'b';
+    if (host === 'mro.yoe365.com') return 'mro';
+    if (host === 'mro.yoe365.com') return 'fuli';
+    if (host === 'mro.yoe365.com') return 'reg';
+    if (host === 'mro.yoe365.com') return 'breg';
+    if (host === 'mro.yoe365.com') return 'greg';
+    if (host === 'mro.yoe365.com') return 'passport';
+    if (host === 'mro.yoe365.com') return 'search';
+    if (host === 'mro.yoe365.com') return 'item';
+    if (host === 'mro.yoe365.com') return 'cart';
+    if (host === 'mro.yoe365.com') return 'trad';
+    if (host === 'mro.yoe365.com') return 'payc';
+    if (host === 'mro.yoe365.com') return 'order';
+    if (host === 'mro.yoe365.com') return 'plan';
+    if (host === 'mro.yoe365.com') return 'plan_info';
+    if (host === 'mro.yoe365.com') return 'i';
+    if (host === 'mro.yoe365.com') return 'easybuv';
+    return 'www';
+  }
+
+  // 本地:根据端口判断
+  const port = window.location.port || '80';
+  return DEV_PORT_MAP[port] || 'www';
+}
+
+// 根据站点返回 API 基地址
+
+export function getApiBase() {
+  const site = getCurrentSite();
+  const map: Record<any, string> = {
+    www: 'https://www.yoe365.com',
+    b: 'https://b.yoe365.com',
+    mro: 'https://mro.yoe365.com',
+    fuli: 'https://fuli.yoe365.com',
+    reg: 'https://reg.yoe365.com',
+    breg: 'https://breg.yoe365.com',
+    greg: 'https://greg.yoe365.com',
+    passport: 'https://passport.yoe365.com',
+    search: 'https://search.yoe365.com',
+    item: 'https://item.yoe365.com',
+    cart: 'https://cart.yoe365.com',
+    trad: 'https://trad.yoe365.com',
+    payc: 'https://payc.yoe365.com',
+    order: 'https://order.yoe365.com',
+    plan: 'https://plan.yoe365.com',
+    plan_info: 'https://plan_info.yoe365.com',
+    i: 'https://i.yoe365.com',
+    easybuv: 'https://easybuv.yoe365.com'
+  };
+  if (import.meta.env.PROD) {
+    return map[site];
+  } else {
+    // return '/dev-api'
+    // return 'http://192.168.1.52:8080';
+    return 'https://ceshi.xiaoluwebsite.xyz';
+  }
+}
+
+const PATH_TO_SITE_MAP: Record<string, any> = {};
+for (const [site, paths] of Object.entries(SITE_ROUTES)) {
+  for (const path of paths) {
+    PATH_TO_SITE_MAP[path] = site as any;
+  }
+}
+
+export function getSiteByPath(path: string): any | null {
+  // 支持带查询参数(如 /login?redirect=xxx)
+  const cleanPath = path.split('?')[0];
+  return PATH_TO_SITE_MAP[cleanPath] || null;
+}
+export function onPath(path: string) {
+  const targetSite = getSiteByPath(path);
+  if (!targetSite) {
+    // window.open(url, '_blank');
+    console.error(`[跨站跳转失败] 路径 "${path}" 未关联任何站点`);
+    return;
+  }
+
+  let url = '';
+
+  if (import.meta.env.PROD) {
+    const domainMap: Record<any, string> = {
+      www: 'https://www.yoe365.com',
+      b: 'https://b.yoe365.com',
+      mro: 'https://mro.yoe365.com',
+      fuli: 'https://fuli.yoe365.com',
+      reg: 'https://reg.yoe365.com',
+      breg: 'https://breg.yoe365.com',
+      greg: 'https://greg.yoe365.com',
+      passport: 'https://passport.yoe365.com',
+      search: 'https://search.yoe365.com',
+      item: 'https://item.yoe365.com',
+      cart: 'https://cart.yoe365.com',
+      trad: 'https://trad.yoe365.com',
+      payc: 'https://payc.yoe365.com',
+      order: 'https://order.yoe365.com',
+      plan: 'https://plan.yoe365.com',
+      plan_info: 'https://plan_info.yoe365.com',
+      i: 'https://i.yoe365.com',
+      easybuv: 'https://easybuv.yoe365.com'
+    };
+    url = `${domainMap[targetSite]}${path}`;
+  } else {
+    const portMap: Record<any, string> = {
+      www: 'http://localhost:5101',
+      b: 'http://localhost:5102',
+      mro: 'http://localhost:5103',
+      fuli: 'http://localhost:5104',
+      reg: 'http://localhost:5105',
+      breg: 'http://localhost:5106',
+      greg: 'http://localhost:5107',
+      passport: 'http://localhost:5108',
+      search: 'http://localhost:5109',
+      item: 'http://localhost:5110',
+      cart: 'http://localhost:5111',
+      trad: 'http://localhost:5112',
+      payc: 'http://localhost:5113',
+      order: 'http://localhost:5114',
+      plan: 'http://localhost:5115',
+      plan_info: 'http://localhost:5116',
+      i: 'http://localhost:5117',
+      easybuv: 'http://localhost:5118'
+    };
+    url = `${portMap[targetSite]}${path}`;
+  }
+
+  window.open(url, '_blank');
+}

+ 0 - 0
src/views/register/enterprise.vue → src/views/breg/index.vue


+ 40 - 19
src/views/shop/cart.vue → src/views/cart/index.vue

@@ -21,27 +21,26 @@
         <el-table-column label="商品信息" width="490">
           <template #default="scope">
             <div class="cart-info">
-              <img class="cart-img" src="@/assets/images/login-background.jpg" alt="" />
+              <img class="cart-img" :src="scope.row.productImage" alt="" />
               <div class="cart-text">
-                <div class="text1">清华同方超越E500台式机电脑超越E500台式机电脑(i3-6100/4G/1T/19.5寸)</div>
+                <div class="text1">{{ scope.row.itemName }}</div>
                 <div class="text2">
-                  <span>规格01</span>
-                  <span>规格02</span>
+                  <span>单位:{{ scope.row.unitName }}</span>
                 </div>
               </div>
             </div>
           </template>
         </el-table-column>
         <el-table-column label="单价" width="130">
-          <template #default="scope"> ¥1,299 </template>
+          <template #default="scope"> ¥{{ scope.row.memberPrice }} </template>
         </el-table-column>
         <el-table-column label="数量" width="200">
           <template #default="scope">
-            <el-input-number v-model="scope.row.num" :min="1" :max="10" />
+            <el-input-number v-model="scope.row.productNum" :min="1" :max="10" />
           </template>
         </el-table-column>
         <el-table-column label="小计" width="140">
-          <template #default="scope"> ¥1,299 </template>
+          <template #default="scope"> ¥{{ scope.row.memberPrice * scope.row.productNum }} </template>
         </el-table-column>
         <el-table-column label="操作">
           <template #default="scope">
@@ -49,14 +48,14 @@
               <el-button link> 移入收藏 </el-button>
             </div>
             <div>
-              <el-button link> 删除 </el-button>
+              <el-button link @click="onDel(scope.row)"> 删除 </el-button>
             </div>
           </template>
         </el-table-column>
       </el-table>
       <div class="cart-shi">失效商品</div>
       <el-table
-        :data="tableData"
+        :data="noTableData"
         style="width: 100%"
         :header-cell-style="{
           color: '#1D2129',
@@ -71,12 +70,11 @@
         <el-table-column label="商品信息" width="490">
           <template #default="scope">
             <div class="cart-info">
-              <img class="cart-img" src="@/assets/images/login-background.jpg" alt="" />
+              <img class="cart-img" :src="scope.row.productImage" alt="" />
               <div class="cart-text">
-                <div class="text1">清华同方超越E500台式机电脑超越E500台式机电脑(i3-6100/4G/1T/19.5寸)</div>
+                <div class="text1">{{ scope.row.itemName }}</div>
                 <div class="text2">
-                  <span>规格01</span>
-                  <span>规格02</span>
+                  <span>单位:{{ scope.row.unitName }}</span>
                 </div>
                 <div class="text3">当前商品库存不足,当前库存量:999把</div>
               </div>
@@ -84,7 +82,7 @@
           </template>
         </el-table-column>
         <el-table-column label="单价" width="130">
-          <template #default="scope"> ¥1,299 </template>
+          <template #default="scope"> ¥{{ scope.row.memberPrice }} </template>
         </el-table-column>
         <el-table-column label="数量" width="200">
           <template #default="scope">
@@ -92,7 +90,7 @@
           </template>
         </el-table-column>
         <el-table-column label="小计" width="140">
-          <template #default="scope"> ¥1,299 </template>
+          <template #default="scope"> ¥{{ scope.row.memberPrice * scope.row.productNum }} </template>
         </el-table-column>
         <el-table-column label="操作">
           <template #default="scope">
@@ -100,7 +98,7 @@
               <el-button link> 移入收藏 </el-button>
             </div>
             <div>
-              <el-button link> 删除 </el-button>
+              <el-button link @click="onDel(scope.row)"> 删除 </el-button>
             </div>
           </template>
         </el-table-column>
@@ -131,10 +129,12 @@
 </template>
 
 <script setup lang="ts">
-const tableData = ref<any>([{}, {}, {}, {}]);
+const tableData = ref<any>([]);
+const noTableData = ref<any>([]);
 const checked1 = ref(false);
 
-import { shoppingCartList } from '@/api/goods/index';
+import { shoppingCartList, deleteProductShoppingCart } from '@/api/goods/index';
+import { onPath } from '@/utils/siteConfig';
 
 onMounted(() => {
   getInfo();
@@ -143,10 +143,31 @@ onMounted(() => {
 const getInfo = () => {
   shoppingCartList({}).then((res) => {
     if (res.code == 200) {
-      tableData.value = res.data;
+      res.rows.forEach((item: any) => {
+        if (item.productStatus == 1) {
+          tableData.value.push(item);
+        } else {
+          noTableData.value.push(item);
+        }
+      });
     }
   });
 };
+
+const onDel = (row: any) => {
+  ElMessageBox.confirm(`确定要删除吗?`, '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(() => {
+    deleteProductShoppingCart(row.shoppingCartId).then((res) => {
+      if (res.code == 200) {
+        ElMessage.success('删除成功');
+        getInfo();
+      }
+    });
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 0 - 0
src/views/enterprise/addressManage/index.vue → src/views/easybuv/index.vue


+ 9 - 0
src/views/greg/index.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>供应商注册</h1>
+  </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 9 - 0
src/views/home/index-b.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>企业购商城</h1>
+  </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 9 - 0
src/views/home/index-fuli.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>福礼商城</h1>
+  </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 9 - 0
src/views/home/index-mro.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>工业品商城</h1>
+  </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 9 - 0
src/views/home/index.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>优易365主站</h1>
+  </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 1 - 1
src/views/organization/personalInfo/index.vue → src/views/i/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="personal-info-container">
     <PageTitle title="个人信息" />
-    
+
     <el-form ref="formRef" :model="formData" :rules="rules" label-position="top" class="info-form">
       <div class="form-row">
         <el-form-item label="用户ID" prop="userId">

+ 3 - 2
src/views/index.vue

@@ -57,8 +57,8 @@
             </div>
           </div>
           <div>
-            <el-button type="primary" round size="small" style="width: 64px">登录</el-button>
-            <el-button type="primary" plain round size="small" style="width: 64px">注册</el-button>
+            <el-button type="primary" round size="small" style="width: 64px" @click="onPath('/login')">登录</el-button>
+            <el-button type="primary" plain round size="small" style="width: 64px" @click="onPath('/reg')">注册</el-button>
           </div>
         </div>
         <div class="real-time">
@@ -335,6 +335,7 @@
 </template>
 
 <script setup lang="ts">
+import { onPath } from '@/utils/siteConfig';
 import {
   getProductCategoryTree,
   getHomeAdList,

+ 91 - 11
src/views/shop/info.vue → src/views/item/index.vue

@@ -30,9 +30,9 @@
                 <span style="font-size: 16px">2654.00</span>
               </div>
             </div>
-            <div class="right-collect flex-row-start">
+            <div class="right-collect flex-row-start" @click="editCollection">
               <img src="@/assets/images/dark.svg" alt="" />
-              <span>收藏</span>
+              <span>{{ collection ? '已收藏' : '收藏' }}</span>
             </div>
           </div>
           <div class="address flex-row-start">
@@ -98,6 +98,29 @@
         </div>
       </div>
     </div>
+    <!-- 取消收藏 -->
+    <el-dialog
+      v-model="dialogVisible"
+      title="选择取消的收藏夹"
+      width="500"
+      :before-close="
+        () => {
+          dialogVisible = false;
+        }
+      "
+    >
+      <div>
+        <el-radio-group v-model="radio">
+          <el-radio v-for="(item, index) in favorites" :key="index" :value="item.id">{{ item.title }}</el-radio>
+        </el-radio-group>
+      </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="dialogVisible = false">取消</el-button>
+          <el-button type="primary" @click="onCancel"> 确认 </el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -107,19 +130,39 @@ import back2 from '@/assets/images/login-background.jpg';
 import back3 from '@/assets/images/login-background.jpg';
 import back4 from '@/assets/images/login-background.jpg';
 import back5 from '@/assets/images/login-background.jpg';
-import { el } from 'element-plus/es/locale/index.mjs';
-import { title } from 'process';
-
-import { getProductDetail, addProductShoppingCart } from '@/api/goods/index';
+import { getToken } from '@/utils/auth';
+
+import {
+  getProductDetail,
+  addProductShoppingCart,
+  isProductInDefaultCollect,
+  addProductBrowsingHistory,
+  addProductCollect,
+  favoritesList,
+  cancelProductCollect
+} from '@/api/goods/index';
+import { edit } from '@/api/workflow/definition';
 
 const route = useRoute();
 const id = ref<any>(null);
 const dataInfo = ref<any>({});
+
+const radio = ref<any>(null);
+const favorites = ref<any>([]);
+const collection = ref<any>(null);
+const dialogVisible = ref<any>(false);
 onMounted(() => {
   id.value = route.query.id;
   getInfo();
+
+  if (getToken()) {
+    getCollection();
+    // 浏览记录
+    addProductBrowsingHistory(id.value).then((res) => {});
+  }
 });
 
+// 商品相信
 const getInfo = () => {
   getProductDetail(id.value).then((res) => {
     if (res.code == 200) {
@@ -128,11 +171,47 @@ const getInfo = () => {
   });
 };
 
-// getProductDetail({}).then((res) => {
-//   if (res.code == 200) {
-//     realList.value = res.data;
-//   }
-// });
+// 收藏
+const getCollection = () => {
+  isProductInDefaultCollect(id.value).then((res) => {
+    if (res.code == 200) {
+      collection.value = res.data;
+    }
+  });
+};
+
+//修改收藏
+const editCollection = () => {
+  if (collection.value) {
+    dialogVisible.value = true;
+    favoritesList(id.value).then((res) => {
+      if (res.code == 200) {
+        if (res.rows.length > 0) {
+          radio.value = res.rows[0].id;
+        }
+        favorites.value = res.rows;
+      }
+    });
+  } else {
+    // 添加
+    addProductCollect({ productId: id.value }).then((res) => {
+      if (res.code == 200) {
+        dataInfo.value = res.data;
+        getCollection();
+      }
+    });
+  }
+};
+
+// 取消收藏
+const onCancel = () => {
+  cancelProductCollect({ productId: id.value, favoritesId: radio.value }).then((res) => {
+    if (res.code == 200) {
+      getCollection();
+      dialogVisible.value = false;
+    }
+  });
+};
 
 const num = ref<any>(1);
 const carousel = ref<any>([
@@ -311,6 +390,7 @@ const onCart = () => {
         .right-collect {
           font-size: 14px;
           color: #6a7282;
+          cursor: pointer;
 
           img {
             width: 12px;

+ 2 - 2
src/views/login.vue

@@ -79,8 +79,8 @@ const loginRef = ref<ElFormInstance>();
 const redirect = ref('/');
 
 const loginForm = ref<LoginData>({
-  username: 'admin',
-  password: 'admin123',
+  username: '13322331122',
+  password: '123456',
   mobile: '',
   smsCode: '',
   tenantId: '000000',

+ 0 - 0
src/views/trade/afterSale/index.vue → src/views/order/afterSale/index.vue


+ 1 - 1
src/views/trade/batchOrder/index.vue → src/views/order/batchOrder/index.vue

@@ -110,7 +110,7 @@ const freight = ref('12.00')
 const handleDownloadTemplate = () => { ElMessage.success('开始下载模板文件') }
 const handleImportProducts = () => { ElMessage.info('请选择要导入的文件') }
 const handleConfirmAddress = () => { ElMessage.success('已确认收货地址') }
-const handleManageAddress = () => { router.push('/enterprise/addressManage') }
+const handleManageAddress = () => { router.push('/easybuv') }
 const handleSubmitOrder = () => {
   if (availableProducts.value === 0) { ElMessage.warning('没有可下单的商品'); return }
   ElMessage.success('订单提交成功')

+ 1 - 1
src/views/trade/orderAudit/index.vue → src/views/order/orderAudit/index.vue

@@ -327,7 +327,7 @@ const getStatusClass = (checkStatus: string) => {
 }
 
 const handleViewDetail = (order: any) => {
-  router.push(`/trade/orderManage/detail/${order.id}`)
+  router.push(`/order/orderManage/detail/${order.id}`)
 }
 
 const handleApprove = (order: any) => {

+ 1 - 1
src/views/trade/orderEvaluation/index.vue → src/views/order/orderEvaluation/index.vue

@@ -148,7 +148,7 @@ const orderList = computed(() => {
 })
 
 
-const handleViewDetail = (order: any) => { router.push(`/trade/orderManage/detail/${order.orderNo}`) }
+const handleViewDetail = (order: any) => { router.push(`/order/orderManage/detail/${order.orderNo}`) }
 const handleEvaluate = (order: any) => { currentOrder.value = order; currentProduct.value = order.products[0]; evaluateDialogTitle.value = '商品评价'; evaluateForm.rating = 5; evaluateForm.content = ''; evaluateDialogVisible.value = true }
 const handleFollowUpEvaluate = (order: any) => { currentOrder.value = order; currentProduct.value = order.products[0]; evaluateDialogTitle.value = '追加评价'; evaluateForm.rating = 5; evaluateForm.content = ''; evaluateDialogVisible.value = true }
 const handleViewEvaluation = (order: any) => { ElMessage.info('查看评价详情') }

+ 1 - 1
src/views/trade/orderManage/detail.vue → src/views/order/orderManage/detail.vue

@@ -192,7 +192,7 @@ onMounted(() => {
     console.error('订单ID无效,无法加载订单详情')
   }
 })
-const handleBack = () => { router.push('/trade/orderManage') }
+const handleBack = () => { router.push('/order/orderManage') }
 </script>
 
 <style scoped lang="scss">

+ 1 - 1
src/views/trade/orderManage/index.vue → src/views/order/orderManage/index.vue

@@ -289,7 +289,7 @@ const handleExpand = async (order: any) => {
 }
 const handleSelectAll = (val: CheckboxValueType) => { orderList.value.forEach(order => { order.checked = !!val }) }
 const handleOrderCheck = () => { selectAll.value = orderList.value.every(order => order.checked) }
-const handleViewDetail = (order: any) => { router.push(`/trade/orderManage/detail/${order.orderNo}`) }
+const handleViewDetail = (order: any) => { router.push(`/order/orderManage/detail/${order.orderNo}`) }
 const handleQuery = () => {
   queryParams.pageNum = 1
   fetchOrderList()

+ 161 - 0
src/views/payc/index.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="pay-pages">
+    <div class="pay-bos">
+      <div class="create-title flex-row-start">
+        <el-icon color="#101828" size="16"><Document /></el-icon>
+        <div style="margin-left: 6px">支付订单</div>
+      </div>
+      <div class="pay-bos flex-column-between">
+        <div class="pay-box flex-column-center">
+          <img src="@/assets/images/dark.svg" alt="" />
+          <div class="pay-text1">订单提交成功!请尽快完成支付。</div>
+          <div class="pay-text2">请在2小时0分内完成支付,超时后将取消订单</div>
+        </div>
+        <div class="pay-bnt flex-row-center">
+          <span class="bnt1">应付总额:</span>
+          <span class="bnt2">¥0.00</span>
+        </div>
+      </div>
+      <div class="pay-head1">选择支付方式</div>
+      <div class="pay-for">
+        <div v-for="(item, index) in payList" :key="index" class="pay-list flex-row-center" :class="index == 0 ? 'hig' : ''">
+          <img src="@/assets/images/dark.svg" alt="" />
+          <div>{{ item.title }}</div>
+        </div>
+      </div>
+      <div class="pay-head2">选择“暂存订单”,订单将在我的订单中査看,您可以在我的订单中进行完成支付。</div>
+      <div class="pay-for">
+        <div class="pay-list flex-row-center">
+          <img src="@/assets/images/dark.svg" alt="" />
+          <div>暂存订单</div>
+        </div>
+      </div>
+    </div>
+    <div class="pay-foot">
+      <div class="foot-bos">
+        <el-button class="bnt1">返回购物车修改</el-button>
+        <el-button class="bnt2" type="primary">提交订单</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+const payList = ref<any>([{ title: '信用支付' }, { title: '支付宝支付' }, { title: '微信支付' }, { title: '货到付款' }]);
+</script>
+
+<style lang="scss" scoped>
+.pay-pages {
+  width: 100%;
+  background-color: #ffffff;
+  .pay-bos {
+    width: 1200px;
+    margin: 0 auto;
+    .create-title {
+      font-size: 16px;
+      color: #101828;
+      padding-top: 20px;
+    }
+    .pay-bos {
+      width: 1200px;
+      height: 230px;
+      border: 1px solid #e5e7eb;
+      margin-top: 30px;
+      padding: 30px 0 20px 0;
+      .pay-box {
+        width: 1180px;
+        border-bottom: 1px solid #dfe9f1;
+        margin: 0 10px;
+        padding-bottom: 20px;
+        img {
+          width: 27px;
+          height: 27px;
+        }
+        .pay-text1 {
+          font-weight: 600;
+          font-size: 14px;
+          color: #101828;
+          margin: 8px 0;
+        }
+        .pay-text2 {
+          font-weight: 400;
+          font-size: 14px;
+          color: #364153;
+        }
+      }
+      .pay-bnt {
+        width: 428px;
+        height: 68px;
+        background: #f2f3f5;
+        border-radius: 10px 10px 10px 10px;
+        margin: 0 auto;
+        cursor: pointer;
+        .bnt1 {
+          font-weight: 400;
+          font-size: 14px;
+          color: #000000;
+        }
+        .bnt2 {
+          font-weight: 600;
+          font-size: 20px;
+          color: #e7000b;
+        }
+      }
+    }
+    .pay-head1 {
+      font-weight: 600;
+      font-size: 16px;
+      color: #101828;
+      margin: 30px 0 20px 0;
+    }
+    .pay-for {
+      display: flex;
+      gap: 0 18px;
+      .pay-list {
+        width: 180px;
+        height: 60px;
+        border-radius: 10px;
+        border: 1px solid #e5e7eb;
+        font-size: 14px;
+        color: #000000;
+        cursor: pointer;
+        &.hig {
+          background: #ffe5e5;
+          border: 1px solid #e7000b;
+        }
+        img {
+          height: 18px;
+          width: 18px;
+          margin-right: 12px;
+        }
+      }
+    }
+    .pay-head2 {
+      font-size: 13px;
+      color: #364153;
+      padding: 20px 0 12px 0;
+    }
+  }
+  .pay-foot {
+    width: 100%;
+    height: 82px;
+    background: #ffffff;
+    box-shadow: 0px -2px 13px 0px rgba(0, 0, 0, 0.05);
+    margin-top: 47px;
+    .foot-bos {
+      width: 1200px;
+      margin: 0 auto;
+      padding-top: 16px;
+      .bnt1 {
+        width: 198px;
+        height: 50px;
+        background: #f7f8fa;
+      }
+      .bnt2 {
+        width: 156px;
+        height: 50px;
+      }
+    }
+  }
+}
+</style>

+ 271 - 0
src/views/plan/index.vue

@@ -0,0 +1,271 @@
+<template>
+  <div class="solve">
+    <div class="solve-head">
+      <div class="head-bos">
+        <div class="nav-bos flex-row-start">
+          <div v-for="(item, index) in navList" :key="index" class="nav-list" :class="navIndex == index ? 'hig' : ''">
+            {{ item.title }}
+          </div>
+        </div>
+        <div class="filter-bos">
+          <div v-for="(item1, index1) in filterListy" :key="index1" class="filter-list flex-row-start">
+            <div class="filter-title">{{ item1.title }}</div>
+            <div v-for="(item2, index2) in item1.list" :key="index2" class="filter-item" :class="item1.hig == item2.id ? 'hig' : ''">
+              {{ item2.title }}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 数据 -->
+    <div class="data-bos">
+      <div v-for="(item, index) in 9" :key="index" class="data-list" @click="onPath">
+        <img class="data-img" src="@/assets/images/login-background.jpg" alt="" />
+        <div class="data-box flex-column-between">
+          <div>
+            <div class="title ellipsis">2025中秋福利 企业团购方案</div>
+            <div class="info ellipsis">干款好礼·百大品牌·个性定制</div>
+          </div>
+          <div class="text flex-row-start">
+            <div>了解详情</div>
+            <el-icon color="#e7000b" size="14" style="margin: 0 0 0 10px">
+              <ArrowRight />
+            </el-icon>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 分页 -->
+    <div class="pagination-bos flex-row-between">
+      <div></div>
+      <el-pagination
+        v-model:current-page="currentPage1"
+        v-model:page-size="pageSize2"
+        layout="sizes, prev, pager, next ,jumper"
+        :total="1000"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+const currentPage1 = ref(5);
+const pageSize2 = ref(100);
+
+const navList = ref<any>([
+  { title: '专题分类' },
+  { title: '大中型企业采购' },
+  { title: '政府&公共采购' },
+  { title: '营销福利' },
+  { title: '商用工程' },
+  { title: '中小型企业采购' }
+]);
+const filterListy = ref<any>([
+  {
+    title: '适配场景',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '1-100', id: 2 },
+      { title: '100-500', id: 3 },
+      { title: '1000+', id: 4 }
+    ]
+  },
+  {
+    title: '适配行业',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '食品饮料', id: 2 },
+      { title: '食品饮料', id: 3 },
+      { title: '食品饮料', id: 4 }
+    ]
+  },
+  {
+    title: '价格区间',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '香港小熊', id: 2 }
+    ]
+  },
+  {
+    title: '推荐标签',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '香港小熊', id: 2 }
+    ]
+  }
+]);
+const navIndex = ref(0);
+const router = useRouter();
+const handleSizeChange = (val: number) => {
+  console.log(`${val} items per page`);
+};
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`);
+};
+
+const onPath = () => {
+  router.push('/solve/info');
+};
+</script>
+
+<style lang="scss" scoped>
+.solve {
+  width: 100%;
+
+  .solve-head {
+    width: 100%;
+    background: #ffffff;
+
+    .head-bos {
+      width: 1200px;
+      margin: 0 auto;
+      padding-bottom: 20px;
+    }
+  }
+
+  .nav-bos {
+    border-bottom: 1px solid #e5e7eb;
+    width: 1200px;
+    padding-bottom: 20px;
+
+    .nav-list {
+      height: 32px;
+      padding: 0 12px;
+      background: #f7f8fa;
+      border-radius: 2px 2px 2px 2px;
+      font-size: 14px;
+      color: #4e5969;
+      margin-right: 8px;
+      line-height: 32px;
+      cursor: pointer;
+
+      &.hig {
+        background: #ffe8e8;
+        color: #e7000b;
+      }
+
+      &:hover {
+        color: #e7000b;
+      }
+    }
+  }
+
+  .filter-bos {
+    .filter-list {
+      margin-top: 20px;
+
+      .filter-title {
+        font-size: 14px;
+        color: #101828;
+        margin-right: 40px;
+      }
+
+      .filter-item {
+        font-size: 14px;
+        color: #364153;
+        margin-right: 30px;
+        cursor: pointer;
+
+        &.hig {
+          color: #e7000b;
+        }
+      }
+    }
+  }
+
+  // 数据
+  .data-bos {
+    width: 1200px;
+    margin: 0 auto;
+    display: flex;
+    gap: 20px;
+    flex-wrap: wrap;
+    padding: 22px 0 40px 0;
+
+    .data-list {
+      width: 386px;
+      height: 302px;
+      background: #ffffff;
+      border-radius: 10px;
+      overflow: hidden;
+      cursor: pointer;
+
+      .data-img {
+        height: 200px;
+        width: 386px;
+      }
+
+      .data-box {
+        height: 102px;
+        width: 386px;
+        padding: 12px 20px;
+
+        .title {
+          font-weight: 600;
+          font-size: 14px;
+          color: #101828;
+        }
+
+        .info {
+          font-size: 12px;
+          color: #364153;
+          margin-top: 4px;
+        }
+
+        .text {
+          font-size: 14px;
+          color: #e7000b;
+        }
+      }
+    }
+  }
+
+  //分页
+  .pagination-bos {
+    width: 1200px;
+    margin: 0 auto;
+    padding-bottom: 60px;
+    :deep(.el-select__wrapper) {
+      background: #f4f4f4;
+      box-shadow: 0 0 0 1px #e5e6eb inset;
+      border-radius: 2px;
+    }
+    :deep(.el-select__placeholder) {
+      color: #1d2129;
+    }
+    :deep(.el-input__wrapper) {
+      background: #f4f4f4;
+      box-shadow: 0 0 0 1px #e5e6eb inset;
+      border-radius: 2px;
+    }
+    :deep(.el-input__inner) {
+      color: #1d2129;
+    }
+
+    :deep(.btn-prev) {
+      background: #f4f4f4;
+      border: 1px solid #e5e6eb;
+      margin-right: 8px;
+    }
+    :deep(.btn-next) {
+      background: #f4f4f4;
+      border: 1px solid #e5e6eb;
+      margin-left: 8px;
+    }
+    :deep(.el-pager) {
+      gap: 0 8px;
+      li {
+        background: #f4f4f4;
+        border: 1px solid #e5e6eb;
+        color: #1d2129;
+      }
+    }
+  }
+}
+</style>

+ 223 - 0
src/views/plan_info/index.vue

@@ -0,0 +1,223 @@
+<template>
+  <div class="solve-page">
+    <div class="solve-bos">
+      <img class="solve-img" src="@/assets/images/login-background.jpg" alt="" />
+      <div class="title">香港小熊食品 甜蜜褔利 品质之选</div>
+      <div class="info">节日专题:节日、节日等主题盒子;可定制企业及福语、传递节日贺卡 员工关怀:办公室下午茶分享</div>
+      <div class="filter-bos">
+        <div v-for="(item1, index1) in filterListy" :key="index1" class="filter-list flex-row-start">
+          <div class="filter-title">{{ item1.title }}</div>
+          <div v-for="(item2, index2) in item1.list" :key="index2" class="filter-item" :class="item1.hig == item2.id ? 'hig' : ''">
+            {{ item2.title }}
+          </div>
+        </div>
+      </div>
+      <div class="nav-bos flex-row-start">
+        <div v-for="(item, index) in navList" :key="index" class="nav-list" :class="navIndex == index ? 'hig' : ''">
+          {{ item.title }}
+        </div>
+      </div>
+      <!-- 数据 -->
+      <div class="data-bos">
+        <div v-for="(item, index) in 13" :key="index" class="data-list" @click="onPath">
+          <img class="data-img" src="@/assets/images/login-background.jpg" alt="" />
+          <div class="data-title">格力KFR-72LW/定频冷暖空调柜机3P</div>
+          <div class="money">
+            <span class="money1">¥1,299</span>
+            <span class="money2">¥1,899</span>
+          </div>
+          <div class="data-cat">加入购物车</div>
+        </div>
+      </div>
+      <!-- 分页 -->
+      <div class="pagination-bos flex-row-between">
+        <div></div>
+        <el-pagination
+          v-model:current-page="currentPage1"
+          v-model:page-size="pageSize2"
+          layout="sizes, prev, pager, next ,jumper"
+          :total="1000"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+const currentPage1 = ref(5);
+const pageSize2 = ref(100);
+const navIndex = ref(0);
+const router = useRouter();
+const navList = ref<any>([{ title: '智能匹配' }, { title: '人气排序' }, { title: '价格排序' }]);
+const filterListy = ref<any>([
+  {
+    title: '价格区间',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '1-100', id: 2 },
+      { title: '100-500', id: 3 },
+      { title: '1000+', id: 4 }
+    ]
+  },
+  {
+    title: '产品分类',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '食品饮料', id: 2 },
+      { title: '食品饮料', id: 3 },
+      { title: '食品饮料', id: 4 }
+    ]
+  },
+  {
+    title: '产品品牌',
+    hig: 1,
+    list: [
+      { title: '全部', id: 1 },
+      { title: '香港小熊', id: 2 }
+    ]
+  }
+]);
+
+const handleSizeChange = (val: number) => {
+  console.log(`${val} items per page`);
+};
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`);
+};
+
+const onPath = () => {
+  router.push('/shop/info');
+};
+</script>
+
+<style lang="scss" scoped>
+.solve-page {
+  width: 100%;
+  background-color: #ffffff;
+
+  .solve-bos {
+    width: 1200px;
+    margin: 0 auto;
+    .solve-img {
+      width: 1200px;
+      height: 380px;
+      border-radius: 10px;
+    }
+    .title {
+      font-weight: 600;
+      font-size: 20px;
+      color: #101828;
+      margin-top: 20px;
+    }
+    .info {
+      font-size: 14px;
+      color: #364153;
+      margin-top: 8px;
+      border-bottom: 1px solid #e5e7eb;
+      padding-bottom: 20px;
+    }
+    .filter-bos {
+      padding-bottom: 20px;
+      border-bottom: 1px solid #e5e7eb;
+      .filter-list {
+        margin-top: 20px;
+
+        .filter-title {
+          font-size: 14px;
+          color: #101828;
+          margin-right: 40px;
+        }
+
+        .filter-item {
+          font-size: 14px;
+          color: #364153;
+          margin-right: 30px;
+          cursor: pointer;
+
+          &.hig {
+            color: #e7000b;
+          }
+        }
+      }
+    }
+    .nav-bos {
+      width: 1200px;
+      padding: 20px 0;
+
+      .nav-list {
+        height: 32px;
+        padding: 0 12px;
+        background: #f7f8fa;
+        border-radius: 2px 2px 2px 2px;
+        font-size: 14px;
+        color: #4e5969;
+        margin-right: 8px;
+        line-height: 32px;
+        cursor: pointer;
+
+        &.hig {
+          background: #ffe8e8;
+          color: #e7000b;
+        }
+
+        &:hover {
+          color: #e7000b;
+        }
+      }
+    }
+    //数据
+    .data-bos {
+      display: flex;
+      gap: 20px;
+      flex-wrap: wrap;
+      margin-bottom: 40px;
+      .data-list {
+        width: 224px;
+        background: #f4f4f4;
+        border-radius: 10px;
+        padding: 20px 20px 22px 20px;
+        cursor: pointer;
+        .data-img {
+          width: 184px;
+          height: 184px;
+          border-radius: 10px;
+        }
+        .data-title {
+          margin-top: 4px;
+          font-size: 14px;
+          color: #101828;
+          height: 40px;
+        }
+        .money {
+          margin-top: 4px;
+          .money1 {
+            font-size: 16px;
+            color: #e7000b;
+          }
+          .money2 {
+            font-size: 12px;
+            color: #99a1af;
+            text-decoration: line-through;
+            padding-left: 6px;
+          }
+        }
+        .data-cat {
+          width: 86px;
+          height: 26px;
+          background: #e7000b;
+          border-radius: 2px;
+          font-size: 14px;
+          color: #ffffff;
+          line-height: 26px;
+          text-align: center;
+          margin-top: 16px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 9 - 0
src/views/reg/index.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>个人注册</h1>
+  </div>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss" scoped></style>

+ 273 - 0
src/views/search/index.vue

@@ -0,0 +1,273 @@
+<template>
+  <div class="search-pages">
+    <!-- 筛选 -->
+    <div class="search-head">
+      <div class="head-bos">
+        <div class="head-title">分类:</div>
+        <div class="head-box">
+          <div
+            @click="onHead(item, 'topCategoryId')"
+            class="classify-list"
+            v-for="(item, index) in classifyList"
+            :key="index"
+            :class="item.id == httpObj.topCategoryId ? 'hig' : ''"
+          >
+            {{ item.label }}
+          </div>
+        </div>
+      </div>
+      <div class="head-bos">
+        <div class="head-title">价格:</div>
+        <div class="head-box">
+          <div
+            @click="onHead(item, 'priceRange')"
+            class="classify-list"
+            v-for="(item, index) in priceList"
+            :key="index"
+            :class="item.id == httpObj.priceRange ? 'hig' : ''"
+          >
+            {{ item.label }}
+          </div>
+        </div>
+      </div>
+      <div class="head-bos">
+        <div class="head-sort flex-row-center" @click="onSort(1)" :class="sortField1 != '' ? 'hig' : ''">
+          <div>智能匹配</div>
+          <div class="sort-box">
+            <el-icon :color="sortField1 == 'Asc' ? '#E7000B' : '#333333'" class="icon1" :size="12"><CaretTop /></el-icon>
+            <el-icon :color="sortField1 == 'Desc' ? '#E7000B' : '#333333'" class="icon2" :size="12"><CaretBottom /></el-icon>
+          </div>
+        </div>
+        <div class="head-sort flex-row-center" @click="onSort(2)" :class="sortField2 != '' ? 'hig' : ''">
+          <div>库存排序</div>
+          <div class="sort-box">
+            <el-icon :color="sortField2 == 'Asc' ? '#E7000B' : '#333333'" class="icon1" :size="12"><CaretTop /></el-icon>
+            <el-icon :color="sortField2 == 'Desc' ? '#E7000B' : '#333333'" class="icon2" :size="12"><CaretBottom /></el-icon>
+          </div>
+        </div>
+        <div class="head-sort flex-row-center" @click="onSort(3)" :class="sortField3 != '' ? 'hig' : ''">
+          <div>价格排序</div>
+          <div class="sort-box">
+            <el-icon :color="sortField3 == 'Asc' ? '#E7000B' : '#333333'" class="icon1" :size="12"><CaretTop /></el-icon>
+            <el-icon :color="sortField3 == 'Desc' ? '#E7000B' : '#333333'" class="icon2" :size="12"><CaretBottom /></el-icon>
+          </div>
+        </div>
+        <el-checkbox-group v-model="checkList" style="margin-top: 15px" @change="getList">
+          <el-checkbox label="可定制" value="isCustomize" />
+        </el-checkbox-group>
+      </div>
+    </div>
+    <!-- 商品 -->
+    <div class="expert-bos">
+      <div v-for="(item, index) in dataList" :key="index" class="expert-list" @click="onPath('/item?id=' + item.id)">
+        <img :src="item.productImage" alt="" />
+        <div class="itemName ellipsis">{{ item.itemName || '' }}</div>
+        <div class="price">
+          <span class="memberPrice">¥{{ item.memberPrice }}</span>
+          <span class="marketPrice">¥{{ item.marketPrice }}</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { getPcProductPage } from '@/api/search/index';
+import { getProductCategoryTree } from '@/api/home/index';
+import { onPath } from '@/utils/siteConfig';
+const dataList = ref<any>([]);
+const checkList = ref<any>([]);
+const classifyList = ref<any>([]);
+const httpObj = ref<any>({
+  topCategoryId: '',
+  priceRange: '',
+  sortField: '',
+  sortOrder: '',
+  isCustomize: '',
+  pageSize: 14,
+  pageNum: 1
+});
+const priceList = ref<any>([
+  { label: '全部', id: '' },
+  { label: '1-100', id: 1 },
+  { label: '100-500', id: 2 },
+  { label: '500-1000', id: 3 },
+  { label: '1000以上', id: 4 }
+]);
+const sortField1 = ref<any>('');
+const sortField2 = ref<any>('');
+const sortField3 = ref<any>('');
+
+const getList = () => {
+  if (sortField1.value) {
+    httpObj.value.sortField = '1';
+    httpObj.value.sortOrder = sortField1.value;
+  }
+  if (sortField2.value) {
+    httpObj.value.sortField = httpObj.value.sortField + (httpObj.value.sortField ? ',2' : '2');
+    httpObj.value.sortOrder = httpObj.value.sortOrder + (httpObj.value.sortOrder ? ',' + sortField2.value : sortField2.value);
+  }
+  if (sortField3.value) {
+    httpObj.value.sortField = httpObj.value.sortField + (httpObj.value.sortField ? ',3' : '3');
+    httpObj.value.sortOrder = httpObj.value.sortOrder + (httpObj.value.sortOrder ? ',' + sortField3.value : sortField3.value);
+  }
+  if (checkList.value.length > 0) {
+    httpObj.value.isCustomize = 1;
+  } else {
+    httpObj.value.isCustomize = '';
+  }
+  getPcProductPage(httpObj.value).then((res) => {
+    if (res.code == 200) {
+      dataList.value = res.rows;
+    }
+  });
+};
+
+//头部分类
+getProductCategoryTree({}).then((res) => {
+  if (res.code == 200) {
+    res.data.unshift({
+      label: '全部',
+      id: ''
+    });
+    classifyList.value = res.data;
+  }
+});
+
+const onHead = (item: any, type: string) => {
+  httpObj.value[type] = item.id;
+};
+
+const onSort = (type: number) => {
+  if (type == 1) {
+    if (sortField1.value == '' || sortField1.value == 'Desc') {
+      sortField1.value = 'Asc';
+    } else if (sortField1.value == 'Asc') {
+      sortField1.value = 'Desc';
+    }
+  }
+  if (type == 2) {
+    if (sortField2.value == '' || sortField2.value == 'Desc') {
+      sortField2.value = 'Asc';
+    } else if (sortField2.value == 'Asc') {
+      sortField2.value = 'Desc';
+    }
+  }
+  if (type == 3) {
+    if (sortField3.value == '' || sortField3.value == 'Desc') {
+      sortField3.value = 'Asc';
+    } else if (sortField3.value == 'Asc') {
+      sortField3.value = 'Desc';
+    }
+  }
+  getList();
+};
+
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style lang="scss" scoped>
+.search-pages {
+  width: 1200px;
+  margin: 0 auto;
+  // 筛选
+  .search-head {
+    width: 1200px;
+    background: #ffffff;
+    border-radius: 10px;
+    padding: 0 15px 15px 15px;
+    font-size: 14px;
+    color: #101828;
+    .head-bos {
+      display: flex;
+      .head-title {
+        width: 70px;
+        padding-top: 15px;
+      }
+      .head-box {
+        display: flex;
+        flex-wrap: wrap;
+        flex: 1;
+        width: 0;
+        gap: 10px 15px;
+        border-bottom: 1px solid #e5e7eb;
+        padding: 15px 0;
+        .classify-list {
+          cursor: pointer;
+          &.hig {
+            color: var(--el-color-primary);
+          }
+        }
+      }
+      .head-sort {
+        margin: 15px 15px 0 0;
+        width: 108px;
+        height: 32px;
+        border: 1px solid #e5e7eb;
+        border-radius: 2px 2px 2px 2px;
+        cursor: pointer;
+        &.hig {
+          border: 1px solid var(--el-color-primary);
+        }
+        .sort-box {
+          margin-left: 10px;
+          position: relative;
+          height: 32px;
+          .icon1 {
+            position: absolute;
+            top: 6px;
+          }
+          .icon2 {
+            position: absolute;
+            bottom: 6px;
+          }
+        }
+      }
+    }
+  }
+  // 商品
+  // 行家精选
+  .expert-bos {
+    width: 1200px;
+    display: flex;
+    flex-wrap: wrap;
+    margin-top: 12px;
+    gap: 20px 12.5px;
+    .expert-list {
+      width: 230px;
+      height: 306px;
+      background: #ffffff;
+
+      padding: 20px;
+      cursor: pointer;
+      img {
+        width: 100%;
+        height: 190px;
+      }
+      .itemName {
+        font-weight: 400;
+        font-size: 14px;
+        color: #101828;
+        margin: 27px 0 2px 0;
+      }
+      .price {
+        .memberPrice {
+          color: var(--el-color-primary);
+          font-size: 16px;
+          color: #e7000b;
+        }
+        .marketPrice {
+          font-size: 12px;
+          color: #99a1af;
+          line-height: 20px;
+          text-decoration-line: line-through;
+          text-transform: none;
+          margin-left: 6px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 0 - 0
src/views/shop/create.vue → src/views/trad/index.vue


+ 3 - 3
yoe-shop-web接口文档.md

@@ -50,7 +50,7 @@ src/api/pc/
 
 ### 1.2 收货地址管理
 
-**页面路径**: `src/views/enterprise/addressManage/index.vue`
+**页面路径**: `src/views/easybuv/index.vue`
 
 **API 文件**: `src/api/pc/enterprise/index.ts`
 
@@ -97,7 +97,7 @@ src/api/pc/
 
 ### 2.1 订单管理
 
-**页面路径**: `src/views/trade/orderManage/index.vue`
+**页面路径**: `src/views/order/orderManage/index.vue`
 
 **API 文件**: `src/api/pc/enterprise/order.ts`
 
@@ -115,7 +115,7 @@ src/api/pc/
 
 ### 2.2 售后服务
 
-**页面路径**: `src/views/trade/afterSale/index.vue`
+**页面路径**: `src/views/order/afterSale/index.vue`
 
 **API 文件**: `src/api/pc/enterprise/orderReturn.ts`