- 修复内置模板验证问题(builtin-video-material等) - 添加模板验证工具 lib/template-validator.ts - 创建模板系统优化需求文档(30个详细需求) - 优化上传API的模板验证逻辑 - 改进错误提示信息的清晰度 - 添加字段池和分类管理相关需求 - 完善自定义字段的创建、验证、存储逻辑 - 清理过期的 .specstory 和 .trae 文件
24 KiB
自定义上传模板系统优化需求文档
介绍
本文档定义了对FLNXI素材库自定义上传模板系统的优化需求。
核心价值:自定义上传模板系统是整个FLNXI素材库的核心基础设施,它决定了:
- 用户如何上传素材(表单结构)
- 素材包含哪些元数据(字段定义)
- 如何分类和检索素材(字段池集成)
- 如何共享和展示素材(字段显示配置)
作为"上传-保存-共享"工作流的起点,模板系统的稳定性和灵活性直接影响整个系统的可用性。当前系统已经实现了基础功能,但需要进一步优化以提高稳定性、可靠性和用户体验,确保它能够支撑各种复杂的业务场景。
术语表
- 自定义模板 (Custom Template): 管理员创建的上传模板,存储在数据库中
- 内置模板 (Builtin Template): 系统预设的模板,动态生成,不存储在数据库中
- 模板字段 (Template Field): 模板中定义的表单字段,如文本框、下拉框等
- 字段池 (Field Pool): 集中管理所有模板字段及其选项的系统
- 模板验证 (Template Validation): 验证模板ID是否有效的过程
- 字段同步 (Field Sync): 将模板字段同步到字段池的过程
需求
需求 1: 模板验证增强
用户故事: 作为系统开发者,我希望模板验证逻辑能够正确区分内置模板和自定义模板,以便用户可以使用任何有效的模板上传素材。
验收标准
- WHEN 用户使用内置模板ID(以
builtin-开头)上传素材 THEN 系统应验证模板key是否在预设列表中 - WHEN 用户使用自定义模板ID上传素材 THEN 系统应从数据库查询验证模板是否存在
- WHEN 模板验证失败 THEN 系统应返回清晰的错误信息,说明是内置模板无效还是自定义模板不存在
- WHEN 模板ID为空或null THEN 系统应允许上传(向后兼容旧数据)
需求 2: 自定义模板字段处理
用户故事: 作为管理员,我希望创建的自定义模板字段能够正确保存和读取,以便用户上传时能看到正确的表单字段。
验收标准
- WHEN 管理员创建自定义模板并添加字段 THEN 系统应正确保存所有字段属性(key, label, type, required等)
- WHEN 用户选择自定义模板上传素材 THEN 系统应正确读取并显示所有模板字段
- WHEN 用户填写自定义模板字段并提交 THEN 系统应正确保存字段值到 metadata 或对应的数据库字段
- WHEN 自定义模板字段类型为 select THEN 系统应正确解析和显示选项列表
- WHEN 自定义模板字段设置为必填 THEN 系统应在提交前验证该字段不为空
需求 3: 模板字段同步优化
用户故事: 作为管理员,我希望模板字段能够自动同步到字段池,以便在分类管理中使用这些字段。
验收标准
- WHEN 管理员创建或更新模板并勾选字段的
addToCategoryTHEN 系统应自动将该字段同步到字段池 - WHEN 管理员删除模板 THEN 系统应清理该模板相关的字段池数据(如果没有其他模板使用)
- WHEN 多个模板使用相同的字段key THEN 系统应合并这些字段的选项
- WHEN 字段选项包含脏数据(如
[[[xxx]]]) THEN 系统应自动清洗并规范化选项值
需求 4: 模板版本控制
用户故事: 作为管理员,我希望在编辑模板时能够检测并发冲突,以避免覆盖其他管理员的修改。
验收标准
- WHEN 管理员打开模板编辑页面 THEN 系统应记录当前模板版本号
- WHEN 管理员保存模板 THEN 系统应检查版本号是否与数据库一致
- WHEN 版本号不一致 THEN 系统应拒绝保存并提示"模板已被其他人修改,请刷新后重试"
- WHEN 保存成功 THEN 系统应自动递增版本号
需求 5: 模板数据完整性
用户故事: 作为系统开发者,我希望模板数据始终保持完整性,以避免数据损坏导致的系统错误。
验收标准
- WHEN 创建或更新模板 THEN 系统应验证所有必填字段(name, materialType, materialKind)
- WHEN 模板字段的 key 重复 THEN 系统应拒绝保存并提示错误
- WHEN 模板字段的 optionsStatic 为数组 THEN 系统应自动转换为JSON字符串
- WHEN 模板的 materialKind 不在允许列表中 THEN 系统应使用默认值 'IMAGE'
- WHEN 删除模板时有素材正在使用 THEN 系统应警告管理员(但允许删除,素材的 templateId 会变为 null)
需求 6: 错误处理和日志
用户故事: 作为系统开发者,我希望模板相关操作有完善的错误处理和日志记录,以便快速定位和解决问题。
验收标准
- WHEN 模板操作发生错误 THEN 系统应记录详细的错误日志(包括错误类型、堆栈、请求数据)
- WHEN Prisma 返回特定错误代码 THEN 系统应返回用户友好的错误信息
- WHEN 字段池同步失败 THEN 系统应记录错误但不影响模板保存
- WHEN 模板验证失败 THEN 系统应返回清晰的错误信息,包含失败原因和建议操作
需求 7: 性能优化
用户故事: 作为用户,我希望模板加载和保存速度快,以提高工作效率。
验收标准
- WHEN 获取模板列表 THEN 系统应在 500ms 内返回结果
- WHEN 保存模板 THEN 系统应在 2秒 内完成(包括字段池同步)
- WHEN 模板包含大量字段(>20个) THEN 系统应使用事务批量处理,避免多次数据库往返
- WHEN 字段池同步 THEN 系统应使用批量操作,避免逐个字段处理
需求 8: 向后兼容性
用户故事: 作为系统维护者,我希望新的优化不会破坏现有功能,以确保系统稳定运行。
验收标准
- WHEN 旧素材没有 templateId THEN 系统应正常显示和编辑
- WHEN 旧素材的 templateId 指向已删除的模板 THEN 系统应正常显示(templateId 为 null)
- WHEN 旧模板没有 materialKind 字段 THEN 系统应使用默认值 'IMAGE'
- WHEN 旧模板字段没有 addToCategory 属性 THEN 系统应默认为 false
需求 9: 模板字段类型支持
用户故事: 作为管理员,我希望能够创建多种类型的字段,以满足不同素材的元数据需求。
验收标准
- WHEN 管理员创建 text 类型字段 THEN 用户上传时应看到单行文本输入框
- WHEN 管理员创建 textarea 类型字段 THEN 用户上传时应看到多行文本输入框
- WHEN 管理员创建 select 类型字段 THEN 用户上传时应看到下拉选择框,并能看到所有选项
- WHEN 管理员创建 number 类型字段 THEN 用户上传时应看到数字输入框,只能输入数字
- WHEN 管理员创建 date 类型字段 THEN 用户上传时应看到日期选择器
- WHEN 管理员创建 checkbox 类型字段 THEN 用户上传时应看到复选框
- WHEN 管理员创建 file 类型字段 THEN 用户上传时应看到文件上传按钮
- WHEN 管理员创建 image 类型字段 THEN 用户上传时应看到图片上传按钮,并支持预览
需求 10: 模板字段验证规则
用户故事: 作为管理员,我希望能够为字段设置验证规则,以确保用户输入的数据符合要求。
验收标准
- WHEN 管理员设置字段为必填 THEN 用户提交时该字段不能为空
- WHEN 管理员为 text 字段设置最大长度 THEN 用户输入超过长度时应提示错误
- WHEN 管理员为 number 字段设置最小值和最大值 THEN 用户输入超出范围时应提示错误
- WHEN 管理员为字段设置正则表达式验证 THEN 用户输入不匹配时应提示错误
- WHEN 验证失败 THEN 系统应显示清晰的错误提示,说明哪个字段不符合要求
需求 11: 模板字段布局配置
用户故事: 作为管理员,我希望能够配置字段的布局,以优化上传表单的用户体验。
验收标准
- WHEN 管理员设置字段布局为 'full' THEN 该字段应占据整行
- WHEN 管理员设置字段布局为 'half' THEN 该字段应占据半行,可与其他半行字段并排显示
- WHEN 管理员拖拽调整字段顺序 THEN 上传表单应按新顺序显示字段
- WHEN 管理员设置字段为只读 THEN 用户上传时该字段应显示但不可编辑
- WHEN 管理员设置字段的显示条件 THEN 只有满足条件时该字段才显示
需求 12: 模板与素材的关联
用户故事: 作为用户,我希望能够看到素材使用的模板,以便了解素材的元数据结构。
验收标准
- WHEN 用户查看素材详情 THEN 系统应显示该素材使用的模板名称
- WHEN 用户编辑素材 THEN 系统应根据模板动态生成编辑表单
- WHEN 素材的模板被删除 THEN 素材应仍然可以查看和编辑(使用通用表单)
- WHEN 用户筛选素材 THEN 系统应支持按模板类型筛选
- WHEN 管理员查看模板 THEN 系统应显示使用该模板的素材数量
需求 13: 模板导入导出
用户故事: 作为管理员,我希望能够导入导出模板配置,以便在不同环境间迁移或备份模板。
验收标准
- WHEN 管理员导出模板 THEN 系统应生成包含所有字段配置的 JSON 文件
- WHEN 管理员导入模板 THEN 系统应验证 JSON 格式并创建新模板
- WHEN 导入的模板名称已存在 THEN 系统应提示管理员选择覆盖或重命名
- WHEN 导入的模板包含无效字段类型 THEN 系统应拒绝导入并提示错误
- WHEN 导出多个模板 THEN 系统应支持批量导出为单个 JSON 文件
需求 14: 模板使用统计
用户故事: 作为管理员,我希望能够查看模板的使用情况,以便优化模板配置。
验收标准
- WHEN 管理员查看模板列表 THEN 系统应显示每个模板的使用次数
- WHEN 管理员查看模板详情 THEN 系统应显示最近使用该模板上传的素材列表
- WHEN 管理员查看模板统计 THEN 系统应显示每个字段的填写率
- WHEN 某个字段填写率很低 THEN 系统应建议管理员考虑将其设为可选或删除
- WHEN 模板长期未使用 THEN 系统应建议管理员归档该模板
需求 15: 模板权限控制
用户故事: 作为超级管理员,我希望能够控制哪些管理员可以创建和修改模板,以确保模板配置的安全性。
验收标准
- WHEN 普通用户访问模板管理页面 THEN 系统应拒绝访问并提示权限不足
- WHEN 管理员访问模板管理页面 THEN 系统应允许查看和编辑模板
- WHEN 超级管理员访问模板管理页面 THEN 系统应允许所有操作(包括删除)
- WHEN 管理员尝试删除正在使用的模板 THEN 系统应警告但允许删除(素材不受影响)
- WHEN 管理员修改模板 THEN 系统应记录操作日志(谁在何时修改了什么)
需求 16: 自定义字段的创建和管理
用户故事: 作为管理员,我希望能够灵活地创建和管理模板中的自定义字段,以适应不同类型素材的元数据需求。
验收标准
- WHEN 管理员在模板编辑器中点击"添加字段" THEN 系统应显示字段配置表单
- WHEN 管理员输入字段key THEN 系统应实时验证key的唯一性和格式(只允许字母、数字、下划线)
- WHEN 管理员输入字段label THEN 系统应自动将其作为显示名称
- WHEN 管理员选择字段类型 THEN 系统应根据类型显示相应的配置选项(如select类型显示选项配置)
- WHEN 管理员拖拽字段调整顺序 THEN 系统应实时更新字段的 orderIndex
- WHEN 管理员删除字段 THEN 系统应确认操作并警告可能影响已有素材
- WHEN 管理员复制字段 THEN 系统应创建一个新字段,key自动添加后缀避免冲突
需求 17: 自定义字段的选项管理(select类型)
用户故事: 作为管理员,我希望能够为下拉选择字段配置选项列表,并支持动态添加和编辑选项。
验收标准
- WHEN 管理员为select字段添加选项 THEN 系统应支持逐行输入或JSON数组格式
- WHEN 管理员输入的选项包含特殊字符或空格 THEN 系统应自动清洗并规范化
- WHEN 管理员输入重复的选项 THEN 系统应自动去重
- WHEN 管理员输入嵌套数组格式(如
[[[option]]]) THEN 系统应自动展开为单层数组 - WHEN 管理员保存模板 THEN 系统应将选项数组转换为JSON字符串存储
- WHEN 用户上传素材时 THEN 系统应正确解析选项并显示在下拉框中
- WHEN 管理员修改选项列表 THEN 系统应保持已有素材的选项值不变(即使选项被删除)
需求 18: 自定义字段的验证配置
用户故事: 作为管理员,我希望能够为自定义字段配置验证规则,确保用户输入的数据质量。
验收标准
- WHEN 管理员勾选"必填" THEN 用户上传时该字段必须填写
- WHEN 管理员为text字段设置最大长度 THEN 系统应在前端和后端都进行验证
- WHEN 管理员为number字段设置范围 THEN 系统应验证输入值在范围内
- WHEN 管理员设置正则表达式验证 THEN 系统应在用户输入时实时验证并提示
- WHEN 管理员设置自定义错误提示 THEN 验证失败时应显示自定义消息
- WHEN 验证规则冲突(如最小值大于最大值) THEN 系统应在保存模板时提示错误
- WHEN 用户提交表单 THEN 系统应按字段顺序依次验证,并显示所有错误
需求 19: 自定义字段的条件显示
用户故事: 作为管理员,我希望能够设置字段的显示条件,根据其他字段的值动态显示或隐藏字段。
验收标准
- WHEN 管理员为字段设置显示条件 THEN 系统应提供可视化的条件编辑器
- WHEN 管理员设置"当字段A等于值X时显示" THEN 用户上传时应根据条件动态显示字段
- WHEN 管理员设置多个条件(AND/OR逻辑) THEN 系统应正确计算条件结果
- WHEN 条件字段的值改变 THEN 系统应实时重新计算并更新字段显示状态
- WHEN 隐藏的字段有值 THEN 系统应保留该值(不清空)
- WHEN 条件配置循环依赖(A依赖B,B依赖A) THEN 系统应在保存时检测并拒绝
- WHEN 条件字段被删除 THEN 系统应警告并清除相关的条件配置
需求 20: 自定义字段的数据存储和读取
用户故事: 作为系统开发者,我希望自定义字段的数据能够可靠地存储和读取,支持不同的存储策略。
验收标准
- WHEN 自定义字段key与Material模型的标准字段匹配 THEN 系统应直接存储到对应的数据库字段
- WHEN 自定义字段key不匹配标准字段 THEN 系统应将其存储到 metadata JSON字段中
- WHEN 用户上传素材 THEN 系统应正确解析templateFields并分配到对应的存储位置
- WHEN 用户查看素材详情 THEN 系统应从标准字段和metadata中合并读取所有字段值
- WHEN 用户编辑素材 THEN 系统应根据模板动态生成表单,并预填充现有值
- WHEN metadata字段超过数据库限制 THEN 系统应压缩或分片存储
- WHEN 模板字段被删除但素材中有该字段的值 THEN 系统应保留数据但不显示在编辑表单中
需求 21: 自定义字段的迁移和兼容性
用户故事: 作为系统维护者,我希望在修改模板字段时,已有素材的数据能够平滑迁移,不会丢失或损坏。
验收标准
- WHEN 管理员修改字段的key THEN 系统应提供数据迁移工具,将旧key的值迁移到新key
- WHEN 管理员修改字段类型(如text改为select) THEN 系统应验证现有数据是否兼容
- WHEN 字段类型不兼容 THEN 系统应警告并提供数据转换选项
- WHEN 管理员删除字段 THEN 系统应保留素材中的数据(存储在metadata中)但不显示
- WHEN 管理员恢复已删除的字段(相同key) THEN 系统应自动恢复素材中的数据
- WHEN 模板版本升级 THEN 系统应支持批量更新素材的字段结构
- WHEN 数据迁移失败 THEN 系统应回滚并记录详细的错误日志
需求 22: 自定义字段的性能优化
用户故事: 作为用户,我希望即使模板包含大量自定义字段,上传和编辑素材的速度也不会明显变慢。
验收标准
- WHEN 模板包含超过30个字段 THEN 系统应使用虚拟滚动或分页显示
- WHEN 用户填写表单 THEN 系统应使用防抖技术减少验证频率
- WHEN 用户提交表单 THEN 系统应批量验证所有字段,避免多次往返
- WHEN 字段有复杂的显示条件 THEN 系统应缓存条件计算结果
- WHEN 加载素材详情 THEN 系统应并行读取标准字段和metadata
- WHEN 保存素材 THEN 系统应使用事务确保标准字段和metadata同时更新
- WHEN metadata字段过大 THEN 系统应使用压缩算法减少存储空间
需求 23: 自定义字段的错误恢复
用户故事: 作为用户,我希望在填写表单时如果发生错误,我的输入不会丢失,可以继续编辑。
验收标准
- WHEN 用户填写表单时 THEN 系统应自动保存草稿到浏览器本地存储
- WHEN 用户刷新页面或意外关闭 THEN 系统应提示恢复未保存的数据
- WHEN 提交失败(网络错误、验证失败等) THEN 系统应保留用户输入,允许修改后重新提交
- WHEN 用户在多个标签页同时编辑 THEN 系统应检测冲突并提示用户
- WHEN 草稿数据过期(超过7天) THEN 系统应自动清理
- WHEN 用户主动清除草稿 THEN 系统应提供"清除草稿"按钮
- WHEN 用户成功提交 THEN 系统应自动清除对应的草稿数据
需求 24: 字段池同步的完整性和一致性
用户故事: 作为系统开发者,我希望模板字段与字段池之间的同步是完整、一致且可靠的,确保首页筛选和分类管理功能正常工作。
验收标准
- WHEN 管理员勾选字段的
addToCategory并保存模板 THEN 系统应立即将该字段同步到字段池(FieldDefinition表) - WHEN 多个模板包含相同key的字段 THEN 系统应合并这些字段的选项到同一个FieldDefinition记录
- WHEN 管理员取消勾选字段的
addToCategoryTHEN 系统应检查是否有其他模板使用该字段,如果没有则从字段池删除 - WHEN 管理员修改字段的选项列表 THEN 系统应更新字段池中的FieldOption记录
- WHEN 字段池同步过程中发生错误 THEN 系统应记录详细日志但不影响模板保存,并在后台重试
- WHEN 字段池数据与模板数据不一致 THEN 系统应提供"重新同步"工具,管理员可手动触发全量同步
- WHEN 系统启动时 THEN 系统应自动检查字段池完整性,发现问题自动修复
需求 25: 首页分类Tag按钮的动态生成
用户故事: 作为用户,我希望首页的分类Tag按钮能够准确反映字段池中的分类数据,并且加载速度快、交互流畅。
验收标准
- WHEN 用户访问首页 THEN 系统应从字段池读取所有启用的筛选字段(isFilterEnabled=true)
- WHEN 字段池包含多个字段 THEN 系统应按 filterOrder 排序显示Tag按钮
- WHEN 用户点击Tag按钮 THEN 系统应展开该字段的所有选项,并高亮当前选中的选项
- WHEN 用户选择某个选项 THEN 系统应立即筛选素材列表,并更新URL参数
- WHEN 字段的选项过多(>20个) THEN 系统应使用虚拟滚动或分页显示
- WHEN 字段的 filterDisplayName 存在 THEN 系统应优先显示自定义名称,否则显示 label
- WHEN 管理员在后台修改字段池 THEN 首页应在下次刷新时自动更新Tag按钮(无需重启服务)
需求 26: 首页Tag按钮的性能优化
用户故事: 作为用户,我希望首页Tag按钮的切换和筛选操作非常流畅,不会出现卡顿或闪烁。
验收标准
- WHEN 用户切换Tag按钮 THEN 系统应在100ms内完成UI更新(无闪烁)
- WHEN 用户快速连续点击多个Tag THEN 系统应使用防抖技术,避免重复请求
- WHEN 素材列表数据量大(>1000条) THEN 系统应使用虚拟滚动和分页加载
- WHEN 用户选择多个筛选条件 THEN 系统应合并为单次API请求
- WHEN 筛选结果为空 THEN 系统应显示友好的空状态提示,并建议清除筛选条件
- WHEN 用户清除所有筛选 THEN 系统应快速恢复到初始状态
- WHEN Tag按钮数量过多 THEN 系统应使用横向滚动或折叠显示,避免布局混乱
需求 27: 后台分类管理的字段池集成
用户故事: 作为管理员,我希望在后台分类管理页面能够方便地管理字段池,包括启用/禁用字段、调整顺序、重命名显示名称等。
验收标准
- WHEN 管理员进入分类管理页面 THEN 系统应显示所有字段池中的字段(包括已启用和未启用)
- WHEN 管理员拖拽字段调整顺序 THEN 系统应实时更新 filterOrder,并同步到首页Tag按钮顺序
- WHEN 管理员点击"重命名"按钮 THEN 系统应弹出输入框,允许修改 filterDisplayName
- WHEN 管理员点击"启用/禁用"按钮 THEN 系统应切换 isFilterEnabled 状态,并立即反映到首页
- WHEN 管理员点击字段卡片 THEN 系统应在右侧显示该字段的所有选项
- WHEN 管理员添加/删除/重命名选项 THEN 系统应更新 FieldOption 表,并同步到所有使用该字段的模板
- WHEN 管理员点击"刷新"按钮 THEN 系统应重新从模板同步字段池数据
需求 28: 分类管理的选项清洗和规范化
用户故事: 作为管理员,我希望系统能够自动清洗和规范化字段选项,避免脏数据影响用户体验。
验收标准
- WHEN 字段选项包含多余的括号(如
[[[选项]]]) THEN 系统应自动去除多余括号 - WHEN 字段选项包含前后空格 THEN 系统应自动trim
- WHEN 字段选项包含特殊字符(如引号、反斜杠) THEN 系统应自动转义或清除
- WHEN 字段选项为嵌套数组格式(如
["[选项1,选项2]"]) THEN 系统应自动展开为单层数组 - WHEN 字段选项重复 THEN 系统应自动去重
- WHEN 字段选项为空字符串 THEN 系统应自动过滤
- WHEN 清洗过程发现无法处理的数据 THEN 系统应记录警告日志并跳过该选项
需求 29: 分类管理的批量操作
用户故事: 作为管理员,我希望能够批量操作字段和选项,提高管理效率。
验收标准
- WHEN 管理员选中多个字段 THEN 系统应显示批量操作按钮(启用/禁用/删除)
- WHEN 管理员批量启用字段 THEN 系统应一次性更新所有选中字段的 isFilterEnabled
- WHEN 管理员批量删除字段 THEN 系统应确认操作并警告影响范围
- WHEN 管理员批量导入选项 THEN 系统应支持CSV或JSON格式,并自动清洗数据
- WHEN 管理员批量导出选项 THEN 系统应生成包含所有字段和选项的JSON文件
- WHEN 批量操作失败 THEN 系统应显示详细的错误报告,说明哪些操作成功、哪些失败
- WHEN 批量操作涉及大量数据(>100条) THEN 系统应显示进度条并支持取消
需求 30: 分类管理与模板的双向同步
用户故事: 作为管理员,我希望分类管理和模板管理之间能够双向同步,修改任何一方都能反映到另一方。
验收标准
- WHEN 管理员在分类管理中修改字段选项 THEN 系统应自动更新所有使用该字段的模板
- WHEN 管理员在模板管理中修改字段选项 THEN 系统应自动同步到字段池
- WHEN 管理员在分类管理中删除字段 THEN 系统应警告哪些模板正在使用该字段
- WHEN 管理员在模板管理中删除字段 THEN 系统应检查字段池是否还有其他模板使用
- WHEN 同步过程中发生冲突(如两个管理员同时修改) THEN 系统应使用版本号检测并提示冲突
- WHEN 同步失败 THEN 系统应回滚所有相关修改,确保数据一致性
- WHEN 管理员查看同步历史 THEN 系统应显示详细的同步日志(时间、操作、结果)