1、在controller文件夹下新增config.js
const { SuccessModel, ErrorModel } = require('../model/resModel')
const configModel = require('../model/configModel')
const UT = require('../utils/common');
class ConfigController {
async page(ctx, next) {
const { page=1, size=10,name,ename,config_type } = ctx.request.body
const where = {}
if(name){
where.name = name
}
if(ename){
where.ename = ename
}
if(config_type){
where.config_type = config_type
}
try {
const data = await configModel.page(page,size,where)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async list(ctx, next) {
try {
const data = await configModel.list()
// console.log('data',data)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async add(ctx, next) {
const { cname='',ename='',value='',values='',field_type=0,config_type=0,sorting=99 } = ctx.request.body
try {
const time=new Date().getTime() / 1000
const res = await configModel.create({
cname,
ename,
value,
value,
field_type,
config_type,
sorting
})
if(!res) return ctx.body = new ErrorModel('系统配置添加失败')
ctx.body = new SuccessModel('系统配置添加成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async update(ctx, next) {
const { id, cname,ename,value,values,field_type,config_type,sorting } = ctx.request.body;
try {
const exitRes = await configModel.getInfo({id})
if(exitRes.length === 0) return ctx.body = new ErrorModel('该系统配置不存在')
const time =new Date().getTime() / 1000
const result = await configModel.update(id,{
cname,
ename,
value,
values,
field_type,
config_type,
sorting
})
if(!result) return ctx.body = new ErrorModel('修改信息失败')
ctx.body = new SuccessModel('修改信息成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async bulkUpdate(ctx, next) {
const { data } = ctx.request.body;
try {
// const updateData = JSON.parse(data)
const result = await configModel.batchUpdate({ table: 'config', column: 'id' } , data)
if(!result) return ctx.body = new ErrorModel('修改配置失败')
ctx.body = new SuccessModel('修改配置成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async delete(ctx, next) {
const { id } = ctx.request.body;
try {
const exitRes = await configModel.getInfo({id})
if(!exitRes.length === 0) return res.json({code:400,data:'',msg:'系统配置不存在!'})
// const time =new Date().getTime() / 1000
const result = await configModel.delete(id)
if(!result) return ctx.body = new ErrorModel('删除系统配置失败')
ctx.body = new SuccessModel('删除系统配置成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async getSysInfo(ctx, res) {
const where = {}
// where.config_type = 1
// 查询列表
try {
const data = await configModel.list();
const listJson = JSON.parse(JSON.stringify(data))
listJson.forEach(item => {
if(item.field_type === 4){
item.value = item.value.split(',')
}else if(item.field_type === 7){
item.images = []
if(item.value){
item.images.push({
url:`${ process.env.BASE_URL }/${item.value}`,
fileUrl: item.value
})
}
}
});
const groupedItems = UT.groupBy(listJson, item => item.config_type);
ctx.body = new SuccessModel('系统配置权限更新成功',groupedItems)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async getSystem(ctx, res) {
// 查询列表
try {
const data = await configModel.getSystem();
const listJson = JSON.parse(JSON.stringify(data))
listJson.forEach(item => {
if(item.field_type === 4){
item.value = item.value.split(',')
}else if(item.field_type === 7){
item.value = `${ process.env.BASE_URL }/${item.value}`
}
});
ctx.body = new SuccessModel('系统配置权限更新成功', UT.arrayToObject(listJson))
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
}
module.exports = new ConfigController()
2、在controller文件夹下新增configType.js
const { SuccessModel, ErrorModel } = require('../model/resModel')
const configTypeModel = require('../model/configTypeModel')
class ConfigTypeController {
async page(ctx, next) {
const { page=1, size=10,config_type } = ctx.request.body
const where = {}
if(config_type){
where.config_type = config_type
}
try {
const data = await configTypeModel.page(page,size,where)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async list(ctx, next) {
const { config_type } = ctx.request.body
const where = {}
if(config_type){
where.config_type = config_type
}
try {
const data = await configTypeModel.list(where)
console.log('data',data)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async add(ctx, next) {
const { name,is_system,order,status=1 } = ctx.request.body
try {
const time=new Date().getTime() / 1000
const res = await configTypeModel.create({
name,
is_system,
status,
order,
create_time:time,
update_time:time,
})
if(!res) return ctx.body = new ErrorModel('配置分类添加失败')
ctx.body = new SuccessModel('配置分类添加成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async update(ctx, next) {
const { id,name,is_system,order } = ctx.request.body;
try {
const exitRes = await configTypeModel.getInfo({id})
if(exitRes.length === 0) return ctx.body = new ErrorModel('该配置分类不存在')
const time =new Date().getTime() / 1000
const result = await configTypeModel.update(id,{
name,
is_system,
order,
update_time:time
})
if(!result) return ctx.body = new ErrorModel('修改信息失败')
ctx.body = new SuccessModel('修改信息成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async delete(ctx, next) {
const { id } = ctx.request.body;
try {
const exitRes = await configTypeModel.getInfo({id})
if(!exitRes.length === 0) return res.json({code:400,data:'',msg:'配置分类不存在!'})
// const time =new Date().getTime() / 1000
const result = await configTypeModel.delete(id)
if(!result) return ctx.body = new ErrorModel('删除配置分类失败')
ctx.body = new SuccessModel('删除配置分类成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
}
module.exports = new ConfigTypeController()
3、在controller文件夹的cms文件夹下新增cmsModels.js
const db = require('../../config/knex')
const { SuccessModel, ErrorModel } = require('../../model/resModel')
const cmsFieldModel = require('../../model/cmsFieldModel')
const cmsModelsModel = require('../../model/cmsModelsModel')
// const cmsCateModel = require('../../model/cmsCateModel')
class CmsModelsController {
async page(ctx, next) {
const { page=1, size=10,name } = ctx.request.body
const where = {}
if(name){
where.name = name
}
try {
const data = await cmsModelsModel.page(page,size,where)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async list(ctx, next) {
try {
const data = await cmsModelsModel.list()
// console.log('data',data)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async add(ctx, next) {
const { model_name,table_name,list_tmp,index_tmp,article_tmp,order,status=1 } = ctx.request.body
try {
const time=new Date().getTime() / 1000
const res = await cmsModelsModel.create({
model_name,
table_name,
list_tmp,
index_tmp,
article_tmp,
order,
status,
create_time:time,
update_time:time
})
if(!res) return ctx.body = new ErrorModel('模型添加失败')
const exit = await db.knex.schema.hasTable(`cms_ext_${table_name}`)
const exitRes = await cmsModelsModel.getInfo({table_name})
console.log('exitexit',exit,exitRes)
if(exit && exitRes.length > 0) return ctx.body = new ErrorModel('该模型数据表已存在')
// 创建新表
const tableRes= await db.knex.schema.createTable(`cms_ext_${table_name}`, table => {
table.integer('aid',11).notNullable(); // 非空的用户名字段
});
console.log('tableRes',tableRes)
ctx.body = new SuccessModel('模型添加成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async update(ctx, next) {
const { id,model_name,table_name,list_tmp,index_tmp,article_tmp,order } = ctx.request.body;
try {
const exitRes = await cmsModelsModel.getInfo({id})
if(exitRes.length === 0) return ctx.body = new ErrorModel('该模型不存在')
const time =new Date().getTime() / 1000
const result = await cmsModelsModel.update(id,{
model_name,
table_name,
list_tmp,
index_tmp,
article_tmp,
order,
update_time:time
})
if(!result) return ctx.body = new ErrorModel('修改信息失败')
ctx.body = new SuccessModel('修改信息成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async delete(ctx, next) {
const { id } = ctx.request.body;
try {
const exitRes = await cmsModelsModel.getInfo({id})
if(exitRes.length === 0) return res.json({code:400,data:'',msg:'模型不存在!'})
// 判断该模型下有没有分类,必须先把分类删除
const exitCates = await cmsCateModel.getInfo({models_id:id})
console.log('exitCates',exitCates)
if(exitCates.length > 0) return ctx.body = new ErrorModel('该模型有分类数据,请先删除')
// const time =new Date().getTime() / 1000
const result = await cmsModelsModel.delete(id)
if(!result) return ctx.body = new ErrorModel('删除模型失败')
const exit = await db.knex.schema.hasTable(`cms_ext_${exitRes[0].table_name}`)
// 删除表
if(exit){
await db.knex.schema.dropTable(`cms_ext_${exitRes[0].table_name}`)
}
const exitFileds = await cmsFieldModel.getInfo({models_id:id})
// 删除字段
if(exitFileds.length > 0){
const ids = []
exitFileds.forEach(item=>{
ids.push(item.id)
})
await cmsFieldModel.batchDelete(ids)
}
// 删除
ctx.body = new SuccessModel('删除模型成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
}
module.exports = new CmsModelsController()
4、在controller文件夹的cms文件夹下新增cmsField.js
const db = require('../../config/knex')
const { SuccessModel, ErrorModel } = require('../../model/resModel')
const cmsFieldModel = require('../../model/cmsFieldModel')
const cmsModelsModel = require('../../model/cmsModelsModel')
class CmsFieldController {
async page(ctx, next) {
const { page=1, size=10,field_cname,field_ename } = ctx.request.body
const where = {}
if(field_cname){
where.field_cname = field_cname
}
if(field_ename){
where.field_ename = field_ename
}
try {
const data = await cmsFieldModel.page(page,size,where)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async list(ctx, next) {
try {
const data = await cmsFieldModel.list()
// console.log('data',data)
if(!data) return ctx.body = new ErrorModel('获取数据失败')
ctx.body = new SuccessModel('获取数据成功', data)
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async add(ctx, next) {
const { field_cname,field_ename,field_type,field_values,field_default,models_id,order,status=1 } = ctx.request.body
try {
const time=new Date().getTime() / 1000
const res = await cmsFieldModel.create({
field_cname,
field_ename,
field_type,
field_values,
field_default,
models_id,
order,
status,
create_time:time,
update_time:time
})
if(res.length == 0) return ctx.body = new ErrorModel('字段添加失败')
const exitRes = await cmsModelsModel.getInfo({id:models_id})
if(exitRes.length === 0) return ctx.body = new ErrorModel('模型不存在')
await db.knex.schema.table(`cms_ext_${exitRes[0].table_name}`, (table) => {
switch (field_type) {
case 1:
table.string(field_ename).defaultTo(field_default)
break;
case 2:
table.string(field_ename).defaultTo(field_default)
break;
case 3:
table.string(field_ename).defaultTo(field_default)
break;
case 4:
table.string(field_ename).defaultTo(field_default)
break;
case 5:
table.text(field_ename).defaultTo(field_default)
break;
case 6:
table.text(field_ename).defaultTo(field_default)
break;
case 7:
table.float(field_ename).defaultTo(field_default)
break;
case 8:
table.integer(field_ename,11).defaultTo(field_default)
break;
case 9:
table.longtext(field_ename).defaultTo(field_default)
break;
default:
table.string(field_ename).defaultTo(field_default)
break;
}
});
ctx.body = new SuccessModel('字段添加成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async update(ctx, next) {
const { id,field_cname,field_ename,field_type,field_default,field_values,models_id,order } = ctx.request.body;
try {
const exitRes = await cmsFieldModel.getInfo({id})
if(exitRes.length === 0) return ctx.body = new ErrorModel('该字段不存在')
const time =new Date().getTime() / 1000
const result = await cmsFieldModel.update(id,{
field_cname,
field_ename,
field_type,
field_values,
field_default,
models_id,
order,
update_time:time
})
if(result.length == 0) return ctx.body = new ErrorModel('修改信息失败')
const exitModel = await cmsModelsModel.getInfo({id:models_id})
if(exitModel.length === 0) return ctx.body = new ErrorModel('模型不存在')
const exit = await db.knex.schema.hasTable(`cms_ext_${exitModel[0].table_name}`)
if(exit){
await db.knex.schema.table(`cms_ext_${exitModel[0].table_name}`, (table) => {
switch (field_type) {
case 1:
table.string(field_ename).defaultTo(field_default).alter()
break;
case 2:
table.string(field_ename).defaultTo(field_default).alter()
break;
case 3:
table.string(field_ename).defaultTo(field_default).alter()
break;
case 4:
table.string(field_ename).defaultTo(field_default).alter()
break;
case 5:
table.text(field_ename).defaultTo(field_default).alter()
break;
case 6:
table.text(field_ename).defaultTo(field_default).alter()
break;
case 7:
table.float(field_ename).defaultTo(field_default).alter()
break;
case 8:
table.integer(field_ename,11).defaultTo(field_default).alter()
break;
case 9:
table.longtext(field_ename).defaultTo(field_default).alter()
break;
default:
table.string(field_ename).defaultTo(field_default).alter()
break;
}
});
}
ctx.body = new SuccessModel('修改信息成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
async delete(ctx, next) {
const { id } = ctx.request.body;
try {
const exitRes = await cmsFieldModel.getInfo({id})
if(!exitRes.length === 0) return res.json({code:400,data:'',msg:'字段不存在!'})
// const time =new Date().getTime() / 1000
const result = await cmsFieldModel.delete(id)
if(!result) return ctx.body = new ErrorModel('删除字段失败')
const exitModel = await cmsModelsModel.getInfo({id: exitRes[0].models_id})
if(exitModel.length === 0) return res.json({code:400,data:'',msg:'模型不存在!'})
const exit = await db.knex.schema.hasTable(`cms_ext_${exitModel[0].table_name}`)
if(exit){
await db.knex.schema.table(`cms_ext_${exitModel[0].table_name}`, (table) => {
table.dropColumn(exitRes[0].field_ename);
})
}
ctx.body = new SuccessModel('删除字段成功')
} catch (error) {
return ctx.body = new ErrorModel(error)
}
}
}
module.exports = new CmsFieldController()
5、在model文件夹下新建configModel.js文件
const db = require('../config/knex')
class configModel {
async create(data){
return await db.create('cms_config',data)
}
async getInfo(id){
return await db.find('cms_config',id)
}
async update(id,data){
return await db.update('cms_config',id,data)
}
async batchInsert(data){
return await db.batchInsert('cms_config',data)
}
async delete(id){
return await db.remove('cms_config',id)
}
async page(page=1,size=10, where={},orderBy='',fields='*'){
const offset = (page - 1) * size;
const order = orderBy ? order : ['id' ,'desc'];
return await db.knex('cms_config')
.where((qb) => {
if (where.name) {
qb.where('cname', 'like', `%${where.name}%`);
}
if (where.ename) {
qb.where('ename', 'like', `%${where.ename}%`);
}
if (where.config_type) {
qb.where('config_type', '=', where.config_type);
}
})
.select(fields)
.orderBy(order[0],order[1])
.offset(offset)
.limit(size)
}
async list(where=[],fields='*'){
return await db.knex.select('*').from('cms_config').where(where).orderBy('sorting','desc');
}
batchUpdate(options, collection) {
return db.knex.transaction(trx => {
const queries = collection.map(tuple =>
db.knex(options.table)
.where(options.column, tuple[options.column])
.update(tuple)
.transacting(trx)
);
return Promise.all(queries)
.then(trx.commit)
.catch(trx.rollback);
});
}
async getSystem(){
return await db.knex('cms_config').whereIn('config_type', [1,2,3,4])
}
}
module.exports = new configModel()
6、在model文件夹下新建configTypeModel.js文件
const db = require('../config/knex')
class configTypeModel {
async create(data){
return await db.create('cms_config_type',data)
}
async getInfo(id){
return await db.find('cms_config_type',id)
}
async update(id,data){
return await db.update('cms_config_type',id,data)
}
async batchInsert(data){
return await db.batchInsert('cms_config_type',data)
}
async delete(id){
return await db.remove('cms_config_type',id)
}
async page(page=1,size=10, where={},orderBy='',fields='*'){
const offset = (page - 1) * size;
const order = orderBy ? order : ['id' ,'desc'];
return await db.knex('cms_config_type')
.where((qb) => {
if (where.name) {
qb.where('name', 'like', `%${where.name}%`);
}
})
.select(fields)
.orderBy(order[0],order[1])
.offset(offset)
.limit(size)
}
async list(where=[],fields='*'){
return await db.getList('cms_config_type',where,fields)
}
}
module.exports = new configTypeModel()
7、在model文件夹下新建cmsModelsModel.js文件
const db = require('../config/knex')
class cmsModelsModel {
async create(data){
return await db.create('cms_models',data)
}
async getInfo(id){
return await db.find('cms_models',id)
}
async update(id,data){
return await db.update('cms_models',id,data)
}
async batchInsert(data){
return await db.batchInsert('cms_models',data)
}
async delete(id){
return await db.remove('cms_models',id)
}
async page(page=1,size=10, where={},orderBy='',fields='*'){
const offset = (page - 1) * size;
const order = orderBy ? order : ['id' ,'desc'];
const [countResult, rows] = await Promise.all([
db.knex('cms_models').count('* as total')
.where((qb) => {
if (where.name) {
qb.where('model_name', 'like', `%${where.name}%`);
}
}),
db.knex('cms_models')
.select(fields)
.where((qb) => {
if (where.name) {
qb.where('model_name', 'like', `%${where.name}%`);
}
})
.orderBy(order[0],order[1])
.offset(offset)
.limit(size)
]);
const count = countResult[0].total;
const pageData = {
page:Number(page),
size,
count,
list: rows
};
return pageData;
}
async list(where=[],fields='*'){
return await db.getList('cms_models',where,fields)
}
}
module.exports = new cmsModelsModel()
8、在model文件夹下新建cmsFieldModel.js
const db = require('../config/knex')
class CmsFieldModel {
async create(data){
return await db.create('cms_field',data)
}
async getInfo(id){
return await db.find('cms_field',id)
}
async update(id,data){
return await db.update('cms_field',id,data)
}
async batchInsert(data){
return await db.batchInsert('cms_field',data)
}
async batchDelete(ids){
return await db.batchDelete('cms_field',ids)
}
async delete(id){
return await db.remove('cms_field',id)
}
async page(page=1,size=10, where={},orderBy='',fields='*'){
const offset = (page - 1) * size;
const order = orderBy ? order : ['cms_field.id' ,'desc'];
const [countResult, rows] = await Promise.all([
db.knex('cms_field').count('* as total')
.where((qb) => {
if (where.field_cname) {
qb.where('cms_field.field_cname', 'like', `%${where.field_cname}%`);
}
if (where.field_ename) {
qb.where('cms_field.field_ename', 'like', `%${where.field_ename}%`);
}
}),
db.knex('cms_field')
.join('cms_models','cms_field.models_id','cms_models.id')
.select('cms_field.*','cms_models.model_name')
.where((qb) => {
if (where.field_cname) {
qb.where('cms_field.field_cname', 'like', `%${where.field_cname}%`);
}
if (where.field_ename) {
qb.where('cms_field.field_ename', 'like', `%${where.field_ename}%`);
}
})
.orderBy(order[0],order[1])
.offset(offset)
.limit(size)
]);
const count = countResult[0].total;
const pageData = {
page:Number(page),
size,
count,
list: rows
};
return pageData;
}
async list(where=[],fields='*'){
return await db.getList('cms_field',where,fields)
}
}
module.exports = new CmsFieldModel()
9、修改routes文件夹下admin.js的路由配置
const router = require('koa-router')()
const jwt = require('../../utils/verify')
const AdminController = require('../../controller/admin')
const AuthGroupController = require('../../controller/authGroup')
const AuthRuleController = require('../../controller/authRule')
const ConfigController = require('../../controller/config')
const ConfigTypeController = require('../../controller/configType')
const CmsModelsController = require('../../controller/cms/cmsModels')
const CmsFieldController = require('../../controller/cms/cmsField')
router.prefix('/api')
//用户注册
router.post('/system/user/add', AdminController.add)
router.post('/system/user/login', AdminController.login)
router.post('/system/user/update', AdminController.update)
router.post('/system/user/status', AdminController.updateStatus)
router.post('/system/user/list', AdminController.list)
router.post('/system/user/page', AdminController.page)
router.post('/system/user/delete', AdminController.delete)
router.post('/system/user/batchDelete', AdminController.batchDelete)
router.post('/system/user/existence', AdminController.existence)
router.post('/system/user/password', AdminController.password)
// 角色
router.post('/system/roles/page', AuthGroupController.page)
router.get('/system/roles/list', AuthGroupController.list)
router.post('/system/roles/add', AuthGroupController.add)
router.post('/system/roles/update', AuthGroupController.update)
router.post('/system/roles/del', AuthGroupController.delete)
router.post('/system/roles/menu', AuthGroupController.menu)
router.post('/system/roles/menu/update', AuthGroupController.menuUpdate)
// 菜单
router.get('/system/menu/user', AuthRuleController.user)
router.post('/system/menu/list', AuthRuleController.list)
router.post('/system/menu/add', AuthRuleController.add)
router.post('/system/menu/update', AuthRuleController.update)
router.post('/system/menu/del', AuthRuleController.delete)
// 系统配置
router.post('/system/config/page', ConfigController.page)
router.post('/system/config/list', ConfigController.list)
router.post('/system/config/add', ConfigController.add)
router.post('/system/config/update', ConfigController.update)
router.post('/system/config/del', ConfigController.delete)
router.post('/system/config/bulkUpdate', ConfigController.bulkUpdate)
// 系统配置类型
router.get('/system/config/type/list', ConfigTypeController.list)
router.post('/system/config/type/add', ConfigTypeController.add)
router.post('/system/config/type/update', ConfigTypeController.update)
router.post('/system/config/type/del', ConfigTypeController.delete)
router.post('/system/config/getSysInfo', ConfigController.getSysInfo)
// 模型
router.post('/cms/models/page', CmsModelsController.page)
router.post('/cms/models/list', CmsModelsController.list)
router.post('/cms/models/add', CmsModelsController.add)
router.post('/cms/models/update', CmsModelsController.update)
router.post('/cms/models/del', CmsModelsController.delete)
// 模型字段
router.post('/cms/field/page', CmsFieldController.page)
router.post('/cms/field/list', CmsFieldController.list)
router.post('/cms/field/add', CmsFieldController.add)
router.post('/cms/field/update', CmsFieldController.update)
router.post('/cms/field/del', CmsFieldController.delete)
module.exports = router
10、用apifox接口进行测试