Koa2 使用了 async/await 等新语法,请保证 Node 版本在 7.6 及以上。css
# 安装依赖
$ npm install
# JS 代码校验
$ npm run eslintfix
$ npm run eslint
# 开发
$ npm run dev
# 启动项目
$ npm start
# 中止项目
$ npm run stop
复制代码
├─ src 源码
│ ├─ app 业务代码
│ │ ├─ controllers 控制器:用于解析用户输入,处理后返回相应的结果
│ │ ├─ models 模型 :用于定义数据模型
│ │ ├─ services 服务 :用于编写业务逻辑层,好比链接数据库,调用第三方接口等
│ │ └─ views 视图 :用于放置模板文件,返回客户端的视图层
│ │
│ ├─ core 核心代码
│ │ ├─ controller.js 控制器基类
│ │ ├─ model.js 模型基类
│ │ └─ service.js 服务基类
│ │
│ ├─ middlewares 中间件
│ ├─ public 静态资源
│ ├─ router URL 路由
│ ├─ utils 工具库
│ └─ index.js 入口:用于自定义启动时的初始化工做,好比启动 https,调用中间件、路由等
│
├─ .eslintrc eslint 配置文件
├─ nodemon.json nodemon 配置文件
├─ package.json npm 配置文件
├─ processes.json pm2 配置文件
复制代码
为了提升开发效率,这里人为的将一些自定义对象挂载到 app 下,用 $ 前缀命名,与 Koa.js 内置对象作区分。html
src/app/models/articles.js前端
module.exports = app => {
const {ID, SHORT_RELATED_ID, NAME, TITLE, SUBTITLE, DESCRIPTION, CONTENT, PICTURES, ORDER} = app.$model.columns
return app.$model.define('articles', {
id: ID,
category_id: SHORT_RELATED_ID,
author: NAME,
title: TITLE,
subtitle: SUBTITLE,
description: DESCRIPTION,
content: CONTENT,
pictures: PICTURES,
order: ORDER
})
}
复制代码
src/app/services/articles.jsnode
module.exports = app => {
return class extends app.$Service {
constructor () {
super()
this.model = app.$models.articles
}
}
}
复制代码
src/app/controllers/articles.jsreact
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})
})
}
}
}
复制代码
src/app/views/articles.ejsnginx
<%- JSON.stringify(items) %>
复制代码
src/app/controllers/apis/v1/articles.jsgit
module.exports = app => {
const service = app.$services.articles
return class extends app.$Controller {
async index (ctx, next) {
ctx.response.body = ctx.send({
status: 200,
data: await service.find({offset: 0, limit: 10})
})
}
}
}
复制代码
src/router/routes/articles.jsgithub
module.exports = (app, router) => {
router.get('/articles', app.$controllers.articles.index)
}
复制代码