jj.js 0.8.8 → 0.10.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/CHANGELOG.md +19 -0
- package/LICENSE +21 -21
- package/README.md +22 -551
- package/jj.js +14 -8
- package/jsconfig.json +9 -0
- package/jsdoc.conf.js +17 -0
- package/lib/app.js +61 -48
- package/lib/cache.js +118 -65
- package/lib/config.js +98 -94
- package/lib/context.js +22 -10
- package/lib/controller.js +34 -8
- package/lib/cookie.js +82 -40
- package/lib/ctx.js +5 -0
- package/lib/db.js +349 -10
- package/lib/loader.js +10 -4
- package/lib/logger.js +126 -47
- package/lib/middleware.js +58 -26
- package/lib/model.js +50 -1
- package/lib/pagination.js +221 -182
- package/lib/response.js +62 -8
- package/lib/router.js +3 -3
- package/lib/run.js +6 -6
- package/lib/tpl/exception.js +64 -64
- package/lib/tpl/jump.js +40 -40
- package/lib/tpl/types.js +22 -0
- package/lib/types.js +236 -0
- package/lib/upload.js +82 -5
- package/lib/url.js +19 -0
- package/lib/utils/date.js +50 -39
- package/lib/utils/error.js +8 -4
- package/lib/utils/fs.js +69 -78
- package/lib/utils/md5.js +9 -7
- package/lib/utils/str.js +20 -10
- package/lib/utils/utils.js +16 -10
- package/lib/view.js +82 -14
- package/package.json +11 -6
- package/types.js +306 -0
package/README.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
5
|
-
A simple
|
|
5
|
+
A super simple lightweight NodeJS MVC framework(一个超级简单轻量的NodeJS MVC框架)
|
|
6
6
|
|
|
7
7
|
## 项目介绍
|
|
8
8
|
|
|
9
|
-
本框架依赖koa2
|
|
9
|
+
本框架依赖koa2、@koa/router、art-template、mysql,基于proxy实现了代码自动加载及懒加载技术,最低运行依赖仅仅为koa和koa-router,非常轻量。
|
|
10
10
|
|
|
11
11
|
### 项目特性
|
|
12
12
|
|
|
@@ -14,6 +14,7 @@ A simple and lightweight MVC framework built on nodejs+koa2(一个基于nodejs
|
|
|
14
14
|
2. 系统类库、用户类库都支持自动加载、懒加载、自动生成单实例
|
|
15
15
|
3. 支持应用级、路由级、控制器级三级中间件,方便插件及二次开发
|
|
16
16
|
4. 支持单应用和多应用两种运行模式
|
|
17
|
+
5. 基于jsdoc,提供完整的代码提示。支持自动生成应用端jsdoc文件
|
|
17
18
|
|
|
18
19
|
### 项目地址
|
|
19
20
|
|
|
@@ -30,7 +31,7 @@ A simple and lightweight MVC framework built on nodejs+koa2(一个基于nodejs
|
|
|
30
31
|
npm i jj.js
|
|
31
32
|
```
|
|
32
33
|
|
|
33
|
-
> 运行环境要求:node.js >= v12
|
|
34
|
+
> 运行环境要求:node.js >= v12.7.0
|
|
34
35
|
|
|
35
36
|
## Hello world !
|
|
36
37
|
|
|
@@ -52,10 +53,11 @@ module.exports = Index;
|
|
|
52
53
|
2、创建应用入口文件 `./server.js`
|
|
53
54
|
|
|
54
55
|
```javascript
|
|
55
|
-
const {
|
|
56
|
+
const {App, Logger} = require('jj.js');
|
|
57
|
+
const app = new App();
|
|
56
58
|
|
|
57
|
-
app.run(3000, '
|
|
58
|
-
!err && Logger.
|
|
59
|
+
app.run(3000, '0.0.0.0', function(err){
|
|
60
|
+
!err && Logger.log('app', 'http server is ready on 3000');
|
|
59
61
|
});
|
|
60
62
|
```
|
|
61
63
|
|
|
@@ -67,6 +69,8 @@ node server.js
|
|
|
67
69
|
|
|
68
70
|
4、浏览器访问 `http://127.0.0.1:3000`,页面输出 `Hello jj.js, hello world !`
|
|
69
71
|
|
|
72
|
+
5、在Stackblitz中打开 [Hello world !](https://stackblitz.com/edit/node-frhrfi?embed=1&file=app/controller/index.js)
|
|
73
|
+
|
|
70
74
|
## 开发手册
|
|
71
75
|
|
|
72
76
|
### 应用目录结构
|
|
@@ -108,12 +112,12 @@ node server.js
|
|
|
108
112
|
### 系统类库
|
|
109
113
|
|
|
110
114
|
```javascript
|
|
111
|
-
const {
|
|
115
|
+
const {App, Controller, Db, Model, Pagination, View, Logger, Cookie, Response, Upload, Url, Middleware, Cache, Context, View} = require('jj.js');
|
|
112
116
|
```
|
|
113
117
|
|
|
114
118
|

|
|
115
119
|
|
|
116
|
-
|
|
120
|
+
系统类库都是`Class`类型,其中`Logger`和`Cache`是静态类;开发时建议继承系统类库,这样可以在类内使用`$`开头的属性,实现自动加载功能,链式调用类方法时会自动实例化一个单例。例如,在控制器内使用 `this.$logger` 会返回系统Logger类,使用 `this.$logger.info()`,会自动生成一个`logger`单例,并调用`info`方法,其他系统类库及类库内可以以这种方法调用。
|
|
117
121
|
|
|
118
122
|
### 类库自动加载
|
|
119
123
|
|
|
@@ -201,546 +205,13 @@ module.exports = Index;
|
|
|
201
205
|
|
|
202
206
|
3、除了框架db类、自定义模型类,整个应用和框架的所有自定义类库、配置文件,都支持同过`this.$xxxx`调用。
|
|
203
207
|
|
|
204
|
-
### Controller控制器
|
|
205
|
-
|
|
206
|
-
系统控制器类继承自系统中间件类Middleware,包含所有Middleware方法。
|
|
207
|
-
|
|
208
|
-
> 属性:**middleware** 定义控制器中间件
|
|
209
|
-
|
|
210
|
-
数组,定义控制器中间件,一个元素为一个中间件,元素为字符串或对象。
|
|
211
|
-
|
|
212
|
-
示例1: `this.middleware = ['index']`,则控制器内所有方法访问之前都会调用当前应用目录(app)下中间件目录(middleware )下的控制器同名中间件的index方法。
|
|
213
|
-
|
|
214
|
-
示例2: `this.middleware = ['index', {middleware: 'auth/test', accept: 'middleTest'}]`,则控制器内所有方法访问之前都会先调用当前应用目录(app)下中间件目录(middleware )下的控制器同名中间件的index方法。仅当访问控制器middleTest方法之前,还会再调用当前应用下中间件目录下的auth中间件的test方法(需index中间件内调用`this.$next()`方法,否则后续程序不会执行)。
|
|
215
|
-
|
|
216
|
-
> 方法:**$assign(name, value)** 赋值模版变量
|
|
217
|
-
|
|
218
|
-
示例1:`this.$assign('title', 'Hello jj.js !')`,在模版内使用变量 `{{title}}`
|
|
219
|
-
|
|
220
|
-
如果name为一个对象,则清除之前赋值的模板变量,并将name设置为模板变量对象。
|
|
221
|
-
|
|
222
|
-
示例2:`this.$assign({'title': 'jj.js', 'content': 'Hello jj.js !'})`,在模版内可使用变量 `{{title}}`、`{{content}}`
|
|
223
|
-
|
|
224
|
-
> 方法:**$data(name)** 获取已赋模版变量
|
|
225
|
-
|
|
226
|
-
如果name为空,则获取全部变量。
|
|
227
|
-
|
|
228
|
-
> 方法:**async $fetch(template)** 渲染模板文件并输出
|
|
229
|
-
|
|
230
|
-
异步方法,来自`View`类,渲染模板文件,并输出内容。
|
|
231
|
-
|
|
232
|
-
其中template会自动自动定位模板文件,如果name为空,则定位到当前应用下view目录下的控制器同名目录下的方法同名htm文件。
|
|
233
|
-
|
|
234
|
-
示例1:`this.$fetch()`,在index控制器类的index方法调用,则模板定位到`/app/view/index/index.htm`
|
|
235
|
-
|
|
236
|
-
示例2:`this.$fetch('list/show')`,则模板定位到`/app/view/list/show.htm`
|
|
237
|
-
|
|
238
|
-
> 方法:**async $load(template)** 加载并输出模板文件
|
|
239
|
-
|
|
240
|
-
异步方法,来自`View`类,直接加载模板文件,并输出文件内容。模板定位规则同$fetch方法。
|
|
241
|
-
|
|
242
|
-
> 方法:**async $render(data)** 渲染字符串模板
|
|
243
|
-
|
|
244
|
-
来自`View`类,渲染字符串模板,并输出。data为字符串模版内容。
|
|
245
|
-
|
|
246
|
-
示例1:`this.$render('<div>{{title}}</div>')`,会输出`<div>jj.js</div>`
|
|
247
|
-
|
|
248
|
-
> 方法:**$show(content)** 输出字符串内容或转换后的json字符串
|
|
249
|
-
|
|
250
|
-
继承自`Middleware`类,输出content内容,如果content为对象或数组,则输出json字符串。
|
|
251
|
-
|
|
252
|
-
> 方法:**$redirect(name, status = 302)** 302或其他跳转
|
|
253
|
-
|
|
254
|
-
继承自`Middleware`类,网页跳转,name解析同$fetch方法。
|
|
255
|
-
|
|
256
|
-
示例1:`this.$redirect('test')`,在index控制器类的index方法调用,则跳转到到`/app/index/test`地址
|
|
257
|
-
|
|
258
|
-
示例2:`this.$redirect('/show')`,name包含'/'前缀,则跳转到地址`/show`
|
|
259
|
-
|
|
260
|
-
> 方法:**$success(msg, name)** 成功跳转或输出
|
|
261
|
-
|
|
262
|
-
继承自`Middleware`类,返回成功提示,name解析同$redirect方法,如果是ajax请求,则返回json数据。
|
|
263
|
-
|
|
264
|
-
示例1:`this.$success('操作成功!', 'test')`,返回成功提示,并跳转到`/app/index/test`地址
|
|
265
|
-
|
|
266
|
-
示例2:`this.$success({ajax: 'data'})`,如果是ajax请求,则返回json `{state: 1, msg: '操作成功!', data: {ajax: 'data'}}`
|
|
267
|
-
|
|
268
|
-
> 方法:**$error(msg, name)** 错误跳转或输出
|
|
269
|
-
|
|
270
|
-
继承自`Middleware`类,返回失败提示,name解析同$success方法,name为空,则跳转来源网址。
|
|
271
|
-
|
|
272
|
-
> 方法:**async $next()** 执行下一个路由匹配
|
|
273
|
-
|
|
274
|
-
异步方法,继承自`Middleware`类,调用后,会等待执行全局路由配置里后面能匹配的路由。
|
|
275
|
-
|
|
276
|
-
> 注意:所有的输出和跳转并不会阻止后续代码执行,所以要终止代码执行,需在前面加上`return`。
|
|
277
|
-
|
|
278
|
-
> 方法:**async _init()** 控制器初始化
|
|
279
|
-
|
|
280
|
-
异步方法,除了使用控制器中间件执行一些初始化或验证外,控制器提供了这个更简单的方法。一旦控制器定义了这个方法,在通过url访问控制器其他公开方法时,在执行完控制器中间件后,都会先执行这个函数,如果想终止后续代码执行,可以在方法里返回`false`。
|
|
281
|
-
|
|
282
|
-
> 方法:**async _end()** 控制器结束
|
|
283
|
-
|
|
284
|
-
如果定义了这个函数,在通过url访问控制器其他公开方法后,会调用这个函数。
|
|
285
|
-
|
|
286
|
-
> 注意:因为系统默认注册了 `应用/控制器/方法` 的全局路由,所以控制器里的方法都能被直接访问,如果想作为私有方法不被访问,可以在方法前加下划线`_`前缀。
|
|
287
|
-
|
|
288
|
-
### Middleware中间件类
|
|
289
|
-
|
|
290
|
-
> 方法:**$show(content)** 参照控制器类介绍
|
|
291
|
-
|
|
292
|
-
> 方法:**$redirect(url, status)** 参照控制器类介绍
|
|
293
|
-
|
|
294
|
-
> 方法:**$success(msg, url)** 参照控制器类介绍
|
|
295
|
-
|
|
296
|
-
> 方法:**$error(msg, url)** 参照控制器类介绍
|
|
297
|
-
|
|
298
|
-
> 方法:**async $next()** 执行下一个中间件
|
|
299
|
-
|
|
300
|
-
### Db数据库类
|
|
301
|
-
|
|
302
|
-
> 方法:**connect(options)** 连接数据库
|
|
303
|
-
|
|
304
|
-
> 方法:**async close()** 关闭数据库连接
|
|
305
|
-
|
|
306
|
-
> 方法:**async startTrans(fun)** 开启事务
|
|
307
|
-
|
|
308
|
-
异步方法,如果`fun`不为空,并且是函数,则开启事务后,会自动执行此函数,并提交事务,不用再手工提交或回滚事务。`fun`为异步函数。
|
|
309
|
-
|
|
310
|
-
> 方法:**async commit()** 提交事务
|
|
311
|
-
|
|
312
|
-
> 方法:**async rollback()** 事务回滚
|
|
313
|
-
|
|
314
|
-
> 方法:**prefix(prefix)** 设置数据表前缀
|
|
315
|
-
|
|
316
|
-
> 方法:**table(table)** 设置数据表
|
|
317
|
-
|
|
318
|
-
table参数:数据表名字,不带前缀
|
|
319
|
-
|
|
320
|
-
> 方法:**field(field)** 设置查询字段
|
|
321
|
-
|
|
322
|
-
支持字符串或数组,支持多次调用
|
|
323
|
-
|
|
324
|
-
示例1:`this.field('id,name');`
|
|
325
|
-
|
|
326
|
-
示例2:`this.field(['id', 'name']).field('mobile');`
|
|
327
|
-
|
|
328
|
-
> 方法:**where(where, logic)** 设置查询条件
|
|
329
|
-
|
|
330
|
-
支持多次调用,`logic`设置多次调用之间的连接条件,默认为`and`,where参数为对象
|
|
331
|
-
|
|
332
|
-
示例1:设置查询id为1的条件
|
|
333
|
-
|
|
334
|
-
`this.where({id: 1});` // where id = 1
|
|
335
|
-
|
|
336
|
-
示例2:设置查询name为'aaa',并且sex为1的条件
|
|
337
|
-
|
|
338
|
-
`this.where({name: 'aaa', sex: 1});` // where name = 'aaa' and sex = 1
|
|
339
|
-
|
|
340
|
-
示例3:多次调用`where`,设置查询name为'aaa',并且sex为1的条件,并且age大于18的条件
|
|
341
|
-
|
|
342
|
-
`this.where({name: 'aaa', sex: 1}).where({age: ['>', 18]}); // where (name = 'aaa' and sex = 1) and (age > 18)`
|
|
343
|
-
|
|
344
|
-
可以看到,当字段值不是等于(=)时,字段值使用数组来标识,其中数组第一项为表达式(>),数组第二项为表达式要对比的值。数组的第三项为一个where内的连接逻辑,不设置的话默认为`and`,或连接的话,设置为`or`。
|
|
345
|
-
|
|
346
|
-
示例4:设置查询name为'aaa',或着sex为1的条件
|
|
347
|
-
|
|
348
|
-
`this.where({name: 'aaa', sex: ['=', 1, 'or']});` // where name = 'aaa' or sex = 1
|
|
349
|
-
|
|
350
|
-
> 说明:where支持所有表达式('=', '<>', '!=', '>', '>=', '<', '<=', 'like', 'not like', 'in', 'not in', 'between', 'not between', 'is', 'is not', 'exp')
|
|
351
|
-
|
|
352
|
-
> 方法:**distinct()** 数据去重
|
|
353
|
-
|
|
354
|
-
> 方法:**group(field)** 数据分组
|
|
355
|
-
|
|
356
|
-
> 方法:**having(condition)** 数据筛选
|
|
357
|
-
|
|
358
|
-
> 方法:**order(field, order='asc')** 查询排序
|
|
359
|
-
|
|
360
|
-
order方法支持多次调用。
|
|
361
|
-
|
|
362
|
-
示例:`this.order('id', 'desc').order('sort');` // order by id desc, sort asc
|
|
363
|
-
|
|
364
|
-
> 方法:**limit(offset, rows)** 查询数据限制
|
|
365
|
-
|
|
366
|
-
示例1:`this.limit(1, 10);` // limit 1, 10
|
|
367
|
-
|
|
368
|
-
示例2:`this.limit(10);` // limit 10
|
|
369
|
-
|
|
370
|
-
> 方法:**page(page, pageSize)** 分页查询
|
|
371
|
-
|
|
372
|
-
当要进行分页查询时,用这个方法会更方便。
|
|
373
|
-
|
|
374
|
-
示例1:`this.page(1, 10);` // limit 0, 10
|
|
375
|
-
|
|
376
|
-
示例2:`this.page(2, 10);` // limit 10, 10
|
|
377
|
-
|
|
378
|
-
> 方法:**cache(time)** 设置缓存时间
|
|
379
|
-
|
|
380
|
-
`time`单位为秒,设置缓存的话,在这个时间内再次执行相同条件的查询,将直接返回缓存的数据。
|
|
381
|
-
|
|
382
|
-
示例:`this.cache(600);` // 设置缓存时间为10分钟
|
|
383
|
-
|
|
384
|
-
> 方法:**join(table, on, type='left')** 设置表连接
|
|
385
|
-
|
|
386
|
-
假如设置文章表和用户表以用户id为条件连接:
|
|
387
|
-
|
|
388
|
-
示例:`this.table('article').join('user', 'article.user_id=user.id', 'left');` // from article article left join user user on article=user.id
|
|
389
|
-
|
|
390
|
-
> 方法:**getSql(fetch = true)** 设置是否返回sql语句
|
|
391
|
-
|
|
392
|
-
设置后,调用查询方法不会再进行真正的查询,而是直接返回编译后的sql语句字符串。
|
|
393
|
-
|
|
394
|
-
示例:`this.table('user').getSql().select();` // 返回:'select * from user'
|
|
395
|
-
|
|
396
|
-
> 方法:**async select(condition)** 查询多条数据
|
|
397
|
-
|
|
398
|
-
如果`condition`不为空,则会清空前面使用`where`方法设置的查询条件,然后以`condition`为参数调用一次`where`方法。
|
|
399
|
-
|
|
400
|
-
示例:`this.where({name: 'aaa', sex: 1}).where({id: 1}).select({id: 2});` // 等效于:this.where({id: 2}).select();
|
|
401
|
-
|
|
402
|
-
> 方法:**async find(condition)** 查询单条数据
|
|
403
|
-
|
|
404
|
-
使用方法同`select()`
|
|
405
|
-
|
|
406
|
-
> 方法:**async value(field)** 查询单个值
|
|
407
|
-
|
|
408
|
-
返回单条数据里某个字段的值,假如查询user表id为1的用户的年龄值:
|
|
409
|
-
|
|
410
|
-
示例:`this.table('user').where({id: 1}).value('age');` // 返回age值
|
|
411
|
-
|
|
412
|
-
> 方法:**async count(field='*')** 查询记录数
|
|
413
|
-
|
|
414
|
-
以某个字段查询记录总数,假如查询user表age为18的用户数:
|
|
415
|
-
|
|
416
|
-
示例:`this.table('user').where({age: 18}).count();` // 返回记录总数
|
|
417
|
-
|
|
418
|
-
> 方法:**async max(field)** 查询最大值
|
|
419
|
-
|
|
420
|
-
> 方法:**async min(field)** 查询最小值
|
|
421
|
-
|
|
422
|
-
> 方法:**async avg(field)** 查询平均值
|
|
423
|
-
|
|
424
|
-
> 方法:**async sum(field)** 对列求和
|
|
425
|
-
|
|
426
|
-
> 方法:**async column(field, key)** 获取一列数据
|
|
427
|
-
|
|
428
|
-
如果设置key则获取一列键值对
|
|
429
|
-
|
|
430
|
-
示例1:`this.column('age');` // [16, 18, 20] 数字为年龄
|
|
431
|
-
|
|
432
|
-
示例2:`this.column('age','id');` // {1: 16, 2: 18, 3: 20} 数字为年龄,1 2 3为id值
|
|
433
|
-
|
|
434
|
-
> 方法:**async pagination({page, page_size, pagination})** 分页查询并返回分页实例
|
|
435
|
-
|
|
436
|
-
相当于`page()+Pagination`类分页,如果传入`pagination`实例,则以这个实例渲染分页,否则会自动创建一个分页实例。如果没有传page、page_size,会使用`pagination`实例的`page()`方法`pageSize()`自动生成。
|
|
437
|
-
|
|
438
|
-
示例:`this.pagination();` // 返回[data_list, pagination]
|
|
439
|
-
|
|
440
|
-
> 方法:**data(data)** 设置写入数据
|
|
441
|
-
|
|
442
|
-
此方法用于更新或写入数据,提前设置需要的数据,支持多次调用
|
|
443
|
-
|
|
444
|
-
示例:`this.data({age: 18}).data({sex: 1}).insert();` // 返回[data_list, pagination]
|
|
445
|
-
|
|
446
|
-
> 方法:**allowField(field = true)** 设置过滤非数据表字段
|
|
447
|
-
|
|
448
|
-
更新或写入数据时,会过滤掉非数据表里的字段
|
|
449
|
-
|
|
450
|
-
> 方法:**async insert(data)** 插入一条数据
|
|
451
|
-
|
|
452
|
-
如果data参数不为空,会清除前面使用`data()`方法设置的数据,并以此处传入数据为准
|
|
453
|
-
|
|
454
|
-
> 方法:**async update(data, condition)** 更新数据
|
|
455
|
-
|
|
456
|
-
如果`data`参数不为空,会清除前面使用`data()`方法设置的数据,并以此处传入数据为准。如果`condition`参数不为空,会清除前面设置`where()`设置的条件
|
|
457
|
-
|
|
458
|
-
> 方法:**async inc(field, step)** 数据表字段自增
|
|
459
|
-
|
|
460
|
-
设置字段field自增,step默认为1
|
|
461
|
-
|
|
462
|
-
> 方法:**async dec(field, step)** 数据表字段自减
|
|
463
|
-
|
|
464
|
-
设置字段field自减,step默认为1
|
|
465
|
-
|
|
466
|
-
> 方法:**async exp(field, step)** 数据表字段执行自定义方法
|
|
467
|
-
|
|
468
|
-
> 方法:**async delete(condition)** 删除数据
|
|
469
|
-
|
|
470
|
-
如果`condition`参数不为空,会清除前面设置`where()`设置的条件,并以此处传入条件为准。
|
|
471
|
-
|
|
472
|
-
> 方法:**async execute(sql, params, reset=true)** 解析并执行sql语句
|
|
473
|
-
|
|
474
|
-
执行sql语句查询
|
|
475
|
-
|
|
476
|
-
> 方法:**format(sql, params)** 解析sql语句
|
|
477
|
-
|
|
478
|
-
> 方法:**async tableInfo(table)** 获取表信息
|
|
479
|
-
|
|
480
|
-
> 方法:**async tableField(table)** 获取表字段信息
|
|
481
|
-
|
|
482
|
-
> 方法:**deleteCache()** 清空数据库查询缓存
|
|
483
|
-
|
|
484
|
-
### Model模型类
|
|
485
|
-
|
|
486
|
-
> 属性:**db** 模型的db实例
|
|
487
|
-
|
|
488
|
-
每个模型文件,会懒自动创建一个独有的db实例
|
|
489
|
-
|
|
490
|
-
> 属性:**table** 数据表名字,默认为模型文件名
|
|
491
|
-
|
|
492
|
-
> 属性:**pk** 数据表主键字段,默认为`id`
|
|
493
|
-
|
|
494
|
-
> 方法:**async add(data)** 同Db类insert方法
|
|
495
|
-
|
|
496
|
-
> 方法:**async save(data, condition = {})** 智能调用Db类insert或update方法
|
|
497
|
-
|
|
498
|
-
当data含有主键字段或condition不为空,则执行db实例`update()`方法,否则执行`insert()`方法
|
|
499
|
-
|
|
500
|
-
> 方法:**async del(condition)** 同Db类delete方法
|
|
501
|
-
|
|
502
|
-
> 方法:**async get(condition)** 同Db类find方法
|
|
503
|
-
|
|
504
|
-
> 方法:**async all(condition)** 同Db类select方法
|
|
505
|
-
|
|
506
|
-
### Pagination分页类
|
|
507
|
-
|
|
508
|
-
> 方法:**init(options)** 初始化
|
|
509
|
-
|
|
510
|
-
options参数默认继承自`./config/page.js`或框架`config.page`参数,框架page参数如下:
|
|
511
|
-
|
|
512
|
-
```javascript
|
|
513
|
-
const page = {
|
|
514
|
-
page_key : 'page', // 默认分页标识
|
|
515
|
-
key_origin : 'query', // query 或 params
|
|
516
|
-
page_size : 10, // 默认分页大小
|
|
517
|
-
page_length : 5, // 默认分页长度,数字页码链接数量
|
|
518
|
-
|
|
519
|
-
//网址规则,可为空,可为路由名字,可用参数:页码${page}
|
|
520
|
-
//样例:':name'
|
|
521
|
-
//样例:'/list_${page}.html'
|
|
522
|
-
url_page : '',
|
|
523
|
-
url_index : '',
|
|
524
|
-
|
|
525
|
-
//模块样式 可用参数:网址${url},页码${page},总数${total_page},总页数${total_page}
|
|
526
|
-
index_tpl : '<li class="index"><a href="${url}">首页</a></li>',
|
|
527
|
-
end_tpl : '<li class="end"><a href="${url}">末页</a></li>',
|
|
528
|
-
prev_tpl : '<li class="prev"><a href="${url}">上一页</a></li>',
|
|
529
|
-
next_tpl : '<li class="next"><a href="${url}">下一页</a></li>',
|
|
530
|
-
list_tpl : '<li><a href="${url}">${page}</a></li>',
|
|
531
|
-
active_tpl : '<li class="active"><a href="${url}">${page}</a></li>',
|
|
532
|
-
info_tpl : '<span class="info">共${total_page}页,${total}条记录</span>',
|
|
533
|
-
|
|
534
|
-
//渲染模版
|
|
535
|
-
template : '<div class="pagination"><ul class="page">${index}${prev}${list}${next}${end}</ul>${info}</div>'
|
|
536
|
-
}
|
|
537
|
-
```
|
|
538
|
-
- key_origin:设置分页参数获取位置,url或params
|
|
539
|
-
- page_key:设置分页标识,即设置或获取当前分页的字段
|
|
540
|
-
- url_page、url_index:设置生成的分页url模板或规则,网址规则可以为路由名字,可用参数为`${page}`
|
|
541
|
-
|
|
542
|
-
> 方法:**page(page)** 设置或获取当前页
|
|
543
|
-
|
|
544
|
-
> 方法:**pageSize(page_size)** 设置或获取分页大小
|
|
545
|
-
|
|
546
|
-
> 方法:**total(total)** 设置或获取总数
|
|
547
|
-
|
|
548
|
-
> 方法:**render(total, page, page_size)** 生成分页html代码
|
|
549
|
-
|
|
550
|
-
传参,可以快速设置page、page_size、total
|
|
551
|
-
|
|
552
|
-
### View模板引擎类
|
|
553
|
-
|
|
554
|
-
> 方法:**assign(name, value)** 赋值模版变量,用法参考Controller类
|
|
555
|
-
|
|
556
|
-
> 方法:**data(name)** 获取已赋模版变量,用法参考Controller类
|
|
557
|
-
|
|
558
|
-
> 方法:**async fetch(template)** 渲染模板文件并输出,用法参考Controller类
|
|
559
|
-
|
|
560
|
-
> 方法:**async load(template)** 加载并输出模板文件,用法参考Controller类
|
|
561
|
-
|
|
562
|
-
> 方法:**async render(data)** 渲染字符串模板,用法参考Controller类
|
|
563
|
-
|
|
564
|
-
> 方法:**setFilter(fun_obj, fun)** 动态设置模版函数
|
|
565
|
-
|
|
566
|
-
设置一个或多个模板函数:
|
|
567
|
-
|
|
568
|
-
示例1:`this.setFilter('sum', (a, b) => {return a + b;});` // 设置一个函数sum
|
|
569
|
-
|
|
570
|
-
示例2:`this.setFilter({'sum': (a, b) => {return a + b;}, 'fun2': () => {}});` // 同时设置sum、fun2两个函数,设置后可以在模板中使用
|
|
571
|
-
|
|
572
|
-
> 提示:View类初始化时,默认会设置一个`url`的模板函数,即在模板文件里可以直接使用`url`函数生成网址,示例:
|
|
573
|
-
|
|
574
|
-
```javascript
|
|
575
|
-
// 首页模板代码
|
|
576
|
-
{{url('user')}}
|
|
577
|
-
|
|
578
|
-
// 生成网址(单应用模式)
|
|
579
|
-
'/index/user'
|
|
580
|
-
```
|
|
581
|
-
`url`函数具体用法,请参考Url类的`build`方法
|
|
582
|
-
|
|
583
|
-
> 方法:**setFolder(view_folder)** 动态设置模版函数
|
|
584
|
-
|
|
585
|
-
> 方法:**setDepr(view_depr)** 动态设置文件分割符
|
|
586
|
-
|
|
587
|
-
> 本框架默认使用的模板引擎为`art-template`,关于模板语法,可以参考[art-template文档](http://aui.github.io/art-template/zh-cn/docs/ "art-template文档")
|
|
588
|
-
|
|
589
|
-
### Logger日志类
|
|
590
|
-
|
|
591
|
-
> 说明:日志类是一个静态类,方法都为静态方法,但同时也支持new创建一个新的静态实例。
|
|
592
|
-
|
|
593
|
-
> 提示:目前日志类输出没有具体的代码实现,只是数据格式化后,用node自带log打印。
|
|
594
|
-
|
|
595
|
-
> 方法:**static log(msg, level='info')** 输出日志
|
|
596
|
-
|
|
597
|
-
> 方法:**static error(...args)** 输出错误日志
|
|
598
|
-
|
|
599
|
-
> 方法:**static warning(...args)** 输出错误日志
|
|
600
|
-
|
|
601
|
-
> 方法:**static info(...args)** 输出错误日志
|
|
602
|
-
|
|
603
|
-
> 方法:**static debug(...args)** 输出错误日志
|
|
604
|
-
|
|
605
|
-
> 方法:**static sql(...args)** 输出错误日志
|
|
606
|
-
|
|
607
|
-
> 方法:**static http(...args)** 输出错误日志
|
|
608
|
-
|
|
609
|
-
> 方法:**static setHandle(...args)** 输出错误日志
|
|
610
|
-
|
|
611
|
-
### Cookie类
|
|
612
|
-
|
|
613
|
-
> 方法:**set(key, value, options)** 设置cookie
|
|
614
|
-
|
|
615
|
-
options默认继承`config.cookie`参数
|
|
616
|
-
|
|
617
|
-
> 方法:**get(key)** 获取cookie
|
|
618
|
-
|
|
619
|
-
> 方法:**delete(key)** 删除一个cookie
|
|
620
|
-
|
|
621
|
-
> 方法:**all()** 获取所有cookie
|
|
622
|
-
|
|
623
|
-
> 方法:**clear()** 清除所有cookie
|
|
624
|
-
|
|
625
|
-
> 方法:**keys()** 获取所有cookie的key
|
|
626
|
-
|
|
627
|
-
### Response跳转响应类
|
|
628
|
-
|
|
629
|
-
> 方法:**show(data)** 渲染模板文件并输出,用法参考Controller类
|
|
630
|
-
|
|
631
|
-
> 方法:**redirect(url, status = 302)** 302或其他跳转,用法参考Controller类
|
|
632
|
-
|
|
633
|
-
> 方法:**success(msg='操作成功!', name)** 成功跳转或输出,用法参考Controller类
|
|
634
|
-
|
|
635
|
-
> 方法:**error(msg='操作失败!', name)** 错误跳转或输出,用法参考Controller类
|
|
636
|
-
|
|
637
|
-
> 方法:**jump(msg, url, state=1)** 跳转或输出
|
|
638
|
-
|
|
639
|
-
> 方法:**exception(err)** 输出异常页面
|
|
640
|
-
|
|
641
|
-
> 方法:**wait(time)** 设置页面跳转时等待时间
|
|
642
|
-
|
|
643
|
-
### Upload上传类
|
|
644
|
-
|
|
645
|
-
> 注意:文件上传,需要先开启`config.app.koa_body`参数,具体设置可参考[koa-body文档](https://github.com/koajs/koa-body#readme)
|
|
646
|
-
|
|
647
|
-
> 方法:**file(file)** 设置file文件
|
|
648
|
-
|
|
649
|
-
当参数`file`为字符串时,会调用`getFile(name)`方法获取上传文件并配置,如果为文件,则直接赋值。
|
|
650
|
-
|
|
651
|
-
> 方法:**getFile(name)** 获取一个上传文件
|
|
652
|
-
|
|
653
|
-
> 方法:**validate(rule={})** 设置文件验证规则参数
|
|
654
|
-
|
|
655
|
-
- rule.size,文件大小限制
|
|
656
|
-
- rule.ext,文件后缀
|
|
657
|
-
- rule.type,文件MIME类型
|
|
658
|
-
- rule.size,文件大小限制
|
|
659
|
-
- 默认会对图片后缀的文件做图片MIME验证
|
|
660
|
-
|
|
661
|
-
> 方法:**rule(name)** 设置文件保存名字或规则
|
|
662
|
-
|
|
663
|
-
参数name为字符串或函数,不传的话按内部规则。
|
|
664
|
-
|
|
665
|
-
> 方法:**checkExt(ext)** 验证文件后缀
|
|
666
|
-
|
|
667
|
-
> 方法:**checkType(type)** 验证文件MIME
|
|
668
|
-
|
|
669
|
-
> 方法:**checkImg()** 验证图片文件
|
|
670
|
-
|
|
671
|
-
> 方法:**check()** 对设置的规则执行验证
|
|
672
|
-
|
|
673
|
-
> 方法:**getError()** 获取验证错误或上传文件失败信息
|
|
674
|
-
|
|
675
|
-
> 方法:**async save(dir)** 保存上传文件
|
|
676
|
-
|
|
677
|
-
参数dir为文件保存目录,相对应用的根目录。内部会自动执行`check()`方法。
|
|
678
|
-
|
|
679
|
-
示例1:`await this.file('img').save('upload');` // 会将上传的图片保存到upload目录下
|
|
680
|
-
|
|
681
|
-
示例2:`await this.file('img').validate({size: 1024, ext: 'png', type: 'png'}).save('upload');` // 设置只能上传小于1M的png图片
|
|
682
|
-
|
|
683
|
-
上传成功返回参数:
|
|
684
|
-
|
|
685
|
-
```javascript
|
|
686
|
-
return {
|
|
687
|
-
filename, // 保存后的文件名
|
|
688
|
-
extname, // 文件后缀名
|
|
689
|
-
savename, // 除去上传目录的完成名字
|
|
690
|
-
filepath, // 文件保存目录
|
|
691
|
-
name, // 文件原始名字
|
|
692
|
-
size, // 文件大小
|
|
693
|
-
mimetype, // mimetype
|
|
694
|
-
hash // hash
|
|
695
|
-
};
|
|
696
|
-
```
|
|
697
|
-
|
|
698
|
-
### Url网址解析类
|
|
699
|
-
|
|
700
|
-
> 方法:**build(url='', vars, ext='', domain='')** 生成url网址
|
|
701
|
-
|
|
702
|
-
Url类build方法,会根据当前访问url参数,智能生成需要的网址,假如单应用模式访问`127.0.0.1/user/info`
|
|
703
|
-
|
|
704
|
-
示例1:`this.build()` // '/user/list'
|
|
705
|
-
|
|
706
|
-
示例2:`this.build('list')` // '/user/list'
|
|
707
|
-
|
|
708
|
-
示例3:`this.build('article/list')` // '/article/list'
|
|
709
|
-
|
|
710
|
-
示例4:`this.build('list', {type: 'hot', order: 'click'})` // '/user/list?type=host&order=click'
|
|
711
|
-
|
|
712
|
-
示例5:`this.build('list', '.html')` // '/user/list.html'
|
|
713
|
-
|
|
714
|
-
示例6:`this.build('list', '.html', 'localhost')` // 'localhost/user/list.html'
|
|
715
|
-
|
|
716
|
-
如果`url`参数包含`/`前缀,则直接做为网址使用
|
|
717
|
-
|
|
718
|
-
示例7:`this.build('/list', {type: 'hot'})` // '/list?type=host'
|
|
719
|
-
|
|
720
|
-
如果自定义的有路由地址,通过路由名字可以反向编译地址,假如有路由定义`./config/routes.js`
|
|
721
|
-
|
|
722
|
-
```javascript
|
|
723
|
-
route = [
|
|
724
|
-
{url: '/article/:id.html', path: 'article/article', name: 'article'},
|
|
725
|
-
];
|
|
726
|
-
|
|
727
|
-
module.exports = route;
|
|
728
|
-
```
|
|
729
|
-
这是一个自定义文章页路由地址,当访问`127.0.0.1/article/123.html`时会匹配到这个地址,并且这条路由的名字`name`为`article`,在url反向编译路由时,通过带`:`号的名字来定义:
|
|
730
|
-
|
|
731
|
-
示例8:`this.build(':article', {id: 456})` // '/article/456.html'
|
|
732
|
-
|
|
733
|
-
### Context配置上下文类
|
|
734
|
-
|
|
735
|
-
> 属性:**ctx** 整个框架的上下文,具体参数,可以参考[Koa上下文(Context)ctx文档](https://www.itying.com/koa/)
|
|
736
|
-
|
|
737
208
|
### config配置
|
|
738
209
|
|
|
739
|
-
|
|
210
|
+
应用的配置可以为`./config/`目录+`./config/xxx.js`文件的形式,也可以直接写到一个`./config.js`文件里。
|
|
740
211
|
|
|
741
212
|
应用配置不用每项都设置,只设置自己需要改的,默认会继承框架的默认配置,在控制器、中间件、模板类、模型类里都可以通过`this.$config.xxx`使用。
|
|
742
213
|
|
|
743
|
-
- app
|
|
214
|
+
- app配置`./config/app.js`:
|
|
744
215
|
```javascript
|
|
745
216
|
const app = {
|
|
746
217
|
app_debug: true, // 调试模式
|
|
@@ -759,7 +230,7 @@ const app = {
|
|
|
759
230
|
}
|
|
760
231
|
module.exports = app;
|
|
761
232
|
```
|
|
762
|
-
-
|
|
233
|
+
- 模板配置`./config/view.js`:
|
|
763
234
|
```javascript
|
|
764
235
|
const view = {
|
|
765
236
|
view_folder: 'view', // 模板目录名
|
|
@@ -770,7 +241,7 @@ const view = {
|
|
|
770
241
|
}
|
|
771
242
|
module.exports = view;
|
|
772
243
|
```
|
|
773
|
-
-
|
|
244
|
+
- 数据库配置`./config/db.js`:可以配置多个,方便程序里切换使用。
|
|
774
245
|
```javascript
|
|
775
246
|
const db = {
|
|
776
247
|
default: {
|
|
@@ -786,7 +257,7 @@ const db = {
|
|
|
786
257
|
}
|
|
787
258
|
module.exports = db;
|
|
788
259
|
```
|
|
789
|
-
-
|
|
260
|
+
- 日志配置`./config/log.js`:log_handle可以自定义日志handle
|
|
790
261
|
```javascript
|
|
791
262
|
const log = {
|
|
792
263
|
log_level: [], // [error, warning, info, debug, http, sql]
|
|
@@ -794,7 +265,7 @@ const log = {
|
|
|
794
265
|
}
|
|
795
266
|
module.exports = log;
|
|
796
267
|
```
|
|
797
|
-
-
|
|
268
|
+
- 缓存配置`./config/cache.js`:
|
|
798
269
|
```javascript
|
|
799
270
|
const cache = {
|
|
800
271
|
cache_time: 60 * 60 * 24, // 默认缓存时间(1天),为空或false则为10年
|
|
@@ -802,7 +273,7 @@ const cache = {
|
|
|
802
273
|
}
|
|
803
274
|
module.exports = cache;
|
|
804
275
|
```
|
|
805
|
-
-
|
|
276
|
+
- 分页配置`./config/page.js`:
|
|
806
277
|
```javascript
|
|
807
278
|
const page = {
|
|
808
279
|
page_key : 'page', // 默认分页标识
|
|
@@ -830,7 +301,7 @@ const page = {
|
|
|
830
301
|
}
|
|
831
302
|
module.exports = page;
|
|
832
303
|
```
|
|
833
|
-
-
|
|
304
|
+
- 跳转模板配置`./config/tpl.js`:模板可以配置为自定义的
|
|
834
305
|
```javascript
|
|
835
306
|
const tpl = {
|
|
836
307
|
jump: require('./tpl/jump'), // 跳转模板
|
|
@@ -838,7 +309,7 @@ const tpl = {
|
|
|
838
309
|
}
|
|
839
310
|
module.exports = tpl;
|
|
840
311
|
```
|
|
841
|
-
-
|
|
312
|
+
- 自定义配置`./config/self.js`:自定义配置同样可以直接通过`this.$config.self`使用。
|
|
842
313
|
```javascript
|
|
843
314
|
const self = {
|
|
844
315
|
option1: ''
|
|
@@ -847,7 +318,7 @@ const self = {
|
|
|
847
318
|
}
|
|
848
319
|
module.exports = self;
|
|
849
320
|
```
|
|
850
|
-
-
|
|
321
|
+
- 路由配置`./config/routes.js`:
|
|
851
322
|
路由功能基于`@koa/router`开发,关于url匹配规则可以参考官方文档:[文档地址](https://www.npmjs.com/package/@koa/router)
|
|
852
323
|
|
|
853
324
|
> 本框架默认内置 `应用/控制器/方法` 的全局路由,即如果不需要定制url,可以直接访问,无需配置路由。
|