1 Star 0 Fork 2

zhangrenyang / cms-api2

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

1.初始化项目

$ npm i egg-init -g
$ egg-init cms-api --type=simple
$ cd cms-api
$ npm i
$ npm run dev

2.使用MYSQL

2.1 数据库脚本

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');

2.2 在egg使用mysql

2.2.1 安装

npm i egg-mysql -S

2.2.2 config.default.js

config/config.default.js

config.security = {
    csrf:false
}
config.mysql = {// 单数据库信息配置
  client: {
  host: 'localhost', // host
  port: '3306',// 端口号
  user: 'root', // 用户名
  password: 'root', // 密码
  database: 'cms', // 数据库名
}

2.2.3 plugin.js

config/plugin.js

exports.mysql = {
    enable: true,
    package: 'egg-mysql'
};

3. 实体管理

3.1 router.js

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.resources('entity', '/entity', controller.entity);
  router.resources('menu', '/menu', controller.menu);
};

3.2 entity.js

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('创建成功');
    }
}

3.3 menu.js

app\controller\menu.js

const baseController = require('./base');
module.exports = class extends baseController {
    entity = 'menu'
}

3.4 base.js

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('删除成功');
    }
}

3.5 entity.js

app\service\entity.js

const BaseService = require('./base');
module.exports = class extends BaseService {
    entity = 'entity'
}

3.6 menu.js

app\service\menu.js

const BaseService = require('./base');
module.exports = class extends BaseService {
    entity = 'menu'
}

3.7 app\service\base.js

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 });
    }
}

4. 自动建表

4.1 app\service\entity.js

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
            });
        }
    }
}

空文件

简介

fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 展开 收起
JavaScript
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/zhang_renyang/cms-api2.git
git@gitee.com:zhang_renyang/cms-api2.git
zhang_renyang
cms-api2
cms-api2
master

搜索帮助