chanjs 2.7.4 → 2.7.6

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 (94) hide show
  1. package/USAGE.md +533 -0
  2. package/config/index.js +37 -6
  3. package/core/App.js +166 -0
  4. package/core/BaseComponent.js +27 -0
  5. package/core/Container.js +68 -0
  6. package/core/Controller.js +29 -0
  7. package/core/Database.js +93 -0
  8. package/core/Repository.js +323 -0
  9. package/core/Service.js +11 -0
  10. package/core/bootstrap/error-handler.js +101 -0
  11. package/core/bootstrap/hook-runner.js +64 -0
  12. package/core/bootstrap/middleware.js +35 -0
  13. package/core/bootstrap/router-loader.js +53 -0
  14. package/core/errors.js +251 -0
  15. package/core/loader.js +89 -0
  16. package/core/registry.js +17 -0
  17. package/doc/Cache.md +279 -106
  18. package/doc/Common.md +590 -134
  19. package/doc/Controller.md +166 -95
  20. package/doc/Help.md +299 -698
  21. package/doc/QuickStart.md +116 -0
  22. package/doc/Repository.md +560 -0
  23. package/doc/Service.md +201 -527
  24. package/index.js +61 -37
  25. package/middleware/body.js +17 -0
  26. package/middleware/cookie.js +7 -15
  27. package/middleware/cors.js +9 -27
  28. package/middleware/favicon.js +15 -17
  29. package/middleware/header.js +15 -16
  30. package/middleware/index.js +11 -11
  31. package/middleware/log.js +26 -56
  32. package/middleware/static.js +15 -28
  33. package/middleware/template.js +75 -115
  34. package/middleware/validate.js +79 -0
  35. package/middleware/waf.js +176 -197
  36. package/package.json +9 -2
  37. package/response/code.js +73 -0
  38. package/response/index.js +9 -6
  39. package/response/response.js +82 -236
  40. package/security/checker.js +26 -74
  41. package/security/index.js +4 -9
  42. package/security/jwt.js +84 -139
  43. package/security/keywords.js +33 -137
  44. package/security/rate-limit.js +38 -80
  45. package/security/sign.js +83 -176
  46. package/security/xss-filter.js +21 -53
  47. package/storage/cache.js +58 -198
  48. package/storage/index.js +3 -6
  49. package/storage/redis.js +124 -181
  50. package/storage/store.js +163 -188
  51. package/utils/data-parse.js +42 -186
  52. package/utils/file.js +73 -244
  53. package/utils/filter.js +22 -25
  54. package/utils/html.js +49 -33
  55. package/utils/index.js +20 -7
  56. package/utils/ip.js +31 -71
  57. package/utils/logger.js +117 -0
  58. package/utils/pages.js +55 -0
  59. package/utils/paths.js +18 -0
  60. package/utils/request.js +95 -136
  61. package/utils/signal.js +87 -0
  62. package/utils/time.js +33 -75
  63. package/utils/tree.js +112 -104
  64. package/App.js +0 -533
  65. package/base/Aop.js +0 -195
  66. package/base/Container.js +0 -161
  67. package/base/Controller.js +0 -65
  68. package/base/Database.js +0 -133
  69. package/base/Event.js +0 -61
  70. package/base/Repository.js +0 -644
  71. package/common/api.js +0 -35
  72. package/common/code.js +0 -52
  73. package/common/email.js +0 -191
  74. package/common/index.js +0 -5
  75. package/common/pages.js +0 -120
  76. package/common/utils.js +0 -73
  77. package/config/code.js +0 -166
  78. package/config/paths.js +0 -60
  79. package/doc/Aop.md +0 -269
  80. package/doc/Email.md +0 -114
  81. package/doc/Event.md +0 -232
  82. package/global/env.js +0 -11
  83. package/global/import.js +0 -39
  84. package/global/index.js +0 -8
  85. package/helper/index.js +0 -79
  86. package/loader/index.js +0 -6
  87. package/loader/loader.js +0 -138
  88. package/middleware/compress.js +0 -185
  89. package/middleware/setBody.js +0 -32
  90. package/realtime/index.js +0 -7
  91. package/realtime/sse.js +0 -424
  92. package/realtime/websocket.js +0 -540
  93. package/schedule/index.js +0 -6
  94. package/schedule/schedule.js +0 -491
package/doc/Controller.md CHANGED
@@ -1,152 +1,223 @@
1
1
  # Controller 控制器基类
2
+
2
3
  ## 概述
3
- `Controller` 是所有业务控制器的基类,继承自 `Container` 容器类,核心作用是提供统一的响应格式封装(成功/失败响应),规范控制器层的返回数据结构,减少重复代码,提升开发效率。
4
4
 
5
- ## 依赖说明
6
- | 依赖模块 | 路径 | 说明 |
7
- |----------|------|------|
8
- | `success`/`fail` | `../helper/response.js` | 响应格式封装工具函数,提供标准化的成功/失败响应结构 |
9
- | `Container` | `./Container.js` | 基础容器类,为控制器提供组件类型标识等能力 |
5
+ `Controller` 是所有业务控制器的基类,继承自 `Container` 容器类,提供统一的响应格式封装(成功/失败响应),规范控制器层的返回数据结构。
6
+
7
+ ## 继承关系
10
8
 
11
- ## 类继承关系
12
9
  ```
13
- Container <|-- Controller
10
+ Container <── Controller
14
11
  ```
15
12
 
16
13
  ## 构造函数
17
- ### 语法
14
+
18
15
  ```javascript
19
16
  constructor()
20
17
  ```
21
- ### 说明
22
- 调用父类 `Container` 的构造函数,并指定组件类型为 `'controller'`,用于容器类对控制器组件的统一管理。
23
18
 
24
- ### 示例
19
+ 调用父类 `Container` 构造函数,指定组件类型为 `'controller'`。
20
+
21
+ ## 核心方法
22
+
23
+ ### 1. success - 成功响应
24
+
25
+ 封装标准化的成功响应格式。
26
+
27
+ **语法**
28
+
25
29
  ```javascript
26
- import Controller from './chanjs/base/Controller.js';
30
+ success({ data, msg = "操作成功" } = {})
31
+ ```
32
+
33
+ **参数**
34
+
35
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
36
+ |------|------|------|--------|------|
37
+ | data | any | 否 | {} | 响应数据 |
38
+ | msg | string | 否 | "操作成功" | 提示信息 |
27
39
 
40
+ **返回值**
41
+
42
+ ```javascript
43
+ {
44
+ success: true,
45
+ code: 0,
46
+ msg: "操作成功",
47
+ data: { /* 响应数据 */ }
48
+ }
49
+ ```
50
+
51
+ **示例**
52
+
53
+ ```javascript
28
54
  class UserController extends Controller {
29
- constructor() {
30
- super(); // 继承 Controller 构造逻辑
55
+ async getUser(req, res) {
56
+ const user = { id: 1, name: "张三" };
57
+ return this.success({ data: user });
58
+ }
59
+
60
+ async createUser(req, res) {
61
+ // 业务逻辑...
62
+ return this.success({
63
+ data: { id: 100 },
64
+ msg: "创建成功"
65
+ });
31
66
  }
32
67
  }
33
68
  ```
34
69
 
35
- ## 核心方法
36
- ### 1. 成功响应 - `success(options)`
37
- 封装标准化的成功响应格式,返回统一结构的成功数据。
70
+ ### 2. fail - 失败响应
38
71
 
39
- #### 参数说明
40
- | 参数名 | 类型 | 必传 | 默认值 | 说明 |
41
- |--------|------|------|--------|------|
42
- | `options` | `Object` | 否 | `{}` | 响应配置项 |
43
- | `options.data` | `any` | 否 | - | 响应体数据,可传任意类型(对象、数组、基本类型等) |
44
- | `options.msg` | `string` | 否 | `"操作成功"` | 响应提示消息 |
72
+ 封装标准化的失败响应格式。
45
73
 
46
- #### 返回值
47
- `Object`:标准化的成功响应对象(结构由 `../helper/response.js` 的 `success` 函数定义)。
74
+ **语法**
48
75
 
49
- #### 示例
50
76
  ```javascript
51
- class UserController extends Controller {
52
- async getUserInfo() {
53
- const data = { id: 1, name: "张三" };
54
- // 返回成功响应,使用默认提示语
55
- return this.success({ data });
56
-
57
- // 自定义提示语
58
- // return this.success({ data, msg: "获取用户信息成功" });
59
- }
60
- }
77
+ fail(opts = {})
61
78
  ```
62
79
 
63
- ### 2. 失败响应 - `fail(options)`
64
- 封装标准化的失败响应格式,返回统一结构的失败数据。
80
+ **参数**
81
+
82
+ 支持两种传参方式:
83
+
84
+ 1. **字符串简写**:直接传入错误提示文案
85
+ 2. **对象配置**:传入完整配置对象
86
+
87
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
88
+ |------|------|------|--------|------|
89
+ | opts | string \| object | 否 | {} | 错误配置 |
90
+ | opts.msg | string | 否 | "操作失败" | 错误提示 |
91
+ | opts.code | number | 否 | 1008 | 错误码 |
92
+ | opts.data | any | 否 | {} | 附加数据 |
65
93
 
66
- #### 参数说明
67
- | 参数名 | 类型 | 必传 | 默认值 | 说明 |
68
- |--------|------|------|--------|------|
69
- | `options` | `Object` | 否 | `{}` | 响应配置项 |
70
- | `options.msg` | `string` | 否 | `"操作失败"` | 失败提示消息 |
71
- | `options.data` | `any` | 否 | `{}` | 失败时附带的补充数据 |
72
- | `options.code` | `number` | 否 | `201` | 自定义错误码,用于前端区分不同失败场景 |
94
+ **返回值**
73
95
 
74
- #### 返回值
75
- `Object`:标准化的失败响应对象(结构由 `../helper/response.js` 的 `fail` 函数定义)。
96
+ ```javascript
97
+ {
98
+ success: false,
99
+ code: 1008, // 或其他错误码
100
+ msg: "操作失败",
101
+ data: {}
102
+ }
103
+ ```
104
+
105
+ **示例**
76
106
 
77
- #### 示例
78
107
  ```javascript
79
108
  class UserController extends Controller {
80
- async updateUserInfo() {
81
- try {
82
- // 业务逻辑:更新用户信息失败
83
- throw new Error("用户ID不存在");
84
- } catch (err) {
85
- // 返回失败响应,自定义提示语和错误码
109
+ async deleteUser(req, res) {
110
+ const { id } = req.params;
111
+
112
+ if (!id) {
113
+ // 字符串简写
114
+ return this.fail("用户ID不能为空");
115
+ }
116
+
117
+ if (id === 1) {
118
+ // 对象配置,自定义错误码
86
119
  return this.fail({
87
- msg: err.message,
88
- code: 400,
89
- data: { userId: 1 } // 附带失败关联的用户ID
120
+ msg: "该用户不可删除",
121
+ code: 1001,
122
+ data: { userId: id }
90
123
  });
91
-
92
- // 使用默认配置
93
- // return this.fail();
94
124
  }
125
+
126
+ // 业务逻辑...
127
+ return this.success({ msg: "删除成功" });
95
128
  }
96
129
  }
97
130
  ```
98
131
 
99
- ## 完整使用示例
132
+ ## 完整示例
133
+
100
134
  ```javascript
101
- import Controller from './chanjs/base/Controller.js';
135
+ import { Controller } from 'chanjs';
102
136
 
103
- /**
104
- * 用户业务控制器
105
- * 继承 Controller 基类,使用统一响应格式
106
- */
107
- class UserController extends Controller {
137
+ export default class UserController extends Controller {
108
138
  constructor() {
109
- super(); // 必须调用父类构造函数
139
+ super();
110
140
  }
111
141
 
112
- /**
113
- * 获取用户列表
114
- * @returns {Object} 成功响应
115
- */
116
- async getList() {
117
- const list = [
142
+ // 查询用户列表
143
+ async list(req, res) {
144
+ const users = [
118
145
  { id: 1, name: "张三" },
119
146
  { id: 2, name: "李四" }
120
147
  ];
148
+ return this.success({ data: users });
149
+ }
150
+
151
+ // 查询单个用户
152
+ async detail(req, res) {
153
+ const { id } = req.params;
154
+ const user = { id, name: "张三", age: 25 };
155
+ return this.success({ data: user });
156
+ }
157
+
158
+ // 创建用户
159
+ async create(req, res) {
160
+ const { name, email } = req.body;
161
+
162
+ if (!name || !email) {
163
+ return this.fail({
164
+ msg: "姓名和邮箱不能为空",
165
+ code: 1001
166
+ });
167
+ }
168
+
169
+ // 业务逻辑...
170
+ const newUser = { id: 100, name, email };
121
171
  return this.success({
122
- data: list,
123
- msg: "获取用户列表成功"
172
+ data: newUser,
173
+ msg: "创建成功"
124
174
  });
125
175
  }
126
176
 
127
- /**
128
- * 删除用户
129
- * @param {number} id - 用户ID
130
- * @returns {Object} 成功/失败响应
131
- */
132
- async delete(id) {
177
+ // 更新用户
178
+ async update(req, res) {
179
+ const { id } = req.params;
180
+ const data = req.body;
181
+
182
+ // 业务逻辑...
183
+ return this.success({ msg: "更新成功" });
184
+ }
185
+
186
+ // 删除用户
187
+ async delete(req, res) {
188
+ const { id } = req.params;
189
+
133
190
  if (!id) {
134
- return this.fail({
135
- msg: "用户ID不能为空",
136
- code: 401
137
- });
191
+ return this.fail("用户ID不能为空");
138
192
  }
139
193
 
140
- // 模拟删除成功
141
- return this.success({ msg: `删除ID为${id}的用户成功` });
194
+ // 业务逻辑...
195
+ return this.success({ msg: "删除成功" });
142
196
  }
143
197
  }
144
-
145
- export default UserController;
146
198
  ```
147
199
 
200
+ ## 错误码规范
201
+
202
+ | 错误码范围 | 说明 |
203
+ |-----------|------|
204
+ | 0 | 成功 |
205
+ | 1xxx | 业务错误 |
206
+ | 5xxx | 系统错误 |
207
+ | 6xxx | 数据库错误 |
208
+
209
+ 常用错误码:
210
+ - `0` - 成功
211
+ - `1008` - 默认业务失败
212
+ - `400` - 参数错误
213
+ - `401` - 未授权
214
+ - `403` - 权限不足
215
+ - `404` - 资源不存在
216
+ - `500` - 系统内部错误
217
+
148
218
  ## 注意事项
149
- 1. 所有自定义控制器必须继承 `Controller` 基类,以保证响应格式的统一性;
150
- 2. `success`/`fail` 方法的参数为可选配置对象,未传参时会使用默认值;
151
- 3. 响应的最终数据结构由 `../helper/response.js` 中的 `success`/`fail` 函数决定,若需调整全局响应格式,建议修改该工具文件;
152
- 4. 错误码 `code` 可根据业务场景自定义扩展(如 400 代表参数错误、404 代表资源不存在等),建议与前端约定统一的错误码规范。
219
+
220
+ 1. 所有自定义控制器必须继承 `Controller` 基类
221
+ 2. `success` 方法默认 code 为 `0`,`fail` 方法默认 code 为 `1008`
222
+ 3. 响应结构统一为 `{ success, code, msg, data }`
223
+ 4. 错误码建议与前端约定统一规范