8.주문 이력 조회WEB JAVA SPRING/PROJECT2023. 9. 12. 17:04
Table of Contents
1.OrderItemDto
/**
* 조회한 주문 데이터 화면에 보낼때 사용
* 주문 상품 정보 담음
*/
package com.shop.dto;
import com.shop.entity.OrderItem;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class OrderItemDto {
public OrderItemDto(OrderItem orderItem, String imgUrl){
this.itemNm = orderItem.getItem().getItemNm();
this.count = orderItem.getCount();
this.orderPrice = orderItem.getOrderPrice();
this.imgUrl = imgUrl;
}
private String itemNm; //상품명
private int count; //주문 수량
private int orderPrice; //주문 금액
private String imgUrl; //상품 이미지 경로
}
2.OrderHistDto
//주문 정보 담음
package com.shop.dto;
import com.shop.constant.OrderStatus;
import com.shop.entity.Order;
import lombok.Getter;
import lombok.Setter;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
//주문 정보 담음
@Getter @Setter
public class OrderHistDto {
public OrderHistDto(Order order){ //order 객체를 파라미터로 받아서 멤벼 변수 값 세팅
this.orderId = order.getId();
this.orderDate = order.getOrderDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
this.orderStatus = order.getOrderStatus();
}
private Long orderId; //주문아이디
private String orderDate; //주문날짜
private OrderStatus orderStatus; //주문 상태
private List<OrderItemDto> orderItemDtoList = new ArrayList<>();
//주문 상품리스트
public void addOrderItemDto(OrderItemDto orderItemDto){
orderItemDtoList.add(orderItemDto);
}
}
3.OrderRepository
//JPAL로 주문 이력을 조회
package com.shop.repository;
import com.shop.entity.Order;
import org.aspectj.weaver.ast.Or;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface OrderRepository extends JpaRepository<Order, Long> {
//현재 로그인한 사용자의 주문 데이터를 페이징 조건에 맞춰서 조회
@Query("select o from Order o " +
"where o.member.email = :email " +
"order by o.orderDate desc"
)
List<Order> findOrders(@Param("email") String email, Pageable pageable);
//현재 로그인한 회원의 주문 개수가 몇 개인지 조회
@Query("select count(o) from Order o " +
"where o.member.email = :email"
)
Long countOrder(@Param("email") String email);
}
4.ItemImgRepository
//상품의 대표이미지를 찾는 쿼리 메소드 : 구매이력 페이지에서 주문 상품의 대표 이미지를 보여주기 위해
ItemImg findByItemIdAndRepimgYn(Long itemId, String repimgYn);
5.OrderService
//주문 목록 조회
@Transactional(readOnly = true)
public Page<OrderHistDto> getOrderList(String email, Pageable pageable) {
//유저의 아이디와 페이징 조건 이용하여 주문 목록 조회
List<Order> orders = orderRepository.findOrders(email, pageable);
//유저의 주문 총 개수
Long totalCount = orderRepository.countOrder(email);
List<OrderHistDto> orderHistDtos = new ArrayList<>();
//주문 리스트 순회하면서 구매 이력 페이지에 전달할 DTO 생성
for (Order order : orders) {
OrderHistDto orderHistDto = new OrderHistDto(order);
List<OrderItem> orderItems = order.getOrderItems();
for (OrderItem orderItem : orderItems) {
ItemImg itemImg = itemImgRepository.findByItemIdAndRepimgYn
(orderItem.getItem().getId(), "Y"); //대표이미지 조회
OrderItemDto orderItemDto =
new OrderItemDto(orderItem, itemImg.getImgUrl());
orderHistDto.addOrderItemDto(orderItemDto);
}
orderHistDtos.add(orderHistDto);
}
//페이지 구현 객체를 생성하여 반환
return new PageImpl<OrderHistDto>(orderHistDtos, pageable, totalCount);
}
6.OrderController
//구매이력조회, 지금까지 구현한 로직 호출
@GetMapping(value = {"/orders", "/orders/{page}"})
public String orderHist(@PathVariable("page") Optional<Integer> page, Principal principal, Model model){
Pageable pageable = PageRequest.of(page.isPresent() ? page.get() : 0, 4);
//현재 로그인한 회원은 이메일과 페이징 객체를 파라미터로 전달하여 화면에 전달한 주문목록데이터를 리턴값으로 받음
Page<OrderHistDto> ordersHistDtoList = orderService.getOrderList(principal.getName(), pageable);
model.addAttribute("orders", ordersHistDtoList);
model.addAttribute("page", pageable.getPageNumber());
model.addAttribute("maxPage", 5);
return "order/orderHist";
}
orderHist.html
<div layout:fragment="content" class="content-mg">
<h2 class="mb-4">
구매 이력
</h2>
<div th:each="order : ${orders.getContent()}">
<div class="d-flex mb-3 align-self-center">
<h4 th:text="${order.orderDate} + ' 주문'"></h4>
<div class="ml-3">
<th:block th:if="${order.orderStatus == T(com.shop.constant.OrderStatus).ORDER}">
<button type="button" class="btn btn-outline-secondary" th:value="${order.orderId}" onclick="cancelOrder(this.value)">주문취소</button>
</th:block>
<th:block th:unless="${order.orderStatus == T(com.shop.constant.OrderStatus).ORDER}">
<h4>(취소 완료)</h4>
</th:block>
</div>
</div>
<div class="card d-flex">
<div th:each="orderItem : ${order.orderItemDtoList}" class="d-flex mb-3">
<div class="repImgDiv">
<img th:src="${orderItem.imgUrl}" class = "rounded repImg" th:alt="${orderItem.itemNm}">
</div>
<div class="align-self-center w-75">
<span th:text="${orderItem.itemNm}" class="fs24 font-weight-bold"></span>
<div class="fs18 font-weight-light">
<span th:text="${orderItem.orderPrice} +'원'"></span>
<span th:text="${orderItem.count} +'개'"></span>
</div>
</div>
</div>
</div>
</div>
<div th:with="start=${(orders.number/maxPage)*maxPage + 1}, end=(${(orders.totalPages == 0) ? 1 : (start + (maxPage - 1) < orders.totalPages ? start + (maxPage - 1) : orders.totalPages)})" >
<ul class="pagination justify-content-center">
<li class="page-item" th:classappend="${orders.number eq 0}?'disabled':''">
<a th:href="@{'/orders/' + ${orders.number-1}}" aria-label='Previous' class="page-link">
<span aria-hidden='true'>Previous</span>
</a>
</li>
<li class="page-item" th:each="page: ${#numbers.sequence(start, end)}" th:classappend="${orders.number eq page-1}?'active':''">
<a th:href="@{'/orders/' + ${page-1}}" th:inline="text" class="page-link">[[${page}]]</a>
</li>
<li class="page-item" th:classappend="${orders.number+1 ge orders.totalPages}?'disabled':''">
<a th:href="@{'/orders/' + ${orders.number+1}}" aria-label='Next' class="page-link">
<span aria-hidden='true'>Next</span>
</a>
</li>
</ul>
</div>
</div>
'WEB JAVA SPRING > PROJECT' 카테고리의 다른 글
10. 장바구니 담기 (0) | 2023.09.12 |
---|---|
9.주문 취소 (0) | 2023.09.12 |
7.주문 기능 (0) | 2023.09.12 |
6.메인 화면 (0) | 2023.09.12 |
5.상품 관리하기 : Querydsl (0) | 2023.09.12 |