Files
zhini_im/删除评论.txt
rw0067680 c01808ac21 first commit
Change-Id: Ib7c2ab10a2562044fcaf9879388a6cbc1db6ac61
2025-12-23 10:00:49 +08:00

354 lines
10 KiB
Plaintext
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.
删除评论功能实现文档
=====================================
功能描述
--------
在朋友圈列表DiscoveryFragment的评论列表中用户可以长按自己的评论来删除该评论。
删除前会弹出确认对话框确认后调用API删除评论删除成功后自动刷新列表。
实现位置
--------
1. API定义uikit/src/main/java/cn/wildfire/chat/kit/net/Api.java
2. 网络服务uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java
3. 功能实现app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java
API接口信息
-----------
接口地址POST /api/post/commentDel
请求参数:
- comment_id (string, 必选) - 评论ID
修改详情
--------
一、API定义修改Api.java
---------------------------
添加删除评论的API常量
/**
* 删除评论 /api/post/commentDel
*/
public static final String POST_COMMENT_DEL = "/api/post/commentDel";
位置:在 POST_COMMENT_LIST 常量定义之后
二、网络服务修改AppService.java
----------------------------------
添加删除评论的方法:
/**
* 删除评论
* @param hashMap 参数Map包含comment_id
* @param callback 回调
*/
public void deleteComment(HashMap<String,String> hashMap, SimpleCallback callback){
String url = APP_SERVER_ADDRESS + Api.POST_COMMENT_DEL;
OKHttpHelper.post(url, hashMap,Constants.getOkhttpHeaderParams(), callback);
}
位置:在 publishComment() 方法之后
三、功能实现修改DiscoveryFragment.java
----------------------------------------
1. 评论列表项添加长按删除功能
修改位置initRcyCommentView() 方法的 bindView() 中
在设置点击事件之前,添加判断是否是自己的评论:
// 判断是否是自己的评论
String currentUserId = Constants.getUserId();
boolean isMyComment = !TextUtils.isEmpty(currentUserId) &&
!TextUtils.isEmpty(listBean.getUser_id()) &&
currentUserId.equals(listBean.getUser_id());
在点击事件设置之后,添加长按删除功能:
// 如果是自己的评论,添加长按删除功能
if (isMyComment) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// 显示删除确认对话框
showDeleteCommentDialog(listBean.getId(), postId);
return true;
}
});
}
说明:
- 通过比较当前用户ID和评论的user_id来判断是否是自己的评论
- 只有自己的评论才支持长按删除
- 长按后调用showDeleteCommentDialog()显示确认对话框
2. 删除确认对话框方法
/**
* 显示删除评论确认对话框
* @param commentId 评论ID
* @param postId 帖子ID
*/
private void showDeleteCommentDialog(String commentId, String postId) {
CommDialog commDialog = CommDialog.newInstance();
commDialog.setCallBak(new DialogCallBack() {
@Override
public void initView(View viewRoot) {
TextView diaTitle = viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_ada_title);
TextView diaContent = viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_text);
diaTitle.setText("确认删除");
diaContent.setText("确定要删除这条评论吗?");
diaContent.setVisibility(View.VISIBLE);
viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_cancel).setOnClickListener(view1 -> commDialog.dismiss());
viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_ok).setOnClickListener(view1 -> {
commDialog.dismiss();
deleteComment(commentId, postId, new SimpleCallback() {
@Override
public void onUiSuccess(Object o) {
ToastUtils.showToast(getActivity(), "删除成功");
mPage = 1;
getPublish();
}
@Override
public void onUiFailure(int code, String msg) {
ToastUtils.showToast(getActivity(), msg != null ? msg : "删除失败");
}
});
});
}
});
commDialog.show(getActivity());
}
说明:
- 使用CommDialog显示确认对话框
- 对话框标题:"确认删除"
- 对话框内容:"确定要删除这条评论吗?"
- 点击取消:关闭对话框
- 点击确认调用deleteComment()删除评论,删除成功后刷新列表
3. 删除评论方法
/**
* 删除评论
* @param commentId 评论ID
* @param postId 帖子ID用于刷新列表
* @param callback 回调
*/
private void deleteComment(String commentId, String postId, SimpleCallback callback) {
HashMap<String, String> headParams = new HashMap<>();
headParams.put("comment_id", commentId);
AppService.Instance().deleteComment(headParams, new SimpleCallback() {
@Override
public void onUiSuccess(Object o) {
if (callback != null) {
callback.onUiSuccess(o);
}
}
@Override
public void onUiFailure(int code, String msg) {
if (callback != null) {
callback.onUiFailure(code, msg);
}
}
});
}
说明:
- 构建请求参数包含comment_id
- 调用AppService.Instance().deleteComment()发送请求
- 通过回调处理成功和失败情况
技术要点
--------
1. 权限控制
- 通过比较user_id判断是否是自己的评论
- 只有自己的评论才支持删除操作
- 使用Constants.getUserId()获取当前用户ID
2. 交互方式
- 使用长按OnLongClickListener触发删除操作
- 类似微信的交互方式,用户体验友好
- 长按返回true阻止触发点击事件
3. 确认机制
- 删除前必须经过确认对话框
- 防止误操作删除评论
- 使用CommDialog统一风格的对话框
4. 数据刷新
- 删除成功后调用getPublish()刷新列表
- 重置页码为1重新加载第一页数据
- 确保删除后列表显示最新状态
5. 错误处理
- 删除失败时显示错误提示
- 使用ToastUtils显示用户友好的提示信息
- 处理空消息情况,显示默认错误提示
功能特点
--------
1. 权限控制
- 只能删除自己的评论
- 通过user_id判断评论归属
- 非自己的评论不显示删除选项
2. 交互体验
- 长按触发删除,符合用户习惯
- 删除前确认,防止误操作
- 删除成功后自动刷新,无需手动操作
3. 视觉反馈
- 删除成功显示"删除成功"提示
- 删除失败显示具体错误信息
- 使用统一的对话框样式
4. 数据同步
- 删除后立即刷新列表
- 确保UI显示与服务器数据一致
- 自动更新评论数量
使用场景
--------
- 用户在朋友圈列表中查看评论
- 发现自己的评论有误或不想保留
- 长按自己的评论项
- 弹出确认删除对话框
- 确认后删除评论
- 列表自动刷新,评论消失
数据流程
--------
1. 用户长按评论项
2. 判断是否是自己的评论比较user_id
3. 显示删除确认对话框
4. 用户点击确认
5. 调用deleteComment()方法
6. 发送POST请求到/api/post/commentDel
7. 服务器处理删除请求
8. 返回删除结果
9. 删除成功:显示提示,刷新列表
删除失败:显示错误信息
注意事项
--------
1. 权限判断
- 必须正确获取当前用户ID
- 确保user_id字段不为空
- 字符串比较使用equals()方法
2. Fragment生命周期
- 在调用getActivity()前检查Fragment状态
- 确保对话框在Fragment活跃时显示
- 避免内存泄漏
3. 网络请求
- 删除操作需要网络请求
- 处理网络异常情况
- 提供友好的错误提示
4. 列表刷新
- 删除成功后必须刷新列表
- 重置页码确保数据正确
- 避免显示已删除的评论
5. 用户体验
- 长按操作要响应及时
- 确认对话框要清晰明确
- 删除后要有明确的反馈
测试建议
--------
1. 功能测试
- 测试长按自己的评论:应显示删除对话框
- 测试长按他人的评论:不应显示删除选项
- 测试点击确认:应删除评论并刷新列表
- 测试点击取消:应关闭对话框,不删除评论
2. 边界测试
- 测试网络异常情况:应显示错误提示
- 测试删除已删除的评论:应处理服务器错误
- 测试空评论ID应防止发送无效请求
3. 交互测试
- 测试长按响应速度:应快速响应
- 测试对话框显示:应正确显示标题和内容
- 测试列表刷新:删除后应正确更新
4. 权限测试
- 测试不同用户的评论:只能删除自己的
- 测试user_id为空应正确处理
- 测试当前用户ID获取应正确获取
相关文件
--------
- API定义uikit/src/main/java/cn/wildfire/chat/kit/net/Api.java
- 网络服务uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java
- 功能实现app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java
- 数据模型uikit/src/main/java/cn/wildfire/chat/kit/net/model/GetCommentInfoResult.java
- 对话框cn.wildfire.chat.kit.dialog.CommDialog
版本信息
--------
- 实现日期2025年
- API接口POST /api/post/commentDel
- 请求参数comment_id (string, 必选)
- 修改文件:
* uikit/src/main/java/cn/wildfire/chat/kit/net/Api.java
* uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java
* app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java
代码示例
--------
1. 判断是否是自己的评论:
```java
String currentUserId = Constants.getUserId();
boolean isMyComment = !TextUtils.isEmpty(currentUserId) &&
!TextUtils.isEmpty(listBean.getUser_id()) &&
currentUserId.equals(listBean.getUser_id());
```
2. 长按删除监听:
```java
if (isMyComment) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showDeleteCommentDialog(listBean.getId(), postId);
return true;
}
});
}
```
3. 删除评论请求:
```java
HashMap<String, String> headParams = new HashMap<>();
headParams.put("comment_id", commentId);
AppService.Instance().deleteComment(headParams, callback);
```
4. 删除成功后刷新:
```java
ToastUtils.showToast(getActivity(), "删除成功");
mPage = 1;
getPublish();
```