22-08-20 진행상황

(。◠ ◠。)·2022년 8월 21일
0

후기댓글의 공감기능을 완성시켰다.


다른 사용자가 1 공감을 해 놓은 상태이다.

공감을 누르면 안내창이 뜨고

데이터베이스에 내 공감이 들어가고 공감한 상태가 저장된다.

추천상태의 버튼을 한번 더 누르면 확인/취소 창이 뜬다

어려웠던부분

1. 반복문 안에서 각기다른 체크박스에게 효과주기

1번의 경우 id값을 변수로 주고 클릭시 함수를 실행해서 그 변수를 다시 아이디값으로 받아오게 했다.

onclick시 recommend함수 실행하고 매개변수를 보내줌
<input type="checkbox" class="reco" id="${reply.reviewNum}">

변수설정을 하고 리뷰에도 변수를 넣어주고..
var rvNum
function recommend(rvNum){
id값을 변수로 받아서 해당 id가 체크되었다면..으로 각각 따로 관리할 수 있게 되었다.
$('#'+rvNum).is(":checked")

2. 해당 사용자가 공감한 리뷰인지 확인하기

이부분이 더 어쩌나아아 했던 부분인데
처음에 에이젝스로 값을 보내주려고 했는데 리뷰의 고유번호가 반복문 안에 있어서 보내기가 쉽지 않았다.
어떤 버튼을 눌러서 함수가 진행되는 부분이 아닌 페이지가 로딩되었을때 바로 추천표시도 같이 떠야했기 때문이다

그래서 먼저 해당사용자가 추천을 한 댓글이면 1을 반환 그렇지 않으면 0을 반환하는 함수를 만든 후,

public int checkRecommend(int rvNum, String uid) {
	String sql = "select * from recommend where reviewNum = ? and u_id = ?";

댓글을 불러오는 리스트에 해당 checkRecommend함수와 필요한 매개변수를 넣어주었다.
vo.setRecommend(rs.getInt("recommend"));

	while (rs.next()) {
		ReplyVO vo = new ReplyVO();
		vo.setReviewNum(rs.getInt("reviewnum"));
		vo.setNickName(rs.getString("nickName"));
		vo.setGrade(rs.getString("grade"));
		vo.setProductName(rs.getString("productName"));
		vo.setProductReply(rs.getString("text"));
		vo.setRvDate(rs.getString("regdate"));
		vo.setReviewPic(rs.getString("reviewpic"));
		vo.setRecommend(rs.getInt("recommend"));
		vo.setCheckRecommend(checkRecommend(rs.getInt("reviewnum"),uid))
        list.add(vo);
	}

그러자 뷰에 0 또는 1을 반환했다.
그래서 1을 반환(추천을 누른경우)하면 체크박스를 띄울때 checked한 상태로 띄웠다.
그렇지 않은 경우는 체크되지 않은경우로 띄우게 했다.

<!-- 사용자가 공감을 누른경우 ->1 체크박스를 checked로 -->
<c:choose>
	<c:when test="${reply.checkRecommend eq 1}">
		<input type="checkbox" class="reco" id="${reply.reviewNum}" 
     	   onclick="recommend(${reply.reviewNum});" checked>
	</c:when>
	<c:otherwise>
		<input type="checkbox" class="reco" id="${reply.reviewNum}" 
        	onclick="recommend(${reply.reviewNum});">
	</c:otherwise>
</c:choose>

생각한대로 풀리니까 재미있었다!

코드

자바스크립트단

var rvNum
	function recommend(rvNum){
		
		if(nickname != "null"){
			//추천이 안되어있으면 추천하기
			if($('#'+rvNum).is(":checked")){
				 $.ajax({
		             url:"UpdateReplyServlet",
		             type:"get",
		             dataType:"text",
		             data:{
		     			 flag : 1,
		            	 rvNum : rvNum
		             },
		             success:function(data){
		            	 if(data==1){
		            		 location.reload();
		            		 alert("추천완료!");
		            	 }
		             }
				});
			//추천이 되어있으면 추천에서 빼기
			}else if(!$('#'+rvNum).is(":checked")){
				if(confirm('추천에서 뺄까요?')==true){
					 $.ajax({
			             url:"UpdateReplyServlet",
			             type:"get",
			             dataType:"text",
			             data:{
			     			 flag : 2,
			            	 rvNum : rvNum
			             },
			             success:function(data){
			            	 if(data==1){
			            		 location.reload();
			            		 alert("추천에서 제외했어요");
			            	 }
			             }
					});
				}else{
					$('#'+rvNum).prop("checked",true);
				}
				
			}
		
		}else{
// 			비회원일 경우 체크박스 막기
			$('#'+rvNum).prop("checked",false);
			alert('공감은 회원만 가능합니다.');
		}
		
	}

추천을 넣고 빼는 서블릿

		ReplyDAO dao = new ReplyDAO();
		String rvNum = request.getParameter("rvNum");
		int flag = Integer.parseInt(request.getParameter("flag"));
		if(flag == 1) {
			//있는지 체크
			int check = dao.checkRecommend(rvNum,id);
			if(check == 1) {
				int plus = dao.recommendRv(rvNum);
				if(plus == 1 ) {
					out.print(1);
					System.out.println("추천완료");
				}
			}
			
		}else if(flag == 2) {
			int mCheck = dao.checkUnRecommend(rvNum,id);
			if(mCheck== 1) {
				int minus = dao.unRecommendRv(rvNum);
				if(minus == 1) {
					out.print(1);
					System.out.println("빼기완료");
				}
				
			}
		}

dao

//추천하기
		public int recommendRv(String rvNum) {
			int result = 0;
			String sql = "update review set recommend=(recommend+1) where reviewNum = ? ";
			conn = db.getConnection();
			try {
				PreparedStatement pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, rvNum);
				result = pstmt.executeUpdate();
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return result;
		}
		
		//추천카운트
		public int checkRecommend(String rvNum, String id) {
			int result = 0;
			String sql = "insert into recommend values(?,?)";
			conn = db.getConnection();
			try {
				PreparedStatement pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, rvNum);
				pstmt.setString(2, id);
				result = pstmt.executeUpdate();
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return result;
		}
		
		//추천빼기
		public int unRecommendRv(String rvNum) {
			int result = 0;
			String sql = "update review set recommend=(recommend-1) where reviewNum = ? ";
			conn = db.getConnection();
			try {
				PreparedStatement pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, rvNum);
				result = pstmt.executeUpdate();
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return result;
		}
		
		//추천카운트 뺴기
		public int checkUnRecommend(String rvNum, String id) {
			int result = 0;
			String sql = "delete from recommend where reviewNum = ? and u_id = ?";
			conn = db.getConnection();
			try {
				PreparedStatement pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, rvNum);
				pstmt.setString(2, id);
				result = pstmt.executeUpdate();
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return result;
		}
profile
화이탱!

0개의 댓글