Files
zhini_im/删除评论.txt

354 lines
10 KiB
Plaintext
Raw Permalink Normal View History

删除评论功能实现文档
=====================================
功能描述
--------
在朋友圈列表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();
```