牛奶 1 месяц назад
Родитель
Сommit
a8f9b79ca0
9 измененных файлов с 251 добавлено и 117 удалено
  1. 14 0
      package-lock.json
  2. 1 0
      package.json
  3. 102 0
      src/permission copy.ts
  4. 11 21
      src/permission.ts
  5. 62 37
      src/utils/request.ts
  6. 37 38
      src/utils/siteConfig.ts
  7. 1 1
      src/views/login.vue
  8. 21 20
      vite.config.ts
  9. 2 0
      vite/plugins/index.ts

+ 14 - 0
package-lock.json

@@ -47,6 +47,7 @@
         "@unocss/preset-attributify": "66.5.4",
         "@unocss/preset-icons": "66.5.4",
         "@unocss/preset-uno": "66.5.4",
+        "@vitejs/plugin-basic-ssl": "^2.1.4",
         "@vitejs/plugin-vue": "5.2.4",
         "@vue/compiler-sfc": "3.5.22",
         "@vue/eslint-config-prettier": "10.2.0",
@@ -2953,6 +2954,19 @@
         "node": ">=8.10.0"
       }
     },
+    "node_modules/@vitejs/plugin-basic-ssl": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz",
+      "integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^6.0.0 || ^7.0.0"
+      }
+    },
     "node_modules/@vitejs/plugin-vue": {
       "version": "5.2.4",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",

+ 1 - 0
package.json

@@ -58,6 +58,7 @@
     "@unocss/preset-attributify": "66.5.4",
     "@unocss/preset-icons": "66.5.4",
     "@unocss/preset-uno": "66.5.4",
+    "@vitejs/plugin-basic-ssl": "^2.1.4",
     "@vitejs/plugin-vue": "5.2.4",
     "@vue/compiler-sfc": "3.5.22",
     "@vue/eslint-config-prettier": "10.2.0",

+ 102 - 0
src/permission copy.ts

@@ -0,0 +1,102 @@
+import { to as tos } from 'await-to-js';
+import router from './router';
+import NProgress from 'nprogress';
+import 'nprogress/nprogress.css';
+import { getToken } from '@/utils/auth';
+import { isPathMatch } from '@/utils/validate';
+import { useUserStore } from '@/store/modules/user';
+import { ElMessage } from 'element-plus/es';
+import { getCurrentSite, SITE_ROUTES } from '@/utils/siteConfig';
+import { cartStore } from '@/store/modules/cart';
+
+NProgress.configure({ showSpinner: false });
+const whiteList = [
+  '/login',
+  '/register',
+  '/social-callback',
+  '/register*',
+  '/register/*',
+  '/index',
+  '/',
+  '/indexB',
+  '/indexMro',
+  '/indexFuli',
+  '/reg',
+  '/search',
+  '/item',
+  '/breg',
+  '/greg',
+  '/diy'
+];
+
+
+const isWhiteList = (path: string) => {
+  return whiteList.some((pattern) => isPathMatch(pattern, path));
+};
+
+// 获取主站完整 URL(用于跨域跳转)
+function getMainSiteUrl(path: string) {
+  if (import.meta.env.PROD) {
+    return `https://www.xiaoluwebsite.xyz${path}`;
+  } else {
+    // 本地开发:指向 www.xiaoluwebsite.xyz 加上当前运行的端口
+    // 假设你启动 vite 后访问的是 http://www.xiaoluwebsite.xyz
+    const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
+    return `http://www.xiaoluwebsite.xyz:${devPort}${path}`;
+  }
+}
+
+router.beforeEach(async (to, from, next) => {
+  NProgress.start();
+  const site = getCurrentSite();
+  const allowedPaths = SITE_ROUTES[site];
+
+  if (getToken()) {
+    const [err] = await tos(useUserStore().getInfo());
+    if (err) {
+      await useUserStore().logout();
+      ElMessage.error(err);
+      if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
+        window.location.href = getMainSiteUrl('/login');
+      } else {
+        next('/login');
+      }
+      NProgress.done();
+    } else {
+      cartStore().onCartCount();
+      // 是否开启多域名
+      if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
+        if (!allowedPaths.includes(to.path)) {
+          console.warn(`[${site}] 禁止访问 ${to.path}`);
+          window.location.href = getMainSiteUrl('/index');
+          NProgress.done();
+        } else {
+          next();
+          NProgress.done();
+        }
+      } else {
+        next();
+        NProgress.done();
+      }
+    }
+  } else {
+    // 没有 token
+    if (isWhiteList(to.path)) {
+      next();
+      NProgress.done();
+    } else {
+      // 非白名单且无 token,强制去登录
+      if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
+        window.location.href = getMainSiteUrl('/login');
+      } else {
+        next('/login');
+      }
+      // 或者 '/login' 根据你的白名单设置
+      NProgress.done();
+    }
+  }
+});
+
+router.afterEach(() => {
+  NProgress.done();
+});

+ 11 - 21
src/permission.ts

@@ -36,12 +36,12 @@ const isWhiteList = (path: string) => {
 // 获取主站完整 URL(用于跨域跳转)
 function getMainSiteUrl(path: string) {
   if (import.meta.env.PROD) {
-    return `https://www.yingpai365.com${path}`;
+    return `https://www.xiaoluwebsite.xyz${path}`;
   } else {
-    // 本地开发:指向 www.yingpai365.com 加上当前运行的端口
-    // 假设你启动 vite 后访问的是 http://www.yingpai365.com
+    // 本地开发:指向 www.xiaoluwebsite.xyz 加上当前运行的端口
+    // 假设你启动 vite 后访问的是 http://www.xiaoluwebsite.xyz
     const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
-    return `http://www.yingpai365.com:${devPort}${path}`;
+    return `https://www.xiaoluwebsite.xyz:${devPort}${path}`;
   }
 }
 
@@ -50,9 +50,14 @@ router.beforeEach(async (to, from, next) => {
   const site = getCurrentSite();
   const allowedPaths = SITE_ROUTES[site];
 
-  if (getToken()) {
+  //不需要请求登录信息
+  if (isWhiteList(to.path)) {
+    next();
+    NProgress.done();
+  } else {
     const [err] = await tos(useUserStore().getInfo());
-    if (err) {
+    // if (err) {
+    if (false) {
       await useUserStore().logout();
       ElMessage.error(err);
       if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
@@ -78,21 +83,6 @@ router.beforeEach(async (to, from, next) => {
         NProgress.done();
       }
     }
-  } else {
-    // 没有 token
-    if (isWhiteList(to.path)) {
-      next();
-      NProgress.done();
-    } else {
-      // 非白名单且无 token,强制去登录
-      if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
-        window.location.href = getMainSiteUrl('/login');
-      } else {
-        next('/login');
-      }
-      // 或者 '/login' 根据你的白名单设置
-      NProgress.done();
-    }
   }
 });
 

+ 62 - 37
src/utils/request.ts

@@ -15,12 +15,12 @@ import router from '@/router';
 // 获取主站完整 URL(用于跨域跳转)
 function getMainSiteUrl(path: string) {
   if (import.meta.env.PROD) {
-    return `https://www.yingpai365.com${path}`;
+    return `https://www.xiaoluwebsite.xyz${path}`;
   } else {
-    // 本地开发:指向 www.yingpai365.com 加上当前运行的端口
-    // 假设你启动 vite 后访问的是 http://www.yingpai365.com
+    // 本地开发:指向 www.xiaoluwebsite.xyz 加上当前运行的端口
+    // 假设你启动 vite 后访问的是 http://www.xiaoluwebsite.xyz
     const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
-    return `http://www.yingpai365.com:${devPort}${path}`;
+    return `https://www.xiaoluwebsite.xyz:${devPort}${path}`;
   }
 }
 
@@ -40,7 +40,7 @@ axios.defaults.headers['clientid'] = import.meta.env.VITE_APP_CLIENT_ID;
 // 创建 axios 实例
 const service = axios.create({
   baseURL: import.meta.env.VITE_APP_BASE_API,
-  // withCredentials: true,
+  withCredentials: true,
   timeout: 50000,
   transitional: {
     // 超时错误更明确
@@ -139,6 +139,30 @@ service.interceptors.response.use(
       return res.data;
     }
     if (code === 401) {
+      if (!isRelogin.show) {
+        isRelogin.show = true;
+        ElMessageBox.confirm('登录状态已过期,请重新登录', '登录提示', {
+          confirmButtonText: '重新登录',
+          type: 'warning'
+        })
+          .then(() => {
+            isRelogin.show = false;
+            useUserStore()
+              .logout()
+              .then(() => {
+                if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
+                  window.location.href = getMainSiteUrl('/login');
+                } else {
+                  router.push('/login');
+                }
+              });
+          })
+          .catch(() => {
+            isRelogin.show = false;
+          });
+      }
+      return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
+
       // prettier-ignore
       // if (!isRelogin.show) {
       //   isRelogin.show = true;
@@ -164,14 +188,15 @@ service.interceptors.response.use(
       //   isRelogin.show = false;
       // });
       // }
-      useUserStore().logout().then(() => {
-        if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
-          window.location.href = getMainSiteUrl('/login');
-        }else{
-          router.push('/login');
-        }
-      });
-      return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
+
+      // useUserStore().logout().then(() => {
+      //   if (import.meta.env.VITE_DOMAIN_NAME == 'true') {
+      //     window.location.href = getMainSiteUrl('/login');
+      //   }else{
+      //     router.push('/login');
+      //   }
+      // });
+      // return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
     } else if (code === HttpStatus.SERVER_ERROR) {
       ElMessage({ message: msg, type: 'error' });
       // return Promise.reject(new Error(msg));
@@ -204,31 +229,31 @@ export function download(url: string, params: any, fileName: string) {
   downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' });
   // prettier-ignore
   return service.post(url, params, {
-      transformRequest: [
-        (params: any) => {
-          return tansParams(params);
-        }
-      ],
-      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-      responseType: 'blob'
-    }).then(async (resp: any) => {
-      const isLogin = blobValidate(resp);
-      if (isLogin) {
-        const blob = new Blob([resp]);
-        FileSaver.saveAs(blob, fileName);
-      } else {
-        const blob = new Blob([resp]);
-        const resText = await blob.text();
-        const rspObj = JSON.parse(resText);
-        const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
-        ElMessage.error(errMsg);
+    transformRequest: [
+      (params: any) => {
+        return tansParams(params);
       }
-      downloadLoadingInstance.close();
-    }).catch((r: any) => {
-      console.error(r);
-      ElMessage.error('下载文件出现错误,请联系管理员!');
-      downloadLoadingInstance.close();
-    });
+    ],
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+    responseType: 'blob'
+  }).then(async (resp: any) => {
+    const isLogin = blobValidate(resp);
+    if (isLogin) {
+      const blob = new Blob([resp]);
+      FileSaver.saveAs(blob, fileName);
+    } else {
+      const blob = new Blob([resp]);
+      const resText = await blob.text();
+      const rspObj = JSON.parse(resText);
+      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
+      ElMessage.error(errMsg);
+    }
+    downloadLoadingInstance.close();
+  }).catch((r: any) => {
+    console.error(r);
+    ElMessage.error('下载文件出现错误,请联系管理员!');
+    downloadLoadingInstance.close();
+  });
 }
 // 导出 axios 实例
 export default service;

+ 37 - 38
src/utils/siteConfig.ts

@@ -71,24 +71,24 @@ export function getCurrentSite(): any {
 
   // 定义本地开发环境的域名映射关系
   // 确保你的 hosts 文件已经配置了这些域名指向 127.0.0.1
-  if (host === 'www.yingpai365.com' || host === 'localhost') return 'www'; // 兼容未配hosts的情况
-  if (host === 'b.yingpai365.com') return 'b';
-  if (host === 'mro.yingpai365.com') return 'mro';
-  if (host === 'fuli.yingpai365.com') return 'fuli';
-  if (host === 'reg.yingpai365.com') return 'reg';
-  if (host === 'breg.yingpai365.com') return 'breg';
-  if (host === 'greg.yingpai365.com') return 'greg';
-  if (host === 'passport.yingpai365.com') return 'passport';
-  if (host === 'search.yingpai365.com') return 'search';
-  if (host === 'item.yingpai365.com') return 'item';
-  if (host === 'cart.yingpai365.com') return 'cart';
-  if (host === 'trad.yingpai365.com') return 'trad';
-  if (host === 'payc.yingpai365.com') return 'payc';
-  if (host === 'order.yingpai365.com') return 'order';
-  if (host === 'plan.yingpai365.com') return 'plan';
-  if (host === 'plan_info.yingpai365.com') return 'plan_info';
-  if (host === 'i.yingpai365.com') return 'i';
-  if (host === 'easybuv.yingpai365.com') return 'easybuv';
+  if (host === 'www.xiaoluwebsite.xyz' || host === 'localhost') return 'www'; // 兼容未配hosts的情况
+  if (host === 'b.xiaoluwebsite.xyz') return 'b';
+  if (host === 'mro.xiaoluwebsite.xyz') return 'mro';
+  if (host === 'fuli.xiaoluwebsite.xyz') return 'fuli';
+  if (host === 'reg.xiaoluwebsite.xyz') return 'reg';
+  if (host === 'breg.xiaoluwebsite.xyz') return 'breg';
+  if (host === 'greg.xiaoluwebsite.xyz') return 'greg';
+  if (host === 'passport.xiaoluwebsite.xyz') return 'passport';
+  if (host === 'search.xiaoluwebsite.xyz') return 'search';
+  if (host === 'item.xiaoluwebsite.xyz') return 'item';
+  if (host === 'cart.xiaoluwebsite.xyz') return 'cart';
+  if (host === 'trad.xiaoluwebsite.xyz') return 'trad';
+  if (host === 'payc.xiaoluwebsite.xyz') return 'payc';
+  if (host === 'order.xiaoluwebsite.xyz') return 'order';
+  if (host === 'plan.xiaoluwebsite.xyz') return 'plan';
+  if (host === 'plan_info.xiaoluwebsite.xyz') return 'plan_info';
+  if (host === 'i.xiaoluwebsite.xyz') return 'i';
+  if (host === 'easybuv.xiaoluwebsite.xyz') return 'easybuv';
 
   // 生产环境逻辑 (保持不变,或者合并到上面的判断中)
   if (import.meta.env.PROD) {
@@ -133,24 +133,24 @@ export function onPath(path: string) {
     let url = '';
     // 域名映射表 (保持不变)
     const domainMap: Record<string, string> = {
-      www: 'www.yingpai365.com',
-      b: 'b.yingpai365.com',
-      mro: 'mro.yingpai365.com',
-      fuli: 'fuli.yingpai365.com',
-      reg: 'reg.yingpai365.com',
-      breg: 'breg.yingpai365.com',
-      greg: 'greg.yingpai365.com',
-      passport: 'passport.yingpai365.com',
-      search: 'search.yingpai365.com',
-      item: 'item.yingpai365.com',
-      cart: 'cart.yingpai365.com',
-      trad: 'trad.yingpai365.com',
-      payc: 'payc.yingpai365.com',
-      order: 'order.yingpai365.com',
-      plan: 'plan.yingpai365.com',
-      plan_info: 'plan_info.yingpai365.com',
-      i: 'i.yingpai365.com',
-      easybuv: 'easybuv.yingpai365.com'
+      www: 'www.xiaoluwebsite.xyz',
+      b: 'b.xiaoluwebsite.xyz',
+      mro: 'mro.xiaoluwebsite.xyz',
+      fuli: 'fuli.xiaoluwebsite.xyz',
+      reg: 'reg.xiaoluwebsite.xyz',
+      breg: 'breg.xiaoluwebsite.xyz',
+      greg: 'greg.xiaoluwebsite.xyz',
+      passport: 'passport.xiaoluwebsite.xyz',
+      search: 'search.xiaoluwebsite.xyz',
+      item: 'item.xiaoluwebsite.xyz',
+      cart: 'cart.xiaoluwebsite.xyz',
+      trad: 'trad.xiaoluwebsite.xyz',
+      payc: 'payc.xiaoluwebsite.xyz',
+      order: 'order.xiaoluwebsite.xyz',
+      plan: 'plan.xiaoluwebsite.xyz',
+      plan_info: 'plan_info.xiaoluwebsite.xyz',
+      i: 'i.xiaoluwebsite.xyz',
+      easybuv: 'easybuv.xiaoluwebsite.xyz'
     };
 
     const baseDomain = domainMap[targetSite];
@@ -159,9 +159,8 @@ export function onPath(path: string) {
       url = `https://${baseDomain}${path}`;
     } else {
       const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
-      url = `http://${baseDomain}:${devPort}${path}`;
+      url = `https://${baseDomain}:${devPort}${path}`;
     }
-
     // 【修改】根据是否同域名决定跳转方式
     if (isSameSite) {
       // 同域名且传入了 router,使用 Vue Router 内部跳转

+ 1 - 1
src/views/login.vue

@@ -138,7 +138,7 @@ const handleLogin = () => {
       const [err] = await to(userStore.login(loginForm.value));
       if (!err) {
         const redirectUrl = redirect.value || '/';
-        await router.push(redirectUrl);
+        onPath(redirectUrl);
         loading.value = false;
       } else {
         loading.value = false;

+ 21 - 20
vite.config.ts

@@ -3,6 +3,7 @@ import createPlugins from './vite/plugins';
 import autoprefixer from 'autoprefixer'; // css自动添加兼容性前缀
 import path from 'path';
 
+
 export default defineConfig(({ mode, command }) => {
   const env = loadEnv(mode, process.cwd());
   return {
@@ -21,33 +22,33 @@ export default defineConfig(({ mode, command }) => {
     server: {
       host: '0.0.0.0',
       allowedHosts: [
-        'www.yingpai365.com',
-        'b.yingpai365.com',
-        'mro.yingpai365.com',
-        'fuli.yingpai365.com',
-        'reg.yingpai365.com',
-        'breg.yingpai365.com',
-        'greg.yingpai365.com',
-        'passport.yingpai365.com',
-        'search.yingpai365.com',
-        'item.yingpai365.com',
-        'cart.yingpai365.com',
-        'trad.yingpai365.com',
-        'payc.yingpai365.com',
-        'order.yingpai365.com',
-        'plan.yingpai365.com',
-        'plan_info.yingpai365.com',
-        'i.yingpai365.com',
-        'easybuv.yingpai365.com'
+        'www.xiaoluwebsite.xyz',
+        'b.xiaoluwebsite.xyz',
+        'mro.xiaoluwebsite.xyz',
+        'fuli.xiaoluwebsite.xyz',
+        'reg.xiaoluwebsite.xyz',
+        'breg.xiaoluwebsite.xyz',
+        'greg.xiaoluwebsite.xyz',
+        'passport.xiaoluwebsite.xyz',
+        'search.xiaoluwebsite.xyz',
+        'item.xiaoluwebsite.xyz',
+        'cart.xiaoluwebsite.xyz',
+        'trad.xiaoluwebsite.xyz',
+        'payc.xiaoluwebsite.xyz',
+        'order.xiaoluwebsite.xyz',
+        'plan.xiaoluwebsite.xyz',
+        'plan_info.xiaoluwebsite.xyz',
+        'i.xiaoluwebsite.xyz',
+        'easybuv.xiaoluwebsite.xyz'
       ],
       port: Number(env.VITE_APP_PORT),
       // port: Number(env.VITE_APP_PORT),
       open: true,
       proxy: {
         [env.VITE_APP_BASE_API]: {
-          target: 'http://localhost:8080',
+          // target: 'http://localhost:8080',
           // target: 'http://yp1.yingpaipay.com:9026',
-          // target: 'https://jingyang.xiaoluwebsite.xyz',
+          target: 'https://jingyang.xiaoluwebsite.xyz',
           // target: 'http://192.168.1.52:8080',
           changeOrigin: true,
           ws: true,

+ 2 - 0
vite/plugins/index.ts

@@ -8,6 +8,7 @@ import createIcons from './icons';
 import createSvgIconsPlugin from './svg-icon';
 import createCompression from './compression';
 import createSetupExtend from './setup-extend';
+import basicSsl from '@vitejs/plugin-basic-ssl' // 1. 引入插件
 import path from 'path';
 
 export default (viteEnv: any, isBuild = false): [] => {
@@ -21,5 +22,6 @@ export default (viteEnv: any, isBuild = false): [] => {
   vitePlugins.push(createIcons());
   vitePlugins.push(createSvgIconsPlugin(path));
   vitePlugins.push(createSetupExtend());
+  vitePlugins.push(basicSsl());
   return vitePlugins;
 };