在mrcs(model/router/controller/service)服务端框架模型中,我们创建一个接口走完每个环路
1. 创建router
- router 协议定义
get - 查询
post - 增加
update - 更新
delete -删除
在router文件夹下创建role.js文件
'use strict';
module.exports = app => {
app.router.get('/role/list',app.controller.role.list); // 获取角色列表
app.router.post('/role/add',app.controller.role.add); // 新增角色
app.router.update('/role/update',app.controller.role.update); // 新增角色
app.router.delete('/role/delete',app.controller.role.delete); // 新增角色
}
在 /app/router.js 中引用role.js路由文件
'use strict';
module.exports = app => {
require('./router/role')(app);
};
2. 创建controller
在/app/controller文件夹下创建role.js
'use strict';
const { Controller } = require('egg'); // es6解构
class RoleController extends Controller {
async add () {
// 多用try捕获想不到的问题
try {
const { ctx } = this;
const cbody = ctx.request.body // 通过ctx.request.body 获取通过body数据包发过来的数据
const params = {}
if (cbody.name && typeof cbody.name === 'string') {
if (cbody.name.length > 10) throw new Error('角色名称不能超过10个字符') // 防止数据库长度溢出
if (cbody.name.replace(/\s+/g, '') === '') throw new Error('角色名称不能为空') // 替换掉名称里面的空格,不能为空
params.name = cbody.name
} else {
throw new Error('请输入角色名称')
}
if (cbody.auths && typeof cbody.auths === 'string') { // 用户权限如果存在则设置,如果为传入则置空
params.auths = cbody.auths
} else {
params.auths = ''
}
this.ctx.body = await this.ctx.service.role.add(params) // 把业务参数处理好传给service服务处理
} catch (err) {
// 返回错误信息
this.ctx.body = {
code: 0,
msg: err.message
}
}
}
async list () {
const { ctx } = this;
try {
// 对于角色而言往往数量很少,不至于使用分页和关键词搜索,这里是为了演示数据操作
const cbody = ctx.query // 通过query路由参数传过来的参数在ctx.query中
const params = {
searchMsg: cbody.search || '', // 关键词搜索
page: cbody.page || 1, // 页码
pageSize: cbody.pageSize || 20 // 单页数量
}
this.ctx.body = await this.ctx.service.role.list(params)
} catch (err) {
// 返回错误信息
this.ctx.body = {
code: 0,
msg: err.message
}
}
}
async update () {
// 多用try捕获想不到的问题
try {
const { ctx } = this;
const cbody = ctx.request.body // 通过ctx.request.body 获取通过body数据包发过来的数据
const params = {}
if (cbody.id && !isNaN(Number(cbody.id))) {
params.id = cbody.id
} else {
throw new Error('缺少参数id')
}
if (cbody.name && typeof cbody.name === 'string') { // 如果角色名称存在,传入
if (cbody.name.length > 10) throw new Error('角色名称不能超过10个字符') // 防止数据库长度溢出
if (cbody.name.replace(/\s+/g, '') === '') throw new Error('角色名称不能为空') // 替换掉名称里面的空格,不能为空
params.name = cbody.name
}
if (cbody.auths && typeof cbody.auths === 'string') { // 如果用户权限存在,传入
params.auths = cbody.auths
}
this.ctx.body = await this.ctx.service.role.update(params) // 把业务参数处理好传给service服务处理
} catch (err) {
// 返回错误信息
this.ctx.body = {
code: 0,
msg: err.message
}
}
}
async delete () {
const { ctx } = this;
try {
const cbody = ctx.request.body // 这里delete参数使用body体传入
if (cbody.id && isNaN(Number(cbody.id))) {
this.ctx.body = await this.ctx.service.role.delete({ id: cbody.id })
return
}
throw new Error('缺少参数id')
} catch (err) {
// 返回错误信息
this.ctx.body = {
code: 0,
msg: err.message
}
}
}
}
module.exports = RoleController;
3. 创建Service
在/app/service 下创建role.js
'use strict';
const { Service } = require('egg');
const SuccessMsg = '操作成功'
class RoleService extends Service {
/**
* 新增角色
*/
async add (params) {
const { ctx } = this;
try {
const hasOne = await ctx.model.Role.findOne({
where: {
name: params.name
}
})
if (hasOne) throw new Error('已有同名角色') // 判断是否有同名角色
const data = await ctx.model.Role.create({
name: params.name,
auths: params.auths
})
if (data) {
return {
code: 1,
msg: SuccessMsg
}
}
throw new Error('创建角色失败')
} catch (err) {
return {
code: 0,
msg: err.message
}
}
}
/**
* 获取角色列表
*/
async list () {
const { ctx, app } = this;
try {
const Op = app.Sequlize.Op; // op查询方法
const query = {};
if (params.searchMsg !== '') {
query.name = {
[Op.like]: '%' + params.searchMsg + '%',
};
}
const data = await ctx.model.Role.findAndCountAll({
attributes: ['id', 'name', 'auths'], // 所需要的字段,不设置该字段默认全部拿出,对于字段比较多的表建议设置
where: query, // 查询参数
limit: parseInt(params.pageSize), // 分页
offset: (parseInt(params.page) - 1) * parseInt(params.pageSize), // 分页偏移
order: [['created_at', 'DESC']], // 排序
});
return {
code: 1,
msg: SuccessMsg,
data: data.rows.map((items) => {
items.dataValues.auths = items.dataValues.auths.split(',') // 返回auths数组,方便前端使用
return items
}),
count: data.count
}
} catch (err) {
return {
code: 0,
msg: err.message
}
}
}
/**
* 更新角色
*/
async update (params) {
const { ctx } = this;
try {
const hasOne = await ctx.model.Role.findOne({
where: {
name: params.name
}
})
if (hasOne && hasOne.id !== params.id) throw new Error('已有同名角色') // 判断是否有同名角色
const query = {}
if (params.name) query.name = params.name
if (params.auths) query.auths = params.auths
const data = await ctx.model.Role.update({
name: params.name,
auths: params.auths
}, {
where: {
id: params.id
}
})
if (data) {
return {
code: 1,
msg: SuccessMsg
}
}
throw new Error('更新角色失败')
} catch (err) {
return {
code: 0,
msg: err.message
}
}
}
/**
* 删除角色
*/
async delete (params) {
const { ctx } = this;
try {
const data = await ctx.model.Role.destroy({
where: {
id: params.id,
},
});
if (!data) throw new Error('删除角色失败');
return {
code: 1,
msg: SuccessMsg
}
} catch (err) {
return {
code: 0,
msg: err.message
}
}
}
}
module.exports = RoleService;