feat: 配置中心-版本历史(列表/两版对比/回滚/组级重置出厂)
Task 7d——Phase 3 配置中心四连收尾:
- API(api/config.ts):fetchConfigVersions / fetchConfigVersionDetail /
rollbackConfig / resetConfigGroup 四函数补齐(骨架端点与类型已就位;
响应形态对照 config_routes 实测——列表无 config 本体、详情整份+掩码、
reset 响应与 PUT 分组保存同形)
- VersionsPane:版本 tab 实装(导航占位转正)——列表倒序(版本/时间/
作者/备注,当前版标记)+ 详情抽屉整份 JSON;勾两版(限两个,第三个
自动撤销最早勾选行)并排等宽 JSON 对比(spec §7.3 最低形态,范围
下拉可聚焦单组——wall 20KB+ 场景);回滚确认框明示「将产生新版本,
历史不变」→ 响应内新快照直接回写页头版本/快照/品牌表单,无需再 GET
- 组级重置出厂:六个已实装编辑卡(品牌/提示词/词表/邮件/推送/AI)头部
危险色小按钮 → reset.ts 共用确认入口(明示组名与「恢复出厂档案值」)
→ POST config/{group}/reset → 表单/密钥态/版本刷新(RESET_GROUP_
LABELS 九组镜像后端 CONFIG_GROUPS,含待实装的联系方式/引擎/杂项)
- 测试:vitest 120(+13——API 四函数调用形态 5 条 + model 辅助 8 条);
后端不动 595;冒烟 jiancai:v1-v10 列表 → v1/v10 并排对比(push 组
__SET__ 掩码可见)→ 回滚 v1 产 v11 且品牌回 v1 值 → 改占位存 v12 →
重置品牌产 v13 表单回档案值 → 回滚 v10 复原现场(v14)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
/**
|
||||
* 配置中心提示词/词表/凭据编辑模型(Phase 3 Task 7b + 7c)
|
||||
* 配置中心提示词/词表/凭据编辑模型(Phase 3 Task 7b + 7c;Task 7d 补
|
||||
* 版本历史展示辅助)
|
||||
*
|
||||
* 消费方:config/center 的 PromptsPane.vue / WallPane.vue / CredsPane.vue。
|
||||
* 纯逻辑无 DOM 依赖,vitest 直接覆盖(__tests__/model.test.ts)。
|
||||
* 消费方:config/center 的 PromptsPane.vue / WallPane.vue / CredsPane.vue /
|
||||
* VersionsPane.vue。纯逻辑无 DOM 依赖,vitest 直接覆盖(__tests__/model.test.ts)。
|
||||
*
|
||||
* 事实源对齐:
|
||||
* - 提示词四件套键名/字节上限:app/engine/services/ai_service.PROMPTS_KEYS
|
||||
@@ -23,6 +24,7 @@
|
||||
* 不动保存回传哨兵保持库值;「清除」= 提交空串)。
|
||||
*/
|
||||
import { MASKED_SENTINEL, secretToSubmit } from '@/api/mask'
|
||||
import type { ConfigGroupKey } from '@/api/config'
|
||||
// ---- 提示词四件套 -----------------------------------------------------------------
|
||||
|
||||
/** 四件套键名(ai_service.PROMPTS_KEYS 镜像;prompts 是整组 PUT 的四键 dict) */
|
||||
@@ -675,3 +677,63 @@ export const PUSH_PROBE_REASON_LABELS: Record<string, string> = {
|
||||
timeout: '连接超时',
|
||||
connect: '连接被拒绝或网络不可达'
|
||||
}
|
||||
|
||||
// ---- 版本历史 / 两版对比 / 组级重置(Phase 3 Task 7d) ------------------------------
|
||||
|
||||
/**
|
||||
* 可重置组镜像(后端 config_validation.CONFIG_GROUPS = DEFAULT_CONFIG 键 +
|
||||
* prompts,共 9 组;reset 路由同款 allowlist——未知组 400)。标签用于
|
||||
* 确认框明示组名(「将把「品牌」组恢复为出厂档案值」)。
|
||||
*/
|
||||
export const RESET_GROUP_LABELS: Record<ConfigGroupKey, string> = {
|
||||
brand: '品牌',
|
||||
prompts: '提示词',
|
||||
wall: '安全词表',
|
||||
contact: '联系方式',
|
||||
email: '邮件',
|
||||
push: '推送',
|
||||
ai: 'AI',
|
||||
engine: '引擎',
|
||||
misc: '杂项'
|
||||
}
|
||||
|
||||
/**
|
||||
* 版本时间展示:后端 created_at 是 naive isoformat(无时区后缀)——直接
|
||||
* 字符串切形(T → 空格,截到秒),不做 Date 解析避免被浏览器当作 UTC
|
||||
* 再偏移出错误时刻。
|
||||
*/
|
||||
export function formatVersionTime(iso: string): string {
|
||||
return iso.replace('T', ' ').slice(0, 19)
|
||||
}
|
||||
|
||||
/** 版本列表倒序(后端升序返回——展示最新在前) */
|
||||
export function descendingVersions<T extends { version: number }>(
|
||||
items: T[]
|
||||
): T[] {
|
||||
return [...items].sort((a, b) => b.version - a.version)
|
||||
}
|
||||
|
||||
/** 对比范围哨兵:整份快照(其余值 = 单组键——wall 等大组 20KB+ 按组聚焦) */
|
||||
export const COMPARE_SCOPE_ALL = '__all__'
|
||||
|
||||
/** 快照顶层组键(对比范围下拉选项;键序排序稳定) */
|
||||
export function snapshotGroupKeys(
|
||||
config: Record<string, unknown> | null | undefined
|
||||
): string[] {
|
||||
return config ? Object.keys(config).sort() : []
|
||||
}
|
||||
|
||||
/**
|
||||
* 范围视图 → 等宽面板 JSON 串(spec §7.3 最低形态:纯并排展示,不做差异
|
||||
* 高亮)。密钥字段显示为 '__SET__'——后端对所有携带 config 的响应统一
|
||||
* 掩码,历史行存原值但绝不回传。
|
||||
*/
|
||||
export function scopedConfigJson(
|
||||
config: Record<string, unknown> | null | undefined,
|
||||
scope: string
|
||||
): string {
|
||||
if (!config) return ''
|
||||
const view =
|
||||
scope === COMPARE_SCOPE_ALL ? config : { [scope]: config[scope] }
|
||||
return JSON.stringify(view, null, 2)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user