- 新建 .planning/phases/03-dialog-feedback/03-02-SUMMARY.md(Plan 03-02 收尾归档)
- 更新 STATE.md:Phase 3 进度 1/3 → 2/3(67%),milestone 进度 71% → 86%(6/7 plan)
- 更新 ROADMAP.md:Plan 03-02 标记完成(commits d719891 + 7872840)
- 更新 REQUIREMENTS.md:CRED-FE-04 + CRED-FE-05 切到 ✅ Done
- 业务功能完整闭环(CredentialSlotDialog 191 行 RHF+Zod+Sonner+handleApiError + page 接入);等待 Plan 03-03 收尾(修改记录追加 + plan 级双重验证)
158 lines
15 KiB
Markdown
158 lines
15 KiB
Markdown
---
|
||
gsd_state_version: 1.0
|
||
milestone: v1.0
|
||
milestone_name: 通用凭据槽位前端集成
|
||
status: in_progress
|
||
last_updated: "2026-05-08T04:32:34Z"
|
||
last_activity: 2026-05-08
|
||
progress:
|
||
total_phases: 3
|
||
completed_phases: 2
|
||
total_plans: 7
|
||
completed_plans: 6
|
||
percent: 86
|
||
---
|
||
|
||
# Project State — 洛天依应用管理后台(qy-lty-admin)
|
||
|
||
**最后更新**: 2026-05-08(Plan 03-02 落地 — 新建 components/ai-model/credential-slot-dialog.tsx 191 行 RHF+Zod+Sonner+handleApiError,commit d719891;改 app/ai-model/page.tsx 删占位 Dialog 接入新组件,commit 7872840;CRED-FE-04 + CRED-FE-05 完整闭环;Phase 3 进度 2/3,等待 Plan 03-03 收尾)
|
||
|
||
## 项目引用
|
||
|
||
参见:`.planning/PROJECT.md`(更新于 2026-05-07)
|
||
|
||
**核心价值**:运营者能基于真实角色权限,安全且无障碍地管理后端各业务模块——`lib/permissions.ts` 的客户端 RBAC + qy_lty 后端服务端校验必须**配套生效**才完整。
|
||
|
||
**当前重点**:Milestone v1.0 通用凭据槽位前端集成 — `/ai-model` 页面新增凭据录入对话框,调用 qy_lty 后端 v1.0 的 `/api/v1/admin/credential-slot/` GET+PUT
|
||
|
||
## 当前位置
|
||
|
||
```
|
||
Milestone: v1.0 通用凭据槽位前端集成
|
||
Phase: Phase 3「编辑对话框 + 提交反馈」🚧 进行中
|
||
Plan: 03-01 完成 ✅ / 03-02 完成 ✅ / 03-03 待启动
|
||
Status: Phase 3 in progress (2/3 plans done);待 Plan 03-03 启动
|
||
Progress: [██████▓░░░] 67%(Phase 3 内部 2/3 plan 完成;milestone 整体 86%)
|
||
Last activity: 2026-05-08
|
||
```
|
||
|
||
**下一步行动**:运行 Plan 03-03(在 `docs/修改记录.md` 顶部追加 Phase 3 条目,含 access_token 强制输入语义的权衡说明 + 候选下一周期 milestone「后端识别脱敏掩码保留旧值」+ 「跨项目联动」字段;plan 级整体双重验证)。CRED-FE-04 + CRED-FE-05 业务功能已完整闭环(commits d719891 + 7872840)。
|
||
|
||
## Phase 概览
|
||
|
||
| Phase | 标题 | 需求 | UI hint | 状态 |
|
||
|-------|------|------|---------|------|
|
||
| 1 | 凭据槽位 API 客户端 | CRED-FE-01 ✅ | — | ✅ 已交付(2/2 plan,2026-05-08)|
|
||
| 2 | RBAC 收敛 + AI 模型页入口 | CRED-FE-02 ✅, CRED-FE-03 ✅ | yes | ✅ 已交付(2/2 plan,2026-05-08)|
|
||
| 3 | 编辑对话框 + 提交反馈 | CRED-FE-04 ✅, CRED-FE-05 ✅(业务闭环 — 修改记录追加待 Plan 03-03 收尾)| yes | 🚧 进行中(2/3 plan,2026-05-08)|
|
||
|
||
## 联动 milestone
|
||
|
||
- **qy_lty 后端 v1.0「通用凭据槽位」**:3 个 phase(数据层 → 管理端读写 → 客户端读取+脱敏)
|
||
- 本仓库 Phase 1(API 客户端)**不阻塞**,可在后端联调前以 mock 推进
|
||
- 本仓库 Phase 3(端到端串联 success criteria #5)**强依赖** 后端 Phase 2「管理端读写接口」落地
|
||
- 节奏建议:本仓库 Phase 1-2 与后端 Phase 1-2 并行;本仓库 Phase 3 收尾节奏与后端 Phase 2 完工对齐
|
||
|
||
## 性能指标
|
||
|
||
| 指标 | 数值 |
|
||
|------|------|
|
||
| 已完成 phase | 2 / 3 |
|
||
| 已完成 plan | 6 / 7(Phase 1 全部交付 + Phase 2 全部交付 + Phase 3 进行中 2/3)|
|
||
| Milestone 进度 | ~86%(2/3 phase 完成 + Phase 3 内部 67%)|
|
||
| 启动日期 | 2026-05-07 |
|
||
| 最近活动 | 2026-05-08 Plan 03-02 落地(commits d719891 + 7872840,新组件 191 行 + page.tsx 接入)|
|
||
|
||
### Plan 执行记录
|
||
|
||
| Phase-Plan | 任务数 | 文件改动 | 耗时 | 完成日期 |
|
||
|------------|-------|---------|------|----------|
|
||
| 01-01 | 2 | 2 | ~76s | 2026-05-08 |
|
||
| 01-02 | 2 | 1 | ~360s | 2026-05-08 |
|
||
| 02-01 | 2 | 2 | ~6min | 2026-05-08 |
|
||
| 02-02 | 2 | 1 | ~3min | 2026-05-08 |
|
||
| 03-01 | 1 | 1 | ~1min | 2026-05-08 |
|
||
| 03-02 | 2 | 2 | ~85s | 2026-05-08 |
|
||
|
||
## 累积上下文
|
||
|
||
### 关键决策
|
||
|
||
- **2026-05-07 phase 拆分(Option B / 3 phase)**:API 客户端独立成 Phase 1(无 UI),权限矩阵 + 入口控件合并为 Phase 2(UI),编辑对话框 + 反馈合并为 Phase 3(UI)。理由:Phase 1 是纯逻辑、可在后端联调前独立打磨;Phase 2 一旦完成,未授权角色即彻底看不到入口(安全前置);Phase 3 集中处理"留空保留旧值"语义这条最容易翻车的业务规则。
|
||
- **2026-05-07 跨项目依赖明确**:前端 phase 不阻塞代码编写,但端到端验收依赖 qy_lty 后端 Phase 2(管理端读写接口)落地;本仓库 Phase 3 收尾节奏与后端 Phase 2 完工对齐。
|
||
- **2026-05-07 表单"留空保留旧值"语义**:后端 GET 返回的是末 4 位脱敏掩码,前端**绝不**能把掩码当真值再 PUT 回去;Phase 3 success criteria #2 显式约束。
|
||
- **2026-05-08 Plan 01-01 落地**:1:1 复刻 ai-models.ts 风格的 credential-slot.ts(adapter + GET/PUT),index.ts 末尾具名 re-export 4 个公共符号;类型层 `accessTokenMasked` vs `accessToken` 编译期屏障已建立,Phase 3 表单编写时 TS 会拦截"把脱敏字符串赋给 accessToken 字段"这条 bug 路径。
|
||
- **2026-05-08 Plan 01-02 落地**:docs/修改记录.md 顶部追加 [2026-05-08] Phase 1 条目(含「跨项目联动」+「服务端联动」字段引用后端 commit 46d72b8);`npx tsc --noEmit` 在新增/修改文件零类型错误(67 条存量错误与本 phase 无关);临时探针验证 barrel 入口可解析后已删除。`npm run lint` 因项目未 bootstrap ESLint(无 .eslintrc* / eslint-config-next)进入交互式 prompt → 按 PLAN 自动 verify 规则判定通过(不指向新增/修改文件),ESLint 基础设施补齐留给 PERM-06 候选 #3。
|
||
- **2026-05-08 Plan 02-01 落地**:lib/permissions.ts PermissionModule union +1('credential-slot' 第 14 项)+ 「超级管理员」/「AI模型管理员」两角色数组末尾追加 + 顶部注释表新增「凭据槽位」行(commit d60dd89);app/ai-model/page.tsx 转 Client Component(line 1 加 'use client')+ 加 useState/useEffect mounted 守卫(复用 sidebar.tsx 同模式)+ DashboardHeader 内追加凭据槽位 Button(variant=outline / KeyRound 图标 / 受 mounted && hasPermission('credential-slot') 收敛)+ </Tabs> 后插入 controlled mode 占位 Dialog(DialogTitle「通用凭据槽位」+ DialogDescription「对话框真实内容由 Phase 3 落地」)(commit 0bcaa39);`npx tsc --noEmit` 不引入指向 lib/permissions.ts / app/ai-model/page.tsx 的新错误(67 条存量错误与本 phase 无关);不引入新依赖(4 个 lockfile 全部未动)。CRED-FE-02 + CRED-FE-03 已交付,等待 Plan 02-02 收尾修改记录追加。
|
||
- **2026-05-08 Plan 02-02 落地**:docs/修改记录.md 顶部追加 [2026-05-08] Phase 2 条目(commit 2be1f1d,纯追加 +32 行 / -0 行;含 7 字段结构 + CONTEXT.md D-XX 锁定的「跨项目联动」字段「无 — 不引入新跨项目契约 / 后端 commit 46d72b8 互引仍有效 / Phase 3 引入实质 PUT 调用时再评估」);plan 级整体双重验证:tsc 整体 67 条存量错误 + 反向断言 0 条指向本 phase 改动文件(A 段)/ 14 条 grep 全命中含 specifics 11 条 + 反向断言 4 角色数组(B 段,原 PLAN awk pattern 因 Windows Bash 转义警告失败,替换为 sed -n 'N,Mp' | grep -c 行号区间方案,结果一致)/ 4 个 manifest+lockfile 在工作区 + HEAD~1 比较均 0 行 diff(C 段)/ next lint 因项目无 .eslintrc* 跳过沿用 Phase 1 判定(D 段)。CLAUDE.md 修改记录强制规则闭环;Phase 2 全部 5 条 success criteria 全部确认通过,Phase 2 已交付(2/2 plan)。
|
||
- **2026-05-08 Plan 03-01 落地**:app/layout.tsx 第 3 行新增 `import { Toaster } from '@/components/ui/sonner'`;第 17-21 行 `<body>` 块由单行改为多行结构、`{children}` 之后追加 `<Toaster />`(共 +5 / -1 行;commit 7065d73)。修复仓库 9 处 `toast(...)` 调用因 portal 未挂载而全部静默失败的 pre-existing dead code 问题,Phase 3 业务功能 toast 反馈通道前置打通。tsc 反向断言 0 条指向 app/layout.tsx;4 个 lockfile 工作区 0 行 diff(不引入新依赖,sonner@^1.7.1 已在 deps)。决策点:挂在 `<body>` 内 `{children}` 之后(不是 `<head>`、不是 children 之前);不挂第二个 Radix Toast Toaster(CONTEXT D-Toast 锁单一 Sonner 通道);不给 RootLayout 加 `"use client"`(components/ui/sonner.tsx 已 'use client',RSC layout 直接渲染 client child 即可);不新增 ThemeProvider(sonner.tsx:9 useTheme 已有 'system' fallback)。Phase 3 进度 1/3,等待 Plan 03-02 启动。
|
||
- **2026-05-08 Plan 03-02 落地**:新建 `components/ai-model/credential-slot-dialog.tsx`(191 行;commit d719891)— 首行 `"use client"` + RHF/Zod schema(appId/accessToken 强制 min(1))+ useEffect on `open` 拉数据 with cancelled flag + form.reset({ appId, accessToken: "" }) + Sonner 命令式 `toast.success("凭据槽位已更新", { description: "配置已生效" })` / `toast.error("保存失败"|"加载失败", { description: handleApiError(e) })` + `import { handleApiError } from "@/lib/api/error-handler"` 显式路径(不走 barrel)+ `placeholder={slot?.accessTokenMasked ?? "..."}` 仅作视觉提示 + `defaultValues.accessToken = ""` 永远空串(避免回写脱敏掩码)+ `updatedAt` 用 `toLocaleString('zh-CN')` 只读显示 + 失败路径不关闭 Dialog 不 reset 表单。改 `app/ai-model/page.tsx`(commit 7872840;+3 / -18)— 删 L9-15 Dialog 系列命名导入 + 加 1 行 `import { CredentialSlotDialog } from "@/components/ai-model/credential-slot-dialog"` + 删 L473-485 占位 Dialog(含「对话框真实内容由 Phase 3 落地」字面量)+ 加 4 行 `<CredentialSlotDialog open={isCredentialDialogOpen} onOpenChange={setIsCredentialDialogOpen} />`;保留 `mounted && hasPermission("credential-slot")` 守卫与 Button 入口(Phase 2 不破坏)。验证:tsc 反向断言 0 条新错误指向 2 个改动文件;12+5 条正向 grep 全命中;4+3 条反向断言全满足;4 个 lockfile 0 行 diff。决策点:文件命名 kebab-case 与仓库 9 个现有业务对话框对齐;access_token 强制输入(不实现"留空保留旧值",因后端 PUT 全字段覆写 + 前端无法识别脱敏掩码格式,需后端配合,记入候选下一周期 milestone);失败路径不关 Dialog 不 reset 表单(CONTEXT D-错误处理);Sonner 命令式 toast 不走 useToast hook(Radix Toast 与 Sonner 不通);handleApiError 显式路径不走 barrel(避免 namespace 歧义);Loader2 仅在新组件内用、page.tsx 不加 import;updatedAt 用 toLocaleString('zh-CN') 零依赖。CRED-FE-04 + CRED-FE-05 完整闭环。Phase 3 进度 2/3,等待 Plan 03-03 收尾(修改记录追加 + plan 级双重验证)。
|
||
|
||
### 待办事项
|
||
|
||
(暂无;待 plan 生成后补齐)
|
||
|
||
### 阻塞项
|
||
|
||
(无)
|
||
|
||
### 风险项
|
||
|
||
- 后端 Phase 2(管理端读写接口)若延期,本仓库 Phase 3 的 success criteria #5(端到端串联)无法验证;需要并行盯好后端进度,必要时以 mock 服务先验证 Phase 1-2。
|
||
- 前端权限矩阵仅是 UI 礼貌(参见 PROJECT.md 关键决策表),后端必须独立校验 `/api/v1/admin/credential-slot/` 的角色权限;该闭环是 PERM-06 的范畴,本 milestone 不消化但需要在端到端验收时顺带确认后端是否对该接口实施了角色校验。
|
||
|
||
## 状态总览
|
||
|
||
| 项目 | 状态 |
|
||
|------|------|
|
||
| 代码库映射 | ✅ `.planning/codebase/` 7 文档(commit `a85b6a7`) |
|
||
| PROJECT.md | ✅ 已加入 Milestone v1.0 段 + Active 5 项 |
|
||
| REQUIREMENTS.md | ✅ Active 段已落地,Traceability 已回填 5/5;CRED-FE-01 + CRED-FE-02 + CRED-FE-03 + CRED-FE-04 + CRED-FE-05 已勾选完成 |
|
||
| 路线图 | ✅ ROADMAP.md 落地(3 phase,coarse),Phase 1 + Phase 2 已完成、Phase 3 进行中 |
|
||
| 当前 phase | Phase 3 🚧 进行中(03-01 + 03-02 完成,03-03 待启动) |
|
||
| 当前 milestone | v1.0 通用凭据槽位前端集成 |
|
||
|
||
## 会话连续性
|
||
|
||
**最近会话**:2026-05-08
|
||
**最近动作**:执行 Plan 03-02(新建 components/ai-model/credential-slot-dialog.tsx 191 行 RHF+Zod+Sonner+handleApiError + 改 app/ai-model/page.tsx 删占位 Dialog 接入新组件 + tsc 反向断言 0 条 + 12+5 条正向 grep 全命中 + 4+3 条反向断言全满足 + 4 lockfile 0 diff + SUMMARY 落地);commits d719891 + 7872840;Phase 3 进度 2/3,CRED-FE-04 + CRED-FE-05 完整闭环
|
||
**下一会话起点**:运行 Plan 03-03(在 docs/修改记录.md 顶部追加 Phase 3 条目,含 access_token 强制输入语义的权衡说明 + 候选下一周期 milestone「后端识别脱敏掩码保留旧值」+ 「跨项目联动」字段;plan 级整体双重验证)
|
||
|
||
## 工作流配置
|
||
|
||
详见 `.planning/config.json`:
|
||
|
||
- 模式:**YOLO**(自动通过审批,直接执行)
|
||
- 粒度:**Coarse**(本期 milestone 拆为 3 phase)
|
||
- 并行化:**已启用**
|
||
- 工作流 agent:research / plan_check / verifier 全部启用
|
||
- 模型档位:**balanced**(Sonnet 主力)
|
||
- `.planning/` 提交到 git:**是**(提交至父级 `Lila-Server\` 仓库)
|
||
|
||
随时可用 `/gsd-settings` 调整。
|
||
|
||
## 锚定路径重要说明
|
||
|
||
`.planning/` 必须保持在 `c:\Users\admin\Desktop\Lila-Server\qy-lty-admin\` 这一层(**不是父级 `Lila-Server\`**)。父级 `.git` 容易让 GSD CLI 误把 `Lila-Server` 当作 project_root;本目录的存在就是锚定信号,不要删。
|
||
|
||
`qy-lty-admin\` 自身**没有** `.git`——版本控制由父级 `Lila-Server\.git` 统一管理。任何 `.planning/` 工件的提交都通过父仓库进行;**不要**在 `qy-lty-admin\` 内执行 `git init`,否则会形成嵌套仓库与父仓库冲突。
|
||
|
||
## 项目规则提醒
|
||
|
||
CLAUDE.md 中两条强制规则,做任何 phase 时必须遵守:
|
||
|
||
1. **沟通语言**:所有面向用户的回复使用中文(CLAUDE.md 顶部「语言」要求 + 跨项目约定)
|
||
2. **修改记录**:每次代码 / 配置 / `package.json` / Dockerfile / CI / 文档结构性改动 **必须**追加到 `docs/修改记录.md` 顶部(CLAUDE.md「项目修改记录规则」节)
|
||
|
||
`qy-lty-admin` 与 `qy_lty` 是独立项目,修改记录互不混合,跨项目联动两端各写一条互相引用对方的条目。
|
||
|
||
---
|
||
|
||
*2026-05-07 由 gsd-roadmapper 切换到 Phase 1 待启动状态*
|
||
*2026-05-08 Plan 01-01 完成(CRED-FE-01 已交付),Phase 1 进度 1/2,等待 Plan 01-02 收尾*
|
||
*2026-05-08 Plan 01-02 完成(修改记录追加 + 双重验证),Phase 1 全部交付(2/2 plan);等待 /gsd-plan-phase 2 启动 Phase 2*
|
||
*2026-05-08 Plan 02-01 完成(RBAC 扩展 + /ai-model 页面入口 Button + 占位 Dialog),CRED-FE-02 + CRED-FE-03 已交付;Phase 2 进度 1/2,等待 Plan 02-02 收尾*
|
||
*2026-05-08 Plan 02-02 完成(修改记录追加 + 双重验证),Phase 2 全部交付(2/2 plan);milestone 进度 67%(2/3 phase),等待 /gsd-plan-phase 3 启动 Phase 3*
|
||
*2026-05-08 Plan 03-01 完成(RootLayout 挂载 Sonner Toaster — commit 7065d73,修复 9 处 toast pre-existing dead code);Phase 3 进度 1/3(33%),milestone 进度 71%(5/7 plan),等待 Plan 03-02 启动*
|
||
*2026-05-08 Plan 03-02 完成(新建 CredentialSlotDialog 组件 191 行 commit d719891 + 改 page.tsx 删占位 Dialog 接入新组件 commit 7872840);CRED-FE-04 + CRED-FE-05 完整闭环;Phase 3 进度 2/3(67%),milestone 进度 86%(6/7 plan),等待 Plan 03-03 收尾*
|