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

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

实现效果图如下:


1、数据库表 

create table AM_CHANCE_COMMENT_T
(
    comment_id       VARCHAR2(32)  not null PRIMARY KEY,    --评论id (主键)
    comment_info          VARCHAR2(1000),  -- 评论内容   
    comment_user      VARCHAR2(32) ,    --评论创建人
    comment_date   VARCHAR2(32) ,    --评论创建时间
    chance_id      VARCHAR2(32), 	 -- 评论关于什么 的表关联id
    parent_id     VARCHAR2(32)     --评论父 id
);
comment on table  AM_CHANCE_COMMENT_T                    is  '机会评论表';
comment on column AM_CHANCE_COMMENT_T.comment_id              is  '评论id (主键)';
comment on column AM_CHANCE_COMMENT_T.comment_info              is  '评论内容';
comment on column AM_CHANCE_COMMENT_T.comment_user              is  '评论创建人';
comment on column AM_CHANCE_COMMENT_T.comment_date              is  '评论创建时间';
comment on column AM_CHANCE_COMMENT_T.chance_id              is  '其他表 表关联id';
comment on column AM_CHANCE_COMMENT_T.parent_id              is  '评论父 id';

2、后台逻辑代码

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

实体类:

public class ChanceComment implements Serializable {
    private static final long serialVersionUID = -5854141812829495003L;
    private String commentId;
    private String commentInfo;
    private String commentUser;
    private String commentDate;
    private String chanceId;
    private String parentId;

    private String userName;
    private boolean hasChildComment;
    // 用来存储 有子评论的 子评论信息
    private List<ChanceComment> childCommet = new ArrayList<ChanceComment>();


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCommentId() {
        return commentId;
    }

    public void setCommentId(String commentId) {
        this.commentId = commentId;
    }

    public String getCommentInfo() {
        return commentInfo;
    }

    public void setCommentInfo(String commentInfo) {
        this.commentInfo = commentInfo;
    }

    public String getCommentUser() {
        return commentUser;
    }

    public void setCommentUser(String commentUser) {
        this.commentUser = commentUser;
    }

    public String getCommentDate() {
        return commentDate;
    }

    public void setCommentDate(String commentDate) {
        this.commentDate = commentDate;
    }

    public String getChanceId() {
        return chanceId;
    }

    public void setChanceId(String chanceId) {
        this.chanceId = chanceId;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    public boolean isHasChildComment() {
        return hasChildComment;
    }

    public void setHasChildComment(boolean hasChildComment) {
        this.hasChildComment = hasChildComment;
    }

    public List<ChanceComment> getChildCommet() {
        return childCommet;
    }

    public void setChildCommet(List<ChanceComment> childCommet) {
        this.childCommet = childCommet;
    }
}

部分逻辑代码

 public Object getComment(Map params) {
        // TODO 改成自己的查询逻辑
        List<ChanceComment> commentList = portMapDao.getComment(params);
        List<ChanceComment> result = new ArrayList<ChanceComment>();
        // 处理查询结果,将有父id 的 评论 放置在父节点下
        for (ChanceComment chanceComment : commentList) {
            if (chanceComment.getParentId() == null || "".equals(chanceComment.getParentId())) {
                // 找到所有父集节点
                result.add(chanceComment);
            }
        }
        for (ChanceComment chanceComment : result) {
            // 再次循环,将有父id 的 节点放置到父节点下
            for (ChanceComment comment : commentList) {
                if (chanceComment.getCommentId().equals(comment.getParentId())) {
                    chanceComment.setHasChildComment(true);
                    List<ChanceComment> childCommet = chanceComment.getChildCommet();
                    childCommet.add(comment);
                    chanceComment.setChildCommet(childCommet);
                }
            }
        }
        return result;
    }

3、前台展示

css样式:


/* 评论区 使用样式 */
.comment-div {
	overflow: hidden;
	max-height: 277px;
	padding: 0 24px;
	margin: 0
}

.comment-div .comment-ul {
	margin-top: 10px;
	border-bottom: 1px solid #e8e8ee;
}

.comment-div .comment-ul .comment-parent-li {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	-ms-flex-direction: column;
	flex-direction: column;
	position: relative;
	margin-bottom: 8px;
	word-break: break-all;

}

.comment-div .comment-ul .comment-son-li {
	list-style-type: none;
	word-break: break-all;
}

.comment-div .comment-ul .comment-son-li .son-ul {
	margin-left: 32px;
	padding-left: 10px;
	border-left: 2px solid #f5f6f7;
	border-bottom: none;
}

.comment-div .comment-ul .comment-son-li .son-ul .reply-li {
	margin-bottom: 15px;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	list-style-type: none;
}

.date-span {
	margin-left: 8px;
	font-size: 12px;
	color: #6b6b6b;
}

.comment-div .comment-ul .comment-parent-li .reply-span {
	display: inline-block;
	margin-left: 8px;
}

.reply-a {
	box-sizing: inherit;
	outline: 0;
	margin: 0;
	min-width: auto;
	font-size: 14px;
	height: 20px;
	line-height: 20px;
	color: #5893c2;
	padding: 0 4px;
}
.viewChance {
	position: relative;
	min-height: 1px;
	padding-right: 15px;
	padding-left: 15px;
	width: 70px;
}
/* 评论区 使用样式 end */

 jsp  html

				<!--  评论区 -->
				<table width="100%">
					<tr style="padding: 2px">
						<td  style="position: relative;	min-height: 1px;padding-right: 15px; padding-top: 10px;	padding-left: 15px;" colspan="7">
                            <!-- 如果是回复他人,用来存储父id -->
							<input type="hidden" id="parent_id">
							<textarea cols="31" rows="4" id="comment_info"
									  class="form-control"
									  style="display: inline;width:100%"
									  placeholder="请输入评论内容。。。"></textarea>
							<div>
							<div class=" form-groupcol-xs-6"
								 style="margin-top: 5px;margin-bottom: 5px; padding-left: 15px; float: left">
								<button class="btn green" onclick="saveComment()"
										style="padding: 2px 7px;">确定
								</button>

							</div>
							<div class=" form-groupcol-xs-6"
								 style="margin-top: 5px;margin-bottom: 5px; padding-left: 15px;  float: right">
								<button class="btn red" onclick="cancelReply()" style="padding: 2px 7px;">取消回复
								</button>
							</div>
							</div>
						</td>
					</tr>
					<tr style="width: 100%">
						<td colspan="6" id="comment_begin_td">
						</td>
					</tr>
				</table>

js:

// 点击取消按钮
function cancelReply() {
    //取消回复
    $('#comment_info').attr('placeholder', "请输入评论内容。。。");
    $('#parent_id').val('');
}

// 保存评论
function saveComment() {
    let comment_info = $('#comment_info').val();
    if (comment_info === '' || comment_info == null || !/[^\s]/.test(comment_info)) {
        return;
    }
    let postData = {
        comment_info : comment_info,
        parent_id :  $('#parent_id').val(),
        chance_id: $('#cargoId_baojia').val(),
    };
    // TODO 遮罩
    CaUtils.showLoading();
    // TODO 自己的后台方法  传送数据处理 makePostData 改成直接传送处理完的数据即可
    window.$axios.post(WEB_CTX_PATH + '/TODO.do?method=TODO', makePostData(postData),{
        headers: { 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8' }
    }).
    then(res => res.data.errNo === '0' ? setCommentData(res.data.data) : Promise.reject(res.data.errMsg)).
    then($('#comment_info').val('')).
    then(cancelReply()).
    catch(err => {
        // TODO err处理
        BRUTIL.msgAlert("", err, "error");
    }).finally(() => {
        // TODO 遮罩处理
        CaUtils.hideLoading();
    });
}

// 显示评论数据
function setCommentData(list) {
    let htmllet = '';
    for (let i in list) {
        htmllet = htmllet + "<div class=\"comment-div\">" +
            "<ul class=\"comment-ul\">" +
            "<li class=\"comment-parent-li\">"+
            "<span style=\"white-space:pre-wrap;\">"
            + list[i].commentInfo +
            "</span>" +
            "<span class=\"date-span\">"
            + list[i].userName +"  "+ list[i].commentDate +
            "</span>\n" +
            "<span class=\"reply-span\">" +
            "<a class=\"reply-a\" name = " + '\"' + list[i].userName + '\"' + " id= " + '\"_reply_' + list[i].commentId + '\"' + "  onclick=\"replyComment(this.id,this.name)\">\n" +
            "回复</a></span></li>"
        ;
        // 有子回复
        if (list[i].hasChildComment) {
            for (let x in list[i].childCommet) {
                htmllet = htmllet +
                    "<li class=\"comment-son-li\"><ul class=\"son-ul\"><li class=\"reply-li\">"
                    + "<span style=\"white-space:pre-wrap;\">" + list[i].childCommet[x].commentInfo + "</span>"
                    + "<span class=\"date-span\">" + list[i].childCommet[x].userName + " " + list[i].childCommet[x].commentDate + "</span></li></ul></li>";
            }
        }
        htmllet = htmllet + "</ul></div>"
    }
    $('#comment_begin_td').html(htmllet);
}
// 获取该chance对应的评论数据
function getComment(id) {

    let postData = {
        id : id
    }
    // TODO  传送数据处理 makePostData 改成直接传送处理完的数据即可
    return window.$axios.post(WEB_CTX_PATH + '/TODO.do?method=TODO',makePostData(postData),{
        headers: { 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8' }
    }).then(res => {
        if(res.data.errNo !== '0'){
            return Promise.reject(res.data.errMsg);
        }
        setCommentData(res.data.data);

    }).catch(function(err) {
        // TODO
        if (!window.$axios.isCancel(err)){
            BRUTIL.msgAlert("", err, "error");
        }
    });
}

 

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值