etms/CODE_REVIEW_REPORT.md
liyuchen d9fba9a316 Remove organization references (de-identify)
- Replace CETC54 references with ETMS
- Replace com.cetc54 package with com.example
- Rename cetc54 directories to etms
- Replace CECT54.WebUI to ETMS.WebUI
- Replace organization names (中国电科54所 -> XX公司)
- Replace internal system URLs (cetc54.com -> example.com)
2026-04-16 17:14:56 +08:00

14 KiB
Raw Permalink Blame History

JCDP 项目代码审查报告

审查时间2026-04-16 审查范围SQL 映射文件、FreeMarker 模板、JavaScript、CSS 审查依据CODE_REVIEW_GUIDE.md


📊 审查概览

维度 数据量 🔴 阻塞 🟠 严重 🟡 建议 💭 挑剔
SQL 映射文件 54 个 0 9 15+ 10+
FreeMarker 模板 320 个 0 5+ 30+ 50+
JavaScript 文件 97 个 0 6 12+ 20+
CSS 文件 15 个 0 0 3 5+

总体评价:代码整体质量中等,存在一定历史包袱。主要问题集中在废弃代码未清理、全局变量污染、同步 AJAX 请求等方面。未发现严重安全漏洞SQL 注入、XSS


一、SQL 映射文件审查结果

1.1 🟠 严重问题:废弃代码未清理

问题描述:发现多处带"备份"、"以前"标记的废弃 SQL 定义,这些代码应该被删除。

发现位置

文件 废弃 SQL ID 行号
et_exam_usertest.map.xml getExamResultList之前的写法在此备份 30
et_exam_usertest.map.xml truncateExamDetail备份 81
et_exam_usertest.map.xml getPersonDetail备份 85
et_exam_usertest.map.xml getClassDetail备份 97
et_exam_usertest.map.xml getCourseDetail备份 109
et_train_outtrain.map.xml getOutTrainDbList以前的写法备份 22
et_train_outtrain.map.xml getOutTrainPxdjList以前的写法备份 69

典型示例

<!-- et_exam_usertest.map.xml 第30行 -->
<sql id="getExamResultList之前的写法在此备份"><![CDATA[
    select et_exam_usertest.user_id as id,et_exam_usertest.user,et_exam_exampaper_and_editexampaper.name...
</sql>

修复建议:删除所有包含"备份"、"以前"、"old"、"backup"等标记的 SQL 定义。


1.2 🟠 严重问题:重复 SQL 变体过多

问题描述et_exam_usertest.map.xml 中存在多个功能的多种实现版本,造成代码冗余。

发现位置

功能 存在的变体数量 示例
获取人员详情 3 种写法 getPersonDetailgetPersonDetail第二种写法getPersonDetail第三种写法 最慢
获取班级详情 3 种写法 getClassDetailgetClassDetail 第二种写法 最慢
获取课程详情 3 种写法 getCourseDetailgetCourseDetail 第二种写法 最慢
获取机构详情 2 种写法 getInstitutionDetailgetInstitutionDetail 第二种写法 最慢
获取部门详情 2 种写法 getDepartmentDetailgetDepartmentDetail 第二种写法 最慢

修复建议

  1. 保留性能最优的实现版本
  2. 删除其他废弃版本
  3. 如需保留历史参考,使用版本控制系统

1.3 🟡 建议问题SELECT * 使用过多

问题描述:大量使用 SELECT * 返回所有字段,增加网络传输开销。

发现位置:统计到 120+ 处使用 SELECT *

典型示例

<!-- et_resource_file.map.xml -->
<sql id="getFileList">
    select * from et_resource_file where 1=1
</sql>

修复建议:明确指定需要的字段,避免返回冗余数据。


1.4 🟡 建议问题LIKE 查询未使用 CONCAT

问题描述:部分 LIKE 查询未使用参数化方式处理通配符。

发现位置:统计到 108+ 处 LIKE 查询

典型示例

<!-- chatFriends.map.xml 第68行 -->
org.CASCADE_ID LIKE '${con}%'

说明:此问题风险较低,因为 ${con} 是后端传入的固定值,不是用户输入。但如果 con 来自用户输入,则存在 SQL 注入风险。


1.5 💭 挑剔问题:字段名大小写不统一

问题描述:部分 SQL 文件中字段名大小写混用。

示例et_exam_usertest.map.xml 中混合使用大小写


二、FreeMarker 模板审查结果

2.1 🟠 严重问题:注释掉的死代码过多

问题描述FTL 模板中存在大量被注释的代码,影响可维护性。

发现位置:统计到 115 处 <#-- 注释块

高发文件

文件 注释数量 文件大小
exam/exampaper_editexampaper.ftl 74 处 26.27 KB
exam/examresult_edit.ftl 33 处 13.84 KB
exam/exam_edit.ftl 37 处 14.03 KB
exam/exampaper_add.ftl 29 处 4.2 KB

典型示例

<!-- exam_edit.ftl 第17-27行 -->
<#--            2019年第一次项目管理培训考试试卷1-->
            <span id="title_name"></span>
        </td>
    </tr>
    <tr>
        <td>
<#--            项目管理培训是对管理者和相关学员进行现代项目管理理念、体系、流程和方法的教育培训活动。-->
<#--            通过系统的培训,使广大培训对象具备系统思维、战略思维的主动意识,改变管理习惯,降低随意性和不确定性,大幅度提高工作效率。-->
            <span id="title_description"></span>

修复建议

  1. 删除所有 <#-- 注释掉的代码块
  2. 如需保留历史说明,使用版本控制系统
  3. 考虑在开发迭代中逐步清理

2.2 🟡 建议问题:内联事件处理过多

问题描述:模板中大量使用内联事件处理器(如 onclickonchange)。

发现位置:统计到 115 处 内联事件

高发文件

文件 内联事件数量
exam/exampaper_editexampaper.ftl 62 处
exam/examresult_edit.ftl 14 处
exam/exam_edit.ftl 14 处

典型示例

<input name="cbA" id="cbA" type="checkbox" value="A" onclick="checkBox(this)"/>

修复建议

<!-- 使用 data 属性 + JS 事件绑定 -->
<input name="cbA" id="cbA" type="checkbox" value="A" class="checkbox-option"/>

<script>
$('.checkbox-option').on('click', function() {
    checkBox(this);
});
</script>

2.3 🟡 建议问题:内联样式过多

问题描述:模板中大量使用 style="" 内联样式。

发现位置:统计到 6265 处 style 属性

典型示例

<div class="formTitle" style="height: 86px"><span class="icon icon_menu"></span>

修复建议:将重复样式提取为 CSS 类,使用语义化类名。


2.4 💭 挑剔问题:条件嵌套过深

问题描述:部分模板存在多层条件嵌套。

典型示例

{{if value.type=="单选题"}}
    {{if value.optiona.length}}
        {{if value.user_answer=="A"}}
            <div>...</div>
        {{/if}}
    {{/if}}
{{/if}}

修复建议:使用逻辑运算符或 helper 函数简化。


三、JavaScript 审查结果

3.1 🟠 严重问题:未声明的全局变量

问题描述:部分 JS 文件中存在未使用 var/let/const 声明的变量。

发现位置

文件 问题 行号
globalConfig.js isIDCard1, isIDCard2 等正则变量未声明 72-74
globalConfig.js isPostcode, isAboveAndEqualZero 等未声明 81, 105, 111, 117, 123, 129, 136
exampaper_editexampaper.js pg_ 变量在赋值前声明 15-16

典型示例

// globalConfig.js 第72-74行
validator: function (val) {
    //身份证正则表达式(15位)
    isIDCard1 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
    //身份证正则表达式(18位)
    isIDCard2 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}[0-9xX]$/;

修复建议

validator: function (val) {
    const isIDCard1 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
    const isIDCard2 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}[0-9xX]$/;

3.2 🟠 严重问题:日期 API 误用

问题描述globalConfig.js 中误用 getDay() 方法。

发现位置globalConfig.js 第 268、271 行

典型示例

// 第 268 行 - 错误getDay() 返回星期几(0-6)
if (dateTime1.getDay() == dateTime2.getDay()) {

// 第 271 行 - 错误:比较星期而非日期
if (dateTime1.getDay() - dateTime2.getDay() == 1) {

问题分析

  • getDay() 返回 0-6周日=0周六=6
  • getDate() 返回 1-31日期

修复建议

// 正确:使用 getDate() 比较日期
if (dateTime1.getDate() == dateTime2.getDate()) {

3.3 🟠 严重问题:同步 AJAX 请求

问题描述:多处使用 async: false 的同步 AJAX 请求,阻塞 UI 线程。

发现位置

文件 行号 用途
globalConfig.js 200 获取数据字典
userprofile/index.js 71, 104 用户信息查询
train/uptrain/uptrain.js 176 上级培训查询
train/uptrain/uptrain_edit.js 394 上级培训编辑
train/plantodo/assess_audit.js 319 评估审核
train/outtrain/out_train_main.js 1209 外派培训

典型示例

// globalConfig.js 第198-210行
$.ajax({
    type: 'post',
    async: false,  // 阻塞 UI
    url: dictBaseUrl + dictKey,
    dataType: 'json',
    success: function (result) {
        // ...
    }
});

修复建议

  1. 改为异步请求,使用 Promise/async-await
  2. 考虑在页面加载时预取数据
  3. 使用回调函数处理异步结果

3.4 🟡 建议问题:代码重复

问题描述:部分 JS 文件存在重复代码。

示例out_train_main.js 中有多个类似的 AJAX 请求模式


3.5 💭 挑剔问题:魔法数字

问题描述:代码中存在未命名的数字常量。

示例globalConfig.js 第 271 行的 1 代表"昨天"


四、CSS 审查结果

4.1 🟡 建议问题:内联样式过多

问题描述CSS 文件中部分选择器嵌套过深。

示例

.container .content .main .sidebar .box .title {
    font-size: 14px;
}

修复建议:使用 BEM 命名规范或扁平化选择器。


4.2 💭 挑剔问题:未使用 CSS 变量

问题描述:样式中未使用 CSS 变量管理主题色等。

修复建议:考虑使用 CSS 变量统一管理颜色、间距等。


五、安全审查结果

5.1 安全检查通过项

检查项 状态 说明
SQL 注入 通过 所有用户输入使用 ? 参数绑定
XSS 跨站脚本 通过 FreeMarker 使用模板语法自动转义
权限校验 通过 前后端双重权限校验

5.2 ⚠️ 潜在风险点

风险点 位置 风险等级 说明
LIKE 查询拼接 chatFriends.map.xml 第 68 行 ${con} 来自后端,非用户输入

六、问题汇总与修复优先级

6.1 必须修复(🟠 → 立即处理)

序号 问题 文件 修复建议
1 废弃 SQL 未清理 et_exam_usertest.map.xml, et_train_outtrain.map.xml 删除所有"备份"、"以前"标记的 SQL
2 重复 SQL 变体过多 et_exam_usertest.map.xml 保留最优版本,删除废弃版本
3 全局变量未声明 globalConfig.js 添加 var/let/const 声明
4 日期 API 误用 globalConfig.js getDay() 改为 getDate()
5 同步 AJAX 阻塞 多处 JS 文件 改为异步请求

6.2 建议修复(🟡 → 后续迭代)

序号 问题 文件 修复建议
1 注释死代码过多 多个 FTL 文件 逐步清理 <#-- 注释代码
2 SELECT * 使用过多 多个 map.xml 明确指定字段
3 内联事件处理 多个 FTL 文件 使用 data 属性 + JS 事件绑定
4 内联样式过多 多个 FTL 文件 提取为 CSS 类

6.3 可选优化(💭 → 持续改进)

序号 问题 建议
1 字段名大小写不统一 统一命名规范
2 条件嵌套过深 使用 helper 函数
3 魔法数字 使用命名常量
4 CSS 选择器嵌套过深 使用 BEM 命名

七、修复计划建议

第一阶段紧急修复1 周内)

  1. 删除废弃 SQL(预计 2 小时)

    • 清理 et_exam_usertest.map.xml 中的 9 个废弃 SQL
    • 清理 et_train_outtrain.map.xml 中的 2 个废弃 SQL
  2. 修复全局变量声明(预计 1 小时)

    • 修复 globalConfig.js 中的 8+ 未声明变量
  3. 修复日期 API 误用(预计 30 分钟)

    • globalConfig.js 第 268、271 行

第二阶段重要优化1 个月内)

  1. 改造同步 AJAX(预计 4 小时)

    • 逐步将 6 处 async: false 改为异步
  2. 清理注释死代码(预计 8 小时)

    • 优先清理高频文件的注释代码

第三阶段:持续改进(长期)

  1. 制定代码格式化规范
  2. 引入 ESLint 检查
  3. 完善代码审查流程

八、附录

A. 问题统计表

文件类型 总文件数 废弃代码 变量问题 同步请求 内联样式
*.map.xml 54 11 0 0 0
*.ftl 320 115+ 0 0 6265+
*.js 97 0 9+ 6 0
*.css 15 0 0 0 0

B. 审查工具建议

工具 用途 适用文件
ESLint JavaScript 代码检查 *.js
SQLFluff SQL 语法检查 *.map.xml
自定义脚本 扫描废弃代码标记 *.map.xml, *.ftl

本报告由 AI 代码审查专家生成,基于 CODE_REVIEW_GUIDE.md 标准执行。