Commit efd49421298619d5828de9d29350f6015827c09c

Authored by YunaiV
1 parent 969c3877

mall:完善商品分类的 APP 后端接口

yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/category/ProductCategoryController.java
@@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCateg @@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCateg
5 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; 5 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
6 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; 6 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO;
7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO;
8 -import cn.iocoder.yudao.module.product.convert.category.CategoryConvert; 8 +import cn.iocoder.yudao.module.product.convert.category.ProductCategoryConvert;
9 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; 9 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
10 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; 10 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;
11 import io.swagger.annotations.Api; 11 import io.swagger.annotations.Api;
@@ -61,7 +61,7 @@ public class ProductCategoryController { @@ -61,7 +61,7 @@ public class ProductCategoryController {
61 @PreAuthorize("@ss.hasPermission('product:category:query')") 61 @PreAuthorize("@ss.hasPermission('product:category:query')")
62 public CommonResult<ProductCategoryRespVO> getProductCategory(@RequestParam("id") Long id) { 62 public CommonResult<ProductCategoryRespVO> getProductCategory(@RequestParam("id") Long id) {
63 ProductCategoryDO category = categoryService.getProductCategory(id); 63 ProductCategoryDO category = categoryService.getProductCategory(id);
64 - return success(CategoryConvert.INSTANCE.convert(category)); 64 + return success(ProductCategoryConvert.INSTANCE.convert(category));
65 } 65 }
66 66
67 @GetMapping("/list") 67 @GetMapping("/list")
@@ -70,7 +70,7 @@ public class ProductCategoryController { @@ -70,7 +70,7 @@ public class ProductCategoryController {
70 public CommonResult<List<ProductCategoryRespVO>> getProductCategoryList(@Valid ProductCategoryListReqVO treeListReqVO) { 70 public CommonResult<List<ProductCategoryRespVO>> getProductCategoryList(@Valid ProductCategoryListReqVO treeListReqVO) {
71 List<ProductCategoryDO> list = categoryService.getEnableProductCategoryList(treeListReqVO); 71 List<ProductCategoryDO> list = categoryService.getEnableProductCategoryList(treeListReqVO);
72 list.sort(Comparator.comparing(ProductCategoryDO::getSort)); 72 list.sort(Comparator.comparing(ProductCategoryDO::getSort));
73 - return success(CategoryConvert.INSTANCE.convertList(list)); 73 + return success(ProductCategoryConvert.INSTANCE.convertList(list));
74 } 74 }
75 75
76 } 76 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/category/AppCategoryController.java
1 package cn.iocoder.yudao.module.product.controller.app.category; 1 package cn.iocoder.yudao.module.product.controller.app.category;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 -import cn.iocoder.yudao.module.product.controller.app.category.vo.AppCategoryListRespVO;  
5 -import cn.iocoder.yudao.module.product.convert.category.CategoryConvert; 4 +import cn.iocoder.yudao.module.product.controller.app.category.vo.AppCategoryRespVO;
  5 +import cn.iocoder.yudao.module.product.convert.category.ProductCategoryConvert;
6 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; 6 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
7 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; 7 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;
8 import io.swagger.annotations.Api; 8 import io.swagger.annotations.Api;
@@ -29,10 +29,10 @@ public class AppCategoryController { @@ -29,10 +29,10 @@ public class AppCategoryController {
29 29
30 @GetMapping("/list") 30 @GetMapping("/list")
31 @ApiOperation("获得商品分类列表") 31 @ApiOperation("获得商品分类列表")
32 - public CommonResult<List<AppCategoryListRespVO>> listByQuery() { 32 + public CommonResult<List<AppCategoryRespVO>> getProductCategoryList() {
33 List<ProductCategoryDO> list = categoryService.getEnableProductCategoryList(); 33 List<ProductCategoryDO> list = categoryService.getEnableProductCategoryList();
34 list.sort(Comparator.comparing(ProductCategoryDO::getSort)); 34 list.sort(Comparator.comparing(ProductCategoryDO::getSort));
35 - return success(CategoryConvert.INSTANCE.convertList03(list)); 35 + return success(ProductCategoryConvert.INSTANCE.convertList03(list));
36 } 36 }
37 37
38 } 38 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/category/vo/AppCategoryListRespVO.java renamed to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/category/vo/AppCategoryRespVO.java
@@ -8,8 +8,8 @@ import javax.validation.constraints.NotBlank; @@ -8,8 +8,8 @@ import javax.validation.constraints.NotBlank;
8 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
9 9
10 @Data 10 @Data
11 -@ApiModel(value = "App - 商品分类 Response VO")  
12 -public class AppCategoryListRespVO { 11 +@ApiModel(value = "用户 APP - 商品分类 Response VO")
  12 +public class AppCategoryRespVO {
13 13
14 @ApiModelProperty(value = "分类编号", required = true, example = "2") 14 @ApiModelProperty(value = "分类编号", required = true, example = "2")
15 private Long id; 15 private Long id;
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/category/CategoryConvert.java renamed to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/category/ProductCategoryConvert.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.product.convert.category; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.product.convert.category;
3 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; 3 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO;
4 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryRespVO; 4 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryRespVO;
5 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; 5 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO;
6 -import cn.iocoder.yudao.module.product.controller.app.category.vo.AppCategoryListRespVO; 6 +import cn.iocoder.yudao.module.product.controller.app.category.vo.AppCategoryRespVO;
7 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; 7 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
8 import org.mapstruct.Mapper; 8 import org.mapstruct.Mapper;
9 import org.mapstruct.factory.Mappers; 9 import org.mapstruct.factory.Mappers;
@@ -16,9 +16,9 @@ import java.util.List; @@ -16,9 +16,9 @@ import java.util.List;
16 * @author 芋道源码 16 * @author 芋道源码
17 */ 17 */
18 @Mapper 18 @Mapper
19 -public interface CategoryConvert { 19 +public interface ProductCategoryConvert {
20 20
21 - CategoryConvert INSTANCE = Mappers.getMapper(CategoryConvert.class); 21 + ProductCategoryConvert INSTANCE = Mappers.getMapper(ProductCategoryConvert.class);
22 22
23 ProductCategoryDO convert(ProductCategoryCreateReqVO bean); 23 ProductCategoryDO convert(ProductCategoryCreateReqVO bean);
24 24
@@ -28,5 +28,5 @@ public interface CategoryConvert { @@ -28,5 +28,5 @@ public interface CategoryConvert {
28 28
29 List<ProductCategoryRespVO> convertList(List<ProductCategoryDO> list); 29 List<ProductCategoryRespVO> convertList(List<ProductCategoryDO> list);
30 30
31 - List<AppCategoryListRespVO> convertList03(List<ProductCategoryDO> list); 31 + List<AppCategoryRespVO> convertList03(List<ProductCategoryDO> list);
32 } 32 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/category/ProductCategoryDO.java
@@ -9,9 +9,9 @@ import lombok.*; @@ -9,9 +9,9 @@ import lombok.*;
9 /** 9 /**
10 * 商品分类 DO 10 * 商品分类 DO
11 * 11 *
12 - * 商品分类一共两级: 12 + * 商品分类一共两类:
13 * 1)一级分类:{@link #parentId} 等于 0 13 * 1)一级分类:{@link #parentId} 等于 0
14 - * 2)二级分类:{@link #parentId} 等于父分类 14 + * 2)二级 + 三级分类:{@link #parentId} 不等于 0
15 * 15 *
16 * @author 芋道源码 16 * @author 芋道源码
17 */ 17 */
@@ -46,7 +46,7 @@ public class ProductCategoryDO extends BaseDO { @@ -46,7 +46,7 @@ public class ProductCategoryDO extends BaseDO {
46 * 分类图片 46 * 分类图片
47 * 47 *
48 * 一级分类:推荐 200 x 100 分辨率 48 * 一级分类:推荐 200 x 100 分辨率
49 - * 二级分类:推荐 100 x 100 分辨率 49 + * 二级 + 三级分类:推荐 100 x 100 分辨率
50 */ 50 */
51 private String picUrl; 51 private String picUrl;
52 /** 52 /**
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java
@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO; 5 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO;
6 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; 6 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO;
8 -import cn.iocoder.yudao.module.product.convert.category.CategoryConvert; 8 +import cn.iocoder.yudao.module.product.convert.category.ProductCategoryConvert;
9 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; 9 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
10 import cn.iocoder.yudao.module.product.dal.mysql.category.ProductCategoryMapper; 10 import cn.iocoder.yudao.module.product.dal.mysql.category.ProductCategoryMapper;
11 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
@@ -37,7 +37,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @@ -37,7 +37,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
37 validateParentProductCategory(createReqVO.getParentId()); 37 validateParentProductCategory(createReqVO.getParentId());
38 38
39 // 插入 39 // 插入
40 - ProductCategoryDO category = CategoryConvert.INSTANCE.convert(createReqVO); 40 + ProductCategoryDO category = ProductCategoryConvert.INSTANCE.convert(createReqVO);
41 productCategoryMapper.insert(category); 41 productCategoryMapper.insert(category);
42 // 返回 42 // 返回
43 return category.getId(); 43 return category.getId();
@@ -51,7 +51,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @@ -51,7 +51,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
51 validateParentProductCategory(updateReqVO.getParentId()); 51 validateParentProductCategory(updateReqVO.getParentId());
52 52
53 // 更新 53 // 更新
54 - ProductCategoryDO updateObj = CategoryConvert.INSTANCE.convert(updateReqVO); 54 + ProductCategoryDO updateObj = ProductCategoryConvert.INSTANCE.convert(updateReqVO);
55 productCategoryMapper.updateById(updateObj); 55 productCategoryMapper.updateById(updateObj);
56 } 56 }
57 57
yudao-ui-admin/src/views/mall/product/category/index.vue
@@ -61,15 +61,15 @@ @@ -61,15 +61,15 @@
61 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> 61 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
62 <el-form ref="form" :model="form" :rules="rules" label-width="80px"> 62 <el-form ref="form" :model="form" :rules="rules" label-width="80px">
63 <el-form-item label="上级分类" prop="parentId"> 63 <el-form-item label="上级分类" prop="parentId">
64 - <el-select v-model="form.parentId" placeholder="请选择上级分类" clearable size="small">  
65 - <el-option :key="0" label="顶级分类" :value="0"/>  
66 - <el-option v-for="item in list.filter(v => v.parentId === 0)" :key="item.id" :label="item.name" :value="item.id"/>  
67 - </el-select> 64 + <Treeselect v-model="form.parentId" :options="parentCategoryOptions" :normalizer="normalizer"
  65 + :show-count="true"
  66 + :defaultExpandLevel="1"
  67 + placeholder="上级分类"/>
68 </el-form-item> 68 </el-form-item>
69 <el-form-item label="分类名称" prop="name"> 69 <el-form-item label="分类名称" prop="name">
70 <el-input v-model="form.name" placeholder="请输入分类名称"/> 70 <el-input v-model="form.name" placeholder="请输入分类名称"/>
71 </el-form-item> 71 </el-form-item>
72 - <el-form-item label="分类图片" prop="bannerUrl"> 72 + <el-form-item label="分类图片" prop="picUrl">
73 <ImageUpload v-model="form.picUrl" :limit="1" :is-show-tip="false" /> 73 <ImageUpload v-model="form.picUrl" :limit="1" :is-show-tip="false" />
74 <div v-if="form.parentId === 0" style="font-size: 10px">推荐 200x100 图片分辨率</div> 74 <div v-if="form.parentId === 0" style="font-size: 10px">推荐 200x100 图片分辨率</div>
75 <div v-else style="font-size: 10px">推荐 100x100 图片分辨率</div> 75 <div v-else style="font-size: 10px">推荐 100x100 图片分辨率</div>
@@ -164,6 +164,11 @@ export default { @@ -164,6 +164,11 @@ export default {
164 getProductCategoryList(params).then(response => { 164 getProductCategoryList(params).then(response => {
165 this.list = this.handleTree(response.data, "id", "parentId"); 165 this.list = this.handleTree(response.data, "id", "parentId");
166 this.loading = false; 166 this.loading = false;
  167 + // 属性下拉框
  168 + this.parentCategoryOptions = [];
  169 + const menu = {id: 0, name: '顶级分类', children: []};
  170 + menu.children = this.handleTree(response.data, "id", "parentId");
  171 + this.parentCategoryOptions.push(menu);
167 }); 172 });
168 }, 173 },
169 /** 取消按钮 */ 174 /** 取消按钮 */
@@ -202,6 +207,17 @@ export default { @@ -202,6 +207,17 @@ export default {
202 this.refreshTable = true; 207 this.refreshTable = true;
203 }); 208 });
204 }, 209 },
  210 + /** 转换菜单数据结构 */
  211 + normalizer(node) {
  212 + if (node.children && !node.children.length) {
  213 + delete node.children;
  214 + }
  215 + return {
  216 + id: node.id,
  217 + label: node.name,
  218 + children: node.children
  219 + };
  220 + },
205 /** 新增按钮操作 */ 221 /** 新增按钮操作 */
206 handleAdd() { 222 handleAdd() {
207 this.reset(); 223 this.reset();
yudao-ui-app/pages/category/category.vue
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 <!-- 右侧分类内容 --> 20 <!-- 右侧分类内容 -->
21 <scroll-view scroll-y="true" class="box-right"> 21 <scroll-view scroll-y="true" class="box-right">
22 <view class="category-image"> 22 <view class="category-image">
23 - <image :showLoading="true" :src="categoryList[currentIndex].bannerUrl" mode='widthFix' @click="click"></image> 23 + <image :showLoading="true" :src="categoryList[currentIndex].picUrl" mode='widthFix' @click="click"></image>
24 </view> 24 </view>
25 25
26 <view class="sub-category-box" v-for="(item, index) in categoryList[currentIndex].children" :key="item.id"> 26 <view class="sub-category-box" v-for="(item, index) in categoryList[currentIndex].children" :key="item.id">
@@ -33,8 +33,8 @@ @@ -33,8 +33,8 @@
33 <u-grid col="3"> 33 <u-grid col="3">
34 <u-grid-item v-for="(subItem, subIndex) in item.children" :key="subItem.id"> 34 <u-grid-item v-for="(subItem, subIndex) in item.children" :key="subItem.id">
35 <view class="sub-category-item" @click="handleCategory(item, subIndex)"> 35 <view class="sub-category-item" @click="handleCategory(item, subIndex)">
36 - <u-icon name="photo" :size="80" v-if="subItem.bannerUrl === null"></u-icon>  
37 - <image :src="item.bannerUrl" v-if="subItem.bannerUrl != null" mode='widthFix' /> 36 + <u-icon name="photo" :size="80" v-if="subItem.picUrl === null"></u-icon>
  37 + <image :src="item.picUrl" v-if="subItem.picUrl != null" mode='widthFix' />
38 <text class="sub-category-title">{{ subItem.name }}</text> 38 <text class="sub-category-title">{{ subItem.name }}</text>
39 </view> 39 </view>
40 </u-grid-item> 40 </u-grid-item>