Files
ai-kefu-admin/docs/superpowers/plans/2026-10-13-phase3-admin-spa.md
T

103 lines
8.9 KiB
Markdown
Raw 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.
# Phase 3:admin 后台 SPA(art-design-pro)实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 用 art-design-pro(Vue3+TS+Vite+Element Plus,MIT)搭建统一后台 SPA(admin/),对接 Phase 2 全部 /api/platform/* API:登录/强制改密、仪表盘、会话与线索、租户管理(含站点/域名/创建向导)、配置中心(品牌预览/提示词/词表试金石/版本回滚)、统计分析、平台设置。
**Architecture:** SPA 独立目录 admin/(模板落地+品牌化),开发期 vite proxy 到 FastAPI 8018;生产构建产物由 FastAPI 在管理域名下服务(打包集成归 Phase 4,本阶段验收=pnpm build 通过 + dev 模式浏览器冒烟)。认证走 Authorization: Bearer(无 Cookie),401→登录页、409→强制改密页;菜单级权限(超管/租户)+ 后端强制隔离(已就绪)。
**Tech Stack:** Vue 3 / TypeScript / Vite / Pinia / Element Plus / ECharts(模板自带或按需补);后端 FastAPI(已就绪)。
**参照 spec:** §7.1-7.4(工程/认证/页面/编辑形态)、§7.6(统计);CLAUDE.md 取舍清单 #11(密钥掩码——**本阶段第一件事**)、#12(站点管理权限)。
**关键前置决策(写入实现):**
- **#11 密钥掩码**:GET config/settings 对密钥字段(push.api_key/ai.api_key/email.smtp.password/平台设置里的集团凭据)返回 `"__SET__"` 哨兵(曾设置)或 ""(未设置);PUT 收到 `"__SET__"` 时保留库中现值不改;前端密码框 placeholder 显示"已设置(输入新值覆盖)"。后端小改+测试,Task 1。
- **#12 站点管理权限**:**放开为 _tenant_guard**(spec §7.3 原文即"租户管理员=同左(限自己租户)";租户全开是既定原则,站点是租户自己的门面)。后端一行级改+测试,Task 1。
- 试金石参数对齐(Phase 2 终审 M-1:allow_number/confirmed_channels 未传):**挂账不动**(编辑器场景无 CC 上下文,docstring 已声明),Phase 4 真机验收时复核。
---
### Task 1: 前置后端——密钥掩码哨兵 + 站点管理权限放开
**Files:**
- Modify: `app/platform/routes/config_routes.py`(GET 掩码/PUT 哨兵保留)、`app/platform/routes/tenant_routes.py`(sites/domains 端点 _tenant_guard)、`tests/test_config_api.py`、`tests/test_tenant_admin_api.py`
- [ ] 失败测试:①GET config 的 push.api_key 已设 → `"__SET__"`、未设 → `""`;②PUT 传 `"__SET__"` → 库值不变(版本照常+1)、传新值 → 覆盖;③平台设置同款;④租户管理员 PATCH 自己租户的站点 → 200(原 403)
- [ ] 实现:掩码助手(字段清单常量:push.api_key/ai.api_key/email.smtp.password + 平台设置递归对 key 含 key/password/secret 的值);PUT 侧哨兵替换逻辑(读当前快照还原原值再写版本);sites/domains 五端点 require_super → _tenant_guard(创建租户 POST /tenants 保持仅超管)
- [ ] 全量回归 + 提交 `feat: 密钥掩码哨兵(__SET__) + 站点管理权限放开租户管理员`
### Task 2: 脚手架落地与品牌化
**Files:**
- Create: `admin/`(模板落地)
- [ ] 环境检查:node ≥18、pnpm(缺则 npm i -g pnpm——开发机工具,报告说明)
- [ ] 取模板:git clone https://github.com/Daymychen/art-design-pro admin-tmp → 拷入 admin/(去 .git;**只保留 src/配置/依赖清单,删 demo 页/示例数据**——模板结构以实际为准,报告瘦身清单)
- [ ] 品牌化:应用名"all-kefu 管理后台"、logo 占位、中文、去掉模板统计/示例路由;.env.development 配 vite proxy(/api、/static → http://127.0.0.1:8018)
- [ ] 路由骨架:login / force-change-password / dashboard / tenants / conversations / config / stats / settings 八个空白页占位 + 菜单(超管全量;租户管理员隐藏 tenants/settings——前端菜单控制,后端已强制)
- [ ] 验收:pnpm install + pnpm dev 可起 + 浏览器打开见到骨架;pnpm build 通过
- [ ] 提交 `feat: art-design-pro 脚手架落地与品牌化`
### Task 3: API 层与认证流
**Files:**
- Create: `admin/src/api/`(client + 各域模块)、`admin/src/stores/auth.ts`、登录页与强制改密页实装、路由守卫
- Test: `admin/src/api/__tests__/`(vitest——若模板无 vitest 则配置之)
- [ ] 失败测试(vitest):client 的 401→跳登录、409→跳改密、token 注入 header;掩码哨兵在表单层的"已设置"语义转换
- [ ] 实现:fetch/axios 封装(统一错误 ElMessage);auth store(login/logout/changePassword/角色与租户信息持久化 localStorage);路由守卫(无 token→login;must_change→强制改密页);登录页/改密页对接真实 API(后端 8018 起 db 源+bootstrap 后实测)
- [ ] 浏览器冒烟:默认超管首登 → 强制改密 → 进入仪表盘骨架;坏密码限流提示
- [ ] 提交 `feat: API层与认证流(401/409路由守卫/强制改密/角色菜单)`
### Task 4: 仪表盘
- [ ] 超管:租户卡片墙(每租户今日会话/线索/推送成功率——GET stats?tenant= 逐个)+ 平台总览卡(合并视图);租户管理员:自己的指标卡
- [ ] 时间范围快捷切换(今天/7天/30天)
- [ ] 浏览器冒烟 + 提交 `feat: 仪表盘(租户卡片墙/平台总览/时间切换)`
### Task 5: 会话与线索
- [ ] 列表:分页/筛选(意向/站点/日期)/租户切换器(超管);行→详情
- [ ] 详情抽屉:画像 chips/消息流/评估;推送日志页签(状态筛选)
- [ ] 删除会话(确认框)
- [ ] 冒烟 + 提交 `feat: 会话与线索(列表/筛选/详情/推送日志/删除)`
### Task 6: 租户管理与站点管理
- [ ] 列表(状态/域名数/版本/管理员)+ 创建向导分步表单(名称→slug→域名→选档案 auto/jiancai/blank→管理员账号;提示 blank 的墙/提示词取建材出厂)
- [ ] 租户详情:停用/复启用(确认框+后果提示)、改名
- [ ] 站点管理:站点列表/新建(slug/名称/门面覆盖层表单——覆盖字段留空=继承提示)/停用;域名绑定/解绑(撞车错误展示归属)
- [ ] 冒烟 + 提交 `feat: 租户管理与站点管理(创建向导/停用/域名/门面覆盖)`
### Task 7: 配置中心
- [ ] 品牌表单:字段编辑 + **挂件实时预览**(iframe 嵌 widget-test 风格或本地渲染组件——选 iframe 简单)+ **嵌入代码复制块**(script 标签带租户域名)+ 头像上传
- [ ] 提示词四件套:markdown textarea(等宽字体)+ `$DEFLECTION_POOL` 注入变量提示 + 大小上限提示 + 保存备注必填
- [ ] 词表:结构化表格(价格正则/话术池/触发词/替换句——按 wall.json 结构分组编辑)+ **试金石面板**(句子列表→逐句判定展示)+ 保存前自动跑试金石提示
- [ ] 邮件/推送/AI 凭据表单:掩码哨兵交互("已设置,输入覆盖");SMTP 测试按钮(发测试邮件——**后端无此端点,前端先做连通性校验占位或加后端小端点**——选加后端 POST .../email/test,一并实现+测试);推送前缀唯一错误展示
- [ ] 版本历史抽屉:列表/回滚(确认框);重置出厂按钮(组级,确认框)
- [ ] 冒烟 + 提交 `feat: 配置中心(品牌预览/嵌入代码/提示词/词表试金石/凭据掩码/版本回滚/邮件测试)`
### Task 8: 统计分析
- [ ] 卡片行(会话/线索/高意向/推送成功率)+ 漏斗图 + 趋势折线(按日)+ 分布(意向饼图/来源/站点/国家 Top10 条形)+ 推送健康表格;时间范围+租户筛选
- [ ] ECharts 按需引入(模板自带则复用)
- [ ] 冒烟 + 提交 `feat: 统计分析(卡片/漏斗/趋势/分布/推送健康)`
### Task 9: 平台设置与 Phase 3 收尾
- [ ] 平台设置页(集团 AI 凭据/默认 SMTP——掩码交互;仅超管)
- [ ] pnpm build 产物检查(dist 生成、无报错);dev 全页面浏览器冒烟清单逐项过(报告勾选表)
- [ ] CLAUDE.md 更新(Phase 3 完成状态/本地起法【后端 8018+前端 pnpm dev】/Phase 4 清理单刷新——含取舍 #11/#12 已闭、试金石参数对齐复核提醒)
- [ ] 提交 `chore: Phase 3 收尾——admin SPA 完成`
---
## 显式不做(Phase 3 范围外)
Docker 两阶段构建与 FastAPI 服务 dist(Phase 4);真实浏览器 E2E 自动化(人工冒烟清单即可——后端 571 测试守 API 行为);提示词沙箱试聊(二期);多语言(中文单语)。
## 执行注意
后端改动(Task 1/7 的邮件测试端点)走既有 FastAPI 测试纪律;前端任务的验收=build 通过+dev 冒烟+关键交互说明;审查模式沿用轻量双审。pnpm/node 是开发机新工具链依赖(部署服务器零依赖——两阶段构建归 Phase 4)。