jsharness 1.5.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.harness/agents/code-reviewer.md +81 -0
  2. package/.harness/agents/developer.md +101 -0
  3. package/.harness/agents/gate-controller.md +77 -0
  4. package/.harness/agents/project-manager.md +77 -0
  5. package/.harness/agents/prompt-templates.md +28 -4
  6. package/.harness/agents/requirements-analyst.md +90 -0
  7. package/.harness/agents/solution-designer.md +86 -0
  8. package/.harness/agents/tester.md +105 -0
  9. package/.harness/commands/js/build-gates-frontend.md +33 -0
  10. package/.harness/commands/js/build-gates-java.md +33 -0
  11. package/.harness/commands/js/build-gates.md +32 -0
  12. package/.harness/commands/js/engineering-consistency.md +29 -0
  13. package/.harness/commands/js/security-quality.md +27 -0
  14. package/.harness/commands/js/static-compliance.md +35 -0
  15. package/.harness/commands/js/task-board-maintenance.md +68 -0
  16. package/.harness/commands/js/test-compliance.md +30 -0
  17. package/.harness/dev-map/backend/api-definition.md +10 -12
  18. package/.harness/dev-map/backend/auth-security.md +53 -28
  19. package/.harness/dev-map/backend/conventions-java.md +72 -60
  20. package/.harness/dev-map/backend/conventions.md +127 -163
  21. package/.harness/dev-map/backend/structure.md +142 -92
  22. package/.harness/dev-map/decisions.md +1 -1
  23. package/.harness/dev-map/frontend/structure.md +1 -1
  24. package/.harness/dev-map/overview.md +10 -9
  25. package/.harness/gate/checks/static-compliance.js +2 -2
  26. package/.harness/gate/checks/test-compliance.js +4 -4
  27. package/.harness/rules/global/coding-standard.md +15 -8
  28. package/.harness/rules/global/commit-convention.md +7 -0
  29. package/.harness/rules/global/design-document-boundary.md +115 -0
  30. package/.harness/rules/global/process-discipline.md +7 -0
  31. package/.harness/rules/global/security-baseline.md +27 -23
  32. package/.harness/rules/project/frontend-vue3.md +9 -0
  33. package/.harness/rules/project/java-backend.md +129 -22
  34. package/.harness/rules/project/web-specific.md +27 -14
  35. package/.harness/skills/architecture-designer/SKILL.md +768 -0
  36. package/.harness/skills/{build.md → build/SKILL.md} +7 -0
  37. package/.harness/skills/{code-review.md → code-review/SKILL.md} +7 -0
  38. package/.harness/skills/{docker-build.md → docker-build/SKILL.md} +7 -0
  39. package/.harness/skills/{docs-update.md → docs-update/SKILL.md} +7 -0
  40. package/.harness/skills/{java-build.md → java-build/SKILL.md} +12 -2
  41. package/.harness/skills/{lint-check.md → lint-check/SKILL.md} +7 -0
  42. package/.harness/skills/{task-board-maintenance.md → task-board-maintenance/SKILL.md} +12 -1
  43. package/.harness/skills/{test-api.md → test-api/SKILL.md} +21 -14
  44. package/.harness/skills/{test-e2e.md → test-e2e/SKILL.md} +7 -0
  45. package/.harness/skills/{test-unit.md → test-unit/SKILL.md} +50 -44
  46. package/.harness/skills/{vue-frontend-build.md → vue-frontend-build/SKILL.md} +11 -0
  47. package/.harness/workflow/definition.yaml +37 -3
  48. package/bin/jsharness.js +9 -4
  49. package/files/AI_RULE.md +185 -0
  50. package/files/architecture-designer.md +1334 -0
  51. package/files/frontend-project-conventions/SKILL.md +125 -0
  52. package/files/java-backend-coding-standards/SKILL.md +536 -0
  53. package/files//345/205/254/345/217/270harness.txt +1818 -0
  54. package/lib/index.mjs +946 -111
  55. package/package.json +63 -53
  56. package/.harness/agents/code-reviewer/contract.yaml +0 -64
  57. package/.harness/agents/developer/contract.yaml +0 -72
  58. package/.harness/agents/gate-controller/contract.yaml +0 -64
  59. package/.harness/agents/project-manager/contract.yaml +0 -77
  60. package/.harness/agents/requirements-analyst/contract.yaml +0 -64
  61. package/.harness/agents/solution-designer/contract.yaml +0 -75
  62. package/.harness/agents/tester/contract.yaml +0 -92
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: build-gates-frontend
3
+ description: 前端构建门槛 — TypeScript 类型检查、依赖完整性、构建验证、ESLint
4
+ ---
5
+
6
+ # 前端构建门槛 (Frontend Build Gates)
7
+
8
+ > **源文件**: `.harness/gate/checks/build-gates-frontend.js`
9
+ > **类别**: B 类 — 构建门槛 (前端)
10
+
11
+ 适用于 `package.json` 存在的项目(Vue3/Vite 等)。
12
+
13
+ ## 检查项
14
+
15
+ | 编号 | 检查项 | 说明 | 阻塞 |
16
+ |------|--------|------|------|
17
+ | F-B1 | TypeScript 类型检查 | `tsc --noEmit` | 是 |
18
+ | F-B2 | 依赖完整性检查 | `npm/pnpm ls` | 是 |
19
+ | F-B3 | 前端构建 | `npm run build` | 是 |
20
+ | F-B4 | ESLint 快速检查 | `npx eslint` | 是 |
21
+ | F-B5 | npm 安全审计 | `npm audit` | 否(可选) |
22
+
23
+ ## 通过条件
24
+
25
+ - F-B1 ~ F-B4 全部 PASS
26
+ - 无 HIGH/CRITICAL 安全漏洞(F-B5 可选)
27
+
28
+ ## 失败条件
29
+
30
+ - TypeScript 编译错误 → FAIL
31
+ - 依赖缺失或版本冲突 → FAIL
32
+ - 构建失败 → FAIL
33
+ - ESLint 存在 error → FAIL
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: build-gates-java
3
+ description: Java 后端构建门槛 — Maven 编译、单元测试、Checkstyle、依赖分析
4
+ ---
5
+
6
+ # Java 后端构建门槛 (Java Build Gates)
7
+
8
+ > **源文件**: `.harness/gate/checks/build-gates-java.js`
9
+ > **类别**: B 类 — 构建门槛 (Java)
10
+
11
+ 适用于 `pom.xml` 存在的 Spring Boot / Maven 项目(JDK21 + Spring Boot)。
12
+
13
+ ## 检查项
14
+
15
+ | 编号 | 检查项 | 说明 | 阻塞 |
16
+ |------|--------|------|------|
17
+ | J-B1 | Maven 编译检查 | `mvn clean compile` | 是 |
18
+ | J-B2 | 单元测试快速验证 | `mvn test` | 是 |
19
+ | J-B3 | Checkstyle 代码风格检查 | `mvn checkstyle:check` | 是 |
20
+ | J-B4 | 依赖树分析 | `mvn dependency:tree` | 否 |
21
+ | J-B5 | SpotBugs Bug 扫描 | `mvn spotbugs:check` | 否(可选) |
22
+ | J-B6 | JaCoCo 覆盖率门禁 | `mvn jacoco:check` | 否(可选) |
23
+
24
+ ## 通过条件
25
+
26
+ - J-B1 ~ J-B3 全部 PASS
27
+ - 编译零错误,单元测试全部通过
28
+
29
+ ## 失败条件
30
+
31
+ - Maven 编译失败 → FAIL
32
+ - 单元测试失败 → FAIL
33
+ - Checkstyle 违规 → FAIL
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: build-gates
3
+ description: 构建门槛检查 — 自动检测项目类型并分发到对应的门禁检查模块
4
+ ---
5
+
6
+ # 构建门槛检查 (Build Gates)
7
+
8
+ > **源文件**: `.harness/gate/checks/build-gates.js`
9
+ > **类别**: B 类 — 构建门槛
10
+
11
+ 自动检测项目类型并分发到对应的门禁检查模块:
12
+ - 检测到 `pom.xml` → 调用 build-gates-java.js (Maven/Java)
13
+ - 检测到 `package.json` → 调用 build-gates-frontend.js (Node/前端)
14
+ - 都没有 → 返回 warning
15
+
16
+ ## 检查项
17
+
18
+ | 编号 | 检查项 | 说明 |
19
+ |------|--------|------|
20
+ | B1 | 项目类型检测 | 检测 pom.xml / package.json 确定项目类型 |
21
+ | B2 | 前端构建 | TypeScript 类型检查 + 依赖完整性 + npm run build + ESLint |
22
+ | B3 | Java 构建 | Maven 编译 + 单元测试 + Checkstyle + 依赖树分析 |
23
+
24
+ ## 通过条件
25
+
26
+ - 项目类型检测成功(Java 或 Frontend)
27
+ - 对应子模块的构建检查全部 PASS
28
+
29
+ ## 失败条件
30
+
31
+ - 无法检测项目类型 → WARNING
32
+ - 子模块构建失败 → FAIL
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: engineering-consistency
3
+ description: 工程一致性检查 — CHANGELOG 更新、dev-map 一致性、配置同步
4
+ ---
5
+
6
+ # 工程一致性检查 (Engineering Consistency)
7
+
8
+ > **源文件**: `.harness/gate/checks/engineering-consistency.js`
9
+ > **类别**: E 类 — 工程一致性
10
+
11
+ ## 检查项
12
+
13
+ | 编号 | 检查项 | 说明 |
14
+ |------|--------|------|
15
+ | E1 | CHANGELOG 更新检查 | 检查 Unreleased 区域是否有内容 |
16
+ | E2 | dev-map 一致性检查 | 检查 dev-map 与实际代码是否一致 |
17
+ | E3 | 配置同步检查 | 检查各配置文件是否同步 |
18
+
19
+ ## 通过条件
20
+
21
+ - CHANGELOG Unreleased 区域有内容
22
+ - dev-map 与代码一致
23
+ - 配置文件同步
24
+
25
+ ## 失败条件
26
+
27
+ - CHANGELOG 未更新 → WARNING
28
+ - dev-map 不一致 → WARNING
29
+ - 配置不同步 → WARNING
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: security-quality
3
+ description: 安全与质量检查 — CVE 依赖审计、Code Review Approval 状态
4
+ ---
5
+
6
+ # 安全与质量检查 (Security & Quality)
7
+
8
+ > **源文件**: `.harness/gate/checks/security-quality.js`
9
+ > **类别**: D 类 — 安全与质量
10
+
11
+ ## 检查项
12
+
13
+ | 编号 | 检查项 | 说明 |
14
+ |------|--------|------|
15
+ | D1 | npm audit 安全审计 | 检测 CVE 漏洞(HIGH/CRITICAL 级别) |
16
+ | D2 | Code Review Approval | 检查代码审查状态(通过 Git 信息判断) |
17
+
18
+ ## 通过条件
19
+
20
+ - 安全评分 ≥ 80 分
21
+ - 无 CRITICAL 级别 CVE 漏洞
22
+ - HIGH 级别漏洞有修复计划
23
+
24
+ ## 失败条件
25
+
26
+ - 存在 CRITICAL 级别漏洞 → FAIL
27
+ - 安全评分 < 60 分 → FAIL
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: static-compliance
3
+ description: 静态合规检查 — ESLint、Prettier、console.log 残留、硬编码字符串、Secret 泄露检测
4
+ ---
5
+
6
+ # 静态合规检查 (Static Compliance)
7
+
8
+ > **源文件**: `.harness/gate/checks/static-compliance.js`
9
+ > **类别**: A 类 — 静态合规
10
+
11
+ ## 检查项
12
+
13
+ | 编号 | 检查项 | 说明 |
14
+ |------|--------|------|
15
+ | A1 | ESLint 检查 | 零 error,零 warning |
16
+ | A2 | Prettier 格式化 | 格式化后无 diff 变更 |
17
+ | A3 | console.log / debugger 残留 | 禁止残留到生产代码 |
18
+ | A4 | 硬编码字符串检测 | 检测未国际化的中文字符串 |
19
+ | A5 | TODO/FIXME 残留 | 检测遗留的 TODO/FIXME |
20
+ | A6 | 命名规范检查 | 检查文件名/变量名是否符合规范 |
21
+ | A7 | 文件长度限制 | 单文件不超过 300 行 |
22
+ | A8 | Secret 泄露检测 | 检测硬编码的密钥/Token/密码 |
23
+
24
+ ## 通过条件
25
+
26
+ - ESLint 零错误
27
+ - Prettier 格式一致
28
+ - 无 console.log / debugger 残留
29
+ - 无 Secret 泄露
30
+
31
+ ## 失败条件
32
+
33
+ - ESLint 存在 error → FAIL
34
+ - Secret 泄露检测命中 → FAIL(安全红线)
35
+ - console.log / debugger 残留 → FAIL
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: task-board-maintenance
3
+ description: TaskBoard 维护命令 — 任务注册/状态流转/周报生成/看板同步
4
+ alwaysApply: false
5
+ enabled: true
6
+ ---
7
+
8
+ # TaskBoard 维护 Command
9
+
10
+ > **执行角色**: PM Agent / 工作流引擎
11
+ > **触发时机**: 任务状态变更时、每日定时、周报生成前
12
+ > **源文件**: `.harness/skills/task-board-maintenance/SKILL.md` (已迁移为 command)
13
+
14
+ ---
15
+
16
+ ## 操作清单
17
+
18
+ ### 1. 新任务注册
19
+
20
+ 当 PM 收到新需求时:
21
+
22
+ - 分配 Task ID(格式:TASK-YYYYMMDD-NNN)
23
+ - 判断流程变体类型:
24
+ - 新功能 → 标准七阶段流程
25
+ - Bug 修复 → Bug 修复轻量流程
26
+ - P0/P1 生产问题 → 热修最快路径
27
+ - 文档/配置变更 → 微型流程
28
+ - 安全漏洞 → 安全响应流程
29
+ - 在「待开始任务」表添加一行
30
+ - 检查是否与历史任务重复
31
+ - 如有关联的 Issue/PR,填入对应编号
32
+ - 更新「新增需求」计数器
33
+
34
+ ### 2. 状态推进
35
+
36
+ 当一个阶段完成,需要推入下一阶段:
37
+
38
+ - 从当前区域移动目标任务到下一区域
39
+ - 更新「当前阶段」字段
40
+ - 更新「负责Agent」字段为下一个角色
41
+ - 更新「上次更新」为当前时间
42
+ - 在备注中记录简要原因
43
+ - 如果是打回,在「备注」中注明打回原因和来源角色
44
+
45
+ ### 3. 交付归档
46
+
47
+ 测试 PASS 后:
48
+
49
+ - 移动到「已完成」区域
50
+ - 填写「交付结论」(PASS / CONDITIONAL_PASS)
51
+ - 计算「实际周期」
52
+ - 填写「归档日期」
53
+ - 收集各阶段文档链接
54
+ - 更新度量指标
55
+
56
+ ### 4. 定期维护
57
+
58
+ **每日检查**(PM Agent 自动执行):
59
+ - 检查是否有超时未更新的任务(超过 48 小时)
60
+ - 检查是否有阻塞超过 24 小时的任务
61
+ - 更新「最后更新」时间戳
62
+
63
+ **每周清理**(PM Agent 手动执行):
64
+ - 清理已取消或合并的重复条目
65
+ - 确认已完成任务都已正确归档
66
+ - 生成周度度量报告
67
+ - 识别瓶颈阶段
68
+ - 汇总流程违规情况并提出改进建议
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: test-compliance
3
+ description: 测试合规检查 — 单元测试执行与覆盖率、E2E 测试、API 集成测试
4
+ ---
5
+
6
+ # 测试合规检查 (Test Compliance)
7
+
8
+ > **源文件**: `.harness/gate/checks/test-compliance.js`
9
+ > **类别**: C 类 — 测试合规
10
+
11
+ ## 检查项
12
+
13
+ | 编号 | 检查项 | 说明 |
14
+ |------|--------|------|
15
+ | C1 | 单元测试 | `npm run test -- --coverage` |
16
+ | C2 | E2E 关键路径测试 | 可选 |
17
+ | C3 | API 集成测试 | 可选 |
18
+ | C4 | 测试数量对比 | 基线模式,检测测试是否减少 |
19
+
20
+ ## 通过条件
21
+
22
+ - 单元测试全部 PASS
23
+ - 覆盖率不低于基线
24
+ - 测试数量未减少
25
+
26
+ ## 失败条件
27
+
28
+ - 单元测试失败 → FAIL
29
+ - 覆盖率低于基线 → WARNING
30
+ - 测试数量减少 → WARNING
@@ -25,7 +25,7 @@ POST /api/v1/orders/:id/cancel # 取消订单
25
25
  POST /api/v1/auth/refresh # 刷新 Token
26
26
 
27
27
  # 过滤/排序/分页
28
- GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
28
+ GET /api/v1/users?role=admin&pageNo=1&pageSize=20&sort=createdAt-desc
29
29
  ```
30
30
 
31
31
  ### 统一响应格式
@@ -34,7 +34,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
34
34
 
35
35
  ```json
36
36
  {
37
- "code": 0,
37
+ "code": 200,
38
38
  "data": { ... },
39
39
  "message": "success",
40
40
  "timestamp": 1700000000000
@@ -45,15 +45,13 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
45
45
 
46
46
  ```json
47
47
  {
48
- "code": 0,
48
+ "code": 200,
49
49
  "data": {
50
- "items": [ ... ],
51
- "pagination": {
52
- "page": 1,
53
- "pageSize": 20,
54
- "total": 150,
55
- "totalPages": 8
56
- }
50
+ "list": [ ... ],
51
+ "total": 150,
52
+ "pageNo": 1,
53
+ "pageSize": 20,
54
+ "pages": 8
57
55
  },
58
56
  "message": "success",
59
57
  "timestamp": 1700000000000
@@ -64,7 +62,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
64
62
 
65
63
  ```json
66
64
  {
67
- "code": 20001,
65
+ "code": 400,
68
66
  "message": "参数校验失败",
69
67
  "details": [
70
68
  {
@@ -99,7 +97,7 @@ GET /api/v1/users?role=admin&page=1&pageSize=20&sort=createdAt-desc
99
97
 
100
98
  | 参数 | 类型 | 默认值 | 说明 |
101
99
  |------|------|--------|------|
102
- | `page` | integer | 1 | 页码(从 1 开始)|
100
+ | `pageNo` | integer | 1 | 页码(从 1 开始)|
103
101
  | `pageSize` | integer | 20 | 每页数量(最大 100)|
104
102
  | `sort` | string | `-createdAt` | 排序字段(`-` 表示降序)|
105
103
 
@@ -62,21 +62,42 @@
62
62
  | `viewer` | 只读访问 | 只读用户 |
63
63
  | `user` | 自身数据的读写 | 普通注册用户 |
64
64
 
65
- ### 权限守卫实现
66
-
67
- ```typescript
68
- @UseGuards(JwtAuthGuard)
69
- @Roles(Role.ADMIN, Role.EDITOR)
70
- @Controller('admin/posts')
71
- export class AdminPostController {
72
- // 只有 admin 和 editor 才能访问
73
- @Post()
74
- createPost() {}
65
+ ### Spring Security 权限校验实现
66
+
67
+ ```java
68
+ // ========== 权限注解使用 ==========
69
+ @RestController
70
+ @RequestMapping("/api/v1/admin/users")
71
+ @RequiredArgsConstructor
72
+ public class AdminUserController {
73
+
74
+ @PreAuthorize("hasRole('ADMIN') or hasRole('SUPER_ADMIN')")
75
+ @GetMapping
76
+ @Operation(summary = "分页查询用户(后台管理)")
77
+ public CommonResult<PageResult<UserRespVO>> page(@Valid UserPageReqVO reqVO) {
78
+ return success(userService.getUserPage(reqVO));
79
+ }
80
+
81
+ @PreAuthorize("hasRole('SUPER_ADMIN')")
82
+ @DeleteMapping("/{id}")
83
+ @Operation(summary = "删除用户")
84
+ public CommonResult<Boolean> delete(@PathVariable("id") Long id) {
85
+ userService.deleteUser(id);
86
+ return success(true);
87
+ }
75
88
  }
76
89
 
77
- @Roles(Role.ADMIN) // 只有 admin
78
- @Delete(':id')
79
- deletePost() {}
90
+ // ========== 方法级资源权限校验 ==========
91
+ @Service
92
+ @RequiredArgsConstructor
93
+ public class ProjectServiceImpl implements ProjectService {
94
+
95
+ @Override
96
+ @PreAuthorize("hasPermission(#projectId, 'project', 'edit')")
97
+ public void updateProject(Long projectId, ProjectUpdateReqVO reqVO) {
98
+ // 只有项目成员才能编辑
99
+ }
100
+ }
80
101
  ```
81
102
 
82
103
  ### 权限矩阵
@@ -90,42 +111,46 @@ deletePost() {}
90
111
  | 数据查看 | ✅ | ✅ | ✅ | ✅ | 自身 |
91
112
  | 系统配置 | ✅ | ❌ | ❌ | ❌ | ❌ |
92
113
 
93
- ## 安全中间件链
114
+ ## Spring Security 过滤器链
94
115
 
95
116
  ```
96
117
  请求进入
97
118
 
98
- ├── Helmet (安全头设置)
119
+ ├── SecurityHeadersFilter (安全头设置)
99
120
  │ ├── X-Frame-Options: DENY
100
121
  │ ├── X-Content-Type-Options: nosniff
101
122
  │ └── X-XSS-Protection: 1; mode=block
102
123
 
103
- ├── Rate Limiter (速率限制)
124
+ ├── RateLimitFilter (速率限制 — 基于 Redis + Redisson)
104
125
  │ ├── 全局: 100 req/min
105
126
  │ ├── 登录: 5 req/min (同一 IP)
106
127
  │ └── API: 60 req/min (同一用户)
107
128
 
108
- ├── CORS (跨域控制)
129
+ ├── CorsFilter (跨域控制 — Spring 配置)
109
130
  │ ├── Allow-Origin: [白名单]
110
131
  │ ├── Allow-Methods: GET,POST,PUT,DELETE
111
132
  │ └── Credentials: true
112
133
 
113
- ├── JwtAuthGuard (JWT 认证)
114
- │ ├── 白名单路径跳过: /health, /public/*
115
- │ └── 提取 payload注入 request.user
134
+ ├── JwtAuthenticationFilter (JWT 认证)
135
+ │ ├── 白名单路径跳过: /health, /public/*, /api/v1/auth/login
136
+ │ └── 解析 Token设置 SecurityContext
116
137
 
117
- └── RolesGuard (角色鉴权)
118
- ├── 检查用户角色是否匹配 @Roles()
138
+ └── @PreAuthorize (方法级鉴权)
139
+ ├── 检查用户角色是否匹配
119
140
  └── 不匹配 → 403 Forbidden
120
141
  ```
121
142
 
122
143
  ## 安全 Checklist
123
144
 
124
- - [ ] 所有敏感接口都有认证保护
145
+ - [ ] 所有敏感接口都有认证保护(`@PreAuthorize`)
125
146
  - [ ] Password 使用 bcrypt (cost ≥ 12) 哈希存储
126
- - [ ] Refresh Token 支持吊销(logout 时失效)
147
+ - [ ] 敏感数据(手机号/身份证)使用国密 SM4 加密存储
148
+ - [ ] Refresh Token 支持吊销(logout 时从 DB 删除)
127
149
  - [ ] 登录限制:连续 5 次失败锁定 15 分钟
128
- - [ ] CSRF Token 保护写操作(如果使用 Cookie)
129
- - [ ] SQL 注入防护:全部参数化查询
130
- - [ ] XSS 防护:输出转义、CSP 策略
131
- - [ ] 日志脱敏:不记录 password/token 等敏感字段
150
+ - [ ] CSRF 防护:SameSite Cookie 或 CSRF Token
151
+ - [ ] SQL 注入防护:MyBatis 全部使用 `#{}` 预编译参数绑定
152
+ - [ ] XSS 防护:响应数据脱敏、CSP 策略
153
+ - [ ] 日志脱敏:不记录 password/token/手机号明文等敏感字段
154
+ - [ ] API 响应脱敏:手机号中间4位*、身份证中间*、密码返回 null
155
+ - [ ] Redis key 必须设置 TTL,禁止永不过期
156
+ - [ ] 虚拟线程中禁止使用 synchronized,改用 ReentrantLock