docs: 计划二轮修复(GroupKey 显式联合/v-else-if 链位/onPaneSaved 名)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-14 16:41:45 +08:00
parent bae51b00e3
commit eb2220c26c
@@ -411,7 +411,13 @@ export function secretFieldState(
]
```
`activeGroupLabel` 改为 `ALL_NAV_ITEMS.find((i) => i.key === activeGroup.value)?.label ?? ''`;删除 `IMPLEMENTED_GROUPS`。**GroupKey 类型重定义**(原 `typeof GROUP_NAV` 已删):`type GroupKey = (typeof ALL_NAV_ITEMS)[number]['key']`——须放在 ALL_NAV_ITEMS 之后;`activeGroup`/`onGroupSelect` 等既有引用不变。
`activeGroupLabel` 改为 `ALL_NAV_ITEMS.find((i) => i.key === activeGroup.value)?.label ?? ''`;删除 `IMPLEMENTED_GROUPS`。**GroupKey 类型重定义**(原 `typeof GROUP_NAV` 已删)——用显式联合字面量(**不可**写 `(typeof ALL_NAV_ITEMS)[number]['key']`:NavItem.key 标注为 GroupKey 会构成循环类型别名,tsc 报 TS2456/TS2502):
```ts
type GroupKey =
| 'brand' | 'wall' | 'prompts' | 'contact' | 'creds'
| 'engine' | 'misc' | 'versions'
```
- [ ] **Step 2: 重写导航模板**——`<ElCard class="nav-card">` 内的 ElMenu 区改为:
@@ -1120,7 +1126,7 @@ export function miscToPayload(
- [ ] **Step 2: ContactFormPane.vue**——ConfigCard `icon="solar:phone-line-duotone" title="联系方式" subtitle="AI 什么时候向客户要 WhatsApp / 邮箱"`;两个 ElSwitch(label 用 model 注释白话:cc_completion=「号码缺国家代码时自动补全并确认」/ email_light_ask=「留了号码没留邮箱时补要一次」);template_languages 用 ElSelect multiple allow-create(placeholder「语言代码如 en / zh」)+`<p class="field-hint">邮件通知使用的语言(暂未生效——引擎接线排期中)</p>`;保存走 contactToPayload、错误内联;footer/danger 同 Task 5 模式;emit saved/navigate
- [ ] **Step 3: EngineFormPane.vue**——ConfigCard `icon="solar:widget-5-line-duotone" title="聊天限流" subtitle="防刷与并发的引擎级参数(一般不用改)" info="留空 = 保持当前已存值;出厂档案缺省时省略该键回退平台默认"`;rate/ws 两 ElInput(placeholder「如 120(正整数)」/「如 5」)+推荐值提示;ElCollapse「会话上下文映射(context_seed_keys)」内 KeyValueEditor;保存 = validateEngineForm → engineToPayload → PUT engine
- [ ] **Step 4: MiscFormPane.vue**——ConfigCard `icon="solar:earth-line-duotone" title="国家区号映射" subtitle="客户用国名留言时,系统补全电话区号的额外规则"`;KeyValueEditor(key placeholder「国名(如 saudi arabia)」value「区号(如 966)」);validateKeyValueRows → miscToPayload → PUT misc
- [ ] **Step 5: index.vue 接线 + 退役清理**——`<JsonGroupPane>` 分发(index.vue:543 附近的 `v-if JSON_GROUPS.has(activeGroup)` 块)替换为三组件:`<ContactFormPane v-if="activeGroup==='contact'" :slug="activeSlug" :group="snapshot?.contact" @saved="onGroupSaved" @navigate="onGroupSelect" />` + EngineFormPane/MiscFormPane 同款三份(新组件显式 import);同步删除 `JSON_GROUPS` 常量、`activeJsonGroup`、`JsonGroupPane` import 与 `JsonGroupKey` 相关 import;onGroupSaved 现有回写逻辑复用
- [ ] **Step 5: index.vue 接线 + 退役清理**——`<JsonGroupPane>` 分发(index.vue:543 附近的 `v-if JSON_GROUPS.has(activeGroup)` 块)替换为三组件:`<ContactFormPane v-else-if="activeGroup==='contact'" :slug="activeSlug" :group="snapshot?.contact" @saved="onPaneSaved" @navigate="onGroupSelect" />` + EngineFormPane/MiscFormPane 同款三份(**必须 v-else-if**——该块处于 pane 条件链中段(brand v-if → … → v-else 占位卡),用 v-if 会让尾部 v-else 占位卡错挂;saved 接既有 handler 名 onPaneSaved——index.vue:630;新组件显式 import);同步删除 `JSON_GROUPS` 常量、`activeJsonGroup`、`JsonGroupPane` import 与 `JsonGroupKey` 相关 import;onPaneSaved 现有回写逻辑复用
- [ ] **Step 6: 退役删除**——`git rm admin/src/views/config/center/JsonGroupPane.vue`;model.ts 删「通用 JSON 组编辑」整段(`JsonGroupKey`/`jsonGroupDraft`/`parseJsonGroupDraft`/`JSON_GROUP_FIELDS`;`RESET_GROUP_LABELS` 保留不动);model.test.ts 删旧 JSON 组 describe 块与 import 名单中三个退役函数;`grep -rn "JsonGroupPane\|jsonGroupDraft\|parseJsonGroupDraft\|JSON_GROUP_FIELDS" admin/src` 零残留
- [ ] **Step 7: 验证**——`pnpm build`;`pnpm test` 全绿(总数 = 基线 − 旧 JSON 组用例数 + Task 12 新增数);dev 走查三组表单(含未知键透传:后台给某租户 contact 组塞 `_custom: 1` 再 GET → 表单保存 → `_custom` 仍在——可用平台 API 或直接 sqlite 验证)
- [ ] **Step 8: Commit**——`git commit -m "feat(admin): contact/engine/misc 表单 pane + JsonGroup 退役"`