「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」
今天的分享是基于我封装的框架开发的。 我的框架地址:https://gitee.com/yang-yiming1234/koa
操作数据库需要用到 sequelize
创建model
user_detail.model.js
代码语言:javascript复制// 数据类型
const { DataTypes } = require('sequelize')
const seq = require('../db/seq')
// 创建模型 UserDetail是表名
const UserDetail = seq.define('UserDetail', {
user_id:{
// 整形数据类型
type: DataTypes.INTEGER,
// 是否允许为空
allowNull: false,
// 默认值
defaultValue: 0,
// 备注
comment: '用户编号',
// 是否唯一
unique: true,
},
phone:{
//字符串类型
type: DataTypes.STRING,
allowNull: true,
comment: '手机号'
},
job:{
type: DataTypes.STRING,
allowNull: true,
comment: '职业'
},
tag:{
type: DataTypes.STRING,
allowNull: true,
comment: '标签'
},
signature:{
type: DataTypes.STRING,
allowNull: true,
comment: '座右铭'
},
email:{
type: DataTypes.STRING,
allowNull: true,
comment: '邮箱'
}
})
// force如果之前存在这张表 会删了重建 文档:模型重建 用过后要注释掉
// node src/model/user.model.js 创建数据库表
// UserDetail.sync({ force: true })
module.exports = UserDetail
将UserDetail.sync({ force: true })
注释放开。执行命令node src/model/user_detail.model.js
创建数据库表。创建完后,再进行注释。否则会将表删除再建新表。其实 UserDetail.sync({ force: true })
就相当于 执行了删除表语句,再执行创建表语句。
创建成功的话,在数据库中可以看到生成了相应的表。
router路由
manage.route.js
代码语言:javascript复制// 引入包
const Router = require('koa-router')
// 引入controller我们下面写
const { getUserManage } = require('../controller/manage.controller')
// 访问这个文件下的接口,都需要加一个前缀 /manage
const router = new Router({prefix:'/manage'})
// 我们的接口,请求方式是get 我们访问接口路径 /manage/getUserManage
router.get('/getUserManage', getUserManage),
// 导出
module.exports = router
controller
manage.controller.js
- 获取前端查询条件,如果没有查询条件,都给个默认值
''
- 调用相应的service,去获取数据。
- 最后将数据返回
// 引入service
const { usermanage } = require('../service/usermanage.service')
class ManageController {
async getUserManage(ctx, next) {
// 1.获取数据
const { username = '', is_admin = '', createdAt = '', updatedAt = '', currentPage = 1, pageSize = 10 } = ctx.request.query
console.log(username, is_admin, createdAt, updatedAt, currentPage, pageSize)
// 2.操作数据库
try {
// 调用service层最好加try catch
const res = await usermanage({ username, is_admin, createdAt, updatedAt, currentPage, pageSize })
res.currentPage = currentPage
res.pageSize = pageSize
// 3.返回给客户端
ctx.body = {
code: 1000,
data: res
}
} catch (err) {
console.log(err)
ctx.app.emit('error', userRegisterError, ctx)
}
}
}
// 导出实例化的对象
module.exports = new ManageController()
service
usermanage.service.js
- 整个文件是一个类,而每个service的方法是一个函数。
- 定义一个对象用于存储查询条件
- 如果查询条件存在将查询条件插入where对象中。[Op.like] 是模糊查询
分页
findAndCountAll是对应的分页方法。 count, rows分别是数据条数和具体的数据。
limit y offset x
分句表示: 跳过 x 条数据,读取 y 条数据
offset: (currentPage - 1) * pageSize,
limit: Number(pageSize),
const User = require('../model/user.model')
const { Op } = require("sequelize");
class UserManageService {
// 查询所有用户
async usermanage({ username, is_admin, createdAt, updatedAt, currentPage, pageSize }) {
const where = {};
username && (where['username'] = {
[Op.like]: username
})
is_admin && (where['is_admin'] = {
[Op.eq]: is_admin
})
createdAt && (where['createdAt'] = {
[Op.like]: createdAt
})
updatedAt && (where['updatedAt'] = {
[Op.like]: createdAt
})
const { count, rows } = await User.findAndCountAll({
where,
offset: (currentPage - 1) * pageSize,
limit: Number(pageSize),
});
return rows ? { rows, count } : { error: 500 }
}
}
// 导出后 在控制器controller中使用
module.exports = new UserManageService()
测试
最后在没有前端的时候,我们可以在postman中进行测试。