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)
}
複製代碼