From 64a4e5bb16f899bd5e0603c5615bbe9f9ac66226 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Wed, 16 Sep 2026 15:09:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(distribution):=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=88=86=E9=94=80=E5=90=8E=E5=8F=B0=E5=85=A5=E5=8F=A3=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E5=B9=B6=E6=94=B6=E5=8F=A3=E4=B8=BB=E7=AB=99=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E9=9A=90=E8=97=8F=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增前端 distributionAdmin 工具:优先 VITE_DISTRIBUTION_ADMIN_URL, 本地开发回退 5190,生产按 distribution.<主站域名> 推导 - 替换主站后台「打开独立分销后台」按钮与开通凭证中硬编码的 :5190 - 分销后台复制凭证改用 window.location.origin,去掉硬编码 http - Caddyfile 中 /manage-7x9k2p 仅主站域名放行,分站域名统一 404 - 构建/部署链路透传 VITE_DISTRIBUTION_ADMIN_URL 与 ADMIN_BASE_PATH --- README.md | 2 + backend/.env.prod.example | 4 ++ deploy/caddy/Caddyfile | 15 ++++++ deploy/caddy/Dockerfile | 4 ++ deploy/docker-compose.prod.yml | 4 ++ distribution-admin/src/pages/Sites.tsx | 2 +- .../views/AdminDistributionSitesView.vue | 20 +++----- .../utils/__tests__/distributionAdmin.spec.ts | 49 +++++++++++++++++++ .../src/shared/utils/distributionAdmin.ts | 35 +++++++++++++ scripts/deploy-prod.sh | 8 +++ 10 files changed, 129 insertions(+), 14 deletions(-) create mode 100644 frontend/src/shared/utils/__tests__/distributionAdmin.spec.ts create mode 100644 frontend/src/shared/utils/distributionAdmin.ts diff --git a/README.md b/README.md index 862f78b..be325de 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ - 分销管理后台:`http://localhost:5190`(在主站后台“分销站点”开通站点并配置分销操作员登录) - 分销专属前台:`http://localhost:5191`(独立端口隔离,支持 Host 域名与 X-Distribution-Site 头识别站点) +> 生产环境不使用上述端口:Caddy 按域名分流,分销管理后台固定为 `https://distribution.`(见 `deploy/caddy/Caddyfile`)。主站后台的「打开独立分销后台」与开通凭证通过构建期 `VITE_DISTRIBUTION_ADMIN_URL` 注入该地址;未配置时按当前主站域名推导。 + 如需拆分调试,可手动执行: diff --git a/backend/.env.prod.example b/backend/.env.prod.example index d5707b9..ca46136 100644 --- a/backend/.env.prod.example +++ b/backend/.env.prod.example @@ -34,6 +34,10 @@ JWT_SECRET=change-to-a-long-random-secret # 前端后台页面入口;生产请改成不公开的单段路径,不要使用 /admin。 VITE_ADMIN_BASE_PATH=/manage-7x9k2p +# 分销(分站)管理后台地址,供主站后台「打开独立分销后台」按钮和开通凭证使用。 +# 留空时前端按 https://distribution. 推导,与 deploy/caddy/Caddyfile 一致; +# 只有分销后台改用其他域名时才需要显式填写。 +# VITE_DISTRIBUTION_ADMIN_URL=https://distribution.hfb.221329.cc.cd # 首次启动且管理员表为空时创建首个超级管理员;生产密码至少 12 位且包含字母和数字。 # 创建成功后建议从 .env 移除,后续管理员通过后台维护。 diff --git a/deploy/caddy/Caddyfile b/deploy/caddy/Caddyfile index 74c2538..79c73c4 100644 --- a/deploy/caddy/Caddyfile +++ b/deploy/caddy/Caddyfile @@ -63,6 +63,13 @@ import public_api + # 主站后台隐藏入口:storefront 片段同时服务主站和所有分销站点域名, + # 这里统一 404,仅主站域名在下方主站 block 用 @main_admin 放行。 + @platform_admin path {$ADMIN_BASE_PATH:/manage-7x9k2p} {$ADMIN_BASE_PATH:/manage-7x9k2p}/* + handle @platform_admin { + respond 404 + } + # 生产后台页面使用构建时配置的隐藏入口,旧 /admin 入口直接返回 404。 @legacy_admin path /admin /admin/* handle @legacy_admin { @@ -80,6 +87,14 @@ # 主站与过渡子域名共享同一套配置:域名迁移期间新旧域名同时可访问, # 避免 DNS 缓存未生效导致部分用户打不开。迁移完成后可移除 h5.{$CADDY_DOMAIN}。 {$CADDY_DOMAIN}, h5.{$CADDY_DOMAIN} { + # 主站后台隐藏入口只在本域名提供静态资源;分销站点域名由 storefront 片段统一 404。 + @main_admin path {$ADMIN_BASE_PATH:/manage-7x9k2p} {$ADMIN_BASE_PATH:/manage-7x9k2p}/* + handle @main_admin { + root * /srv/dist + try_files {path} /index.html + file_server + } + import storefront } diff --git a/deploy/caddy/Dockerfile b/deploy/caddy/Dockerfile index 0150458..4754c4e 100644 --- a/deploy/caddy/Dockerfile +++ b/deploy/caddy/Dockerfile @@ -5,6 +5,10 @@ FROM node:24-alpine AS build ARG VITE_ADMIN_BASE_PATH=/manage-7x9k2p ENV VITE_ADMIN_BASE_PATH=${VITE_ADMIN_BASE_PATH} +# 主站后台里「打开独立分销后台」按钮与开通凭证使用的分销后台地址。 +# 留空时前端按 distribution.<当前主站域名> 推导,显式配置可覆盖(如独立后台子域改名)。 +ARG VITE_DISTRIBUTION_ADMIN_URL= +ENV VITE_DISTRIBUTION_ADMIN_URL=${VITE_DISTRIBUTION_ADMIN_URL} WORKDIR /src COPY frontend/package*.json ./ diff --git a/deploy/docker-compose.prod.yml b/deploy/docker-compose.prod.yml index 047f1e9..e1c8dc0 100644 --- a/deploy/docker-compose.prod.yml +++ b/deploy/docker-compose.prod.yml @@ -5,11 +5,15 @@ services: dockerfile: deploy/caddy/Dockerfile args: VITE_ADMIN_BASE_PATH: ${VITE_ADMIN_BASE_PATH:-/manage-7x9k2p} + # 留空时前端按 distribution. 推导,与 Caddyfile 的站点规则保持一致。 + VITE_DISTRIBUTION_ADMIN_URL: ${VITE_DISTRIBUTION_ADMIN_URL:-} restart: unless-stopped environment: TZ: Asia/Shanghai CADDY_DOMAIN: ${CADDY_DOMAIN:?请先导出 CADDY_DOMAIN,或使用 scripts/deploy-prod.sh 部署} CADDY_EMAIL: ${CADDY_EMAIL:?请先导出 CADDY_EMAIL,或使用 scripts/deploy-prod.sh 部署} + # Caddyfile 用它放行主站后台隐藏入口,并与前端构建期的 VITE_ADMIN_BASE_PATH 保持一致。 + ADMIN_BASE_PATH: ${VITE_ADMIN_BASE_PATH:-/manage-7x9k2p} # 选号网域名可选;未配置时 conf.d 为空,不影响主站 CADDY_SHOW_DOMAIN: ${CADDY_SHOW_DOMAIN:-} ports: diff --git a/distribution-admin/src/pages/Sites.tsx b/distribution-admin/src/pages/Sites.tsx index f4ed68a..d1e0d70 100644 --- a/distribution-admin/src/pages/Sites.tsx +++ b/distribution-admin/src/pages/Sites.tsx @@ -342,7 +342,7 @@ export default function Sites({ isSuperadmin = true }: { isSuperadmin?: boolean