代码拉取完成,页面将自动刷新
$ npm i egg-init -g
$ egg-init cms-api --type=simple
$ cd cms-api
$ npm i
$ npm run dev
CREATE TABLE `entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT '',
`name` varchar(255) DEFAULT '',
`data` text DEFAULT '{}',
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT '',
`path` varchar(255) DEFAULT '',
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
INSERT INTO `menu` VALUES ('3', '实体', '/entity', '2022-06-25 14:35:38', '2022-06-25 14:35:40');
npm i egg-mysql -S
config/config.default.js
config.security = {
csrf:false
}
config.mysql = {// 单数据库信息配置
client: {
host: 'localhost', // host
port: '3306',// 端口号
user: 'root', // 用户名
password: 'root', // 密码
database: 'cms', // 数据库名
}
config/plugin.js
exports.mysql = {
enable: true,
package: 'egg-mysql'
};
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.resources('entity', '/entity', controller.entity);
router.resources('menu', '/menu', controller.menu);
};
app/controller/entity.js
const baseController = require('./base');
module.exports = class extends baseController {
entity = 'entity'
async create() {
const { ctx, service } = this;
const entity = ctx.request.body;
for (const key in entity) {
switch (key) {
case 'fields':
case 'page':
case 'record':
entity[key] = JSON.stringify(entity[key]);
break;
default:
break;
}
}
await service[this.entity].create(entity);
this.success('创建成功');
}
}
app\controller\menu.js
const baseController = require('./base');
module.exports = class extends baseController {
entity = 'menu'
}
app\controller\base.js
const { Controller } = require('egg');
module.exports = class extends Controller {
async success(message, data) {
this.ctx.body = {
success: true,
message,
data
};
}
async index() {
const { ctx, service } = this;
const list = await service[this.entity].index(ctx.query);
this.success('查询成功', list);
}
async create() {
const { ctx, service } = this;
const entity = ctx.request.body;
await service[this.entity].create(entity);
this.success('创建成功');
}
async update() {
const { ctx, service } = this;
const entity = ctx.request.body;
entity.id = ctx.params.id;
await service[this.entity].update(entity);
this.success('更新成功');
}
async destroy() {
const { ctx, service } = this;
const id = ctx.params.id;
let ids = ctx.request.body;
if (!ids) { ids = [id] }
await service[this.entity].delete(ids);
this.success('删除成功');
}
}
app\service\entity.js
const BaseService = require('./base');
module.exports = class extends BaseService {
entity = 'entity'
}
app\service\menu.js
const BaseService = require('./base');
module.exports = class extends BaseService {
entity = 'menu'
}
app\service\base.js
const { Service } = require('egg');
module.exports = class extends Service {
async index(query) {
const { app } = this;
let { current, pageSize, sort, order, created, ...where } = query;
current = Number(current);
pageSize = Number(pageSize);
const offset = (current - 1) * pageSize;
if (created) {
const filterFields = Object.entries(where).map(([key, value]) => `${key}='${value}'`);
const [startTime, endTime] = created.split(',');
filterFields.push(`created between '${startTime}' and '${endTime}'`);
let filterSQL = '';
if (filterFields.length > 0) {
filterSQL = `where ${filterFields.join(' and ')}`;
}
const [{ total }] = await app.mysql.query(`SELECT count(*) as total FROM ${this.entity} ${filterSQL}`);
if (sort && order) {
filterSQL += ` order by ${sort} ${order} `;
}
if (current && pageSize) {
filterSQL += ` limit ${offset}, ${pageSize} `;
}
const list = await app.mysql.query(`SELECT * FROM ${this.entity} ${filterSQL}`);
return {
list,
total,
current,
pageSize
};
} else {
const options = { where };
if (pageSize) {
options.offset = offset;
options.limit = pageSize;
}
if (sort && order) {
options.orders = [[sort, order]];
}
const list = await app.mysql.select(this.entity, options);
const total = await app.mysql.count(this.entity, where);
return {
list,
total,
current,
pageSize
};
}
}
async create(entity) {
const { app } = this;
entity.created = app.mysql.literals.now
entity.updated = app.mysql.literals.now
return await this.app.mysql.insert(this.entity, entity);
}
async update(entity) {
return await this.app.mysql.update(this.entity, entity);
}
async delete(ids) {
return await this.app.mysql.delete(this.entity, { id: ids });
}
}
app\service\entity.js
const BaseService = require('./base');
module.exports = class extends BaseService {
entity = 'entity'
async create(entity) {
const { app } = this;
const fields = entity.fields;
for (const key in entity) {
switch (key) {
case 'fields':
case 'page':
case 'record':
entity[key] = JSON.stringify(entity[key]);
break;
default:
break;
}
}
entity.created = app.mysql.literals.now;
entity.updated = app.mysql.literals.now;
await this.app.mysql.insert(this.entity, entity);
let existTables = await this.app.mysql.select('information_schema.tables', { where: { TABLE_NAME: entity.name } });
if (existTables.length == 0) {
const columns = fields.map(field => {
let dataType = 'varchar(255)';
switch (field.type) {
case 'number':
dataType = 'int(11)';
break;
case 'select':
dataType = 'int(11)';
break;
case 'datetime':
dataType = 'datetime';
break;
case 'switch':
dataType = 'tinyint(1)';
default:
break;
}
return `${field.name} ${dataType}`;
});
const sql = `CREATE TABLE ${entity.name}(
id int(11) NOT NULL AUTO_INCREMENT,
${columns.join(',')},
created DATETIME,
updated DATETIME,
PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
`
await this.app.mysql.query(sql);
//添加菜单
await this.app.mysql.insert('menu', {
name: entity.title,
path: `/entity/${entity.name}`,
created: app.mysql.literals.now,
updated: app.mysql.literals.now
});
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。