113 lines
4.9 KiB
Markdown
113 lines
4.9 KiB
Markdown
# 实施计划:管理员删除帖子
|
||
|
||
## 概述
|
||
|
||
基于现有代码结构,分后端和前端两部分实施。后端先扩展接口权限和错误码,前端再对接新逻辑。所有变更基于已有的 `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 次迭代
|