文档目录
文章管理

简介

本文面向开发者,系统化梳理 DouPHP 文章管理模块的后台与前台实现,覆盖文章的创建、编辑、删除、列表查询、分类体系、SEO 优化、富文本内容处理、图片上传、访问统计等。文档同时给出关键流程的时序图与流程图,并提供可操作的 API 参考与扩展建议,帮助快速定位问题与二次开发。

项目结构

文章模块按“后台管理”和“前台展示”双端组织,采用控制器-服务-模型的分层设计:

  • 后台管理(admin)
    • 控制器:文章与分类的增删改查入口
    • 服务:业务编排(表单数据组装、附件处理、审计日志)
    • 模型:ORM 映射、筛选器、排序、关联
  • 前台展示(front)
    • 控制器:路由解析、页面数据组装、SEO 与导航
    • 服务:列表/详情数据构建、点击量记录
    • 模型:发布状态过滤、归档筛选、多语言、URL 生成、相关文推荐
graph TB
subgraph "后台"
AC["Admin ArticleController"]
ASvc["Admin ArticleService"]
AModel["Admin Article Model"]
CatC["Admin CategoryController"]
CatM["Admin Category Model"]
end
subgraph "前台"
FC["Front ArticleController"]
FSvc["Front ArticleService"]
FModel["Front Article Model"]
FCatM["Front Category Model"]
end
AC --> ASvc
ASvc --> AModel
CatC --> CatM
FC --> FSvc
FSvc --> FModel
FC --> FCatM

核心组件

  • 后台文章控制器:负责列表、新增、编辑、更新、删除、批量操作;通过 Request 校验后调用服务完成业务。
  • 后台文章服务:封装列表数据构建、新增/更新/删除/批量逻辑,协调附件存储、XSS 清洗、Markdown 渲染、审计日志。
  • 后台文章模型:声明表字段白名单、casts、关联分类、关键词筛选、默认排序。
  • 前台文章控制器:解析路由(分类/归档/详情),组装 SEO、导航、面包屑,调用服务获取数据并渲染模板。
  • 前台文章服务:构建列表/详情数据,Markdown 渲染,分类信息查询,点击量记录。
  • 前台文章模型:已发布过滤、归档时间窗筛选、主图过滤、默认排序、多语言与 URL 生成。
  • 分类模型(前后端):树形结构、层级关系、同步到导航等能力。

架构总览

文章模块遵循“请求进入控制器 -> 服务编排 -> 模型持久化/查询 -> 视图渲染”的标准流程。后台侧重内容生产与审核,前台侧重内容消费与 SEO。

sequenceDiagram
participant Admin as "后台控制器"
participant Svc as "后台服务"
participant Model as "后台模型"
participant Att as "附件服务"
participant Aud as "审计日志"
Admin->>Svc : 提交新增/更新
Svc->>Att : 清洗并存储正文图片
Svc->>Model : 写入文章数据
Model-->>Svc : 返回主键/结果
Svc->>Aud : 记录操作日志
Svc-->>Admin : 重定向/响应

详细组件分析

后台文章 CRUD

  • 列表:支持按分类、关键词、分页、默认排序(手动排序开关影响)。
  • 新增:草稿附件清理、Markdown 正文 XSS 清洗、远程图片本地化、主图上传、草稿认领、审计日志。
  • 编辑:读取原始列值并按表单语义格式化,Markdown 预览转换。
  • 更新:可选覆盖正文与主图,写回数据库并记录日志。
  • 删除:二次确认或实际删除,附带审计日志。
  • 批量:批量删除、批量转移分类。
flowchart TD
Start(["进入新增/编辑"]) --> Clean["清理草稿附件/生成Token"]
Clean --> Validate["Request 校验"]
Validate --> |失败| Error["抛出领域异常并提示"]
Validate --> |成功| Process["XSS清洗/远程图片本地化"]
Process --> Save["写入文章/主图"]
Save --> Claim["认领草稿附件"]
Claim --> Log["记录审计日志"]
Log --> Redirect["重定向到编辑页/列表"]

前台文章展示与 SEO

  • 列表/分类/归档:解析路由参数,按分类与归档时间窗筛选,分页加载,构建面包屑与导航。
  • 详情:仅展示已发布文章,Markdown 渲染正文,记录点击量,注入 SEO 标题/关键词/描述与结构化数据。
  • 侧栏搜索:回填全站搜索关键词(q),非法词不回填。
sequenceDiagram
participant U as "用户浏览器"
participant C as "前台控制器"
participant S as "前台服务"
participant M as "前台模型"
U->>C : 访问文章列表/详情
C->>S : 构建列表/详情数据
S->>M : 查询已发布/归档/分类
M-->>S : 返回数据
S->>S : Markdown 渲染/统计
S-->>C : 返回视图数据
C-->>U : 渲染页面(含SEO/导航)

分类体系

  • 后台分类:树形展示、CRUD、同步到导航、排序。
  • 前台分类:树形导航、按分类筛选文章、分类信息多语言。
classDiagram
class Admin_ArticleCategory {
+table : "article_category"
+fillable : ["name","slug","parent_id","icon","keywords","description","sync_to_nav","sort"]
+flat()
}
class Front_ArticleCategory {
+translatable : ["name"]
+prefetchers : ["language"]
+tree(catId)
}
Admin_ArticleCategory <.. Front_ArticleCategory : "共享 article_category 表"

富文本编辑器集成与图片处理

  • 正文内容在后台新增/更新时进行 XSS 清洗,支持将远程图片下载到本地并替换链接。
  • 主图上传走统一附件服务,支持管理员身份标记与归属。
  • 前台详情页对正文进行 Markdown 渲染输出。
flowchart TD
In["接收 content/image"] --> XSS["XSS 清洗"]
XSS --> Remote{"是否包含远程图片?"}
Remote -- 是 --> Local["下载并替换为本地图片"]
Remote -- 否 --> Keep["保留原内容"]
Local --> Store["保存正文/主图"]
Keep --> Store
Store --> Done["完成入库"]

版本控制与审核机制

  • 当前实现未提供独立的文章版本历史表;如需版本控制,可在 Service 层引入版本快照策略(例如每次更新前复制一份至版本表)。
  • 审核机制通过“状态字段”控制前台可见性:仅已发布(status=1)的文章在前台显示。

标签系统

  • 当前代码中未发现独立的标签模型与关联逻辑;如需标签功能,建议在 Service 层增加标签关联与检索能力,并在列表/详情中展示。

依赖关系分析

  • 控制器依赖服务,服务依赖模型与外部服务(附件、Markdown、审计)。
  • 前台控制器还依赖导航、面包屑、SEO、Schema 等服务以增强展示与 SEO。
  • 模型使用 traits 提供通用能力(分类筛选、内容格式化、URL 生成、相关文查询等)。
graph LR
AC["Admin ArticleController"] --> ASvc["Admin ArticleService"]
ASvc --> AModel["Admin Article Model"]
ASvc --> Att["附件服务"]
ASvc --> MD["MarkdownRenderer"]
ASvc --> Aud["审计日志"]
FC["Front ArticleController"] --> FSvc["Front ArticleService"]
FSvc --> FModel["Front Article Model"]
FC --> Nav["NavigationBuilder"]
FC --> BC["BreadcrumbBuilder"]
FC --> Seo["SeoResolver"]
FC --> Schema["SchemaService"]

性能与缓存

  • 列表查询使用 ORM 的 with('category') 预加载分类,减少 N+1 查询。
  • 前台模型配置 prefetchers 批量预热 URL、多语言、附件,提升列表渲染性能。
  • 分页限制每页条数,避免一次性加载过多数据。
  • 建议:
    • 对高频访问的分类/归档列表启用应用级缓存(如 Redis),设置合理过期策略。
    • 对 Markdown 渲染结果进行缓存,结合内容变更事件失效。
    • 对图片资源启用 CDN 与压缩。

安全与合规

  • 输入校验:通过 Request 校验规则约束字段类型与必填项。
  • XSS 防护:正文内容在入库前进行清洗。
  • 权限与审计:后台操作记录审计日志,便于追踪与回溯。
  • 建议:
    • 对敏感操作(删除、批量操作)增加 CSRF 校验与二次确认。
    • 对上传文件进行类型、大小、路径白名单校验。
    • 对外部图片下载增加域名白名单与超时限制。

故障排查

  • 新增/更新失败:检查 Request 校验错误、附件上传是否成功、Markdown 渲染是否异常。
  • 列表为空:检查分类筛选、关键词、归档时间窗、分页参数是否正确。
  • 详情页 404:确认路由参数(id/slug/year/month)是否有效,文章是否已发布。
  • 图片不显示:确认附件归属、草稿认领是否完成、CDN 路径是否正确。

结论

DouPHP 文章模块采用清晰的分层架构,后台聚焦内容生产与安全,前台聚焦内容消费与 SEO。通过 ORM 预加载、分页、Markdown 渲染、附件服务与审计日志,实现了稳定高效的读写体验。后续可按需扩展版本控制、标签系统与应用级缓存,进一步提升可维护性与性能。

附录:API参考与示例

以下列出常用接口与典型用法,便于快速上手与集成。

  • 后台文章

    • 列表
      • 方法:GET
      • 路径:/admin/article
      • 参数:category_id, keyword, page
      • 返回:文章列表与分页信息
    • 新增
      • 方法:POST
      • 路径:/admin/article
      • 参数:title, category_id, content, image, keywords, description, defined, draft_token
      • 行为:XSS 清洗、远程图片本地化、主图上传、草稿认领、审计日志
    • 编辑
      • 方法:GET
      • 路径:/admin/article/edit?id={id}
      • 返回:文章详情(Markdown 预览)
    • 更新
      • 方法:POST
      • 路径:/admin/article
      • 参数:id, title, content, image, keywords, description, defined
      • 行为:可选覆盖正文与主图,审计日志
    • 删除
      • 方法:POST
      • 路径:/admin/article/destroy?id={id}
      • 行为:二次确认后删除,审计日志
    • 批量操作
      • 方法:POST
      • 路径:/admin/article/action
      • 参数:action(del_all/category_move), checkbox[], new_cat_id(转移分类用)
  • 前台文章

    • 列表/分类/归档
      • 方法:GET
      • 路径:/article/category/{year}/{month}?page={page} 或 /article/category?category_id={id}
      • 返回:文章列表与分页
    • 详情
      • 方法:GET
      • 路径:/article/show/{id}
      • 行为:Markdown 渲染、点击量+1、SEO 注入
添加日期:2026-10-05