model层实现
文件创建
在models文件夹下创建user.js
代码实现
javascript
const { DataTypes } = require('sequelize')
const { db } = require('./index')
const User = db.define('user', {
id: {
type: DataTypes.INTEGER,
primaryKey: true, // 主键
autoIncrement: true, // 内容自增
allowNull: false, // 是否允许为空
unique: true, // 不可重复
comment: '用户id,唯一'
},
username: {
type: DataTypes.STRING,
allowNull: false,
comment: '用户姓名'
},
nickname: {
type: DataTypes.STRING,
allowNull: true,
comment: '用户昵称'
},
password: {
type: DataTypes.STRING,
allowNull: false,
comment: '用户密码'
},
gender: {
type: DataTypes.INTEGER,
allowNull: false,
comment: '用户性别'
},
avatar: {
type: DataTypes.STRING,
allowNull: false,
comment: '头像'
},
role: {
type: DataTypes.INTEGER,
allowNull: false,
comment: '角色'
},
education: {
type: DataTypes.INTEGER,
allowNull: true,
comment: '学历'
},
school: {
type: DataTypes.STRING,
allowNull: true,
comment: '毕业院校'
},
banjiId: {
type: DataTypes.INTEGER,
allowNull: true,
comment: '班级id'
}
})
// 同步创建user表
// User.sync({
// force: false
// }).then(res => {
// console.log('res====>', res);
// }).catch(err => {
// console.log('err====>', err);
// })
module.exports = User
内容解释
DataTypes
是一个含有常用数据类型的类,它用于使用sequelize.define()方法定义模型时指定列的数据类型 参考文章
创建时间和更新时间
这两个字段不用创建,在上文中数据库连接配置中,timestamps属性就是做这个的,后续的赋值和修改也不用做处理
数据表同步
主要是不会在软件中建表,我第一次就是自己在Navicat中建的,结果查询一直出错。直接同步,成功。
同步建表时候需要把导出语句:module.exports = user 这一句先注释掉哈
service层实现
文件创建
- 根目录下创建service文件夹
- 在service文件夹下创建user.js
代码实现
javascript
const User = require('../models/user')
const { Op } = require("sequelize"); // 设置数据库语句查询条件
class UserService {
// 查询所有用户
async findAllUser (ctx) {
const { username, gender, role, size, page } = ctx.query
const queryParams = {}
if (username) { // 主要用于参数为空时不设置数据库查询条件
queryParams.username = {
[Op.like]: `%${username}%`
}
}
if (gender) {
queryParams.gender = gender
}
if (role) {
queryParams.role = role
}
// + 的作用在于将size转为数字
const res = await User.findAndCountAll({
where: queryParams,
limit: +size,
offset: (page - 1) * size,
})
return {
total: res.count,
records: res.rows
}
}
// 查询用户
async findUser (userInfo) {
const res = await User.findOne({
where: {
username: userInfo.username
}
})
return res.dataValues
}
// 创建用户
async createUser (userInfo) {
const res = await User.create(userInfo)
return res.dataValues
}
// 更新用户
async updateUser (id, userInfo) {
const res = await User.update(userInfo, {
where: {
id
}
})
return res.dataValues
}
// 删除用户
async deleteUser (id) {
const res = await User.destroy({
where: {
id
}
})
return res.dataValues
}
}
module.exports = new UserService()
内容解释
Op的使用
controller层实现
文件创建
- 根目录下创建controller文件夹
- 在controller文件夹下创建user.js
代码实现
javascript
const { findAllUser, createUser, updateUser, deleteUser } = require('../service/user')
class UserController {
// 查询所有用户
async findAllUser (ctx) {
const res = await findAllUser(ctx)
ctx.body = {
code: 200,
message: '查询成功',
data: res,
}
}
// 创建用户
async addUserInfo (ctx) {
const userInfo = ctx.request.body
try {
const res = await createUser(userInfo)
console.log('res===>create', res);
ctx.body = {
code: 200,
message: '用户创建成功',
data: {
id: res.id,
userName: res.userName,
},
}
} catch (error) {
}
}
// 更新用户
async updateUserInfo (ctx) {
const { id, ...info } = ctx.request.body
try {
const res = await updateUser(id, info)
console.log('res===>update', res);
ctx.body = {
code: 200,
message: '用户更新成功',
data: res,
}
} catch (error) {
}
}
// 删除用户
async deleteUserInfo (ctx) {
const { id } = ctx.request.body
try {
const res = await deleteUser(id)
console.log('res===>delete', res);
ctx.body = {
code: 200,
message: '用户删除成功',
data: res,
}
} catch (error) {
}
}
}
module.exports = new UserController()
内容解释
请求参数的获取
- get请求:参数中ctx.query中及逆行解构即可
- post请求:参数都在ctx.request.body中
响应数据封装
后续可以对响应数据结构进行封装,各位自行实现哈,或者等待下一版本的开发记录
router层实现
文件创建
- 根目录下创建router文件夹
- 在router文件夹下创建user.js
代码实现
javascript
const Router = require('koa-router')
const router = new Router({ prefix: '/user' })
const { findAllUser, addUserInfo, updateUserInfo, deleteUserInfo } = require('../controller/user')
router.get('/getList', findAllUser)
router.post('/addUser', addUserInfo)
router.post('/updateUser', updateUserInfo)
router.post('/delUser', deleteUserInfo)
module.exports = router
内容解释
prefix
模块主路由设置。
javascript
const router = new Router({ prefix: '/user' })
表示用户模块的接口地址都以/user开头
启动文件补充
javascript
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
// 引入路由
const Router = require('koa-router');
const router = new Router();
const { serverSetting } = require('./config');
// 引入用户模块路由
const userRouter = require('./router/user');
const app = new Koa();
app.use(bodyParser());
// 总路由加载用户路由
router.use(userRouter.routes())
//服务加载总路由信息
app.use(router.routes()).use(router.allowedMethods())
app.listen(serverSetting.port, () => {
console.log(`server is running at http://${serverSetting.ipAddress}:${serverSetting.port}/${serverSetting.proxy}`)
})