主 题
博客系统自文档 · 第 2/16 篇
目录 · 上一篇:三端架构与请求链路 · 下一篇:评论、点赞与站内通知
写在前面
博客的「内容」不只是 Markdown 字符串,而是一套 文章 + 分类 + 标签 + 状态 + 机构 的数据模型,再叠加搜索、归档、RSS 等发现通道。
本篇讲读者怎么找到文章,以及开发者该看哪些表和路由。
功能与体验:读者如何发现内容
| 能力 | 路由 | 说明 |
|---|---|---|
| 首页列表 | / |
分页、置顶、排序 |
| 搜索 | /search?q= |
标题/内容检索 |
| 归档 | /archives |
按年月聚合 |
| 分类 | /category/[id] |
每文 1 个 分类 |
| 标签 | /tag/[id] |
每文 多个 标签 |
| RSS | /feed.xml |
最近 50 篇,Nitro 路由 |
| 详情 | /detail/[id] |
Markdown 渲染、TOC、相关推荐、prev/next |
详情页增强(2026-06)
- 相关推荐
ArticleRelated→POST /article/related - 同作者 prev/next
ArticleAdjacentNav→/article/info返回prev/next - JSON-LD + canonical 利于 SEO
- 评论客户端分页加载(SSR 瘦身后侧栏懒加载)
设计与实现
数据模型
erDiagram
article ||--o| category : "articles FK"
article }o--o{ tag : article_tags_tag
article ||--o| user : "uid / useArticles"
article {
int id PK
text title
longtext content
longtext contentHtml
enum status draft_publish_scheduled
datetime scheduledPublishAt
tinyint topping
varchar articles FK category
}
| 字段 | 含义 |
|---|---|
content |
Markdown 源码 |
contentHtml |
渲染 HTML(创建时必填) |
status |
draft / publish / scheduled |
articles |
分类 UUID(列名历史原因,不是复数语义) |
deptId |
作者机构,RBAC 数据范围,≠ 分类 |
关联表:article_tags_tag(articleId, tagId)。
创建与发布
- API:
POST /article/create(JWT),ArticleService.create - 校验:标题唯一、作者须有
deptId、分类与标签必填 - 定时发布:
status=scheduled+scheduledPublishAt,由scheduled-task定时扫描改publish - C 端 / admin 均提交
content+contentHtml
RSS 实现
feed.xml.ts 在 Nitro 层:
- 请求同源
POST /api/article/list(pageSize 50) - 组装 RSS 2.0 XML,
link指向/detail/{id}
不经过 Nest 模板,部署时随 Nuxt 进程提供。
prev/next 排序规则
同作者、已发布文章,按 置顶优先 + 时间降序 取相邻篇(见 ArticleService.findAdjacentArticles)。连载自文档可通过 SQL 控制 createTime 递增来串联。
踩坑与取舍
- 无「系列」实体:连载靠分类 + 标签 + 文内链接 + prev/next,不另建 series 表。
- about 页模式:
/about可硬编码加载某article.id当静态页(当前 id 44)。 - SQL 直写不触发 RPG 发文经验:自文档用 SQL 导入时无
ARTICLE_PUBLISHED事件。
系列导航
- 目录
- 导读 · 第 0 篇
- 下一篇:09 RPG 玩法全览(待发布)
延伸阅读
- 实体定义:
blog-server/src/modules/features/article/entity/article.entity.ts - Home 路由表:
blog-home-nuxt/README.md

全部评论(0)