mvk v1.1.2
Koa的应用层框架
注意:依赖 Redis
储存 Session
,请先配置mysql
和本机安装redis
$ npm i -g mvk
开始使用吧
创建项目
$ mvk create myapp
安装依赖
$ cd myapp
$ npm install
运行
npm run run
配置 mysql 和 Redis
在 config/default.js
配置
export default {
mysql: { user: '用户名', password: '密码', database: '库名', host: '127.0.0.1' },
session: { name: 'sessid', maxAge: 2626560000, redis: {} //redis配置 可选}
}
目录结构
project
├── package.json
├── main.js
├── app
│ ├── app.js (可选)
│ ├── controller
│ | └── home.js
│ └── service (可选)
│ └── home.js
├── static
└── config
└── default.js
/main.js
入口文件/app/app.js
运行时生命周期文件,可处理运行时的错误回调等/app/controller/*.js
控制器,用于解析用户的输入,处理后返回相应的结果/app/service/*.js
用于编写业务逻辑层,可选,建议使用/config/default.js
默认配置文件,在controller
和service
可通过this.config.文件名
访问,可声明多个配置文件/static/
存放静态资源文件夹
说明
- 路由
路由默认自动注册,以控制器 app/controller
文件夹里文件名称注册,例如以上注册为:/api/home/home
自定义;你可以在 app/app.js
导出 router(add)
方法自定义路由,例子:
export default {
router(add) {
add('get', '/home/:id', 'home.home')
}
}
add
方法接受接受三个参数:请求类型、路径、控制器.方法
- 参数校验
你可以在控制器声明同名静态属性描述参数(这不是必须的),例子:
import { Controller } from 'mvk'
export default class extends Controller {
static home = { id: 'int' }
async home(id) {
return this.service('user').getList(id)
}
}
将会从请求中拿到名为 id
的参数传递调用 home
方法(POST,GET),支持的类型如下:
{
id: 'int', //Number 不带小数点
id: 'int?', //Number 不强制的参数用?声明
name: 'string', //String 字符串
name: 'string 2,16' //String 字符串最大允许16个字符,最少需要2个字符
name: 'string 12' //String 字符串最大允许12个字符
id: 'float' //Number 带小数点
image: 'file' //File 需要一个文件
image: 'file 300000' //File 限制文件大小
image: 'file image/png,30000' 限制文件类型和大小
images: 'files' //File[] 多文件,参数同上
date: 'date' //Date 对象
is: 'boolean' //Boolean 布尔值 可使用
is: 'bool' //Boolean 别名 同上
}
- SESSION 模块
Controller
和 Service
类实例化时会挂载 session 和 mysql
import { Controller } from 'mvk'
export default class extends Controller {
async home(id) {
this.session.userInfo={id:12}
}
}
注意:操作 session
时必须在 return
之前,即请求完成后操作session
不再会储存到 redis
,session
对象的属性值必须是可JSON序列化,意味着储存函数是无效的。
属性:
session.sessionId -> 当前用户的 session ID
session.delete(id) -> 删除,不传递 id 则删除当前用户,如果传递 null
则清空所有,删除所有或当前用户后 对 session
的赋值不再会储存到 redis
- MYSQL 模块
import { Service } from 'mvk'
export default class extends Service {
async home(id) {
const conn = await this.mysql()
const list = await conn.select('*','user').where({ id: 1}).run()
conn.end()
return list
}
}
mysql模块默认采用连接池的连接方式
在Service
中调用this.mysql()
从连接池中获取一个连接进行查询,在查询完成后请务必调用end
方法将连接放回连接池中。
- mysql 进阶
mysql模块基于mysql2
增加了select
、update
、delete
、insert
方法,分别对应mysql的基本四种操作,并且扩展了查询方式,例如:
import { Service } from 'mvk'
export default class extends Service {
async home(id,file) {
const conn = await this.mysql()
const list = await conn.insert('user',{id:1,qrcode:file}).run()
conn.end()
return list
}
}
以上演示了往mysql插入一个file
文件,参数为用户上传文件的File
对象,本质上不会往mysql储存二进制文件,而是计算文件的sha256
作为参数值,然后将文件储存到目录下。
要允许该操作,请在/config/default.js
配置参数
export default {
mysql_file: {
path: 'static/', //文件保存的路径
//允许储存的表名称和字段名称
table: {
user: ['qrcode','avater'],
},
suffix: '.zip' //文件后缀名 可选
}
}
文件储存为static/36f6721c2f76ee8be791f190e641bafd9e694993255e8adc61f21fc12d1a7f0b.zip
同理在调用mysql的update
,delete
时,会查询数据表是否还有数据引用该文件,如果没有引用会彻底删除该文件。
- where 条件
import { Service } from 'mvk'
export default class extends Service {
async home(id) {
const conn = await this.mysql()
const list = await conn.select('*','user').where({ id: 1,name: undefined,cancel:null,year:()=>'now()'}).run()
//select * from `user` where id=1 and cancel is null and year=now()
conn.end()
return list
}
}
- update 更新值
import { Service } from 'mvk'
export default class extends Service {
async home(id) {
const conn = await this.mysql()
const list = await conn.update('user',{id:undefined,name:null,year:()=>'year+1'}).where({ id: 1}).run()
//update `user` set name=null,year=year+1 where id=1
return list
}
}
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago