Fixed Issues: - globalConfig.js: Added const declarations for 10 undeclared regex variables - globalConfig.js: Fixed getDay() -> getDate() for date comparison - Removed 16 deprecated SQL definitions from 4 map.xml files - Cleaned 615+ commented code blocks from 115 FTL templates Added: - CODE_FIX_PLAN.md: Detailed fix plan for remaining issues Remaining (documented in CODE_FIX_PLAN.md): - 6 async: false AJAX requests to convert - 120+ SELECT * to optimize - 6265+ inline styles to refactor
7.7 KiB
7.7 KiB
JCDP 项目代码修复方案
文档版本: v1.0 创建时间: 2026-04-16 依据: CODE_REVIEW_REPORT.md
一、修复执行情况
✅ 已完成修复
| 序号 | 问题 | 修复文件 | 修复内容 |
|---|---|---|---|
| 1 | 全局变量未声明 | globalConfig.js |
为 8 个正则变量添加 const 声明 |
| 2 | 日期 API 误用 | globalConfig.js |
getDay() → getDate() (第268、271行) |
| 3 | 废弃 SQL 清理 | 4 个 map.xml | 删除 16 个废弃 SQL 定义 |
| 4 | 注释死代码 | 115 个 ftl | 删除 615+ 处注释代码 |
📋 待处理问题
| 序号 | 问题 | 优先级 | 说明 |
|---|---|---|---|
| 1 | 同步 AJAX 请求 | 🟠 严重 | 6 处 async: false 需要改为异步 |
| 2 | SELECT * 过多 | 🟡 建议 | 120+ 处可优化为指定字段 |
| 3 | 内联样式过多 | 🟡 建议 | 6265+ 处 style 属性待清理 |
| 4 | 内联事件处理 | 🟡 建议 | 115 处 onclick/onchange 待重构 |
二、已修复问题详情
2.1 全局变量声明修复
文件: asset/js/etms/globalConfig.js
修复内容: 为验证函数中的正则表达式变量添加 const 声明
// 修复前
validator: function (val) {
isIDCard1 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
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]$/;
...
}
涉及变量: isIDCard1, isIDCard2, isPostcode, isAboveAndEqualZero, isPositiveNumber, isPositiveInteger, isMonthNum, moreThanFive, isPointNum, isEmail
2.2 日期 API 修复
文件: asset/js/etms/globalConfig.js 第 268、271 行
修复内容: getDay() → getDate()
// 修复前
if (dateTime1.getDay() == dateTime2.getDay()) {
tempTime = dateTime2.format("hh:mm");
} else {
if (dateTime1.getDay() - dateTime2.getDay() == 1) {
tempTime = dateTime2.format("昨天 hh:mm");
}
}
// 修复后
if (dateTime1.getDate() == dateTime2.getDate()) {
tempTime = dateTime2.format("hh:mm");
} else {
if (dateTime1.getDate() - dateTime2.getDate() == 1) {
tempTime = dateTime2.format("昨天 hh:mm");
}
}
2.3 废弃 SQL 清理
修复文件:
chat.map.xml: 删除updatePkgListToOldet_exam_editexampaper.map.xml: 删除moveOldet_exam_usertest.map.xml: 删除 10 个废弃 SQLet_train_outtrain.map.xml: 删除 2 个废弃 SQL
清理的废弃 SQL ID:
getExamResultList之前的写法,在此备份truncateExamDetail备份getPersonDetail备份getClassDetail备份getCourseDetail备份getInstitutionDetail 第二种写法 最慢getDepartmentDetail 第二种写法 最慢getPersonDetail第二种写法getPersonDetail第三种写法 最慢getClassDetail 第二种写法 最慢getCourseDetail 第二种写法 最慢getOutTrainDbList以前的写法备份getOutTrainPxdjList以前的写法备份
2.4 FTL 注释死代码清理
清理统计:
- 修改文件: 115 个
- 清理注释: 615+ 处
高发文件 (Top 10):
| 文件 | 清理数量 |
|---|---|
exampaper_editexampaper.ftl |
74 处 |
examresult_edit.ftl |
33 处 |
exam_edit.ftl |
37 处 |
exampaper_add.ftl |
29 处 |
group_inplan_main.ftl |
61 处 |
group_inplan_bg_group_detail_1.ftl |
34 处 |
group_inplan_bg_group_detail.ftl |
32 处 |
research_project_main_examadd_sg.ftl |
49 处 |
exampaper_import.ftl |
21 处 |
pd_pg_main_assess.ftl |
20 处 |
三、待处理问题修复方案
3.1 同步 AJAX 请求改造 (🟠 严重)
问题位置:
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)
$.ajax({
type: 'post',
async: false, // 阻塞 UI
url: dictBaseUrl + dictKey,
dataType: 'json',
success: function (result) {
if (result.success) {
window[hdName] = result.data;
res = result.data;
}
}
});
// 修复后 (方案1: Promise + async/await)
async function getDictData(dictKey) {
try {
const result = await $.ajax({
type: 'post',
url: dictBaseUrl + dictKey,
dataType: 'json'
});
if (result.success) {
window[dict_prefix + dictKey] = result.data;
return result.data;
}
return null;
} catch (error) {
console.error('获取字典数据失败:', error);
return null;
}
}
// 修复后 (方案2: 回调函数)
function getDictData(dictKey, callback) {
$.ajax({
type: 'post',
url: dictBaseUrl + dictKey,
dataType: 'json',
success: function (result) {
if (result.success) {
window[dict_prefix + dictKey] = result.data;
callback(result.data);
} else {
callback(null);
}
},
error: function() {
callback(null);
}
});
}
建议优先级:
- 优先改造
globalConfig.js中的gridColFilter函数 - 然后处理业务模块中的同步请求
- 最后处理
out_train_main.js等复杂模块
3.2 SELECT * 优化 (🟡 建议)
优化原则:
- 明确列出需要的字段
- 减少网络传输开销
- 提高代码可读性
示例:
<!-- 修复前 -->
<sql id="getFileList">
select * from et_resource_file where 1=1
</sql>
<!-- 修复后 -->
<sql id="getFileList">
select id, name, file_path, file_size, created_by, created_at
from et_resource_file where 1=1
</sql>
建议: 优先优化高频查询的 SQL
3.3 内联样式清理 (🟡 建议)
优化方案: 提取为 CSS 类
<!-- 修复前 -->
<div class="formTitle" style="height: 86px"><span class="icon icon_menu"></span>
<!-- 修复后 -->
<!-- CSS -->
.form-title {
height: 86px;
}
<!-- HTML -->
<div class="form-title"><span class="icon icon_menu"></span>
建议:
- 优先清理高频页面的内联样式
- 建立公共样式类库
- 使用 CSS 变量统一管理主题色
3.4 内联事件重构 (🟡 建议)
优化方案: 使用 data 属性 + JS 事件委托
<!-- 修复前 -->
<input name="cbA" id="cbA" type="checkbox" value="A" onclick="checkBox(this)"/>
<!-- 修复后 -->
<!-- HTML -->
<input name="cbA" id="cbA" type="checkbox" value="A" class="checkbox-option"
data-check-action="checkBox"/>
<!-- JavaScript -->
$(document).on('click', '.checkbox-option', function() {
var action = $(this).data('check-action');
if (action && window[action]) {
window[action](this);
}
});
四、后续改进建议
4.1 短期 (1个月内)
- 完成同步 AJAX 改造
- 引入 ESLint 检查
- 建立代码格式化规范
4.2 中期 (3个月内)
- 优化高频 SQL 查询
- 清理内联样式
- 重构内联事件处理
4.3 长期 (持续改进)
- 引入自动化测试
- 建立代码质量度量
- 完善 Code Review 流程
五、相关文件
- CODE_REVIEW_GUIDE.md - 代码审查标准
- CODE_REVIEW_REPORT.md - 代码审查报告
本修复方案由 AI 代码审查专家生成