You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

10 KiB

岗位与企业展示字段 · 交付报告(2026-10-19 验收更新)

批次:job-company-display-fields;关联简历归属、文件名兼容和评分测试时钟修复。 结论:冻结的本地后端工作区快照验收通过;尚未提交、推送、发布或完成线上复验。本文替代此前报告中的过期状态,不把本地结果等同于线上结果。

0. 本次更新与历史结论纠正

  • 全量验证已从历史失败状态更新为 3464 项通过、0 失败、0 错误、0 跳过。
  • benefits 的归一化约束已在静态与运行时契约中一致表达,不再存在此前标注的 STATIC_ONLY_CONSTRAINTS 差异。
  • 福利请求限制按 trim、去重后的结果计算,不能用原始请求的 maxItems: 20 或原始元素的 maxLength: 40 代替。
  • 历史报告、旧 JAR 和旧黑盒产物不作为本次验收证据;最新证据目录见第 3、5、6 节。
  • 历史上传接口 500 的根因仍未证实。当前验证未复现,不将其直接归因于旧副本不一致。

1. 交付范围与身份

  • 原工作区:C:/Users/15642/Desktop/zhilai,后端目录为 mydreamjob-server。
  • Git 基线:1cbadc3e18a786ef642b0d329adde6b173c7b2ac;分支:fix/mysql57-module-migrations-20261009。
  • 验收副本:D:/Acceptance/qsp-final-20261019/app。验收对象是包含未提交改动的冻结快照,不是仅 checkout 上述 HEAD 的代码。
  • 主要内容:企业规模与岗位展示字段、公开企业摘要、严格整数绑定、V57 迁移、契约及演示工具安全测试。
  • 关联修复:本人/企业/聊天简历来源归属、中文文件名兼容、评分测试固定时钟。详见 docs/resume-ownership-hardening-20261016.md。
  • 新增源码、测试和迁移存在未跟踪文件,提交时必须使用精确白名单,不能只提交已跟踪 diff,也不能 git add .。
  • 精确验收源文件清单与哈希:D:/Acceptance/qsp-final-20261019/evidence/source-manifest-current.csv;契约和工具清单:同目录 contract-tool-manifest.csv。

2. 实现与字段规则

  • 企业新增 companySize;岗位新增 experience、education、benefits、salaryMonths、workLocation。详情及列表按对应 DTO 下发,公开 company 严格使用七字段白名单。
  • companySize 创建与更新共用归一化:创建缺省/null 存 NULL,更新缺省/null 保持原值;空白清空,非空 trim,超过 40 字符返回 400,不截断。
  • salaryMonths 仅接受 JSON 整数 1—24。小数(含 1.0)、数字字符串、布尔、数组、对象、超 int 范围均返回 400;仅字段级严格反序列化,未修改全局 Jackson 强制转换规则。
  • benefits 逐项 trim、拒绝空白项,trim 后单项最多 40 字符,去重保序后最多 20 项。21 个相同标签可归一为 1 项;21 个不同标签拒绝。
  • 福利创建缺省/null 存 NULL;更新缺省/null 保持原值;[] 清空。读取 NULL 返回 []。
  • 岗位列表按页批量查询企业,查询预算测试覆盖空页及分页场景,避免逐岗位查企业的 N+1。
  • 只提供字段和接口,不会自动生成前端的投递、沟通或评价按钮,也不会补造评分或评价。

3. 测试结果与数量口径

验证范围 最新结果
全量 clean verify 3464 项,失败 0,错误 0,跳过 0;BUILD SUCCESS
真实 HTTP 黑盒 简历归属 32 + 来源归属与文件名 26 + 岗位企业展示 48 = 106 项通过
重启验证 简历字节与授权 4 + 企业岗位字段 2 = 6 项通过
静态/运行时契约 129 项通过;重启后重复通过,不重复累计
契约反向测试 13 项通过(含正确基线及错误变异拒绝)
工具安全验证 隔离 MySQL 61 + 容器生命周期单测 3 = 64 项通过

全量日志:D:/Acceptance/qsp-final-20261019/logs/full-verify-current.log。本次未使用 skip/ignore 参数,测试报告保留在验收副本的 target 中。

此前 3439 项快照不含后续文件名修复与恢复的三条正式福利 HTTP 测试等变更;源文件差异清单为 evidence/changes-since-3439-snapshot.csv。不同快照数字不得混用。未完成的早期执行日志不计入当前通过结果。

评分测试时间依赖已在测试配置中使用固定 Clock,与测试数据同一时刻,并覆盖 30 天边界;未修改生产评分规则。诊断探针保留为历史证据,不加入正式源码全量测试的计数。

4. MySQL 迁移与存储决策

  • V57 为新增迁移,包含 companies.company_size 及岗位五个展示字段对应列;历史 V1—V56 未改。
  • 最新全量中的 JobCompanyDisplayFieldsMysqlMigrationTest、JobCompanyDisplayFieldsMysqlValidateTest 在真实 MySQL 容器执行,不用 H2 代替,也未跳过。
  • 测试覆盖 MySQL 5.7/8 的旧库升级、空库迁移、旧数据保留、新字段写读与 ddl-auto=validate。
  • benefits_json 保持 TEXT,沿用仓库兼容性决策;内容仍是服务层控制的 JSON 数组。未宣称使用 MySQL 原生 JSON 列,也未擅自改历史列类型。
  • MySQL 5.7 的既有兼容迁移钩子和工具链方言/版本警告仍需在目标部署环境关注;本地验证不替代线上迁移核对。

5. 最新验收 JAR

  • 路径:D:/Acceptance/qsp-final-20261019/app/target/mydreamjob-server-0.0.1-SNAPSHOT.jar。
  • SHA256:60A9EC9340C83E3E748DD6144473C09BB76BC967A7DA5481296F0FF6B715DF46。
  • 构建方式:冻结快照完整 clean verify 成功产生制品,不是跳过测试的 package。
  • 身份证据:evidence/jar-sha256.csv、source-manifest-current.csv、contract-tool-manifest.csv。
  • 发布时须核对实际提交及 Jenkins 构建身份;JAR 哈希差异本身不能证明源码错误或一致,需结合源码清单。

6. HTTP 黑盒与重启

  • 岗位企业 48 项覆盖字段一致、缺省/清空语义、严格整数绑定、公开摘要白名单、访问控制、福利归一化与失败无部分更新。
  • 最新岗位结果:evidence/display-full.json;日志:logs/display-blackbox-complete.log。先前 40 项执行已被这份 48 项完整结果替代,不另计。
  • 简历结果:evidence/ownership-blackbox-result.json、evidence/reader-fix-blackbox-result.json。
  • 重启后检查文件字节一致、授权/撤销状态保持、岗位企业字段持久化;日志为 logs/resume-persistence.log、logs/display-persistence.log。
  • 全部使用隔离环境合成账号和 PDF;未访问真实用户简历或生产数据。

7. OpenAPI 与福利归一化契约

  • 静态文件:docs/openapi-rc.json;静态检查:docs/verify_openapi.py。
  • 运行时为 OpenAPI 3.1,可空类型使用类型联合(如 type: [array, 'null']),不得依赖 3.0 的 nullable 写法。
  • 福利请求的 x-normalization:trimItems=true、deduplicate=true、rejectBlankItems=true、maxItems=20、itemMaxLength=40。
  • 此扩展描述服务端归一化规则,不是通用 JSON Schema 自动验证关键字。前端若实现校验,应按相同步骤归一化后判断,不应对原始数组直接限 20 项。
  • 对照脚本要求归一化规则、字段类型、可空性、响应引用及七字段白名单一致;错误变异必须非零退出,不允许宽松静态独有豁免。
  • 最新证据:evidence/openapi-compare.json、evidence/openapi-after-restart.json,日志 logs/contract-negative.log、logs/static-openapi-frozen.log。

8. 演示数据与工具边界

  • 工具:docs/tools/b01_demo_display_data.py;默认 dry-run,写入/清理需要显式参数。
  • 只允许明确的回环地址、端口 3308 和白名单演示库;非白名单目标在连接前拒绝。该工具不能直接用于线上补数。
  • 工具账本绑定批次、真实服务器身份、库名、资源 ID、演示键及指纹;同时检查实际用户/企业身份和岗位父子关系,禁止仅凭名称或手机号认领。
  • 冲突预检后再写入;业务写入与账本登记同事务。清理仅依据精确归属及依赖检查,遇外部依赖拒绝,不关闭外键或级联清除。
  • 安全测试不得删除同名既有容器,只清理本次创建并记录 ID 的测试容器。
  • 数据为 3 家虚构企业、12 个明确标记的演示岗位,无真实个人资料及伪造评分、评价。本轮未向线上导入。
  • 最新工具结果:evidence/tool-safety.json、logs/tool-safety.log、logs/tool-container-guard.log。

9. 前端交接

参见 docs/batch-job-company-display-fields-frontend-handover.md。需要前端工程师按目标环境实际响应接入新字段并处理 null/空数组;不能假定本地修复已经发布到服务器。

该说明保留字段映射、单位、更新语义和示例,补充福利归一化及本地/线上边界。简历权限和文件名规则另见简历修复说明,不在岗位说明中混入账号口令。

10. 尚待完成与风险

  • Git 精确范围确认、提交、推送、Jenkins 发布及线上小范围复验均未执行。
  • 前端代码与目标页面本轮未修改、未重新验收;字段映射及账号切换体验须交前端工程师验证。
  • 历史缺失展示字段不会自动补录;需要授权后由业务录入真实资料,不能把演示数据作为真实招聘信息。
  • 历史污染简历引用、已生成快照未在线审计或自动修复;不得据本地用例宣称线上历史记录已全部清理。
  • 旧上传 500 根因仍未证实;当前不复现不等于已证明原因。
  • 当前仅完成本地后端验收,不宣称线上、前后端完整联调或生产数据验收通过。

11. 边界与证据保留

  • 前端未改;两处受保护文件保持既有内容,不还原、不混入本批提交。
  • 未暂存、提交、推送、操作 Jenkins 或连接生产数据库;未使用真实账号和简历。
  • 未弱化/跳过测试、改历史迁移或执行 Docker 全局清理。
  • 最新验收应用与本轮服务容器已停止;测试资源和日志保留,不删除既有容器或卷。
  • 汇总证据:D:/Acceptance/qsp-final-20261019/evidence/acceptance-summary.json。旧 logs2、logs3、logs4 资料作为历史记录保留,不作为当前验收结论。