### 創建 Controller
MVC 模型中,控制器是用戶請求的邏輯處理部分。比如:將用戶相關的操作都放在`news.js`里,每一個操作就是里面一個 Action。
項目中的 controller 需要繼承`think.Controller`類,這樣能使用一些內置的方法。當然項目中可以創建一些通用的基類,然后實際的 controller 都繼承自這個基類。
項目創建時會自動創建了一個名為`base.js`的基類,其他 controller 繼承該類即可。
### 創建News控制器
創建文件
/src/controller/api/portal/news.js
輸入以下內容
~~~
const Base = require("../../base.js");
import Mock from "mockjs";
module.exports = class extends Base {
async getListAction(map = { page: 1, pageSize: 10 }) {
let { page, pageSize } = map;
let mockOptions = {
count: 200,
totalPages: 20,
pageSize: pageSize,
currentPage: page,
"data|20": [
{
"id|+1": 1, // 屬性 id 是一個自增數,起始值為 1,每次增 1
title: "@ctitle(10,30)",
cover: "@image('300x200', '#50B347')",
create_at: "@date()",
abstract: "@cparagraph(3,50)",
},
],
};
let data = await Mock.mock(mockOptions);
return this.success(data);
}
async getDetailAction(id) {
//模擬一段Markdown文本,實際從該數據庫中讀取或者從文件中讀取
let markdown = await Mock.mock({
description: "@cparagraph(100)",
});
const html = think.service("marked").markdownToHtml(markdown.description);
let mockOptions = {
id: 1, // 屬性 id 是一個自增數,起始值為 1,每次增 1
title: "異步處理",
create_at: "@date()",
cover: "@image('1024x200', '#50B347')",
abstract: "@cparagraph(100)",
description: html,
author: "@cname()",
"category_label|1": ["團隊動態", "行業報告"],
};
let data = await Mock.mock(mockOptions);
return this.success(data);
}
};
~~~
### 能力提升
1、實現從數據庫中讀取新聞列表和新聞詳情
```
module.exports = class extends think.Controller {
__before() {
}
// http://127.0.0.1:8360/api/portal/news/getDetail?id=1
async getDetailAction() {
let id = this.get('id');
let map = { id };
let field = "id,title,author,cover_image,abstract,description,create_at";
let data = await this.model("portal_news").field(field).where(map).find();
think.logger.debug(data);
return this.success(data);
}
// http://127.0.0.1:8360/api/portal/news/getList
async getListAction() {
let id = this.get('id');
let page = this.get('page') || 1;
let pageSize = this.get('pageSize') || 10;
let map = {};
let field = "id,title,author,cover_image,abstract,description,create_at";
//SELECT `id`,`title`,`author`,`cover_image`,`abstract`,`description`,`create_at` FROM `think_portal_news` WHERE ( `id` = '1' ) ORDER BY sort desc LIMIT 0,10
let data = await this.model("portal_news").field(field).where(map).order("sort desc").page(page, pageSize).countSelect();
think.logger.debug(data);
return this.success(data);
}
};
```
- 文檔說明
- 服務端開發指南
- 客戶端開發指南
- 請求攔截器
- API接口實例分析
- 頁面文件
- NPM包管理
- 創建NPM包項目
- 課程設計
- 概述
- 內容管理系統項目
- 配置開發環境
- 設計靜態原型
- 快速構建項目
- 構建CMS系統前端界面
- 門戶模塊
- 新聞列表
- API接口規范
- 生成模擬數據
- 顯示新聞列表
- NavigatorPath組件
- ChannelHeader組件
- v-line-clamp指令
- formatDate過濾器
- 新聞詳情頁
- 修改頂部導航菜單
- 實現訪問遠程API
- 擴展功能
- 組件開發
- 服務端項目
- 編寫服務模塊
- 項目配置
- 數據庫
- 創建數據庫腳本
- 配置數據庫
- 創建模擬數據
- 新聞模塊控制器
- 添加邏輯驗證層
- 實現接口
- 書棧模塊
- QA