Files
car-t-t/CODE_REVIEW_STANDARD.md
T
zhs123 43272d25eb refactor: 死代码清理 + CDN SRI 加固 + 面包屑组件 + 代码规范文档
- 删除 7 个死模板文件 (products/services/quality/process/projects/customization/rfq)
- 删除 13 个旧图片素材 (jpg/png/webp)
- 新增 CDN SRI 完整性校验 (Bootstrap CSS/JS)
- 新增面包屑导航模板组件
- 新增代码清理方案与代码审查标准文档
- 更新 README.md
2026-07-24 17:48:00 +08:00

11 KiB
Raw Blame History

代码审查标准与流程

适用项目:B2B Trade 主题(fragrance-trade 技术栈:WordPress 经典主题 / PHP 7.4+ / Bootstrap 5.3 / jQuery 版本:v1.0 | 2026-07-24


一、审查原则

  1. 安全优先 — WordPress 主题的 XSS / SQL 注入 / CSRF 是红线
  2. 就事论事 — 评论针对代码,不针对人
  3. 说清楚为什么 — 不只说"改这个",要解释原因和潜在风险
  4. 给方向不给答案 — 引导作者自己思考,除非是明确的安全漏洞
  5. 赞美好代码 — 发现优秀实践要明确指出,让团队学习

二、优先级体系

每个审查意见必须标注以下级别之一:

级别 标记 含义 处理要求
🔴 阻断 Blocker 安全漏洞 / 数据丢失 / 破坏功能 必须修复后才能合并
🟡 建议 Suggestion 输入验证缺失 / 性能问题 / 可维护性 应当修复,可协商
💭 细节 Nit 命名 / 风格 / 文档 修不修都行,不阻塞

三、WordPress 主题专项审查清单

🔴 阻断级检查项(必须全部通过)

3.1 安全性

  • 直接访问防护 — 所有 PHP 文件以 if ( ! defined( 'ABSPATH' ) ) exit; 开头
  • SQL 注入 — 禁止拼接 SQL;必须使用 $wpdb->prepare() 或 WP APIget_posts(), WP_Query
  • XSS 防护 — 所有输出必须经过转义:
    • HTML 文本 → esc_html()
    • URL → esc_url()
    • 属性 → esc_attr()
    • 富文本 → wp_kses_post()
  • CSRF 防护 — 所有表单提交 / POST 处理必须有 wp_nonce_field() + check_admin_referer()
  • 输入净化 — 所有 $_POST / $_GET / $_SERVER 必须用 wp_unslash() + 对应 sanitize_* 函数
  • 邮件头注入 — 从用户输入构造邮件头时,必须剥离 \r\n
  • 文件包含 — 禁止用户输入直接传入 include / require / get_template_part()
  • 权限检查 — 任何管理员操作必须有 current_user_can() 检查

3.2 功能正确性

  • 关键路径错误处理 — 表单提交失败有 fallback(非空白白屏)
  • 数据完整性 — 不会因空值 / 缺失字段导致 fatal error
  • 重定向安全 — 使用 wp_safe_redirect() + wp_validate_redirect(),禁止直接 header('Location:')

🟡 建议级检查项

3.3 输入验证与数据

  • Customizer 字段是否有对应类型的 sanitize_callback
  • get_theme_mod() 取值后是否有默认值兜底
  • 用户上传的 URL 是否用 esc_url_raw() 存入、esc_url() 输出

3.4 性能

  • N+1 查询 — 循环内不执行数据库查询,提前预取
  • 资源加载 — 脚本用 wp_enqueue_script,不硬编码 <script src>
  • 图片优化 — 使用响应式 srcset / loading="lazy"
  • Transient 缓存 — 耗时操作(远程请求、复杂查询)用 transient 缓存

3.5 可维护性

  • 死代码 — 新增模板文件必须有对应的 get_template_part() 调用;废弃文件及时删除
  • 命名规范 — 函数 / 变量统一 fragrance_trade_ 前缀,蛇形命名
  • 函数长度 — 单函数不超过 80 行,超过则考虑拆分
  • 重复代码 — 相同逻辑出现 3 次以上应提取为 helper 函数
  • 文件组织 — 新功能按职责归入 inc/ 对应模块,不堆在 functions.php

3.6 前端质量

  • CDN 资源 — 第三方 CDN 必须有 SRI 完整性哈希 + 本地回退
  • 第三方库 — 禁止将多个库的压缩代码拼接到单文件;用 npm + 构建流程管理
  • 无障碍 — 图片有 alt,表单有 label,按钮有可读文本
  • 响应式 — 移动端布局不溢出,触控目标不小于 44×44px
  • prefers-reduced-motion — 动画尊重用户偏好

💭 细节级检查项

  • 文本域统一为 fragrance-trade,所有字符串包裹 __() / esc_html_e()
  • 注释说明"为什么"而非"做了什么"
  • 长行拆分(单行 PHP echo 不超过 120 字符)
  • CSS 自定义属性命名遵循 --token-name 格式

四、审查流程

┌─────────────────────────────────────────────────────────────┐
│                      代码审查流程                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 提交前自检                                               │
│     作者按 §三 清单自检 → 确认无 🔴 项                       │
│                          ↓                                  │
│  2. 提交审查                                                 │
│     Gitea PR / 提交说明 → 附上改动摘要和测试方式             │
│                          ↓                                  │
│  3. 审查者检查                                                │
│     按 §三 清单逐项 → 标注 🔴🟡💭 → 写明原因和建议方向      │
│                          ↓                                  │
│  4. 分支处理                                                 │
│     ├─ 有 🔴 → 打回,作者修复后重新提交                      │
│     ├─ 有 🟡 → 讨论确认,修复或记录为后续任务                │
│     └─ 仅 💭 → 可选修复,直接通过                            │
│                          ↓                                  │
│  5. 合并                                                     │
│     审查者 Approve → 作者合并 → 删除分支                     │
│                          ↓                                  │
│  6. 回顾(每周)                                              │
│     汇总本周审查发现的共性问题 → 更新本标准                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

4.1 提交规范

提交 PR / 提交审查时,标题格式:

[类型] 简述 — 具体改动

类型:feat / fix / refactor / style / security / docs / chore

示例:

[security] RFQ 表单 — 增加 nonce 验证
[feat] 案例详情页 — 添加施工前后对比图
[refactor] inc/defaults.php — 按区块分组重组配置键

4.2 审查时间线

阶段 时限 说明
初次审查 提交后 24h 内 审查者完成首轮检查
修复后复审 作者修复后 12h 内 审查者确认修复
超时升级 超 48h 未回应 @项目负责人介入协调

五、审查评论模板

🔴 阻断级

🔴 [安全/XSS] 第 42 行:用户输入直接输出到 HTML

原因:
$subtitle 变量来自 $_POST,未经 esc_html() 转义直接 echo
攻击者可注入 <script> 标签执行任意代码。

建议:
echo esc_html( $subtitle );

🟡 建议级

🟡 [性能/N+1] 第 18-25 行:循环内执行 get_post_meta()

原因:
在 while 循环内逐条查询 post_meta,10 篇文章 = 10 次查询,
页面加载时会明显变慢。

建议:
循环前用 get_post_meta( $post_ids, 'key', false ) 批量预取,
或在循环内缓存结果。

💭 细节级

💭 [命名] 第 8 行:$d 变量名过于简短

考虑改为 $display_date 或 $post_date6 个月后回来看能秒懂。

六、当前项目待修复清单

基于 2026-07-24 代码扫描结果,以下问题应优先处理:

优先级 问题 文件 说明
🟡 11 个死模板文件 template-parts/home/ products, services, quality, process, faq, rfq, factory, video, customization, documents, projects 未被引用
🟡 plugins.js 拼接 6 个库 assets/js/plugins.js jQuery Easing + Jarallax + Colorbox + AOS + anime.js + HC-Sticky 混在一起,无版本标记,无法维护
🟡 CDN 无 SRI inc/setup.php:47-54 Bootstrap + Google Fonts 缺少 integrity 哈希,无本地回退
🟡 零测试 全项目 无 phpunit / 无 .phpcs.xml / 无 CI
💭 defaults.php 扁平数组 inc/defaults.php ~170 个键未分组,可按区块拆分
💭 jQuery 冗余依赖 assets/js/theme.js 仅 colorbox 用 jQuery,其余为原生 DOM,可考虑去掉 jQuery

七、工具辅助

静态检查(建议引入)

# PHP 代码规范检查 — WordPress 标准
composer create-project wp-coding-standards/wpcs
phpcs --standard=WordPress --extensions=php inc/ template-parts/

# 自动修复可修复的问题
phpcbf --standard=WordPress --extensions=php inc/ template-parts/

Git Pre-commit Hook(建议配置)

#!/bin/bash
# .git/hooks/pre-commit
# 提交前自动检查 PHP 语法 + 基本安全扫描

ERRORS=0

# 1. PHP 语法检查
for file in $(git diff --cached --name-only --diff-filter=ACM | grep "\.php$"); do
    php -l "$file" > /dev/null 2>&1 || { echo "语法错误: $file"; ERRORS=1; }
done

# 2. 检查是否包含危险函数
for file in $(git diff --cached --name-only --diff-filter=ACM | grep "\.php$"); do
    grep -n 'eval\s*(' "$file" && { echo "⚠️ eval() 检测到: $file"; ERRORS=1; }
    grep -n 'exec\s*(' "$file" && { echo "⚠️ exec() 检测到: $file"; ERRORS=1; }
    grep -n 'system\s*(' "$file" && { echo "⚠️ system() 检测到: $file"; ERRORS=1; }
done

exit $ERRORS

八、审查者轮值

角色 职责
主审 按 §三 清单逐项检查,出具审查意见
复审 对主审意见复核,确认无遗漏(可选)
作者 回复意见,修复 🔴🟡 项,说明 💭 项处理决定

小团队(≤3人)可轮流担任主审,无需固定复审。


附录:本项目已有的优秀实践(请保持)

  • 所有文件 ABSPATH 守卫
  • RFQ 表单完整安全链:nonce + honeypot + 速率限制 + 邮件头注入防护
  • Customizer 字段全部配置 sanitize_callback
  • 统一 fragrance_trade_ 函数前缀
  • CSS 使用自定义属性设计令牌系统
  • JS 尊重 prefers-reduced-motion + passive 事件监听
  • antispambot() 邮件地址混淆