카트 담은거 보여주는 [ cart_partial.html ]
-> (장바구니 페이지 제외) 모든 페이지마다 공통으로 들어가는 사이드 카트이다. (상품개수, 총가격)
<div class="bg-dark text-white p-3 mt-3" th:fragment="cart_partial">
<div class="cart cartActive" th:if="${cartActive}">
<p>장바구니에 <span th:text="${csize}"></span> 개 상품이 있습니다.</p>
<p>총 가격은 <span th:text="${ctotal}"></span> 원 입니다.</p>
<p>
<a href="/cart/view" class="btn btn-success">카트 보기</a>
<a href="/cart/clear" class="btn btn-danger float-right">비우기</a>
</p>
</div>
<div class="cart cartInactive" th:unless="${cartActive}">
<p>장바구니가 없습니다.</p>
</div>
</div>
th:if 는 if 절을 의미 , th:unless 는 not if 를 의미
th:if="${cartActive}"
th:unless="${cartActive}"
[ Common ]
model.addAttribute("cartActive", cartActive); 을 쓴 이유
장바구니가 있으면 true , 없으면 false
th:fragment="cart_partial" -> [categoreis.html] 에 추가
<div th:replace="/fragments/cart_partial"></div>
[ CatrController ]
@GetMapping("/add/{id}") 상품 id 추가할때
밑에 추가하기
HashMap<Integer, Cart> cart = (HashMap<Integer, Cart>)session.getAttribute("cart");
int size = 0; //장바구니 상품 갯수
int totalPrice = 0; //총 가격
//장바구니 cart객체 반복 (1,cart객체) (2,cart객체)... id빼고 객체만
for(Cart item : cart.values()) {
size += item.getQuantity(); // 장바구니 갯수
totalPrice += item.getQuantity() * Integer.parseInt(item.getPrice()); //가격 문자형인데 int형변환 해주기
}
model.addAttribute("size", size);
model.addAttribute("totalPrice", totalPrice);
return "cart_view";
[ products.html ]
상품 밑에 카트 담는 버튼 추가
<div style="position: relative">
<p>
<a class="btn btn-primary addToCart" th:attr="data-id=${product.id}" th:href="@{'/cart/add/' + ${product.id}}">
장바구니담기
</a>
</p>
<div class="btn btn-sm btn-success hide productAdded">추가됨!</div>
</div>
※ relative는 부모, absolute는 자식이라고 보면된다.
부모 position: relative
자식은 css로 position: absolute 넣어서
div.productAdded 가 자식이 됨.
div.productAdded {
position: absolute;
bottom: 5px;
left: 10em;
}
.hide {
display: none;
}
= 추가! 버튼은 일단 숨기고
나중에 장바구니 담기 버튼 누를시 '추가!' 텍스트가 뜨도록 해주자!
<a class="btn btn-primary addToCart" th:attr="data-id=${product.id}"
th:href="@{'/cart/add/' + ${product.id}}">
장바구니 담기
</a>
- 장바구니 담기 버튼을 눌렀을때 이동하는 과정
th:href="@{'/cart/add/' + ${product.id}}" 의 주소인 @GetMapping("/add/{id}") 의 return "cart_view" 페이지로
- AJAX로 장바구니 추가 업데이트 시키기
위의 장바구니 담기 버튼 눌렀을때 실행하는 함수
<script>
$('a.addToCart').click(function(e){
alert('장바구니 누름');
})
</script>
[ cart_view ] 만들기
<p>장바구니에 <span th:text="${size}"></span> 개 상품이 있습니다.</p>
<p>총 가격은 <span th:text="${totalPrice}"></span> 원 입니다.</p>
<p>
<a href="/cart/view" class="btn btn-success">카트 보기</a>
<a href="/cart/clear" class="btn btn-danger float-right">비우기</a>
</p>
결과
근데! 위의 cart_view 페이지로 안넘어가게 하도록 하려면
e.preventDefault(); 써서 a태그의 이동요청이 취소되도록 해준다.
<script>
$('a.addToCart').click(function(e){
alert('장바구니 누름');
e.preventDefault();
let $this = $(this);
let id = $this.attr('data-id');
let url = '/cart/add/'+id;
})
</script>
let $this = $(this);
- id가 있어야 controller 에 넘김.
let id = $this.attr('data-id'); -> 클릭한 속성값이 data-id인 product.id값을 id 변수에 저장
장바구니 담기 클릭버튼에
th:attr="data-id=${product.id}" 의 의미는 data-id의 속성이 product.id 이다
#AJAX
가져오는 주소 url / 보내는 데이터 없음 {} / 결과 데이터 data
$.get(url,{},function(data){
console.log(data);
});
/cart/add/{id}의 return값 cart_view.html 로 가는게 아니라 AJAX로 결과값 data를 보내줌
왜안나오지..???
그 결과값을 아래의 장바구니 표시부분에 [cart_partial] 에 보여주기
AJAX
$.get(url,{},function(data){
$('div.cart').html(data); //장바구니 덮어쓰기
}).done(function(){ //.done 성공했을때
$this.parent().parent().find('div.productAdded').fadeIn(); //'추가!'가 희미하게 보여짐
setTimeout(function(){ //1초동안 희미하게 사라지는 함수
$this.parent().parent().find('div.productAdded').fadeOut();
},1000);
})
- 장바구니 덮어쓰기
$('div.cart').html(data); 는 어디서 오느냐
<div class="cart cartActive" th:if="${cartActive}"> <p>장바구니에 <span th:text="${csize}"></span> 개 상품이 있습니다.</p> <p>총 가격은 <span th:text="${ctotal}"></span> 원 입니다.</p> <p> <a href="/cart/view" class="btn btn-success">카트 보기</a> <a href="/cart/clear" class="btn btn-danger float-right">비우기</a> </p> </div>
위의 [cart_partial.html] 의 div.cart
th:fragment="cart_partial"모든 페이지에 나오는 카테고리에서 cart_patial도 출력됨
[categories.html] <div th:replace="/fragments/cart_partial"></div>
- 추가! 버튼 나타났다가 사라지기 이벤트
$this.parent().parent().find('div.productAdded').fadeIn();
장바구니 담기 버튼(this)을 눌렀을때 -> .부모(p) -> .부모(div) 에서 찾는
div.productAdded 는 추가! 버튼
fadeIn() 희미하게 보여지도록, fadeOut() 희미하게 사라지도록 함수 주기
☆새로고침하면 세션에서 다 비워져서 다시 원상태로 돌아간다.
'Spring boot | 쇼핑몰 만들기 | 어글리 마켓 > 홈페이지 만들기 | 고객,관리자' 카테고리의 다른 글
[레시피]게시판 글 수정 기능 (0) | 2022.05.17 |
---|---|
장바구니 결제하기 (0) | 2022.05.12 |
모든 페이지 내에 카테고리 만들기 (0) | 2022.05.06 |
메인 홈페이지 만들고, 네브바에 페이지 클릭시 이동 (0) | 2022.05.05 |
WYSIWYG 문서 편집기능 (0) | 2022.05.05 |