### 创建 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