# JCDP 项目代码审查标准与流程规范
> **文档版本**:v1.0 | **创建时间**:2026-04-16 | **适用项目**:ETMS 教育培训管理系统(JCDP)
>
> **审查范围**:Java 源码、SQL 映射文件(*.map.xml)、FreeMarker 模板(*.ftl)、JavaScript(*.js)、CSS(*.css)
---
## 目录
1. [审查目标与原则](#1-审查目标与原则)
2. [审查角色与职责](#2-审查角色与职责)
3. [代码质量等级定义](#3-代码质量等级定义)
4. [SQL 映射文件审查标准](#4-sql-映射文件审查标准)
5. [FreeMarker 模板审查标准](#5-freemarker-模板审查标准)
6. [JavaScript 审查标准](#6-javascript-审查标准)
7. [CSS 审查标准](#7-css-审查标准)
8. [安全审查标准](#8-安全审查标准)
9. [审查流程规范](#9-审查流程规范)
10. [审查检查清单](#10-审查检查清单)
11. [常见问题与修复建议](#11-常见问题与修复建议)
---
## 1. 审查目标与原则
### 1.1 审查目标
| 目标 | 说明 |
|------|------|
| **提升代码质量** | 发现并修复潜在缺陷,降低线上故障率 |
| **统一代码风格** | 保持项目内代码风格一致,降低维护成本 |
| **知识传承** | 通过审查促进团队技术交流,提升整体水平 |
| **风险控制** | 识别安全漏洞、性能瓶颈、数据风险 |
### 1.2 审查原则
1. **建设性优先**:审查是教导,不是批评。每条反馈都应教会开发者一些东西
2. **抓大放小**:阻塞性问题必须修复,风格问题酌情处理
3. **自动化辅助**:能自动化的检查(如格式、风格)不占用人工审查时间
4. **具体可操作**:每条审查意见都应明确指出位置、问题和建议
---
## 2. 审查角色与职责
### 2.1 角色定义
| 角色 | 职责 | 适用场景 |
|------|------|----------|
| **作者 (Author)** | 提交代码、完成自检、响应审查意见 | 所有场景 |
| **审查者 (Reviewer)** | 执行代码审查、给出反馈、批准/驳回 | 所有场景 |
| **架构师/技术负责人** | 审批重大变更、制定技术规范、处理争议 | 高风险变更 |
| **质量门禁 (Gatekeeper)** | 验证审查通过、检查清单执行 | 合入主分支前 |
### 2.2 审查者分配原则
| 变更类型 | 最低审查人数 | 审查者要求 |
|----------|-------------|------------|
| **常规功能** | 1 人 | 任意团队成员 |
| **业务逻辑变更** | 1-2 人 | 至少 1 人为同模块开发者 |
| **核心模块变更** | 2 人+ | 至少 1 人为架构师/技术负责人 |
| **安全/权限相关** | 2 人+ | 必须包含安全专员或架构师 |
---
## 3. 代码质量等级定义
### 3.1 问题严重等级
| 等级 | 标记 | 描述 | 处理要求 |
|------|------|------|----------|
| **阻塞** | 🔴 | 必须修复才能合入 | 修复前禁止合入 |
| **严重** | 🟠 | 强烈建议修复 | 修复后再审查 |
| **建议** | 🟡 | 应该修复 | 可以在后续迭代修复 |
| **挑剔** | 💭 | 可选优化 | 不阻塞合入 |
### 3.2 问题类型分类
| 类型 | 说明 | 示例 |
|------|------|------|
| **Bug** | 功能性错误 | 逻辑错误、空指针风险 |
| **安全** | 安全漏洞 | SQL 注入、XSS、权限绕过 |
| **性能** | 性能问题 | N+1 查询、大数据处理 |
| **可维护性** | 代码可读性 | 命名不清晰、重复代码 |
| **风格** | 代码风格 | 格式不规范、无注释 |
---
## 4. SQL 映射文件审查标准
### 4.1 🔴 阻塞问题
#### 4.1.1 SQL 注入风险
**问题描述**:用户输入直接拼接到 SQL 语句中。
**典型问题代码**:
```xml
<@p p="AND name = %s" f="?">name@p>
<@p p="AND name LIKE '%' + ? + '%'">keyword@p>
```
**正确写法**:
```xml
<@p p="AND name LIKE CONCAT('%', ?, '%')">keyword@p>
<@p p="AND id IN(%s)" f="?">id@p>
```
**检查要点**:
- [ ] 所有用户输入是否通过 `?` 参数绑定
- [ ] LIKE 模糊查询是否使用 `CONCAT` 函数
- [ ] IN 查询的列表参数是否正确处理
#### 4.1.2 缺少 WHERE 条件
**问题描述**:UPDATE/DELETE 语句缺少 WHERE 条件,可能导致全表操作。
**典型问题代码**:
```xml