js css java 实现简单的评论回复功能

淩亂°似流年 2022-12-10 14:56 304阅读 0赞

实现功能:可以添加评论,可以回复评论(单次)

实现效果图如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5oYW9fY19o_size_16_color_FFFFFF_t_70


1、数据库表

  1. create table AM_CHANCE_COMMENT_T
  2. (
  3. comment_id VARCHAR2(32) not null PRIMARY KEY, --评论id (主键)
  4. comment_info VARCHAR2(1000), -- 评论内容
  5. comment_user VARCHAR2(32) , --评论创建人
  6. comment_date VARCHAR2(32) , --评论创建时间
  7. chance_id VARCHAR2(32), -- 评论关于什么 的表关联id
  8. parent_id VARCHAR2(32) --评论父 id
  9. );
  10. comment on table AM_CHANCE_COMMENT_T is '机会评论表';
  11. comment on column AM_CHANCE_COMMENT_T.comment_id is '评论id (主键)';
  12. comment on column AM_CHANCE_COMMENT_T.comment_info is '评论内容';
  13. comment on column AM_CHANCE_COMMENT_T.comment_user is '评论创建人';
  14. comment on column AM_CHANCE_COMMENT_T.comment_date is '评论创建时间';
  15. comment on column AM_CHANCE_COMMENT_T.chance_id is '其他表 表关联id';
  16. comment on column AM_CHANCE_COMMENT_T.parent_id is '评论父 id';

2、后台逻辑代码

保存啥的就不展示了,这里就展示如果取出与自己相关的子回复

实体类:

  1. public class ChanceComment implements Serializable {
  2. private static final long serialVersionUID = -5854141812829495003L;
  3. private String commentId;
  4. private String commentInfo;
  5. private String commentUser;
  6. private String commentDate;
  7. private String chanceId;
  8. private String parentId;
  9. private String userName;
  10. private boolean hasChildComment;
  11. // 用来存储 有子评论的 子评论信息
  12. private List<ChanceComment> childCommet = new ArrayList<ChanceComment>();
  13. public String getUserName() {
  14. return userName;
  15. }
  16. public void setUserName(String userName) {
  17. this.userName = userName;
  18. }
  19. public String getCommentId() {
  20. return commentId;
  21. }
  22. public void setCommentId(String commentId) {
  23. this.commentId = commentId;
  24. }
  25. public String getCommentInfo() {
  26. return commentInfo;
  27. }
  28. public void setCommentInfo(String commentInfo) {
  29. this.commentInfo = commentInfo;
  30. }
  31. public String getCommentUser() {
  32. return commentUser;
  33. }
  34. public void setCommentUser(String commentUser) {
  35. this.commentUser = commentUser;
  36. }
  37. public String getCommentDate() {
  38. return commentDate;
  39. }
  40. public void setCommentDate(String commentDate) {
  41. this.commentDate = commentDate;
  42. }
  43. public String getChanceId() {
  44. return chanceId;
  45. }
  46. public void setChanceId(String chanceId) {
  47. this.chanceId = chanceId;
  48. }
  49. public String getParentId() {
  50. return parentId;
  51. }
  52. public void setParentId(String parentId) {
  53. this.parentId = parentId;
  54. }
  55. public boolean isHasChildComment() {
  56. return hasChildComment;
  57. }
  58. public void setHasChildComment(boolean hasChildComment) {
  59. this.hasChildComment = hasChildComment;
  60. }
  61. public List<ChanceComment> getChildCommet() {
  62. return childCommet;
  63. }
  64. public void setChildCommet(List<ChanceComment> childCommet) {
  65. this.childCommet = childCommet;
  66. }
  67. }

部分逻辑代码

  1. public Object getComment(Map params) {
  2. // TODO 改成自己的查询逻辑
  3. List<ChanceComment> commentList = portMapDao.getComment(params);
  4. List<ChanceComment> result = new ArrayList<ChanceComment>();
  5. // 处理查询结果,将有父id 的 评论 放置在父节点下
  6. for (ChanceComment chanceComment : commentList) {
  7. if (chanceComment.getParentId() == null || "".equals(chanceComment.getParentId())) {
  8. // 找到所有父集节点
  9. result.add(chanceComment);
  10. }
  11. }
  12. for (ChanceComment chanceComment : result) {
  13. // 再次循环,将有父id 的 节点放置到父节点下
  14. for (ChanceComment comment : commentList) {
  15. if (chanceComment.getCommentId().equals(comment.getParentId())) {
  16. chanceComment.setHasChildComment(true);
  17. List<ChanceComment> childCommet = chanceComment.getChildCommet();
  18. childCommet.add(comment);
  19. chanceComment.setChildCommet(childCommet);
  20. }
  21. }
  22. }
  23. return result;
  24. }

3、前台展示

css样式:

  1. /* 评论区 使用样式 */
  2. .comment-div {
  3. overflow: hidden;
  4. max-height: 277px;
  5. padding: 0 24px;
  6. margin: 0
  7. }
  8. .comment-div .comment-ul {
  9. margin-top: 10px;
  10. border-bottom: 1px solid #e8e8ee;
  11. }
  12. .comment-div .comment-ul .comment-parent-li {
  13. -webkit-box-orient: vertical;
  14. -webkit-box-direction: normal;
  15. -ms-flex-direction: column;
  16. flex-direction: column;
  17. position: relative;
  18. margin-bottom: 8px;
  19. word-break: break-all;
  20. }
  21. .comment-div .comment-ul .comment-son-li {
  22. list-style-type: none;
  23. word-break: break-all;
  24. }
  25. .comment-div .comment-ul .comment-son-li .son-ul {
  26. margin-left: 32px;
  27. padding-left: 10px;
  28. border-left: 2px solid #f5f6f7;
  29. border-bottom: none;
  30. }
  31. .comment-div .comment-ul .comment-son-li .son-ul .reply-li {
  32. margin-bottom: 15px;
  33. -webkit-box-orient: vertical;
  34. -webkit-box-direction: normal;
  35. list-style-type: none;
  36. }
  37. .date-span {
  38. margin-left: 8px;
  39. font-size: 12px;
  40. color: #6b6b6b;
  41. }
  42. .comment-div .comment-ul .comment-parent-li .reply-span {
  43. display: inline-block;
  44. margin-left: 8px;
  45. }
  46. .reply-a {
  47. box-sizing: inherit;
  48. outline: 0;
  49. margin: 0;
  50. min-width: auto;
  51. font-size: 14px;
  52. height: 20px;
  53. line-height: 20px;
  54. color: #5893c2;
  55. padding: 0 4px;
  56. }
  57. .viewChance {
  58. position: relative;
  59. min-height: 1px;
  60. padding-right: 15px;
  61. padding-left: 15px;
  62. width: 70px;
  63. }
  64. /* 评论区 使用样式 end */

jsp html

  1. <!-- 评论区 -->
  2. <table width="100%">
  3. <tr style="padding: 2px">
  4. <td style="position: relative; min-height: 1px;padding-right: 15px; padding-top: 10px; padding-left: 15px;" colspan="7">
  5. <!-- 如果是回复他人,用来存储父id -->
  6. <input type="hidden" id="parent_id">
  7. <textarea cols="31" rows="4" id="comment_info"
  8. class="form-control"
  9. style="display: inline;width:100%"
  10. placeholder="请输入评论内容。。。"></textarea>
  11. <div>
  12. <div class=" form-groupcol-xs-6"
  13. style="margin-top: 5px;margin-bottom: 5px; padding-left: 15px; float: left">
  14. <button class="btn green" onclick="saveComment()"
  15. style="padding: 2px 7px;">确定
  16. </button>
  17. </div>
  18. <div class=" form-groupcol-xs-6"
  19. style="margin-top: 5px;margin-bottom: 5px; padding-left: 15px; float: right">
  20. <button class="btn red" onclick="cancelReply()" style="padding: 2px 7px;">取消回复
  21. </button>
  22. </div>
  23. </div>
  24. </td>
  25. </tr>
  26. <tr style="width: 100%">
  27. <td colspan="6" id="comment_begin_td">
  28. </td>
  29. </tr>
  30. </table>

js:

  1. // 点击取消按钮
  2. function cancelReply() {
  3. //取消回复
  4. $('#comment_info').attr('placeholder', "请输入评论内容。。。");
  5. $('#parent_id').val('');
  6. }
  7. // 保存评论
  8. function saveComment() {
  9. let comment_info = $('#comment_info').val();
  10. if (comment_info === '' || comment_info == null || !/[^\s]/.test(comment_info)) {
  11. return;
  12. }
  13. let postData = {
  14. comment_info : comment_info,
  15. parent_id : $('#parent_id').val(),
  16. chance_id: $('#cargoId_baojia').val(),
  17. };
  18. // TODO 遮罩
  19. CaUtils.showLoading();
  20. // TODO 自己的后台方法 传送数据处理 makePostData 改成直接传送处理完的数据即可
  21. window.$axios.post(WEB_CTX_PATH + '/TODO.do?method=TODO', makePostData(postData),{
  22. headers: { 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8' }
  23. }).
  24. then(res => res.data.errNo === '0' ? setCommentData(res.data.data) : Promise.reject(res.data.errMsg)).
  25. then($('#comment_info').val('')).
  26. then(cancelReply()).
  27. catch(err => {
  28. // TODO err处理
  29. BRUTIL.msgAlert("", err, "error");
  30. }).finally(() => {
  31. // TODO 遮罩处理
  32. CaUtils.hideLoading();
  33. });
  34. }
  35. // 显示评论数据
  36. function setCommentData(list) {
  37. let htmllet = '';
  38. for (let i in list) {
  39. htmllet = htmllet + "<div class=\"comment-div\">" +
  40. "<ul class=\"comment-ul\">" +
  41. "<li class=\"comment-parent-li\">"+
  42. "<span style=\"white-space:pre-wrap;\">"
  43. + list[i].commentInfo +
  44. "</span>" +
  45. "<span class=\"date-span\">"
  46. + list[i].userName +" "+ list[i].commentDate +
  47. "</span>\n" +
  48. "<span class=\"reply-span\">" +
  49. "<a class=\"reply-a\" name = " + '\"' + list[i].userName + '\"' + " id= " + '\"_reply_' + list[i].commentId + '\"' + " onclick=\"replyComment(this.id,this.name)\">\n" +
  50. "回复</a></span></li>"
  51. ;
  52. // 有子回复
  53. if (list[i].hasChildComment) {
  54. for (let x in list[i].childCommet) {
  55. htmllet = htmllet +
  56. "<li class=\"comment-son-li\"><ul class=\"son-ul\"><li class=\"reply-li\">"
  57. + "<span style=\"white-space:pre-wrap;\">" + list[i].childCommet[x].commentInfo + "</span>"
  58. + "<span class=\"date-span\">" + list[i].childCommet[x].userName + " " + list[i].childCommet[x].commentDate + "</span></li></ul></li>";
  59. }
  60. }
  61. htmllet = htmllet + "</ul></div>"
  62. }
  63. $('#comment_begin_td').html(htmllet);
  64. }
  65. // 获取该chance对应的评论数据
  66. function getComment(id) {
  67. let postData = {
  68. id : id
  69. }
  70. // TODO 传送数据处理 makePostData 改成直接传送处理完的数据即可
  71. return window.$axios.post(WEB_CTX_PATH + '/TODO.do?method=TODO',makePostData(postData),{
  72. headers: { 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8' }
  73. }).then(res => {
  74. if(res.data.errNo !== '0'){
  75. return Promise.reject(res.data.errMsg);
  76. }
  77. setCommentData(res.data.data);
  78. }).catch(function(err) {
  79. // TODO
  80. if (!window.$axios.isCancel(err)){
  81. BRUTIL.msgAlert("", err, "error");
  82. }
  83. });
  84. }

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现评论回复功能

    评论和回复功能常见于各种Web应用程序,它们允许用户在文章、博客或社交媒体上互相交流和讨论。在Java中实现评论和回复功能可以通过使用数据库和服务器端技术来完成。本文将介绍一种

    相关 评论回复功能设计与实现

    评论回复功能的数据库设计可以分开设计成两张表,评论表和回复表,也可以将其设计为一张表,我采用的是一张表 评论回复表的相关字段(我做的是商品goods下的评论回复) ![