# 介绍
ThinkJS 是一款面向未来开发的 Node.js 框架,整合了大量的项目最佳实践,让企业级开发变得如此简单、高效。从 3.0 开始,框架底层基于 Koa 2.x 实现,兼容 Koa 的所有功能。
# 特性
- 基于 Koa 2.x,兼容 middleware
- 内核小巧,支持 Extend、Adapter 等插件方式
- 性能优异,单元测试覆盖程度高
- 内置自动编译、自动更新机制,方便快速开发
- 使用更优雅的 async/await 处理异步问题,不再支持 */yield
- 从 3.2 开始支持 TypeScript
# 架构
# 快速入门
借助 ThinkJS 提供的脚手架,可以快速的创建一个项目。为了可以使用更多的 ES6 特性,框架要求 Node.js 的版本至少是 6.x
,建议使用 LTS 版本。
# 1. 安装 ThinkJS 命令
$ npm install -g think-cli
安装完成后,系统中会有 thinkjs 命令(可以通过 thinkjs -V 查看 think-cli 的版本号,此版本号非 thinkjs 的版本号)。如果找不到这个命令,请确认环境变量是否正确。
如果是从 2.x 升级,需要将之前的命令删除,然后重新安装。
卸载旧版本命令
$ npm uninstall -g thinkjs
# 2. 创建项目
执行 thinkjs new [project_name] 来创建项目,如:
$ thinkjs new demo;
$ cd demo;
$ npm install;
$ npm start;
执行完成后,控制台下会看到类似下面的日志:
[2017-06-25 15:21:35.408] [INFO] - Server running at http://127.0.0.1:8360
[2017-06-25 15:21:35.412] [INFO] - ThinkJS version: 3.0.0-beta1
[2017-06-25 15:21:35.413] [INFO] - Enviroment: development
[2017-06-25 15:21:35.413] [INFO] - Workers: 8
打开浏览器访问 http://127.0.0.1:8360/,如果是在远程机器上创建的项目,需要把 IP 换成对应的地址。
# 3. 项目结构
默认创建的项目结构如下:
|--- development.js //开发环境下的入口文件
|--- nginx.conf //nginx 配置文件
|--- package.json
|--- pm2.json //pm2 配置文件
|--- production.js //生产环境下的入口文件
|--- README.md
|--- src
| |--- bootstrap //启动自动执行目录
| | |--- master.js //Master 进程下自动执行
| | |--- worker.js //Worker 进程下自动执行
| |--- config //配置文件目录
| | |--- adapter.js // adapter 配置文件
| | |--- config.js // 默认配置文件
| | |--- config.production.js //生产环境下的默认配置文件,和 config.js 合并
| | |--- extend.js //extend 配置文件
| | |--- middleware.js //middleware 配置文件
| | |--- router.js //自定义路由配置文件
| |--- controller //控制器目录
| | |--- base.js
| | |--- index.js
| |--- logic //logic 目录
| | |--- index.js
| |--- model //模型目录
| | |--- index.js
|--- view //模板目录
| |--- index_index.html
# 4. 项目服务启动
入口文件是 development.js,启动时直接和一般的 node 启动一样 node development.js 即可。查看入口文件可知启动的时候,实际上是实例化 ThinkJS 里的 Application 类,执行 run 方法。
# 5. 配置数据库
本项目使用 mysql 数据库,配置文件的位置:src/config/adapter.js
exports.model = {
type: 'mysql',
common: {
logConnect: isDev,
logSql: isDev,
logger: msg => think.logger.info(msg)
},
mysql: {
handle: mysql,
database: 'thinkjsplus',
prefix: '',
encoding: 'utf8',
host: '127.0.0.1',
port: '3306',
user: 'root',
password: 'root',
dateStrings: true
}
};
创建模型文件
thinkjs model +模型文件名
# 6. 控制器
创建控制器的命令是 thinkjs controller + 控制器名,我们创建 admin 后台登录控制器,同时在视图层我们创建 admin 控制器对应的 html 页面 admin_index.html 页面,启动服务,浏览器访问 http://localhost:8360/admin 就可以访问到 admin_index.html 的登录页面.
thinkjs controller admin
const user = this.model('thinkjsplus_user'); // controller 里实例化模型
const data = await user.select();
this.assign('title',data);
return this.display();
# 7. 视图
thinkjs3 默认模板引擎是 nunjucks, 如果在控制器 action 中这样写
this.assign('title',"测试网页之thinkjsplus!");
return this.display();
视图 html 页面中就可以这样写,拿到 title
{{title}}
# 8. 权限控制
权限代码如下:
module.exports = class extends think.Controller {
async __before() {
if(this.ctx.controller === 'admin' && this.ctx.action === 'index'||this.ctx.action === 'login' ){ //如果是admin_index那么久不验证了,直接返回给予登录。
return;
}
let userinfo =await this.session('userinfo')
if (!think.isEmpty(userinfo)){
this.assign('userinfo',userinfo);
}else{
return this.redirect('/admin/index');
}
}
# 9. 本项目用到了 mysql 数据库,CRUD 操作具体可以查看项目,本项目具有详细注释
/**
* 保存分类
*/
async saveAction() {
let data = this.post();
if (think.isEmpty(data.id)) {
//保存
let res = await this.model("thinkjsplus_category").add(data);
if (res) {
this.json({"succ":true});
} else {
this.json({"succ":false});
}
} else {
//更新
let res = await this.model("thinkjsplus_category").update(data);
if (res) {
this.json({"succ":true});
} else {
this.json({"succ":false});
}
}
}
/**
* 删除分类
*/
async delAction() {
let categoryModel = this.model("thinkjsplus_category");
let posts = this.post("id");
let delNums = categoryModel.where({id: ['IN', posts]}).delete();
if(delNums){
this.json({"succ":true});
}else{
this.json({"succ":false});
}
}
/**
* 查看分类
*/
async listAction() {
const user = this.model('thinkjsplus_category'); // controller 里实例化模型
const data = await user.select();
return this.json(data);
}
# 10. 运行
首先安装 mysql, 之后导入项目 sql 文件夹,然后在项目根目录下运行 npm install, 之后运行 npm start, 即可启动本项目