# 用户组审核权限 Spec
## Why
当前系统已有版块级审核(forum.audit_thread)和用户组级发帖审核(group.allow_direct_post),但缺少用户组级别的回帖审核和个人资料审核(头像、个性签名)。管理员无法按用户组精细控制哪些用户需要审核,需要补充这三项审核权限。
## What Changes
- 在 `bbs_group` 表新增 `allow_direct_post`(已存在)、`allow_direct_reply`、`allow_direct_profile` 三个字段
- 在 PermissionService 中注册三个审核权限项,归入新的"审核权限"分组
- 在用户组编辑页面(group_update.htm)显示审核权限 checkbox
- 在发帖路由(thread.php create)中检查用户组的 `allow_direct_post` 权限(已有 AuditService 逻辑)
- 在回帖路由(post.php create)中检查用户组的 `allow_direct_reply` 权限,需要审核时设置 audit_status=0
- 在个人资料更新路由(my.php profile/avatar)中检查用户组的 `allow_direct_profile` 权限,需要审核时暂存变更待审核
- 新增 `bbs_user_profile_audit` 表存储待审的个人资料变更
- 在后台审核页面增加"个人资料审核"tab
- 在 UpgradeService 中添加数据库升级步骤
- 前台用户更新资料时,若需审核则提示"资料已提交,等待审核"
## Impact
- Affected code:
- `lib/PermissionService.php` - 新增审核权限项
- `admin/route/group.php` - 保存审核权限
- `admin/view/htm/group_update.htm` - 显示审核权限
- `route/thread.php` - 发帖审核检查
- `route/post.php` - 回帖审核检查
- `route/my.php` - 个人资料审核检查
- `lib/security/AuditService.php` - 扩展审核类型
- `admin/route/security.php` - 增加个人资料审核
- `admin/view/htm/security_audit.htm` - 增加个人资料审核tab
- `lib/UpgradeService.php` - 数据库升级
- `install/install.sql` - 更新建表语句
## ADDED Requirements
### Requirement: 用户组审核权限配置
系统 SHALL 在用户组编辑页面提供三个审核权限 checkbox:
- `allow_direct_post`:发帖审核(0=需审核,1=直接发布)
- `allow_direct_reply`:回帖审核(0=需审核,1=直接发布)
- `allow_direct_profile`:个人资料审核(0=需审核,1=直接更新)
#### Scenario: 管理员编辑用户组审核权限
- **WHEN** 管理员在用户组编辑页面勾选/取消审核权限
- **THEN** 系统保存权限设置到 group_permission 表
#### Scenario: 默认值
- **WHEN** 新安装系统
- **THEN** 管理员组(gid=1)、超级版主组(gid=2)默认 allow_direct_post=1, allow_direct_reply=1, allow_direct_profile=1
- **THEN** 普通用户组(gid=101-105)默认 allow_direct_post=1, allow_direct_reply=1, allow_direct_profile=1
### Requirement: 发帖审核执行
系统 SHALL 在用户发帖时检查其用户组的 allow_direct_post 权限:
- 若 allow_direct_post=0,帖子 audit_status 设为 0(待审核)
- 若 allow_direct_post=1,帖子 audit_status 设为 1(通过)
#### Scenario: 需审核用户发帖
- **WHEN** 用户所在用户组 allow_direct_post=0 且发帖
- **THEN** 帖子 audit_status=0,提示"帖子已提交,等待审核"
#### Scenario: 免审核用户发帖
- **WHEN** 用户所在用户组 allow_direct_post=1 且发帖
- **THEN** 帖子 audit_status=1,正常显示
### Requirement: 回帖审核执行
系统 SHALL 在用户回帖时检查其用户组的 allow_direct_reply 权限:
- 若 allow_direct_reply=0,回帖 audit_status 设为 0(待审核)
- 若 allow_direct_reply=1,回帖 audit_status 设为 1(通过)
#### Scenario: 需审核用户回帖
- **WHEN** 用户所在用户组 allow_direct_reply=0 且回帖
- **THEN** 回帖 audit_status=0,提示"回复已提交,等待审核"
#### Scenario: 免审核用户回帖
- **WHEN** 用户所在用户组 allow_direct_reply=1 且回帖
- **THEN** 回帖 audit_status=1,正常显示
### Requirement: 个人资料审核执行
系统 SHALL 在用户更新头像或个性签名时检查其用户组的 allow_direct_profile 权限:
- 若 allow_direct_profile=0,变更暂存到 bbs_user_profile_audit 表,提示"资料已提交,等待审核"
- 若 allow_direct_profile=1,直接更新用户资料
#### Scenario: 需审核用户更新头像
- **WHEN** 用户所在用户组 allow_direct_profile=0 且上传头像
- **THEN** 头像暂存,提示"头像已提交,等待审核",审核通过后才生效
#### Scenario: 需审核用户更新签名
- **WHEN** 用户所在用户组 allow_direct_profile=0 且修改个性签名
- **THEN** 签名暂存,提示"签名已提交,等待审核",审核通过后才生效
#### Scenario: 免审核用户更新资料
- **WHEN** 用户所在用户组 allow_direct_profile=1 且更新资料
- **THEN** 资料直接生效
### Requirement: 个人资料审核管理
系统 SHALL 在后台审核页面增加"个人资料审核"tab,管理员可查看、通过或驳回待审资料变更。
#### Scenario: 管理员审核资料变更
- **WHEN** 管理员在后台审核页面点击"通过"
- **THEN** 变更应用到用户资料,删除审核记录
#### Scenario: 管理员驳回资料变更
- **WHEN** 管理员在后台审核页面点击"驳回"
- **THEN** 变更不应用,删除审核记录,通知用户
### Requirement: 待审内容不公开显示
系统 SHALL 在前台列表和详情页中过滤掉 audit_status=0 的帖子和回帖,仅管理员和版主可见。
#### Scenario: 普通用户查看帖子列表
- **WHEN** 普通用户浏览版块帖子列表
- **THEN** 不显示 audit_status=0 的帖子
#### Scenario: 待审帖子作者查看
- **WHEN** 待审帖子作者查看自己的帖子
- **THEN** 显示"待审核"标记
## MODIFIED Requirements
### Requirement: AuditService 扩展
AuditService.need_audit() 方法 SHALL 增加对回帖审核(allow_direct_reply)的检查逻辑,作为第二级规则的补充。新增 profile 类型审核支持。
### Requirement: PermissionService 权限项
PermissionService SHALL 新增"审核权限"分组(audit),包含 allow_direct_post、allow_direct_reply、allow_direct_profile 三个权限项。