企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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}%`]; } ~~~