[TOC]
# 介紹
ThinkJS 是一款面向未來開發的 Node.js 框架,整合了大量的項目最佳實踐,讓企業級開發變得如此簡單、高效。從 3.0 開始,框架底層基于 Koa 2.x 實現,兼容 Koa 的所有功能。
# 特性
* 基于 Koa 2.x,兼容 middleware
* 內核小巧,支持 Extend、Adapter 等插件方式
* 性能優異,單元測試覆蓋程度高
* 內置自動編譯、自動更新機制,方便快速開發
* 使用更優雅的 `async/await` 處理異步問題
* 從 3.2 開始支持 [TypeScript](http://www.typescriptlang.org/)
# 架構

### 快速入門
借助 ThinkJS 提供的腳手架,可以快速的創建一個項目。為了可以使用更多的 ES6 特性,框架要求 Node.js 的版本至少是 `6.x`,建議使用 [LTS 版本](https://nodejs.org/en/download/)。
### 安裝 ThinkJS 命令
~~~
$ npm install -g think-cli
~~~
安裝完成后,系統中會有 thinkjs 命令(可以通過 thinkjs -V 查看 think-cli 的版本號,此版本號非 thinkjs 的版本號)。如果找不到這個命令,請確認環境變量是否正確。
如果是從 2.x 升級,需要將之前的命令刪除,然后重新安裝。
### 卸載舊版本命令
~~~
$ npm uninstall -g thinkjs
~~~
### 創建項目
執行 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 換成對應的地址。
### 項目結構
默認創建的項目結構如下:
~~~
|--- 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
}
};
~~~
5.1 創建模型文件
~~~
thinkjs model +模型文件名
~~~
6. 控制器
創建控制器的命令是 thinkjs controller +控制器名,我們創建admin后臺登錄控制器,同時在視圖層我們創建admin控制器對應的html頁面admin\_index.html頁面,啟動服務,瀏覽器訪問[http://localhost:8360/admin就可以訪問到admin\_index.html的登錄頁面](http://localhost:8360/admin%E5%B0%B1%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AE%E5%88%B0admin_index.html%E7%9A%84%E7%99%BB%E5%BD%95%E9%A1%B5%E9%9D%A2).
~~~
thinkjs controller admin
~~~
~~~javascript
const user = this.model('thinkjsplus_user'); // controller 里實例化模型
const data = await user.select();
this.assign('title',data);
return this.display();
~~~
7. 視圖
thinkjs3默認模板引擎是 nunjucks,如果在控制器action中這樣寫
~~~javascript
this.assign('title',"測試網頁之thinkjsplus!");
return this.display();
~~~
視圖html頁面中就可以這樣寫,拿到title
~~~~~~javascript
{{title}}
~~~
8. 權限控制
權限代碼如下:
~~~javascript
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操作具體可以查看項目,本項目具有詳細注釋
~~~javascript
/**
* 保存分類
*/
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,即可啟動本項目
- 內容介紹
- EcmaScript基礎
- 快速入門
- 常量與變量
- 字符串
- 函數的基本概念
- 條件判斷
- 數組
- 循環
- while循環
- for循環
- 函數基礎
- 對象
- 對象的方法
- 函數
- 變量作用域
- 箭頭函數
- 閉包
- 高階函數
- map/reduce
- filter
- sort
- Promise
- 基本對象
- Arguments 對象
- 剩余參數
- Map和Set
- Json基礎
- RegExp
- Date
- async
- callback
- promise基礎
- promise-api
- promise鏈
- async-await
- 項目實踐
- 標簽系統
- 遠程API請求
- 面向對象編程
- 創建對象
- 原型繼承
- 項目實踐
- Classes
- 構造函數
- extends
- static
- 項目實踐
- 模塊
- import
- export
- 項目實踐
- 第三方擴展庫
- immutable
- Vue快速入門
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入門
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 混入
- 過濾器
- 項目實踐
- 標簽編輯
- 移動客戶端開發
- uni-app基礎
- 快速入門程序
- 單頁程序
- 底部Tab導航
- Vue語法基礎
- 模版語法
- 計算屬性與偵聽器
- Class與Style綁定
- 樣式與布局
- Box模型
- Flex布局
- 內置指令
- 基本指令
- v-model與表單
- 條件渲染指令
- 列表渲染指令v-for
- 事件與自定義屬性
- 生命周期
- 項目實踐
- 學生實驗
- 貝店商品列表
- 加載更多數據
- 詳情頁面
- 自定義組件
- 內置組件
- 表單組件
- 技術專題
- 狀態管理vuex
- Flyio
- Mockjs
- SCSS
- 條件編譯
- 常用功能實現
- 上拉加載更多數據
- 數據加載綜合案例
- Teaset UI組件庫
- Teaset設計
- Teaset使用基礎
- ts-tag
- ts-badge
- ts-button
- ta-banner
- ts-list
- ts-icon
- ts-load-more
- ts-segmented-control
- 代碼模版
- 項目實踐
- 標簽組件
- 失物招領客戶端原型
- 發布頁面
- 檢索頁面
- 詳情頁面
- 服務端開發技術
- 服務端開發環境配置
- Koajs快速入門
- 快速入門
- 常用Koa中間件介紹
- 文件上傳
- RestfulApi
- 一個復雜的RESTful例子
- 使用Mockjs生成模擬數據
- Thinkjs快速入門
- MVC模式
- Thinkjs介紹
- 快速入門
- RESTful服務
- RBAC案例
- 關聯模型
- 應用開發框架
- 服務端開發
- PC端管理界面開發
- 移動端開發
- 項目實踐
- 失物招領項目
- 移動客戶端UI設計
- 服務端設計
- 數據庫設計
- Event(事件)
- 客戶端設計
- 事件列表頁面
- 發布頁面
- 事件詳情頁面
- API設計
- image
- event
- 微信公眾號開發
- ui設計規范