chenxing
|
dc76574118
|
feat(t10-admin): 管理员体系——校级管理员+单表单管理员+锚点退役
build / build-push (push) Successful in 2m12s
- 新增 school_admin/form_admin 两表(sql/t10_admin_domain.sql,含 answer.submitter_sch_id 加列)与 AdminDomainController/AdminDomainService/SchoolUserTreeService
- DataScopeService 范围体系按 P80 验收口径落地:入口只认模块行、查询域=会话校、两表只升范围;新增 SchoolScopeImplementor
- fc:scope:all / SCOPE_ALL_CUSTOM_ID / anchorCustomIds / MODULE_DICT 锚点全链路退役,全仓引用归零;h2 登记脚本 6→5 行(快应用段逐字未动)
- AnswerScopeQueryBuilder 校域不变式:answer.sch_id 恒=会话校,基础过滤 sch_id+app_code+code+is_deleted 不变
- FormAdminGuard:targetSchId=0(基础表单)仅超管可维护;FormAdminController/AnswerReadController 等按管理员范围收口
- 测试基线 190→219/0/0/0:DataScopeServiceTest 22、FormAdminGuardTest 14、AdminScopeIT 8、AdminDomainIT 10、AnswerReadIT 改写 1、FormBaseControllerTest 7 等
|
2026-10-15 20:25:03 +08:00 |
|
chenxing
|
bf39c220f2
|
test(perf)+sql(h2): T9 压测探针与 UserBase 登记交接脚本
build / build-push (push) Successful in 1m31s
Perf200kProbe(20 万答卷/78 万索引行,独立库 bsch_formcenter_perf):
- V10 量化:列表首屏 p95=22ms、三条件筛选 p95=313ms、深分页 keyset p95=31ms、
统计 p95=1~334ms、导出 2 万级 4.1~8.1s(冷缓冲池首跑 22.1s 已如实记档)
- 铁律取证:org.hibernate.SQL 日志抓真实语句——第一段只 select id、不含 values_json;
翻页谓词是 answer.id<游标;EXPLAIN 显示首屏/计数走 idx_answer_form_time 且 using_index=true
- P26:8 线程×250 并发实测 answer_no 重号率=1392/2000(69.6%,"不限次+报名号"组合)
- P37:新答卷后 cached=true、升版后 cached=false(铁律④语义与实现一致)
- P35/P31:information_schema 复核索引基数与 ROW_FORMAT=Dynamic(本机 8.0.45)
- 类名不带 Test/IT → 不进 mvn test 门禁(190 用例仍是快门禁),手点 -Dtest 才跑
PerfTreeCallsProbe(控制器形状,复用同一份数据):
- P44 请求级取树次数:列表/详情/导出=2、统计=3、筛选候选=1(P44 的"1~2 次"上界在统计路径实测为 3)
- V10 请求级延迟:筛选 p95=163ms、导出 2297ms/1.15MB
- P36 升版补建实测:19,600 行表单的发布=373,272ms 且本次补出 0 行——
P36 记档的"2 万级秒级"不成立,N+1 逐行探测是主因(数字交验收轮裁决是否触发 publish 处改造)
sql/h2_userbase_app_and_modules.sql(H2 + 第一个快应用登记交接件):
中心应用六条模块行(手册 §2.2,含 path 空 fc:scope:all 锚点)+ 快应用五条模块行
(方案 §6.2 checklist,导入/导出为 path 空锚点)+ 组/角色授权与开通 + 验收查询 + 回滚段。
AI 不代跑(沿 flow-center 先例;H2 既定路径是超管在管理端录入,脚本为批量/复核形态)。
步骤 3.5 显式记录"快应用数据视图的后端守卫仍扫中心树"这一过渡口径(T9 报告 P78 附注)。
docs/T6-report.md 已按 P69 从本仓 docs/ 挪至 form-center/docs/(本提交不含该文件)。
|
2026-10-15 12:57:32 +08:00 |
|
chenxing
|
12a8df4fef
|
test(my): 我的填写六端点单测闭环 P70/P75(my 面实现随批入库)
MyAnswerIT 12 例(真库 @Transactional 回滚,沿 T3/T4 IT 惯例):
- 身份全会话推导:六端点首参恒为 BoaUser、入参无 id 型身份位、请求体只有
answerId/values/summary;未登录一律 UNAUTHORIZED;跨校同 uuid 读不到(V17)
- 越权无探测面:他人答卷与"不存在"同码同形(PARAM_ERROR + 同一句话,仅 uuid 不同);
非提交人改/删 FORBIDDEN;被代填人可读不可改(V29 的我的面形态)
- 软删释放名额:本人删自己的行 → isDeleted=1、索引行清空、名额释放、可重填,
已删行在列表/两视图/详情四处置为不可见(V30/V32 我的面半边)
- 两视图谓词分离:代填行只进操作人 submitList 与被代填人 aboutList,
自填行(subject=本人)两视图都在;零模块授权学生两视图照常(与数据管理面相反)
- myDetail 归属:提交人与被代填人都可读,返回钉住版本 groups + 值文档,外层无库内自增 id(V5);
升版后老行仍按 v1 呈现与校验(P20)
- V14 结构半边:本面无任何改状态端点(映射表断言死锁为六条)
- AnswerReadService.myDetail javadoc 修正:读路径没有 editable 字段,
前端按 ItemView.submitterId 判 isMine,拒绝在 editBySubmitter/softDeleteBySubmitter(P75 附带项)
门禁:mvn -B -o clean test → Tests run: 190, Failures: 0, Errors: 0, Skipped: 0(原 178 + 本批 12)
|
2026-10-15 10:29:39 +08:00 |
|
chenxing
|
a4b185b1bb
|
docs(T5): 回填 §4 推送与 CI 证据(front run 1496 / service run 1497 均 completed/success)
build / build-push (push) Successful in 54s
|
2026-10-14 20:42:48 +08:00 |
|
chenxing
|
2c68d6b9f4
|
feat(t5-shell): T5 前端壳执行报告 + service 两处验收遗留小改
build / build-push (push) Successful in 2m19s
- 勘误③真落:docs/T3-report.md §2 V32「两个不同教师」补注(实为两个 roleId=7 操作者,教师(1) 按 P21 无代填权)
- P47 收紧:FormModuleKeys.anchorCustomIds 只认 path 空节点的 customId,DataScopeService.hasScopeAllAnchor 切过去;补「带 path 的导航行误配 fc:scope:all 不升级范围」用例(mvn -o clean package 178 例全绿)
- docs/T5-report.md:T5 做了什么 / 逐条自验证据 / 问题单 P48~P53 / 两仓推送与 CI
|
2026-10-14 20:36:31 +08:00 |
|
chenxing
|
c0a0df47c1
|
docs(T4): §4 补记回填提交 2224523 的 CI run 1494(回填到此为止,不再追加自指提交)
build / build-push (push) Successful in 52s
|
2026-10-14 19:08:27 +08:00 |
|
chenxing
|
2224523a3f
|
docs(T4): 回填 §4 推送与 CI 证据(run 1493 completed/success)
build / build-push (push) Successful in 52s
docs-only:只改本文,不动任何构建输入;同一提交说明 local-debug/ 冒烟脚本不在本仓工作树
(仓库根是 service/),以及 CI 取证改从已存凭据读 Gitea Actions API(git credential fill 在非交互会话会挂)。
|
2026-10-14 19:06:18 +08:00 |
|
chenxing
|
49b095eb81
|
feat(read): T4 后端·检索统计+数据范围+导出
build / build-push (push) Successful in 1m18s
四条读出路径(列表/详情/统计/导出)与管理动作行级把关共用 AnswerScopeQueryBuilder
一个谓词构造器(契约 §8 红线);数据范围按 SysRoleEnum 矩阵×audience 解析 +
customId=fc:scope:all 扫描授权模块树,多来源取并集、全不命中回落仅本人提交。
四铁律落地:两段式列表禁 SELECT values_json、keyset 仅提交时间序(游标对外是 uuid)、
覆盖索引化(新增 idx_answer_form_time)、统计缓存键含 form_uuid+version 且仅升版失效+短 TTL。
T3 验收裁决前置三项:P25 answer.form_uuid 精确钉版溯源(删平台级回退启发式)、
P33 代填 subject 存在性+同校(SubjectDirectory 策略接口,生产走 /oapi/user/byId)、
P34 附件 key 与 store_key 一致性比对;P21 FormAdminGuard 整体替换为"授权模块集"口径
(ModuleTreeSource 策略接口,与 scope 解析共用同一棵树)。
新增对外读接口 GET /oapi/form/schema(内联 options+valueSchema)与 /oapi/form/answer
(钉住版本 schema+值文档);导出 easyexcel 流式同步响应,选项列显 label、附件列显 fileName。
自验:mvn -B -o clean package 177 条全绿(本轮新增 56,23 条打真实 MySQL),
覆盖 V9/V11/V23/V27/V28/V37/V42 + V30 读侧半边 + V39 范围半边;
V9 以"发布时补建索引行"实现(方案未指定机制,记 P36)。详见 docs/T4-report.md(问题单 P35~P46)。
|
2026-10-14 19:00:15 +08:00 |
|
chenxing
|
b2778e5d86
|
docs(T3): 回填 §4 推送与 CI 证据(run 1481 completed/success)并补 P33
build / build-push (push) Successful in 52s
P33 是本轮自查出的真实缺口:subject_id 只校验了授权与校域,未校验存在性
(要查 UserBase 的人,与 T4 的 SDK 调用链一起做);当前它是未经证实的引用。
|
2026-10-14 16:53:05 +08:00 |
|
chenxing
|
bff0fb15fa
|
feat(answer): T3 后端·答卷核心——提交/幂等/限次/索引/软删留痕 + 平台标准版上传
build / build-push (push) Successful in 52s
答卷域是"校验只写一遍、索引只有一份"这条选型(D2 模型 2b)的兑现处,本轮把它一次落齐。
- 提交链路按语义排死顺序:钉版解析→截止→幂等命中→subject 授权→值校验→附件同校归属
→fill_quota 占位→落 answer→写索引。幂等必须在限次之前(重放那条本就占着名额),
限次不做先 count 再插而是事务内撞 uk 即拒(并发下 count 靠不住,方案 §5.4)
- 钉版与定义域共用同一条 resolve 遮蔽实现;升版窗口旧版仍可填并钉旧版(P20),
请求体不含 version/schId/submitterId——身份结构性不可注入(V17)
- FormValueValidator 按契约 §3 逐类校验值形状:date 严格 YYYY-MM-DD 且必须是真实日期、
number 空值只认 null、选项值取内联 ∪ allowedValues(含软删条目)、
附件只认 {id,fileName,key} 且拒绝对 URL/跨目录 key
- answer_index 只写显式 searchable 字段、多值一行一个、v_str 截 191;编辑按钉住版本重建,
软删同步删行且释放 fill_quota 名额;留痕只增不改,改状态无任何转移规则校验(V15)
- 上传模块自写平台标准版:FILE_PATH 三层兜底链、随机存储名、平台 15 项黑名单+svg、
≤50MB(并按 P12 显式配 spring.servlet.multipart,默认 1MB 会挡掉合法附件)
- 数据面刻意不建列表/详情/统计/导出读接口:四条读出路径必须共用 T4 的 scope 构造器,
现在写一个无范围过滤的详情接口就是给 T4 留后门
- T2 已验收文件仅按裁决改动:FormAdminGuard 收紧为 {2,7}(P21)并加 canManage;
FormDefService 抽出 resolvePublished/新增 pinnedForData(数据面溯源含软删表单);
FormRepository 加数据面取域查询;application.yml 只加 multipart 两行
自验:mvn -B -o clean package 绿(121 测试,本轮新增 54 条含 39 条打真实 MySQL,
V32 并发面用双线程非回滚 IT 取证),逐 V 证据与问题单 P23~P32 见 docs/T3-report.md
|
2026-10-14 16:50:07 +08:00 |
|
chenxing
|
90f6b0a767
|
docs(T2): 回填 §4 推送与 CI 证据(service run 1468 completed/success,front 零改动)
build / build-push (push) Successful in 1m46s
同时补记 CI 取证方式(本地凭据调 Actions API,凭据不回显不落盘)与
local-debug 目录不在两仓工作树内的事实。
|
2026-10-14 15:27:20 +08:00 |
|
chenxing
|
03f6a971c3
|
feat(definition): T2 后端·定义域——版本模型、schema 校验器、选项字典与另存副本
build / build-push (push) Successful in 2m22s
定义与答卷物理分离的第一步:把"契约"落进可执行代码,让后续答卷域只需消费不必再解释。
- 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
|
2026-10-14 15:23:35 +08:00 |
|
chenxing
|
5c5abe1e91
|
docs(T1): 回填 §4 推送与 CI 证据(service run 1456 / front run 1457 均 success)
build / build-push (push) Successful in 51s
|
2026-10-14 12:23:44 +08:00 |
|
chenxing
|
8c218b7271
|
feat(skeleton): T1 后端工程骨架——fork flow-center 模板
build / build-push (push) Successful in 44s
- 包 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 条问题单
|
2026-10-14 12:21:10 +08:00 |
|