Files
jiang13-forum/docs/rebuild-spec/02-features.md
freefire 58b94df50c chore: 主题改媒体查询并清理未挂载 API
去掉 head 防闪脚本;删除论坛 JSON CRUD 与 crawler,仅保留机器入口;用户向文档对齐 SSR。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-30 05:10:23 +08:00

216 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 02 · 功能清单(验收级)
> **读者**:实现与验收
> **前置**[01-product.md](01-product.md)
> **交叉**[05-business-rules.md](05-business-rules.md)、[06-pages-ux.md](06-pages-ux.md)
> **源码对照**[`frontend/src/App.tsx`]((仅 mainfrontend/src/App.tsx)、[`router/router.go`](../../routers/setup.go)、[`README.md`](../../README.md)
用复选框做验收;重构完成时应全部可勾选(或书面声明砍掉的功能)。
---
## A. 浏览与布局
- [x] 三栏布局:左导航 / 中 Feed / 右栏小组件 — SSR桌面≤900px 隐藏右栏)
- [x] 浅色 / 暗色主题;跟随系统偏好并本地记忆 — CSS `prefers-color-scheme` + `data-theme` 显式覆盖;顶栏循环:跟随系统 / 浅色 / 暗色(`j13-theme`
- [ ] 响应式:平板/手机收起侧栏
- [ ] 长列表虚拟滚动或等价流畅方案
- [x] Feed 排序:`latest`(最新发帖)/ `reply`(最新回复)/ `hot`(热门)
- [x] 板块筛选:全部 + 单板块
- [ ] 列表样式可配:`title` | `excerpt` | `thumbnail`
- [x] 搜索:关键词、标签、作者、仅标题(`title_only`)— SSR Feed 面板(`/` / `/board/:id`
- [x] 右栏:热门帖、标签云、最新评论、最新用户、友链(可开关排序)— SSR 热门固定 + `aside_widgets`Admin `/admin/settings` 侧栏组件编辑器
- [x] 登录用户右栏/侧边:签到与抽奖入口 — SSR 右栏条(钱包详情仍在 `/profile#wallet`
- [ ] 下拉刷新(移动端)
- [x] 可选伪静态:`/post/123.html` 等形式(后缀后台可配)— SSR `/admin/settings` 伪静态;公开路径 301 规范 URL
- [x] 404 页
---
## B. 认证与个人中心
- [x] 注册(用户名、密码、昵称、邮箱;可选邮箱验证码)— SSR `/register`
- [x] 图形验证码接口(注册流程)— SSR 注册页强制;`GET /api/captcha` + `POST /api/register` 校验
- [x] 登录 / 登出opaque session Cookie `jiang13_session`)— SSRSameSite=Lax登出/禁言/改密吊销
- [x] 忘记密码:邮箱验证码 + 重置 — SSR `/forgot-password`(依赖 SMTP 就绪)
- [x] 注册配置:邮件就绪时强制验证码;安装后开放注册(不依赖 SMTP
- [x] ~~首个用户自动成为管理员~~ → 改为仅 `/install` 创建管理员
- [x] 个人中心:改昵称、签名、密码、上传头像、积分钱包/签到/抽奖 — SSR `/profile`(裁剪未做)
- [x] 个人活动统计:帖数、评数、收藏数、获赞 — `/profile` + `/user/:id`
- [x] 公开用户主页 `/user/:id`(无邮箱)
- [x] 禁言用户无法使用需登录写接口(中间件 + compose 门控)
---
## C. 板块
- [x] 列出板块(含帖数等展示字段)— SSR `/boards` + 侧栏 + Admin
- [x] 管理员:创建 / 改 / 删板块 — SSR `/admin/boards`
- [x] 板块名称、描述、图标、色板索引、排序
- [x] 默认板块保障(空站可引导创建)
---
## D. 帖子(通用)
- [x] 发帖:选板块、标题、标签、正文 — SSR `/compose`normal
- [x] 正文图片上传 — `/compose/upload` + Markdown 插入
- [ ] TipTap 富文本能力(见 [06-pages-ux.md](06-pages-ux.md) 编辑器节)— **本分支不做 TipTap**;改用 Markdown 工具栏渐进增强
- [x] Markdown 编辑(工具栏 + `/compose/preview`;发帖/改帖/评论共用 `shared/md_editor`)— 非 TipTap 双模
- [x] 编辑帖子(时限、锁帖约束)— SSR `/post/:id/edit`
- [x] 删除帖子 → 软删进回收站 — SSR Admin帖详情 + `/admin/trash`
- [x] 修订历史列表与单条详情(可做 diff— SSR `/post/:id/revisions`(作者/管理员;无 diff
- [x] 点赞切换;收藏切换;收藏列表 — SSR `/favorites`
- [x] 浏览量 — 详情页计数
- [x] 举报帖子 — SSR 表单 + `/admin/reports`
- [x] 内容审核状态展示(作者可见待审/被拒)— SSR 帖详情横幅 + 评论楼层标签
### D.1 帖子类型
- [x] `normal` 普通讨论 — SSR compose 默认
- [x] `question` 问答:可标记已解决 / 未解决 — SSR compose + 详情徽章与切换
- [x] `poll` 投票210 选项;单选/多选;可选截止时间;投票;作者可结束 — SSR compose + 详情卡
- [x] `bounty` 悬赏:发帖托管积分;采纳评论发奖;可退款(规则见 05— SSR compose + 详情条 + award/refund
- [x] `lottery` 抽奖帖:设定中奖人数;从评论参与者开奖 — SSR compose + 详情卡 + draw
### D.2 运营标记(管理员)
- [x] 全局置顶 / 取消 — SSR 帖详情
- [x] 版内置顶 / 取消(仅板块列表抬升)— SSR 帖详情
- [x] 精华 / 取消 — SSR 帖详情
- [x] 禁止编辑edit lock— SSR 帖详情
- [x] 禁止评论 / 结贴comments lock— SSR 帖详情
- [x] 审核通过 / 拒绝(拒绝可通知作者)— SSR `/admin/moderation`
- [x] 回收站:恢复 / 彻底删除 — SSR `/admin/trash`
---
## E. 内容门控
- [x] 编辑器可插入「登录可见」块 — compose 工具栏
- [x] 编辑器可插入「回复可见」块 — compose 工具栏
- [x] 编辑器可插入「积分可见」块(可设价格)— compose 工具栏 + prompt
- [x] 未登录:遮盖 members-only 与 reply-only 正文,保留长度提示 — 锁定壳 UI
- [x] 已登录未回复:遮盖 reply-only作者与管理员始终可见
- [x] 积分块:未解锁遮盖;`POST /post/:id/unlock` 扣积分并返回 inner HTML
- [x] 搜索 / SEO 出口对门控内容做红action不泄露正文既有
---
## F. 评论
- [x] 按帖拉取评论列表(楼层、引用目标)— SSR 帖详情;`ThreadParentID` 嵌套树 + 全局 `#floor` 缩进
- [x] 发表评论(登录);支持 `reply_to`、私密评论 — `POST /post/:id/comments`
- [ ] 游客评论(公开接口可写,字段 guest_*
- [x] 编辑评论(时限);删除评论 — SSR 帖详情入口 + `/comments/:cid/edit|delete`;作者软删进回收站
- [x] 评论点赞 — `POST /post/:id/comments/:cid/like`
- [x] 评论举报 — SSR
- [x] @ 提及 → 通知 — SSR 发评/审通调用 `NotifyCommentMentions`
- [x] 回复提醒(站内信 + 可选邮件)— SSR 发评/审通调用 `NotifyCommentPublished`
- [x] 审核中 / 被拒评论可见性规则 — 服务层已有SSR 楼层标签(作者/管理员)
- [x] 管理员:通过 / 拒绝待审评论 — SSR `/admin/moderation`(回收站/修订未迁)
---
## G. 私信与通知
- [x] 会话列表(含系统会话 peer=0— SSR `/messages`
- [x] 会话消息(分页 / before 游标)— SSR `/messages/with/:peerId`
- [x] 发送私信 — 表单 PRG用户主页「发私信」入口
- [x] 未读数(可分私信 / 通知)— 列表分项 + 导航角标
- [x] 标记会话已读 / 通知已读 / 全部已读 — 打开会话自动已读;全部标已读
- [x] 系统通知种类:`system` / `reject` / `report_result` / `reply` / `mention` / `moderation` 等(写入已有;`/messages/with/0?kind=` 筛选)
---
## H. 积分、签到、抽奖、徽章、等级
- [x] 积分流水查询 — SSR `/profile` 钱包近 N 条
- [x] 每日签到:基础 5连签每日 +1封顶 15 — `POST /profile/checkin`
- [x] 每日抽奖奖池加权0/2/5/10/20成本 0 — `POST /profile/lottery`
- [x] 积分解锁分成:读者付全额,作者约 70% — 门控 unlock 服务
- [x] 短龄同 IP 互刷拒绝分成 — `UnlockPointsBlock` / `suspiciousUnlockPair`(双方注册未满 7 天且 LastLoginIP 相同)
- [x] Exp → 等级 Lv110 — 门槛推导 + 发帖/评论/获赞加 ExpAdmin 设等级 SSR `/admin/users`
- [x] 自动徽章(注册天数 / 获赞 / 创作分成)— 种子 + `EvaluateAuto`(用户页/资料页访问时评估);无独立定时调度 UI
- [x] 限定徽章:管理员定义与授予/撤销 — SSR `/admin/badges`
- [x] 管理员调整积分、设定认证(免审)、设定等级 — SSR `/admin/users`
---
## I. 友链
- [x] 前台友链页;导航/页脚入口可配 — SSR `/links``nav_show_friend_links` / `footer_show_friend_links`
- [x] 用户申请名称、URL、Logo、是否上首页、回链页`POST /links/apply`
- [x] Logo 上传 — 表单 multipart 或 `POST /links/logo`
- [x] 我的申请列表;取消待审 — `/links`(修改待审:取消后重提)
- [x] 管理员审核:通过 / 拒绝 / 回链复检 — SSR `/admin/friend-links`(创建时可异步检测)
- [x] 管理员维护品牌友链列表 — `/admin/friend-links` 增删
---
## J. 站点单页
- [x] 公开:`/page/:slug` 列表入口nav/footer— SSR
- [x] 管理员 CRUD发布开关排序nav/footer 展示开关 — SSR `/admin/pages`
---
## K. Gitea 码桶(**后置**
> 本迭代**不做**产品化同步:不启后台定时任务、不挂管理入口。表结构与 settings 键可保留兼容。
- [ ] 后置后台开关、Base URL、Token、同步间隔
- [ ] (后置)手动同步 + 后台定时同步
- [ ] (后置)前台 `/projects` 列表与搜索
---
## L. OIDC Provider
- [ ] Discovery、JWKS、Authorize、Token、UserInfo、Logout
- [ ] 多 OAuth 客户端 CRUD密钥哈希存储PKCE 字段支持
- [ ] groups claim 映射 admin/user 组
---
## M. 媒体与存储
- [ ] 本地 uploads 或 S3 兼容存储(可热切换配置)— 后端已支持Admin 热切换 UI 未迁
- [x] 头像 / 帖图 / 站点品牌资源分类 — 上传路径 + Admin 分类筛选
- [ ] 图片展示可选 WebP 转换(`/media/thumb/...`)— 路由已有;全站默认策略未产品化
- [x] 管理后台媒体列表与删除 — SSR `/admin/media`
- [x] 媒体索引表同步 — 启动扫盘 + Admin「同步索引」
---
## N. 管理后台其它
- [x] 仪表盘:用户/帖/板块计数 + 待审帖/评 + 待处理举报 — SSR `/admin/dashboard`
- [x] 敏感词:`forum_settings.filter_words` 读写 + 热更 — SSR `/admin/settings`
- [x] 基础限流post/comment/register/login/window— SSR `/admin/settings`
- [x] 完整 Limits字数 / 编辑窗 / 分页 / 签名头像 / Feed 样式 / 新标签)— SSR `/admin/settings/content-limits`
- [x] SMTP 配置与测试信 — SSR `/admin/settings` 邮件区
- [x] 站点品牌文案名称、标语、简介、keywords、Logo 字标、ICP — SSR `/admin/settings`
- [x] Logo / Favicon / 默认 OG 图上传与清除 — SSR `/admin/settings/brand/upload|clear``<head>` favicon + og:image
- [x] SQLite 一键备份与下载 — SSR `/admin/settings`(仅 sqlite写入 data 目录后下载)
---
## O. 基础设施
- [x] `GET /health``routers/setup.go`
- [x] `robots.txt` / `sitemap.xml` — SSR 同源路径
- [x] 静态上传文件可达 — `Static /uploads` → data/uploads
- [x] 限流:发帖、评论、注册、登录、举报、私信、友链 — SSR 写路径已挂 `RateLimiter`
---
## 明确不在当前规格内(计划中可后做)
摘自 [`ROADMAP.md`](../../ROADMAP.md)**不是**现网必交验收项:
- 通知动态 UX 大幅优化
- 帖子搜索增强(组合筛选更强)
若新站一并实现,可作为加分项,不阻塞「功能对等」验收。