ソースを参照

feat(config): 添加多域名配置支持

- 在 .env.development 和 .env.production 中添加多个域名环境变量配置
- 创建 DOMAIN_MAP 常量用于统一管理域名映射关系
- 修改 siteConfig.ts 中的域名判断逻辑为动态配置方式
- 更新 request.ts 中的主站 URL 生成函数使用环境变量配置
- 修改 vite.config.ts 中的 allowedHosts 配置为动态读取环境变量
- 移除 permission.ts 中硬编码的域名配置代码
肖路 3 週間 前
コミット
925abdd1f0
6 ファイル変更110 行追加74 行削除
  1. 20 0
      .env.development
  2. 20 0
      .env.production
  3. 8 8
      src/permission.ts
  4. 5 5
      src/utils/request.ts
  5. 39 43
      src/utils/siteConfig.ts
  6. 18 18
      vite.config.ts

+ 20 - 0
.env.development

@@ -37,3 +37,23 @@ VITE_APP_SSE = true
 
 
 # 是否开启多域名
 # 是否开启多域名
 VITE_DOMAIN_NAME = true
 VITE_DOMAIN_NAME = true
+
+# 多域名配置
+VITE_DOMAIN_WWW = 'index.xiaoluwebsite.xyz'
+VITE_DOMAIN_B = 'b.xiaoluwebsite.xyz'
+VITE_DOMAIN_MRO = 'mro.xiaoluwebsite.xyz'
+VITE_DOMAIN_FULI = 'fuli.xiaoluwebsite.xyz'
+VITE_DOMAIN_REG = 'reg.xiaoluwebsite.xyz'
+VITE_DOMAIN_BREG = 'breg.xiaoluwebsite.xyz'
+VITE_DOMAIN_GREG = 'greg.xiaoluwebsite.xyz'
+VITE_DOMAIN_PASSPORT = 'pass.xiaoluwebsite.xyz'
+VITE_DOMAIN_SEARCH = 'search.xiaoluwebsite.xyz'
+VITE_DOMAIN_ITEM = 'item.xiaoluwebsite.xyz'
+VITE_DOMAIN_CART = 'cart.xiaoluwebsite.xyz'
+VITE_DOMAIN_TRAD = 'trad.xiaoluwebsite.xyz'
+VITE_DOMAIN_PAYC = 'payc.xiaoluwebsite.xyz'
+VITE_DOMAIN_ORDER = 'order.xiaoluwebsite.xyz'
+VITE_DOMAIN_PLAN = 'plan.xiaoluwebsite.xyz'
+VITE_DOMAIN_PLAN_INFO = 'planinfo.xiaoluwebsite.xyz'
+VITE_DOMAIN_I = 'i.xiaoluwebsite.xyz'
+VITE_DOMAIN_EASYBUV = 'easybuv.xiaoluwebsite.xyz'

+ 20 - 0
.env.production

@@ -40,3 +40,23 @@ VITE_APP_SSE = true
 
 
 # 是否开启多域名
 # 是否开启多域名
 VITE_DOMAIN_NAME = true
 VITE_DOMAIN_NAME = true
+
+# 多域名配置
+VITE_DOMAIN_WWW = 'index.xiaoluwebsite.xyz'
+VITE_DOMAIN_B = 'b.xiaoluwebsite.xyz'
+VITE_DOMAIN_MRO = 'mro.xiaoluwebsite.xyz'
+VITE_DOMAIN_FULI = 'fuli.xiaoluwebsite.xyz'
+VITE_DOMAIN_REG = 'reg.xiaoluwebsite.xyz'
+VITE_DOMAIN_BREG = 'breg.xiaoluwebsite.xyz'
+VITE_DOMAIN_GREG = 'greg.xiaoluwebsite.xyz'
+VITE_DOMAIN_PASSPORT = 'pass.xiaoluwebsite.xyz'
+VITE_DOMAIN_SEARCH = 'search.xiaoluwebsite.xyz'
+VITE_DOMAIN_ITEM = 'item.xiaoluwebsite.xyz'
+VITE_DOMAIN_CART = 'cart.xiaoluwebsite.xyz'
+VITE_DOMAIN_TRAD = 'trad.xiaoluwebsite.xyz'
+VITE_DOMAIN_PAYC = 'payc.xiaoluwebsite.xyz'
+VITE_DOMAIN_ORDER = 'order.xiaoluwebsite.xyz'
+VITE_DOMAIN_PLAN = 'plan.xiaoluwebsite.xyz'
+VITE_DOMAIN_PLAN_INFO = 'planinfo.xiaoluwebsite.xyz'
+VITE_DOMAIN_I = 'i.xiaoluwebsite.xyz'
+VITE_DOMAIN_EASYBUV = 'easybuv.xiaoluwebsite.xyz'

+ 8 - 8
src/permission.ts

@@ -37,14 +37,14 @@ const isWhiteList = (path: string) => {
   return whiteList.some((pattern) => isPathMatch(pattern, path));
   return whiteList.some((pattern) => isPathMatch(pattern, path));
 };
 };
 
 
-function getMainSiteUrl(path: string) {
-  if (import.meta.env.PROD) {
-    return `https://index.xiaoluwebsite.xyz${path}`;
-  } else {
-    const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
-    return `https://index.xiaoluwebsite.xyz:${devPort}${path}`;
-  }
-}
+// function getMainSiteUrl(path: string) {
+//   if (import.meta.env.PROD) {
+//     return `https://index.xiaoluwebsite.xyz${path}`;
+//   } else {
+//     const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
+//     return `https://index.xiaoluwebsite.xyz:${devPort}${path}`;
+//   }
+// }
 
 
 // 根据 isDiy 字段决定首页路径
 // 根据 isDiy 字段决定首页路径
 function getDomainHomePath(site: string, station: ReturnType<typeof stationStore>) {
 function getDomainHomePath(site: string, station: ReturnType<typeof stationStore>) {

+ 5 - 5
src/utils/request.ts

@@ -9,18 +9,18 @@ import { LoadingInstance } from 'element-plus/es/components/loading/src/loading'
 import FileSaver from 'file-saver';
 import FileSaver from 'file-saver';
 import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto';
 import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto';
 import { encrypt, decrypt } from '@/utils/jsencrypt';
 import { encrypt, decrypt } from '@/utils/jsencrypt';
-import { onPath } from '@/utils/siteConfig';
+import { onPath, DOMAIN_MAP } from '@/utils/siteConfig';
 import router from '@/router';
 import router from '@/router';
 
 
 // 获取主站完整 URL(用于跨域跳转)
 // 获取主站完整 URL(用于跨域跳转)
 function getMainSiteUrl(path: string) {
 function getMainSiteUrl(path: string) {
+  const mainDomain = DOMAIN_MAP.www;
   if (import.meta.env.PROD) {
   if (import.meta.env.PROD) {
-    return `https://index.xiaoluwebsite.xyz${path}`;
+    return `https://${mainDomain}${path}`;
   } else {
   } else {
-    // 本地开发:指向 index.xiaoluwebsite.xyz 加上当前运行的端口
-    // 假设你启动 vite 后访问的是 http://index.xiaoluwebsite.xyz
+    // 本地开发:指向主站域名加上当前运行的端口
     const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
     const devPort = window.location.port || import.meta.env.VITE_APP_PORT;
-    return `https://index.xiaoluwebsite.xyz:${devPort}${path}`;
+    return `https://${mainDomain}:${devPort}${path}`;
   }
   }
 }
 }
 
 

+ 39 - 43
src/utils/siteConfig.ts

@@ -1,3 +1,34 @@
+// 从环境变量获取域名配置
+export const DOMAIN_MAP: Record<string, string> = {
+  www: import.meta.env.VITE_DOMAIN_WWW || 'index.xiaoluwebsite.xyz',
+  b: import.meta.env.VITE_DOMAIN_B || 'b.xiaoluwebsite.xyz',
+  mro: import.meta.env.VITE_DOMAIN_MRO || 'mro.xiaoluwebsite.xyz',
+  fuli: import.meta.env.VITE_DOMAIN_FULI || 'fuli.xiaoluwebsite.xyz',
+  reg: import.meta.env.VITE_DOMAIN_REG || 'reg.xiaoluwebsite.xyz',
+  breg: import.meta.env.VITE_DOMAIN_BREG || 'breg.xiaoluwebsite.xyz',
+  greg: import.meta.env.VITE_DOMAIN_GREG || 'greg.xiaoluwebsite.xyz',
+  passport: import.meta.env.VITE_DOMAIN_PASSPORT || 'pass.xiaoluwebsite.xyz',
+  search: import.meta.env.VITE_DOMAIN_SEARCH || 'search.xiaoluwebsite.xyz',
+  item: import.meta.env.VITE_DOMAIN_ITEM || 'item.xiaoluwebsite.xyz',
+  cart: import.meta.env.VITE_DOMAIN_CART || 'cart.xiaoluwebsite.xyz',
+  trad: import.meta.env.VITE_DOMAIN_TRAD || 'trad.xiaoluwebsite.xyz',
+  payc: import.meta.env.VITE_DOMAIN_PAYC || 'payc.xiaoluwebsite.xyz',
+  order: import.meta.env.VITE_DOMAIN_ORDER || 'order.xiaoluwebsite.xyz',
+  plan: import.meta.env.VITE_DOMAIN_PLAN || 'plan.xiaoluwebsite.xyz',
+  plan_info: import.meta.env.VITE_DOMAIN_PLAN_INFO || 'planinfo.xiaoluwebsite.xyz',
+  i: import.meta.env.VITE_DOMAIN_I || 'i.xiaoluwebsite.xyz',
+  easybuv: import.meta.env.VITE_DOMAIN_EASYBUV || 'easybuv.xiaoluwebsite.xyz'
+};
+
+// 反向域名映射 (域名 -> 站点名)
+const REVERSE_DOMAIN_MAP: Record<string, string> = Object.entries(DOMAIN_MAP).reduce(
+  (acc, [site, domain]) => {
+    acc[domain] = site;
+    return acc;
+  },
+  {} as Record<string, string>
+);
+
 // 每个站点允许的路由 (保持不变)
 // 每个站点允许的路由 (保持不变)
 export const SITE_ROUTES: Record<any, string[]> = {
 export const SITE_ROUTES: Record<any, string[]> = {
   www: ['/', '/index', '/indexData', '/theme', '/diy'], //优易365主站
   www: ['/', '/index', '/indexData', '/theme', '/diy'], //优易365主站
@@ -69,26 +100,12 @@ export function getCurrentSite(): any {
   // 无论是生产还是开发,现在都统一通过域名判断
   // 无论是生产还是开发,现在都统一通过域名判断
   const host = window.location.hostname;
   const host = window.location.hostname;
 
 
-  // 定义本地开发环境的域名映射关系
-  // 确保你的 hosts 文件已经配置了这些域名指向 127.0.0.1
-  if (host === 'index.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 === 'pass.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 === 'planinfo.xiaoluwebsite.xyz') return 'plan_info';
-  if (host === 'i.xiaoluwebsite.xyz') return 'i';
-  if (host === 'easybuv.xiaoluwebsite.xyz') return 'easybuv';
+  // 使用环境变量配置的域名映射
+  if (host === 'localhost') return 'www'; // 兼容未配hosts的情况
+  
+  // 从反向映射中查找站点
+  const site = REVERSE_DOMAIN_MAP[host];
+  if (site) return site;
 
 
   // 生产环境逻辑 (保持不变,或者合并到上面的判断中)
   // 生产环境逻辑 (保持不变,或者合并到上面的判断中)
   if (import.meta.env.PROD) {
   if (import.meta.env.PROD) {
@@ -131,29 +148,8 @@ export function onPath(path: string) {
     const isSameSite = currentSite === targetSite;
     const isSameSite = currentSite === targetSite;
 
 
     let url = '';
     let url = '';
-    // 域名映射表 (保持不变)
-    const domainMap: Record<string, string> = {
-      www: 'index.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: 'pass.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: 'planinfo.xiaoluwebsite.xyz',
-      i: 'i.xiaoluwebsite.xyz',
-      easybuv: 'easybuv.xiaoluwebsite.xyz'
-    };
-
-    const baseDomain = domainMap[targetSite];
+    // 使用环境变量配置的域名映射
+    const baseDomain = DOMAIN_MAP[targetSite];
 
 
     if (import.meta.env.PROD) {
     if (import.meta.env.PROD) {
       url = `https://${baseDomain}${path}`;
       url = `https://${baseDomain}${path}`;

+ 18 - 18
vite.config.ts

@@ -21,24 +21,24 @@ export default defineConfig(({ mode, command }) => {
     server: {
     server: {
       host: '0.0.0.0',
       host: '0.0.0.0',
       allowedHosts: [
       allowedHosts: [
-        'index.xiaoluwebsite.xyz',
-        'b.xiaoluwebsite.xyz',
-        'mro.xiaoluwebsite.xyz',
-        'fuli.xiaoluwebsite.xyz',
-        'reg.xiaoluwebsite.xyz',
-        'breg.xiaoluwebsite.xyz',
-        'greg.xiaoluwebsite.xyz',
-        'pass.xiaoluwebsite.xyz',
-        'search.xiaoluwebsite.xyz',
-        'item.xiaoluwebsite.xyz',
-        'cart.xiaoluwebsite.xyz',
-        'trad.xiaoluwebsite.xyz',
-        'payc.xiaoluwebsite.xyz',
-        'order.xiaoluwebsite.xyz',
-        'plan.xiaoluwebsite.xyz',
-        'planinfo.xiaoluwebsite.xyz',
-        'i.xiaoluwebsite.xyz',
-        'easybuv.xiaoluwebsite.xyz'
+        env.VITE_DOMAIN_WWW,
+        env.VITE_DOMAIN_B,
+        env.VITE_DOMAIN_MRO,
+        env.VITE_DOMAIN_FULI,
+        env.VITE_DOMAIN_REG,
+        env.VITE_DOMAIN_BREG,
+        env.VITE_DOMAIN_GREG,
+        env.VITE_DOMAIN_PASSPORT,
+        env.VITE_DOMAIN_SEARCH,
+        env.VITE_DOMAIN_ITEM,
+        env.VITE_DOMAIN_CART,
+        env.VITE_DOMAIN_TRAD,
+        env.VITE_DOMAIN_PAYC,
+        env.VITE_DOMAIN_ORDER,
+        env.VITE_DOMAIN_PLAN,
+        env.VITE_DOMAIN_PLAN_INFO,
+        env.VITE_DOMAIN_I,
+        env.VITE_DOMAIN_EASYBUV
       ],
       ],
       port: Number(env.VITE_APP_PORT),
       port: Number(env.VITE_APP_PORT),
       // port: Number(env.VITE_APP_PORT),
       // port: Number(env.VITE_APP_PORT),