This commit is contained in:
haoxr 2021-07-27 20:46:27 +08:00
parent 66c79457b4
commit 4f468f751c
37 changed files with 400 additions and 279 deletions

View File

@ -1,6 +1,5 @@
package com.youlai.mall.oms.enums; package com.youlai.mall.oms.enums;
import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
/** /**
@ -9,25 +8,31 @@ import lombok.Getter;
* @email huawei_code@163.com * @email huawei_code@163.com
* @date 2021/1/16 * @date 2021/1/16
*/ */
@AllArgsConstructor
public enum PayTypeEnum { public enum PayTypeEnum {
WEIXIN(1,"微信支付"), WEIXIN(1, "微信支付"),
ALIPAY(2,"支付宝支付"), ALIPAY(2, "支付宝支付"),
BALANCE(3,"会员余额支付") BALANCE(3, "会员余额支付");
;
PayTypeEnum(int code, String text) {
this.code = code;
this.text = text;
}
@Getter @Getter
private Integer code; private Integer code;
@Getter @Getter
private String text; private String text;
public static PayTypeEnum getByCode(Integer code){ public static PayTypeEnum getByCode(Integer code) {
PayTypeEnum payTypeEnum = null;
for (PayTypeEnum value : values()) { for (PayTypeEnum value : values()) {
if (value.getCode().equals(code)) { if (value.getCode().equals(code)) {
return value; payTypeEnum = value;
} }
} }
return null; return payTypeEnum;
} }
} }

View File

@ -5,7 +5,7 @@ import com.youlai.mall.oms.constant.OmsConstants;
import com.youlai.mall.oms.pojo.vo.CartVO; import com.youlai.mall.oms.pojo.vo.CartVO;
import com.youlai.mall.oms.service.ICartService; import com.youlai.mall.oms.service.ICartService;
import com.youlai.mall.pms.api.GoodsFeignClient; import com.youlai.mall.pms.api.GoodsFeignClient;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.BoundHashOperations;

View File

@ -27,8 +27,8 @@ import com.youlai.mall.oms.service.ICartService;
import com.youlai.mall.oms.service.IOrderItemService; import com.youlai.mall.oms.service.IOrderItemService;
import com.youlai.mall.oms.service.IOrderService; import com.youlai.mall.oms.service.IOrderService;
import com.youlai.mall.pms.api.GoodsFeignClient; import com.youlai.mall.pms.api.GoodsFeignClient;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import com.youlai.mall.pms.pojo.dto.SkuLockDTO; import com.youlai.mall.pms.pojo.dto.app.SkuLockDTO;
import com.youlai.mall.ums.api.MemberAddressFeignClient; import com.youlai.mall.ums.api.MemberAddressFeignClient;
import com.youlai.mall.ums.api.MemberFeignClient; import com.youlai.mall.ums.api.MemberFeignClient;
import com.youlai.mall.ums.pojo.entity.UmsAddress; import com.youlai.mall.ums.pojo.entity.UmsAddress;

View File

@ -1,12 +1,10 @@
package com.youlai.mall.pms.api; package com.youlai.mall.pms.api;
import com.youlai.common.result.Result; import com.youlai.common.result.Result;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import com.youlai.mall.pms.pojo.dto.SkuLockDTO;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
@FeignClient(value = "mall-pms") @FeignClient(value = "mall-pms")
public interface GoodsFeignClient { public interface GoodsFeignClient {
@ -16,25 +14,4 @@ public interface GoodsFeignClient {
*/ */
@GetMapping("/app-api/v1/goods/{id}") @GetMapping("/app-api/v1/goods/{id}")
Result<SkuDTO> getSkuById(@PathVariable Long id); Result<SkuDTO> getSkuById(@PathVariable Long id);
/**
* 锁定库存
*/
@PutMapping("/app-api/v1/goods/stocks/_lock")
Result lockStock(@RequestBody List<SkuLockDTO> list);
/**
* 解锁库存
*/
@PutMapping("/app-api/v1/goods/stocks/_unlock")
Result<Boolean> unlockStock(@RequestParam String orderToken);
/**
* 扣减库存
*/
@PutMapping("/app-api/v1/goods/stocks/_deduct")
Result deductStock(@RequestParam String orderToken);
} }

View File

@ -0,0 +1,33 @@
package com.youlai.mall.pms.api;
import com.youlai.common.result.Result;
import com.youlai.mall.pms.pojo.dto.app.SkuLockDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@FeignClient(value = "mall-pms")
public interface StockFeignClient {
/**
* 锁定库存
*/
@PutMapping("/app-api/v1/stocks/_lock")
Result lockStock(@RequestBody List<SkuLockDTO> list);
/**
* 解锁库存
*/
@PutMapping("/app-api/v1/stocks/_unlock")
Result<Boolean> unlockStock(@RequestParam String orderToken);
/**
* 扣减库存
*/
@PutMapping("/app-api/v1/stocks/_deduct")
Result deductStock(@RequestParam String orderToken);
}

View File

@ -1,22 +0,0 @@
package com.youlai.mall.pms.pojo.dto;
import lombok.Data;
import java.util.List;
@Data
public class SpuDTO {
private Long id;
private String name;
private Long categoryId;
private Long brandId;
private Long originPrice;
private Long price;
private Integer sales;
private String pic;
private List<String> pics;
private String unit;
private String description;
private String detail;
private Integer status;
}

View File

@ -11,7 +11,7 @@ import java.util.List;
@Data @Data
@ApiModel("属性表单对象") @ApiModel("属性表单")
public class AttributeFormDTO { public class AttributeFormDTO {
@ApiModelProperty("分类ID") @ApiModelProperty("分类ID")

View File

@ -0,0 +1,29 @@
package com.youlai.mall.pms.pojo.dto.admin;
import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue;
import lombok.Data;
import java.util.List;
/**
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
*/
@Data
public class GoodsFormDTO {
private Long id;
private String name;
private Long categoryId;
private Long brandId;
private Long originPrice;
private Long price;
private String picUrl;
private List<String> album;
private String description;
private String detail;
private List<PmsSpuAttributeValue> attrValueList;
private List<PmsSku> skuList;
}

View File

@ -1,22 +0,0 @@
package com.youlai.mall.pms.pojo.dto.admin;
import com.youlai.mall.pms.pojo.dto.SpuDTO;
import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue;
import lombok.Data;
import java.util.List;
/**
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
*/
@Data
public class ProductFormDTO {
private SpuDTO spu;
private List<PmsSpuAttributeValue> attrs;
private List<PmsSku> skus;
}

View File

@ -2,7 +2,6 @@ package com.youlai.mall.pms.pojo.dto.app;
import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue; import com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue;
import com.youlai.mall.pms.pojo.dto.SpuDTO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -14,11 +13,29 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
public class ProductFormDTO { public class ProductFormDTO {
private SpuDTO spu; private SpuInfo spuInfo;
private List<PmsSpuAttributeValue> attrs; private List<PmsSpuAttributeValue> attrValueList;
private List<PmsSku> skus; private List<PmsSku> skuList;
@Data
public static class SpuInfo {
private Long id;
private String name;
private Long categoryId;
private Long brandId;
private Long originPrice;
private Long price;
private Integer sales;
private String picUrl;
private List<String> album;
private String unit;
private String description;
private String detail;
private Integer status;
}
} }

View File

@ -1,4 +1,4 @@
package com.youlai.mall.pms.pojo.dto; package com.youlai.mall.pms.pojo.dto.app;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.youlai.mall.pms.pojo.dto; package com.youlai.mall.pms.pojo.dto.app;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;

View File

@ -13,7 +13,7 @@ public class PmsSku extends BaseEntity {
private String name; private String name;
private String sn; private String sn;
private String picUrl; private String picUrl;
private String specifications; private String specs;
private Long originPrice; private Long originPrice;
private Long price; private Long price;
private Integer stock; private Integer stock;

View File

@ -0,0 +1,46 @@
package com.youlai.mall.pms.pojo.vo.admin;
import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue;
import lombok.Data;
import lombok.ToString;
import java.util.List;
/**
* 商品详情视图层对象
*
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
*/
@Data
@ToString
public class GoodsDetailVO {
private Long id;
private String name;
private Long categoryId;
private Long brandId;
private Long originPrice;
private Long price;
private String picUrl;
private List<String> subPicUrls;
private String description;
private String detail;
private List<PmsSpuAttributeValue> attrList;
private List<PmsSpuAttributeValue> specList;
private List<PmsSku> skuList;
}

View File

@ -0,0 +1,37 @@
package com.youlai.mall.pms.common.enums;
import lombok.Getter;
/**
* 商品属性类型枚举
*
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
*/
public enum GoodsAttrTypeEnum {
SPECIFICATION(1, "规格"),
ATTRIBUTE(2, "属性");
GoodsAttrTypeEnum(int value, String name) {
this.value = value;
this.name = name;
}
@Getter
private Integer value;
@Getter
private String name;
public static GoodsAttrTypeEnum getByValue(Integer value) {
GoodsAttrTypeEnum goodsAttrTypeEnum = null;
for (GoodsAttrTypeEnum item : values()) {
if (item.getValue().equals(value)) {
goodsAttrTypeEnum = item;
}
}
return goodsAttrTypeEnum;
}
}

View File

@ -4,8 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.common.result.Result; import com.youlai.common.result.Result;
import com.youlai.mall.pms.pojo.dto.admin.ProductFormDTO; import com.youlai.mall.pms.pojo.dto.admin.GoodsFormDTO;
import com.youlai.mall.pms.pojo.entity.PmsSpu; import com.youlai.mall.pms.pojo.entity.PmsSpu;
import com.youlai.mall.pms.pojo.vo.admin.GoodsDetailVO;
import com.youlai.mall.pms.service.IPmsSpuService; import com.youlai.mall.pms.service.IPmsSpuService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
@ -13,7 +14,6 @@ import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Arrays; import java.util.Arrays;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -22,7 +22,7 @@ import java.util.stream.Collectors;
*/ */
@Api(tags = "系统管理端-商品信息") @Api(tags = "系统管理端-商品信息")
@RestController @RestController
@RequestMapping("/api/v1/products") @RequestMapping("/api/v1/goods")
@AllArgsConstructor @AllArgsConstructor
public class GoodsController { public class GoodsController {
@ -38,30 +38,35 @@ public class GoodsController {
}) })
@GetMapping("/page") @GetMapping("/page")
public Result list(Integer page, Integer limit, String name, Long categoryId) { public Result list(Integer page, Integer limit, String name, Long categoryId) {
IPage<PmsSpu> result = iPmsSpuService.list( IPage<PmsSpu> result = iPmsSpuService.list(new Page<>(page, limit), name, categoryId);
new Page<>(page, limit),
new PmsSpu().setName(name).setCategoryId(categoryId)
);
return Result.success(result.getRecords(), result.getTotal()); return Result.success(result.getRecords(), result.getTotal());
} }
@ApiOperation(value = "商品详情")
@ApiImplicitParam(name = "id", value = "商品id", required = true, paramType = "path", dataType = "Long")
@GetMapping("/{id}")
public Result detail(@PathVariable Long id) {
GoodsDetailVO goodsDetail = iPmsSpuService.getGoodsById(id);
return Result.success(goodsDetail);
}
@ApiOperation(value = "新增商品") @ApiOperation(value = "新增商品")
@ApiImplicitParam(name = "productForm", value = "实体JSON对象", required = true, paramType = "body", dataType = "ProductFormDTO") @ApiImplicitParam(name = "goodsForm", value = "实体JSON对象", required = true, paramType = "body", dataType = "GoodsFormDTO")
@PostMapping @PostMapping
public Result add(@RequestBody ProductFormDTO productForm) { public Result add(@RequestBody GoodsFormDTO goodsForm) {
boolean status = iPmsSpuService.add(productForm); boolean result = iPmsSpuService.addGoods(goodsForm);
return Result.judge(status); return Result.judge(result);
} }
@ApiOperation(value = "修改商品") @ApiOperation(value = "修改商品")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "商品id", required = true, paramType = "path", dataType = "Long"), @ApiImplicitParam(name = "id", value = "商品id", required = true, paramType = "path", dataType = "Long"),
@ApiImplicitParam(name = "spu", value = "实体JSON对象", required = true, paramType = "body", dataType = "PmsSpu") @ApiImplicitParam(name = "goodsForm", value = "实体JSON对象", required = true, paramType = "body", dataType = "GoodsFormDTO")
}) })
@PutMapping(value = "/{id}") @PutMapping(value = "/{id}")
public Result update(@PathVariable Long id, @RequestBody ProductFormDTO spu) { public Result update(@PathVariable Long id, @RequestBody GoodsFormDTO goodsForm) {
boolean status = iPmsSpuService.updateById(spu); boolean result = iPmsSpuService.updateGoods(goodsForm);
return Result.judge(status); return Result.judge(result);
} }
@ApiOperation(value = "删除商品") @ApiOperation(value = "删除商品")

View File

@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.*;
*/ */
@Api(tags = "系统管理端-库存信息") @Api(tags = "系统管理端-库存信息")
@RestController @RestController
@RequestMapping("/api/v1/goods") @RequestMapping("/api/v1/inventories")
@RequiredArgsConstructor @RequiredArgsConstructor
public class StockController { public class StockController {

View File

@ -18,7 +18,7 @@ import java.util.List;
* @author <a href="mailto:xianrui0365@163.com">xianrui</a> * @author <a href="mailto:xianrui0365@163.com">xianrui</a>
*/ */
@Api(tags = "移动端-分类信息") @Api(tags = "移动端-分类信息")
@RestController("AppCategoryController") @RestController("appCategoryController")
@RequestMapping("/app-api/v1/categories") @RequestMapping("/app-api/v1/categories")
@Slf4j @Slf4j
@AllArgsConstructor @AllArgsConstructor

View File

@ -1,8 +1,8 @@
package com.youlai.mall.pms.controller.app; package com.youlai.mall.pms.controller.app;
import com.youlai.common.result.Result; import com.youlai.common.result.Result;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import com.youlai.mall.pms.pojo.dto.SkuLockDTO; import com.youlai.mall.pms.pojo.dto.app.SkuLockDTO;
import com.youlai.mall.pms.service.IPmsSkuService; import com.youlai.mall.pms.service.IPmsSkuService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;

View File

@ -2,7 +2,7 @@ package com.youlai.mall.pms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;

View File

@ -13,5 +13,5 @@ import java.util.List;
@Mapper @Mapper
public interface PmsSpuMapper extends BaseMapper<PmsSpu> { public interface PmsSpuMapper extends BaseMapper<PmsSpu> {
List<PmsSpu> list(Page<PmsSpu> page, PmsSpu spu); List<PmsSpu> list(Page<PmsSpu> page, String name, Long categoryId);
} }

View File

@ -2,8 +2,8 @@ package com.youlai.mall.pms.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import com.youlai.mall.pms.pojo.dto.SkuLockDTO; import com.youlai.mall.pms.pojo.dto.app.SkuLockDTO;
import java.util.List; import java.util.List;

View File

@ -3,22 +3,22 @@ package com.youlai.mall.pms.service;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.mall.pms.pojo.dto.app.ProductFormDTO; import com.youlai.mall.pms.pojo.dto.admin.GoodsFormDTO;
import com.youlai.mall.pms.pojo.entity.PmsSpu; import com.youlai.mall.pms.pojo.entity.PmsSpu;
import com.youlai.mall.pms.pojo.vo.admin.GoodsDetailVO;
import java.util.List; import java.util.List;
public interface IPmsSpuService extends IService<PmsSpu> { public interface IPmsSpuService extends IService<PmsSpu> {
IPage<PmsSpu> list(Page<PmsSpu> page, PmsSpu spu); IPage<PmsSpu> list(Page<PmsSpu> page, String name,Long categoryId);
boolean add(com.youlai.mall.pms.pojo.dto.admin.ProductFormDTO productFormDTO); boolean addGoods(GoodsFormDTO goodsFormDTO);
com.youlai.mall.pms.pojo.dto.admin.ProductFormDTO getBySpuId(Long id);
boolean removeBySpuIds(List<Long> spuIds); boolean removeBySpuIds(List<Long> spuIds);
boolean updateById(com.youlai.mall.pms.pojo.dto.admin.ProductFormDTO productFormDTO); boolean updateGoods(GoodsFormDTO goodsFormDTO);
ProductFormDTO getProductByIdForApp(Long id); GoodsDetailVO getGoodsById(Long id);
} }

View File

@ -10,8 +10,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.web.exception.BizException; import com.youlai.common.web.exception.BizException;
import com.youlai.mall.pms.mapper.PmsSkuMapper; import com.youlai.mall.pms.mapper.PmsSkuMapper;
import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import com.youlai.mall.pms.pojo.dto.SkuLockDTO; import com.youlai.mall.pms.pojo.dto.app.SkuLockDTO;
import com.youlai.mall.pms.service.IPmsSkuService; import com.youlai.mall.pms.service.IPmsSkuService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -126,8 +126,8 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
skuLockList.forEach(item -> { skuLockList.forEach(item -> {
boolean result = this.update(new LambdaUpdateWrapper<PmsSku>() boolean result = this.update(new LambdaUpdateWrapper<PmsSku>()
.eq(PmsSku::getId, item.getSkuId()) .eq(PmsSku::getId, item.getSkuId())
.setSql("stock = stock - " + item.getCount()) // 扣减库存 .setSql("inventory = inventory - " + item.getCount()) // 扣减库存
.setSql("locked_stock = locked_stock - " + item.getCount()) .setSql("locked_inventory = locked_inventory - " + item.getCount())
); );
if (!result) { if (!result) {
throw new BizException("扣减库存失败,商品" + item.getSkuId() + "库存不足"); throw new BizException("扣减库存失败,商品" + item.getSkuId() + "库存不足");

View File

@ -1,54 +1,58 @@
package com.youlai.mall.pms.service.impl; package com.youlai.mall.pms.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.mall.pms.common.enums.GoodsAttrTypeEnum;
import com.youlai.mall.pms.component.BloomRedisService; import com.youlai.mall.pms.component.BloomRedisService;
import com.youlai.mall.pms.mapper.PmsSpuMapper; import com.youlai.mall.pms.mapper.PmsSpuMapper;
import com.youlai.mall.pms.pojo.dto.SpuDTO; import com.youlai.mall.pms.pojo.dto.admin.GoodsFormDTO;
import com.youlai.mall.pms.pojo.dto.admin.ProductFormDTO; import com.youlai.mall.pms.pojo.entity.PmsSku;
import com.youlai.mall.pms.pojo.entity.*; import com.youlai.mall.pms.pojo.entity.PmsSpu;
import com.youlai.mall.pms.service.*; import com.youlai.mall.pms.pojo.entity.PmsSpuAttributeValue;
import com.youlai.mall.pms.pojo.vo.admin.GoodsDetailVO;
import com.youlai.mall.pms.service.IPmsAttributeService;
import com.youlai.mall.pms.service.IPmsSkuService;
import com.youlai.mall.pms.service.IPmsSpuAttributeValueService;
import com.youlai.mall.pms.service.IPmsSpuService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import static com.youlai.mall.pms.common.constant.PmsConstants.PRODUCT_REDIS_BLOOM_FILTER;
/** /**
* @author <a href="mailto:xianrui0365@163.com">xianrui</a> * @author <a href="mailto:xianrui0365@163.com">xianrui</a>
*/ */
@Service @Service
@AllArgsConstructor @RequiredArgsConstructor
public class PmsSpuServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> implements IPmsSpuService { public class PmsSpuServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> implements IPmsSpuService {
private IPmsSkuService iPmsSkuService; private final IPmsSkuService iPmsSkuService;
private IPmsSpuAttributeValueService iPmsSpuAttributeValueService; private final IPmsSpuAttributeValueService iPmsSpuAttributeValueService;
private IPmsAttributeService attributeService; private final IPmsAttributeService attributeService;
private BloomRedisService bloomRedisService; private final BloomRedisService bloomRedisService;
@Override @Override
public IPage<PmsSpu> list(Page<PmsSpu> page, PmsSpu spu) { public IPage<PmsSpu> list(Page<PmsSpu> page, String name, Long categoryId) {
List<PmsSpu> list = this.baseMapper.list(page, spu); List<PmsSpu> list = this.baseMapper.list(page, name, categoryId);
page.setRecords(list); page.setRecords(list);
return page; return page;
} }
@Override @Override
@Transactional @Transactional
public boolean add(ProductFormDTO productFormDTO) { public boolean addGoods(GoodsFormDTO goodsForm) {
SpuDTO SpuDTO = productFormDTO.getSpu(); /* SpuDTO SpuDTO = goodsForm.getSpu();
List<PmsSpuAttributeValue> attrValues = productFormDTO.getAttrs(); List<PmsSpuAttributeValue> attrValues = goodsForm.getAttrs();
List<PmsSpuAttributeValue> specs = productFormDTO.getAttrs(); List<PmsSpuAttributeValue> specs = goodsForm.getAttrs();
List<PmsSku> skuList = productFormDTO.getSkus(); List<PmsSku> skuList = goodsForm.getSkus();
// spu保存 // spu保存
PmsSpu spu = new PmsSpu(); PmsSpu spu = new PmsSpu();
@ -67,8 +71,8 @@ public class PmsSpuServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> impleme
// 规格保存 // 规格保存
Optional.ofNullable(specs).ifPresent(list -> { Optional.ofNullable(specs).ifPresent(list -> {
/* list.forEach(item -> item.setSpuId(spu.getId())); *//* list.forEach(item -> item.setSpuId(spu.getId()));
iPmsSpuSpecValueService.saveBatch(list);*/ iPmsSpuSpecValueService.saveBatch(list);*//*
}); });
// sku保存 // sku保存
@ -76,45 +80,18 @@ public class PmsSpuServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> impleme
list.forEach(item -> item.setSpuId(spu.getId())); list.forEach(item -> item.setSpuId(spu.getId()));
iPmsSkuService.saveBatch(skuList); iPmsSkuService.saveBatch(skuList);
}); });
bloomRedisService.addByBloomFilter(PRODUCT_REDIS_BLOOM_FILTER, spu.getId() + ""); bloomRedisService.addByBloomFilter(PRODUCT_REDIS_BLOOM_FILTER, spu.getId() + "");*/
return true; return true;
} }
@Override
public ProductFormDTO getBySpuId(Long id) {
// spu
SpuDTO spuDTO = new SpuDTO();
PmsSpu spu = this.getById(id);
BeanUtil.copyProperties(spu, spuDTO);
if (StrUtil.isNotBlank(spu.getAlbum())) {
// spu专辑图片转换处理 json字符串 -> List
List<String> pics = JSONUtil.toList(JSONUtil.parseArray(spu.getAlbum()), String.class);
spuDTO.setPics(pics);
}
// 属性
List<PmsSpuAttributeValue> attrs = iPmsSpuAttributeValueService.
list(new LambdaQueryWrapper<PmsSpuAttributeValue>().eq(PmsSpuAttributeValue::getSpuId, id));
// 规格
List<PmsSpuAttributeValue> specs = iPmsSpuAttributeValueService.list(new LambdaQueryWrapper<PmsSpuAttributeValue>().eq(PmsSpuAttributeValue::getSpuId, id));
// sku
List<PmsSku> skus = iPmsSkuService.list(new LambdaQueryWrapper<PmsSku>().eq(PmsSku::getSpuId, id));
// 组合
// ProductFormDTO productFormDTO = new ProductFormDTO(spuDTO, attrs, specs, skus);
ProductFormDTO productFormDTO = new ProductFormDTO();
return productFormDTO;
}
@Override @Override
public boolean updateById(ProductFormDTO productFormDTO) { public boolean updateGoods(GoodsFormDTO goodsFormDTO) {
SpuDTO SpuDTO = productFormDTO.getSpu(); /* SpuDTO SpuDTO = goodsFormDTO.getSpu();
List<PmsSpuAttributeValue> attrValues = productFormDTO.getAttrs(); List<PmsSpuAttributeValue> attrValues = goodsFormDTO.getAttrs();
List<PmsSpuAttributeValue> specs = productFormDTO.getAttrs(); List<PmsSpuAttributeValue> specs = goodsFormDTO.getAttrs();
List<PmsSku> skuList = productFormDTO.getSkus(); List<PmsSku> skuList = goodsFormDTO.getSkus();
// spu保存 // spu保存
PmsSpu spu = new PmsSpu(); PmsSpu spu = new PmsSpu();
@ -174,10 +151,48 @@ public class PmsSpuServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> impleme
iPmsSkuService.removeByIds(removeIds); iPmsSkuService.removeByIds(removeIds);
iPmsSkuService.saveOrUpdateBatch(skuList); iPmsSkuService.saveOrUpdateBatch(skuList);
}); });*/
return true; return true;
} }
@Override
public GoodsDetailVO getGoodsById(Long id) {
GoodsDetailVO goodsDetailVO = new GoodsDetailVO();
PmsSpu spu = this.getById(id);
Assert.isTrue(spu != null, "商品不存在");
BeanUtil.copyProperties(spu, goodsDetailVO);
// 商品图册JSON字符串转JSON
String album = spu.getAlbum();
if (StrUtil.isNotBlank(album)) {
List<String> picUrls = JSONUtil.toList(album, String.class);
goodsDetailVO.setSubPicUrls(picUrls);
}
// 商品属性列表
List<PmsSpuAttributeValue> attrList = iPmsSpuAttributeValueService.list(new LambdaQueryWrapper<PmsSpuAttributeValue>()
.eq(PmsSpuAttributeValue::getSpuId, id)
.eq(PmsSpuAttributeValue::getType, GoodsAttrTypeEnum.ATTRIBUTE.getValue())
);
goodsDetailVO.setAttrList(attrList);
// 商品规格列表
List<PmsSpuAttributeValue> specList = iPmsSpuAttributeValueService.list(new LambdaQueryWrapper<PmsSpuAttributeValue>()
.eq(PmsSpuAttributeValue::getSpuId, id)
.eq(PmsSpuAttributeValue::getType, GoodsAttrTypeEnum.SPECIFICATION.getValue())
);
goodsDetailVO.setSpecList(specList);
// 商品SKU列表
List<PmsSku> skuList = iPmsSkuService.list(new LambdaQueryWrapper<PmsSku>().eq(PmsSku::getSpuId, id));
goodsDetailVO.setSkuList(skuList);
return goodsDetailVO;
}
@Override @Override
public boolean removeBySpuIds(List<Long> spuIds) { public boolean removeBySpuIds(List<Long> spuIds) {
Optional.ofNullable(spuIds).ifPresent( Optional.ofNullable(spuIds).ifPresent(
@ -195,31 +210,5 @@ public class PmsSpuServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> impleme
return true; return true;
} }
@Override
public com.youlai.mall.pms.pojo.dto.app.ProductFormDTO getProductByIdForApp(Long spuId) {
// spu
PmsSpu spu = this.getById(spuId);
SpuDTO SpuDTO = new SpuDTO();
BeanUtil.copyProperties(spu, SpuDTO);
if (StrUtil.isNotBlank(spu.getAlbum())) {
// spu专辑图片转换处理 json字符串 -> List
List<String> pics = JSONUtil.toList(JSONUtil.parseArray(spu.getAlbum()), String.class);
SpuDTO.setPics(pics);
}
// 属性
List<PmsSpuAttributeValue> attrs = iPmsSpuAttributeValueService.list(
new LambdaQueryWrapper<PmsSpuAttributeValue>(
).eq(PmsSpuAttributeValue::getSpuId, spuId)
);
// 规格
// List<PmsAttribute> specs = attributeService.listBySpuId(spuId);
List<PmsAttribute> specs = null;
// sku
List<PmsSku> skuList = iPmsSkuService.list(new LambdaQueryWrapper<PmsSku>().eq(PmsSku::getSpuId, spuId));
// com.youlai.mall.pms.pojo.dto.app.ProductFormDTO product = new com.youlai.mall.pms.pojo.dto.app.ProductFormDTO(SpuDTO, attrs, specs, skuList);
com.youlai.mall.pms.pojo.dto.app.ProductFormDTO product=new com.youlai.mall.pms.pojo.dto.app.ProductFormDTO();
return product;
}
} }

View File

@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.redis.utils.RedisUtils; import com.youlai.common.redis.utils.RedisUtils;
import com.youlai.mall.pms.config.ProductLocalCache; import com.youlai.mall.pms.config.ProductLocalCache;
import com.youlai.mall.pms.mapper.PmsSpuMapper; import com.youlai.mall.pms.mapper.PmsSpuMapper;
import com.youlai.mall.pms.pojo.dto.SpuDTO;
import com.youlai.mall.pms.pojo.dto.app.ProductFormDTO; import com.youlai.mall.pms.pojo.dto.app.ProductFormDTO;
import com.youlai.mall.pms.pojo.entity.PmsAttribute; import com.youlai.mall.pms.pojo.entity.PmsAttribute;
import com.youlai.mall.pms.pojo.entity.PmsSku; import com.youlai.mall.pms.pojo.entity.PmsSku;
@ -50,7 +49,7 @@ public class ProductServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> implem
public ProductFormDTO getProductById(Long spuId) { public ProductFormDTO getProductById(Long spuId) {
//1一级本地缓存设置 //1一级本地缓存设置
ProductFormDTO product = productLocalCache.get(PRODUCT_DETAIL_CACHE + spuId); ProductFormDTO product = productLocalCache.get(PRODUCT_DETAIL_CACHE + spuId);
if (null != product) { /* if (null != product) {
log.info("get LocalCache product:" + product); log.info("get LocalCache product:" + product);
return product; return product;
} }
@ -104,7 +103,7 @@ public class ProductServiceImpl extends ServiceImpl<PmsSpuMapper, PmsSpu> implem
lock.unlock(); lock.unlock();
} }
} }
} }*/
return product; return product;
} }
} }

View File

@ -10,7 +10,7 @@
<result property="name" column="name" jdbcType="VARCHAR"/> <result property="name" column="name" jdbcType="VARCHAR"/>
<result property="sn" column="sn" jdbcType="VARCHAR"/> <result property="sn" column="sn" jdbcType="VARCHAR"/>
<result property="picUrl" column="pic_url" jdbcType="VARCHAR"/> <result property="picUrl" column="pic_url" jdbcType="VARCHAR"/>
<result property="specifications" column="specifications" jdbcType="VARCHAR"/> <result property="specs" column="specs" jdbcType="VARCHAR"/>
<result property="originPrice" column="origin_price" jdbcType="BIGINT"/> <result property="originPrice" column="origin_price" jdbcType="BIGINT"/>
<result property="price" column="price" jdbcType="BIGINT"/> <result property="price" column="price" jdbcType="BIGINT"/>
<result property="stock" column="stock" jdbcType="INTEGER"/> <result property="stock" column="stock" jdbcType="INTEGER"/>
@ -21,7 +21,7 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id,spu_id,name, id,spu_id,name,
sn,pic_url,specifications, sn,pic_url,specs,
origin_price,price,stock, origin_price,price,stock,
locked_stock,gmt_create,gmt_modified locked_stock,gmt_create,gmt_modified
</sql> </sql>

View File

@ -3,7 +3,6 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.youlai.mall.pms.mapper.PmsSpuMapper"> <mapper namespace="com.youlai.mall.pms.mapper.PmsSpuMapper">
<resultMap id="BaseResultMap" type="com.youlai.mall.pms.pojo.entity.PmsSpu"> <resultMap id="BaseResultMap" type="com.youlai.mall.pms.pojo.entity.PmsSpu">
<id property="id" column="id" jdbcType="BIGINT"/> <id property="id" column="id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/> <result property="name" column="name" jdbcType="VARCHAR"/>
@ -20,39 +19,51 @@
<result property="status" column="status" jdbcType="TINYINT"/> <result property="status" column="status" jdbcType="TINYINT"/>
<result property="gmtCreate" column="gmt_create" jdbcType="TIMESTAMP"/> <result property="gmtCreate" column="gmt_create" jdbcType="TIMESTAMP"/>
<result property="gmtModified" column="gmt_modified" jdbcType="TIMESTAMP"/> <result property="gmtModified" column="gmt_modified" jdbcType="TIMESTAMP"/>
<collection property="skuList" ofType="string" javaType="list"> <result property="categoryName" column="categoryName" jdbcType="VARCHAR"/>
<result column="roleCode"></result> <result property="brandName" column="brandName" jdbcType="VARCHAR"/>
<collection property="skuList" ofType="com.youlai.mall.pms.pojo.entity.PmsSku" javaType="list">
<id property="id" column="skuId" jdbcType="BIGINT"/>
<result property="name" column="skuName" jdbcType="VARCHAR"/>
<result property="sn" column="sn" jdbcType="VARCHAR"/>
<result property="picUrl" column="skuPicUrl" jdbcType="VARCHAR"/>
<result property="specifications" column="specifications" jdbcType="VARCHAR"/>
<result property="originPrice" column="skuOriginPrice" jdbcType="BIGINT"/>
<result property="price" column="skuPrice" jdbcType="BIGINT"/>
<result property="stock" column="stock" jdbcType="INTEGER"/>
<result property="lockedStock" column="locked_stock" jdbcType="INTEGER"/>
</collection> </collection>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id,name,category_id, id
,name,category_id,
brand_id,origin_price,price, brand_id,origin_price,price,
sales,pic_url,album, sales,pic_url,album,
unit,description,detail, unit,description,detail,
status,gmt_create,gmt_modified status,gmt_create,gmt_modified
</sql> </sql>
<select id="list" resultType="com.youlai.mall.pms.pojo.entity.PmsSpu"> <select id="list" resultMap="BaseResultMap">
SELECT t1.*,
@Select("<script>" + t3.NAME categoryName,
" SELECT " + t4.NAME brandName,
" t1.*," + t2.id skuId,
" t2.NAME AS category_name ," + t2.NAME skuName,
" t3.NAME AS brand_name " + t2.sn,
" FROM " + t2.pic_url skuPicUrl,
" pms_spu t1" + t2.specifications,
" LEFT JOIN pms_category t2 ON t1.category_id = t2.id " + t2.origin_price skuOriginPrice,
" LEFT JOIN pms_brand t3 ON t1.brand_id = t3.id " + t2.price skuPrice,
" WHERE 1=1 " + t2.stock
" <if test ='spu.categoryId !=null and spu.categoryId > 0' >" + FROM pms_spu t1
" AND t2.id = #{spu.categoryId} " + LEFT JOIN pms_sku t2 ON t1.id = t2.spu_id
" </if>" + LEFT JOIN pms_category t3 ON t1.category_id = t3.id
" ORDER BY t1.gmt_create DESC" + LEFT JOIN pms_brand t4 ON t1.brand_id = t4.id
"</script>") WHERE 1 = 1
@Results({ <if test="categoryId!=null">
@Result(id = true, column = "id", property = "id"), AND t1.category_id =#{categoryId}
@Result(property = "skus",column = "id",many = @Many(select="com.youlai.mall.pms.mapper.PmsSkuMapper.listBySpuId")) </if>
}) <if test='name!=null and name neq ""'>
AND t1.category_id =#{categoryId}
</if>
</select> </select>
</mapper> </mapper>

View File

@ -0,0 +1,26 @@
package com.youlai.mall.pms.service.impl;
import com.youlai.mall.pms.pojo.vo.admin.GoodsDetailVO;
import com.youlai.mall.pms.service.IPmsSpuService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author <a href="mailto:xianrui0365@163.com">xianrui</a>
* @date 2021/7/17
*/
@SpringBootTest
@Slf4j
class PmsSpuServiceImplTest {
@Autowired
private IPmsSpuService iPmsSpuService;
@Test
void getGoodsById() {
GoodsDetailVO goodsDetail = iPmsSpuService.getGoodsById(1l);
log.info(goodsDetail.toString());
}
}

View File

@ -1,6 +1,6 @@
package com.youlai.mall.sms.pojo.to; package com.youlai.mall.sms.pojo.to;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;

View File

@ -1,6 +1,6 @@
package com.youlai.mall.sms.pojo.vo; package com.youlai.mall.sms.pojo.vo;
import com.youlai.mall.pms.pojo.dto.SkuDTO; import com.youlai.mall.pms.pojo.dto.app.SkuDTO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;

View File

@ -24,17 +24,12 @@ public class SysMenu extends BaseEntity {
private String name; private String name;
private String icon; private String iconUrl;
/**
* 路由名称
*/
private String routeName;
/** /**
* 路由路径 * 路由路径
*/ */
private String routePath; private String path;
private String component; private String component;

View File

@ -6,9 +6,8 @@ import lombok.Setter;
/** /**
* 权限类型 * 权限类型
* *
* @Author haoxr * @author xianrui
* @Date 2021-02-05 10:10 * @date 2021-02-05
* @Version 1.0.0
*/ */
public enum PermTypeEnum { public enum PermTypeEnum {

View File

@ -20,7 +20,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
* @author haoxr * @author xianrui
* @date 2020-11-06 * @date 2020-11-06
*/ */
@Api(tags = "菜单接口") @Api(tags = "菜单接口")

View File

@ -14,9 +14,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
/** /**
* @author haoxr * @author xianrui
* @description TODO * @date 2021/6/1 22:40
* @createTime 2021/6/1 22:40
*/ */
@Api(tags = "路由接口") @Api(tags = "路由接口")
@RestController @RestController

View File

@ -20,8 +20,8 @@ import java.util.Optional;
/** /**
* @Author haoxr * @author xianrui
* @Date 2020-11-06 * @date 2020-11-06
*/ */
@Service @Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService { public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
@ -107,13 +107,13 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
RouteVO routeVO = new RouteVO(); RouteVO routeVO = new RouteVO();
routeVO.setName(menu.getId() + ""); // 根据name路由跳转 this.$router.push({path:xxx}) routeVO.setName(menu.getId() + ""); // 根据name路由跳转 this.$router.push({path:xxx})
routeVO.setPath(menu.getRoutePath()); // 根据path路由跳转 this.$router.push({name:xxx}) routeVO.setPath(menu.getPath()); // 根据path路由跳转 this.$router.push({name:xxx})
routeVO.setRedirect(menu.getRedirect()); routeVO.setRedirect(menu.getRedirect());
routeVO.setComponent(menu.getComponent()); routeVO.setComponent(menu.getComponent());
routeVO.setRedirect(menu.getRedirect()); routeVO.setRedirect(menu.getRedirect());
routeVO.setMeta(routeVO.new Meta( routeVO.setMeta(routeVO.new Meta(
menu.getName(), menu.getName(),
menu.getIcon(), menu.getIconUrl(),
menu.getRoles() menu.getRoles()
)); ));
// 菜单显示隐藏 // 菜单显示隐藏

View File

@ -7,11 +7,10 @@
<id property="id" column="id" jdbcType="BIGINT"/> <id property="id" column="id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/> <result property="name" column="name" jdbcType="VARCHAR"/>
<result property="parentId" column="parent_id" jdbcType="BIGINT"/> <result property="parentId" column="parent_id" jdbcType="BIGINT"/>
<result property="routeName" column="route_name" jdbcType="VARCHAR"/> <result property="path" column="path" jdbcType="VARCHAR"/>
<result property="routePath" column="route_path" jdbcType="VARCHAR"/>
<result property="component" column="component" jdbcType="VARCHAR"/> <result property="component" column="component" jdbcType="VARCHAR"/>
<result property="redirect" column="redirect" jdbcType="VARCHAR"/> <result property="redirect" column="redirect" jdbcType="VARCHAR"/>
<result property="icon" column="icon" jdbcType="VARCHAR"/> <result property="iconUrl" column="icon_url" jdbcType="VARCHAR"/>
<result property="sort" column="sort" jdbcType="INTEGER"/> <result property="sort" column="sort" jdbcType="INTEGER"/>
<result property="visible" column="visible" jdbcType="BOOLEAN"/> <result property="visible" column="visible" jdbcType="BOOLEAN"/>
<result property="gmtCreate" column="gmt_create" jdbcType="TIMESTAMP"/> <result property="gmtCreate" column="gmt_create" jdbcType="TIMESTAMP"/>
@ -33,10 +32,9 @@
select t1.id, select t1.id,
t1.name, t1.name,
t1.parent_id, t1.parent_id,
t1.route_name, t1.path,
t1.route_path,
t1.component, t1.component,
t1.icon, t1.icon_url,
t1.sort, t1.sort,
t1.visible, t1.visible,
t1.redirect, t1.redirect,