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.
- package/USAGE.md +533 -0
- package/config/index.js +37 -6
- package/core/App.js +166 -0
- package/core/BaseComponent.js +27 -0
- package/core/Container.js +68 -0
- package/core/Controller.js +29 -0
- package/core/Database.js +93 -0
- package/core/Repository.js +323 -0
- package/core/Service.js +11 -0
- package/core/bootstrap/error-handler.js +101 -0
- package/core/bootstrap/hook-runner.js +64 -0
- package/core/bootstrap/middleware.js +35 -0
- package/core/bootstrap/router-loader.js +53 -0
- package/core/errors.js +251 -0
- package/core/loader.js +89 -0
- package/core/registry.js +17 -0
- package/doc/Cache.md +279 -106
- package/doc/Common.md +590 -134
- package/doc/Controller.md +166 -95
- package/doc/Help.md +299 -698
- package/doc/QuickStart.md +116 -0
- package/doc/Repository.md +560 -0
- package/doc/Service.md +201 -527
- package/index.js +61 -37
- package/middleware/body.js +17 -0
- package/middleware/cookie.js +7 -15
- package/middleware/cors.js +9 -27
- package/middleware/favicon.js +15 -17
- package/middleware/header.js +15 -16
- package/middleware/index.js +11 -11
- package/middleware/log.js +26 -56
- package/middleware/static.js +15 -28
- package/middleware/template.js +75 -115
- package/middleware/validate.js +79 -0
- package/middleware/waf.js +176 -197
- package/package.json +9 -2
- package/response/code.js +73 -0
- package/response/index.js +9 -6
- package/response/response.js +82 -236
- package/security/checker.js +26 -74
- package/security/index.js +4 -9
- package/security/jwt.js +84 -139
- package/security/keywords.js +33 -137
- package/security/rate-limit.js +38 -80
- package/security/sign.js +83 -176
- package/security/xss-filter.js +21 -53
- package/storage/cache.js +58 -198
- package/storage/index.js +3 -6
- package/storage/redis.js +124 -181
- package/storage/store.js +163 -188
- package/utils/data-parse.js +42 -186
- package/utils/file.js +73 -244
- package/utils/filter.js +22 -25
- package/utils/html.js +49 -33
- package/utils/index.js +20 -7
- package/utils/ip.js +31 -71
- package/utils/logger.js +117 -0
- package/utils/pages.js +55 -0
- package/utils/paths.js +18 -0
- package/utils/request.js +95 -136
- package/utils/signal.js +87 -0
- package/utils/time.js +33 -75
- package/utils/tree.js +112 -104
- package/App.js +0 -533
- package/base/Aop.js +0 -195
- package/base/Container.js +0 -161
- package/base/Controller.js +0 -65
- package/base/Database.js +0 -133
- package/base/Event.js +0 -61
- package/base/Repository.js +0 -644
- package/common/api.js +0 -35
- package/common/code.js +0 -52
- package/common/email.js +0 -191
- package/common/index.js +0 -5
- package/common/pages.js +0 -120
- package/common/utils.js +0 -73
- package/config/code.js +0 -166
- package/config/paths.js +0 -60
- package/doc/Aop.md +0 -269
- package/doc/Email.md +0 -114
- package/doc/Event.md +0 -232
- package/global/env.js +0 -11
- package/global/import.js +0 -39
- package/global/index.js +0 -8
- package/helper/index.js +0 -79
- package/loader/index.js +0 -6
- package/loader/loader.js +0 -138
- package/middleware/compress.js +0 -185
- package/middleware/setBody.js +0 -32
- package/realtime/index.js +0 -7
- package/realtime/sse.js +0 -424
- package/realtime/websocket.js +0 -540
- package/schedule/index.js +0 -6
- 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
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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:
|
|
88
|
-
code:
|
|
89
|
-
data: { userId:
|
|
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 '
|
|
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
|
-
|
|
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:
|
|
123
|
-
msg: "
|
|
172
|
+
data: newUser,
|
|
173
|
+
msg: "创建成功"
|
|
124
174
|
});
|
|
125
175
|
}
|
|
126
176
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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:
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
219
|
+
|
|
220
|
+
1. 所有自定义控制器必须继承 `Controller` 基类
|
|
221
|
+
2. `success` 方法默认 code 为 `0`,`fail` 方法默认 code 为 `1008`
|
|
222
|
+
3. 响应结构统一为 `{ success, code, msg, data }`
|
|
223
|
+
4. 错误码建议与前端约定统一规范
|