jj.js 0.18.0 → 0.20.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.
- package/README.md +243 -173
- package/jj.js +14 -14
- package/lib/app.js +53 -15
- package/lib/cache.js +96 -30
- package/lib/config.js +21 -6
- package/lib/context.js +18 -22
- package/lib/controller.js +36 -5
- package/lib/cookie.js +11 -15
- package/lib/ctx.js +28 -28
- package/lib/db/mongodb.js +564 -0
- package/lib/db/mysql.js +294 -0
- package/lib/db/sql.js +116 -0
- package/lib/db/sqlite.js +292 -0
- package/lib/db.js +261 -331
- package/lib/loader.js +79 -44
- package/lib/logger.js +124 -126
- package/lib/middleware.js +39 -6
- package/lib/model.js +23 -9
- package/lib/{run.js → mvc.js} +29 -22
- package/lib/pagination.js +68 -14
- package/lib/request.js +6 -3
- package/lib/response.js +70 -6
- package/lib/router.js +4 -3
- package/lib/types.js +363 -196
- package/lib/upload.js +15 -15
- package/lib/url.js +10 -2
- package/lib/utils/error.js +9 -5
- package/lib/utils/utils.js +2 -0
- package/lib/utils/validate.js +13 -0
- package/lib/view.js +54 -8
- package/logo.png +0 -0
- package/package.json +10 -3
- package/types.js +181 -84
- package/CHANGELOG.md +0 -53
- package/jsdoc.conf.js +0 -17
package/README.md
CHANGED
|
@@ -1,140 +1,208 @@
|
|
|
1
1
|
# jj.js
|
|
2
2
|
|
|
3
|
-

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> 一个超级简单轻量的 Node.js MVC 框架
|
|
6
6
|
|
|
7
|
-
## 项目介绍
|
|
7
|
+
## 📖 项目介绍
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
jj.js 是一个模仿 ThinkPHP5 设计的轻量级 Node.js MVC 框架。基于 Proxy 实现了**类库自动加载**、**懒加载**和 **Class 自动实例化及单例化**技术,所有类库想用直接调用,系统会自动导入,无需手动 require/import。
|
|
10
10
|
|
|
11
|
-
###
|
|
11
|
+
### ✨ 核心特性
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
| 特性 | 说明 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| 🏗️ **经典 MVC** | 模仿 ThinkPHP5,PHP 开发者友好,快速上手 |
|
|
16
|
+
| 🔄 **自动加载** | 系统类库、用户类库都支持自动加载、懒加载 |
|
|
17
|
+
| 🎯 **智能实例化** | Class 自动生成单实例,节省内存开销 |
|
|
18
|
+
| 🧩 **三级中间件** | 应用级、路由级、控制器级,方便插件及二次开发 |
|
|
19
|
+
| 🌐 **多应用模式** | 支持单应用和多应用两种运行模式 |
|
|
20
|
+
| 📝 **完整类型提示** | 基于 JSDoc,自动生成应用端 types 类型文件 |
|
|
18
21
|
|
|
19
|
-
### 项目地址
|
|
22
|
+
### 📍 项目地址
|
|
20
23
|
|
|
21
|
-
|
|
24
|
+
- **GitHub**:[https://github.com/yafoo/jj.js](https://github.com/yafoo/jj.js)
|
|
25
|
+
- **码云镜像**:[https://gitee.com/yafu/jj.js](https://gitee.com/yafu/jj.js)
|
|
26
|
+
- **官网**:[https://me.i-i.me/special/jj.html](https://me.i-i.me/special/jj.html)
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
---
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
## 🚀 快速开始
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
### 安装
|
|
29
33
|
|
|
30
34
|
```bash
|
|
31
35
|
npm i jj.js
|
|
32
36
|
```
|
|
33
37
|
|
|
34
|
-
>
|
|
38
|
+
> **运行环境要求**:Node.js >= 18
|
|
35
39
|
|
|
36
|
-
|
|
40
|
+
### Hello World
|
|
37
41
|
|
|
38
|
-
1
|
|
42
|
+
**1. 创建控制器** `./app/controller/index.js`
|
|
39
43
|
|
|
40
44
|
```javascript
|
|
41
45
|
const {Controller} = require('jj.js');
|
|
42
46
|
|
|
43
|
-
class Index extends Controller
|
|
44
|
-
{
|
|
47
|
+
class Index extends Controller {
|
|
45
48
|
async index() {
|
|
46
|
-
this.$show('Hello jj.js, hello world
|
|
49
|
+
this.$show('Hello jj.js, hello world!');
|
|
47
50
|
}
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
module.exports = Index;
|
|
51
54
|
```
|
|
52
55
|
|
|
53
|
-
2
|
|
56
|
+
**2. 创建应用入口** `./server.js`
|
|
54
57
|
|
|
55
58
|
```javascript
|
|
56
59
|
const {App, Logger} = require('jj.js');
|
|
57
60
|
const app = new App();
|
|
58
61
|
|
|
59
|
-
app.
|
|
60
|
-
|
|
62
|
+
app.listen(3000, '0.0.0.0', () => {
|
|
63
|
+
Logger.info('HTTP server is ready on port 3000');
|
|
61
64
|
});
|
|
62
65
|
```
|
|
63
66
|
|
|
64
|
-
3
|
|
67
|
+
**3. 启动服务**
|
|
65
68
|
|
|
66
69
|
```bash
|
|
67
70
|
node server.js
|
|
68
71
|
```
|
|
69
72
|
|
|
70
|
-
4
|
|
73
|
+
**4. 访问测试**
|
|
71
74
|
|
|
72
|
-
|
|
75
|
+
浏览器打开 `http://127.0.0.1:3000`,页面输出:`Hello jj.js, hello world!`
|
|
73
76
|
|
|
74
|
-
|
|
77
|
+
> 💡 在线体验:[Stackblitz Hello World](https://stackblitz.com/edit/node-frhrfi?embed=1&file=app/controller/index.js)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 📚 开发手册
|
|
75
82
|
|
|
76
83
|
### 应用目录结构
|
|
77
84
|
|
|
78
85
|
```
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
│
|
|
82
|
-
│
|
|
83
|
-
│
|
|
84
|
-
│
|
|
85
|
-
│
|
|
86
|
-
│
|
|
87
|
-
│
|
|
88
|
-
│
|
|
89
|
-
│
|
|
90
|
-
|
|
91
|
-
├── common
|
|
92
|
-
├── config
|
|
93
|
-
│
|
|
94
|
-
│
|
|
95
|
-
│
|
|
96
|
-
│
|
|
97
|
-
│
|
|
98
|
-
│
|
|
99
|
-
├── public
|
|
100
|
-
│
|
|
101
|
-
├── node_modules
|
|
102
|
-
├── server.js
|
|
103
|
-
|
|
86
|
+
project/
|
|
87
|
+
├── app/ # 应用目录(默认应用,可改名)
|
|
88
|
+
│ ├── controller/ # 控制器目录(可改名)
|
|
89
|
+
│ │ └── index.js # 首页控制器
|
|
90
|
+
│ ├── view/ # 模板目录(可改名)
|
|
91
|
+
│ │ └── index/ # index 控制器模板
|
|
92
|
+
│ │ └── index.htm # 模板文件
|
|
93
|
+
│ ├── middleware/ # 中间件目录(不可改名)
|
|
94
|
+
│ ├── model/ # 模型目录(可改名)
|
|
95
|
+
│ ├── pagination/ # 分页目录(可改名)
|
|
96
|
+
│ ├── logic/ # 逻辑目录(可改名)
|
|
97
|
+
│ └── ... # 其他自定义目录
|
|
98
|
+
├── common/ # 公共应用目录(可选)
|
|
99
|
+
├── config/ # 配置目录(不可改名)
|
|
100
|
+
│ ├── app.js # 应用配置
|
|
101
|
+
│ ├── db.js # 数据库配置
|
|
102
|
+
│ ├── routes.js # 路由配置
|
|
103
|
+
│ ├── view.js # 模板配置
|
|
104
|
+
│ ├── cache.js # 缓存配置
|
|
105
|
+
│ └── ... # 其他配置
|
|
106
|
+
├── public/ # 静态资源目录(可改名)
|
|
107
|
+
│ └── static/ # CSS/JS/图片等
|
|
108
|
+
├── node_modules/ # Node.js 依赖
|
|
109
|
+
├── server.js # 应用入口文件(必需,可改名)
|
|
110
|
+
├── types.js # JSDOC类型文件(开发模式自动生成)
|
|
111
|
+
├── jsconfig.json # 代码提示配置(没有,则编辑器不会提示)
|
|
112
|
+
└── package.json # NPM 配置
|
|
104
113
|
```
|
|
105
|
-
#### 应用目录介绍:
|
|
106
|
-
- **config**: 应用配置目录,系统的所有配置参数都放这里,也可以简化为一个config
|
|
107
|
-
.js文件,所有配置参数会覆盖框架默认参数。其中config这个名字不允许修改。
|
|
108
|
-
- **app、app2、common**: 为应用目录,common为公共应用目录,可以存放公共的model、logic或其他的文件,app为默认访问的应用。jj.js框架支持单应用和多应用运行模式,在`./config/app.js`中把`app_multi`设置为`true`即为多应用模式,此时可以创建app2、app3更多应用。框架默认为单应用模式。
|
|
109
|
-
- **public**:静态资源目录,主要存放css文件、js文件、图片等静态资源。在`./config/app.js`中通过`static_dir`参数可以设置或更改静态目录名字,为空时,则关闭静态访问(系统不会加载静态资源访问的逻辑,最大节省内容,也即所谓的轻量)
|
|
110
|
-
- **server.js**:应用入口文件,名字可以任意改。
|
|
111
114
|
|
|
112
|
-
|
|
115
|
+
#### 📁 目录说明
|
|
116
|
+
|
|
117
|
+
| 目录 | 必需 | 说明 |
|
|
118
|
+
|------|------|------|
|
|
119
|
+
| `config/` | ❌ | 应用配置目录,所有配置参数放在这里,可简化为 `config.js` |
|
|
120
|
+
| `app/` | ✅ | 默认应用目录,支持多应用时可创建 `app2`、`app3` 等 |
|
|
121
|
+
| `common/` | ❌ | 公共应用目录,存放公共 model、logic 等 |
|
|
122
|
+
| `public/` | ❌ | 静态资源目录,在 `config/app.js` 中通过 `static_dir` 配置 |
|
|
123
|
+
| `server.js` | ✅ | 应用入口文件,名字可任意修改 |
|
|
124
|
+
|
|
125
|
+
> **多应用模式**:在 `./config/app.js` 中设置 `app_multi: true` 即可启用。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### 🏛️ 系统类库
|
|
113
130
|
|
|
114
131
|
```javascript
|
|
115
|
-
const {
|
|
132
|
+
const {
|
|
133
|
+
App, // 应用类(继承 Koa)
|
|
134
|
+
Controller, // 控制器基类
|
|
135
|
+
Db, // 数据库类
|
|
136
|
+
Model, // 模型基类
|
|
137
|
+
Pagination, // 分页类
|
|
138
|
+
View, // 视图/模板类
|
|
139
|
+
Logger, // 日志类(静态类)
|
|
140
|
+
Cookie, // Cookie 操作类
|
|
141
|
+
Response, // 响应类
|
|
142
|
+
Upload, // 文件上传类
|
|
143
|
+
Url, // URL 生成类
|
|
144
|
+
Middleware, // 中间件基类
|
|
145
|
+
Cache, // 缓存类(静态类)
|
|
146
|
+
Context, // 上下文基类
|
|
147
|
+
Request // 请求类
|
|
148
|
+
} = require('jj.js');
|
|
116
149
|
```
|
|
117
150
|
|
|
118
|
-
|
|
151
|
+
#### 🌳 类库继承关系图
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
Ctx (Proxy 基类 - 核心自动加载机制)
|
|
155
|
+
│
|
|
156
|
+
└── Context (基础上下文类)
|
|
157
|
+
│
|
|
158
|
+
├── Middleware (中间件基类)
|
|
159
|
+
│ │
|
|
160
|
+
│ └── Controller (控制器类)
|
|
161
|
+
│ └── 用户自定义控制器
|
|
162
|
+
│
|
|
163
|
+
├── Model (模型类)
|
|
164
|
+
│ └── 用户自定义模型
|
|
165
|
+
│
|
|
166
|
+
├── Db (数据库类)
|
|
167
|
+
│ ├── Mysql (lib/db/mysql.js)
|
|
168
|
+
│ ├── Sqlite (lib/db/sqlite.js)
|
|
169
|
+
│ └── Mongodb (lib/db/mongodb.js)
|
|
170
|
+
│
|
|
171
|
+
├── View (视图/模板类)
|
|
172
|
+
├── Response (响应类)
|
|
173
|
+
├── Request (请求类)
|
|
174
|
+
├── Url (URL 生成类)
|
|
175
|
+
├── Cookie (Cookie 操作类)
|
|
176
|
+
├── Upload (文件上传类)
|
|
177
|
+
└── Pagination (分页类)
|
|
178
|
+
|
|
179
|
+
静态类(不需要继承):
|
|
180
|
+
├── Logger (日志类)
|
|
181
|
+
└── Cache (缓存类)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
> 💡 **开发建议**:继承系统类库后,可在类内使用 `$` 前缀属性实现自动加载功能。链式调用类方法时会自动实例化单例。
|
|
185
|
+
|
|
186
|
+
---
|
|
119
187
|
|
|
120
|
-
|
|
188
|
+
### 🔄 类库自动加载
|
|
121
189
|
|
|
122
|
-
|
|
190
|
+
> 类库自动加载、懒加载是整个框架的核心。
|
|
123
191
|
|
|
124
|
-
|
|
192
|
+
#### 示例 1:直接使用系统类库
|
|
125
193
|
|
|
126
|
-
|
|
194
|
+
**控制器** `./app/controller/index.js`:
|
|
127
195
|
|
|
128
196
|
```javascript
|
|
129
197
|
const {Controller} = require('jj.js');
|
|
130
198
|
|
|
131
|
-
class Index extends Controller
|
|
132
|
-
{
|
|
199
|
+
class Index extends Controller {
|
|
133
200
|
async index() {
|
|
134
|
-
this.$show('Hello jj.js, hello world
|
|
201
|
+
this.$show('Hello jj.js, hello world!');
|
|
135
202
|
}
|
|
136
203
|
|
|
137
204
|
async user() {
|
|
205
|
+
// 直接使用 $db,框架自动加载并实例化
|
|
138
206
|
const user_info = await this.$db.table('user').find({id: 1});
|
|
139
207
|
this.$show(user_info);
|
|
140
208
|
}
|
|
@@ -143,156 +211,156 @@ class Index extends Controller
|
|
|
143
211
|
module.exports = Index;
|
|
144
212
|
```
|
|
145
213
|
|
|
146
|
-
|
|
214
|
+
**访问**:`http://127.0.0.1:3000/index/user`
|
|
147
215
|
|
|
148
|
-
|
|
216
|
+
**加载流程**:
|
|
149
217
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
218
|
+
```
|
|
219
|
+
this.$db
|
|
220
|
+
↓
|
|
221
|
+
1. 检查当前类实例是否有 $db 属性
|
|
222
|
+
↓ (没有)
|
|
223
|
+
2. 检查应用目录 ./app/db.js 或 ./app/db/
|
|
224
|
+
↓ (没有)
|
|
225
|
+
3. 检查应用根目录 ./db.js 或 ./db/
|
|
226
|
+
↓ (没有)
|
|
227
|
+
4. 检查框架 lib/db.js ✅ 找到!
|
|
228
|
+
↓
|
|
229
|
+
自动实例化(单例)并返回 Db 实例
|
|
230
|
+
```
|
|
157
231
|
|
|
158
|
-
>
|
|
232
|
+
> **智能实例化**:调用 `this.$db.table('user')` 时,框架先检测是否有 `table` 静态方法,没有则自动 new 实例,然后调用实例方法。
|
|
159
233
|
|
|
160
|
-
|
|
234
|
+
#### 示例 2:使用自定义模型
|
|
161
235
|
|
|
162
|
-
|
|
236
|
+
**模型** `./app/model/user.js`:
|
|
163
237
|
|
|
164
238
|
```javascript
|
|
165
239
|
const {Model} = require('jj.js');
|
|
166
240
|
|
|
167
|
-
class User extends Model
|
|
168
|
-
{
|
|
241
|
+
class User extends Model {
|
|
169
242
|
async getUserInfo(condition) {
|
|
170
|
-
|
|
171
|
-
return user_info;
|
|
243
|
+
return await this.db.find(condition);
|
|
172
244
|
}
|
|
173
245
|
}
|
|
174
246
|
|
|
175
247
|
module.exports = User;
|
|
176
248
|
```
|
|
177
249
|
|
|
178
|
-
|
|
250
|
+
**控制器调用**:
|
|
179
251
|
|
|
180
252
|
```javascript
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
async index() {
|
|
186
|
-
this.$show('Hello jj.js, hello world !');
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
async user() {
|
|
190
|
-
const user_info = await this.$model.user.getUserInfo({id: 1});
|
|
191
|
-
this.$show(user_info);
|
|
192
|
-
}
|
|
253
|
+
async user() {
|
|
254
|
+
// 自动加载 ./app/model/user.js 并调用 getUserInfo 方法
|
|
255
|
+
const user_info = await this.$model.user.getUserInfo({id: 1});
|
|
256
|
+
this.$show(user_info);
|
|
193
257
|
}
|
|
194
|
-
|
|
195
|
-
module.exports = Index;
|
|
196
258
|
```
|
|
197
259
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
- 根据示例1的加载检测机制,`this.$model`会自动定位到`./app/model/`目录,`this.$model.user`会自动加载`./app/model/user.js`类文件,调用方法`getUserInfo`,会自动生成一个`user`模型的单实例,并调此单实例的`getUserInfo`方法。
|
|
201
|
-
|
|
202
|
-
- 可以看到,不管是系统类库,还是自定义类库,都可以实现自动加载、懒加载、自动生成单实例。
|
|
260
|
+
> **注意**:模型内使用 `this.db`(无 `$` 前缀)是专属该模型的独立实例,避免多模型调用时混淆。
|
|
203
261
|
|
|
204
|
-
|
|
262
|
+
---
|
|
205
263
|
|
|
206
|
-
|
|
264
|
+
### ⚙️ Config 配置
|
|
207
265
|
|
|
208
|
-
|
|
266
|
+
应用配置可以是 `./config/` 目录,也可以简化为一个 `./config.js` 文件。只需设置需要修改的项,未设置的会继承框架默认配置。
|
|
209
267
|
|
|
210
|
-
|
|
268
|
+
#### App 配置 `./config/app.js`
|
|
211
269
|
|
|
212
|
-
应用配置不用每项都设置,只设置自己需要改的,默认会继承框架的默认配置,在控制器、中间件、模板类、模型类里都可以通过`this.$config.xxx`使用。
|
|
213
|
-
|
|
214
|
-
- app配置`./config/app.js`:
|
|
215
270
|
```javascript
|
|
216
|
-
|
|
217
|
-
app_debug:
|
|
218
|
-
app_multi: false,
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
271
|
+
module.exports = {
|
|
272
|
+
app_debug: false, // 调试模式
|
|
273
|
+
app_multi: false, // 是否开启多应用
|
|
274
|
+
default_app: 'app', // 默认应用
|
|
275
|
+
default_controller: 'index', // 默认控制器
|
|
276
|
+
default_action: 'index', // 默认方法
|
|
277
|
+
common_app: 'common', // 公共应用
|
|
278
|
+
controller_folder: 'controller', // 控制器目录名
|
|
279
|
+
static_dir: '', // 静态文件目录(为空关闭静态访问)
|
|
280
|
+
koa_body: null // koa-body 配置(null 关闭)
|
|
281
|
+
};
|
|
282
|
+
```
|
|
226
283
|
|
|
227
|
-
|
|
284
|
+
#### 数据库配置 `./config/db.js`
|
|
228
285
|
|
|
229
|
-
koa_body: null // koa-body配置参数,为''、null、false时,关闭koa-body,此时upload类将不可用,并且系统接收不到post参数。启用的话,建议配置:{multipart: true, formidable: {keepExtensions: true, maxFieldsSize: 10 * 1024 * 1024}}
|
|
230
|
-
}
|
|
231
|
-
module.exports = app;
|
|
232
|
-
```
|
|
233
|
-
- 数据库配置`./config/db.js`:可以配置多个,方便程序里切换使用。
|
|
234
286
|
```javascript
|
|
235
|
-
|
|
287
|
+
module.exports = {
|
|
236
288
|
default: {
|
|
237
|
-
type
|
|
238
|
-
host
|
|
239
|
-
database
|
|
240
|
-
user
|
|
241
|
-
password
|
|
242
|
-
port
|
|
243
|
-
charset
|
|
244
|
-
prefix
|
|
289
|
+
type: 'mysql',
|
|
290
|
+
host: '127.0.0.1',
|
|
291
|
+
database: 'jj',
|
|
292
|
+
user: 'root',
|
|
293
|
+
password: '',
|
|
294
|
+
port: '',
|
|
295
|
+
charset: 'utf8mb4',
|
|
296
|
+
prefix: 'jj_'
|
|
297
|
+
},
|
|
298
|
+
sqlite: {
|
|
299
|
+
type: 'sqlite',
|
|
300
|
+
database: ':memory:',
|
|
301
|
+
prefix: 'jj_'
|
|
302
|
+
},
|
|
303
|
+
mongodb: {
|
|
304
|
+
type: 'mongodb',
|
|
305
|
+
host: '127.0.0.1',
|
|
306
|
+
database: 'jj',
|
|
307
|
+
port: 27017,
|
|
308
|
+
prefix: 'jj_'
|
|
245
309
|
}
|
|
246
|
-
}
|
|
247
|
-
module.exports = db;
|
|
310
|
+
};
|
|
248
311
|
```
|
|
249
312
|
|
|
250
|
-
|
|
251
|
-
路由功能基于`@koa/router`开发,关于url匹配规则可以参考官方文档:[文档地址](https://www.npmjs.com/package/@koa/router)
|
|
313
|
+
#### 路由配置 `./config/routes.js`
|
|
252
314
|
|
|
253
|
-
|
|
315
|
+
基于 `@koa/router` 开发,支持 URL 匹配、路由命名、反向编译等功能。
|
|
254
316
|
|
|
255
|
-
> 路由配置为一个数组,每一项为一条规则,项属性包含url规则,path访问路径,name规则名字,type路由类型。url一旦匹配,即会停止,如果需要继续向下匹配,需在程序内调用 `await this.$next();`,路由配置参考示例:
|
|
256
317
|
```javascript
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
{url: '/
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
{url: '/:
|
|
263
|
-
|
|
318
|
+
module.exports = [
|
|
319
|
+
// 基本路由
|
|
320
|
+
{url: '/', path: 'app/index/index2'},
|
|
321
|
+
|
|
322
|
+
// 动态参数 + 路由命名
|
|
323
|
+
{url: '/article/:id.html', path: 'app/article/article', name: 'article'},
|
|
324
|
+
|
|
325
|
+
// 中间件类型
|
|
326
|
+
{url: '/admin', path: 'app/admin/check', type: 'middleware'},
|
|
327
|
+
|
|
328
|
+
// 模板直接输出
|
|
329
|
+
{url: '/about', path: 'app/about/index', type: 'view'},
|
|
330
|
+
|
|
331
|
+
// 直接路由到函数
|
|
332
|
+
{url: '/hello', path: async (ctx, next) => {
|
|
333
|
+
ctx.body = 'hello world!';
|
|
334
|
+
}}
|
|
264
335
|
];
|
|
265
|
-
|
|
266
|
-
module.exports = routes;
|
|
267
336
|
```
|
|
268
|
-
> 注意:本路由配置示例前两条规则为常规用法,后面的非常规用法,不建议使用。如果是单应用模式,可以去掉path参数里的app。
|
|
269
337
|
|
|
270
|
-
|
|
271
|
-
```javascript
|
|
272
|
-
const self = {
|
|
273
|
-
option1: ''
|
|
274
|
-
option2: ''
|
|
275
|
-
...
|
|
276
|
-
}
|
|
277
|
-
module.exports = self;
|
|
278
|
-
```
|
|
279
|
-
- 其他配置项,请参考系统配置文件`jj.js/lib/config.js`
|
|
338
|
+
> **反向编译**:配置 `name` 后,可使用 `this.$url.build(':article', {id: 123})` 生成 `/article/123.html`
|
|
280
339
|
|
|
281
|
-
|
|
340
|
+
---
|
|
282
341
|
|
|
283
|
-
|
|
284
|
-
控制器文件名使用小写下划线。
|
|
342
|
+
### 📝 编码命名规范
|
|
285
343
|
|
|
344
|
+
| 类型 | 规范 | 示例 |
|
|
345
|
+
|------|------|------|
|
|
346
|
+
| 类名 | 大驼峰 | `UserController` |
|
|
347
|
+
| 方法名 | 小驼峰 | `getUserInfo()` |
|
|
348
|
+
| 私有方法 | 下划线前缀 | `_validateData()` |
|
|
349
|
+
| 控制器文件名 | 小写下划线 | `user_controller.js` |
|
|
286
350
|
|
|
287
|
-
|
|
351
|
+
---
|
|
288
352
|
|
|
289
|
-
|
|
353
|
+
## 🌟 应用案例
|
|
290
354
|
|
|
291
|
-
|
|
355
|
+
- **[Melog](https://me.i-i.me/special/melog.html)** - 基于 jj.js 的轻量博客系统
|
|
292
356
|
|
|
293
|
-
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## 🔧 Nginx 代理配置
|
|
360
|
+
|
|
361
|
+
```nginx
|
|
294
362
|
location / {
|
|
295
|
-
proxy_pass
|
|
363
|
+
proxy_pass http://127.0.0.1:3000;
|
|
296
364
|
proxy_http_version 1.1;
|
|
297
365
|
proxy_set_header Upgrade $http_upgrade;
|
|
298
366
|
proxy_set_header Connection "upgrade";
|
|
@@ -303,6 +371,8 @@ location / {
|
|
|
303
371
|
}
|
|
304
372
|
```
|
|
305
373
|
|
|
306
|
-
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## 📄 License
|
|
307
377
|
|
|
308
378
|
[MIT](LICENSE)
|
package/jj.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jj.js核心库<br/>
|
|
3
|
-
* {App, Cache, Context, Controller, Cookie, Ctx, Db, Logger, Middleware, Model, Pagination, Request, Response, Upload, Url, View, utils, config}
|
|
4
|
-
* @module core
|
|
5
|
-
* @type {import('./types').Core}
|
|
6
|
-
*/
|
|
7
|
-
module.exports = new Proxy({}, {
|
|
8
|
-
get: (target, prop) => {
|
|
9
|
-
if(prop in target || typeof prop == 'symbol' || ['inspect', 'router', 'run', 'types'].includes(prop)) {
|
|
10
|
-
return target[prop];
|
|
11
|
-
}
|
|
12
|
-
prop = prop.toLowerCase();
|
|
13
|
-
return require(`./lib/${prop == 'utils' ? 'utils/' : ''}${prop}`);
|
|
14
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* jj.js核心库<br/>
|
|
3
|
+
* {App, Cache, Context, Controller, Cookie, Ctx, Db, Logger, Middleware, Model, Pagination, Request, Response, Upload, Url, View, utils, config}
|
|
4
|
+
* @module core
|
|
5
|
+
* @type {import('./types').Core}
|
|
6
|
+
*/
|
|
7
|
+
module.exports = new Proxy({}, {
|
|
8
|
+
get: (target, prop) => {
|
|
9
|
+
if(prop in target || typeof prop == 'symbol' || ['inspect', 'router', 'run', 'types'].includes(prop)) {
|
|
10
|
+
return target[prop];
|
|
11
|
+
}
|
|
12
|
+
prop = prop.toLowerCase();
|
|
13
|
+
return require(`./lib/${prop == 'utils' ? 'utils/' : ''}${prop}`);
|
|
14
|
+
}
|
|
15
15
|
});
|