[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