这是一个快速构建 Koa 项目的模板，基于过往的工作经历整理，如若需要 Koa-Session、ORM 等需要自己引入。

## NPM 命令
### 启动服务

```
npm start
```

### 代码检查

```
npm run lint
```

### 运行测试

```
npm run test
```

### 查看测试覆盖率

```
npm run cov
```

## 模板说明
### plugin
插件存储的目录，目前只有一个 log.js，用于打印项目日志。

### config
配置文件集合，可根据 NODE_ENV 加载不同的配置，默认加载 config.default.js 的配置，可被覆盖。

### common
- error_code.js: 错误码配置文件
- error_msg.js: 错误信息配置文件
- log_type.js: 日志类型配置文件
- status_code.js: 状态码配置文件
- sys_error.js: 自定义系统错误，增加了 code 及 status 字段

### schema
用于存储参数规则

### middleware
中间件目录，包括以下中间件：
- check_param.js: 校验参数是否合法（基于 Joi 实现）
- request_time.js: 记录请求响应时间，会调用插件-Log

### router
配置 URL 路由规则，目前 URL 路由支持 5 个参数：
- method: 方法
- path: URL 路径
- checkParam: 参数校验（可选），会使用 schema 中提前写入的规则
- middleware: 在 controller 前做的其它操作，比如权限校验、预置上下文等
- controller: 配置路由规则后跳转的 controller

```
{
  method: 'get',
  path: '/users/:userId',
  controller: TestCtrl.getUser,
  checkParam: TestSchema.getUser,
  middleware: [],
}
```

### controller
controller 负责的是：解析用户的输入，处理后返回相应的结果。通过 Router 将用户的请求基于 method 和 URL 分发到对应的 Controller。

### service
引入 service 是为了让 controller 层更加轻量，这样 controller 中的逻辑会更加简洁，代码的复用性也能够更强。

### model
这个我也很难用语言来描述，在实际的开发中，如果只有 controller 及 service，会让代码比较臃肿，而且分层不够清晰。所以加了 model 层，用于访问数据库、访问缓存、访问第三方等，个人理解像一个领域模型或是一个防腐层。

### test
测试用例——不经过测试的代码发布后怎么能安心

File            |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------------|----------|----------|----------|----------|-------------------|
All files       |      100 |      100 |      100 |      100 |                   |
 controller     |      100 |      100 |      100 |      100 |                   |
  permission.js |      100 |      100 |      100 |      100 |                   |
  test.js       |      100 |      100 |      100 |      100 |                   |
 model          |      100 |      100 |      100 |      100 |                   |
  user.js       |      100 |      100 |      100 |      100 |                   |
 router         |      100 |      100 |      100 |      100 |                   |
  index.js      |      100 |      100 |      100 |      100 |                   |
  test.js       |      100 |      100 |      100 |      100 |                   |
 schema         |      100 |      100 |      100 |      100 |                   |
  test.js       |      100 |      100 |      100 |      100 |                   |
 service        |      100 |      100 |      100 |      100 |                   |
  user.js       |      100 |      100 |      100 |      100 |                   |

### 其它说明
- app.js: 入口启动文件
- .eslintignore: eslint 规则忽略文件
- .eslintrc: eslint 规则
- .huskyrc: husky 配置
- commitlint.config.js: 结合 husky 使用
- .nycrc: nyc 配置
- .prettierrc: prettier 配置
- .gitignore: git 忽略文件
- .npmignore: npm 忽略文件

## 部分依赖说明

- @hapi/joi：参数校验工具
- husky：Git hooks 工具