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