From 250ffdfa53a60f5c1cee6e51f7e7cfd9a0224a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Wed, 14 Oct 2026 20:23:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20contact/engine/misc=20=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=20pane=20+=20JsonGroup=20=E9=80=80=E5=BD=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 13(feature/config-ux Batch 3):contact/engine/misc 三组从通用 JSON 整组编辑退役为专用表单卡——ContactFormPane(双开关 + 模板语言)、 EngineFormPane(限流数值 + context_seed_keys 高级折叠)、MiscFormPane (国名 → 区号行编辑),共用新 KeyValueEditor 行编辑器(直改 reactive rows,与 ScenarioCard 同契约);JsonGroupPane.vue 删除,model.ts 通用 JSON 组区块(JsonGroupKey/jsonGroupDraft/parseJsonGroupDraft/ JSON_GROUP_FIELDS)与对应测试一并退役;rowsToRecord/recordToRows 补 JSDoc(Task 12 评审折入)。 vitest 182 passed(185 − 3 旧 JSON 组用例);vue-tsc + vite build 零错误。 Co-Authored-By: Claude Code --- .../views/config/center/ContactFormPane.vue | 203 ++++++++++++++ .../views/config/center/EngineFormPane.vue | 236 ++++++++++++++++ .../src/views/config/center/JsonGroupPane.vue | 254 ------------------ .../views/config/center/KeyValueEditor.vue | 87 ++++++ .../src/views/config/center/MiscFormPane.vue | 176 ++++++++++++ .../config/center/__tests__/model.test.ts | 40 --- admin/src/views/config/center/index.vue | 73 +++-- admin/src/views/config/center/model.ts | 64 +---- 8 files changed, 760 insertions(+), 373 deletions(-) create mode 100644 admin/src/views/config/center/ContactFormPane.vue create mode 100644 admin/src/views/config/center/EngineFormPane.vue delete mode 100644 admin/src/views/config/center/JsonGroupPane.vue create mode 100644 admin/src/views/config/center/KeyValueEditor.vue create mode 100644 admin/src/views/config/center/MiscFormPane.vue diff --git a/admin/src/views/config/center/ContactFormPane.vue b/admin/src/views/config/center/ContactFormPane.vue new file mode 100644 index 0000000..e691e7b --- /dev/null +++ b/admin/src/views/config/center/ContactFormPane.vue @@ -0,0 +1,203 @@ + + + + + + diff --git a/admin/src/views/config/center/EngineFormPane.vue b/admin/src/views/config/center/EngineFormPane.vue new file mode 100644 index 0000000..2528239 --- /dev/null +++ b/admin/src/views/config/center/EngineFormPane.vue @@ -0,0 +1,236 @@ + + + + + + diff --git a/admin/src/views/config/center/JsonGroupPane.vue b/admin/src/views/config/center/JsonGroupPane.vue deleted file mode 100644 index ec4113d..0000000 --- a/admin/src/views/config/center/JsonGroupPane.vue +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - diff --git a/admin/src/views/config/center/KeyValueEditor.vue b/admin/src/views/config/center/KeyValueEditor.vue new file mode 100644 index 0000000..7c72946 --- /dev/null +++ b/admin/src/views/config/center/KeyValueEditor.vue @@ -0,0 +1,87 @@ + + + + + + diff --git a/admin/src/views/config/center/MiscFormPane.vue b/admin/src/views/config/center/MiscFormPane.vue new file mode 100644 index 0000000..13d4824 --- /dev/null +++ b/admin/src/views/config/center/MiscFormPane.vue @@ -0,0 +1,176 @@ + + + + + + diff --git a/admin/src/views/config/center/__tests__/model.test.ts b/admin/src/views/config/center/__tests__/model.test.ts index 66f13ad..a2359bc 100644 --- a/admin/src/views/config/center/__tests__/model.test.ts +++ b/admin/src/views/config/center/__tests__/model.test.ts @@ -44,8 +44,6 @@ import { formatKB, formatVersionTime, initWallEdit, - JSON_GROUP_FIELDS, - jsonGroupDraft, miscToForm, miscToPayload, normalizeAiCredsGroup, @@ -53,7 +51,6 @@ import { normalizePromptsGroup, normalizePushCredsGroup, parsePatternEntry, - parseJsonGroupDraft, poolLanguages, promptByteInfo, promptsOverCap, @@ -724,43 +721,6 @@ describe('scopedConfigJson / snapshotGroupKeys(两版对比的范围视图)' }) }) -describe('通用 JSON 组编辑(终审 I-1:contact/engine/misc)', () => { - it('jsonGroupDraft:组值 → 2 空格缩进等宽稿;null/undefined → 空对象', () => { - expect(jsonGroupDraft({ cc_completion: false })).toBe( - '{\n "cc_completion": false\n}' - ) - expect(jsonGroupDraft(null)).toBe('{}') - expect(jsonGroupDraft(undefined)).toBe('{}') - }) - - it('parseJsonGroupDraft:语法错误 / 非对象顶层 → 带原因拒绝;对象通过', () => { - const bad = parseJsonGroupDraft('{ "a": ') - expect(bad.ok).toBe(false) - if (!bad.ok) expect(bad.error).toContain('JSON 语法错误') - const notObject = parseJsonGroupDraft('[1, 2]') - expect(notObject.ok).toBe(false) - if (!notObject.ok) expect(notObject.error).toContain('顶层须为 JSON 对象') - const ok = parseJsonGroupDraft('{"cc_completion": false}') - expect(ok.ok).toBe(true) - if (ok.ok) expect(ok.value).toEqual({ cc_completion: false }) - }) - - it('JSON_GROUP_FIELDS:三组字段说明齐备(键与 DEFAULT_CONFIG 同名)', () => { - expect(Object.keys(JSON_GROUP_FIELDS).sort()).toEqual(['contact', 'engine', 'misc']) - expect(JSON_GROUP_FIELDS.contact.map((f) => f.key)).toEqual([ - 'cc_completion', - 'email_light_ask', - 'template_languages' - ]) - expect(JSON_GROUP_FIELDS.engine.map((f) => f.key)).toEqual([ - 'rate_limit_per_hour', - 'ws_conn_limit', - 'context_seed_keys' - ]) - expect(JSON_GROUP_FIELDS.misc.map((f) => f.key)).toEqual(['name_to_region_extras']) - }) -}) - describe('secretFieldState(密钥四件套展示态)', () => { it('未配置:input 空 + 无掩码', () => { const s = secretFieldState('', '', false) diff --git a/admin/src/views/config/center/index.vue b/admin/src/views/config/center/index.vue index db44268..a0a3ee5 100644 --- a/admin/src/views/config/center/index.vue +++ b/admin/src/views/config/center/index.vue @@ -30,6 +30,10 @@ ConfigCard(表单双列 grid + footer 回滚/备注/保存 + danger 重置行); 预览卡头加副标题;CredsPane @navigate 接线 onGroupSelect; 8 组全实装后 v-else 占位死分支剪除(activeGroupLabel/ALL_NAV_ITEMS 同清) + - Task 13 表单化(feature/config-ux Batch 3):contact/engine/misc 三组 + 退役通用 JSON 整组编辑(旧 JsonGroup 组件删除),换 ContactFormPane / + EngineFormPane / MiscFormPane 三表单卡(ConfigCard 基线 + KeyValueEditor + 行编辑——engine context_seed_keys / misc name_to_region_extras 共用) - 挂件实时预览:**本地简化预览组件**(标题/颜色气泡/头像/话题/占位的 静态模拟,零后端依赖、即时反映表单值;真机预览留给嵌入代码上真站) - 嵌入代码:域名取租户详情 sites[].domains(超管可枚举全租户,租户管理 @@ -477,8 +481,8 @@ - -