24 模块配置化语义 Schema、表单与视图
# 24 模块配置化语义 Schema、表单与视图 ## 分层原则 动态配置必须分为四层: 1. 领域模型:业务对象和核心不变量,写在代码中。 2. 语义 Schema:实体、字段、敏感等级、AI 提取和审核规则,持久化并版本化。 3. 表单定义:在特定场景和平台展示哪些字段、顺序、控件和帮助文本。 4. 视图定义:列表、卡片、详情、时间轴、日历、看板、地图、关系图和仪表盘的字段布局。 AI 读取语义 Schema,不读取 CSS、栅格或按钮位置。前端读取已发布表单;复杂业务视图仍由专用 Vue 组件实现。 ## 24 模块默认配置 系统启动时为 24 个业务模块建立: - 一个实体类型定义; - 模块专用字段定义; - 快速创建、完整创建、编辑、AI 提案审核、移动快速采集五类表单; - 模块适用的业务视图。 这些默认配置不是通用 JSON 工作台的替代品,而是为模块专用规则和专用组件提供统一元数据。 ## 字段能力 配置中心的逻辑字段统一在标签后显示帮助入口。通过标准帮助按钮点击或键盘展开字段含义、影响范围和限制,完整说明可以复制;复制失败时仍可手动选择文字。 `select` / `Select` / `MultiSelect` 字段可以在“字段语义与 AI 策略”中维护字典选项。当前存储结构为稳定字符串数组,每行一个选项;发布表单后,PC 与移动端模块表单读取同一字段选项目录。 字段可以配置: - 数据类型、是否多值和默认值; - `REQUIRED_TO_CREATE`、`REQUIRED_TO_ACT`、`RECOMMENDED`、`OPTIONAL`、`NEVER_ASK`; - `PUBLIC` 至 `NEVER_SEND_TO_CLOUD` 的敏感等级; - `DENY`、显式提取、允许推断、本地限定; - AI 工作负载和审核策略; - 确定性验证规则、存储策略、枚举和默认控件。 ## 表单配置边界 数据库只能选择预实现控件和受限条件: - TextInput、Textarea、NumberInput、日期、模糊时间、枚举、人物、项目、隐私、标签、附件和证据; - equals、notEquals、contains、exists、in 等受限表达式。 禁止保存任意 Vue、JavaScript、SQL 或 HTTP 脚本。权限、加密、事务、幂等、删除、合并、模型硬性路由和复杂组件必须由代码实现。 ## 发布与回滚 实体、字段、表单和视图均有草稿、已发布、废弃状态和修订号。记录必须保留自己使用的 Schema 版本;发布新表单不会改变历史记录含义。PC 可以发布和回滚,移动端只能读取已发布版本。 ## 运行时消费状态 本候选版不再只生成配置表和配置中心页面。Web 与 uni-app 的业务表单已经接入已发布表单运行时: ```text 模块创建/编辑页面 → 根据 moduleCode、usageContext 和 platform 请求已发布表单 → 按 section、displayOrder、visibilityRule 和 readonlyRule 渲染 → 使用语义字段定义生成校验和帮助文本 → 配置服务不可用时回退代码内置字段 ``` Web 通过 `usePublishedFormSchema` 获取 `WEB` 配置;移动端通过 `published-form.ts` 获取 `MOBILE` 配置。移动端接口只提供读取能力,不提供实体、字段、表单或视图的写入方法。 运行时仍遵守以下边界: - 动态表单不能放宽服务端权限和隐私规则; - 隐藏字段不代表服务端不校验; - 只读、必填和显示条件使用受限表达式; - 历史记录保留原 Schema 和表单版本; - 模块专用时间轴、关系图、看板、媒体批注和提案差异仍由专用组件实现。 ## PC 配置中心布局约束 数据模型配置页使用统一的配置中心布局:左侧实体目录保持独立滚动,右侧按“实体类型、字段语义与 AI 策略、表单设计、业务视图”切换。实体目录、定义网格、表单设计器、配置卡片和表格必须复用 `main.css` 中的配置中心共享样式,禁止退化为无间距的按钮和文本堆叠。窄屏下目录与内容自动改为单列,业务字段仍保持可读顺序。 ## 2026-10-01 Web 条件表单事件复核 普通模块表单和自建实体表单在接收子控件值与校验事件时重新查找当前可见绑定,拒绝隐藏、只读、提交中、写入禁用及未知字段的迟到事件。子控件先发出的校验清空与随后值更新必须共同拒绝,避免原模型未改却解除非法原文的提交阻止;阻止期间既有错误不得被清除或替换。普通模块字段映射保留已发布的 `isMultiple`,附件、字典选择和关联编辑器使用原多值合同。 解析错误只对当前可见字段阻止提交;隐藏字段的既有合法业务值不静默删除。字段重新显示后,原解析错误仍须明确修正,可见 JSON 错误不能提交旧模型。新增真实 Vue setup 合成回归覆盖这些行为;服务端字段校验、真实浏览器控件及可访问性验收保持独立。 ## 2026-10-02 表单输入精简 普通模块新建表单只对尚未触碰的字段应用一次已发布非空默认值,保留 false、0 和空字符串,并深拷贝对象;用户清空、手动输入和非法 JSON 原文均阻止后续默认覆盖。编辑快照及其中缺失字段不补新建默认值,配置刷新与条件显现遵循相同边界。原有 null 覆盖回退语义及管理员配置的字段分区折叠规则不变。普通模块与自建实体的可选摘要、时间和来源集中在“更多信息”,新建默认收起、编辑默认展开;折叠保留控件挂载及原始草稿。标题、隐私、领域必填字段和编辑原因继续可见,相关校验错误展开补充信息;不降低服务端必填或隐私规则,不自动推断领域事实。移动普通模块在异步配置返回后、应用默认值前重新比较当前草稿,避免用户在等待期间输入后 dirty 被清除,保留离页保护;摘要错误先展开再滚动定位。 本批为客户端源码候选;合成端口和编译组件回归不等于真实浏览器、设备、API、数据库或 Provider 验收。此类运行均 not_run,Catalog 仍为 24 项 implemented_local、168 项 partial。 ## R08 设置分层(编码阶段) R08 CFG-001:复用实体类型、字段语义与AI策略、关系定义、表单设计、业务视图五标签。实体名称与说明先展示;版本、发布与能力按需展开,统一保存当前实体定义。停用说明和独立删除入口另置,保留权限、版本检查、删除确认与AI提案审核。本轮仅完成客户端调整;真实保存、权限、冲突、双端截图及可访问性由统一验收执行,尚未计为业务验收通过。 ## 2026-09-30 移动交互修复 移动 UIUX 修复(2026-09-30):普通与自建表单共用受限条件执行与分区排序。条件隐藏字段不参加本地必填校验但保留既有数据;只读控件与事件入口都拒绝变更;编辑不补新默认值。校验错误持久显示。实际 H5 与服务端校验验收尚未运行。 ## 2026-09-30 JSON 与字段错误恢复 ModuleFieldEditor 的高级 JSON 输入独立保存原文和解析状态;非法输入就近提示并通知父表单阻止提交,不允许发送上次合法值。明确清空映射为 null;父模型的 Vue Proxy 回流不会覆盖同一 tick 内后续非法原文。共享/自建表单将字段错误绑定稳定编号,提供摘要链接与首错焦点。对象引用支持注入 typed 查询,不将授权错误回退到其他接口。Node/SFC setup handler 测试通过;真实 DOM、键盘和读屏验收 not_run。 ## 2026-10-11 PC 地点复合输入持续标签候选 地点字段与时间、附件共用具名分组和稳定错误焦点锚点。地点名称、详细地址、纬度、经度各有持续标签和独立控件编号;地址与坐标继续为可选成员。四个真实子控件保留原业务 name、description、errorMessage 和 Nuxt 校验事件,字段错误不因分组改动失去 aria-invalid 或说明关联。 仅调整现有地点输入的标签与上下文。字段必填、父表单冻结/只读/条件守卫、隐私、原载荷及清空转换不变;不自动定位、不补坐标、不新增精度或范围校验。模型值不用于标签或编号。实际验证与未运行边界见《2026-10-11-PC地点复合输入持续标签证据》;浏览器、键盘、读屏及真实服务端验收不由组件测试推导。 现有普通父表单 isMissing、自建父表单 missing 与服务端空值判断按整个字段判断:空对象或成员全空的结构化对象仍被视为已存在。本批只保留该历史语义;若要要求非空名称/地址或校验坐标组合,须另立业务要求,不能作为可访问性修复附带改变。
2026-10-02 逐图审计后的界面修复候选
通用新建页面只保留表单提供的 PageHeader,不重复嵌套页面标题与 main;main 由默认布局提供。共享 PageHeader 支持显式 h2,只有 h1 接入路由焦点。不改变字段条件、校验及服务端权限。
本节记录客户端源码修复;本批浏览器明暗主题、实际点击、读屏、原生设备与真实 API/数据库验收仍为 not_run。不会据样式、模板或状态测试提升领域完成度;既有权限、隐私、幂等、版本及回读合同保持独立。
第二批主内容地标复核:共享 ModuleRecordList、ModuleRecordDetail 与 CustomEntityForm 将默认布局 main 内的重复 main 改为普通 div;全部原属性和指令保留,表单字段、提交与权限语义不变。
第七批:2026-10-02 自建表单列跨度与复合字段语义
PC 自建表单的本地字段容器改为与已发布 columnSpan 一致的 12 列网格,窄屏字段显式占满一行;保持字段顺序、条件可见性、只读与提交规则,不改全局表单样式。标题、数据来源和复合字段使用持续可见名称,不能依赖 placeholder 或输入值充当标签。
时间与附件复合字段使用具名分组及稳定外层焦点锚点;每个实际子控件拥有独立编号和关联标签,避免多个控件继承同一个外层 id。七种时间精度均覆盖,附件批注及受控文件选择入口另有对应标签。原 Nuxt 表单上下文须显式传递业务 name、description、errorMessage,真实子控件继续以原字段名触发表单事件,并保留 aria-invalid 与可解析的错误/说明关联;不能仅把 UFormField 换成 fieldset 就称语义完整。
独立复核曾指出初版名称/错误传递回归,补充失败测试后已修正。TemporalValueInput 与 DynamicAttachmentField 增加三个呈现/上下文属性,原模型、上传、安全和提交处理函数保持;不声称四个组件脚本逐字节未改。已安装 Nuxt UI/Reka 的真实编译 SSR 与事件测试 32/32 通过,独立相关六套 82/82 通过,范围重叠不累加。SSR、样式编译与焦点处理函数替身不证明修正后真实浏览器布局、键盘、读屏或上传验收,须等待同提交复测。
第九批:条件 JSON 非法原文恢复
普通模块与自建父表单在当前实例内按字段键保留非法 JSON 原文,既有可编辑守卫的校验事件同时接收错误和可选原文。条件隐藏仍卸载字段;重新显示后,编辑器仅恢复经重新解析仍非法的文字,保持安全错误提示,合法修正或明确清空同时删除缓存。业务 payload 保留原合法值,隐藏、只读、pending 与 writeDisabled 的迟到事件仍被原守卫拒绝。
不为保留原文常驻隐藏控件,不提前挂载从未显示的字典,原文不进入请求或持久化。恢复范围是既有父实例和字段键;新父实例隔离与独立编辑器重置已有回归,同一父实例内切换 initial 记录不在本次保证范围。实际 Vue 内存挂载套件对冻结基线 17 失败/10 通过、候选 27/27,相关八文件 125/125;替身控件不等于浏览器布局、键盘或读屏验收。
正式富文本跨端合同核验(2026-10-25)
richtext 继续使用原字符串字段,实际编辑后才写入 ANENREO_RICH_TEXT_V1 文档封套。旧纯文本的尖括号、Markdown符号和空白保持字面值,禁止猜测成HTML。PC使用Nuxt UI编辑器,H5使用uni-app editor及Delta适配;编辑、预览和详情共用允许的标题、强调与列表语义。只读配置直接呈现阅读器,禁用和迟到初始化事件不能写回。摘要/CSV解码为纯文本,Markdown保留可表达格式,JSON保留完整封套。服务端按解码正文验证必填和长度,非法结构失败关闭。字段默认值和绑定覆盖值的JSONB读取保留字符串标量,避免年份字符串被二次JSON.parse改成数字;数据库列类型不变、无迁移。
证据:_work/handoff/uiux-production-20261025-phase2;逐项范围见production-70-ledger.json,测试、截图和独立回读分别留证。
2026-10-25 富文字段安全错误
双端富文字段的合同/编辑器异常统一经正式共享presentError生成安全中文。原Error.message、桥内部路径及异常正文不进入DOM,也不通过validation事件传播给父表单。失败阻止错误输入写回,保留原合法字段与当前稿;纠正后恢复原版本化合同,只读、禁用及初始化/卸载保护不改。
未知错误使用固定保稿说明,权限等稳定分类沿用共享语义。完整SFC先红后绿,移动工程真实编译器补充3项通过;编辑器/传输仍为受控端口,第二轮构建不替代真实浏览器、原生editor或设备验收。