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