# Hammer

更好用的 koa&nodejs 框架

## 特性

基于 Koa 开发，性能优异
内置 logger
内置 router

## 目录结构

```
pecker-project
├── bin
│   └── www
├── config
│   ├── config.dev.js
│   └── config.prod.js
├── package-lock.json
├── package.json
├── pubilc
└── app
    ├── controller
    │   └── home.js
    ├── middleware
    │   └── access.js
    ├── plugin
    │   └── clock.js
    ├── router.js
    ├── service
    │   ├── message.js
    │   └── user.js
    └── view
        └── home.html
```

## 内置对象

#### Application

app

#### Controller

Controller 层主要对用户的请求参数进行处理（校验、转换），然后调用对应的 service 方法处理业务。框架在启动的时候会自动解析`src/controller/`目录下面的所有文件，所有 Controller 文件必须导出一个 class 对象，并且需要继承`require('@58fe/hammer').Controller`对象，框架会自动实例化此 class 并将实例对象挂载到`app.controller`下面,同时会绑定 Controller 中所有函数（constructor 除外）的 this 指向为当前 Controller 的实例对象。
注意：框架在实例化`Controller`时会将`app`对象作为参数传入，以便先祖的`require('@58fe/hammer').Controller`对象使用。

#### Service

Service 层主要用于复杂的数据获取，以及业务逻辑处理。框架在启动的时候会自动解析`src/service/`目录下面的所有文件，所有 Service 文件必须导出一个 class 对象，并且需要继承`require('@58fe/hammer').Service`对象，框架会自动实例化此 class 并将实例对象挂载到`this.service`下面，并且将文件名作为实例的 key。
注意：框架在实例化`Service`时会将`app`对象作为参数传入，以便先祖的`require('@58fe/hammer').Service`对象使用。

#### Config

遵循配置和代码分离的原则，将一些需要硬编码的业务配置都放到配置文件中，框架在启动的时候会读取`config/config.{env}.js`文件内容，挂载到`app.config`。

```
config
|- config.dev.js
|- config.prod.js
```

#### Logger

Hammer 内置了基于[log4js](https://github.com/log4js-node/log4js-node)封装的 logger 对象， logger 对象提供了 6 个级别的日志方法：

-   logger.trace()
-   logger.debug()
-   logger.info()
-   logger.warn()
-   logger.error()
-   logger.fatal()

框架默认会输出三个日志文件:
app.log //程序运行日志以及用户主动输出日志
error.log //所有 error 级别以上的日志

## 配置

日志：

```
exports.logger = {
	level: 'ALL',
	console: true,
	proxy:['error']
}
```

中间件：

```
exports.middlewares = [
	//本地中间件
	{
		path:'access.js'
	},
	//外部中间件
	{
		package: 'koa-static',
		options: [
			path.join(__dirname, './../pubilc'),
			{
				gzip: true,
				maxage: 2592000000
			}
		]
	},
	//外部中间件
	{
		package: 'koa2-cors',
		options: {
			origin: function (ctx) {
				return ctx.get('Origin');
			},
			credentials: true
		}
	}
]

```

插件：

```
exports.plugins = [{
	name: 'redis',
	package: 'ioredis',
	options: {
		host: 'XXX',
		port: 'XXX',
		password: 'XXX',
		connectTimeout: 10000
	}
}]
```

其他：

```
module.exports = {
	port: 8080,
	keys: ['hammer-example'],
	proxy: true
};
```

## 中间件

Hammer 是基于 Koa 实现的，所以 Hammer 的中间件形式和 Koa 的中间件形式是一样的，都是基于洋葱圈模型。

## 插件

Hammer 中的插件是一系列工具方法、类的集合，框架在启动的时候会自动初始化配置中的插件，并将实例挂载与 app 下面。

插件分本地插件和外部插件，本地插件统一位于`app/plugin`目录下面，外部插件安装之后直接添加配置即可生效。

待完善...
