[TOC]
~~~
import BaseController from "../../base.js";
/**
* 新闻动态栏目
*/
export default class extends BaseController {
/**
* 获取新闻列表的分页数据
*
* @param {int} pageSize 分页大小,默认12
* @param {int} page 请求页码,默认1
* @param {String} keywords 模糊查询关键词,支持title属性检索
*
* @returns {Promise} 包含满足条件的新闻列表的Promise对象
* @example
*
* const newsList = await request.get("/api/portal/news/getList",
* {params: {key:'what you want to search', pageSize:10, page:1}});
* 返回列表每一个对象包含以下属性:
* [{
* id,
* title, //新闻标题
* create_at, //创建时间
* view, //阅读次数
* category_label,//分类名称
* cover, //封面图片或者视频的地址
* abstract //摘要
* },]
*/
async getListAction() {
let pageSize = this.get("pageSize") || 12;
let page = this.get("page") || 1;
let map = {};
//支持中文汉字和A-Za-z0-9
let keywords = think.service("utils").filterString(this.get("keywords"));
// console.log(keywords);
if (keywords) {
map["title"] = ["LIKE", `%${keywords}%`];
}
let field = "id,title,create_at,view,category_label,cover,abstract";
let rows = await this.model("portal_news")
.field(field)
.where(map)
.page(page, pageSize)
.countSelect();
return this.success(rows);
}
/**
* 获取新闻详情
*
* @param {int} id 新闻的id
*
* @returns {Promise} 包含满足条件的新闻列表的Promise对象
* @example
*
* const newsInfo = await request.get("/api/portal/news/getDetail", {params: {id:1}});
* 返回对象包含以下属性:
* {
* id,
* title, //新闻标题
* author, //作者
* create_at, //创建时间
* view, //阅读次数
* category_label,//分类名称
* cover, //封面图片或者视频的地址
* abstract, //摘要
* description //新闻详情,HTML格式
* }
*/
async getDetailAction() {
let id = this.get("id");
await this.model("portal_news").where({ id: id }).increment("view", 1);
let field =
"id,title,author,create_at,view,category_label,cover,abstract,description";
let rows = await this.model("portal_news")
.field(field)
.where({ id: id })
.find();
//Markdown转为HTML
rows.description = think.service("marked").markdownToHtml(rows.description);
return this.success(rows);
}
}
~~~
## 代码解读
### 1、明确输出字段列表
API接口请求要明确列出输出字段名称,不输出不必要的字段,并对输出字段进行必要的转义
### 2、通过service封装通用的后台功能
将后台常用的功能分类分装成service的形式。
文件路径:/src/service/utils.js
~~~
export default class extends think.Service {
/**
* 过滤掉字符串中不安全的符号,只保留中文字符和英文基本字母
* @param {string} str 需要处理的字符串
* @return {String} 处理完的字符串
*/
filterString(str) {
// 其中\u4e00-\u9fa5匹配汉字,a-zA-Z匹配字母,\d匹配数字,,.,。匹配逗号和句号,^表示非,+表示尽可能多的匹配。
/// [^\u4e00-\u9fa5a-zA-Z\d,\.,。]+/
if (think.isNullOrUndefined(str)) return "";
if (think.isEmpty(str)) return "";
return str.replace(/[^\u4e00-\u9fa5a-zA-Z_\d]/gi, "");
}
}
~~~
### 3、搜索功能一定要过滤字符串,避免SQL注入
~~~
let keywords = think.service("utils").filterString(this.get("keywords"));
if (keywords) {
map["title"] = ["LIKE", `%${keywords}%`];
}
~~~
- 文档说明
- 服务端开发指南
- 客户端开发指南
- 请求拦截器
- API接口实例分析
- 页面文件
- NPM包管理
- 创建NPM包项目
- 课程设计
- 概述
- 内容管理系统项目
- 配置开发环境
- 设计静态原型
- 快速构建项目
- 构建CMS系统前端界面
- 门户模块
- 新闻列表
- API接口规范
- 生成模拟数据
- 显示新闻列表
- NavigatorPath组件
- ChannelHeader组件
- v-line-clamp指令
- formatDate过滤器
- 新闻详情页
- 修改顶部导航菜单
- 实现访问远程API
- 扩展功能
- 组件开发
- 服务端项目
- 编写服务模块
- 项目配置
- 数据库
- 创建数据库脚本
- 配置数据库
- 创建模拟数据
- 新闻模块控制器
- 添加逻辑验证层
- 实现接口
- 书栈模块
- QA