diff --git a/README.md b/README.md index 71b7261..03a0986 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ 前端地址:`http://localhost:5173` -后台地址:`http://localhost:5173/admin/login`,开发态默认管理员为 `admin / admin123456`。 +后台地址默认:`http://localhost:5173/admin/login`。可通过 `VITE_ADMIN_BASE_PATH` 调整后台页面入口。 如需拆分调试,可手动执行: @@ -55,19 +55,19 @@ npm run dev - 文件上传已接入 MinIO,发布账号资产截图和申诉证据可上传 JPG、PNG、WebP 或 PDF。 - 如果本机有代理工具占用 `127.0.0.1:9000`,MinIO 开发地址使用 `http://localhost:9000`。 - 钱包账务当前为开发态模拟流水,可通过 `GET /api/wallet/balance` 和 `GET /api/wallet/ledger` 查看。 -- 后台资金流水已接入,页面为 `http://localhost:5173/admin/wallet-ledger`,支持按用户、订单和业务类型查询。 +- 后台资金流水已接入,支持按用户、订单和业务类型查询。 - 站内信已支持订单关键节点自动写入,可通过 `GET /api/notifications` 查看。 - 订单群聊已支持支付成功后自动创建,租客、号主和客服可在移动端消息页进入会话。 -- 申诉仲裁已支持订单双方发起申诉、开发态后台落账处理,后台页面为 `http://localhost:5173/admin/disputes`。 -- 系统配置已支持默认配置初始化和后台编辑,页面为 `http://localhost:5173/admin/system-configs`,更新会写入审计日志。 -- 后台已使用独立登录、图形验证码和独立管理 UI,页面为 `http://localhost:5173/admin/login`;开发态默认管理员为 `admin / admin123456`。 -- 后台仪表盘已接入真实统计数据,页面为 `http://localhost:5173/admin/dashboard`。 -- 用户管理后台已接入,页面为 `http://localhost:5173/admin/users`,支持冻结和解冻用户。 -- 订单管理后台已接入,页面为 `http://localhost:5173/admin/orders`,支持查看全量订单和交接记录。 -- 商品管理后台已接入,页面为 `http://localhost:5173/admin/listings`,支持查看全量商品、商品详情、强制下架和标记异常。 +- 申诉仲裁已支持订单双方发起申诉、开发态后台落账处理。 +- 系统配置已支持默认配置初始化和后台编辑,更新会写入审计日志。 +- 后台已使用独立登录、图形验证码和独立管理 UI,页面入口由 `VITE_ADMIN_BASE_PATH` 控制。 +- 后台仪表盘已接入真实统计数据。 +- 用户管理后台已接入,支持冻结和解冻用户。 +- 订单管理后台已接入,支持查看全量订单和交接记录。 +- 商品管理后台已接入,支持查看全量商品、商品详情、强制下架和标记异常。 - 订单详情后台已支持客服关闭和标记异常,相关操作会写入审计日志并通知双方。 -- 商品审核后台已接入,页面为 `http://localhost:5173/admin/listings/review`,审核员可查看账号资产截图后通过或拒绝。 -- 审计日志后台已接入,页面为 `http://localhost:5173/admin/audit-logs`,支持查看高风险操作明细。 +- 商品审核后台已接入,审核员可查看账号资产截图后通过或拒绝。 +- 审计日志后台已接入,支持查看高风险操作明细。 ## 文档 diff --git a/backend/.env.example b/backend/.env.example index b4e7ff2..58792c0 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -14,6 +14,9 @@ REDIS_DB=0 JWT_SECRET=change-me +# 前端后台页面入口;本地默认 /admin,生产建议改成不公开的单段路径。 +VITE_ADMIN_BASE_PATH=/admin + # 首次启动且管理员表为空时,按以下变量创建首个超级管理员。 # 本地开发可自行填写,生产环境请使用随机强密码,创建后建议从 .env 移除。 ADMIN_BOOTSTRAP_USERNAME= diff --git a/backend/.env.prod.example b/backend/.env.prod.example index 152cf96..f495ab7 100644 --- a/backend/.env.prod.example +++ b/backend/.env.prod.example @@ -19,6 +19,9 @@ REDIS_DB=0 JWT_SECRET=change-to-a-long-random-secret +# 前端后台页面入口;生产请改成不公开的单段路径,不要使用 /admin。 +VITE_ADMIN_BASE_PATH=/manage-7x9k2p + # 首次启动且管理员表为空时创建首个超级管理员;生产密码至少 12 位且包含字母和数字。 # 创建成功后建议从 .env 移除,后续管理员通过后台维护。 ADMIN_BOOTSTRAP_USERNAME=change-admin-username diff --git a/deploy/README.md b/deploy/README.md index a90acdd..d63ae1b 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -108,8 +108,8 @@ curl https://你的域名/api/health 浏览器访问: ```text -https://hfb.221329.cc.cd -https://hfb.221329.cc.cd/admin/login +https://你的域名 +https://你的域名/你配置的后台入口/login ``` Caddy 证书和 ACME 账号数据保存在 Docker 卷 `caddy_data`、`caddy_config` 中。不要随意删除这两个卷,否则 Caddy 会重新申请证书,频繁重建可能触发证书签发频率限制。 diff --git a/deploy/caddy/Caddyfile b/deploy/caddy/Caddyfile index 2e7f2e8..dff2704 100644 --- a/deploy/caddy/Caddyfile +++ b/deploy/caddy/Caddyfile @@ -48,6 +48,12 @@ } } + # 生产后台页面使用构建时配置的隐藏入口,旧 /admin 入口直接返回 404。 + @legacy_admin path /admin /admin/* + handle @legacy_admin { + respond 404 + } + # 其余流量返回前端静态资源,未命中的路径交给 SPA 处理。 handle { root * /srv/dist diff --git a/deploy/caddy/Dockerfile b/deploy/caddy/Dockerfile index b118227..8ce75ba 100644 --- a/deploy/caddy/Dockerfile +++ b/deploy/caddy/Dockerfile @@ -1,6 +1,9 @@ # 第一阶段:构建前端静态资源 FROM node:24-alpine AS build +ARG VITE_ADMIN_BASE_PATH=/manage-7x9k2p +ENV VITE_ADMIN_BASE_PATH=${VITE_ADMIN_BASE_PATH} + WORKDIR /src COPY frontend/package*.json ./ RUN npm install diff --git a/deploy/docker-compose.prod.yml b/deploy/docker-compose.prod.yml index 50e713a..76daf0e 100644 --- a/deploy/docker-compose.prod.yml +++ b/deploy/docker-compose.prod.yml @@ -3,6 +3,8 @@ services: build: context: .. dockerfile: deploy/caddy/Dockerfile + args: + VITE_ADMIN_BASE_PATH: ${VITE_ADMIN_BASE_PATH:-/manage-7x9k2p} restart: unless-stopped environment: TZ: Asia/Shanghai diff --git a/frontend/src/features/admin/views/AdminChatsView.vue b/frontend/src/features/admin/views/AdminChatsView.vue index 7b2a1bb..0e17a9a 100644 --- a/frontend/src/features/admin/views/AdminChatsView.vue +++ b/frontend/src/features/admin/views/AdminChatsView.vue @@ -19,6 +19,7 @@ import ChatAttachmentImage from '@/components/ChatAttachmentImage.vue' import { useChatSSE, type ChatEvent } from '@/features/chats/composables/useChatSSE' import { useDesktopNotification } from '@/features/chats/composables/useDesktopNotification' import NotificationSettings from '@/features/chats/components/NotificationSettings.vue' +import { adminPath } from '@/shared/utils/adminPath' import { formatDateMinute } from '@/shared/utils/time' import TransferDialog from '../components/TransferDialog.vue' import QuickReplyDialog from '../components/QuickReplyDialog.vue' @@ -407,7 +408,7 @@ function getSupportName(item: ChatConversation) {