cdspec 0.1.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 (73) hide show
  1. package/AGENTS.md +14 -0
  2. package/CLAUDE.md +10 -0
  3. package/README.md +55 -0
  4. package/cdspec.config.yaml +34 -0
  5. package/dist/cli.js +94 -0
  6. package/dist/config/default.js +48 -0
  7. package/dist/config/loader.js +30 -0
  8. package/dist/config/path.js +11 -0
  9. package/dist/config/types.js +1 -0
  10. package/dist/skill-core/adapters/claudecode-adapter.js +35 -0
  11. package/dist/skill-core/adapters/codex-adapter.js +28 -0
  12. package/dist/skill-core/adapters/iflow-adapter.js +39 -0
  13. package/dist/skill-core/adapters/index.js +34 -0
  14. package/dist/skill-core/adapters/shared.js +36 -0
  15. package/dist/skill-core/agent-config.js +40 -0
  16. package/dist/skill-core/manifest-loader.js +63 -0
  17. package/dist/skill-core/scaffold.js +169 -0
  18. package/dist/skill-core/service.js +156 -0
  19. package/dist/skill-core/tool-interactions.js +70 -0
  20. package/dist/skill-core/types.js +1 -0
  21. package/dist/skill-core/validator.js +25 -0
  22. package/dist/task-core/parser.js +70 -0
  23. package/dist/task-core/service.js +28 -0
  24. package/dist/task-core/storage.js +159 -0
  25. package/dist/task-core/types.js +1 -0
  26. package/dist/utils/frontmatter.js +40 -0
  27. package/dist/utils/fs.js +37 -0
  28. package/package.json +29 -0
  29. package/src/cli.ts +105 -0
  30. package/src/config/default.ts +51 -0
  31. package/src/config/loader.ts +37 -0
  32. package/src/config/path.ts +13 -0
  33. package/src/config/types.ts +22 -0
  34. package/src/skill-core/adapters/claudecode-adapter.ts +45 -0
  35. package/src/skill-core/adapters/codex-adapter.ts +36 -0
  36. package/src/skill-core/adapters/iflow-adapter.ts +49 -0
  37. package/src/skill-core/adapters/index.ts +39 -0
  38. package/src/skill-core/adapters/shared.ts +45 -0
  39. package/src/skill-core/manifest-loader.ts +79 -0
  40. package/src/skill-core/scaffold.ts +192 -0
  41. package/src/skill-core/service.ts +199 -0
  42. package/src/skill-core/tool-interactions.ts +95 -0
  43. package/src/skill-core/types.ts +22 -0
  44. package/src/skill-core/validator.ts +28 -0
  45. package/src/task-core/parser.ts +89 -0
  46. package/src/task-core/service.ts +49 -0
  47. package/src/task-core/storage.ts +177 -0
  48. package/src/task-core/types.ts +15 -0
  49. package/src/types/yaml.d.ts +4 -0
  50. package/src/utils/frontmatter.ts +55 -0
  51. package/src/utils/fs.ts +41 -0
  52. package/templates/design-doc/SKILL.md +99 -0
  53. package/templates/design-doc/agents/openai.yaml +4 -0
  54. package/templates/design-doc/references//345/237/272/347/272/277/346/250/241/346/235/277.md +46 -0
  55. package/templates/design-doc/references//345/242/236/351/207/217/351/234/200/346/261/202/346/250/241/346/235/277.md +32 -0
  56. package/templates/design-doc/references//345/275/222/346/241/243/346/243/200/346/237/245/346/270/205/345/215/225.md +15 -0
  57. package/templates/design-doc/references//347/224/237/344/272/247/345/267/245/345/215/225/345/237/272/347/272/277/347/244/272/344/276/213.md +470 -0
  58. package/templates/design-doc/scripts/validate_doc_layout.sh +49 -0
  59. package/templates/frontend-develop-standard/SKILL.md +63 -0
  60. package/templates/frontend-develop-standard/agents/openai.yaml +4 -0
  61. package/templates/frontend-develop-standard/references/frontend_develop_standard.md +749 -0
  62. package/templates/standards-backend/SKILL.md +55 -0
  63. package/templates/standards-backend/agents/openai.yaml +4 -0
  64. package/templates/standards-backend/references/DDD/346/236/266/346/236/204/347/272/246/346/235/237.md +103 -0
  65. package/templates/standards-backend/references/JUC/345/271/266/345/217/221/350/247/204/350/214/203.md +232 -0
  66. package/templates/standards-backend/references//344/274/240/347/273/237/344/270/211/345/261/202/346/236/266/346/236/204/347/272/246/346/235/237.md +35 -0
  67. package/templates/standards-backend/references//345/220/216/347/253/257/345/274/200/345/217/221/350/247/204/350/214/203.md +49 -0
  68. package/templates/standards-backend/references//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +116 -0
  69. package/templates/standards-backend/references//350/256/276/350/256/241/346/250/241/345/274/217/350/220/275/345/234/260/346/211/213/345/206/214.md +395 -0
  70. package/tests/skill.test.ts +191 -0
  71. package/tests/task.test.ts +55 -0
  72. package/tsconfig.json +16 -0
  73. package/vitest.config.ts +9 -0
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: standards-backend
3
+ description: 部门级后端开发规范执行技能,覆盖后端编码规范、数据库设计规范、传统三层架构约束、DDD架构约束、常用设计模式落地与JUC并发编排规范,并内置数据表基线字段与关联表例外规则。用于需求开发、重构、代码评审、建表SQL设计、接口设计、并发优化与联调前自检等场景;当任务涉及 Java 后端实现、SQL/表结构、分层落位、架构选型(三层或DDD)、可扩展性设计(策略/工厂/责任链/适配器/模板/单例)或线程池/CompletableFuture/CountDownLatch/Semaphore/ReentrantLock/Atomic* 等并发处理时触发。
4
+ ---
5
+
6
+ # 后端开发规范指南
7
+
8
+ ## 总体目标
9
+ 在实现后端需求时,优先保证可维护性、一致性和可演进性,避免临时方案累积技术债务。先判断架构模式,再按对应约束完成编码、建表和自检。
10
+
11
+ ## 执行流程
12
+ 1. 识别任务类型与架构模式。
13
+ - 若需求以简单 CRUD、快速交付为主,优先采用传统三层约束。
14
+ - 若需求业务规则复杂、存在领域边界和长期演进诉求,优先采用 DDD 约束。
15
+ - 若用户明确指定架构,遵从用户指定。
16
+
17
+ 2. 加载对应规范并生成实现方案。
18
+ - 始终加载 `references/后端开发规范.md`。
19
+ - 涉及表结构或 SQL 时加载 `references/数据库设计规范.md`(已内置基础字段与关联表例外)。
20
+ - 传统三层任务加载 `references/传统三层架构约束.md`。
21
+ - DDD 任务加载 `references/DDD架构约束.md`。
22
+ - 需要可扩展设计或多租户差异化时加载 `references/设计模式落地手册.md`。
23
+ - 涉及异步并发、批处理、超时控制时加载 `references/JUC并发规范.md`。
24
+
25
+ 3. 编码与建模时强制执行。
26
+ - 禁止绕过分层边界。
27
+ - 禁止魔法值直写,统一常量或枚举。
28
+ - 禁止把临时修复直接固化到主流程而无抽象。
29
+ - 对关键写操作、关键分支、异常场景补全中文日志和中文注释。
30
+
31
+ 4. 交付前执行自检。
32
+ - 按所选架构完成分层检查、依赖方向检查、命名检查。
33
+ - 按数据库规范检查命名、索引、SQL 性能风险。
34
+ - 检查每张业务表是否包含必备基础字段。
35
+ - 检查设计模式是否“真落地”:是否去掉了硬编码分支,是否可扩展且可测试。
36
+ - 检查并发代码是否具备线程池边界、超时策略、异常收敛和优雅停机能力。
37
+ - 对高风险变更补充测试点或回归说明。
38
+
39
+ ## 交付要求
40
+ 1. 明确说明采用的是传统三层还是 DDD,并给出选择理由。
41
+ 2. 列出本次实现遵循的关键约束。
42
+ 3. 涉及建表时提供基础字段 SQL 片段,不省略注释。
43
+ 4. 输出遗留风险与后续建议,避免将问题留给下一位维护者。
44
+
45
+ ## 参考资料
46
+ - `references/后端开发规范.md`
47
+ - `references/数据库设计规范.md`
48
+ - `references/传统三层架构约束.md`
49
+ - `references/DDD架构约束.md`
50
+ - `references/设计模式落地手册.md`
51
+ - `references/JUC并发规范.md`
52
+
53
+ ## 维护说明
54
+ 1. 本技能文档为部门内部规范文档,不依赖任何外部仓库路径。
55
+ 2. 规范更新通过本技能 references 文件直接维护,避免引用失效。
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "后端开发规范指南"
3
+ short_description: "统一后端、数据库、架构、设计模式与JUC并发的执行技能"
4
+ default_prompt: "Use $department-backend-standards to implement backend changes with department standards for coding, DB design, layered or DDD architecture, design patterns, and JUC concurrency."
@@ -0,0 +1,103 @@
1
+ # DDD 架构约束(项目实战总结版)
2
+
3
+ ## 1. 目标与适用边界
4
+ 1. 本规范用于业务规则复杂、状态流转明确、需要长期演进的模块。
5
+ 2. 以“领域规则内聚、技术细节外置、跨服务编排上收”为核心目标。
6
+ 3. 纯 CRUD 且规则稳定场景优先使用传统三层,不强行 DDD 化。
7
+
8
+ ## 2. 分层模型与职责
9
+ ### 2.1 Performance(接口层)
10
+ 1. 只负责请求接收、参数校验、响应组装。
11
+ 2. 禁止在 Controller 写领域规则和状态流转。
12
+ 3. 对外 DTO 只表达接口语义,不泄露领域内部对象结构。
13
+
14
+ ### 2.2 Application(应用层)
15
+ 1. 负责用例编排、事务边界、流程顺序控制。
16
+ 2. 负责“加载聚合 -> 调用领域行为 -> 持久化 -> 后置动作”的主线流程。
17
+ 3. 可做跨聚合协调,但禁止承载可复用的核心业务规则。
18
+
19
+ ### 2.3 Domain(领域层)
20
+ 1. 聚合根维护一致性边界内的业务不变量。
21
+ 2. 领域实体/值对象暴露业务行为(如提交、确认、状态刷新、数量回写)。
22
+ 3. 领域服务承载跨实体规则,保持无基础设施依赖。
23
+ 4. 对外依赖通过领域接口抽象(如 `*DomainService`、`*Policy`、`*Repository`)。
24
+
25
+ ### 2.4 Infrastructure(基础设施层)
26
+ 1. 实现仓储、策略实现、事件发布器、外部系统客户端。
27
+ 2. 承担实体映射与持久化细节,不写业务编排。
28
+ 3. 将技术框架能力适配为领域可用接口实现。
29
+
30
+ ## 3. 依赖方向与边界约束
31
+ 1. 依赖方向必须稳定:Performance -> Application -> Domain <- Infrastructure。
32
+ 2. Domain 禁止依赖 Spring 配置对象、三方 SDK、数据库/消息中间件 API。
33
+ 3. Application 禁止绕过领域接口直接依赖底层持久化细节。
34
+ 4. Infrastructure 不得反向调用 Application 形成环依赖。
35
+
36
+ ## 4. 聚合设计经验
37
+ 1. 聚合根只维护本聚合状态,不跨聚合直接改写对方对象。
38
+ 2. 聚合行为命名必须体现业务语义(如 `submit`、`confirm`、`ensureCanEdit`),避免 `doXxx`。
39
+ 3. 聚合内校验前置:关键写操作前统一执行可编辑性、状态合法性和明细合法性校验。
40
+ 4. 状态流转规则优先封装到枚举/值对象,避免散落的状态码判断。
41
+ 5. 聚合字段保持业务最小集,查询条件对象与聚合对象分离。
42
+
43
+ ## 5. 应用服务编排经验
44
+ 1. 应用层方法先做轻量参数保护,再加载聚合,最后调用领域行为。
45
+ 2. 提交、确认、删除等写操作必须加事务,防止主子表或多仓储更新不一致。
46
+ 3. 应用层日志至少记录:业务主键、关键状态、明细数量、执行结果。
47
+ 4. 批量操作采用“逐条复用单条逻辑”优先,保证规则一致性。
48
+
49
+ ## 6. 仓储与聚合持久化经验
50
+ 1. 仓储接口定义在 Domain,实现在 Infrastructure。
51
+ 2. 主表与明细作为聚合整体持久化,提供 `saveAggregate/updateAggregate` 语义接口。
52
+ 3. 仓储实现负责“主表落库 + 明细绑定主键 + 明细落库”,应用层不拼装 SQL。
53
+ 4. 查询场景按职责拆分:`findById`、`findByNumber`、`findByIdOrNo` 等语义化接口。
54
+ 5. Converter 统一负责领域对象与持久化对象转换,禁止在应用层手写大量字段搬运。
55
+
56
+ ## 7. 策略与工厂落地经验
57
+ 1. 多租户/多工厂差异规则统一抽象为 `Policy/Strategy` 接口。
58
+ 2. 应用层使用工厂解析策略,先匹配显式配置,再匹配租户能力,最后默认兜底。
59
+ 3. 默认策略必须存在,且行为可预期。
60
+ 4. 策略实现只关注规则差异,不复制主流程。
61
+
62
+ ## 8. 适配器与防腐层经验
63
+ 1. 领域接口与已有应用服务模型不一致时,使用应用层 Adapter 进行桥接转换。
64
+ 2. 适配器职责只做转换与转调,不承载业务决策。
65
+ 3. 外部返回结果判断必须绑定业务语义,禁止笼统“成功/失败兜底”。
66
+
67
+ ## 9. 跨服务编排约束(项目级)
68
+ 1. 原子服务(DDD 主栈)只处理本域逻辑,不直接编排外部微服务调用。
69
+ 2. 跨服务联动统一放聚合层编排(Facade 层)处理。
70
+ 3. 原子服务只负责状态回写、领域规则执行和本域数据一致性。
71
+
72
+ ## 10. 领域事件与一致性经验
73
+ 1. 领域事件接口定义在 Domain,发布实现放 Infrastructure。
74
+ 2. 应用层在聚合状态稳定后触发事件发布,避免中间态事件外泄。
75
+ 3. 事件发布失败策略需明确:重试、补偿或降级日志,不能静默吞掉。
76
+
77
+ ## 11. 校验、异常与日志规范
78
+ 1. 参数校验保持最小必要原则,避免重复校验链。
79
+ 2. 业务异常信息必须可读并包含关键上下文。
80
+ 3. 关键分支、状态变更、异常场景必须有中文日志。
81
+ 4. 禁止在通用兜底里吞异常后继续成功返回。
82
+
83
+ ## 12. 测试与回归要求
84
+ 1. 领域层:聚合行为与状态流转必须有单元测试。
85
+ 2. 基础设施层:仓储聚合保存、更新、删除要有集成测试。
86
+ 3. 接口层:关键 API 场景要有集成测试覆盖。
87
+ 4. 每次重构至少保证“新增/编辑/提交/删除”主链路可回归。
88
+
89
+ ## 13. 反模式清单(必须规避)
90
+ 1. 在 Controller 或 Mapper 层写核心业务规则。
91
+ 2. 领域对象直接依赖 Spring 或外部服务 SDK。
92
+ 3. 应用层出现大量状态码分支,领域对象退化为贫血模型。
93
+ 4. 仓储只存主表不处理聚合明细,导致一致性缺口。
94
+ 5. 没有默认策略实现,新增租户时直接运行失败。
95
+ 6. 跨服务调用下沉到原子服务,破坏边界与可测试性。
96
+
97
+ ## 14. 交付前 DDD 自检清单
98
+ 1. 本次规则是否真正沉淀在 Domain。
99
+ 2. 是否存在跨层越权调用。
100
+ 3. 聚合保存是否覆盖主表与明细一致性。
101
+ 4. 策略扩展是否满足“新增实现类即可扩展”。
102
+ 5. 是否补齐关键测试与中文日志。
103
+ 6. 是否将跨服务编排留在聚合层处理。
@@ -0,0 +1,232 @@
1
+ # JUC 并发规范与样例(部门版)
2
+
3
+ ## 1. 总原则
4
+ 1. 先明确是否真的需要并发,不要把并发当性能“银弹”。
5
+ 2. 并发代码必须具备四件套:线程池边界、超时控制、异常收敛、可观测日志。
6
+ 3. 并发优化必须配套压测或至少基线对比,不允许凭感觉上线。
7
+ 4. 业务写操作并发时,必须先定义幂等与一致性策略。
8
+
9
+ ## 2. 线程池规范
10
+ ### 2.1 必须遵守
11
+ 1. 业务代码禁止直接使用 `Executors` 创建通用线程池。
12
+ 2. 必须显式设置 `corePoolSize`、`maxPoolSize`、`queueCapacity`、`RejectedExecutionHandler`。
13
+ 3. 线程名前缀必须带业务语义,便于排障。
14
+ 4. 必须设置优雅停机参数(等待任务完成与超时时间)。
15
+
16
+ ### 2.2 推荐样例(Spring)
17
+ ```java
18
+ @Configuration
19
+ public class BizThreadPoolConfig {
20
+
21
+ @Bean("orderAsyncExecutor")
22
+ public ThreadPoolTaskExecutor orderAsyncExecutor() {
23
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
24
+ executor.setCorePoolSize(8);
25
+ executor.setMaxPoolSize(16);
26
+ executor.setQueueCapacity(200);
27
+ executor.setKeepAliveSeconds(60);
28
+ executor.setThreadNamePrefix("order-async-");
29
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
30
+ executor.setWaitForTasksToCompleteOnShutdown(true);
31
+ executor.setAwaitTerminationSeconds(30);
32
+ executor.initialize();
33
+ return executor;
34
+ }
35
+ }
36
+ ```
37
+
38
+ ### 2.3 拒绝策略建议
39
+ 1. `AbortPolicy`:核心链路,宁可失败暴露问题。
40
+ 2. `CallerRunsPolicy`:允许调用方降速回压。
41
+ 3. `Discard/DiscardOldest`:仅可用于弱一致、可丢任务场景,需业务签字。
42
+
43
+ ## 3. CompletableFuture 规范
44
+ ### 3.1 必须遵守
45
+ 1. 优先使用业务线程池,禁止默认公共线程池污染全局。
46
+ 2. 聚合调用必须设置整体超时。
47
+ 3. 必须有异常兜底与降级值,禁止直接 `join` 后抛到最外层。
48
+ 4. 合并结果前必须过滤空值与异常结果。
49
+
50
+ ### 3.2 推荐样例
51
+ ```java
52
+ public List<OrderView> queryOrdersAsync(List<String> ids, Executor executor) {
53
+ List<CompletableFuture<OrderView>> futures = ids.stream()
54
+ .map(id -> CompletableFuture.supplyAsync(() -> queryOne(id), executor)
55
+ .completeOnTimeout(OrderView.empty(id), 800, TimeUnit.MILLISECONDS)
56
+ .exceptionally(ex -> {
57
+ log.error("异步查询订单失败, id:{}", id, ex);
58
+ return OrderView.empty(id);
59
+ }))
60
+ .toList();
61
+
62
+ CompletableFuture<Void> all = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
63
+ all.orTimeout(2, TimeUnit.SECONDS).join();
64
+
65
+ return futures.stream()
66
+ .map(CompletableFuture::join)
67
+ .filter(OrderView::valid)
68
+ .toList();
69
+ }
70
+ ```
71
+
72
+ ## 4. CountDownLatch 规范
73
+ ### 4.1 使用边界
74
+ 1. 适合“一次性协同等待”,不适合可复用屏障。
75
+ 2. 每个 `countDown` 必须放在 `finally`,防止死等。
76
+ 3. `await` 必须设置超时,超时后记录上下文并快速失败。
77
+
78
+ ### 4.2 推荐样例
79
+ ```java
80
+ public void batchHandle(List<Task> tasks, Executor executor) throws InterruptedException {
81
+ CountDownLatch latch = new CountDownLatch(tasks.size());
82
+ for (Task task : tasks) {
83
+ executor.execute(() -> {
84
+ try {
85
+ handleOne(task);
86
+ } catch (Exception ex) {
87
+ log.error("并发任务处理失败, taskId:{}", task.getId(), ex);
88
+ } finally {
89
+ latch.countDown();
90
+ }
91
+ });
92
+ }
93
+
94
+ boolean finished = latch.await(30, TimeUnit.SECONDS);
95
+ if (!finished) {
96
+ throw new IllegalStateException("批处理超时,存在未完成任务");
97
+ }
98
+ }
99
+ ```
100
+
101
+ ## 5. Semaphore 规范
102
+ ### 5.1 适用场景
103
+ 1. 需要限制并发访问量,如第三方接口、限连接资源、下游慢服务。
104
+ 2. 单机内“令牌桶”式削峰,避免瞬时把下游打挂。
105
+
106
+ ### 5.2 推荐样例
107
+ ```java
108
+ public class ThirdPartyGateway {
109
+
110
+ private final Semaphore semaphore = new Semaphore(20, true);
111
+
112
+ public Result call(ApiReq req) throws InterruptedException {
113
+ boolean acquired = semaphore.tryAcquire(200, TimeUnit.MILLISECONDS);
114
+ if (!acquired) {
115
+ throw new IllegalStateException("下游繁忙,请稍后重试");
116
+ }
117
+ try {
118
+ return doHttpCall(req);
119
+ } finally {
120
+ semaphore.release();
121
+ }
122
+ }
123
+ }
124
+ ```
125
+
126
+ ### 5.3 注意事项
127
+ 1. `acquire` 后必须在 `finally` 中 `release`。
128
+ 2. 优先 `tryAcquire(timeout)`,避免无限等待。
129
+ 3. 公平锁会牺牲吞吐,默认仅在“先来先服务”强需求时启用公平参数。
130
+
131
+ ## 6. ReentrantLock 规范
132
+ ### 6.1 适用场景
133
+ 1. 需要可中断锁、可轮询尝试锁、读写条件变量等能力。
134
+ 2. 需要比 `synchronized` 更细粒度的锁控制和可观测性。
135
+
136
+ ### 6.2 推荐样例
137
+ ```java
138
+ public class OrderCache {
139
+
140
+ private final ReentrantLock lock = new ReentrantLock();
141
+ private final Map<String, Order> cache = new HashMap<>();
142
+
143
+ public void put(Order order) {
144
+ lock.lock();
145
+ try {
146
+ cache.put(order.getId(), order);
147
+ } finally {
148
+ lock.unlock();
149
+ }
150
+ }
151
+
152
+ public Optional<Order> get(String id) {
153
+ if (!lock.tryLock()) {
154
+ return Optional.empty();
155
+ }
156
+ try {
157
+ return Optional.ofNullable(cache.get(id));
158
+ } finally {
159
+ lock.unlock();
160
+ }
161
+ }
162
+ }
163
+ ```
164
+
165
+ ### 6.3 注意事项
166
+ 1. 禁止 `lock()` 后非 `finally` 解锁。
167
+ 2. 对外部调用或 IO 逻辑不要包在锁内,避免锁膨胀。
168
+ 3. 多锁场景必须固定加锁顺序,避免死锁。
169
+
170
+ ## 7. 原子类规范(Atomic / LongAdder)
171
+ ### 7.1 常用选择
172
+ 1. `AtomicInteger/AtomicLong`:单值计数与状态位。
173
+ 2. `AtomicReference`:无锁替换对象引用。
174
+ 3. `AtomicStampedReference`:需要避免 ABA 问题。
175
+ 4. `LongAdder`:高并发计数优于 `AtomicLong`。
176
+
177
+ ### 7.2 推荐样例
178
+ ```java
179
+ public class StatsCounter {
180
+
181
+ private final LongAdder success = new LongAdder();
182
+ private final LongAdder failed = new LongAdder();
183
+ private final AtomicReference<String> currentBatch = new AtomicReference<>("INIT");
184
+
185
+ public void markSuccess() {
186
+ success.increment();
187
+ }
188
+
189
+ public void markFailed() {
190
+ failed.increment();
191
+ }
192
+
193
+ public boolean switchBatch(String expect, String next) {
194
+ return currentBatch.compareAndSet(expect, next);
195
+ }
196
+ }
197
+ ```
198
+
199
+ ### 7.3 注意事项
200
+ 1. 多字段一致性更新不能只靠原子类,必要时使用锁或事务。
201
+ 2. 原子类只保证单变量原子性,不保证复合操作原子性。
202
+
203
+ ## 8. 常用并发容器与同步器
204
+ ### 8.1 ConcurrentHashMap
205
+ 1. 高并发读写缓存首选 `ConcurrentHashMap`。
206
+ 2. 使用 `computeIfAbsent` 避免重复初始化。
207
+
208
+ ### 8.2 BlockingQueue
209
+ 1. 生产消费解耦优先 `LinkedBlockingQueue/ArrayBlockingQueue`。
210
+ 2. 必须设置容量上限,避免内存无界增长。
211
+
212
+ ### 8.3 CopyOnWriteArrayList
213
+ 1. 读多写少场景可用,写多场景禁止使用。
214
+
215
+ ### 8.4 CyclicBarrier / Phaser
216
+ 1. `CyclicBarrier` 适合固定参与方的分阶段任务。
217
+ 2. `Phaser` 适合参与方动态变化的分阶段协同。
218
+
219
+ ## 9. 并发反模式
220
+ 1. `CompletableFuture.completedFuture(同步查询)` 伪异步。
221
+ 2. 静态全局 `CountDownLatch` 工具类跨任务复用,导致串扰。
222
+ 3. 不区分业务池和公共池,导致不同模块相互拖垮。
223
+ 4. 捕获异常后静默吞掉,线上只能看到“卡死/超时”。
224
+ 5. 使用无界队列和无限重试掩盖系统容量问题。
225
+ 6. 把共享可变对象放进并发容器后误以为“业务线程安全”。
226
+
227
+ ## 10. 交付前并发检查清单
228
+ 1. 是否声明了线程池参数并解释依据。
229
+ 2. 是否设置了超时和异常兜底。
230
+ 3. 是否记录关键并发日志(任务数、耗时、失败数)。
231
+ 4. 是否验证了停机或发布期间的任务收敛行为。
232
+ 5. 是否说明共享状态的并发保护手段(锁/原子/隔离)。
@@ -0,0 +1,35 @@
1
+ # 传统三层架构约束(Controller-Service-Mapper)
2
+
3
+ ## 1. 适用范围
4
+ 1. 业务以 CRUD 为主,规则相对简单。
5
+ 2. 项目周期短、团队规模小、强调交付速度。
6
+ 3. 不适合复杂跨域流程和高频业务规则变更场景。
7
+
8
+ ## 2. 分层职责
9
+ 1. Controller 层:接收请求、参数校验、统一返回,不承载复杂业务。
10
+ 2. Service 层:承载业务逻辑、事务边界、流程控制。
11
+ 3. Mapper/Repository 层:专注数据访问,不承载业务决策。
12
+ 4. Convert 层:负责 DTO/VO/Entity 转换,避免污染业务层。
13
+
14
+ ## 3. 强制约束
15
+ 1. Controller 禁止直接访问 Mapper。
16
+ 2. Service 禁止返回数据库实体给前端。
17
+ 3. Mapper 接口仅暴露数据访问方法,命名表达查询语义。
18
+ 4. 复杂查询优先 XML/动态 SQL,禁止拼接裸 SQL 字符串。
19
+ 5. 事务注解放在 Service 层,避免跨层事务失控。
20
+
21
+ ## 4. 代码组织建议
22
+ 1. 包结构建议:`controller`、`service`、`service.impl`、`mapper`、`entity`、`convert`。
23
+ 2. 类命名建议:`XxxController`、`IXxxService`、`XxxServiceImpl`、`XxxMapper`。
24
+ 3. 使用 MyBatis-Plus 时,仍需显式表达业务规则,不要把业务混在查询构造器里。
25
+
26
+ ## 5. 常见反模式
27
+ 1. 在 Controller 写业务编排。
28
+ 2. 在 Mapper 写业务规则判断。
29
+ 3. Service 方法过长且无领域语义,只有流程堆砌。
30
+ 4. 返回模型复用混乱,导致 API 和数据库实体耦合。
31
+
32
+ ## 6. 交付检查
33
+ 1. 每个接口的入参、出参、错误码是否统一。
34
+ 2. 关键写操作是否记录中文日志。
35
+ 3. 是否补充了最小回归测试。
@@ -0,0 +1,49 @@
1
+ # 后端开发规范(部门版)
2
+
3
+ ## 1. 命名与结构
4
+ 1. 包名全部小写,按语义分层组织。
5
+ 2. 类名使用大驼峰,方法/变量使用小驼峰。
6
+ 3. 命名必须表达业务语义,避免拼音、无意义缩写、单字符变量(循环计数除外)。
7
+ 4. 常量必须使用 `static final`,常量名全大写下划线分隔。
8
+ 5. 枚举值全大写下划线分隔,枚举要体现业务语义。
9
+
10
+ ## 2. 对象分层
11
+ 1. `Entity`:仅做数据库映射,不承载业务流程。(老项目不改动,新项目需遵守)
12
+ 2. `ReqDTO/RespDTO`:跨服务传输对象,仅保留必要字段。(老项目不改动,新项目需遵守)
13
+ 3. `ReqVO/RespVO`:接口展示对象,可做展示格式适配。(老项目不改动,新项目需遵守)
14
+
15
+
16
+ ## 3. 注释与日志
17
+ 1. 类、方法、复杂分支必须有中文注释,说明“做什么、为什么这样做”。
18
+ 2. 关键写操作必须记录中文日志,包含业务主键与结果。
19
+ 3. 异常场景必须记录错误原因、输入上下文。
20
+ 4. 日志避免输出敏感信息(密钥、完整证件号、明文密码)。
21
+
22
+ ## 4. 控制器与返回
23
+ 1. Controller 仅做参数接收、校验、调用应用服务,不写业务核心逻辑。
24
+ 2. 接口返回统一结果模型,错误码和文案来自统一枚举。
25
+ 3. 禁止直接暴露领域对象作为对外接口返回值。
26
+ 4. URI 命名保持语义清晰并与业务动作一致。
27
+
28
+ ## 5. 异常与校验
29
+ 1. 业务异常与系统异常分层处理,禁止一把抓 `Exception` 后直接吞掉。
30
+ 2. 参数校验前置,尽量使用声明式校验(如 Bean Validation)。
31
+ 3. 禁止重复、冗余校验,避免多处维护同一规则。
32
+ 4. 比较字符串时避免空指针风险,优先常量调用 `equals`。
33
+
34
+ ## 6. 并发与基础能力
35
+ 1. 禁止直接使用 `Executors` 创建线程池,使用 `ThreadPoolExecutor` 显式配置边界。
36
+ 2. 优先使用 `java.time` 替代 `Date` / `Calendar` / `SimpleDateFormat`。
37
+ 3. 不使用过时 API。
38
+ 4. 复写方法必须显式加 `@Override`。
39
+
40
+ ## 7. 代码质量门禁
41
+ 1. 提交前通过静态检查(Checkstyle/PMD/FindBugs/SonarQube)。
42
+ 2. 新增模块必须提供最小可回归测试路径。
43
+ 3. 出现“临时方案”时,必须补充重构计划或明确技术债登记。
44
+
45
+ ## 8. 可扩展性与并发基线
46
+ 1. 业务分支超过 3 个且预计持续增长时,优先引入策略/工厂/责任链等可扩展模式。
47
+ 2. 外部系统字段模型不一致时,优先通过适配器隔离,不在主流程直接拼装转换。
48
+ 3. 异步并发能力统一走线程池,禁止散落创建线程。
49
+ 4. 并发逻辑必须具备超时、降级和错误日志,禁止无边界 `join/await`。
@@ -0,0 +1,116 @@
1
+ # 数据库设计规范(部门版)
2
+
3
+ ## 1. 命名规范
4
+ 1. 数据库对象名使用小写字母、数字、下划线,禁止数字开头。
5
+ 2. 表名使用模块前缀:`sss_xxx`,关系表使用 `sss_xxx_yyy_rel`。
6
+ 3. 字段名全小写下划线,命名必须可读且语义明确。
7
+ 4. 同语义字段在不同表必须同名同类型。
8
+ 5. 关联字段统一 `xxx_id`,类型与被关联主键一致。
9
+
10
+ ## 2. 字段设计
11
+ 1. 时间字段:精确到时分秒使用 `xxx_time`(`datetime`);仅日期使用 `xxx_date`(`date`)。
12
+ 2. 标志字段使用 `xxx_flag`;逻辑删除建议统一 `del_flag`(0 未删除,1 已删除)。
13
+ 3. 类型字段统一 `xxx_type` 或 `xxx_category`,避免含义不清的数值编码。
14
+ 4. 布尔字段命名建议使用 `is_` / `has_` 前缀,避免否定命名。
15
+
16
+ ## 3. 表结构基本约束
17
+ 1. 存储引擎统一 InnoDB。
18
+ 2. 字符集统一 `utf8mb4`,排序规则统一 `utf8mb4_general_ci`。
19
+ 3. 每张表必须有表注释,每个字段必须有字段注释。
20
+ 4. 主键建议单一代理键;桥接表可按场景使用复合主键。
21
+
22
+ ## 4. 索引规范
23
+ 1. 索引命名使用 `idx_表名_字段名`。
24
+ 2. 唯一约束命名使用 `uk_表名_字段名`。
25
+ 3. 关联字段必须建索引,避免联表全表扫描。
26
+ 4. 单表索引数量建议控制,避免无效和重复索引。
27
+ 5. 联合索引遵循最左前缀原则,结合常见查询条件设计。
28
+
29
+ ## 5. SQL 编写规范
30
+ 1. 禁止 `select *`,只查询必要列。
31
+ 2. 多表查询统一使用别名并带别名前缀。
32
+ 3. 分页查询必须限制返回量,避免深分页性能问题。
33
+ 4. 避免在索引列上使用函数、隐式转换、前导模糊匹配。
34
+ 5. 条件值可能为空时,使用 `is null` / `is not null` 语义表达。
35
+
36
+ ## 6. 变更脚本规范
37
+ 1. 版本号采用 `<major>.<minor>.<patch>`。
38
+ 2. 脚本命名:`[V|R][版本号]_[序号]__[模块]_[操作]_[描述].sql`。
39
+ 3. `V` 脚本只执行一次且不允许改动;`R` 脚本每次运行可重复执行。
40
+ 4. 生产变更必须提供回滚策略或数据修复策略。
41
+
42
+ ## 7. 设计评审清单
43
+ 1. 是否存在冗余字段或语义不清字段。
44
+ 2. 是否缺失必要索引或存在过度索引。
45
+ 3. 是否满足基础字段要求(见本文第 8 章)。
46
+ 4. 是否考虑了租户、并发更新、历史追溯需求。
47
+
48
+ ## 8. 数据表基线字段规范(内置)
49
+
50
+ ### 8.1 普通业务表(默认必须)
51
+ 以下字段为部门级默认基线,除评审通过外不得删除。
52
+
53
+ ```sql
54
+ `id` varchar(36) NOT NULL COMMENT '主键',
55
+ `del_flag` tinyint(4) DEFAULT '0' COMMENT '逻辑删除标志:0-未删除,1-已删除',
56
+ `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',
57
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
58
+ `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
59
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
60
+ `version` int(11) DEFAULT '0' COMMENT '乐观锁版本号'
61
+ ```
62
+
63
+ 如启用多租户,追加:
64
+
65
+ ```sql
66
+ `tenant_id` int(11) DEFAULT NULL COMMENT '租户ID'
67
+ ```
68
+
69
+ ### 8.2 关联表(中间关系表)例外规则
70
+ 纯关联表允许精简字段,不强制套用 8.1 的完整审计字段。典型形态如下:
71
+
72
+ ```sql
73
+ `id` varchar(36) NOT NULL COMMENT '主键',
74
+ `user_id` varchar(36) NOT NULL COMMENT '用户ID',
75
+ `role_id` varchar(36) NOT NULL COMMENT '角色ID'
76
+ ```
77
+
78
+ 多租户场景建议追加:
79
+
80
+ ```sql
81
+ `tenant_id` int(11) DEFAULT NULL COMMENT '租户ID'
82
+ ```
83
+
84
+ 补充约束:
85
+ 1. 关联表最少保证 `id + 两端关联ID`,不强制 `del_flag/create_*/update_*/version`。
86
+ 2. 若关联关系需要审计追踪、逻辑删除或并发控制,再按 8.1 补齐字段。
87
+ 3. 应建立唯一约束避免重复关系(例如 `uk_user_role(user_id, role_id[, tenant_id])`)。
88
+ 4. 应给关联 ID 建索引(`idx_xxx_user_id`、`idx_xxx_role_id`)。
89
+
90
+ ### 8.3 历史表(默认必须)
91
+ 历史表应包含原表核心业务字段,并追加:
92
+
93
+ ```sql
94
+ `instance_id` varchar(36) DEFAULT NULL COMMENT '历史实例ID',
95
+ `transaction_by` varchar(32) DEFAULT NULL COMMENT '变更人',
96
+ `transaction_time` datetime DEFAULT NULL COMMENT '变更时间'
97
+ ```
98
+
99
+ ### 8.4 推荐建表示例(普通业务表)
100
+ ```sql
101
+ create table `wms_example_order` (
102
+ `id` varchar(36) not null comment '主键',
103
+ `order_no` varchar(64) not null comment '单据编号',
104
+ `order_status` varchar(32) not null comment '单据状态',
105
+ `del_flag` tinyint(4) default '0' comment '逻辑删除标志:0-未删除,1-已删除',
106
+ `create_by` varchar(50) default null comment '创建人',
107
+ `create_time` datetime default null comment '创建时间',
108
+ `update_by` varchar(50) default null comment '更新人',
109
+ `update_time` datetime default null comment '更新时间',
110
+ `tenant_id` int(11) default null comment '租户ID',
111
+ `version` int(11) default '0' comment '乐观锁版本号',
112
+ primary key (`id`),
113
+ key `idx_wms_example_order_order_no` (`order_no`),
114
+ key `idx_wms_example_order_status` (`order_status`)
115
+ ) engine=innodb default charset=utf8mb4 collate=utf8mb4_general_ci comment='示例订单表';
116
+ ```