# 本次更新说明(2026-07-03)— 管理端增强 + 登录门控 + 客户管理 ## 更新主题 | 项目 | 说明 | |------|------| | 打包时间 | 2026-07-03 | | 适用场景 | **服务器已有旧版查价**,增量更新代码 | | 是否改库 | **是**,需执行 Prisma 迁移(安装脚本自动执行) | | 是否改 `.env` | **保留**已有 `.env`;可删除废弃的 `NEXT_PUBLIC_EMBED_DEMO_*` | | 是否必须清 Redis | **建议**(避免旧报价缓存) | --- ## 本次主要功能 1. **管理端登录**:不再预填/展示演示账号;默认密码改为 `kj123456`(已有库需手动改密) 2. **嵌入演示登录**:客户编号 + 密码 `123456`;按客户展示加价配置并查价(Cookie 会话,无需页面 Token) 3. **宿主 API 多租户**:按 Token 对应 `customer_id` 加价(如 `CUST_002`) 4. **预警中心增强**:中文根本原因、客户、地址、货物信息 5. **查价记录**(原「队列监控」):最近 1000 条询价流水 6. **客户管理**:管理端新增客户、签发 API Key 7. **加价精度**:支持 0.01% 加价比例 --- ## 数据库迁移(必做) 安装脚本会自动执行 `prisma migrate deploy`。本次新增迁移: | 迁移目录 | 内容 | |----------|------| | `20260703100000_markup_percent_two_decimals` | 加价字段支持两位小数 | | `20260703120000_host_customer_api_keys` | 客户表 + API Key 表 | | `20260703140000_quote_query_log` | 查价审计流水表(最多 1000 条) | **注意:不要**重新导入 `数据库/chajia.sql`,否则会清空生产数据。 --- ## 零、开发机打包(Windows) ```powershell cd X:\work\chajia powershell -ExecutionPolicy Bypass -File deploy\pack-server-upload.ps1 ``` 生成目录: ``` 上传到服务器/ ├── README.md ├── RELEASE-NOTES.md ← 本文件(操作步骤) ├── 辅助脚本/ ├── 代码/ ← 上传此目录全部内容 └── 数据库/ ← 本次更新不必导入 ``` 将整个 **`上传到服务器`** 打成 zip 上传到服务器。 --- ## 一、服务器更新步骤(场景 B:已有旧版) ### 1. 备份(强烈建议) ```bash cd /home/project/chajia cp .env .env.backup.$(date +%Y%m%d) ``` ### 2. 上传代码 用 zip 解压后的 **`代码/`** 覆盖 `/home/project/chajia/`。 **不要上传或覆盖:** - `.env`(服务器已有配置) - `node_modules/` - `.next/` ### 3. 检查 `.env`(通常无需修改) 确认以下项仍存在且正确即可: ```env DATABASE_URL=mysql://chajia:密码@host.docker.internal:3306/chajia JWT_SECRET=... HOST_SERVICE_TOKENS=... CUSTOMER_REGISTRY=... RPA_MOCK_MODE=false ``` **不要**设置 `RPA_BROWSER_CHANNEL=chrome`(Docker Worker 无系统 Chrome)。 本次**无新增必填环境变量**。可删除(已不再使用): ```env NEXT_PUBLIC_EMBED_DEMO_SERVICE_TOKEN=... NEXT_PUBLIC_EMBED_DEMO_CUSTOMER_ID=... ``` 可选:自定义嵌入演示密码(默认 `123456`) ```env EMBED_DEMO_PASSWORD=123456 ``` ### 已有服务器:管理员改密 若 `admin_demo` 仍为旧密码 `Demo@123`,请在管理端改密,或在 MySQL 更新 `admin_user.password_hash`(新装 seed 默认为 `kj123456`)。 ### 4. 执行安装(构建 + 迁移 + 重启) ```bash cd /home/project/chajia test -f .env && echo "OK: .env exists" || { echo "ERROR: 缺少 .env"; exit 1; } chmod +x deploy/install-bt-host-mysql.sh bash deploy/install-bt-host-mysql.sh ``` 约 **5~15 分钟**。脚本会: 1. `docker compose build`(next-app + rpa-worker + scheduler) 2. 启动容器 3. **`npx prisma migrate deploy`**(执行上述 3 条迁移) 4. 健康检查 ### 5. 确认服务状态 ```bash COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml" $COMPOSE ps ``` 应看到 **next-app、rpa-worker、scheduler、redis** 均为 **Up**。 ```bash curl -I http://127.0.0.1:30325 ``` ### 5. 清空 Redis 缓存(建议) ```bash COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml" $COMPOSE exec redis redis-cli FLUSHDB ``` --- ## 二、部署后验收 ### 管理端 | 检查项 | 地址 / 操作 | |--------|-------------| | 管理端登录 | `/login`,`admin_demo` / `kj123456`(已有库可能仍为旧密码) | | 嵌入演示 | `/embed-demo`,`CUST_002` / `123456` — 应显示 CUST_002 加价配置 | | 预警中心 | `/admin/alerts` — 中文根因、客户、地址、货物 | | 查价记录 | `/admin/queues` — 提交询价后有新行 | | 客户管理 | `/admin/customers` — 可新增客户、轮换 Key | ### 询价回归 ```bash export CHAJIA_BASE_URL="http://你的IP:端口" export CHAJIA_SERVICE_TOKEN="你的token" export CHAJIA_CUSTOMER_ID="CUST_001" bash 辅助脚本/test-denver-boston.sh ``` 或在浏览器打开 `/embed-demo`,用客户编号登录后完成一次询价。 ### 迁移是否成功 ```bash COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml" $COMPOSE exec next-app npx prisma migrate status ``` 应显示 **Database schema is up to date**。 --- ## 三、本次变更文件清单(供排查) | 类别 | 主要路径 | |------|----------| | 数据库 | `prisma/schema.prisma`,迁移 `202607031*` | | 查价审计 | `modules/quote/query-log.ts`,`app/api/admin/query-logs/` | | 预警展示 | `modules/alert/alert-presentation.ts`,`app/admin/alerts/` | | 查价记录页 | `app/admin/queues/page.tsx` | | 导航 | `components/layout/admin-layout.tsx`,`app/dashboard/page.tsx` | | 客户管理 | `app/admin/customers/`,`modules/customer/` | | 全链路挂钩 | `orchestrator.ts`,`job-handler.ts`,`fallback-orchestrator.ts`,`timeout-sweeper.ts` | --- ## 四、常见问题 | 现象 | 处理 | |------|------| | 构建报 `node:crypto` / `UnhandledSchemeError` | 已修复:middleware 改用 `service-token-env.ts`;请用**本包最新代码**重建 | | 查价记录为空 | 迁移后**新提交的询价**才会写入;旧数据无回溯 | | 预警详情仍像 JSON | 确认 next-app 已重建;有 `quote_id` 的预警会关联报价单补全 | | `prisma migrate` 失败 | 查 MySQL 权限;勿手动改表后与迁移冲突 | | 嵌入演示登录失败 | 确认客户编号存在于 DB 或 `CUSTOMER_REGISTRY`;密码默认 `123456` | | 嵌入演示查价 401 | 确认已登录;middleware 使用 `embed_demo_session` Cookie | | 构建 OOM | 服务器建议 4GB+ 内存;单独 build:`$COMPOSE build next-app` | --- ## 五、回滚 ```bash # 还原代码备份后 bash deploy/install-bt-host-mysql.sh ``` 数据库迁移**不建议**回滚;若必须,请在 DBA 协助下操作。