简介
版本
- v1.1.4 [2018-12-29] 支持 URL Rewrite;
- v1.1.0 [2018-12-27] 支持 Redis 数据库,通过 ORM 框架 jugglingdb 操作 Redis;
- v1.0.9 [2018-12-23] 支持同步 MySQL 数据库模型;
- v1.0.8 [2018-12-20] 支持根据 controllers 目录结构自动生成对应路由,无需手动配置路由;
- v1.0.5 [2018-12-10] 取消 koa-jwt 中间件,在 controller 基础类中进行 JWT 校验;
待办
示例
示例代码
请查看 example 文件夹。
管理后台代码
线上示例
请访问 admin.cmsx.cn/。
账号:admin 密码:123456
注:按 F12 打开 Chrome 开发者工具查看接口请求。
运行
Node.js 版本
Koa2 使用了 async/await 等新语法,请保证 Node.js 版本在 7.6 及以上。
命令
# 安装 pm2 到全局 $ npm install -g pm2 # 安装 less.js $ npm install --save less.js # JS 代码校验 $ npm run eslintfix $ npm run eslint # 开发调试 $ npm run dev # 启动项目 $ npm run start:dev # 同步数据库模型 $ npm run sync-models:dev # 停止项目 $ npm run stop
注::dev 表示执行命令时调用的是开发环境的配置。dev 表示开发环境,test 表示测试环境,beta 表示预生产环境,prod 表示生产环境。
目录结构
整体目录结构
├─ src 源码 │ ├─ app 业务代码 │ │ ├─ controllers 控制器:用于解析用户输入,处理后返回相应的结果 │ │ ├─ models 模型 :用于定义数据模型 │ │ ├─ services 服务 :用于编写业务逻辑层,比如连接数据库,调用第三方接口等 │ │ └─ views 视图 :用于放置模板文件,返回客户端的视图层 │ │ │ ├─ config 配置 │ ├─ extends 扩展 │ ├─ middlewares 中间件 │ ├─ public 静态资源 │ ├─ redis Redis 数据库 │ ├─ router URL 路由 │ ├─ utils 工具库 │ └─ index.js 入口:用于自定义启动时的初始化工作,比如启动 https,调用中间件、路由等 │ ├─ .eslintrc eslint 配置文件 ├─ nodemon.json nodemon 配置文件 ├─ package.json npm 配置文件 ├─ processes.json pm2 配置文件
配置(config)目录结构
├─ config 配置 │ ├─ base.js 基础配置 │ ├─ development.js 开发环境配置 │ ├─ test.js 测试环境配置 │ ├─ beta.js 预生产环境配置 │ └─ production.js 生产环境配置
扩展(extends)目录结构
├─ extends 扩展 │ ├─ controller.js 对控制器进行扩展 │ ├─ helpers.js 对辅助函数进行扩展 │ ├─ initialize.js 初始化 │ └─ service.js 对服务进行扩展
控制器(controllers)目录结构
├─ controllers 控制器 │ ├─ api 接口 │ │ └─ v1 接口版本 │ │ ├─ admin 管理接口 │ │ │ ├─ actions 动作类接口 │ │ │ │ │ │ │ ├─ articles.js articles 接口控制器 │ │ │ └─ files.js files 接口控制器 │ │ │ │ │ ├─ public 公开接口(无需鉴权即可调用) │ │ │ │ │ └─ some-app 某个应用的接口 │ │ │ ├─ web 网站 │ │ ├─ articles.js articles 页面控制器 │ │ └─ files.js files 页面控制器
视图(views)目录结构
├─ views 视图 │ ├─ pc PC 端 │ │ ├─ articles.ejs articles 页面视图 │ │ └─ files.ejs files 页面视图 │ │ │ ├─ mobile 移动端 │ │ ├─ articles.ejs articles 页面视图 │ │ └─ files.ejs files 页面视图
扩展
对 Koa.js 的一些扩展,用 $ 前缀命名,与 Koa.js 内置对象做区分。
app.$config:配置 app.$module:加载内置模块 app.$helpers:辅助函数 app.$resources:生成 RESTful 规范的路由 app.$model:公用模型对象 app.$Service:服务基类 app.$Controller:控制器基类 app.$models:模型集合 app.$services:服务集合 app.$controllers:控制器集合
如扩展辅助函数,请新建 src/extends/helpers.js:
module.exports = app => { return { myFunc () {} } }
示例代码
模型
src/app/models/articles.js
module.exports = app => { const { STRING, TEXT, INTEGER } = app.$Sequelize return app.$model.define('articles', { id: { type: INTEGER(10).UNSIGNED, primaryKey: true, autoIncrement: true, allowNull: false, comment: 'ID' }, title: { type: STRING(200), allowNull: false, comment: '标题' }, content: { type: TEXT('long'), comment: '内容' } }) }
服务
src/app/services/articles.js
module.exports = app => { return class extends app.$Service { constructor () { super() this.model = app.$models.articles } } }
页面控制器
src/app/controllers/web/articles.js
module.exports = app => { const service = app.$services.articles return class extends app.$Controller { async index (ctx, next) { await ctx.render('articles', { items: await service.find({ offset: 0, limit: 10 }) }) } } }
API 控制器
src/app/controllers/api/v1/public/articles.js
module.exports = app => { const service = app.$services.articles return class extends app.$Controller { async index (ctx, next) { ctx.send({ status: 200, data: await service.find({ offset: 0, limit: 10 }) }) } } }
视图
src/app/views/pc/articles.ejs
<%- JSON.stringify(items) %>
路由
src/router/index.js
const router = require('koa-router')() module.exports = app => { router.get('/', app.$controllers.web.home.index) router.get('/articles/:id?', app.$controllers.web.articles.index) app.use(router.routes()).use(router.allowedMethods()) }