Files

412 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MiragenFlow 管理台重构 Goal
> 本轮综合长任务入口:[`docs/miragenflow-long-task-goal-prompt.md`](docs/miragenflow-long-task-goal-prompt.md)。本文继续维护管理台 22 页、权限和业务闭环细节;前后台组件统一规则见该入口及 `docs/miragenflow-tdesign-unification-goal.md`。如本文与综合入口的渠道交互描述冲突,以综合入口的“OpenAI 单一供应方式 + 三个可自由切换 Tab”规则为准。
## 0. 目标状态
- **目标对象**:`/Users/qiu/Desktop/MiragenFlow`
- **目标名称**:管理台商业业务工作台重构
- **当前阶段**:目标文档与逐页 SSII 基线已完成;代码已完成 P0 壳层/权限、认证开关、独立系统设置、用户详情分 Tab、任务详情/审批驳回、渠道/分组/模型产品编辑抽屉、渠道健康批量探活、任务并发投递、跨实例任务 dispatch 回载、系统概览趋势/告警、业务维度筛选、PostgreSQL 任务租约心跳/过期恢复、消息 outbox 发送期续租与业务幂等键、WebDAV 完成事务与保留期行锁扫描、管理员 MFA 开关门禁。仍需浏览器逐页验收,以及完整 PostgreSQL 领域表 CAS、远端 WebDAV/消息竞态、管理台列表跨路由异步回写保护和真实 provider 的部署验证。未完成项不得按“已完成”发布。
- **依据**:`AGENTS.md`、`develop.md`、`system-diagrams.md`、`admin-plan.md`、`summary.md`
- **跨端组件目标**:用户端与管理端统一 TDesign 的长期执行基线见 `docs/miragenflow-tdesign-unification-goal.md`;本文继续只负责管理台业务目标,不把两端页面、路由、权限或状态合并。
- **禁止结果**:白屏、无恢复路径的 403、假按钮、首屏堆满配置字段、mock 冒充业务、未接入供应商伪装成已接入。
## 1. 最终目标
把当前平铺的 TDesign Starter 管理台重构为商业化 V1 管理工作台:
1. 管理员从 `/admin/login` 默认只使用邮箱和密码登录(本地默认 `admin@admin.com` / `admin`);MFA/CAPTCHA 仅在后台增强开关显式开启时追加,关闭时界面不得出现验证码、动态码或恢复码输入框。
2. 用户端认证提供密码登录(邮箱、手机号、用户名)和手机号验证码登录;注册提供邮箱、手机号两条路径,注册邮箱验证与注册手机号验证由 `/admin/settings` 独立开关控制,开启后先完成验证码验证再设置并确认密码。
3. 登录后加载管理员角色、scope、MFA 状态和可见菜单;权限不足隐藏菜单,不能白屏。
4. 左侧使用一级分组 + 二级页面,URL 统一为 `/admin/...`。
5. 新增、编辑、启停、调价、审批、调账全部通过 Modal/Drawer 完成。
6. 用户、渠道、分组、模型产品、价格、套餐、余额、支付、任务、存储、审计形成真实业务闭环。
7. 供应商消息暂不接入;消息供应商和模板页面隐藏,只保留认证消息 outbox 状态和详情。
8. 状态、能力、错误码、按钮全部中文;长文本和 capability 不能撑高表格。
9. 所有写操作提供成功、加载、空态、403、409、422、503、网络断开和重试反馈。
## 2. 必读文件
实施前依次读取以下绝对路径:
- `/Users/qiu/Desktop/MiragenFlow/AGENTS.md`
- `/Users/qiu/Desktop/MiragenFlow/develop.md`
- `/Users/qiu/Desktop/MiragenFlow/system-diagrams.md`
- `/Users/qiu/Desktop/MiragenFlow/admin-plan.md`
- `/Users/qiu/Desktop/MiragenFlow/summary.md`
- `/Users/qiu/Desktop/MiragenFlow/admin/src/router/index.ts`
- `/Users/qiu/Desktop/MiragenFlow/admin/src/layouts/components/Menu.tsx`
- `/Users/qiu/Desktop/MiragenFlow/admin/src/layouts/components/AppRouter.tsx`
- `/Users/qiu/Desktop/MiragenFlow/admin/src/components/ErrorPage/index.tsx`
- `/Users/qiu/Desktop/MiragenFlow/admin/src/pages/Business/index.tsx`
- `/Users/qiu/Desktop/MiragenFlow/admin/src/services/platform.ts`
- `/Users/qiu/Desktop/MiragenFlow/server/src/app/http.ts`
- `/Users/qiu/Desktop/MiragenFlow/server/src/shared/auth.ts`
- `/Users/qiu/Desktop/MiragenFlow/packages/contracts/src/index.ts`
- 根目录、`admin/`、`web/`、`server/` 的 `package.json`
- `/Users/qiu/Desktop/MiragenFlow/scripts/dev-all.mjs`
- `/Users/qiu/Desktop/MiragenFlow/scripts/build-all.mjs`
页面/API变更必须同步 `admin-plan.md`、`system-diagrams.md`、`summary.md`、`CHANGELOG.md`、`docs/content/docs/progress/todo.mdx` 和 `docs/content/docs/progress/pending-test.mdx`。
## 3. 产品边界
### 必须进入 V1
管理员登录/RBAC/审计、菜单分组、系统概览、用户管理、认证消息、管理员安全、渠道、渠道健康、渠道组、模型产品、价格、金币单位、换算、套餐、余额账本、充值订单、支付事件、支付适配器、审批、任务中心、WS 指标、存储策略、系统设置、审计日志。
### 不进入可见菜单
消息供应商、消息模板、视频、动画、真实 3D、团队、云端项目 CRUD、内容治理、Local Agent、Codex、MCP、Skill、远程 Prompt、插件市场。支付只保留人工充值、mock 和 adapter 接口,等待第三方支付文档。
前台、公开 API、日志和导出不得暴露 provider 名称、Base URL、API Key、内部 provider model ID、渠道顺序、Cookie、WebDAV 密文或完整敏感提示词。
## 4. 菜单信息架构
```text
元境幻生管理台
├─ 总览
│ └─ 系统概览 /admin/dashboard/base
├─ 用户与认证
│ ├─ 用户管理 /admin/users
│ ├─ 认证消息 /admin/auth-messages
│ └─ 管理员安全 /admin/security/mfa
├─ 渠道与模型
│ ├─ 渠道管理 /admin/channels
│ ├─ 渠道健康 /admin/channel-health
│ ├─ 渠道分组 /admin/channel-groups
│ ├─ 模型产品 /admin/model-products
│ └─ 价格规则 /admin/pricing
├─ 计费与套餐
│ ├─ 金币单位与换算 /admin/billing/units
│ ├─ 余额与账本 /admin/billing
│ ├─ 套餐管理 /admin/plans
│ ├─ 充值订单 /admin/recharges
│ ├─ 支付事件 /admin/payments
│ ├─ 支付适配器 /admin/payment-providers
│ └─ 审批中心 /admin/approvals
├─ 任务与运行
│ ├─ 任务中心 /admin/tasks
│ └─ 实时指标 /admin/ws-metrics
├─ 存储与系统
│ ├─ 存储策略 /admin/storage
│ └─ 系统设置 /admin/settings
└─ 审计
├─ 日志大板 /admin/audit
└─ 详细日志 /admin/audit-logs
```
菜单规则:一级节点可展开/收起;收起时侧栏完全隐藏,不保留窄图标栏;刷新 URL 自动展开;无 scope 的二级项不渲染;`admin:read` 只读,写操作需 `admin:write` 或 `admin:finance`;登录、403、404 不入业务菜单。
## 5. 统一布局与交互
```text
+--------------------------------------------------------------------------------+
| 元境幻生 | 一级菜单/二级菜单 | 面包屑 | 刷新 | 帮助 | 管理员菜单 |
+--------------------------------------------------------------------------------+
| 页面标题+描述 [搜索] [筛选] [批量操作] [新增/配置] |
+--------------------------------------------------------------------------------+
| KPI/统计卡/当前版本/告警 |
+--------------------------------------------------------------------------------+
| 固定列宽表格:选择 | 关键字段 | 中文状态 | 更新时间 | 操作 |
+--------------------------------------------------------------------------------+
| 右侧 Drawer/Modal:字段分组 | 校验 | 风险提示 | 取消 | 保存/提交 |
+--------------------------------------------------------------------------------+
```
全页面必须有加载骨架、空态、网络错误重试、403权限卡、提交中禁用、成功 Toast、422 字段错误、409 版本冲突、503 保留表单重试;支持 Tab/Enter/Escape 和焦点回收。窄屏页面整体不得产生无意义的横向溢出,但业务表格允许在局部容器内横向滚动,以保留列表语义和列可读性。长文本用摘要/Tooltip/详情抽屉,不能撑高表格。
## 6. 页面目标、布局和验收
### 6.1 登录/错误
- `/admin/login`:居中邮箱密码卡片;开关开启时追加 CAPTCHA/MFA;成功进入 `/admin/dashboard/base`;失败保留输入并显示错误。
- `/admin/403`、`/admin/404`:错误码、角色、所需 scope、`返回系统概览`、`重新登录`、`切换管理员`;按钮必须可用,禁止静态白板。
### 6.2 系统概览 `/admin/dashboard/base`
顶部时间范围/刷新;KPI 展示用户、活跃用户、任务、金币消耗、充值金额、队列深度、WS 在线;图表展示任务成功/失败率、P50/P95、模型可用率、渠道错误率、邮件/SMS 成功率和支付回调异常;卡片可带筛选跳转,单卡片可重试。
### 6.3 用户管理 `/admin/users`
搜索、状态/等级/验证/创建时间筛选;表格展示脱敏身份、验证状态、MFA、套餐、并发、每日额度、余额、最近登录;`新增用户` 打开 Drawer,填写用户名、邮箱、手机号和初始密码;详情包含账户/会话/任务/账本/权益/审计 Tab;支持冻结、解冻、重置密码、重发认证和调账申请。新增成功只显示一次初始密码,冻结后计费任务必须拒绝。
### 6.4 认证消息 `/admin/auth-messages`
状态/通道/用途/时间筛选;表格展示目标脱敏、用途、通道、状态、重试次数、错误摘要、时间;详情 Drawer 展示状态时间线和完整多行内容;重试需确认;内容使用 `white-space: pre-wrap`;供应商配置不在此页面实现。
### 6.5 管理员安全 `/admin/security/mfa`
状态卡、全局策略、启用/验证/关闭操作和恢复码 Drawer;关闭需要当前 TOTP/原因;开关关闭时登录只需邮箱密码,开启时追加 MFA;恢复码只显示一次,全部操作写审计。
### 6.6 渠道管理 `/admin/channels`
列表首屏仅展示搜索/筛选/`新增渠道`按钮和固定列;列使用中文业务字段(名称、供应方式、环境、区域、能力、状态、健康、优先级、并发/限流、成本、维护窗口、版本),不直接展示密钥、Base URL 或供应商内部模型 ID。新增和编辑共用同一风格的 Drawer,内部只有三个可自由切换的 Tab:`基础信息`、`模型列表`、`模型映射`;不使用上一步/下一步,也不提供没有真实逻辑的“通用”供应商模板。支持编辑、启停、凭证轮换、手动探活和 If-Match;密钥不回显。
基础信息填写名称、完整请求地址(示例 `https://example.com` 或 `https://example.com/v1`)和 API Key;API Key 只校验去除首尾空白后非空。模型列表仅在管理员主动点击按钮后请求 `{基础地址}/v1/models`,结果由管理员勾选加入渠道模型列表;模型映射是可选的,分别保存平台显示模型 ID 与供应商请求模型 ID,不能自动把拉取结果变成映射。切换 Tab、编辑回填、保存失败和关闭重开都必须保留或恢复正确草稿。
### 6.7 渠道健康 `/admin/channel-health`
状态/分组/时间筛选、健康统计卡和固定表格;列为渠道、中文状态、延迟、成功率、连续失败、熔断剩余、探活时间、维护窗口;映射 `healthy=健康`、`degraded=降级`、`open=熔断`、`disabled=已停用`;支持单项/批量探活和错误时间线。
### 6.8 渠道分组 `/admin/channel-groups`
分组列表和 `新增分组`;详情 Drawer 包含用途/档位、启停、可用渠道池、拖拽顺序、重试预算、超时、并发、熔断、退避、half-open、公共失败文案、替代模型、发布和回滚。保存前校验渠道存在、启用、顺序唯一;模拟首渠道失败必须展示 fallback 顺序。
### 6.9 模型产品 `/admin/model-products`
列表和 `新增产品`;Drawer 配置公开 ID、名称、档位、默认质量、能力、分辨率、最大数量、参考图数量、mask、渠道组、价格、替代模型、生效时间、状态和版本。能力用中文标签,超出显示 `+N` 和详情 Drawer;启用产品必须绑定启用渠道组;公开 API 只显示公开 ID。
### 6.10 价格规则 `/admin/pricing`
产品/分辨率/档位筛选;价格版本表;`新增规则`/`调整价格`弹窗包含基础价、数量阶梯、分辨率倍率、金币单位、生效时间、原因;提交携带 If-Match;旧版本返回 409,展示当前版本并允许重载;成功刷新且保留筛选。
### 6.11 金币单位与换算 `/admin/billing/units`
单位卡展示图标、名称、短码、精度、比例、版本;换算规则表支持新增/编辑/停用/生效期;账本使用最小整数金币,比例变更有审计和版本。
### 6.12 套餐 `/admin/plans`
卡片/表格切换;新增和编辑 Drawer 配置公开编码、名称、图标、介绍、排序、时长、包含金币、购买金额、并发、队列优先级、保留期、最大延长、允许模型/渠道组、上架、归档、版本;上下架即时影响公开目录,支持回滚。
### 6.13 余额 `/admin/billing`
余额统计、用户/流水类型筛选、账本表和调账申请;展示 available/reserved、reserve/settle/release/refund,支持按用户/任务/订单追踪;调账必须申请→审批→执行,`available + reserved` 不变量成立。
### 6.14 充值/支付 `/admin/recharges`、`/admin/payments`
充值表展示订单、用户、金额、金币、渠道、状态、创建/回调时间;支付表展示 eventId、订单、签名、金额/币种、状态、重放结果和异常;重复 webhook 必须幂等,状态和账本同事务。
### 6.15 支付适配器 `/admin/payment-providers`
列表展示名称、mock/adapter 模式、状态、密钥状态、版本;Drawer 支持新增 mock、启停、测试 webhook、服务端加密签名密钥;第三方支付等待文档,不伪造 provider。
### 6.16 审批 `/admin/approvals`
待审批/已执行/已驳回/已过期 Tab;详情显示申请人、审批人、原因、金额/对象、审计;人工充值、退款、调账和高风险配置要求申请人/审批人分离,过期自动标记,策略开启时要求审批 MFA。
### 6.17 任务 `/admin/tasks`
状态/类型/模型/用户/时间筛选;列表展示 taskId、用户、类型、公开模型、状态、预扣/实扣、attempt、更新时间;详情 Drawer 展示输入快照、状态时间线、attempt、输出、账本、错误、脱敏 provider request ID;支持取消、重试、unknown 对账。
### 6.18 实时指标 `/admin/ws-metrics`
展示在线连接、订阅、事件吞吐、心跳、断线、轮询降级、事件积压;支持时间窗口、自动刷新暂停、断线恢复和实例/任务筛选;重连 cursor 不重复。
### 6.19 存储/系统 `/admin/storage`、`/admin/settings`
存储策略配置 staging TTL、结果/原图保留、WebDAV manifest 保留、最大延长、归档模式、GC、扫描/quarantine、对象存储 adapter;系统设置必须是独立资源(不能复用 `storage-policies`),配置用户验证/MFA/CAPTCHA、管理员 MFA/CAPTCHA、限流、队列和审计保留;默认关闭所有认证增强,开关即时影响认证并写入版本/审计,状态可追踪,对象存储默认关闭。
### 6.20 审计 `/admin/audit`、`/admin/audit-logs`
`/admin/audit` 展示分类、HTTP 结果和时间趋势,`/admin/audit-logs` 展示具体操作人、动作、对象和请求来源;两者均可打开详情 Drawer,展示脱敏 before/after、IP、requestId、correlationId、hash 链和摘要导出。绝不展示密钥、密码、Cookie、完整提示词、原图或 WebDAV 凭证。
## 6.21 逐页 SSII 索引
详细 ASCII/SSII 线框统一维护在 `/Users/qiu/Desktop/MiragenFlow/admin-plan.md` 第 4-5 节;每页验收按以下结构执行:顶部标题与筛选、统计/告警区、固定列宽列表、详情 Drawer/Modal、加载/空/错误/冲突状态。
| 页面 | 主布局 | 关键交互 |
|---|---|---|
| 系统概览 | KPI 卡 + 趋势 + 告警 | 时间范围、单卡跳转、局部重试 |
| 用户管理 | 筛选栏 + 用户表 + 详情 Drawer | 新增、冻结、重置、重发、强退、调账 |
| 认证消息 | 状态筛选 + outbox 表 + 消息 Drawer | 多行详情、失败重试 |
| 管理员安全 | 策略卡 + MFA 操作 Drawer | setup/verify/disable、恢复码一次性展示 |
| 渠道管理 | 渠道表 + 三 Tab 新增/编辑 Drawer | 地址校验、手动拉取模型、勾选加入、可选映射、启停、轮换密钥 |
| 渠道健康 | 健康 KPI + 渠道表 | 中文状态、单项/全部探活、日志 |
| 渠道分组 | 分组表 + 拖拽排序 Drawer | 成员校验、fallback 预览、版本保存 |
| 模型产品 | 产品表 + 产品 Drawer | 能力折叠、分辨率、渠道绑定、上下架 |
| 价格规则 | 版本表 + 价格 Modal | 新增/调价、If-Match 冲突重载 |
| 金币单位/换算 | 单位卡 + 规则表 | 比例、精度、舍入和生效期 |
| 套餐管理 | 卡片/表格 + 套餐 Drawer | 权益、发布/回滚、归档 |
| 余额与账本 | 余额 KPI + 流水表 | 调账申请、审批链、reserve/settle/release 追踪 |
| 充值订单/支付事件 | 订单表 + 事件详情 | 失败标记、退款申请、webhook 幂等 |
| 支付适配器 | 适配器表 + 配置 Drawer | mock/adapter、启停、密钥状态 |
| 审批中心 | 状态 Tab + 审批详情 | 申请人/审批人分离、条件 MFA、过期处理 |
| 任务中心 | 任务表 + 任务 Drawer | attempt、取消、重试、unknown 对账 |
| 实时指标 | 指标卡 + 时间序列 | WS 心跳、断线恢复、cursor 去重 |
| 存储策略/系统设置 | 策略表 + 设置 Drawer | TTL、WebDAV、归档、增强开关 |
| 审计日志 | 筛选表 + 审计 Drawer | 脱敏 before/after、hash 链和导出摘要 |
## 6.22 22 个页面的逐页 SSII 骨架
以下矩阵是开发与浏览器验收的逐页“图片蓝本”。每行对应一张页面线框:`头部` 固定标题/面包屑/刷新,`筛选` 固定在标题下方,`主体` 使用固定列宽表格或指标卡,`侧栏` 使用 Drawer/Modal;加载、空、403、409、422、503 都在同一位置替换主体,不改变页面骨架。
| # | 页面 | 头部与筛选 | 主体与详情 | 强交互验收 |
|---:|---|---|---|---|
| 1 | `/admin/dashboard/base` | 时间范围、刷新、告警过滤 | KPI 卡、趋势图、异常列表 | 卡片跳转、单卡重试、断线恢复 |
| 2 | `/admin/users` | 搜索、状态、等级、验证、时间 | 用户表、账户 Drawer、六个详情 Tab | 新增、冻结、重置、重发、强退、调账 |
| 3 | `/admin/auth-messages` | 状态、通道、用途、时间 | outbox 表、消息详情 Drawer | 多行内容、失败重试、目标脱敏 |
| 4 | `/admin/security/mfa` | 管理员 MFA 状态/策略 | 策略卡、setup/verify/disable Drawer | 开关门禁、恢复码一次性展示 |
| 5 | `/admin/channels` | 供应方式、环境、区域、状态 | 渠道表、三 Tab 新增/编辑 Drawer | 地址校验、手动 `/v1/models`、勾选模型、可选映射、启停、轮换密钥 |
| 6 | `/admin/channel-health` | 健康、分组、时间 | 健康 KPI、渠道表、错误时间线 | 单项/批量探活、中文状态、重试 |
| 7 | `/admin/channel-groups` | 用途、档位、状态 | 分组表、成员排序/fallback Drawer | 拖拽排序、成员启用校验、模拟故障 |
| 8 | `/admin/model-products` | 档位、能力、渠道组、状态 | 产品表、产品配置 Drawer | 能力折叠、渠道绑定、发布/回滚 |
| 9 | `/admin/pricing` | 产品、分辨率、档位、版本 | 价格版本表、调价 Modal | If-Match 409 展示当前版本并重载 |
| 10 | `/admin/billing/units` | 单位、状态、版本 | 金币单位卡与换算规则表、编辑 Drawer | 比例/舍入/精度校验、版本审计 |
| 11 | `/admin/billing` | 用户、流水类型、时间 | 余额 KPI、账本表、调账 Drawer | reserve/settle/release/refund 追踪 |
| 12 | `/admin/plans` | 上架、归档、版本 | 套餐卡/表、套餐 Drawer | 权益配置、发布、回滚、归档 |
| 13 | `/admin/recharges` | 用户、状态、时间 | 充值订单表、订单 Drawer | 失败标记、退款申请、幂等重放 |
| 14 | `/admin/payments` | provider、状态、时间 | 支付事件表、事件 Drawer | 签名/金额/币种校验、异常重试 |
| 15 | `/admin/payment-providers` | 模式、状态、版本 | 适配器表、配置 Drawer | mock 测试 webhook、密钥只显示状态 |
| 16 | `/admin/approvals` | 待处理/已执行/已驳回/已过期 Tab | 审批表、申请详情 Drawer | 申请人/审批人分离、条件 MFA、驳回 |
| 17 | `/admin/tasks` | 状态、类型、模型、用户、时间 | 任务表、任务详情/attempt Drawer | 取消、重试、unknown 对账、脱敏 |
| 18 | `/admin/ws-metrics` | 时间窗、实例、任务 | WS KPI、吞吐/心跳/积压趋势 | 暂停刷新、断线恢复、cursor 去重 |
| 19 | `/admin/storage` | adapter、保留期、GC 状态 | 存储策略表、配置 Drawer | TTL、归档、扫描/quarantine、GC |
| 20 | `/admin/settings` | 安全增强、限流、队列、审计 | 系统设置表、版本化编辑 Drawer | 默认关闭、即时生效、If-Match |
| 21 | `/admin/audit` | 操作者、动作、对象、结果、时间 | 日志大板、分类占比和趋势 | 200/4xx/5xx 统计、中文分类、局部重试 |
| 22 | `/admin/audit-logs` | 操作者、动作、对象、结果、时间 | 详细日志表、脱敏详情 Drawer | 中文行为、requestId、hash 链、详情重试 |
## 7. 服务端契约工作项
### 权限和总览
- 统一 `super_admin/operator/finance/support/auditor` 到 scopes;未知角色不能得到空权限。
- `/api/v1/admin/dashboard`、`me`、菜单权限和前端 scope 一致。
- 403/404 返回稳定错误码和 requestId,前端必须有可恢复页面。
### 用户
- 增加管理员创建用户 API,校验身份唯一、初始密码、状态、套餐和限制字段;密码只显示一次并只存哈希。
- 冻结、解冻、重置、重发认证、强退和调账申请审计;详情数据脱敏并按对象权限返回。
### 渠道和模型
- 渠道新增校验 HTTPS、DNS/私网、协议、密钥、超时、并发和限流;密钥服务端密文保存。
- 渠道组校验成员存在、启用、排序唯一;模型产品校验渠道组存在且可用;价格支持 If-Match 和幂等。
- 公共 DTO 不得包含 provider model ID、Base URL、Key 或渠道顺序。
### 计费、任务、存储、审计
- 余额、账本、支付订单、支付事件和审批保持一致事务;任务取消/重试/unknown 不重复扣款。
- WS 指标、attempt、队列租约、WebDAV/GC/归档状态可查询。
- 审计 before/after 递归脱敏,日志和导出不包含真实密钥或完整敏感内容。
## 8. 实施阶段
### P0 壳层与权限
嵌套路由、一级/二级菜单、权限加载、403/404恢复、角色映射、真实总览指标和错误态。
### P1 核心配置闭环
用户新增;渠道新增/探活/启停;健康中文化;渠道组排序/fallback;模型产品能力/分辨率/绑定;价格调整/版本冲突。
### P2 商业和运维
金币、换算、套餐、余额、充值、支付、支付适配器、审批、任务、WS 指标、存储、设置、审计、认证消息多行详情。
### P3 统一体验
加载/空/错/403/409/503、固定列宽、能力折叠、中文状态、响应式 Drawer、键盘无障碍、敏感扫描、同源回归。
## 9. 验收标准
### 静态和构建
```bash
npm --prefix server run typecheck
npm --prefix server test
npm --prefix web run typecheck
npm --prefix web run build
npm --prefix admin run typecheck
npm --prefix admin run build
npm --prefix admin run lint
npm run build:all
git diff --check
```
### 路由和菜单
- `/admin/` 自动进入 `/admin/dashboard/base`。
- 22 个可见二级页面均能进入;刷新后一级展开、二级高亮、面包屑正确。
- 无权限角色不显示对应菜单;403/404 有返回总览和重新登录按钮。
- 消息供应商/模板不出现在菜单。
### 业务闭环
1. 创建用户→列表→详情→冻结;冻结后计费任务拒绝。
2. 新增渠道→探活→分组拖拽→模型绑定→调价。
3. 首渠道失败→fallback→任务 attempt 时间线。
4. 旧 If-Match 调价→409→重载→成功。
5. 重放 webhook→订单/余额/账本不重复增加。
6. 调账→审批→执行→完整审计。
7. 取消/失败/unknown→释放或按实际结算,不重复扣款。
8. WebDAV 保留/归档/删除→队列/GC 状态可见。
### 视觉和交互
- 首屏不铺满配置字段,新增/编辑只能通过按钮打开弹窗/抽屉。
- 认证消息保留换行,capability 不撑高表格,状态均为中文。
- 所有操作在加载、失败、403、409、503 有明确反馈。
- Tab/Enter/Escape 和焦点回收可用;宽屏、窄窗口和缩放下页面整体不产生无意义的横向溢出,业务表格在局部容器内允许横向滚动以保留列可读性。
- 路由、筛选或分页切换期间,旧列表请求不会回写当前页面的行数据、加载态或错误态;必须有延迟请求回归证据。
### 安全扫描
```bash
git ls-files | rg '(^|/)(\.env|.*\.(pem|key))$|(^|/)(uploads?|staging|snapshots?)(/|$)'
rg -n -i 'api[_ -]?key|authorization:|bearer |providerModelId|baseUrl|BEGIN (RSA|EC|OPENSSH) PRIVATE KEY' \
web/dist admin/dist server/src web/src admin/src --glob '!*.map'
```
## 10. 交付物
- 嵌套路由、一级/二级菜单和权限安全壳层。
- 22 个可见页面的真实布局、弹窗/抽屉、错误态和业务闭环。
- 用户、渠道、分组、模型、价格、计费、任务、存储、审计 API 对齐。
- 更新 `admin-plan.md`、`system-diagrams.md`、`summary.md`、`CHANGELOG.md`、`todo.mdx`、`pending-test.mdx`。
- 完整构建、测试、同源启动和浏览器验收记录;未完成内容继续记录在 TODO/Pending Test。
## 10.1 进度反馈格式
每完成一个可独立验收的小任务,立即用以下格式反馈,不把未验证内容计入完成度:
```text
已完成:{小任务名称}
验收证据:{命令、页面、API 或截图路径}
当前进度:██████▎░░░ {整数}%
剩余阻塞:{没有则写“无”;有则列出具体文件/接口}
```
百分比按“已通过验收的交付项 / 全部交付项”计算;文档规划、代码实现、自动化测试、同源运行和浏览器人工验收分别计项,不能用文档完成替代功能完成。
## 11. 目标引导提示词
```text
你现在负责完成 /Users/qiu/Desktop/MiragenFlow 的管理台重构 Goal。
先完整读取:AGENTS.md、develop.md、system-diagrams.md、admin-plan.md、goal.md、summary.md;
再读取 admin/src/router/index.ts、Menu.tsx、AppRouter.tsx、ErrorPage、Business/index.tsx、
admin/src/services/platform.ts、server/src/app/http.ts、server/src/shared/auth.ts、
packages/contracts/src/index.ts,以及各 package.json、scripts/dev-all.mjs、scripts/build-all.mjs。
必须实现:
1. 路由统一为 /admin/...,实现 7 个一级菜单和 22 个二级页面;逐页同步 `admin-plan.md` 的 ASCII SSII 与 `system-diagrams.md` 的 Mermaid;权限不足隐藏菜单并显示可恢复 403 页面。
2. 管理员默认只显示邮箱/账号和密码输入;MFA、验证码、恢复码均由后台增强开关控制,关闭时不得渲染输入框。完成真实系统概览(含 P50/P95、渠道/模型/消息/支付异常指标)、用户新增/详情分 Tab/冻结/重置密码/重发认证、认证消息多行详情和管理员安全。
3. 完成渠道新增弹窗、编辑/探活/启停、中文健康状态、分组拖拽排序与 fallback。
4. 完成模型产品能力/分辨率/渠道组绑定、发布/回滚和价格 If-Match 冲突处理。
5. 完成金币、换算、套餐、余额、充值失败/退款申请、支付事件、支付适配器和审批中心;管理员 MFA 增强开关关闭时审批不追加动态码,开启时才校验。
6. 完成任务 attempt/unknown/取消/重试、WS 指标、独立 `/api/v1/admin/settings` 系统设置 API/持久化/If-Match、存储策略和审计;系统设置不能复用 `storage-policies`。
7. 消息供应商和模板本期隐藏,不接入第三方 provider,不伪造可用配置。
8. 所有新增/编辑/启停/调价/审批/调账均用弹窗或 Drawer;固定列宽,中文状态,长文本和 capability 不撑表格。
9. 不向前台、公开 API、日志或导出暴露 provider 名称、Base URL、API Key、内部模型 ID、渠道顺序。
按 P0 壳层权限 → P1 渠道/分组/模型/价格 → P2 用户/计费/任务/存储/审计 → P3 视觉回归实施。
不要做视频、动画、真实 3D、团队、内容治理、Local Agent、远程 Prompt 或插件市场。
不要回滚已有改动,不要用 mock 冒充业务,不要把配置字段永久铺在首屏。
每个阶段执行并记录:
npm --prefix server run typecheck
npm --prefix server test
npm --prefix web run typecheck && npm --prefix web run build
npm --prefix admin run typecheck && npm --prefix admin run build && npm --prefix admin run lint
npm run build:all
git diff --check
最终启动 npm run dev:all,用同一 origin 验证 /、/admin/、/api/health、/api/ready;
逐页验证 22 个页面、权限角色、弹窗/抽屉、ASCII SSII 对应布局、加载/空/错误/403/409/503、中文排版、
渠道→分组→模型→价格、用户新增、任务、余额、审批、WebDAV 和审计;执行敏感扫描,
同步更新 admin-plan.md、system-diagrams.md、summary.md、CHANGELOG.md、todo.mdx、pending-test.mdx。
未完成内容必须明确记录,不能宣布全部完成。
```