diff --git a/order-service/src/docs/asciidoc/api-docs.adoc b/order-service/src/docs/asciidoc/api-docs.adoc index f38345e..2b99ce5 100644 --- a/order-service/src/docs/asciidoc/api-docs.adoc +++ b/order-service/src/docs/asciidoc/api-docs.adoc @@ -64,11 +64,17 @@ == snippets 작성 컨벤션 domain-httpRequestCode-etc -== 주문 -=== 점주 서비스 - 주문 페이지 +== 점주 서비스 +=== 주문 페이지 - 페이지 offset : 6 operation::orderMain-get[snippets='curl-request,http-request,http-response,request-parameters,response-fields'] === 점주 서비스 - 주문 페이지 (잘못된 파라미터 형식) operation::orderMain-get-badParameterException[snippets='curl-request,http-request,http-response,request-parameters,response-fields'] + +=== 점주 서비스 - 지난 주문 페이지 +operation::prevOrder-get[snippets='curl-request,http-request,http-response,request-parameters,response-fields'] + +=== 점주 서비스 - 지난 주문 페이지 (잘못된 파라미터 형식) +operation::prevOrder-get-BindException[snippets='curl-request,http-request,http-response,request-parameters,response-fields'] \ No newline at end of file diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/PrevOrderSearch.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/PrevOrderSearch.java new file mode 100644 index 0000000..bce81e6 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/PrevOrderSearch.java @@ -0,0 +1,31 @@ +package com.justpickup.orderservice.domain.order.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +@Data @NoArgsConstructor @AllArgsConstructor +public class PrevOrderSearch { + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "시작일은 필수 값입니다.") + private LocalDate startDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "종료일은 필수 값입니다.") + private LocalDate endDate; + + public LocalDateTime getStartDateTime() { + return startDate.atStartOfDay(); + } + + public LocalDateTime getEndDateTime() { + return LocalDateTime.of(endDate, LocalTime.of(23, 59, 59)); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java index 7b178e7..6a678a8 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java @@ -1,10 +1,14 @@ package com.justpickup.orderservice.domain.order.repository; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; import com.justpickup.orderservice.domain.order.entity.Order; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; @@ -48,4 +52,32 @@ public class OrderRepositoryCustom { return lastOrderId != null ? order.id.lt(lastOrderId) : null; } + public Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId) { + // 카운트 가져오기 + Long count = queryFactory + .select(order.countDistinct()) + .from(order) + .innerJoin(order.transaction) + .where( + order.orderTime.between(search.getStartDateTime(), search.getEndDateTime()), + order.storeId.eq(storeId) + ) + .fetchOne(); + + // 데이터 가져오기 + List orders = queryFactory + .selectFrom(order) + .join(order.transaction).fetchJoin() + .where( + order.orderTime.between(search.getStartDateTime(), search.getEndDateTime()), + order.storeId.eq(storeId) + ) + .orderBy(order.orderTime.desc()) + .limit(pageable.getPageSize()) + .offset(pageable.getOffset()) + .distinct() + .fetch(); + + return PageableExecutionUtils.getPage(orders, pageable, () -> count); + } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java index 6c9e6b8..6dda0d7 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java @@ -2,9 +2,14 @@ package com.justpickup.orderservice.domain.order.service; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; public interface OrderService { List findOrderMain(OrderSearchCondition condition, Long storeId); + + Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId); } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java index 87c0db6..940f177 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java @@ -2,6 +2,8 @@ package com.justpickup.orderservice.domain.order.service; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; +import com.justpickup.orderservice.domain.order.entity.Order; import com.justpickup.orderservice.domain.order.repository.OrderRepository; import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom; import com.justpickup.orderservice.global.client.store.GetItemResponse; @@ -10,6 +12,9 @@ import com.justpickup.orderservice.global.client.user.GetCustomerResponse; import com.justpickup.orderservice.global.client.user.UserClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +42,27 @@ public class OrderServiceImpl implements OrderService { .collect(Collectors.toList()); // 사용자명 및 아이템 이름 가져오기 + getUserNameAndItemName(orderDtoList); + + return orderDtoList; + } + + @Override + public Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId) { + Page orderPage = orderRepositoryCustom.findPrevOrderMain(search, pageable, storeId); + + List orderDtoList = orderPage.getContent() + .stream() + .map(OrderDto::createFullField) + .collect(Collectors.toList()); + + // 사용자명 및 아이템 이름 가져오기 + getUserNameAndItemName(orderDtoList); + + return PageableExecutionUtils.getPage(orderDtoList, pageable, orderPage::getTotalElements); + } + + private void getUserNameAndItemName(List orderDtoList) { orderDtoList.forEach(orderDto -> { GetCustomerResponse getCustomerResponse = userClient.getUser(orderDto.getUserId()).getData(); @@ -49,7 +75,5 @@ public class OrderServiceImpl implements OrderService { orderItemDto.setItemName(getItemResponse.getName()); }); }); - - return orderDtoList; } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/validator/PrevOrderSearchValidator.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/validator/PrevOrderSearchValidator.java new file mode 100644 index 0000000..bc2102c --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/validator/PrevOrderSearchValidator.java @@ -0,0 +1,28 @@ +package com.justpickup.orderservice.domain.order.validator; + +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +import java.time.LocalDate; + +@Component +public class PrevOrderSearchValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return PrevOrderSearch.class.equals(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + PrevOrderSearch search = (PrevOrderSearch) target; + + LocalDate startDate = search.getStartDate(); + LocalDate endDate = search.getEndDate(); + if (startDate.isAfter(endDate)) { + errors.rejectValue("startDate", "isAfter", "시작일은 종료일보다 클 수 없습니다."); + } + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java index c55c363..1ce5ff5 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java @@ -2,8 +2,10 @@ package com.justpickup.orderservice.domain.order.web; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.order.service.OrderService; +import com.justpickup.orderservice.domain.order.validator.PrevOrderSearchValidator; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.global.dto.Result; import lombok.AllArgsConstructor; @@ -11,12 +13,18 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; @@ -27,9 +35,10 @@ import java.util.stream.Collectors; public class OrderController { private final OrderService orderService; + private final PrevOrderSearchValidator prevOrderSearchValidator; @GetMapping("/orderMain") - public ResponseEntity orderMain(@Valid OrderSearchCondition condition) { + public ResponseEntity orderMain(@Valid OrderSearchCondition condition) { // TODO: 2022/02/04 JWT 구현 시 변경 요망 Long userId = 1L; Long storeId = 1L; @@ -81,4 +90,70 @@ public class OrderController { this.itemName = orderItemDto.getItemName(); } } + + @GetMapping("/prevOrder") + public ResponseEntity findPrevOrder(@Valid PrevOrderSearch prevOrderSearch, + @PageableDefault(page = 0, size = 10) Pageable pageable, + BindingResult bindingResult) throws BindException { + // validation + if (bindingResult.hasErrors()) throw new BindException(bindingResult); + prevOrderSearchValidator.validate(prevOrderSearch, bindingResult); + if (bindingResult.hasErrors()) throw new BindException(bindingResult); + + // get data + Page prevOrderMain = orderService.findPrevOrderMain(prevOrderSearch, pageable, 1L); + + // format data + ResponsePrevOrder responsePrevOrder = + new ResponsePrevOrder(prevOrderMain.getContent(), prevOrderMain.getNumber(), prevOrderMain.getTotalPages()); + return ResponseEntity.ok(Result.createSuccessResult(responsePrevOrder)); + } + + @Data @AllArgsConstructor @NoArgsConstructor + static class ResponsePrevOrder { + private List orders; + private Page page; + + public ResponsePrevOrder(List orderDtoList, int startPage, int totalPage) { + orders = orderDtoList.stream().map(OrderVo::new).collect(Collectors.toList()); + page = new Page(startPage, totalPage); + } + + @Data + static class OrderVo { + private Long orderId; + private OrderStatus orderStatus; + private String orderTime; + private Long orderPrice; + private String userName; + private List orderItems; + + public OrderVo(OrderDto orderDto) { + this.orderId = orderDto.getId(); + this.orderStatus = orderDto.getOrderStatus(); + this.orderTime = orderDto.getOrderTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + this.orderPrice = orderDto.getOrderPrice(); + this.userName = orderDto.getUserName(); + this.orderItems = orderDto.getOrderItemDtoList() + .stream().map(OrderItemVo::new).collect(Collectors.toList()); + } + } + + @Data + static class OrderItemVo { + private Long orderItemId; + private String orderItemName; + + public OrderItemVo(OrderItemDto orderItemDto) { + this.orderItemId = orderItemDto.getId(); + this.orderItemName = orderItemDto.getItemName(); + } + } + + @Data @AllArgsConstructor + static class Page { + int startPage; + int totalPage; + } + } } diff --git a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java index 345817f..fb8f713 100644 --- a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java +++ b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java @@ -4,8 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.justpickup.orderservice.config.TestConfig; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.order.service.OrderService; +import com.justpickup.orderservice.domain.order.validator.PrevOrderSearchValidator; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.global.dto.Code; import org.junit.jupiter.api.DisplayName; @@ -14,11 +16,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Import; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import static org.mockito.BDDMockito.given; @@ -26,10 +33,11 @@ import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.docu import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.requestParameters; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.restdocs.request.RequestDocumentation.*; @WebMvcTest(OrderController.class) @Import(TestConfig.class) @@ -45,6 +53,9 @@ class OrderControllerTest { @MockBean OrderService orderService; + @SpyBean + PrevOrderSearchValidator prevOrderSearchValidator; + @Test @DisplayName("점주 서비스 - 주문 페이지") void getOrderMain() throws Exception { @@ -169,4 +180,101 @@ class OrderControllerTest { return List.of(orderDto_1, orderDto_2); } + + @Test + @DisplayName("점주 서비스 - 지난 주문 페이지") + void getPrevOrder() throws Exception { + // GIVEN + LocalDate startDate = LocalDate.of(2022, 2, 3); + LocalDate endDate = LocalDate.of(2022, 2, 4); + String page = "0"; + + PrevOrderSearch search = new PrevOrderSearch(LocalDate.of(2022, 2, 3), LocalDate.of(2022, 2, 4)); + PageRequest pageRequest = PageRequest.of(Integer.parseInt(page), 10); + given(orderService.findPrevOrderMain(search, pageRequest, 1L)) + .willReturn( + new PageImpl<>(getOrderMainDtoList(), pageRequest, 1) + ); + + // WHEN + ResultActions actions = mockMvc.perform(get("/prevOrder") + .param("startDate", startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .param("endDate", endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .param("page", page) + ); + + // THEN + actions.andExpect(status().isOk()) + .andExpect(jsonPath("code").value(Code.SUCCESS.name())) + .andExpect(jsonPath("message").isEmpty()) + .andExpect(jsonPath("data.orders[*].orderId").exists()) + .andExpect(jsonPath("data.orders[*].orderStatus").exists()) + .andExpect(jsonPath("data.orders[*].orderTime").exists()) + .andExpect(jsonPath("data.orders[*].orderPrice").exists()) + .andExpect(jsonPath("data.orders[*].userName").exists()) + .andExpect(jsonPath("data.orders[*].orderItems[*].orderItemId").exists()) + .andExpect(jsonPath("data.orders[*].orderItems[*].orderItemName").exists()) + .andExpect(jsonPath("data.page.startPage").value(0)) + .andExpect(jsonPath("data.page.totalPage").value(1)) + .andDo(print()) + .andDo(document("prevOrder-get", + requestParameters( + parameterWithName("startDate").description("시작날짜 YYYY-MM-DD"), + parameterWithName("endDate").description("종료날짜 YYYY-MM-DD"), + parameterWithName("page").optional().description("검색 페이지 (0부터 시작)") + ), + responseFields( + fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data.orders[*].orderId").description("주문 고유번호"), + fieldWithPath("data.orders[*].orderStatus").description("주문상태"), + fieldWithPath("data.orders[*].orderTime").description("주문시간"), + fieldWithPath("data.orders[*].orderPrice").description("결제금액"), + fieldWithPath("data.orders[*].userName").description("닉네임"), + fieldWithPath("data.orders[*].orderItems[*].orderItemId").description("주문상품 고유번호"), + fieldWithPath("data.orders[*].orderItems[*].orderItemName").description("주문상품 이름"), + fieldWithPath("data.page.startPage").description("현재 페이지 (0부터 시작)"), + fieldWithPath("data.page.totalPage").description("총 페이지 개수") + ) + )) + ; + } + + @Test + @DisplayName("점주 서비스 - 지난 주문 페이지 (파라미터 오류)") + void getPrevOrderBindException() throws Exception { + // GIVEN + LocalDate startDate = LocalDate.of(2023, 2, 3); + LocalDate endDate = LocalDate.of(2022, 2, 4); + String page = "0"; + + PrevOrderSearch search = new PrevOrderSearch(startDate, endDate); + + // THEN + ResultActions actions = mockMvc.perform(get("/prevOrder") + .param("startDate", startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .param("endDate", endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .param("page", page) + ); + + // WHEN + actions.andExpect(status().isBadRequest()) + .andExpect(jsonPath("code").value(Code.ERROR.name())) + .andExpect(jsonPath("message").isNotEmpty()) + .andExpect(jsonPath("data").isEmpty()) + .andDo(print()) + .andDo(document("prevOrder-get-BindException", + requestParameters( + parameterWithName("startDate").description("시작날짜 YYYY-MM-DD"), + parameterWithName("endDate").description("종료날짜 YYYY-MM-DD"), + parameterWithName("page").optional().description("검색 페이지 (0부터 시작)") + ), + responseFields( + fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data").description("데이터") + ) + )) + ; + } } \ No newline at end of file diff --git a/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/domain/prevorder/web/PrevOrderController.java b/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/domain/prevorder/web/PrevOrderController.java new file mode 100644 index 0000000..a7fdf7e --- /dev/null +++ b/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/domain/prevorder/web/PrevOrderController.java @@ -0,0 +1,13 @@ +package com.justpickup.ownerfrontendservice.domain.prevorder.web; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class PrevOrderController { + + @GetMapping("/prev-order") + public String prevOrder() { + return "domain/prev-order/prev-order"; + } +} diff --git a/owner-frontend-service/src/main/resources/static/vendor/twbs-pagination/jquery.pwbsPagination.min.js b/owner-frontend-service/src/main/resources/static/vendor/twbs-pagination/jquery.pwbsPagination.min.js new file mode 100644 index 0000000..315f27b --- /dev/null +++ b/owner-frontend-service/src/main/resources/static/vendor/twbs-pagination/jquery.pwbsPagination.min.js @@ -0,0 +1,10 @@ +/* + * jQuery Bootstrap Pagination v1.4.2 + * https://github.com/josecebe/twbs-pagination + * + * Copyright 2014-2018, Eugene Simakin + * Released under Apache-2.0 license + * http://apache.org/licenses/LICENSE-2.0.html + */ + +!function(o,e,t,s){"use strict";var i=o.fn.twbsPagination,r=function(t,s){if(this.$element=o(t),this.options=o.extend({},o.fn.twbsPagination.defaults,s),this.options.startPage<1||this.options.startPage>this.options.totalPages)throw new Error("Start page option is incorrect");if(this.options.totalPages=parseInt(this.options.totalPages),isNaN(this.options.totalPages))throw new Error("Total pages option is not correct!");if(this.options.visiblePages=parseInt(this.options.visiblePages),isNaN(this.options.visiblePages))throw new Error("Visible pages option is not correct!");if(this.options.beforePageClick instanceof Function&&this.$element.first().on("beforePage",this.options.beforePageClick),this.options.onPageClick instanceof Function&&this.$element.first().on("page",this.options.onPageClick),this.options.hideOnlyOnePage&&1==this.options.totalPages)return this.options.initiateStartPageClick&&this.$element.trigger("page",1),this;if(this.options.href&&(this.options.startPage=this.getPageFromQueryString(),this.options.startPage||(this.options.startPage=1)),"UL"===("function"==typeof this.$element.prop?this.$element.prop("tagName"):this.$element.attr("tagName")))this.$listContainer=this.$element;else{var e=this.$element,i=o([]);e.each(function(t){var s=o("
    ");o(this).append(s),i.push(s[0])}),this.$listContainer=i,this.$element=i}return this.$listContainer.addClass(this.options.paginationClass),this.options.initiateStartPageClick?this.show(this.options.startPage):(this.currentPage=this.options.startPage,this.render(this.getPages(this.options.startPage)),this.setupEvents()),this};r.prototype={constructor:r,destroy:function(){return this.$element.empty(),this.$element.removeData("twbs-pagination"),this.$element.off("page"),this},show:function(t){if(t<1||t>this.options.totalPages)throw new Error("Page is incorrect.");this.currentPage=t,this.$element.trigger("beforePage",t);var s=this.getPages(t);return this.render(s),this.setupEvents(),this.$element.trigger("page",t),s},enable:function(){this.show(this.currentPage)},disable:function(){var t=this;this.$listContainer.off("click").on("click","li",function(t){t.preventDefault()}),this.$listContainer.children().each(function(){o(this).hasClass(t.options.activeClass)||o(this).addClass(t.options.disabledClass)})},buildListItems:function(t){var s=[];if(this.options.first&&s.push(this.buildItem("first",1)),this.options.prev){var e=1"),i=o(""),a=this.options[t]?this.makeText(this.options[t],s):s;return e.addClass(this.options[t+"Class"]),e.data("page",s),e.data("page-type",t),e.append(i.attr("href",this.makeHref(s)).addClass(this.options.anchorClass).html(a)),e},getPages:function(t){var s=[],e=Math.floor(this.options.visiblePages/2),i=t-e+1-this.options.visiblePages%2,a=t+e,n=this.options.visiblePages;n>this.options.totalPages&&(n=this.options.totalPages),i<=0&&(i=1,a=n),a>this.options.totalPages&&(i=this.options.totalPages-n+1,a=this.options.totalPages);for(var o=i;o<=a;)s.push(o),o++;return{currentPage:t,numeric:s}},render:function(s){var e=this;this.$listContainer.children().remove();var t=this.buildListItems(s);o.each(t,function(t,s){e.$listContainer.append(s)}),this.$listContainer.children().each(function(){var t=o(this);switch(t.data("page-type")){case"page":t.data("page")===s.currentPage&&t.addClass(e.options.activeClass);break;case"first":t.toggleClass(e.options.disabledClass,1===s.currentPage);break;case"last":t.toggleClass(e.options.disabledClass,s.currentPage===e.options.totalPages);break;case"prev":t.toggleClass(e.options.disabledClass,!e.options.loop&&1===s.currentPage);break;case"next":t.toggleClass(e.options.disabledClass,!e.options.loop&&s.currentPage===e.options.totalPages)}})},setupEvents:function(){var e=this;this.$listContainer.off("click").on("click","li",function(t){var s=o(this);if(s.hasClass(e.options.disabledClass)||s.hasClass(e.options.activeClass))return!1;!e.options.href&&t.preventDefault(),e.show(parseInt(s.data("page")))})},changeTotalPages:function(t,s){return this.options.totalPages=t,this.show(s)},makeHref:function(t){return this.options.href?this.generateQueryString(t):"#"},makeText:function(t,s){return t.replace(this.options.pageVariable,s).replace(this.options.totalPagesVariable,this.options.totalPages)},getPageFromQueryString:function(t){var s=this.getSearchString(t),e=new RegExp(this.options.pageVariable+"(=([^&#]*)|&|#|$)").exec(s);return e&&e[2]?(e=decodeURIComponent(e[2]),e=parseInt(e),isNaN(e)?null:e):null},generateQueryString:function(t,s){var e=this.getSearchString(s),i=new RegExp(this.options.pageVariable+"=*[^&#]*");return e?"?"+e.replace(i,this.options.pageVariable+"="+t):""},getSearchString:function(t){var s=t||e.location.search;return""===s?null:(0===s.indexOf("?")&&(s=s.substr(1)),s)},getCurrentPage:function(){return this.currentPage},getTotalPages:function(){return this.options.totalPages}},o.fn.twbsPagination=function(t){var s,e=Array.prototype.slice.call(arguments,1),i=o(this),a=i.data("twbs-pagination"),n="object"==typeof t?t:{};return a||i.data("twbs-pagination",a=new r(this,n)),"string"==typeof t&&(s=a[t].apply(a,e)),void 0===s?i:s},o.fn.twbsPagination.defaults={totalPages:1,startPage:1,visiblePages:5,initiateStartPageClick:!0,hideOnlyOnePage:!1,href:!1,pageVariable:"{{page}}",totalPagesVariable:"{{total_pages}}",page:null,first:"First",prev:"Previous",next:"Next",last:"Last",loop:!1,beforePageClick:null,onPageClick:null,paginationClass:"pagination",nextClass:"page-item next",prevClass:"page-item prev",lastClass:"page-item last",firstClass:"page-item first",pageClass:"page-item",activeClass:"active",disabledClass:"disabled",anchorClass:"page-link"},o.fn.twbsPagination.Constructor=r,o.fn.twbsPagination.noConflict=function(){return o.fn.twbsPagination=i,this},o.fn.twbsPagination.version="1.4.2"}(window.jQuery,window,document); \ No newline at end of file diff --git a/owner-frontend-service/src/main/resources/templates/domain/prev-order/prev-order.html b/owner-frontend-service/src/main/resources/templates/domain/prev-order/prev-order.html new file mode 100644 index 0000000..dbed2eb --- /dev/null +++ b/owner-frontend-service/src/main/resources/templates/domain/prev-order/prev-order.html @@ -0,0 +1,207 @@ + + + + + + +
    + +

    지난 주문

    + + +
    +
    +
    + +
    + ~ +
    + +
    +
    + +
    +
    + + + +
    + +
    + + +
    + + + + + + + + + + + + + +
    주문번호주문상태주문시간주문상품결제금액닉네임
    +
    + + + + + +
    + + \ No newline at end of file diff --git a/owner-frontend-service/src/main/resources/templates/fragments/left.html b/owner-frontend-service/src/main/resources/templates/fragments/left.html index f788360..6f38d42 100644 --- a/owner-frontend-service/src/main/resources/templates/fragments/left.html +++ b/owner-frontend-service/src/main/resources/templates/fragments/left.html @@ -49,7 +49,7 @@ diff --git a/owner-frontend-service/src/main/resources/templates/layouts/layout.html b/owner-frontend-service/src/main/resources/templates/layouts/layout.html index 9fe8b24..e840901 100644 --- a/owner-frontend-service/src/main/resources/templates/layouts/layout.html +++ b/owner-frontend-service/src/main/resources/templates/layouts/layout.html @@ -56,6 +56,9 @@ + + +