package project.healingcamp.vo;
public class LikeVO {
private int like_no;
private int likeNum; //좋아요 체크 유무 - 좋아요 체크 :1 , 좋아요 미체크 :0
private int bidx;
private int uidx;
private String id;
}
getter, setter 생성
Mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="project.healingcamp.mapper.likeMapper">
<!-- 좋아요 체크 확인 -->
<select id="likeCount" parameterType="likeVO" resultType="int">
SELECT COUNT(*)
FROM liketable
WHERE bidx = #{bidx} AND id = #{id}
</select>
<!-- 좋아요 +1 -->
<insert id="likeUp" parameterType="likeVO">
INSERT into liketable(
like_no,
bidx,
id,
likenum
)VALUES(
like_no_seq.nextval,
#{bidx},
#{id},
1
)
</insert>
<!-- 좋아요 -1 -->
<delete id="likeDown" parameterType="likeVO">
DELETE liketable
WHERE bidx = #{bidx}
AND id= #{id}
</delete>
</mapper>
DAO
package project.healingcamp.dao;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import project.healingcamp.vo.LikeVO;
@Repository
public class LikeDAO {
@Autowired
private SqlSession sqlSession;
//좋아요 체크 확인
public int likeCount(LikeVO likeVO) {
return sqlSession.selectOne("project.healingcamp.mapper.likeMapper.likeCount", likeVO);
}
//좋아요 +1
public int likeUp(LikeVO likeVO) {
return sqlSession.insert("project.healingcamp.mapper.likeMapper.likeUp", likeVO);
}
//좋아요 -1
public int likeDown(LikeVO likeVO) {
return sqlSession.delete("project.healingcamp.mapper.likeMapper.likeDown", likeVO);
}
Service / ServiceImpl
package project.healingcamp.service;
import project.healingcamp.vo.LikeVO;
public interface LikeService {
public int likeUp(LikeVO likeVO);
public int likeCount(LikeVO likeVO);
public int likeDown(LikeVO likeVO);
}
package project.healingcamp.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import project.healingcamp.dao.Community_BoardDAO;
import project.healingcamp.dao.LikeDAO;
import project.healingcamp.vo.LikeVO;
@Service
public class LikeServiceImpl implements LikeService{
@Autowired
private LikeDAO likeDAO;
@Autowired
private Community_BoardDAO cboardDAO;
@Override
public int likeCount(LikeVO likeVO) {
return likeDAO.likeCount(likeVO);
}
@Override
public int likeUp(LikeVO likeVO) {
return likeDAO.likeUp(likeVO);
}
@Override
public int likeDown(LikeVO likeVO) {
return likeDAO.likeDown(likeVO);
}
}
Controller
boardController - 게시글 상세페이지
좋아요체크 여부를 상세페이지에 뿌려준다.
//게시글 상세보기 이동
@RequestMapping(value="/community_view.do",method=RequestMethod.GET)
public String community_view(int bidx,Model model,ReplyVO replyVO,HttpSession session) {
//호출된 결과를 vo에 담음
Community_BoardVO vo = cboardService.selectByBidx(bidx);
//조회수 증가
cboardService.hitCount(bidx);
//로그인정보
UserVo login = (UserVo)session.getAttribute("login");
//좋아요 클릭 체크
LikeVO likeVO = new LikeVO();
likeVO.setBidx(bidx);
if(login != null) {
likeVO.setId(login.getId()); //로그인했을시에는 로그인된 아이디
}else {
likeVO.setId(""); //미로그인시에는 빈값을 넘김
}
//model에 vo를 담아 화면에 넘김
model.addAttribute("vo",vo);
model.addAttribute("likeCount",likeService.likeCount(likeVO));
return "community/community_view";
likeController
package project.healingcamp.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import project.healingcamp.service.LikeService;
import project.healingcamp.vo.LikeVO;
@RequestMapping(value="/community")
@Controller
public class LikeController {
@Autowired
private LikeService likeService;
//좋아요 여부 확인
@RequestMapping(value="/likeCount.do",method=RequestMethod.POST)
@ResponseBody
public int likeCount(LikeVO likeVO) {
int result = likeService.likeCount(likeVO);
return result;
}
//좋아요 +1
@RequestMapping(value="/likeUp.do",method=RequestMethod.POST)
@ResponseBody
public void likeUp(LikeVO likeVO) {
likeService.likeUp(likeVO);
}
//좋아요 -1
@RequestMapping(value="/likeDown.do",method=RequestMethod.POST)
@ResponseBody
public void likeDown(LikeVO likeVO) {
likeService.likeDown(likeVO);
}
}
public int addLikeCnt(int bidx) {
return sqlSession.update("project.healingcamp.mapper.communityMapper.addLikeCnt", bidx);
}
public int removeLikeCnt(int bidx) {
return sqlSession.update("project.healingcamp.mapper.communityMapper.removeLikeCnt", bidx);
}
likeServiceImpl
@Override
public int likeUp(LikeVO likeVO) {
cboardDAO.addLikeCnt(likeVO.getBidx());
return likeDAO.likeUp(likeVO);
}
@Override
public int likeDown(LikeVO likeVO) {
cboardDAO.removeLikeCnt(likeVO.getBidx());
return likeDAO.likeDown(likeVO);
}
좋아요 클릭 시 좋아요 +1
좋아요 취소시 좋아요 -1 카운팅 된다.
ajax로 좋아요 총 갯수 업데이트
Mapper
해당 게시글의 좋아요 총 갯수를 조회하는 쿼리 작성
총 좋아요 갯수를 변수로 가지고 있는 boardVO를 반환값으로 지정한다.
<!-- 게시글의 좋아요 총 갯수 -->
<select id="likeNum" parameterType="int" resultType="cboardVO">
SELECT likes
FROM boardtable
WHERE bidx = #{bidx}
</select>
DAO
반환 타입 boardVO 반환값 boardVO
//좋아요 +1 / 좋아요 누른 후 총 갯수
public Community_BoardVO likeUp(LikeVO likeVO) {
Community_BoardVO cboardVO = new Community_BoardVO();
cboardVO.setBidx(likeVO.getBidx());
//좋아요 +1
sqlSession.update("project.healingcamp.mapper.likeMapper.addLikeCnt", cboardVO);
//로그인한 회원+게시글
int result = sqlSession.insert("project.healingcamp.mapper.likeMapper.likeUp", likeVO);
if(result == 1) {
// 좋아요 총 갯수
cboardVO = sqlSession.selectOne("project.healingcamp.mapper.likeMapper.likeNum", cboardVO);
}
return cboardVO;
}
//좋아요 -1 / 좋아요 취소 후 총 갯수
public Community_BoardVO likeDown(LikeVO likeVO) {
Community_BoardVO cboardVO = new Community_BoardVO();
cboardVO.setBidx(likeVO.getBidx());
//좋아요 -1
sqlSession.update("project.healingcamp.mapper.likeMapper.removeLikeCnt", cboardVO);
//좋아요 삭제
int result = sqlSession.delete("project.healingcamp.mapper.likeMapper.likeDown", likeVO);
if(result == 1) {
// 좋아요 총 갯수
cboardVO = sqlSession.selectOne("project.healingcamp.mapper.likeMapper.likeNum", cboardVO);
}
return cboardVO;
}
Service/ServiceImpl
//Service
//좋아요 +1
public Community_BoardVO likeUp(LikeVO likeVO);
//좋아요 -1
public Community_BoardVO likeDown(LikeVO likeVO);
//ServiceImpl
//좋아요 +1
@Override
public Community_BoardVO likeUp(LikeVO likeVO) {
Community_BoardVO cboardVO = new Community_BoardVO();
cboardVO = likeDAO.likeUp(likeVO);
return cboardVO;
}
//좋아요 -1
@Override
public Community_BoardVO likeDown(LikeVO likeVO) {
Community_BoardVO cboardVO = new Community_BoardVO();
cboardVO = likeDAO.likeDown(likeVO);
return cboardVO;
}
Controller
//좋아요 +1
@RequestMapping(value="/likeUp.do",method=RequestMethod.POST)
@ResponseBody
public Community_BoardVO likeUp(LikeVO likeVO) {
Community_BoardVO cboardVO = new Community_BoardVO();
cboardVO = likeService.likeUp(likeVO);
return cboardVO;
}
//좋아요 -1
@RequestMapping(value="/likeDown.do",method=RequestMethod.POST)
@ResponseBody
public Community_BoardVO likeDown(LikeVO likeVO) {
Community_BoardVO cboardVO = new Community_BoardVO();
cboardVO = likeService.likeDown(likeVO);
return cboardVO;
}
//좋아요 버튼 클릭
let num = 0;
$(".empathy").on("click",function(e){
if(num == 0){ //num이 0일때 좋아요 후 num 1로 변경
$(this).attr('src','./../resources/upload/like_color_change.jpg');
$(this).unbind('mouseenter mouseleave');//좋아요 on 일때 hover기능 unbind
num = 1;
}else{//num이 1일때 좋아요 취소 후 num 0으로 변경
$(this).attr('src','./../resources/upload/like.jpg');
num = 0;
}
});
//좋아요
$(".empathy").hover(
function(){//하트 마우스 올라왔을때
$(this).attr('src','./../resources/upload/like_color_change.jpg');
},
function(){//하트 마우스 벗어났을때
$(this).attr('src','./../resources/upload/like.jpg');
}
);
<!-- 커뮤니티 댓글 목록 -->
<select id="reply_list" resultType="replyVO" parameterType="int">
SELECT reply_idx
,reply_content
,id
,reply_wdate
,bidx
,uidx
,rdepth
,rparent
FROM replytable
WHERE bidx = #{bidx}
AND board_type = 0
ORDER BY rparent asc, reply_wdate asc
</select>
대댓글을 달은 댓글 밑에 대댓글 리스트를 작성 순서대로 출력하려면 부모댓글과 작성날짜를 정렬했어야했다.
@Repository
public class ReplyDAO {
@Autowired
private SqlSession sqlSession;
//댓글작성
public int reply_Insert(ReplyVO replyVO) {
return sqlSession.insert("project.healingcamp.mapper.replyMapper.reply_Insert", replyVO);
}
//커뮤니티 댓글 목록
public List<ReplyVO> reply_list(int bidx){
return sqlSession.selectList("project.healingcamp.mapper.replyMapper.reply_list",bidx);
}
//상담사 게시판 댓글 목록
public List<ReplyVO> counseller_reply_list(int bidx){
return sqlSession.selectList("project.healingcamp.mapper.replyMapper.counseller_reply_list",bidx);
}
//댓글 삭제
public int deleteByReply(ReplyVO replyVO) {
return sqlSession.delete("project.healingcamp.mapper.replyMapper.deleteByReply", replyVO);
}
//댓글 수정
public int updateByReply(ReplyVO replyVO) {
return sqlSession.update("project.healingcamp.mapper.replyMapper.updateByReply", replyVO);
}
//대댓글 작성
public int re_replyInsert(ReplyVO replyVO) {
return sqlSession.insert("project.healingcamp.mapper.replyMapper.re_replyInsert",replyVO);
}
}
Service(interface)
public interface ReplyService {
//댓글 작성
int reply_Insert(ReplyVO replyVO);
//댓글리스트
List<ReplyVO> reply_list(int bidx);
//댓글 삭제
int deleteByReply(ReplyVO replyVO);
//댓글 수정
int updateByReply(ReplyVO replyVO);
//대댓글 작성
int re_replyInsert(ReplyVO replyVO);
}
Service
@Service
public class ReplyServiceImpl implements ReplyService {
@Autowired
private ReplyDAO replyDAO;
@Autowired
private Community_BoardDAO cboardDAO;
//댓글 작성
//Community_BoardDAO 사용을 위한 트랜잭션
@Transactional
@Override
public int reply_Insert(ReplyVO replyVO) {
cboardDAO.addReplyCnt(replyVO.getBidx()); // 댓글 작성시 댓글 카운트 +1
return replyDAO.reply_Insert(replyVO);
}
//댓글 리스트
@Override
public List<ReplyVO> reply_list(int bidx) {
List<ReplyVO> reply_list = replyDAO.reply_list(bidx);
return reply_list;
}
//댓글 삭제
@Transactional
@Override
public int deleteByReply(ReplyVO replyVO) {
cboardDAO.removeReplyCnt(replyVO.getBidx()); //댓글 삭제 댓글카운트 -1
return replyDAO.deleteByReply(replyVO);
}
//댓글 수정
@Override
public int updateByReply(ReplyVO replyVO) {
return replyDAO.updateByReply(replyVO);
}
//대댓글 작성
@Transactional
@Override
public int re_replyInsert(ReplyVO replyVO) {
cboardDAO.addReplyCnt(replyVO.getBidx()); // 대댓글 작성시 카운트+1
return replyDAO.re_replyInsert(replyVO);
}
VO
public class ReplyVO {
private int reply_Idx; //댓글 번호
private String reply_Content; //댓글 내용
private String id; //댓글 작성한 아이디
private String reply_Wdate; //댓글 작성 날짜
private String reply_Ip; //댓글 작성 ip
private int bidx; //댓글 작성한 게시글 번호
private int uidx; //댓글 작성한 회원의 uidx
private int board_type; //게시판 유형
private int rdepth; //댓글 - rdepth:0 , 대댓글 - rdepth:1
private int rparent; //부모 댓글
//댓글목록
function getCommentList(){
//작성하려는 댓글의 게시물 번호
var bidx = $("input[name=bidx]").val();
$.ajax({
type:"get",
url:"community_replyList.do",
data:"bidx="+bidx,
success : function(result){
var html="";
if(result.length > 0){
for(i = 0; i < result.length; i++){
var reply_Idx = result[i].reply_Idx; //댓글번호
var bidx = result[i].bidx; // 댓글이 달린 게시글 번호
var reply_Content = result[i].reply_Content; //댓글 내용
var writer = result[i].id //댓글 작성자
var rdepth = result[i].rdepth //댓글깊이
var rparent = result[i].rparent;
console.log(rparent);
html += "<div class='reply_area"+rparent+"'>";
if(reply_Content == ""){ //삭제된 댓글일때
html += "<dlv>";
html += "<div>삭제된 댓글입니다.</div>"
html += "</dlv>";
}else{
if(rdepth == 0){//댓글일때
html += "<div class='reply_box'>";
html += "<div class='reply_box_wrapper"+reply_Idx+"'>"; //댓글 수정 버튼 클릭시 수정 창으로 바뀌는 부분(수정하려는 댓글의 idx)
html += "<div class='reply_info_wrapper'>";
html += "<ul class='reply_info'>";
html += "<li class='id'>"+result[i].id+"</li>";
html += "<li class='wdate'>"+result[i].reply_Wdate+"</li>";
if(id == result[i].id){ //현재 로그인된 아이디일시 댓글수정가능
html += "<li class='commentModify' onclick='commentModify("+reply_Idx+",\""+reply_Content+"\",\""+writer+"\");'>댓글수정</li>";
}else{
html += "<li class='re_reply' onclick='re_reply("+reply_Idx+","+bidx+")'>답글쓰기</li>";
}
if(id == result[i].id){//현재 로그인된 아이디일시 댓글삭제가능
html += "<li class='delete' onclick='deleteReply("+reply_Idx+","+bidx+");'>삭제</li>";
}else{
html += "<li class='report' onclick='reportReply()'>신고</li>";
}
html += "</ul>"; //.reply_info
html += "</div>"; //.reply_info_wrapper
html += "<div class='reply_view_wrapper'>";
html += "<div class='reply_view'>"+result[i].reply_Content+"</div>";
html += "</div>"; //.reply_view_wrapper
html += "</div>"; //.reply_box_wrapper
html += "</div>"; //.reply_box
html += "<div class='re_reply_area"+reply_Idx+"'></div>"; //답글작성이 들어갈 칸
}else{//대댓글일때
html += "<div class='re_reply_box'>";
html += "<div class='reply_box_wrapper"+reply_Idx+"'>"; //답글 수정 버튼 클릭시 수정 창으로 바뀌는 부분(수정하려는 답글의 idx)
html += "<span class='reply_ico'>└</span>";
html += "<div class='reply_info_wrapper' >";
html += "<ul class='reply_info'>";
html += "<li class='id'>"+result[i].id+"</li>";
html += "<li class='wdate'>"+result[i].reply_Wdate+"</li>";
if(id == result[i].id){
html += "<li class='commentModify' onclick='commentModify("+reply_Idx+",\""+reply_Content+"\",\""+writer+"\");'>댓글수정</li>";
}else{
html += "<li class='re_reply' onclick='re_reply("+reply_Idx+","+bidx+")'>답글쓰기</li>";
}
if(id == result[i].id){
html += "<li class='delete' onclick='deleteReply("+reply_Idx+","+bidx+");'>삭제</li>";
}else{
html += "<li class='report' onclick='reportReply()'>신고</li>";
}
html += "</ul>"; //.reply_info
html += "</div>"; //.reply_info_wrapper
html += "<div class='reply_view_wrapper'>";
html += "<div class='reply_view'>"+result[i].reply_Content+"</div>";
html += "</div>"; //.reply_view_wrapper
html += "</div>"; //.reply_box_wrapper
html += "</div>"; //.re_reply_box
}
}
html += "</div>"; //.reply_area
}
}else{
html += "<div>등록된 댓글이 없습니다.</div>";
}
$("#reply_wrapper").html(html);
},error:function(){
alert("error");
}
});
}