스프링부트+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>
'스프링부트' 카테고리의 다른 글
스프링부트+jsp로 배달사이트 만들기-24 찜하기(비회원) (0) | 2021.12.10 |
---|---|
스프링부트+jsp로 배달사이트 만들기-23 찜한 가게 목록 (0) | 2021.12.10 |
스프링부트+jsp로 배달사이트 만들기-21 인터셉터로 주소 불러오기 (0) | 2021.12.10 |
스프링부트+jsp로 배달사이트 만들기-20 주문목록 수정/페이징 (0) | 2021.12.09 |
스프링부트+jsp로 배달사이트 만들기-19 매장목록 수정/페이징 (0) | 2021.12.09 |