/** * templateStore.ts - 模板存储管理模块 * * 本模块负责从后端加载模板配置,并支持本地覆盖功能 * 模板存储在 /public/templates 目录下,通过 fetch API 加载 * * 主要功能: * - 加载模板索引列表 * - 根据 ID 或元数据加载单个模板 * - 从本地存储读取/保存模板覆盖 * - 检查模板是否有本地覆盖 */ import type { Template, TemplateMeta } from '../types' /** * 本地存储中覆盖模板的前缀 * 完整 key 格式:mope_template_override:{template_id} */ const OVERRIDE_PREFIX = 'mope_template_override:' /** * 深度克隆对象 * 使用 JSON 序列化/反序列化实现 * 注意:这会丢失 undefined、正则、函数等特殊类型 * * @param value - 需要克隆的值 * @returns 克隆后的新值 */ export function clone(value: T): T { return JSON.parse(JSON.stringify(value)) } /** * 加载模板索引列表 * 从 http://ch1.b.uat.4.cn/zncmweb/templates/index.json 获取所有可用模板的元数据 * * @returns 模板元数据数组 * @throws 如果请求失败或响应非 OK,抛出错误 */ export async function loadTemplateIndex(): Promise { const response = await fetch('https://ch1.b.uat.4.cn/zncmweb/templates/index.json') if (!response.ok) throw new Error(`HTTP ${response.status}`) const data = await response.json() return (data.templates || []) as TemplateMeta[] } /** * 根据元数据或 ID 加载模板 * 如果本地有覆盖,返回覆盖版本 * * @param metaOrId - 模板元数据对象或模板 ID 字符串 * @returns 模板对象 * @throws 如果请求失败或响应非 OK,抛出错误 */ export async function loadTemplateByMeta(metaOrId: TemplateMeta | string): Promise