create-dp-koa 1.0.0 → 1.0.1

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.
@@ -0,0 +1,100 @@
1
+ ---
2
+ alwaysApply: false
3
+ ---
4
+ # Skill:中间件开发与注册规范(src/middlewares)
5
+
6
+ ## 适用与触发(重要)
7
+ - 仅当需要新增/修改中间件(`src/middlewares/*`)或调整中间件注册顺序(`src/framework/utils/bootstrap.ts`、`src/app.ts`、`src/routers/index.ts`)时启用本 Skill。
8
+ - 触发口令建议:
9
+ - “请按 `70-backend-middleware.skill.md` 新增/调整中间件”
10
+
11
+ ---
12
+
13
+ ## 一、目录与命名(必须)
14
+ - 中间件放在:`src/middlewares/`
15
+ - 文件名使用:`xxx.middleware.ts`
16
+ - 导出方式建议统一为“工厂函数返回 koa middleware”:
17
+ - `export default function xxxMiddleware(options?) { return async (ctx, next) => { ... } }`
18
+ - 或 `export const xxxMiddleware = (options?) => async (ctx, next) => { ... }`
19
+
20
+ ---
21
+
22
+ ## 二、已有中间件模式(对齐现状)
23
+ 请对齐本项目现有实现风格(不要臆造不存在的框架能力):
24
+ - `token.middleware.ts`:认证/鉴权类中间件(读取 Authorization Bearer token,验签后写入 `ctx.state.user`)
25
+ - `logging.middleware.ts`:请求链路日志/审计/性能(挂载 `ctx.logger`、`ctx.requestId`)
26
+ - `static.middleware.ts`:静态资源挂载(`koa-mount + koa-static`)
27
+ - `error.middleware.ts`:简单错误兜底(本项目框架层已有更强的 error middleware,谨慎重复)
28
+
29
+ ---
30
+
31
+ ## 三、中间件职责边界(必须)
32
+
33
+ ### 3.1 允许做的事
34
+ - **读取/设置 ctx 上下文**:如 `ctx.state.user`、`ctx.requestId`、`ctx.logger`
35
+ - **做鉴权/限流/审计/缓存/静态资源**等横切能力
36
+ - **按需提前返回**:例如鉴权失败时设置 `ctx.status` + `ctx.body` 并 `return`
37
+
38
+ ### 3.2 禁止做的事
39
+ - ❌ 在中间件里写业务逻辑(应下沉 Service/Controller)
40
+ - ❌ 在中间件里直接访问数据库(除非该中间件明确是“框架级基础设施”,且有清晰的性能与错误策略)
41
+ - ❌ 吞掉错误不抛出导致上层错误处理中间件失效(除非明确要拦截并返回标准错误响应)
42
+
43
+ ---
44
+
45
+ ## 四、错误处理规范(必须)
46
+ - 中间件必须遵循 “可观测 + 可恢复”:
47
+ - 能处理的错误:在当前中间件内返回明确的 `ctx.status`/`ctx.body`
48
+ - 不能处理的错误:记录日志后 `throw`,交给框架层错误处理中间件统一处理
49
+ - 鉴权类中间件建议:
50
+ - 缺 token:`401` + 明确 message
51
+ - token 无效/过期:`401` + 明确 message
52
+
53
+ ---
54
+
55
+ ## 五、ctx.state 与上下文规范(必须)
56
+ - 认证/鉴权类中间件必须把用户最小信息写入 `ctx.state.user`
57
+ - 推荐字段:`userId`、`type`(以项目实际 token payload 为准)
58
+ - Controller 读取用户信息应通过 `@State()` 或 `@State('user')`(由 Controller 规范约束)
59
+
60
+ ---
61
+
62
+ ## 六、注册位置与顺序(必须)
63
+
64
+ ### 6.1 全局中间件(bootstrap 阶段)
65
+ 在 `src/framework/utils/bootstrap.ts` 中,框架已注册:
66
+ - CORS
67
+ - loggingMiddleware / businessLoggingMiddleware / databaseLoggingMiddleware
68
+ - frameworkErrorMiddleware(框架级错误处理中间件)
69
+ - koaBody
70
+ - router.routes/allowedMethods
71
+
72
+ 当你需要新增“全局中间件”时:
73
+ - 只能在 **before 阶段**(`setBeforeBootstrap`)通过 `app.use(...)` 注册
74
+ - 并遵守 `50-backend-bootstrap-lifecycle.skill.md` 的 before/after 约束
75
+
76
+ ### 6.2 路由级中间件(bindRouter 阶段)
77
+ 在 `src/routers/index.ts` 中,通过:
78
+ - `bindRouter(prefix, middleware1, middleware2, Controller)`
79
+
80
+ 适用:
81
+ - 认证/鉴权(示例:当前项目为 `tokenMiddleware()`,未来名称可能变化)
82
+ - 某模块/某前缀下的专用拦截器
83
+
84
+ 顺序规则:
85
+ - 先认证/鉴权,再业务相关中间件
86
+
87
+ ---
88
+
89
+ ## 七、Swagger 中间件(当前暂不启用)
90
+ - 项目中存在 `swagger.middleware.ts`,但如果当前阶段“不需要 swagger”,不要在启动/路由中注册该中间件。
91
+
92
+ ---
93
+
94
+ ## 八、测试建议(可选但推荐)
95
+ - 单元测试优先覆盖:
96
+ - 鉴权中间件:缺 token / 无效 token / 有效 token 能写入 `ctx.state.user`
97
+ - 日志中间件:是否写入 `ctx.requestId`、是否脱敏 headers
98
+ - 静态中间件:prefix 正规化(`/static` vs `/static/`)
99
+
100
+
@@ -0,0 +1,108 @@
1
+ ---
2
+ alwaysApply: false
3
+ ---
4
+ # Skill:libs 与 utils 规划规范
5
+
6
+ ## 适用与触发(重要)
7
+ - 当需要新增/调整以下内容时启用本 Skill:
8
+ - `src/libs/**` 下的类库/适配层
9
+ - `src/utils/**` 下的工具函数
10
+ - 业务模块内部的 `xxx.utils.ts`
11
+
12
+ ---
13
+
14
+ ## 一、总体原则
15
+
16
+ - **libs**:更偏向“小框架 / 小 SDK / 第三方服务适配层”
17
+ - **utils**:更偏向“纯函数工具、小颗粒度无状态函数”
18
+ - 业务相关的工具优先放在**各自业务模块内**,而不是全局 `utils/`
19
+
20
+ ---
21
+
22
+ ## 二、`src/libs/**` 放什么(必须)
23
+
24
+ ### 2.1 适合放在 libs 的内容
25
+ - **第三方服务适配/封装**:
26
+ - 如:短信服务封装、支付网关封装、HTTP SDK 封装等
27
+ - 对外暴露一个干净的接口:如 `sendSms(phone, templateId, params)`
28
+ - **可抽成独立 npm 包的库**:
29
+ - 例如通用缓存实现、加解密库、统一重试器等
30
+ - **有内部状态或生命周期的组件**:
31
+ - 连接池包装器、复杂缓存管理器、网关客户端等
32
+
33
+ ### 2.2 不适合放在 libs 的内容
34
+ - 单一的小工具函数(字符串、日期、数字转换等)
35
+ - 强业务耦合的逻辑(如订单价格计算、业务规则判断)
36
+
37
+ ---
38
+
39
+ ## 三、`src/utils/**` 放什么(必须)
40
+
41
+ ### 3.1 适合放在 utils 的内容
42
+ - **与业务无关的纯函数工具**:
43
+ - 时间、字符串、数字处理
44
+ - 通用 Promise/重试/节流/防抖等
45
+ - **框架内的通用工具**:
46
+ - 例如:框架级测试数据初始化工具、通用校验帮助函数(若确实需要全局可见)
47
+
48
+ ### 3.2 不适合放在 utils 的内容
49
+ - 直接访问数据库的函数(应放 Service/Repository 或框架层 utils 内聚)
50
+ - 调用第三方 HTTP API 的函数(应放 libs 作为适配层)
51
+ - 仅服务单一业务模块的工具(应放在该模块内部的 `xxx.utils.ts`)
52
+
53
+ ---
54
+
55
+ ## 四、业务模块内的 utils(推荐)
56
+
57
+ - 用户模块示例:
58
+ - `src/service/user/user.utils.ts`
59
+ - 商品模块示例:
60
+ - `src/service/goods/goods.utils.ts`
61
+
62
+ 规则:
63
+ - 仅供本模块使用的业务工具函数,应优先放在模块自身的 utils 文件中
64
+ - 全局 `utils/` 仅存放 **跨模块通用** 的工具
65
+
66
+ ---
67
+
68
+ ## 五、如何决策“新代码放哪”(实用检查清单)
69
+
70
+ 新增工具/类库时,按以下顺序判断:
71
+
72
+ 1. **是否依赖第三方服务/外部系统或有复杂状态?**
73
+ - 是 → 优先放 `libs/`(适配层/小 SDK)
74
+ 2. **是否明显只服务某一个业务模块?**
75
+ - 是 → 放到该模块自己的 `xxx.utils.ts`
76
+ 3. **是否 100% 纯函数、无状态且可跨多个模块复用?**
77
+ - 是 → 放到全局 `utils/`
78
+ 4. **未来是否有机会抽为独立 npm 包?**
79
+ - 是 → 更倾向放 `libs/`
80
+
81
+ ---
82
+
83
+ ## 六、命名规范(推荐)
84
+
85
+ - `libs` 目录下:
86
+ - 文件名:`tecentSms.ts` / `mCache.ts` 等,体现“库/适配器”的语义
87
+ - 导出:优先导出类或工厂函数,如 `export class TencentSmsClient { ... }`
88
+ - `utils` 目录下:
89
+ - 文件名:`date.utils.ts` / `string.utils.ts` / `testDataInitializer.ts` 等
90
+ - 导出:纯函数 `export function xxx(...) { ... }`
91
+
92
+ ---
93
+
94
+ ## 七、框架级 `src/framework/utils/function.ts`(必须)
95
+
96
+ 本文件提供**运行环境判定**,全项目应统一使用,避免散落 `NODE_ENV === 'production'` 判断。
97
+
98
+ | API | 含义 |
99
+ |-----|------|
100
+ | `isDebug()` | `process.argv` 含 `--env=debug` 为 `true` |
101
+ | `getRuntimeEnvironmentLabel()` | `'development'`(debug)或 `'production'`(非 debug),用于日志/元数据 |
102
+
103
+ **约定**:
104
+
105
+ - **非 debug = 生产口径**(迁移、静态缓存策略、对外错误信息是否脱敏等)。
106
+ - **不要**单独用 `NODE_ENV` 替代上述判定;`NODE_ENV=test` 仅用于 Jest 等测试分支。
107
+ - 新增种子脚本若需读 `.env.development`,启动命令应带 `--env=debug`(与 `bootstrap` 一致)。
108
+
@@ -0,0 +1,65 @@
1
+ # 后端插件体系规范(dp-koa-framework 模板)
2
+
3
+ > 目标:让“独立功能体”以插件形式存在,可插拔、易维护、与宿主框架低耦合。
4
+
5
+ ---
6
+
7
+ ## 1. 插件的基本形态
8
+
9
+ - 插件统一放在 `src/plugins/<plugin-id>/` 目录下。
10
+ - 插件根目录只保留 `index.ts`(插件入口)。
11
+ - 插件入口必须导出一个 `PluginDescriptor`(见 `src/framework/plugins/types.ts`)。
12
+
13
+ 推荐目录结构:
14
+
15
+ - `src/plugins/<plugin-id>/index.ts`
16
+ - `src/plugins/<plugin-id>/core/`:类型、错误、上下文解析、纯函数工具
17
+ - `src/plugins/<plugin-id>/http/`:HTTP 路由入口(Koa Router)
18
+ - `src/plugins/<plugin-id>/entities/`:TypeORM 实体(插件自有表)
19
+ - `src/plugins/<plugin-id>/services/`:插件业务 Service
20
+ - `src/plugins/<plugin-id>/scripts/`:种子/运维脚本(可选)
21
+
22
+ ---
23
+
24
+ ## 2. 宿主与插件的依赖方向
25
+
26
+ ### 2.1 插件 → 宿主
27
+
28
+ - 插件内部业务代码应优先使用相对路径组织。
29
+ - 插件调用宿主业务能力(如用户、项目、权限)应通过 **plugin-api 门面层**(建议放在 `src/plugin-api/*`),避免直接 import 宿主 Service/Repository。
30
+
31
+ ### 2.2 宿主 → 插件
32
+
33
+ - 宿主禁止直接 import 插件 Service。
34
+ - 宿主感知插件能力应通过:
35
+ - 事件扩展点(emit + register handler)
36
+ - SPI(可替换实现:getXxxSpi + registerXxxSpi)
37
+
38
+ ---
39
+
40
+ ## 3. 插件注册与加载
41
+
42
+ - 插件注册表:`src/framework/plugins/registry.ts`
43
+ - 宿主启动接入点:`src/app.ts`
44
+ - beforeBootstrap:计算启用插件、执行插件 before hook、注册插件路由、合并插件实体后初始化 DB
45
+ - afterBootstrap:执行插件 after hook(定时任务/订阅等)
46
+
47
+ ---
48
+
49
+ ## 4. 插件数据库规范
50
+
51
+ - 插件自建表必须使用插件 ID 作为表名前缀(例如 `weboffice_files`、`weboffice_file_versions`)。
52
+ - 插件迁移原则上只操作自身前缀表,避免修改宿主核心表结构。
53
+
54
+ ---
55
+
56
+ ## 5. 示例插件:weboffice
57
+
58
+ 模板内置示例插件:`src/plugins/weboffice/`
59
+
60
+ - 通过 `WEBOFFICE_ENABLED` 环境变量控制启用(默认启用;设为 `0` 禁用)。
61
+ - 路由入口:`src/plugins/weboffice/http/routes.ts`
62
+ - 插件实体:`src/plugins/weboffice/entities/*`
63
+
64
+ > 注意:模板示例插件的 `getUsers` 为占位实现(不依赖宿主业务用户表)。真实业务接入时应改为通过 plugin-api 调宿主用户体系。
65
+
@@ -0,0 +1,29 @@
1
+ ---
2
+ alwaysApply: false
3
+ ---
4
+ # Skill:后端测试规范(Jest)
5
+
6
+ ## 一、测试基础
7
+
8
+ - 使用 Jest
9
+ - 使用 `TestDatabaseHelper` 管理测试数据库
10
+ - 使用 `Provider` 获取 Service 实例
11
+
12
+ ---
13
+
14
+ ## 二、测试要求
15
+
16
+ - 必须覆盖:
17
+ - 成功场景
18
+ - 失败场景
19
+ - 边界条件
20
+ - 测试必须相互独立
21
+ - 每个测试前重置数据
22
+
23
+ ---
24
+
25
+ ## 三、测试文件结构
26
+
27
+ - Controller:`test/controllers/**`
28
+ - Service:`test/service/**`
29
+ - Framework:`test/framework/**`
@@ -0,0 +1,49 @@
1
+ # Cursor Rules 索引(Backend Skills)
2
+
3
+ 本目录用于约束/引导 Cursor 在本项目中的后端代码生成与修改行为。
4
+
5
+ ## 使用建议(先选 Command,再选 Skill)
6
+ - **需要先规划再动手**:用 `.cursor/commands/plan-backend.md`
7
+ - **要写/改 Controller**:用 `.cursor/commands/implement-backend-api-controller.md`(并按需启用 `11-...` Recipes)
8
+ - **只想要 Controller 范式/注解速查**:用 `.cursor/commands/cheatsheet-backend-controller.md`
9
+
10
+ ## Skills 列表(按编号/作用域)
11
+
12
+ ### 00 - 核心约束(默认全局)
13
+ - **`00-backend-core.skill.md`**(alwaysApply: true)
14
+ - 分层架构(Controller/Service/Repository)
15
+ - 基类继承与统一响应结构(`BaseController.success/fail`、`CommonServiceResult`)
16
+ - **运行环境判定**:`isDebug()` / `getRuntimeEnvironmentLabel()`(与 `NODE_ENV` 解耦,详见该文件)
17
+
18
+ ### 10 - Controller / API(按需启用)
19
+ - **`10-backend-api.skill.md`**
20
+ - Controller 编排规则:DTO + Service 调用 + 统一响应映射 + try/catch
21
+ - **`11-backend-controller-recipes.skill.md`**
22
+ - Controller 推荐模板(可复制)+ 常用注解速查(@Query/@Body/@State/...)
23
+
24
+ ### 20~40 - 数据/校验/错误(按需启用)
25
+ - **`20-backend-repository.skill.md`**:Repository 使用与事务(`transactionManager.executeInTransaction`)
26
+ - **`30-backend-validation.skill.md`**:DTO 分层规范(Controller DTO / Service DTO)、命名规范、转换规范、参数校验(@ParamValidate)
27
+ - **`40-backend-error-logging.skill.md`**:错误处理与日志(try/catch、脱敏、上下文)
28
+
29
+ ### 50~70 - 启动/路由/中间件(按需启用)
30
+ - **`50-backend-bootstrap-lifecycle.skill.md`**
31
+ - `setBeforeBootstrap` / `setAfterBootstrap` 的职责与禁止项
32
+ - `.env` 选择、`isDebug()`、迁移与 webpack 显式注册迁移(`APP_MIGRATIONS`)
33
+ - **`60-backend-router-registration.skill.md`**
34
+ - `src/routers/index.ts` + `bindRouter` 的注册规范(前缀、middleware 顺序、禁止重复绑定)
35
+ - **`70-backend-middleware.skill.md`**
36
+ - `src/middlewares/*` 的中间件模式、错误处理、ctx.state 约定、注册位置与顺序
37
+
38
+ ### 80 - 工程结构(按需启用)
39
+ - **`80-backend-utils-and-libs.skill.md`**
40
+ - `src/libs` vs `src/utils` 的放置规则与决策清单
41
+ - `src/framework/utils/function.ts`:`isDebug()` / `getRuntimeEnvironmentLabel()` 约定
42
+
43
+ ### 90 - 测试(按需启用)
44
+ - **`90-backend-testing.skill.md`**
45
+ - Jest 测试结构与基本要求(配合 `TestDatabaseHelper`)
46
+
47
+
48
+
49
+
@@ -22,7 +22,6 @@ const EXCLUDED_SEGMENTS = new Set([
22
22
  'coverage',
23
23
  '.git',
24
24
  '.DS_Store',
25
- '.cursor',
26
25
  '.idea',
27
26
  ]);
28
27