# 论坛社交互动功能增强 Spec
## Why
当前 Xiuno BBS 缺乏 论坛应有的核心社交互动功能:版块无分区归类导致版块多时难以管理、帖子缺乏点赞/收藏等互动手段导致用户参与度低、用户之间无法关注导致社区粘性不足。这些是论坛系统的基本功能,需要作为核心功能内置。
## What Changes
- **版块分区**:在 `bbs_forum` 表新增 `fup` 字段支持两级结构(分区→版块),分区作为分组容器不可直接发帖
- **帖子点赞**:新增 `bbs_post_like` 表,支持对主题帖和回帖都点赞,`bbs_thread` 和 `bbs_post` 表新增 `likes` 计数字段
- **帖子收藏**:新增 `bbs_thread_favorite` 表,支持收藏主题帖,`bbs_thread` 新增 `favorites` 计数字段,`bbs_user` 新增 `favorites` 计数字段
- **用户关注**:新增 `bbs_user_follow` 表,支持关注/取关,`bbs_user` 新增 `follows`/`followeds` 计数字段
- **通知系统**:新增 `bbs_notify` 表,关注用户发帖时推送通知,点赞/收藏时可选择推送通知
- **动态流**:新增"我的动态"页面,展示关注用户的最新帖子
## Impact
- Affected code:
- `install/install.sql` — 新增 4 张表,修改 3 张表结构
- `model/forum.func.php` — 分区支持、树形格式化
- `model/thread.func.php` — 点赞/收藏计数
- `model/user.func.php` — 关注计数
- `route/thread.php` — 点赞/收藏 API
- `route/user.php` — 关注 API、动态流
- `route/my.php` — 我的收藏、我的关注、我的通知
- `view/htm/forum.htm` — 分区展示
- `view/htm/thread.htm` — 点赞/收藏按钮
- `view/htm/post_list.inc.htm` — 回帖点赞按钮
- `view/htm/user.htm` — 关注按钮
- `admin/route/forum.php` + `admin/view/htm/forum_update.htm` — 分区管理
- `lang/zh-cn/bbs.php` — 新增语言项
## ADDED Requirements
### Requirement: 版块分区(两级:分区→版块)
系统 SHALL 支持两级版块结构,分区作为分组容器不可直接发帖,版块归属分区并可发帖。
#### Scenario: 创建分区
- **WHEN** 管理员在后台创建版块时选择类型为"分区"
- **THEN** 该版块的 `fup=0`,不显示发帖入口,仅作为分组容器
#### Scenario: 创建版块并归属分区
- **WHEN** 管理员创建版块时选择上级分区
- **THEN** 该版块的 `fup` 设置为分区 fid,首页按分区分组展示
#### Scenario: 首页分区展示
- **WHEN** 用户访问首页
- **THEN** 版块列表按分区分组展示,未归属分区的版块归入"默认分区"
#### Scenario: 删除分区
- **WHEN** 管理员删除分区
- **THEN** 该分区下的版块的 `fup` 重置为 0,版块和帖子不被删除
### Requirement: 帖子点赞
系统 SHALL 支持对主题帖和回帖点赞,每个用户对同一帖子只能点赞一次,可取消点赞。
#### Scenario: 点赞主题帖
- **WHEN** 登录用户点击主题帖的点赞按钮
- **THEN** 记录点赞关系,主题帖 `likes+1`,按钮变为已点赞状态
#### Scenario: 取消点赞
- **WHEN** 已点赞用户再次点击点赞按钮
- **THEN** 删除点赞记录,帖子 `likes-1`,按钮恢复未点赞状态
#### Scenario: 点赞回帖
- **WHEN** 登录用户点击回帖的点赞按钮
- **THEN** 记录点赞关系,回帖 `likes+1`,主题帖 `likes` 也 +1(主题 likes 为所有回帖 likes 之和)
#### Scenario: 未登录用户
- **WHEN** 未登录用户点击点赞按钮
- **THEN** 提示需要登录
### Requirement: 帖子收藏
系统 SHALL 支持对主题帖收藏,每个用户对同一主题只能收藏一次,可取消收藏。
#### Scenario: 收藏主题帖
- **WHEN** 登录用户点击主题帖的收藏按钮
- **THEN** 记录收藏关系,主题帖 `favorites+1`,用户 `favorites+1`
#### Scenario: 取消收藏
- **WHEN** 已收藏用户再次点击收藏按钮
- **THEN** 删除收藏记录,主题帖 `favorites-1`,用户 `favorites-1`
#### Scenario: 查看我的收藏
- **WHEN** 用户访问"我的收藏"页面
- **THEN** 展示用户收藏的主题帖列表,按收藏时间倒序
### Requirement: 用户关注
系统 SHALL 支持用户关注其他用户,不可关注自己,可取消关注。
#### Scenario: 关注用户
- **WHEN** 登录用户点击其他用户的关注按钮
- **THEN** 记录关注关系,当前用户 `follows+1`,被关注用户 `followeds+1`
#### Scenario: 取消关注
- **WHEN** 已关注用户再次点击关注按钮
- **THEN** 删除关注记录,当前用户 `follows-1`,被关注用户 `followeds-1`
#### Scenario: 查看我的关注/粉丝
- **WHEN** 用户访问个人页面的关注/粉丝列表
- **THEN** 展示关注列表和粉丝列表
### Requirement: 通知系统
系统 SHALL 在以下事件发生时给相关用户推送站内通知:关注用户发新帖、帖子被点赞、帖子被收藏。
#### Scenario: 关注用户发帖通知
- **WHEN** 被关注用户发表新主题帖
- **THEN** 所有关注者收到一条通知"xxx 发表了新帖: [主题标题]"
#### Scenario: 帖子被点赞通知
- **WHEN** 用户的帖子被他人点赞
- **THEN** 帖子作者收到一条通知"xxx 赞了你的帖子"
#### Scenario: 帖子被收藏通知
- **WHEN** 用户的帖子被他人收藏
- **THEN** 帖子作者收到一条通知"xxx 收藏了你的帖子"
#### Scenario: 查看通知
- **WHEN** 用户访问通知页面
- **THEN** 展示未读和已读通知列表,未读通知标记为已读
#### Scenario: 通知角标
- **WHEN** 用户有未读通知
- **THEN** 导航栏通知图标显示未读数量角标
### Requirement: 动态流
系统 SHALL 提供"我的动态"页面,展示关注用户的最新帖子。
#### Scenario: 查看动态
- **WHEN** 用户访问"我的动态"页面
- **THEN** 展示所有关注用户发表的主题帖,按发帖时间倒序,分页展示
## MODIFIED Requirements
### Requirement: bbs_forum 表结构
在原有字段基础上新增 `fup` 字段:
- `fup` int(11) unsigned NOT NULL DEFAULT '0' — 上级分区 fid,0 表示分区或未归类版块
- `type` tinyint(1) NOT NULL DEFAULT '0' — 0=版块 1=分区
### Requirement: bbs_thread 表结构
新增字段:
- `likes` int(11) NOT NULL DEFAULT '0' — 点赞数
- `favorites` int(11) NOT NULL DEFAULT '0' — 收藏数
### Requirement: bbs_post 表结构
新增字段:
- `likes` int(11) NOT NULL DEFAULT '0' — 点赞数
### Requirement: bbs_user 表结构
新增字段:
- `follows` int(11) NOT NULL DEFAULT '0' — 关注数
- `followeds` int(11) NOT NULL DEFAULT '0' — 粉丝数
- `favorites` int(11) NOT NULL DEFAULT '0' — 收藏数
## REMOVED Requirements
无移除项,所有新增功能与现有系统兼容。