live-forum/.kiro/specs/admin-delete-post/tasks.md
2026-03-24 11:27:37 +08:00

113 lines
4.9 KiB
Markdown
Raw Permalink 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.

# 实施计划:管理员删除帖子
## 概述
基于现有代码结构,分后端和前端两部分实施。后端先扩展接口权限和错误码,前端再对接新逻辑。所有变更基于已有的 `IsDeleted`/`DeletedAt` 字段,无需数据库变更。
## 任务
- [x] 1. 后端:新增 ResponseCode 和 PostDetailDto 字段
- [x] 1.1 在 `ResponseCode` 枚举中新增 `PostDeleted = 1001`
- 在 ResponseCode 枚举文件中添加 `PostDeleted`
- _需求: 6.5, 6.6_
- [x] 1.2 在 `PostDetailDto` 中新增 `IsAdmin` 属性
- 添加 `public bool IsAdmin { get; set; }` 字段
- _需求: 1.2, 1.3_
- [x] 2. 后端:扩展 DeletePosts 接口支持管理员删除
- [x] 2.1 新增 `IsAdminCertificationType` 私有方法
- 在 PostsService 中添加通过 `T_CertificationTypes` 表判断管理员身份的方法
- 查询认证名称是否为「管理员认证」
- _需求: 6.2_
- [x] 2.2 修改 `DeletePosts` 方法的权限校验逻辑
- 移除查询条件中的 `x.UserId == currentUserId` 限制
- 先查帖子是否存在,再校验权限(作者或管理员)
- 非作者非管理员返回「权限不足,无法删除该帖子」
- _需求: 6.1, 6.2, 6.3, 6.4_
- [ ]* 2.3 编写属性测试:管理员可删除任意帖子
- **Property 2: 管理员可删除任意帖子**
- **验证: 需求 2.4, 6.1, 6.4**
- [ ]* 2.4 编写属性测试:非管理员非作者删除被拒绝
- **Property 3: 非管理员非作者删除被拒绝**
- **验证: 需求 6.2, 6.3**
- [x] 3. 后端:修改 GetPostDetail 接口返回已删除状态
- [x] 3.1 修改 `GetPostDetail` 方法
- 移除查询条件中的 `!x.IsDeleted` 过滤
- 帖子已删除时返回 `ResponseCode.PostDeleted` 和「帖子已删除」
- 在构建 PostDetailDto 时查询当前用户是否为管理员并赋值 `IsAdmin`
- _需求: 6.5, 1.2, 1.3_
- [ ]* 3.2 编写属性测试:已删除帖子详情返回已删除状态
- **Property 4: 已删除帖子详情返回已删除状态**
- **验证: 需求 4.1, 6.5**
- [x] 4. 后端:修改 PublishPostComments 接口拒绝已删除帖子评论
- [x] 4.1 修改 `PublishPostComments` 方法
- 将帖子查询拆分为先查帖子是否存在,再检查 IsDeleted
- 帖子已删除时返回 `ResponseCode.PostDeleted` 和「帖子已删除」
- _需求: 6.6_
- [ ]* 4.2 编写属性测试:已删除帖子拒绝评论
- **Property 5: 已删除帖子拒绝评论**
- **验证: 需求 5.1, 6.6**
- [x] 5. 检查点 - 后端变更验证
- 确保所有测试通过,如有疑问请向用户确认。
- [x] 6. 前端:扩展「……」按钮显示条件和动态菜单
- [x] 6.1 修改「……」按钮的显示条件
-`v-if="detailsData.isMine"` 扩展为 `v-if="detailsData.isMine || detailsData.isAdmin"`
- 对于非作者管理员场景,在对应分支中也添加「……」按钮
- _需求: 1.1, 1.2_
- [x] 6.2 重构 action sheet 菜单为动态构建
- 根据 `isAdmin``isMine` 动态构建菜单项列表
- 管理员显示「删除帖子」,作者显示「帖子内回复设置」,所有情况显示「举报」
- 根据 tapIndex 映射到对应 action 执行
- _需求: 1.2, 1.3, 1.4_
- [ ]* 6.3 编写属性测试:菜单项根据用户身份正确构建
- **Property 1: 菜单项根据用户身份正确构建**
- **验证: 需求 1.2, 1.3, 1.4**
- [x] 7. 前端:新增删除确认弹窗和删除方法
- [x] 7.1 添加删除确认弹窗组件
- 使用 `up-popup` 居中弹窗,包含「确定删除该帖子吗?」文案
- 「取消」按钮关闭弹窗,「删除」按钮调用删除方法
- 添加 `showAdminDeleteConfirm` 数据字段
- 添加对应 CSS 样式
- _需求: 2.1, 2.2, 2.3_
- [x] 7.2 实现 `adminDeletePost` 方法
- 调用 `AppServer.DeletePosts` 接口
- 成功后显示「帖子已删除」toast 并 `navigateBack`
- 不调用 `notifyPrevPage()` 刷新上级页面
- 添加 `isSubmitting` 防重复提交
- _需求: 2.4, 3.1, 3.2, 3.3_
- [x] 8. 前端:已删除帖子访问拦截和回复拦截
- [x] 8.1 修改 `getPostDetail` 方法处理 PostDeleted 错误码
- 当返回 `PostDeleted` 错误码时显示「帖子已删除」toast 并 `navigateBack`
- 不刷新上级页面列表
- _需求: 4.1, 4.2_
- [x] 8.2 修改 `publishPostComments``publishPostDetailsComments` 方法处理 PostDeleted 错误码
- 当返回 `PostDeleted` 错误码时显示「帖子已删除」toast 并 `navigateBack`
- 不刷新上级页面列表
- _需求: 5.1, 5.2_
- [x] 9. 最终检查点 - 全部变更验证
- 确保所有测试通过,如有疑问请向用户确认。
## 备注
- 标记 `*` 的任务为可选,可跳过以加快 MVP 进度
- 每个任务引用了具体的需求编号以便追溯
- 检查点确保增量验证
- 属性测试使用 FsCheck.Xunit每个属性至少 100 次迭代