!

This page is not translated yet

The interface, navigation and community content are bilingual. The long-form body of this page is still in Chinese. The translation work is tracked as task I18N-10.

See translation tasks

Requirements & Gap

需求整理与版本规划

把「我想要什么」整理成可逐条验收的需求清单,并诚实标出每一条的当前状态。结论很直接:目前交付的是设计文档与可运行的界面演示;所有后端能力(Rust API、鉴权、MySQL、Redis、Meilisearch)都还在 V1.0 计划里。

需求条目
82 条
已交付
35 条
部分完成
11 条
未开始
36 条

现在有什么(已交付,打开就能看)

  • 三栏布局为主体CommunityShell 与文档站布局均已按三栏实现,xl 断点三栏、lg 两栏、移动端单栏。
  • 单社区页/c/[community] 已可用,PHP / Vue / Rust / MySQL / Ubuntu 五个社区结构各异。
  • 无限级横向 megamenuMegaMenu + MegaFlyout 递归组件;PHP 社区已有 5 级示例(网址大全 → 工具链 → 静态分析 → PHPStan)。
  • 每个菜单一个独立 slug 页menuRegistry 注册表 + defineAsyncComponent;未登记的 slug 回退到自动生成的骨架页,不返回 404。
  • 社区主题色切换通过 --c-brand / --c-brand-dark / --c-brand-soft 三个 CSS 变量注入,子树全部引用变量。
  • 移动端菜单降级MegaTree 递归折叠,按深度缩进,仅展开当前分支。
  • 「信息优先」视觉语言重做v3 全站重做完成:行动色收敛为单一暖橙红 #d93d16,正文链接单独用 #0b6bcb,其余全部中性灰;静态卡片不再用阴影。
  • 全站响应式与自适应文档与社区页断点为 1024 / 1280;目录页(/c)改为容器查询,因为它嵌在布局中栏里,宽度由布局决定而与视口无关。
  • 设计令牌单一来源main.css 的 @theme 是唯一来源;另已把手写 SVG 图表里 230 处旧色值全部替换为新令牌取值。
  • 界面原子组件CommunityAvatar / JoinButton / VoteRail / PostCard / DirectoryCard / DirectoryRow 已落地并被目录页与社区页复用。
  • 组件类的级联层归属Tailwind 4 工具类住在 @layer utilities;无层样式优先于任何 @layer。修前 .r-chip 让 class 里的 hidden 永久失效,手机上领域标签白占 88px 并把「加入」按钮顶出卡片被裁。
  • 布局自动验收在 320 → 1920 共 14 个宽度 × 14 条路由 = 196 项上跑自动断言,全部通过。判据取自实测:目录页中栏 349 → 653px,简介列 162 → 184px,列右边界像素级一致。
  • 社区页免 hero:顶栏与 megamenu 直接相邻原hero把社区名、头像、简介各说了一遍,而这四样顶栏与左右栏都已具备 —— 首屏被 128px 重复信息占掉。实测改后 megamenu 顶边 = 顶栏底边 = 57px(紧贴,无缝隙)。左栏原本还列了一份「社区导航」,与 megamenu 是同一批条目,一并删掉,换成「我的订阅」与「本社区热门标签」(后者取自信息流真实标签分布,是菜单给不了的信息)。
  • 顶栏三段式:标识 / 搜索居中 / 操作贴右修前搜索用了「flex-1 + max-w + mx-auto」,auto margin 与 max-width 冻结顺序让留白偏向一侧,1440 下左右留白 159/317 且操作组被挤在中间,右侧空出 611px。改成两层结构(外层 flex-1 负责居中、内层封顶 560px)后,768 → 1920 实测左右留白均为 12/12。
  • 响应式栅格必须有基础列定义隐式单列的轨道尺寸是 auto(= min-content),宽内容会把轨道顶破;grid-cols-1 等于 minmax(0,1fr),最小值为 0 才能真正收缩。全仓 53 处响应式栅格已补齐,并用「改动行只允许插入一个 token」的方式逐行校验,避免批量脚本误伤。典型受害例:/ui 的 URL 规范表 min-content 500px,两栏布局每栏最多 436px,被 overflow-hidden 裁掉 64~204px 且任何视口都塞不下 —— 该表改为整行铺开。
  • 全站移除面包屑Breadcrumb 组件与 3 处引用(StubPage、菜单页、帖子详情页)已删除;StubPage 改为「第 N 层」层级芯片 + 单个上级链接,属于回退入口而非路径链。同步修正了 /ui、/modules、/roadmap、/prototype 与 R-UI-08 中共 10 处描述面包屑的文案与图注。
  • 顶栏语言切换器桌面端放在右侧操作组内(地球图标 + 语言短码),移动端在抽屉里并列「社区目录 / 社区演示」。控件宽度固定为 62px,避免中英文字宽不同导致顶栏跳动;菜单里同时列出已启用语言与「还有 N 种待启用」。实现见 /tasks 的 UI-21。
  • 语言注册表与可扩展app/utils/locale.ts 的 LOCALES 登记 10 种语言(zh-CN / en 启用,zh-TW / ja / ko / fr / de / es / ru / ar 预登记)。每种语言带 htmlLang 与 dir,切换器底部显式标出「还有 N 种语言待启用」—— 不假装只有两种。
  • 浏览器语言协商解析 Accept-Language(按 q 降序、忽略 q=0、前缀匹配),服务端与客户端调用同一个 negotiateLocale(),因此 SSR 输出的 HTML 与 hydration 结果一致。cookie ruyi_lang 优先于浏览器声明,有效期 1 年。未覆盖的语言回落到 zh-CN(本站在中文语境下生长,把陌生语言送到英文更远)。协商结果一律用 302 —— 结果依赖请求头,301 会被中间层缓存并扩散。
  • URL 语言前缀全部页面收敛到 app/pages/[locale]/。旧路径(/ui、/c/php)在用户没有显式选择语言时 301 到默认语言 /zh-CN/…(目标确定,可安全缓存以收敛权重);若用户选过语言(ruyi_lang cookie)则改用 302 送到该语言。形状像语言码但并不存在的(/xx-YY/ui)返回 404 而不是重定向 —— 不掩盖「该语言没有这个版本」。
  • 手动切换并保持当前页切换只改 URL 前缀、走客户端路由,不整页刷新,滚动位置与已展开的菜单状态都保留。社区 slug 在目标语言下不同时(community_locales.slug)用目标 slug 重拼,映射缺失则回落该社区首页而不是 404。
  • 界面词典与键集合校验messages.ts 把 zh-CN 与 en 两份词典写在同一个文件里,配 assertMessageParity() 断言键集合完全一致 —— 分成两个文件时,「少一个键」在 TypeScript 里不会报错。开发环境缺键渲染成 ⟦key⟧,一眼可见。当前 263 个键已对齐。错误页(4xx/5xx)也走同一套词典:app/error.vue 不再暴露中间件里那句中文 statusMessage,改按语言取文案与按钮,否则英文读者撞到 404 时会看到一整句中文。
  • 社区内容本地化数据字符串走「原文 → 英文」术语表(对应未来真实的 translations 表),界面字符串走词典,两条路分开:前者按 id 稳定、可增量翻译,后者由构建期校验兜底。目录页英文版残留汉字已从 1042 降到个位数(剩下的都是模板源码注释,生产构建会被剥离)。
  • 信息流与评论按语言生成文案池按语言拆分,locale 只进入 makeFeed 的随机种子,不进入正文与评论树的生成 —— 因此中英两版的剧情结构(帖子数、评论条数、最大深度)完全一致,只有文案不同,切语言不会像「换了一个社区」。
  • hreflang 与 html langapp.vue 统一输出 htmlAttrs.lang / dir 与每页的 hreflang alternate(含 x-default),页面标题与描述也按语言输出。这一条最初整批漏掉:11 个文档页的 <title> 各自写死中文,现已收敛到 useDocHead() 一处。
  • 万级社区目录按 1.3 万条数据实测:搜索(匹配名称/简介/话题/领域)+ 16 个领域带计数 + 4 档排序 + 3 档密度 + 分批渲染 + URL query 同步,服务端可直出已筛选的首屏。
  • 目录社区统一适配toCommunity 适配器把目录社区转换为标准站点骨架(左栏导航 + 通用 megamenu + 规则/版主),任意 slug 均可打开,叶子落到通用骨架页。
  • 目录密度与简介列宽预算实测 1440 视口下中栏 651px、简介列 184px、中文 12.75px/字 → 简介压到 ≤14 字;变体短语 ≤8 字、收尾短语 4 字。修前简介 340px、89% 的行在句子中间被切断。
  • Nuxt 4 SSR 前端骨架本项目即该骨架,构建与 SSR 均已验证通过。
  • 组件库与设计令牌v3 已把颜色/圆角/阴影/字体全部收敛到 main.css 的 @theme(唯一来源),组件层用 .r-* 原子类与 9 个 Vue 组件实现。
  • 产品与技术设计文档站本站即交付物,11 个页面全部可访问。
  • 交互原型/prototype 可交互;另有 /c 下的完整界面演示。
  • 数据表设计/database 页含 SVG ER 图与 45 张表的完整定义(MySQL 语法)。
  • 架构与部署设计/architecture 与 /stack 两页,全部按实际选型编写。
  • AI 可执行任务分解/tasks 已交付:58 条任务 / 10 个分类,每条含前置依赖、涉及文件或表、执行步骤与可客观判定的验收标准;按依赖拓扑给出并行开工批次,并支持导出 Markdown 直接交给执行者。

还没有什么

未开始的 36 条里有 24 条属于第一版。 其中最要紧的一条:没有任何后端代码。

  • 命令面板(⌘K 搜索跳转)
  • 注册与登录
  • 会话管理
  • 个人资料与头像
  • 信任等级 TL0–TL4
  • 社区创建与资料
  • 订阅与我的社区
  • 目录检索与分页后端

完整清单见下方矩阵;另外 16 条同类项已折叠。

分领域进度

进度按「已交付计 1 分、部分完成计 0.5 分」折算。可以清楚看到:界面与菜单系统基本完成,技术设施与治理几乎是空白 —— 这正是 V1.0 的主要工作量所在。

界面与菜单系统

86%
17 已交付2 部分2 未开始共 21 条

用户与身份

0%
0 已交付0 部分6 未开始共 6 条

社区与组织

50%
3 已交付2 部分3 未开始共 8 条

内容与互动

25%
0 已交付5 部分5 未开始共 10 条

搜索与发现

0%
0 已交付0 部分4 未开始共 4 条

治理与运营

0%
0 已交付0 部分5 未开始共 5 条

技术设施

30%
2 已交付2 部分6 未开始共 10 条

多语言

89%
8 已交付0 部分1 未开始共 9 条

交付与质量

56%
5 已交付0 部分4 未开始共 9 条

V1.0(第一版)做什么

第一版不做取舍:9 个 P0 模块必须一次性交付,因为「半个社区」无法验证任何假设。以下是本版要交付的东西、验收标准与可演示链路。

第一版 · 可上线的闭环

能注册、能建社区、能无限级地组织内容、能发帖能被评论

在 Ubuntu 26 上跑起一套完整可用的社区:Rust 提供 API,Nuxt 负责 SSR,MySQL 存主数据,Redis 扛会话与热度,Meilisearch 提供搜索。核心差异点是「三栏布局 + 无限级 megamenu + 每个菜单一个 slug 独立页」。

交付物

  • 环境与部署:Ubuntu 26.04 LTS + Nginx + systemd 托管 api/web/worker 三类服务,certbot 自动续期
  • 用户体系:邮箱注册登录(argon2id)、Redis 会话、个人资料、头像上传、信任等级 TL0–TL4
  • 社区与版块:社区 CRUD、社区资料与规则、版主设置、订阅关系
  • 界面与菜单系统:三栏布局壳、社区主题色注入、无限级横向 megamenu、slug → SFC 注册表、通用骨架页
  • 内容模型:文本帖 / 链接帖、Markdown 服务端渲染、修订历史、标签、置顶与锁定
  • 投票与排序:幂等投票、Redis ZSet 热度排行、Karma 与低权重票折算
  • 树形评论:邻接表 + 物化路径、单条折叠与全部折叠、四档排序、楼主标识
  • 搜索:Meilisearch 索引帖子 / 评论 / 用户 / 页面,站内搜索与命令面板
  • 通知:回复、提及、投票里程碑三类通知,未读数以 Redis 计数维护
  • 基础治理:举报、删帖、封禁、版主操作日志

验收标准

  • 九个核心页面 SSR 全部 200,深链(≥5 级菜单)能直出完整 HTML,不依赖客户端补齐
  • 后台新增一个菜单节点后,前台立即出现入口,点击落到骨架页而非 404
  • 发帖到被搜索到,端到端 ≤ 5 秒(outbox → worker → Meilisearch)
  • 投票接口在重复请求下结果一致(幂等),并发 200 QPS 无数据错乱
  • 8 核 / 16GB 单机压测:列表接口 P95 ≤ 150ms,发帖 P95 ≤ 300ms
  • mysqldump + binlog 恢复演练通过,RTO ≤ 30min

上线后能演示的完整链路

新用户注册 → 创建「PHP 社区」→ 后台加一条三级菜单 directory/tools/static → 发一篇帖子 → 另开账号评论三层 → 两个账号投票看到排序变化 → 搜索「PHPStan」命中刚建的页面与帖子 → 收到回复通知。

主要风险

  • 菜单 slug 一旦发布就不能改,若早期没留重定向表,后期改版会大面积 404。
  • 把所有服务塞进一台机器,Meilisearch 与 MySQL 争内存是最常见的翻车点。
  • 树形评论若第一版不做懒加载,深层帖子会把响应体撑到几百 KB。
  • 热度公式若不写死在一处并留离线校准任务,Redis 与 MySQL 计数会长期漂移。

以后开发什么

V1.0 之后按「把体验做厚 → 做个性化 → 做治理 → 做生态」推进。每个版本都有明确的主题与可演示链路,详细内容见版本路线图。

V1.0

第一版

第一版 · 可上线的闭环

能注册、能建社区、能无限级地组织内容、能发帖能被评论

涉及模块:9 个 · 新增数据表:26 张

看详情 →
V1.1

互动与富媒体

从「能看」到「愿意留下」

涉及模块:2 个 · 新增数据表:10 张

看详情 →
V1.2

个性化与体验打磨

让每个社区像独立站点,让每个用户看到想看的内容

涉及模块:1 个 · 新增数据表:4 张

看详情 →
V1.3

治理与运营增强

人多了以后,靠工具而不是靠人肉

涉及模块:1 个 · 新增数据表:5 张

看详情 →
V2.0

开放生态与联邦

让第三方和别的社区都能接进来

涉及模块:1 个 · 新增数据表:7 张

看详情 →

需求差距矩阵

逐条需求 × 当前状态。可按状态或领域筛选。口径说明:done = 打开页面就能看到效果;partial = 设计或原型就绪但缺真实实现;todo = 尚未开始。

状态领域命中 82 条

界面与菜单系统

三栏布局、无限级 megamenu、slug 独立页 —— 本次改造的核心

R-UI-01

三栏布局为主体

左栏导航 / 中栏内容 / 右栏辅助信息,左右吸顶。

CommunityShell 与文档站布局均已按三栏实现,xl 断点三栏、lg 两栏、移动端单栏。

已交付V1.0
R-UI-02

单社区页

每个社区一套独立站点:自有 logo、主题色、左右栏与菜单。

/c/[community] 已可用,PHP / Vue / Rust / MySQL / Ubuntu 五个社区结构各异。

已交付V1.0
R-UI-03

无限级横向 megamenu

一级横向排列,悬停展开面板,分组分列,子级继续向右飞出,深度不设上限。

MegaMenu + MegaFlyout 递归组件;PHP 社区已有 5 级示例(网址大全 → 工具链 → 静态分析 → PHPStan)。

已交付V1.0
R-UI-04

每个菜单一个独立 slug 页

菜单叶子各自是独立路由与独立 SFC,按需动态加载。

menuRegistry 注册表 + defineAsyncComponent;未登记的 slug 回退到自动生成的骨架页,不返回 404。

已交付V1.0
R-UI-05

菜单后台可配

运营在后台增删改菜单,无需开发介入。

数据结构与落库表设计已完成(community_menu_items / community_menu_apps / pages),后台管理界面未做。

部分完成V1.0
R-UI-06

社区主题色切换

切社区整页换肤,突出独立站点感。

通过 --c-brand / --c-brand-dark / --c-brand-soft 三个 CSS 变量注入,子树全部引用变量。

已交付V1.0
R-UI-07

移动端菜单降级

窄屏把 megamenu 收起为递归折叠树。

MegaTree 递归折叠,按深度缩进,仅展开当前分支。

已交付V1.0
R-UI-08

深链回溯与站点地图

深链可回到上级,并自动生成 sitemap 供搜索引擎收录。

按最新决策,面包屑已全站移除(见 R-UI-20),回溯改由 StubPage 的「上级」单链承担;sitemap.xml 生成脚本待补。

部分完成V1.0
R-UI-09

深色模式

跟随系统 + 手动切换,主题色自动适配对比度。

需要把现有硬编码颜色收敛到 CSS 变量后再做主题切换。

未开始V1.2
R-UI-10

命令面板(⌘K 搜索跳转)

一键跳到任意社区 / 菜单 / 页面。

依赖 Meilisearch 索引与菜单树接口。

未开始V1.0
R-UI-11

「信息优先」视觉语言重做

去掉渐变、大圆角、大留白与全大写小标签,改为带灰画布 + 纯白卡片 + 1px 实描边 + 紧凑字阶。

v3 全站重做完成:行动色收敛为单一暖橙红 #d93d16,正文链接单独用 #0b6bcb,其余全部中性灰;静态卡片不再用阴影。

已交付V1.0
R-UI-12

全站响应式与自适应

移动端 → 平板 → 桌面三档形态,窄屏不做「缩小版桌面」。

文档与社区页断点为 1024 / 1280;目录页(/c)改为容器查询,因为它嵌在布局中栏里,宽度由布局决定而与视口无关。

已交付V1.0
R-UI-13

设计令牌单一来源

颜色、圆角、阴影、字体全部收敛为令牌,改一处全站生效。

main.css 的 @theme 是唯一来源;另已把手写 SVG 图表里 230 处旧色值全部替换为新令牌取值。

已交付V1.0
R-UI-14

界面原子组件

头像、加入按钮、投票控件、帖子卡、目录卡与行等可复用件。

CommunityAvatar / JoinButton / VoteRail / PostCard / DirectoryCard / DirectoryRow 已落地并被目录页与社区页复用。

已交付V1.0
R-UI-15

组件类的级联层归属

设计系统的组件类必须落在 @layer components 内,否则工具类失效。

Tailwind 4 工具类住在 @layer utilities;无层样式优先于任何 @layer。修前 .r-chip 让 class 里的 hidden 永久失效,手机上领域标签白占 88px 并把「加入」按钮顶出卡片被裁。

已交付V1.0
R-UI-16

布局自动验收

多视口断言:无横向溢出、无内容被裁、表头与数据行列右边界一致。

在 320 → 1920 共 14 个宽度 × 14 条路由 = 196 项上跑自动断言,全部通过。判据取自实测:目录页中栏 349 → 653px,简介列 162 → 184px,列右边界像素级一致。

已交付V1.0
R-UI-17

社区页免 hero:顶栏与 megamenu 直接相邻

取消单社区页的品牌带(色带 + 头像 + 一句话 + 统计),把 megamenu 提到顶栏正下方,由顶栏 logo 承担「社区是谁」。

原hero把社区名、头像、简介各说了一遍,而这四样顶栏与左右栏都已具备 —— 首屏被 128px 重复信息占掉。实测改后 megamenu 顶边 = 顶栏底边 = 57px(紧贴,无缝隙)。左栏原本还列了一份「社区导航」,与 megamenu 是同一批条目,一并删掉,换成「我的订阅」与「本社区热门标签」(后者取自信息流真实标签分布,是菜单给不了的信息)。

已交付V1.0
R-UI-18

顶栏三段式:标识 / 搜索居中 / 操作贴右

站内搜索在标识与操作组之间居中(上限 560px),加入与发帖恒贴右端。

修前搜索用了「flex-1 + max-w + mx-auto」,auto margin 与 max-width 冻结顺序让留白偏向一侧,1440 下左右留白 159/317 且操作组被挤在中间,右侧空出 611px。改成两层结构(外层 flex-1 负责居中、内层封顶 560px)后,768 → 1920 实测左右留白均为 12/12。

已交付V1.0
R-UI-19

响应式栅格必须有基础列定义

凡使用 sm/md/lg:grid-cols-N 的栅格,必须同时给出基础 grid-cols-1。

隐式单列的轨道尺寸是 auto(= min-content),宽内容会把轨道顶破;grid-cols-1 等于 minmax(0,1fr),最小值为 0 才能真正收缩。全仓 53 处响应式栅格已补齐,并用「改动行只允许插入一个 token」的方式逐行校验,避免批量脚本误伤。典型受害例:/ui 的 URL 规范表 min-content 500px,两栏布局每栏最多 436px,被 overflow-hidden 裁掉 64~204px 且任何视口都塞不下 —— 该表改为整行铺开。

已交付V1.0
R-UI-20

全站移除面包屑

取消「A / B / C」路径链,位置感由菜单选中态与页面标题承担。

Breadcrumb 组件与 3 处引用(StubPage、菜单页、帖子详情页)已删除;StubPage 改为「第 N 层」层级芯片 + 单个上级链接,属于回退入口而非路径链。同步修正了 /ui、/modules、/roadmap、/prototype 与 R-UI-08 中共 10 处描述面包屑的文案与图注。

已交付V1.1
R-UI-21

顶栏语言切换器

任一页面可一键切换语言,切换后停留在等价路径。

桌面端放在右侧操作组内(地球图标 + 语言短码),移动端在抽屉里并列「社区目录 / 社区演示」。控件宽度固定为 62px,避免中英文字宽不同导致顶栏跳动;菜单里同时列出已启用语言与「还有 N 种待启用」。实现见 /tasks 的 UI-21。

已交付V1.2

用户与身份

注册、登录、会话、资料与信任等级

R-ID-01

注册与登录

邮箱注册 + 密码登录,argon2id 哈希。

表结构(users / user_credentials)已设计完成。

未开始V1.0
R-ID-02

会话管理

HttpOnly Cookie + Redis 会话,支持一键吊销全部设备。

需在 Rust 侧实现会话中间件。

未开始V1.0
R-ID-03

个人资料与头像

昵称、简介、链接、头像上传与裁剪。

依赖本地媒体目录与图片处理流程。

未开始V1.0
R-ID-04

信任等级 TL0–TL4

按活跃度与质量解锁权限、限制发帖频率。

规则已在模块文档中定义,未实现。

未开始V1.0
R-ID-05

第三方登录

GitHub / 微信等 OAuth 登录。

与开放平台的 OAuth 服务端能力一起做更划算。

未开始V2.0
R-ID-06

双因素认证

TOTP 二次验证。

面向管理员的强制 2FA 优先。

未开始V2.0

社区与组织

社区创建、规则、版主与订阅

R-CM-01

社区创建与资料

社区名、slug、简介、主题色、封面、创建者。

五个社区的展示数据目前是前端静态数据(communityMenus.ts)。

未开始V1.0
R-CM-02

社区规则与版主

规则列表、版主任命与权限位掩码。

展示层已完成(右栏规则与版主卡片);真实权限校验未实现。

部分完成V1.0
R-CM-03

订阅与我的社区

订阅 / 退订,个人首页聚合已订阅社区。

左栏已有「我的订阅」占位,未接数据。

未开始V1.0
R-CM-04

社区目录

全站社区发现与排行。

前端已按万级规模重做(见 R-CM-05);缺真实数据源与服务端分页。

部分完成V1.0
R-CM-05

万级社区目录

上万社区下的检索、领域分类、排序与阅读密度切换。

按 1.3 万条数据实测:搜索(匹配名称/简介/话题/领域)+ 16 个领域带计数 + 4 档排序 + 3 档密度 + 分批渲染 + URL query 同步,服务端可直出已筛选的首屏。

已交付V1.0
R-CM-06

目录社区统一适配

未开通自定义站点的社区也必须能打开,而不是 404。

toCommunity 适配器把目录社区转换为标准站点骨架(左栏导航 + 通用 megamenu + 规则/版主),任意 slug 均可打开,叶子落到通用骨架页。

已交付V1.0
R-CM-07

目录检索与分页后端

Meilisearch 召回 + MySQL keyset 分页 + 聚合计数缓存。

前端已按该契约设计(不用 OFFSET、计数走 Redis 聚合缓存);后端未实现。

未开始V1.0
R-CM-08

目录密度与简介列宽预算

列表行的列宽由文字实际长度反推,简介文案反过来服从列宽。

实测 1440 视口下中栏 651px、简介列 184px、中文 12.75px/字 → 简介压到 ≤14 字;变体短语 ≤8 字、收尾短语 4 字。修前简介 340px、89% 的行在句子中间被切断。

已交付V1.0

内容与互动

发帖、投票、树形评论、社交关系与富媒体

R-CT-01

帖子模型(文本/链接/图片/投票)

四种帖子类型与富文本正文。

数据模型已定义(posts / post_revisions / post_tags / post_polls),DemoPost 类型也已在前端落地;缺真实写入。

部分完成V1.0
R-CT-02

Markdown 渲染

服务端渲染 + 白名单净化,杜绝 XSS。

需在 Rust 侧选型渲染库并做白名单。

未开始V1.0
R-CT-03

投票三态(赞/踩/撤销)

幂等投票,乐观更新与失败回滚。

原型页 /prototype 已可交互(含动画与回滚);后端接口未实现。

部分完成V1.0
R-CT-04

树形评论

任意深度嵌套、单条折叠、全部折叠。

社区帖子详情页已可渲染 120 条评论的三层分布树(深度硬上限 5 层,缩进用容器上的 --thread-step 变量逐层累加,8px 手机 / 12px 桌面);真实存储与分页加载未实现。

部分完成V1.0
R-CT-05

评论排序四档

最佳 / 最新 / 最早 / 争议。

原型已实现排序切换(含子树同步排序);服务端排序算法未实现。

部分完成V1.0
R-CT-06

收藏与关注

收藏帖、收藏夹、关注用户、粉丝列表。

表结构已设计(saved_items / save_folders)。

未开始V1.1
R-CT-07

私信

一对一私信、已读回执、未读角标。

表结构已设计(dm_conversations / dm_messages)。

未开始V1.1
R-CT-08

富媒体上传

图片多尺寸、视频转码、粘贴上传。

依赖本地媒体目录与 worker 转码队列。

未开始V1.1
R-CT-09

勋章与签到

成就体系与连续签到。

表结构已设计(badges / user_badges / daily_checkins)。

未开始V1.1
R-CT-10

帖子详情页

列表里的帖子可点开,落到 /c/{community}/post/{id},正文与评论区同页。

详情页仍套在 CommunityShell 里(顶栏、megamenu、左右栏全保留),列表与详情拿到的是**同一个**帖子对象(同一套 feedFor/findPost),避免两处数据分叉。评论数显示为「391 条评论 · 已加载前 120 条」—— 391 是热度指标,120 是实际挂载量,两者本来就不同,不能只显示一个。写入未接。

部分完成V1.0

搜索与发现

Meilisearch 检索与个性化信息流

R-SE-01

Meilisearch 索引同步

帖子/评论/用户/页面进索引,由 outbox 驱动。

索引字段与同步策略已设计,未接入。

未开始V1.0
R-SE-02

站内搜索

全站与社区内检索,支持筛选与高亮。

头部搜索框为占位 UI。

未开始V1.0
R-SE-03

热门搜索词

热搜榜与搜索历史。

表结构已设计(hot_searches / search_history)。

未开始V1.0
R-SE-04

个性化信息流

基于订阅与兴趣的轻量推荐。

需要先有真实行为数据才能谈推荐。

未开始V1.2

治理与运营

举报审核、封禁申诉、自动化规则与数据看板

R-MD-01

举报与审核队列

举报聚合、优先级、批量处置。

V1.0 只做基础版(举报 + 删帖 + 封禁),完整队列在 V1.3。

未开始V1.0
R-MD-02

封禁与申诉

封禁、禁言、申诉复议流程。

表结构已设计(bans / appeals)。

未开始V1.3
R-MD-03

自动化规则

关键词、域名黑白名单、新号限制、刷票识别。

需先积累真实举报数据。

未开始V1.3
R-MD-04

运营数据看板

日活、发帖、评论、投票率、留存与处置时长。

必须走离线聚合表,禁止直查主库。

未开始V1.3
R-MD-05

审计日志

敏感操作留痕且不可篡改。

表结构已设计(audit_logs)。

未开始V1.0

技术设施

Rust API、MySQL、Redis、Meilisearch、Nginx 与部署

R-INF-01

Nuxt 4 SSR 前端骨架

Vue 3 SFC + Tailwind 4,服务端渲染与动态加载。

本项目即该骨架,构建与 SSR 均已验证通过。

已交付V1.0
R-INF-02

组件库与设计令牌

卡片、标签、胶囊按钮、分段控件、头像、投票控件、帖子卡等基础件。

v3 已把颜色/圆角/阴影/字体全部收敛到 main.css 的 @theme(唯一来源),组件层用 .r-* 原子类与 9 个 Vue 组件实现。

已交付V1.0
R-INF-03

Rust API(axum)

业务唯一入口,按领域分模块,无状态可扩展。

领域模块划分已完成设计(identity/community/content/comment/vote/search/notify/moderation)。

未开始V1.0
R-INF-04

MySQL 库表与迁移

MySQL 8.4 + sqlx 迁移脚本。

45 张表的字段、索引与注释已完成设计(schema.ts),DDL 与迁移文件未生成。

部分完成V1.0
R-INF-05

Redis 接入

会话、缓存、ZSet 排行、限流计数、轻量队列。

键名规范与失效策略已设计。

未开始V1.0
R-INF-06

Meilisearch 接入

索引定义、同步 worker、查询封装与降级。

降级策略已定义(失败回落 MySQL LIKE)。

未开始V1.0
R-INF-07

Nginx 与 TLS 部署

反向代理、静态资源、限流、证书自动续期。

Nginx 配置草案已在架构页给出,未落地。

未开始V1.0
R-INF-08

systemd 与备份

api/web/worker 三类服务托管,mysqldump + binlog 备份。

服务划分与备份策略已设计。

未开始V1.0
R-INF-09

outbox 事件与 worker

事务内写事件,worker 轮询投递,保证最终一致。

表结构(outbox_events)与消费流程已设计,未实现。

部分完成V1.0
R-INF-10

日志与监控告警

请求 ID 贯穿全链路,P95 与磁盘水位告警。

单机部署下磁盘与内存水位是首要告警项。

未开始V1.0

多语言

语言协商与切换、社区的多语言版本与专属 slug、翻译覆盖

R-I18N-01

语言注册表与可扩展

支持哪些语言只有一处定义;默认启用中英,其余语言预先登记、可随时启用。

app/utils/locale.ts 的 LOCALES 登记 10 种语言(zh-CN / en 启用,zh-TW / ja / ko / fr / de / es / ru / ar 预登记)。每种语言带 htmlLang 与 dir,切换器底部显式标出「还有 N 种语言待启用」—— 不假装只有两种。

已交付V1.2
R-I18N-02

浏览器语言协商

未登录也能得到正确语言,首屏即正确、不闪烁。

解析 Accept-Language(按 q 降序、忽略 q=0、前缀匹配),服务端与客户端调用同一个 negotiateLocale(),因此 SSR 输出的 HTML 与 hydration 结果一致。cookie ruyi_lang 优先于浏览器声明,有效期 1 年。未覆盖的语言回落到 zh-CN(本站在中文语境下生长,把陌生语言送到英文更远)。协商结果一律用 302 —— 结果依赖请求头,301 会被中间层缓存并扩散。

已交付V1.2
R-I18N-03

URL 语言前缀

任意页面首段路径恒为语言码,使「多语言版本」成为结构性事实。

全部页面收敛到 app/pages/[locale]/。旧路径(/ui、/c/php)在用户没有显式选择语言时 301 到默认语言 /zh-CN/…(目标确定,可安全缓存以收敛权重);若用户选过语言(ruyi_lang cookie)则改用 302 送到该语言。形状像语言码但并不存在的(/xx-YY/ui)返回 404 而不是重定向 —— 不掩盖「该语言没有这个版本」。

已交付V1.2
R-I18N-04

手动切换并保持当前页

一键换语言,停留在等价页面而非弹回首页。

切换只改 URL 前缀、走客户端路由,不整页刷新,滚动位置与已展开的菜单状态都保留。社区 slug 在目标语言下不同时(community_locales.slug)用目标 slug 重拼,映射缺失则回落该社区首页而不是 404。

已交付V1.2
R-I18N-05

界面词典与键集合校验

导航、按钮、空态、错误提示全部可随语言切换,且不允许漏翻。

messages.ts 把 zh-CN 与 en 两份词典写在同一个文件里,配 assertMessageParity() 断言键集合完全一致 —— 分成两个文件时,「少一个键」在 TypeScript 里不会报错。开发环境缺键渲染成 ⟦key⟧,一眼可见。当前 263 个键已对齐。错误页(4xx/5xx)也走同一套词典:app/error.vue 不再暴露中间件里那句中文 statusMessage,改按语言取文案与按钮,否则英文读者撞到 404 时会看到一整句中文。

已交付V1.2
R-I18N-06

社区内容本地化

切到英文后社区名、副标题、菜单、规则、目录里的万个社区全部是英文。

数据字符串走「原文 → 英文」术语表(对应未来真实的 translations 表),界面字符串走词典,两条路分开:前者按 id 稳定、可增量翻译,后者由构建期校验兜底。目录页英文版残留汉字已从 1042 降到个位数(剩下的都是模板源码注释,生产构建会被剥离)。

已交付V1.2
R-I18N-07

信息流与评论按语言生成

英文社区页里的帖子与评论是英文,而不是「英文界面 + 中文帖子」。

文案池按语言拆分,locale 只进入 makeFeed 的随机种子,不进入正文与评论树的生成 —— 因此中英两版的剧情结构(帖子数、评论条数、最大深度)完全一致,只有文案不同,切语言不会像「换了一个社区」。

已交付V1.2
R-I18N-08

hreflang 与 html lang

搜索引擎知道这些是同一页的不同语言版本,而不是重复内容。

app.vue 统一输出 htmlAttrs.lang / dir 与每页的 hreflang alternate(含 x-default),页面标题与描述也按语言输出。这一条最初整批漏掉:11 个文档页的 <title> 各自写死中文,现已收敛到 useDocHead() 一处。

已交付V1.2
R-I18N-09

文档正文翻译(12 页)

把设计文档正文译成英文。

尚未开始。当前英文版文档页会显示一条「本页正文尚未翻译」的横幅,明确说明界面、导航与社区内容已双语、只有长篇正文仍在中文 —— 不假装已翻译。翻译工作对应 /tasks 的 I18N-10。

未开始V1.3

交付与质量

设计文档、接口契约、测试、CI 与压测

R-QA-01

产品与技术设计文档站

竞品调研、模块设计、架构、数据表、版本规划。

本站即交付物,11 个页面全部可访问。

已交付V1.0
R-QA-02

交互原型

投票、树形评论、排序的可点击演示。

/prototype 可交互;另有 /c 下的完整界面演示。

已交付V1.0
R-QA-03

数据表设计

字段、约束、索引与实体关系图。

/database 页含 SVG ER 图与 45 张表的完整定义(MySQL 语法)。

已交付V1.0
R-QA-04

架构与部署设计

分层架构、核心链路、非功能目标与部署演进。

/architecture 与 /stack 两页,全部按实际选型编写。

已交付V1.0
R-QA-05

接口契约(OpenAPI)

前后端约定的接口文档。

未开始,建议由 Rust 侧用 utoipa 生成。

未开始V1.0
R-QA-06

单元与集成测试

领域逻辑单测 + 关键链路集成测试。

投票幂等、评论树查询、菜单 slug 唯一性应优先覆盖。

未开始V1.0
R-QA-07

CI 流水线

构建、测试、镜像与自动部署。

至少做到 push 即跑测试与构建。

未开始V1.0
R-QA-08

压测与容量验证

验证单机承载与缓存命中率目标。

验收标准已定义(列表 P95 ≤ 150ms,发帖 P95 ≤ 300ms)。

未开始V1.0
R-QA-09

AI 可执行任务分解

把 UI 与设计文档转换为可分派、可验收的工程任务,含路由设计与表设计。

/tasks 已交付:58 条任务 / 10 个分类,每条含前置依赖、涉及文件或表、执行步骤与可客观判定的验收标准;按依赖拓扑给出并行开工批次,并支持导出 Markdown 直接交给执行者。

已交付V1.2

明确不做的事

范围管理的另一半是「敢于说不」。以下这些在 V1 阶段直接排除,避免把时间花在不会提升验证效率的地方。

自研消息队列 / 搜索引擎 / 对象存储用 Redis + Meilisearch + 本地磁盘即可覆盖 V1 的需求,自研只会拖慢进度。
Kubernetes 编排单机到几台机器的规模用 systemd + Nginx 足够,K8s 会增加大量运维与认知成本。
前端微前端 / Module Federation一个 Nuxt 应用 + 动态组件加载已经解决「页面按需拼装」问题。
原生移动 App响应式 Web + PWA 已覆盖主要场景,原生 App 留待验证产品价值之后再谈。
自建视频转码集群V1 只做图片与短链视频,长视频交给外部托管。
复杂的推荐模型训练V1.2 只用规则 + 协同信号的轻量打分,不做模型训练基础设施。