gz-oarms/findings.md

10 KiB
Raw Blame History

OARMS 命名规范审查 — 发现记录

前置发现

全局性问题

1. 前端 API 参数命名snake_case vs camelCase

严重程度: P0 — 前后端无法对接

前端 API 文件中参数名使用 snake_casescreen_namepage_numconfig_status),而后端 Entity/Query 属性使用 camelCasescreenNamepageNumconfigStatus)。

Jackson 默认序列化/反序列化使用 camelCase前端发 snake_case 参数后端收不到。

影响文件:

  • gz-oarms-web/src/api/BS-大屏基础库域/BS-1-大屏基础信息管理.js
  • gz-oarms-web/src/api/AM-广告监控域/AM-1-广告画面录屏设置管理.js
  • gz-oarms-web/src/api/CW-内容预警域/CW-3-监测线索生成.js
  • 全部 10 个 API 文件

2. 前后端 API 路径不一致

严重程度: P1 — 路径不匹配导致 404

前端路径 后端路径 差异
/api/screens/query /api/screen/query 单复数
/api/recording-configs/query /api/recording-config/query 单复数
/api/cw/evidence-records/query /api/evidence-record/query 域前缀 + 单复数
/api/cw/monitoring-clues/query /api/monitoring-clue/query 域前缀 + 单复数

Phase 1后端 DB→Entity→DTO 全链路审查( 完成)

P1-1DDL CREATE TABLE 表名小写(全部 13 个 DDL 文件17 张表)

严重程度: P3 — DM8 规范要求大写,但 DM8 实际大小写不敏感,不影响功能

所有 CREATE TABLE 语句中表名使用小写,而同文件内 COMMENT ON / CREATE INDEX 已大写。

DDL 文件 需修改的表名
V1.0.0__BS_screen_ddl.sql bs_screenBS_SCREENbs_screen_historyBS_SCREEN_HISTORY
V2.0.0__LB_law_ddl.sql lb_law_clauseLB_LAW_CLAUSE
V3.0.0__AM_recording_config_ddl.sql am_recording_configAM_RECORDING_CONFIG
V4.0.0__AM_recording_task_ddl.sql am_recording_taskAM_RECORDING_TASKam_alert_notificationAM_ALERT_NOTIFICATION
V5.0.0__AM_monitor_record_ddl.sql am_monitor_recordAM_MONITOR_RECORD
V6.0.0__MR_monitoring_rule_ddl.sql mr_monitoring_ruleMR_MONITORING_RULEmr_rule_law_clause_relMR_RULE_LAW_CLAUSE_RELmr_rule_operation_historyMR_RULE_OPERATION_HISTORY
V7.0.0__CW_evidence_ddl.sql cw_evidence_recordCW_EVIDENCE_RECORDcw_evidence_status_historyCW_EVIDENCE_STATUS_HISTORY
V8.0.0__CW_evidence_rule_relation_ddl.sql cw_evidence_rule_relationCW_EVIDENCE_RULE_RELATION
V9.0.0__CW_monitoring_clue_ddl.sql cw_monitoring_clueCW_MONITORING_CLUEcw_clue_generation_logCW_CLUE_GENERATION_LOG
V10.0.0__CW_clue_transfer_ddl.sql cw_clue_transfer_recordCW_CLUE_TRANSFER_RECORDcw_transfer_operation_logCW_TRANSFER_OPERATION_LOG

P1-2多余 @TableField 注解2 个 Entity6 处)

严重程度: P3 — 不影响功能,冗余代码

属性名与列名完全相同时MyBatis-Plus 自动映射,@TableField 注解多余。

Entity 文件 字段 @TableField 值 原因
ScreenEntity address "address" 完全相同
ScreenEntity district "district" 完全相同
ScreenEntity advertiser "advertiser" 完全相同
ScreenEntity longitude "longitude" 完全相同
ScreenEntity latitude "latitude" 完全相同
RuleOperationHistoryEntity operator "operator" 完全相同

P1-3命名一致性审查通过项

检查项 结果 详情
DDL @TableField 映射 全部匹配 17 张表,约 150 个字段全部正确
Entity → DTO 属性名 全部匹配 VO/Query/Req 与 Entity 属性名一致
DDL COMMENT/INDEX 大写 全部大写 所有 COMMENT ON 和 CREATE INDEX 标识符大写
SuperEntity 公共字段 无重复声明 所有继承 SuperEntity 的 Entity 均未重复声明
@JsonFormat 使用常量 全部使用 DateUtil 无硬编码格式字符串

Phase 2后端 Controller API 路径审查( 完成)

P2-1基础路径单复数不一致

严重程度: P2 — 风格不一致,影响可维护性

Controller 当前路径 问题 建议
MonitoringRuleController /api/monitoring-rules 唯一使用复数 /api/monitoring-rule
其余 9 个 Controller /api/screen 单数 保持一致

P2-2低优先级风格问题

Controller 问题 建议
ScreenController district/list 两段路径 districts
MonitoringClueController clue-preview 与基础路径语义重复 preview
ClueTransferController targets/districts 两层嵌套 target-districts
ClueTransferController clues/{clueId}/disposal-feedback 路径变量 disposal-feedback?clueId=
ClueTransferController pending-clues/query 子资源前缀 pending-query
EvidenceRuleRelationController query-by-evidence 复合路径 list-by-evidence

P2-3审查通过项

  • 全部 10 个 Controller 路径使用 kebab-case无驼峰/下划线混入
  • 核心 CRUD 路径query/detail/save/update/remove高度一致

Phase 3前端 API 文件审查( 完成)

P3-1API 路径全部不匹配(严重)

严重程度: P0 — 前后端路径不一致,所有接口 404

根因: 前端使用 RESTful 风格(复数 + 路径参数 + PUT/DELETE后端使用扁平 POST 风格(单数 + 查询参数/RequestBody

问题模式 涉及模块 示例
资源名单复数 全部 10 个 /api/screens vs /api/screen
HTTP 方法不匹配 全部 PUT/DELETE vs POST
路径参数 vs 查询参数 全部 GET/PUT/DELETE /api/screens/${id} vs /api/screen/detail?id=
CW 域多了 /cw/ 前缀 CW-1/2/3 /api/cw/evidence-records vs /api/evidence-record
前端用路径嵌套 CW-4 /api/clue-transfer/transfer-records/query vs /api/clue-transfer/query

统计: ~58/64 个端点路径不匹配

P3-2JSDoc 参数名全部 snake_case严重

严重程度: P0 — 前端发 snake_case 参数,后端收 camelCase字段无法映射

全部 10 个 API 文件的 JSDoc @param 注释和实际参数使用 snake_case而后端 Entity/Query/Req 属性为 camelCase。

高频不匹配字段(全局):

前端 snake_case 后端 camelCase 出现次数
page_num pageNum 10 文件
page_size pageSize 10 文件
screen_name screenName 6 文件
start_time / end_time startTime / endTime 5 文件
evidence_id evidenceId 4 文件
clue_id clueId 3 文件

P3-3JS 函数参数名 snake_case15 处)

严重程度: P1 — 不影响运行,但不符合 JS camelCase 规范

文件 snake_case 参数 应改为
CW-1 evidence_id×4monitor_record_id×2 evidenceIdmonitorRecordId
CW-2 evidence_id×3 evidenceId
CW-3 evidence_id×1clue_id×2 evidenceIdclueId
CW-4 clue_id×2transfer_record_id×2district_codedepartment_id camelCase

P3-4前端调用不存在的后端接口6 个)

前端函数 URL 模块
queryRuleOperationHistory /api/monitoring-rules/${id}/histories MR-1
getEvidenceStatusHistory /api/evidence-records/${id}/status-history CW-1
getMonitorRecordEvidenceContext /api/monitor-records/${id}/evidence-context CW-1
getMonitorVideoPlayUrl /api/monitor-records/${id}/video/play CW-1
updateEvidenceRecordStatus /api/cw/evidence-records/${id}/status CW-2
getClueGenerationLogs /api/cw/monitoring-clues/${id}/generation-logs CW-3

Phase 4前端页面组件审查跳过

前端页面组件的命名问题本质与 Phase 3 的 API 文件一致(表单字段绑定来源于 API 参数。API 层修复后页面同步调整即可。


Phase 5汇总修复建议

修复策略决策

核心问题:前后端 API 路径和参数命名存在系统性不一致。

必须选择一个方向统一

  • 方案 A推荐:前端适配后端 — 修改前端 API 文件的路径和参数名为后端实际值
  • 方案 B:后端适配前端 — 修改后端 Controller 路径和参数接收方式

推荐方案 A 的理由

  1. 后端 85 个问题已全部修复并端到端测试通过,不宜大改
  2. 前端 API 文件仅 10 个,修改范围可控
  3. 后端的扁平 POST 风格已在项目中统一,改后端需动 11 个 Controller

修复清单(方案 A

1. 修复前端 API 路径10 个文件,~58 处)

每个 API 文件需:

  • 资源名改为单数(screensscreenrecording-configsrecording-config
  • 移除 /cw/ 前缀CW-1/2/3 的文件)
  • GET 详情改为查询参数(/${id}?id=
  • PUT/DELETE 改为 POST
  • 路径参数改为 RequestBody

2. 修复 JSDoc 参数名为 camelCase10 个文件,~90 处)

每个 @param 中的 snake_case 字段名改为 camelCase

  • page_numpageNum
  • screen_namescreenName
  • evidence_idevidenceId
  • 等等

3. 修复 JS 函数参数名CW-1/2/3/4 的文件15 处)

  • evidence_idevidenceId
  • clue_idclueId
  • transfer_record_idtransferRecordId
  • district_codedistrictCode
  • department_iddepartmentId

4. 修复后端 Controller 单复数不一致1 处)

  • MonitoringRuleController: /api/monitoring-rules/api/monitoring-rule

5. DDL CREATE TABLE 表名大写13 个文件17 张表)

纯规范修复DM8 大小写不敏感,不影响功能。

6. 清理多余 @TableField 注解2 个 Entity6 处)

纯代码整洁,不影响功能。

不修复项

项目 原因
前端调用不存在的 6 个接口 属于功能缺失(需评估是否需要实现),非命名问题
ClueTransferController 多层嵌套路径 功能正常,低优先级风格问题
前端页面组件命名 API 层修复后页面自然跟随