diff --git a/owner-vue/src/router/index.js b/owner-vue/src/router/index.js index 88e355e..e7f6764 100644 --- a/owner-vue/src/router/index.js +++ b/owner-vue/src/router/index.js @@ -14,6 +14,11 @@ const routes = [ name: 'category', component: () => import('./../views/Category') }, + { + path: '/menu', + name: 'menu', + component: () => import('./../views/Menu') + }, ] const router = new VueRouter({ diff --git a/owner-vue/src/views/Category.vue b/owner-vue/src/views/Category.vue index 7e2c040..a9679ee 100644 --- a/owner-vue/src/views/Category.vue +++ b/owner-vue/src/views/Category.vue @@ -133,13 +133,13 @@ export default { url:'/store-service/category', responseType:'json' }) - .then(function (response) { - console.log(response.data.data) - vm.categoryList = response.data.data; - }); + .then(function (response) { + console.log(response.data.data) + vm.categoryList = response.data.data; + }); } }, - created() { + mounted() { this.getCategoryList(); } } diff --git a/owner-vue/src/views/Menu.vue b/owner-vue/src/views/Menu.vue new file mode 100644 index 0000000..52db3d3 --- /dev/null +++ b/owner-vue/src/views/Menu.vue @@ -0,0 +1,122 @@ + + + + + \ No newline at end of file diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemDto.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemDto.java index f620c9c..2dc323e 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemDto.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemDto.java @@ -1,11 +1,17 @@ package com.justpickup.storeservice.domain.item.dto; +import com.justpickup.storeservice.domain.category.dto.CategoryDto; import com.justpickup.storeservice.domain.item.entity.Item; import com.justpickup.storeservice.global.entity.Yn; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder public class ItemDto { private Long id; @@ -16,15 +22,15 @@ public class ItemDto { private Long price; + private CategoryDto categoryDto; + /* private PhotoDto photoDto; - private CategoryDto categoryDto; private StoreDto storeDto; private List itemOptionDtoList; */ // == 생성 메소드 == // - @Builder public ItemDto(Long id, String name, Yn salesYn, Long price) { this.id = id; this.name = name; @@ -41,6 +47,16 @@ public class ItemDto { .build(); } + public static ItemDto createWithCategoryItemDto(Item item) { + return ItemDto.builder() + .id(item.getId()) + .name(item.getName()) + .categoryDto(new CategoryDto(item.getCategory())) + .price(item.getPrice()) + .salesYn(item.getSalesYn()) + .build(); + } + // TODO: 2022/02/03 queryDsl 쿼리 생성 시 구현 필요 // public static ItemDto createFullItemDto(Item item) { // return null diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemSearch.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemSearch.java new file mode 100644 index 0000000..de0d9c2 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/dto/ItemSearch.java @@ -0,0 +1,20 @@ +package com.justpickup.storeservice.domain.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ItemSearch { + + @NotNull + private String type; + + private String word; + + +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepository.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepository.java index de7b237..3e6b1d9 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepository.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepository.java @@ -1,7 +1,12 @@ package com.justpickup.storeservice.domain.item.repository; import com.justpickup.storeservice.domain.item.entity.Item; +import com.justpickup.storeservice.domain.store.entity.Store; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface ItemRepository extends JpaRepository { + + List findByStore(Store store); } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java new file mode 100644 index 0000000..bcf1f2b --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java @@ -0,0 +1,53 @@ +package com.justpickup.storeservice.domain.item.repository; + +import com.justpickup.storeservice.domain.category.entity.QCategory; +import com.justpickup.storeservice.domain.item.entity.Item; +import com.justpickup.storeservice.domain.item.entity.QItem; +import com.justpickup.storeservice.domain.store.entity.QStore; +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.util.List; + +@Repository +@RequiredArgsConstructor +public class ItemRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public Page findItem(Long storeId,String word, Pageable pageable){ + + //count 가져오기 + Long count = queryFactory.select(QItem.item.count()) + .from(QItem.item) + .join(QItem.item.category) + .leftJoin(QItem.item.store) + .on(QItem.item.store.id.eq(storeId)) + .where( + QItem.item.name.contains(word) + .or(QItem.item.category.name.contains(word)) + ) + .limit(pageable.getPageSize()) + .offset(pageable.getOffset()) + .fetchOne(); + + //List 가져오기 + List itemList = queryFactory.selectFrom(QItem.item) + .join(QItem.item.category).fetchJoin() + .leftJoin(QItem.item.store) + .on(QItem.item.store.id.eq(storeId)) + .where( + QItem.item.name.contains(word) + .or(QItem.item.category.name.contains(word)) + ) + .limit(pageable.getPageSize()) + .offset(pageable.getOffset()) + .fetch(); + + return PageableExecutionUtils.getPage(itemList,pageable,() -> count); + } +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemService.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemService.java index 518088d..ad7df81 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemService.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemService.java @@ -1,8 +1,14 @@ package com.justpickup.storeservice.domain.item.service; import com.justpickup.storeservice.domain.item.dto.ItemDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; public interface ItemService { ItemDto findItemByItemId(Long itemId); + + Page findItemList(Long storeId,String word, Pageable pageable); } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java index 9722720..fe9a422 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java @@ -1,14 +1,26 @@ package com.justpickup.storeservice.domain.item.service; +import com.justpickup.storeservice.domain.category.exception.NotFoundStoreException; import com.justpickup.storeservice.domain.item.dto.ItemDto; +import com.justpickup.storeservice.domain.item.dto.ItemSearch; import com.justpickup.storeservice.domain.item.entity.Item; import com.justpickup.storeservice.domain.item.exception.NotExistItemException; import com.justpickup.storeservice.domain.item.repository.ItemRepository; +import com.justpickup.storeservice.domain.item.repository.ItemRepositoryCustom; +import com.justpickup.storeservice.domain.store.entity.Store; +import com.justpickup.storeservice.domain.store.repository.StoreRepository; 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.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -16,6 +28,8 @@ import org.springframework.transaction.annotation.Transactional; public class ItemServiceImpl implements ItemService { private final ItemRepository itemRepository; + private final ItemRepositoryCustom itemRepositoryCustom; + private final StoreRepository storeRepository; @Override @@ -25,4 +39,15 @@ public class ItemServiceImpl implements ItemService { return ItemDto.createItemDto(findItem); } + + @Override + public Page findItemList( Long storeId,String word, Pageable pageable) { + + Page itemList = itemRepositoryCustom.findItem(storeId,word,pageable); + return PageableExecutionUtils.getPage(itemList.stream() + .map(ItemDto::createWithCategoryItemDto) + .collect(Collectors.toList()),pageable,itemList::getTotalElements); + } + + } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/web/ItemController.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/web/ItemController.java index 21f106d..e11698a 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/web/ItemController.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/web/ItemController.java @@ -1,5 +1,7 @@ package com.justpickup.storeservice.domain.item.web; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.justpickup.storeservice.domain.item.dto.ItemDto; import com.justpickup.storeservice.domain.item.service.ItemService; import com.justpickup.storeservice.global.dto.Result; @@ -8,21 +10,85 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import org.hibernate.annotations.Parameter; +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.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; @RestController @RequiredArgsConstructor -@RequestMapping("/item") public class ItemController { private final ItemService itemService; - @GetMapping("/{itemId}") + @GetMapping("/item") + public ResponseEntity> getItemList( @RequestParam String word, + @PageableDefault(page = 0, size = 10) Pageable pageable){ + + Long storeId = 1L; + + Page itemDtoList = itemService.findItemList(storeId,word,pageable); + List itemList = itemDtoList.stream() + .map(GetItemListResponse.Item::new) + .collect(Collectors.toList()); + + GetItemListResponse getItemResponse = new GetItemListResponse( + itemList, + itemDtoList.getNumber(), + itemDtoList.getTotalPages() + ); + + + return ResponseEntity.status(HttpStatus.OK) + .body((Result)Result.createSuccessResult(getItemResponse)); + } + + + @Data @NoArgsConstructor @AllArgsConstructor + static class GetItemListResponse { + private List itemList; + private Page page; + + public GetItemListResponse(List itemList, int startPage,int totalPage) { + this.itemList = itemList; + this.page = new Page(startPage,totalPage); + } + + @Data + static class Item{ + private Long id; + private String name; + private Yn salesYn; + private Long price; + private String categoryName; + + public Item(ItemDto itemDto) { + this.id = itemDto.getId(); + this.name = itemDto.getName(); + this.salesYn = itemDto.getSalesYn(); + this.price = itemDto.getPrice(); + this.categoryName = itemDto.getCategoryDto().getName(); + } + } + + @Data @AllArgsConstructor + static class Page { + int startPage; + int totalPage; + } + + + } + + + @GetMapping("/item/{itemId}") public ResponseEntity getItem(@PathVariable("itemId") Long itemId) { ItemDto itemByItemId = itemService.findItemByItemId(itemId); diff --git a/store-service/src/main/resources/application.yml b/store-service/src/main/resources/application.yml index 96eeaf2..edc6376 100644 --- a/store-service/src/main/resources/application.yml +++ b/store-service/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 0 + port: 12343 spring: application: