스프링부트+jsp로 배달사이트 만들기-22 찜하기(회원)

2021. 12. 10. 20:07스프링부트

주석 해제 하지 않았던 부분을 주석 해제 합니다

 

영업시간이 지난 매장에서 메뉴 선택시 알림창이 뜹니다

 


찜하기(하트) 버튼 클릭 시 서버로 매장 번호를 전송하고 매장 번호를 로그인 사용자는 db에 비로그인 사용자는 쿠키에 배열로 저장합니다

 

데이터를 받을 컨트롤러를 작성합니다

StoreController

// 찜하기
@ResponseBody
@PostMapping("/store/likes")
public long likes(long id, String likes, @AuthenticationPrincipal LoginService user, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    System.out.println("찜하기id =  " + id + " " + likes);
    long userId = 0;
    if (user == null) {
        
        
    } else {
        System.out.println("찜하기 회원");
        userId = user.getUser().getId();
        storeService.likes(id, likes, userId);
    }

    return userId;
}

lies가 on을 전달 받았을 땐 찜, off를 전달 받았을 땐 찜 해제를 합니다

 

Service와 DAO를 추가합니다

StoreService

// 찜
void likes(long storeId, String likes, long userId);

 

StoreServiceImp

@Override
public void likes(long storeId, String likes, long userId) {
    Map<String, Long> map = new HashMap<>();
    map.put("storeId", storeId);
    map.put("userId", userId);
    
    if(likes.equals("on")) {
        storeDAO.addLikes(map);
    } else {
        storeDAO.deleteLikes(map);
    }
    
}

 

StoreDAO

void addLikes(Map<String, Long> map);

void deleteLikes(Map<String, Long> map);

 

StoreDAOImp

@Override
public void addLikes(Map<String, Long> map) {
    sql.insert("store.addLikes", map);
}

@Override
public void deleteLikes(Map<String, Long> map) {
    sql.insert("store.deleteLikes", map);
}

 

StoreMapper

<insert id="addLikes">
    INSERT INTO BM_LIKES (
        USER_ID
        ,STORE_ID
    ) VALUES (
        #{userId }
        ,#{storeId }
    )
</insert>

<delete id="deleteLikes">
    DELETE BM_LIKES  WHERE 
    USER_ID = #{userId } AND
    STORE_ID = #{storeId }			
</delete>

 

하트를 빨간색으로 만들었을 때  db에 값이 입력되는지 확인합니다

 

 

찜 상태를 받아올 필드를 Store클래스에 추가합니다

private int isLikes;	// 0 찜x, 1 찜o

 

storeDetail 메서드를 userId도 같이 넘길 수 있게 수정합니다

StoreController

@GetMapping("/store/detail/{id}")
public String storeDetail(@PathVariable long id, Model model, @AuthenticationPrincipal LoginService user) {
    long userId = 0;
    if(user != null) {
        userId = user.getUser().getId();
    }
    
    StoreDetail storeDetail = storeService.storeDetail(id, userId);
    model.addAttribute("store", storeDetail);
    return "store/detail";
}

 

StoreService

StoreDetail storeDetail(long id, long userId);

 

StoreServiceImp

@Override
public StoreDetail storeDetail(long storeId, long userId) {
    Store storeInfo = storeDAO.storeDetail(storeId, userId); 
    List<Food> foodList = storeDAO.foodList(storeId);
    List<Review> reviewList = storeDAO.reviewList(storeId);
     
    return new StoreDetail(storeInfo, foodList, reviewList);
}

 

StoreDAO

Store storeDetail(long storeId, long userId);

 

StoreDAOImp

@Override
public Store storeDetail(long storeId, long userId) {
    Map<String, Long> map = new HashMap<>();
    map.put("storeId", storeId);
    map.put("userId", userId);
    return sql.selectOne("store.storeDetail", map);
}

 

StoreMapper

<select id="storeDetail" resultType="Store">
	SELECT	RESULT.*
			,L.IS_LIKES
			,CASE WHEN TO_CHAR(SYSDATE,'HH24') BETWEEN OPENING_TIME AND OPENING_TIME + BS_TIME THEN 'true' ELSE 'false' END IS_OPEN
	FROM	(SELECT S.*,
	    			C.*,
	    			CASE WHEN MOD(24 - S.OPENING_TIME + S.CLOSING_TIME, 24) != 0 THEN MOD(24 - S.OPENING_TIME + S.CLOSING_TIME, 24) ELSE 24 END BS_TIME
	    	FROM 	BM_STORE S
		        	,(SELECT * FROM  
			            	(SELECT	ROUND(AVG(SCORE),1) SCORE
			                ,COUNT(REVIEW_CONTENT) REVIEW_COUNT
			                ,COUNT(BOSS_COMMENT) BOSS_COMMENT_COUNT
			                ,COUNT(CASE WHEN SCORE=1 THEN 1 END) SCORE1
			                ,COUNT(CASE WHEN SCORE=2 THEN 1 END) SCORE2
			                ,COUNT(CASE WHEN SCORE=3 THEN 1 END) SCORE3
			                ,COUNT(CASE WHEN SCORE=4 THEN 1 END) SCORE4
			                ,COUNT(CASE WHEN SCORE=5 THEN 1 END) SCORE5
	            	FROM 	BM_REVIEW WHERE STORE_ID = #{storeId } ) 
	            	,(SELECT COUNT(*) LIKES_COUNT FROM BM_LIKES WHERE STORE_ID = #{storeId } )
		            ,(SELECT SUM(ORDER_COUNT) ORDER_COUNT FROM (
	                    SELECT COUNT(*) ORDER_COUNT FROM BM_ORDER_USER WHERE STORE_ID = #{storeId }
	                        UNION ALL
	                    SELECT COUNT(*) ORDER_COUNT FROM BM_ORDER_NON_USER WHERE STORE_ID = #{storeId } ))
	        		) C
	        WHERE 	ID = #{storeId }
	    	) RESULT
	LEFT JOIN   (SELECT STORE_ID, 1 IS_LIKES FROM BM_LIKES WHERE EXISTS(SELECT 1 FROM BM_LIKES WHERE USER_ID = #{userId } AND  STORE_ID = #{storeId } )) L
    ON          RESULT.ID = L.STORE_ID    	
	</select>

 

가게에 찜한 사용자 수를 추가하고 

아래의 사용자가 찜한 가게가 있을 경우 is_likes로 1을 출력하는 쿼리를 left join하였습니다

LEFT JOIN   (SELECT STORE_ID, 1 IS_LIKES FROM BM_LIKES WHERE EXISTS(SELECT 1 FROM BM_LIKES WHERE USER_ID = #{userId } AND  STORE_ID = #{storeId } )) L
ON          RESULT.ID = L.STORE_ID

 

 

StoreDetail.jsp 에 추가합니다

<c:choose>
    <c:when test="${info.isLikes == 1 }">
        <span><i class="fas fa-heart" ></i> 찜 </span>
    </c:when>
    
    <c:otherwise>
        <span><i class="far fa-heart" ></i> 찜 </span>
    </c:otherwise>
</c:choose>  	
    
<span class="likes_count" data-count=${info.likesCount } >${info.likesCount }</span>