初窥——进入公司后的JAVA_WEB开发02
来源:互联网 发布:html css js 教程书籍 编辑:程序博客网 时间:2024/04/28 19:34
项目中需要有文章的留言功能,作为使用百度贴吧较多的用户,我想借鉴贴吧的留言功能,开发项目文章的留言。经过简单的搜索,我并未发现比较系统的想法及资料,按照自我想法做了文章留言功能,以此纪念自我成长及为他人开发提供一点参考。
一、效果展示
具体效果如图1.1所示:
图:1.1效果展示
二、整体设计思路:
1.针对留言的效果分析,得出以下结论:a.对文章进行整体回复及评论时,可以认为是对文章进行盖楼 b.当楼层内出现回复时存在两种情况,分别是对楼层进行回复及对楼层内留言的回复。
2.可以得出解决思路:对文章评论时,被评论人为文章,产生了楼层。其他的留言都是依附于楼层存在的,只要找准楼层就可以展现楼层内的留言。
3.实施起来可以分解为: a.查询文章下的楼层 b.循环楼层将楼层内留言插入楼层 c.前台界面显示。
三、解决方案:
1.首先是数据库表的设计,具体数据库表效果如图1.2所示
图1.2为数据库表结构
sql代码片段如下:
Table structure for `t_comment`-- ----------------------------DROP TABLE IF EXISTS `t_comment`;CREATE TABLE `t_comment` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID(自增主键)', `article_id` varchar(32) DEFAULT NULL COMMENT '文章id', `comment_id` int(11) DEFAULT NULL COMMENT '评论id(一级评论)', `ruser` varchar(32) DEFAULT NULL COMMENT '被回复人(用户名)', `user` varchar(32) DEFAULT NULL COMMENT '回复人(用户名)', `content` varchar(360) DEFAULT NULL COMMENT '内容', `user_type` varchar(2) DEFAULT NULL COMMENT '用户类型(U用户、D医生)', `comment_date` datetime DEFAULT NULL COMMENT '评论时间', `flag` int(11) DEFAULT NULL COMMENT '评论状态(默认0,审核通过1,审核不通过2,删除3)', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=119 DEFAULT CHARSET=utf8;
a. comment_id为文章的楼层数,comment_id为空的数据代表对文章留言,若comment_id不为空,则数目代表留言所处的楼层数。
b. ruser代表被回复者,在有楼层数的情况下,如果没有ruser则代表单纯对楼层回复,如果有ruser则代表留言有被回复者及回复者。
c. user则代表留言用户,content代表留言的内容,usertype代表用户类型,comment_date代表评论产生的时间,flag代表评论的状态,决定是不是要显示。
2.具体代码情况,由于项目是基于ssh框架来开发的并进行了封装,可能看起来有些差别,但是思路解决方案没有区别。
具体代码如下:
public void listComment(BaseDhccDto dto) {StringBuilder instb = new StringBuilder("");// 查询文章的楼层commentDao.listFlow(dto);PagerModel pagerModel = dto.getPageModel();pagerModel.setCountProName("id");commonService.fillPagerModelData(pagerModel);List<Comment> comments = (List<Comment>) dto.getPageModel().getPageData();List<Integer> ins = new ArrayList<Integer>();Map<Integer, Comment> map = new HashMap<Integer, Comment>();//循环楼层信息,取出楼层idfor (Comment dc : comments) {map.put(dc.getId(), dc);//分离出楼层id ,id1,id2,id3ins.add(dc.getId());}// 生成疾病分类in条件,将id中的,去掉变成id1,id2,id3dto.addParam("commentId",ins);//查询条件放入dto中,调用方法时再使用。List<Comment> commentSub = commentDao.listComment(dto);// 遍历楼层,添加回复到楼层中for (Comment c : commentSub) {map.get(c.getCommentId()).addComment(c);}}a.此处代码为查询文章下的楼层,使用pagemodel来限制查询的楼层数目,例如只取前五楼。取出文章的楼层信息后,进行循环取出楼层的comment_id,根据comment_id取出留言信息,并再将信息插入楼层内。
dao中代码如下所示:
public void listFlow(BaseDhccDto dto){Map<String, Object> params = new HashMap<String, Object>();String artId = dto.getStringValue("articleId");StringBuilder hql = new StringBuilder();params.put("artId", artId);hql.append(" from Comment c where c.articleId=:artId ").append(" and commentId is null ") .append(" order by commentDate ");PagerModel pagerModel = dto.getPageModel();pagerModel.setQueryHql(hql.toString());pagerModel.setHqlParamMap(params);}/** * 方法名: list* 方法功能描述: 查询文章的回复记录* @param: * @return: * @Author: * @Create Date: 2015年01月09日11:43:37* */public List<Comment> listComment(BaseDhccDto dto) {Map<String, Object> params = new HashMap<String, Object>();String artId = dto.getStringValue("articleId");List<Integer> commentId = (List<Integer>) dto.getParamValue("commentId");StringBuilder hql = new StringBuilder();params.put("artId", artId);hql.append(" from Comment c where c.articleId=:artId ");if(commentId==null || commentId.size() == 0) {hql.append(" and commentId is null ");}else{hql.append(" and commentId in (:comment_id) ");params.put("comment_id", commentId);}hql.append(" order by commentDate ");return this.findByHqlWithValuesMap(hql.toString(), params, false, true);}
3.在前端的实现:
<c:forEach items="${dto.pageModel.pageData}" var="comment" ><div class="pt10 clearfix b_b1_d_gray pb20" id="${comment.id}"><div class="w50 h50 fl mr20"><a href="#"><img class="w" src="<c:url value='/imgs/login/user_icon.png'/>"/></a></div><div class="w590 fl"><p class="clearfix"><span class="font_green fl">用户${comment.user}</span><span class="fl">:</span><span class="font_gray fr"><fmt:formatDate value="${comment.commentDate}" pattern="yyyy-MM-dd HH:mm"/> </span></p><p class="font_black">${comment.content}</p><p class="tr"><a href="javascript:void(0);" class="font_blue comment_a" flowno="${comment.id}">我也说一句</a></p></div> <c:forEach items="${comment.comments}" var="commentSub" ><div class="w590 bg_color_blue3 pt5 pb5 pl15 pr15 fl b_b1_d_gray"><c:if test="${ empty commentSub.ruser }"><p><span class="font_green">${commentSub.user}</span><span> : </span><span>${commentSub.content}</span></p><a href="javascript:void(0);" class="font_blue fr comment_a" flowno="${comment.id}">回复</a></c:if><c:if test="${not empty commentSub.ruser }"><p><span class="font_green">${commentSub.user}</span><span> 回复 </span><span class="font_gray">${commentSub.ruser}:</span><span>${commentSub.content}</span></p><a href="javascript:void(0);" class="font_blue fr comment_a" flowno="${comment.id}">回复</a></c:if></div></c:forEach> </div></c:forEach>4.点击回复需要插入输入框,此处用js来控制。
$(function() {var reply = '<div class="clearfix comment_reply ml10 mt5 mb5"> <textarea id="contentTex" class="w400 h50 textarea_reply fl"></textarea> <a href="#" onclick="shareComment(this);" class="btn btn_blue1 display_i w60 fl ml20" style="padding:0px;">发表</a> </div>';$(".comment_a").live('click',function() {$(".comment_reply").remove();$(".comment_a").show();$(this).after(reply).hide();ruser = $(this).prev().children().first().text();flowno = $(this).attr("flowno");});});5.当回复请求发送完成后,如果是新增楼层那就刷新楼层来显示,如果是楼层内产生的留言,那就js控制来插入$().appned();
function(data) {var comId = data.commentId;if(comId != ""){if(data.ruser == ""){//无被回复人$("#"+comId).append('<div class="w590 bg_color_blue3 pt5 pb5 pl15 pr15 fl b_b1_d_gray">'+'<p><span class="font_green">'+data.user+'</span> <span> : </span>'+'<span>'+data.content+'</span></p>'+'<a href="javascript:void(0);" class="font_blue fr comment_a isLogin" flowno="'+data.commentId+'">回复</a> </div>');}else{$("#"+comId).append('<div class="w590 bg_color_blue3 pt5 pb5 pl15 pr15 fl b_b1_d_gray">'+'<p> <span class="font_green">'+data.user+'</span> <span> 回复 </span>'+'<span class="font_gray">'+data.ruser+':</span><span>'+data.content+'</span> </p>'+'<a href="javascript:void(0);" class="font_blue fr comment_a isLogin" flowno="'+data.commentId+'">回复</a> </div>');}$(".comment_reply").remove();//$("#"+comId).focus();}四、总结:
1.这个功能是自己一步一步从一个困难走向另一个困难来解决的,有很多地方还不够完善,代码功底也不是很扎实,希望自己能够一步一步不断前进,在迷茫时能够给自己提供动力。
2.感谢公司内的同事给我提供的帮助
- 初窥——进入公司后的JAVA_WEB开发02
- 初窥——进入公司后的JAVA_WEB开发01
- 初窥——进入公司后的JAVA_WEB开发03_网站引入百度地图
- 初窥——进入公司后的JAVA_WEB开发04_锚链接使用
- 进入游戏开发公司后的感想
- 进入新公司后自己要学的技术
- 进入公司后的,Java成长之路
- Java_WEB开发_struts2学习的总结
- 刚进入公司的新人
- 进入大公司的感受
- 记录一美炸天程序媛进入新公司后的心酸历程
- 记录一美炸天程序媛进入新公司后的心酸历程
- java_web开发入门
- java_web开发入门
- java_web开发入门
- Java_WEB开发_struts2学习的总结_Iterate标签遍历
- Java_WEB开发_struts2学习的总结_Iterate标签遍历
- Java_web开发_SSH spring中取得Bean实例的方法
- 不同时间复杂度函数比较
- android 列表中播放视频(仿搜狐视频、微视等视频播放)
- java环境变量的配置
- linux
- File、Properties、printWiriter
- 初窥——进入公司后的JAVA_WEB开发02
- Android组件运行时的进程名是如何确定的
- Java 类中toString 及类的组合
- unity shader学习总结一
- dataGridView 批量更新数据 内存溢出的解决方案
- mysql启动报错
- [nagios监控] 监控samba服务
- ospf 理解
- 实现无序数组