定义与答卷物理分离的第一步:把"契约"落进可执行代码,让后续答卷域只需消费不必再解释。 - form/form_version 头表+版本行:已发布行零写路径(改版=v+1 新行,老行逐字节冻结), 升版期间头表指针不动,使契约 §5 的钉版与 §3.2 的两层缓存声明天然成立;uuid 建草稿即生成 - FormSchemaValidator:19 项属性白名单、14/11 控件、options 只认 {label,value} 数组或 dict:{code} 引用(字符串数组被拒)、searchable 只出显式声明字段、跨版本同 key 不得换 type (否则 answer_index 分类型落值的语义与"删字段后历史仍可筛"当场失效) - 选项字典两级:管理面同层精确匹配(校级改不到平台级)、解析面 {会话校,0} 且本校遮蔽不回落; value 物理不可变而 label 可改;软删条目仍进提交放行集;引用是活引用、只在读路径内联展开 - 表单级配置(audience/fill_limit/deadline 补 23:59:59/报名号/状态定义)留在头表,不随版本快照 - 另存为副本:新 code+新 uuid+version 1、schema 深拷贝且字典引用随行,源表只读 - 出入参不出现库内 id;手写 DDL 落 sql/t2_definition_domain.sql 并按 MySQL 5.7 复核(无 native SQL) 自验:mvn -B -o clean package 绿(67 测试,含 27 条打真实 MySQL 的 IT),逐 V 证据与 9 条 实现期问题单见 docs/T2-report.md
- 包 com.yunhai.formcenter:config / controller(api|oapi) / entity / enums / model / repository / service / common - pom:剥 aviator、加 easyexcel 3.3.2、finalName=form-center、surefire 收 *Test+*IT(CI 不跑单测→本地 mvn test 是门禁) - FormBaseController 平移 FlowBaseController:/api/base/GetUserInfo + GetUserMod,新增可选 target appCode(H4 未上线→空树+warn,不回落本应用树) - CORS 与 yml 分层照搬:jar 内只留本地最小默认,端口/ctx/DB/SSO/redis 由 projman env 注入;notice 的 upload-path 容器锚定教训注释原样抄入,FILE_PATH 本地兜底键保留 - 自验:mvn -o clean package BUILD SUCCESS + 7 单测全绿 + 本地启动 /actuator/health 200(/api/* 302 CAS 墙、/oapi/* 401 验签墙) - docs/T1-report.md:产出说明 + 13 条问题单