子站管理教程
栏目管理、内容编辑与发布、审核工作流、成员与角色、模板管理、导航菜单及站点设置。
栏目管理
栏目是子站内容的骨架,采用树形结构组织,支持无限层级嵌套。每个栏目属于以下四种类型之一:
- 分类 — 纯容器节点,不绑定内容模型,仅用于归组子栏目。适合构建导航层级结构。
- 多记录 — 绑定一个内容模型,其下可发布多条内容记录,以列表形式在前台展示。适合新闻列表、产品目录等场景。
- 单记录 — 绑定一个内容模型,但只允许保留一条内容记录,适合「关于我们」「首页」等单页栏目。
- 超链接 — 不承载内容,仅作为跳转链接,可指向站内其他栏目或外部 URL。
URL 映射
每个栏目配置一个唯一的 URL 路径片段(slug),系统按照栏目树的层级自动拼接路径。例如栏目层级 新闻 > 行业动态,若 slug 分别为 news 和 industry,则前台访问路径为 /news/industry。支持为栏目绑定独立域名或路径前缀,实现灵活的多站点映射。
排序与可见性
栏目支持拖拽排序,同层级下按设置的顺序在前台渲染导航。每个栏目可独立控制是否在导航菜单中显示,以及是否对游客可见(需要登录才可访问的受保护栏目)。
内容编辑与发布
内容编辑采用 BlockNote 块编辑器,提供所见即所得的编辑体验。编辑器基于 ProseMirror 构建,支持丰富的块类型:
- 段落、各级标题、引用块、代码块
- 无序列表、有序列表、待办清单
- 图片(支持上传和 URL 引用)、视频嵌入、文件附件
- 表格(带行列操作)
- 自定义块类型(通过内容模型扩展)
草稿与已发布
每条内容有明确的状态流转:草稿 → 已提交 → 已发布。编辑器中可随时保存草稿,内容不会出现在前台。点击「提交审核」后内容进入审核队列;审核通过后点击「发布」,内容即时上线。已发布的内容支持创建修订版本,修订在审核通过前不影响线上版本。
发布策略
除即时发布外,系统还支持定时发布和发布后自动下架(设置过期时间)。这对于时效性内容(如活动公告)非常实用。
审核工作流
审核工作流支持多步审批,每一步可指定不同的审核人和审核策略。
工作流配置
每个栏目可绑定一个审核工作流。工作流由多个步骤组成,例如:编辑初审 → 主编复审 → 终审发布。每一步可配置:
- 审核人 — 指定角色或具体成员作为该步骤的审核人
- 人工指定兜底 — 当按角色+部门规则找不到可用审批人时,支持手动指定审批人作为兜底
- 超时自动处理 — 设定时限,超时后自动通过或自动驳回
驳回与重新提交
任何一步审核人可选择「驳回」,填写驳回原因。内容退回到提交者手中,提交者根据反馈修改后可重新提交。驳回原因会以通知形式推送给提交者,并在内容详情页中展示审核历史。
进度追踪
内容详情页展示完整的审核进度条,清晰标注当前所在步骤、已通过的步骤和待处理的步骤。提交者和审核人均可看到实时状态。所有审核操作(通过/驳回/撤回)均记录在操作日志中,可追溯。
成员与角色
子站支持独立的成员管理体系,与平台级的用户和角色体系协同工作。
添加与移除成员
子站管理员可在「成员管理」中通过用户名或邮箱搜索平台用户,将其添加为子站成员。移除成员时,该成员在本子站的所有角色授权即刻失效。
授权角色
角色定义了成员在子站内的操作权限。系统预置了常用角色(编辑、审核人、管理员),同时支持基于平台角色模板创建子站自定义角色。授权时可以选择角色生效的栏目范围——某个角色可以仅对特定栏目及其子栏目生效,实现精细化的权限隔离。例如:成员 A 是「科技」栏目的编辑,但对「财经」栏目仅有只读权限。
栏目范围
栏目范围授权是 rsSites 权限模型的亮点:同一成员可以在不同栏目拥有不同角色。授权时勾选目标栏目(支持勾选父栏目自动包含所有子栏目),该角色即限定在所选栏目范围内生效。
模板管理
模板决定了子站前台页面的视觉呈现。rsSites 使用 Tera 模板引擎,模板文件通过内置的 Monaco 编辑器 进行在线编辑。
Monaco 编辑器
模板编辑界面集成了 Monaco 编辑器(VS Code 内核),提供语法高亮、自动补全、代码折叠、多光标编辑等专业特性。编辑器支持 Tera 语法提示,帮助开发者快速编写模板。
生命周期管理
每个模板有独立的版本和状态:
- 草稿 — 编辑中的版本,不影响线上渲染
- 已发布 — 当前生效的版本,前台使用此版本渲染
- 已归档 — 历史版本,保留备查,可随时恢复
发布模板时系统自动记录版本快照,支持一键回滚到任意历史版本。
Git 同步
模板支持与 Git 仓库双向同步。可以将模板推送到远程 Git 仓库进行版本管理和团队协作,也可以从 Git 仓库拉取模板。同步支持自动(保存时推送)和手动两种模式,Git 凭据在平台设置中统一管理。
导航菜单与聚合页
导航菜单配置
每个子站可配置多组导航菜单(如主菜单、页脚菜单、侧边栏菜单)。菜单项支持四种来源:
- 栏目节点 — 自动关联栏目树中的节点,栏目发生变化时菜单自动更新
- 自定义链接 — 手动输入 URL 和显示文本
- 内容记录 — 直接链接到某条具体内容
- 聚合页 — 链接到内容聚合页面
菜单项支持多级嵌套、图标、打开方式(当前窗口/新窗口)以及可见性条件(如仅对登录用户显示)。
内容卡片
内容卡片是前台页面中展示内容摘要的 UI 单元。每个栏目可配置其内容列表的卡片样式:标题图、摘要长度、发布时间显示、作者信息等。卡片支持多种布局模式:列表、网格、瀑布流、轮播。
聚合页
聚合页是一种特殊的页面类型,它不绑定单一栏目,而是从多个栏目中按规则聚合内容。聚合规则包括:
- 指定来源栏目(可多选)
- 内容类型过滤(图文、视频、图集等)
- 排序规则(最新、最热、自定义排序)
- 分页设置(每页条数、加载方式)
聚合页适用于首页、专题页面、标签聚合等需要跨栏目展示内容的场景。
站点设置
基本信息
站点名称、副标题、Logo(支持亮色/暗色双图)、Favicon、站点描述。这些信息会在前台模板中作为全局变量提供,模板可以灵活引用。
SEO 设置
全局 SEO 配置包括:默认页面标题模板(如 {内容标题} - {站点名称})、默认 Meta Description、Meta Keywords。单个栏目和单条内容可覆盖全局设置,实现精细化的 SEO 优化。系统自动生成规范的 <title> 和 <meta> 标签。
ICP 备案
支持填写 ICP 备案号,系统自动在页面底部展示。支持中国大陆的 ICP 备案号和公安备案号,格式校验并自动生成链接。
robots.txt 与 Sitemap
系统为每个子站自动生成 robots.txt,管理员可自定义其内容(如禁止抓取特定路径)。Sitemap 同样自动生成,包含所有已发布内容的 URL、最后更新时间、更新频率等字段,支持 XML 和 HTML 两种格式。站点启用后,Sitemap 的 URL 会自动提交至搜索引擎(需配置相关凭据)。
核心机制解析
下面从代码实现的角度,梳理子站日常使用背后几个关键机制是如何运转的,帮助你理解「为什么这样设计」。
内容状态机
每条内容都是一个明确的有限状态:草稿 → 已提交 → 已发布,外加「已下线 / 重新上线」的可逆切换。编辑器保存的只是草稿,不影响前台;点击发布时,系统先写入一条版本快照(store_version),再把内容标记为已发布。正因为每次变更都落了快照,详情页才能随时查看历史版本、并把任意快照恢复到草稿态——版本历史与回滚并非独立模块,而是同一套快照机制的产物。
在此之上,内容还支持「多栏目归属」(除主栏目外再挂到额外栏目,前台多个列表都能出现)与「内容-卡片绑定」(同一条内容在不同位置呈现不同卡片样式),并可通过批量接口统一发布 / 下线 / 删除 / 排序。
权限模型:角色 + 范围 + 栏目
权限不是「管理员 / 普通用户」的二分,而是三层叠加:角色定义一组权限点(如 content.publish 只在 own / any 两种范围生效),栏目范围再把角色限定到具体栏目及其子栏目。于是同一个成员在「科技」栏目可以是编辑、在「财经」栏目只是只读——这种组合在授权时通过勾选父栏目自动继承子栏目完成。预置的 7 个角色只是起点,平台角色模板可被复制到子站后再微调。
前台渲染管线
前台是服务端渲染:每个子站持有自己独立的 Tera 实例,请求到达后由调度器按 URL 分发到首页 / 列表 / 阅读 / 聚合 / 单页 / 话题 / 博客等渲染函数。模板通过「Slot」机制与具体页面解耦——模板只声明占位(如 hero、sidebar、main),运行时按「内容模型别名 → 栏目 slug → 全局默认」的优先级匹配对应 slot 文件,所以一套布局能自动适配多种内容类型。
搜索与 SEO 同样由渲染层统一处理:搜索走应用层分词(jieba-rs)配合 PostgreSQL 全文检索并跨全站栏目聚合;sitemap.xml、robots.txt、Article 结构化数据在请求时按需拼装,博客模式则是一个站点级开关,打开后列表页切换为时间线式呈现。