- 项目:基于 Koa.js 的 Node.js MVC 框架。
- 仓库地址:https://github.com/zhaotoday/less.js。
- v2.0.0 [2019-02-15] 取消内置第三方 SDK;
- 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 校验;
- 同步 MySQL 数据至 Redis;
请查看 example 文件夹。
请访问 https://github.com/zhaotoday/iview。
账号:admin
密码:123456
注:按 F12 打开 Chrome 开发者工具查看接口请求。
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 配置
│ ├─ base.js 基础配置
│ ├─ development.js 开发环境配置
│ ├─ test.js 测试环境配置
│ ├─ beta.js 预生产环境配置
│ └─ production.js 生产环境配置
├─ extends 扩展
│ ├─ controller.js 对控制器进行扩展
│ ├─ helpers.js 对辅助函数进行扩展
│ ├─ initialize.js 初始化
│ └─ service.js 对服务进行扩展
├─ controllers 控制器
│ ├─ api 接口
│ │ └─ v1 接口版本
│ │ ├─ admin 管理接口
│ │ │ ├─ actions 动作类接口
│ │ │ │
│ │ │ ├─ articles.js articles 接口控制器
│ │ │ └─ files.js files 接口控制器
│ │ │
│ │ ├─ public 公开接口(无需鉴权即可调用)
│ │ │
│ │ └─ some-app 某个应用的接口
│ │
│ ├─ web 网站
│ │ ├─ articles.js articles 页面控制器
│ │ └─ files.js files 页面控制器
├─ 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 })
})
}
}
}
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())
}
- Koa 官网
- koa 中文网
- Koa 文档的中文版本
- Node Koa2 实战
- Sequelize 文档
- Sequelize 文档的中文版本
- EJS 官网
- EJS 官网中文版
- EJS 中文文档
- EJS 模板语言使用
- PM2 官网
- Node.js 最佳实践
- Koa 框架教程
- Koa2进阶学习笔记
- Koa2 之文件上传下载
- React 服务端渲染与同构
- koa 实现 jwt 认证
- PM2实用入门指南
- Node.js使用Sequelize操作MySQL
- Sequelize 和 MySQL 对照
- nginx反向代理原理和配置讲解
- 前后端分离之JWT用户认证
- nodemon 基本配置与使用