6.7 文章管理
概述
文章模块(goframe_article,租户级表)是文件/富文本字段的代表模块:cover 单图、images 多图、content 富文本([IMG_URL] 持久化契约),配合分类关联与状态/点击量/排序。
接口清单
text
七件套 + PUT /api/article/status(sys:article:status)
sys:article:{page|list|detail|add|update|delete|batchDelete|status}表特征列
text
category_id 所属分类(逻辑外键 → goframe_category)
cover 封面单图(FileFields)
images 多图(MultiFileFields,逗号分隔)
content 富文本(ContentFields,[IMG_URL] 占位符契约)
status 0-正常 1-下架(注释枚举)
click 点击量
sort 排序声明式文件/富文本处理(spec 模式)
go
// articleSpec 关键声明(模式示意)
var articleSpec = ModuleSpec[...]{ ...,
FileFields: []string{"cover"}, // 单图
MultiFileFields: []string{"images"}, // 逗号多图
ContentFields: []string{"content"}, // 富文本
FileSaveDir: "article", // 转正目录
}基座自动完成:
text
写侧(saveTransform):
cover/images:temp 路径 → SaveFromTemp 转正到 article/{日期}/
content:LocalizeContentFields —— 本站 /temp/ 引用转正、
本站正式引用剥离域名 → "[IMG_URL]/相对路径"
外站 URL 不处理(防 SSRF)
读侧(readTransform):
cover/images:GetFileUrl 补域名(domainUrl 或 /upload/)
content:ExpandContentFields —— "[IMG_URL]" 还原为访问基址详见 7.3 富文本处理 与 7.1 文件上传全流程。
分类关联
text
article.category_id → category.id(树形模块,见 6.10 分类管理)
列表可按分类筛选(EqFields);分类删除有引用守卫意识(避免文章悬挂)状态与展示
text
status 0-正常 1-下架:前端列表按状态过滤展示
SerializeMaps: status → article_status(字典驱动 {field}Text)
click 点击量:详情阅读累加(业务自定义)
sort 排序:OrderBy "sort asc" 或前端排序白名单管理建议
- 富文本图片会被自动本地化(temp → 正式目录)——编辑器直传的图片安全落库
- 外站图片链接保持原样不抓取(设计边界:防 SSRF)
- content 字段含 [IMG_URL] 占位符是库内格式契约——content 不供第三方系统直接消费,读取必须走 Detail/List(基座自动还原)
- cover/images 字段入库为相对 uploadDir 路径,展示层经 GetFileUrl(基座已处理,勿手拼)