优惠劵模板相关逻辑的迁移

This commit is contained in:
YunaiV
2020-08-21 22:32:52 +08:00
parent b5e939fdb4
commit cb0c7744ac
74 changed files with 711 additions and 2366 deletions

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>promotion</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>promotion-application</artifactId>
<dependencies>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-biz</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-rpc</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>promotion</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>promotion-biz-api</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>common-framework</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,53 +0,0 @@
package cn.iocoder.mall.promotion.biz.api.enums;
/**
* 错误码枚举类
*
* 营销系统,使用 1-006-000-000 段
*/
public enum PromotionErrorCodeEnum {
// ========== Banner 模块 ==========
BANNER_NOT_EXISTS(1006000000, "账号不存在"),
// // ========== PRODUCT RECOMMEND 模块 ==========
// PRODUCT_RECOMMEND_NOT_EXISTS(1006001000, "商品推荐不存在"),
// PRODUCT_RECOMMEND_PRODUCT_NOT_EXISTS(1006001001, "商品不存在"),
// PRODUCT_RECOMMEND_EXISTS(1006001002, "该商品推荐已经存在"),
//
//
// // ========== COUPON TEMPLATE 模块 ==========
// COUPON_TEMPLATE_NOT_EXISTS(1006002000, "优惠劵模板(码)不存在"),
// COUPON_TEMPLATE_NOT_CARD(1006002001, "不是优惠劵模板"),
// COUPON_TEMPLATE_NOT_CODE(1006002002, "不是优惠码模板"),
// COUPON_TEMPLATE_TOTAL_CAN_NOT_REDUCE(1006002003, "优惠劵(码)模板的发放数量不能减小"),
// COUPON_TEMPLATE_STATUS_NOT_ENABLE(1006002004, "优惠劵模板(码)未开启"),
// COUPON_TEMPLATE_TOTAL_NOT_ENOUGH(1006002005, "优惠劵(码)模板的发放量不足"),
// COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA(1006002006, "优惠劵领取到达上限"),
//
// // ========== COUPON CARD 模块 ==========
// COUPON_CARD_NOT_EXISTS(1006003000, "优惠劵不存在"),
// COUPON_CARD_ERROR_USER(1006003001, "优惠劵不属于当前用户"),
// COUPON_CARD_NOT_MATCH(1006003002, "优惠劵不匹配,无法使用"),
// COUPON_CARD_STATUS_NOT_UNUSED(1006003003, "优惠劵不处于待使用状态"),
// COUPON_CARD_STATUS_NOT_USED(1006003004, "优惠劵不处于已使用状态"),
;
private final int code;
private final String message;
PromotionErrorCodeEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}

View File

@@ -1,5 +0,0 @@
/**
* author: sin
* time: 2020/5/14 15:25
*/
package cn.iocoder.mall.promotion.biz.api;

View File

@@ -1,83 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>promotion</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>promotion-biz</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-biz-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Spring 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- DB 相关 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 短信平台 阿里云、云片 -->
<dependency>
<groupId>com.yunpian.sdk</groupId>
<artifactId>yunpian-java-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
<!-- 文件服务商 -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,51 +0,0 @@
package cn.iocoder.mall.promotion.biz.bo.banner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* bannerlist
*
* author: sin
* time: 2020/5/14 16:00
*/
@Data
@Accessors(chain = true)
// TODO FROM 芋艿 to 小范:捉摸是不是先统一的 BannerBO另外biz 不使用 swagger 注解哈,其他 banner 的 dto 和 bo 也一起改改哈;
public class BannerListBO implements Serializable {
@ApiModelProperty("编号")
private Integer id;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("跳转链接")
private String url;
@ApiModelProperty("图片链接")
private String picUrl;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty("备注")
private String memo;
//
// 其他
@ApiModelProperty("更新时间")
private Date updatedTime;
@ApiModelProperty("创建时间")
private Date createdTime;
}

View File

@@ -1,35 +0,0 @@
package cn.iocoder.mall.promotion.biz.bo.banner;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* banner - 已发布的banner
*
* author: sin
* time: 2020/5/14 16:56
*/
@Data
@Accessors(chain = true)
public class BannerListOnReleaseBO implements Serializable {
/**
* 编号
*/
private Integer id;
/**
* 标题
*/
private String title;
/**
* 跳转链接
*/
private String url;
/**
* 图片链接
*/
private String picUrl;
}

View File

@@ -1,5 +0,0 @@
/**
* author: sin
* time: 2020/5/14 16:46
*/
package cn.iocoder.mall.promotion.biz.bo;

View File

@@ -1,26 +0,0 @@
package cn.iocoder.mall.promotion.biz.convert;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListBO;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListOnReleaseBO;
import cn.iocoder.mall.promotion.biz.dataobject.BannerDO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerAddDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerUpdateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface BannerConvert {
BannerConvert INSTANCE = Mappers.getMapper(BannerConvert.class);
List<BannerListBO> convert(List<BannerDO> bannerDO);
List<BannerListOnReleaseBO> convertToBO(List<BannerListBO> bannerList);
BannerDO convert(BannerAddDTO bannerAddDTO);
BannerDO convert(BannerUpdateDTO bannerUpdateDTO);
}

View File

@@ -1,45 +0,0 @@
package cn.iocoder.mall.promotion.biz.dao;
import cn.iocoder.mall.promotion.biz.dataobject.BannerDO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerListDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;
/**
* banner
*
* author: sin
* time: 2020/5/14 14:19
*/
@Repository
@Mapper
public interface BannerMapper extends BaseMapper<BannerDO> {
/**
* 查询 - 列表
*
* @param dto
* @return
*/
// TODO FROM 芋艿 to 小范Page 方法哈
default IPage<BannerDO> selectBannerList(BannerListDTO dto) {
LambdaQueryWrapper<BannerDO> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isEmpty(dto.getStatus())) {
queryWrapper.eq(BannerDO::getStatus, dto.getStatus());
}
if (StringUtils.isEmpty(dto.getTitle())) {
queryWrapper.like(BannerDO::getTitle, dto.getTitle());
}
queryWrapper.orderByDesc(BannerDO::getId);
IPage<BannerDO> result = selectPage(new Page<>(), queryWrapper);
return result;
}
}

View File

@@ -1,47 +0,0 @@
package cn.iocoder.mall.promotion.biz.dataobject;
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* Banner 广告页
*/
@Data
@Accessors(chain = true)
public class BannerDO extends DeletableDO {
/**
* 编号
*/
private Integer id;
/**
* 标题
*/
private String title;
/**
* 跳转链接
*/
private String url;
/**
* 图片链接
*/
private String picUrl;
/**
* 排序
*/
private Integer sort;
/**
* 状态
*
* {@link cn.iocoder.common.framework.enums.CommonStatusEnum}
*/
private Integer status;
/**
* 备注
*/
private String memo;
// TODO 芋艿 点击次数。&& 其他数据相关
}

View File

@@ -1,41 +0,0 @@
package cn.iocoder.mall.promotion.biz.dto.banner;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* Banner 添加 DTO
*/
@Data
@Accessors(chain = true)
public class BannerAddDTO implements Serializable {
@NotNull
private Integer adminId;
@NotEmpty(message = "标题不能为空")
@Length(min = 2, max = 32, message = "标题长度为 2-32 位")
private String title;
@NotEmpty(message = "跳转链接不能为空")
@URL(message = "跳转链接格式不正确")
@Length(max = 255, message = "跳转链接最大长度为 255 位")
private String url;
@NotEmpty(message = "图片链接不能为空")
@URL(message = "图片链接格式不正确")
@Length(max = 255, message = "图片链接最大长度为 255 位")
private String picUrl;
@NotNull(message = "排序不能为空")
private Integer sort;
@Length(max = 255, message = "备注最大长度为 255 位")
private String memo;
}

View File

@@ -1,26 +0,0 @@
package cn.iocoder.mall.promotion.biz.dto.banner;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* Banner 分页 DTO
*/
@Data
@Accessors(chain = true)
public class BannerListDTO extends PageParam {
@ApiModelProperty("标题")
@NotNull(message = "页码不能为空")
private String title;
@ApiModelProperty("标题")
@NotNull(message = "页码不能为空")
private Integer status;
}

View File

@@ -1,45 +0,0 @@
package cn.iocoder.mall.promotion.biz.dto.banner;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* Banner 更新 DTO
*/
@Data
@Accessors(chain = true)
public class BannerUpdateDTO implements Serializable {
@NotNull
Integer adminId;
@NotNull(message = "编号不能为空")
private Integer id;
@NotEmpty(message = "标题不能为空")
@Length(min = 2, max = 32, message = "标题长度为 2-32 位")
private String title;
@NotEmpty(message = "跳转链接不能为空")
@URL(message = "跳转链接格式不正确")
@Length(max = 255, message = "跳转链接最大长度为 255 位")
private String url;
@NotEmpty(message = "图片链接不能为空")
@URL(message = "图片链接格式不正确")
@Length(max = 255, message = "图片链接最大长度为 255 位")
private String picUrl;
@NotNull(message = "排序不能为空")
private Integer sort;
@Length(max = 255, message = "备注最大长度为 255 位")
private String memo;
}

View File

@@ -1,5 +0,0 @@
/**
* author: sin
* time: 2020/5/14 16:46
*/
package cn.iocoder.mall.promotion.biz.dto;

View File

@@ -1,6 +0,0 @@
/**
* author: sin
* time: 2020/5/14 14:19
*/
package cn.iocoder.mall.promotion.biz;

View File

@@ -1,69 +0,0 @@
package cn.iocoder.mall.promotion.biz.service.banner;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListBO;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListOnReleaseBO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerAddDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerListDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerUpdateDTO;
import java.util.List;
/**
* banner
*
* author: sin
* time: 2020/5/14 14:19
*/
public interface BannerService {
/**
* 列表 - 获取已发布的banner
*
* @return
*/
List<BannerListOnReleaseBO> listBannerOnRelease();
/**
* 列表 - banner 列表
*
* @param bannerPageDTO
* @return
*/
PageResult<BannerListBO> listBanner(BannerListDTO bannerPageDTO);
/**
* 添加 - 一个banner
*
* @param adminsBannerAddDTO
*/
void addBanner(BannerAddDTO adminsBannerAddDTO);
/**
* 更新 - 根据id更新
*
* @param adminsBannerUpdateDTO
*/
void updateBanner(BannerUpdateDTO adminsBannerUpdateDTO);
// TODO FROM 芋艿 to 小范:貌似要把 dto 搞起来,嘿嘿;
/**
* 更新 - banner 状态
*
* @param adminId
* @param bannerId
* @param status
* @return
*/
void updateBannerStatus(Integer adminId, Integer bannerId, @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") Integer status);
/**
* 删除 - 根据id删除一个banner
*
* @param adminId
* @param bannerId
*/
void deleteBanner(Integer adminId, Integer bannerId);
}

View File

@@ -1,105 +0,0 @@
package cn.iocoder.mall.promotion.biz.service.banner;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.mybatis.core.enums.DeletedStatusEnum;
import cn.iocoder.mall.promotion.biz.api.enums.PromotionErrorCodeEnum;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListBO;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListOnReleaseBO;
import cn.iocoder.mall.promotion.biz.convert.BannerConvert;
import cn.iocoder.mall.promotion.biz.dao.BannerMapper;
import cn.iocoder.mall.promotion.biz.dataobject.BannerDO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerAddDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerListDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerUpdateDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* banner
*
* author: sin
* time: 2020/5/14 14:19
*/
@Service
public class BannerServiceImpl implements BannerService {
@Autowired
private BannerMapper bannerMapper;
@Override
public List<BannerListOnReleaseBO> listBannerOnRelease() {
PageResult<BannerListBO> pageResult = this.listBanner(
(BannerListDTO) new BannerListDTO()
.setStatus(CommonStatusEnum.ENABLE.getValue())
.setTitle(null)
.setPageNo(1)
.setPageSize(10)
);
return BannerConvert.INSTANCE.convertToBO(pageResult.getList());
}
@Override
public PageResult<BannerListBO> listBanner(BannerListDTO dto) {
IPage<BannerDO> page = bannerMapper.selectBannerList(dto);
List<BannerListBO> list = BannerConvert.INSTANCE.convert(page.getRecords());
return new PageResult<BannerListBO>().setList(list).setTotal(page.getTotal());
}
@Override
public void addBanner(BannerAddDTO adminsBannerAddDTO) {
// 转换DO
BannerDO banner = BannerConvert.INSTANCE.convert(adminsBannerAddDTO);
// 设置默认数据
banner.setStatus(CommonStatusEnum.ENABLE.getValue());
banner.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
banner.setCreateTime(new Date());
// 保存数据
bannerMapper.insert(banner);
}
@Override
public void updateBanner(BannerUpdateDTO adminsBannerUpdateDTO) {
// 校验 Banner 存在
if (bannerMapper.selectById(adminsBannerUpdateDTO.getId()) == null) {
throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.BANNER_NOT_EXISTS.getCode());
}
// 更新到数据库
BannerDO updateBanner = BannerConvert.INSTANCE.convert(adminsBannerUpdateDTO);
updateBanner.setUpdateTime(new Date());
bannerMapper.updateById(updateBanner);
}
@Override
public void updateBannerStatus(Integer adminId, Integer bannerId, Integer status) {
// 校验 Banner 存在
if (bannerMapper.selectById(bannerId) == null) {
throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.BANNER_NOT_EXISTS.getCode());
}
// 更新到数据库
BannerDO updateBanner = new BannerDO();
updateBanner.setId(bannerId);
updateBanner.setStatus(status);
updateBanner.setUpdateTime(new Date());
bannerMapper.updateById(updateBanner);
}
@Override
public void deleteBanner(Integer adminId, Integer bannerId) {
// 校验 Banner 存在
if (bannerMapper.selectById(bannerId) == null) {
throw ServiceExceptionUtil.exception(PromotionErrorCodeEnum.BANNER_NOT_EXISTS.getCode());
}
// 更新到数据库
BannerDO updateBanner = new BannerDO();
updateBanner.setId(bannerId);
updateBanner.setUpdateTime(new Date());
updateBanner.setDeleted(DeletedStatusEnum.DELETED_YES.getValue());
bannerMapper.updateById(updateBanner);
}
}

View File

@@ -1,5 +0,0 @@
/**
* author: sin
* time: 2020/5/14 16:47
*/
package cn.iocoder.mall.promotion.biz.service;

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>promotion</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>promotion-rest</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-biz</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-web</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-security</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-swagger</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,84 +0,0 @@
package cn.iocoder.mall.promotion.rest.controller.banner;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListBO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerAddDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerListDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerUpdateDTO;
import cn.iocoder.mall.promotion.biz.service.banner.BannerService;
import cn.iocoder.mall.promotion.rest.convert.BannerConvert;
import cn.iocoder.mall.promotion.rest.request.banner.BannerAddRequest;
import cn.iocoder.mall.promotion.rest.request.banner.BannerListRequest;
import cn.iocoder.mall.promotion.rest.request.banner.BannerUpdateRequest;
import cn.iocoder.mall.promotion.rest.request.banner.BannerUpdateStatusRequest;
import cn.iocoder.mall.promotion.rest.response.banner.BannerListResponse;
import cn.iocoder.mall.security.core.context.AdminSecurityContextHolder;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
* Banner(管理员API)
*
* author: sin
* time: 2020/5/14 15:27
*/
@RestController
@RequestMapping("/admins/banner")
@Api(tags = "Banner(管理员API)")
public class AdminsBannerController {
@Autowired
private BannerService bannerService;
@PostMapping("/list")
@ApiOperation(value = "列表-banner列表")
public CommonResult<PageResult<BannerListResponse>> page(@RequestBody @Valid BannerListRequest request) {
// 获取数据
BannerListDTO pageDTO = BannerConvert.INSTANCE.convert(request);
PageResult<BannerListBO> pageResult = bannerService.listBanner(pageDTO);
// 转换 response
List<BannerListResponse> responseList = BannerConvert.INSTANCE.convert(pageResult.getList());
return CommonResult.success(new PageResult<BannerListResponse>().setList(responseList).setTotal(pageResult.getTotal()));
}
@PostMapping("/add")
@ApiOperation(value = "添加-Banner")
public CommonResult<Void> add(@RequestBody @Valid BannerAddRequest request) {
BannerAddDTO bannerAddDTO = BannerConvert.INSTANCE.convert(request);
bannerAddDTO.setAdminId(AdminSecurityContextHolder.getContext().getAdminId());
bannerService.addBanner(bannerAddDTO);
return CommonResult.success(null);
}
@PutMapping("/update")
@ApiOperation(value = "更新-Banner信息")
public CommonResult<Void> update(@RequestBody @Valid BannerUpdateRequest request) {
BannerUpdateDTO bannerUpdateDTO = BannerConvert.INSTANCE.convert(request);
bannerUpdateDTO.setAdminId(AdminSecurityContextHolder.getContext().getAdminId());
bannerService.updateBanner(bannerUpdateDTO);
return CommonResult.success(null);
}
@PutMapping("/update-status")
@ApiOperation(value = "更新-banner状态")
public CommonResult<Void> updateStatus(@RequestBody @Valid BannerUpdateStatusRequest request) {
Integer adminId = AdminSecurityContextHolder.getContext().getAdminId();
bannerService.updateBannerStatus(adminId, request.getBannerId(), request.getStatus());
return CommonResult.success(null);
}
@DeleteMapping("/delete")
@ApiOperation(value = "删除-根据id删除")
@ApiImplicitParam(name = "id", value = "Banner 编号", required = true, example = "1")
public CommonResult<Void> delete(@RequestParam("id") Integer id) {
bannerService.deleteBanner(AdminSecurityContextHolder.getContext().getAdminId(), id);
return CommonResult.success(null);
}
}

View File

@@ -1,37 +0,0 @@
package cn.iocoder.mall.promotion.rest.controller.banner;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListOnReleaseBO;
import cn.iocoder.mall.promotion.biz.service.banner.BannerService;
import cn.iocoder.mall.promotion.rest.convert.BannerConvert;
import cn.iocoder.mall.promotion.rest.response.banner.BannerListOnReleaseResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Banner(用户API)
*
* author: sin
* time: 2020/5/14 15:27
*/
@RestController
@RequestMapping("/users/banner")
@Api(tags = "Banner(用户API)")
public class UsersBannerController {
@Autowired
private BannerService bannerService;
@GetMapping("/listBannerOnRelease")
@ApiOperation("获取-已发布的banner")
public CommonResult<List<BannerListOnReleaseResponse>> listBannerOnRelease() {
List<BannerListOnReleaseBO> releaseBOList = bannerService.listBannerOnRelease();
return CommonResult.success(BannerConvert.INSTANCE.convertReleaseResponse(releaseBOList));
}
}

View File

@@ -1,5 +0,0 @@
/**
* author: sin
* time: 2020/5/14 15:27
*/
package cn.iocoder.mall.promotion.rest.controller;

View File

@@ -1,33 +0,0 @@
package cn.iocoder.mall.promotion.rest.convert;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListBO;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListOnReleaseBO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerAddDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerUpdateDTO;
import cn.iocoder.mall.promotion.biz.dto.banner.BannerListDTO;
import cn.iocoder.mall.promotion.rest.request.banner.BannerAddRequest;
import cn.iocoder.mall.promotion.rest.request.banner.BannerListRequest;
import cn.iocoder.mall.promotion.rest.request.banner.BannerUpdateRequest;
import cn.iocoder.mall.promotion.rest.response.banner.BannerListResponse;
import cn.iocoder.mall.promotion.rest.response.banner.BannerListOnReleaseResponse;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface BannerConvert {
BannerConvert INSTANCE = Mappers.getMapper(BannerConvert.class);
BannerAddDTO convert(BannerAddRequest request);
BannerUpdateDTO convert(BannerUpdateRequest request);
BannerListDTO convert(BannerListRequest request);
List<BannerListResponse> convert(List<BannerListBO> bannerListBO);
List<BannerListOnReleaseResponse> convertReleaseResponse(List<BannerListOnReleaseBO> bannerListOnReleaseBOS);
}

View File

@@ -1,35 +0,0 @@
package cn.iocoder.mall.promotion.rest.request.banner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* banner更新 banner
*
* author: sin
* time: 2020/5/14 15:44
*/
@Data
@Accessors(chain = true)
public class BannerAddRequest implements Serializable {
@NotNull // TODO FROM 芋艿 to 小范:提示要加下,哈哈哈
@ApiModelProperty("跳转链接")
private Integer url;
@NotNull
@ApiModelProperty("图片链接")
private Integer picUrl;
@NotNull
@ApiModelProperty("排序")
private Integer sort;
@NotNull
@ApiModelProperty("备注")
private Integer memo;
}

View File

@@ -1,27 +0,0 @@
package cn.iocoder.mall.promotion.rest.request.banner;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* banner更新 banner
*
* author: sin
* time: 2020/5/14 15:44
*/
@Data
@Accessors(chain = true)
public class BannerListRequest extends PageParam {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("状态")
private Integer status;
}

View File

@@ -1,39 +0,0 @@
package cn.iocoder.mall.promotion.rest.request.banner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* banner更新 banner
*
* author: sin
* time: 2020/5/14 15:44
*/
@Data
@Accessors(chain = true)
public class BannerUpdateRequest implements Serializable {
@NotNull
@ApiModelProperty("banner编号")
private Integer bannerId;
@NotNull
@ApiModelProperty("跳转链接")
private Integer url;
@NotNull
@ApiModelProperty("图片链接")
private Integer picUrl;
@NotNull
@ApiModelProperty("排序")
private Integer sort;
@NotNull
@ApiModelProperty("备注")
private Integer memo;
}

View File

@@ -1,27 +0,0 @@
package cn.iocoder.mall.promotion.rest.request.banner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* banner更新 status
*
* author: sin
* time: 2020/5/14 15:44
*/
@Data
@Accessors(chain = true)
public class BannerUpdateStatusRequest implements Serializable {
@NotNull
@ApiModelProperty("banner编号")
private Integer bannerId;
@NotNull
@ApiModelProperty("status状态")
private Integer status;
}

View File

@@ -1,6 +0,0 @@
/**
* author: sin
* time: 2020/5/14 17:00
*/
package cn.iocoder.mall.promotion.rest.request;

View File

@@ -1,34 +0,0 @@
package cn.iocoder.mall.promotion.rest.response.banner;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* banner - 已发布的banner
*
* author: sin
* time: 2020/5/14 16:56
*/
@Data
@Accessors(chain = true)
public class BannerListOnReleaseResponse implements Serializable {
/**
* 编号
*/
private Integer id;
/**
* 标题
*/
private String title;
/**
* 跳转链接
*/
private String url;
/**
* 图片链接
*/
private String picUrl;
}

View File

@@ -1,49 +0,0 @@
package cn.iocoder.mall.promotion.rest.response.banner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* bannerlist
*
* author: sin
* time: 2020/5/14 16:00
*/
@Data
@Accessors(chain = true)
public class BannerListResponse implements Serializable {
@ApiModelProperty("编号")
private Integer id;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("跳转链接")
private String url;
@ApiModelProperty("图片链接")
private String picUrl;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty("备注")
private String memo;
//
// 其他
@ApiModelProperty("更新时间")
private Date updatedTime;
@ApiModelProperty("创建时间")
private Date createdTime;
}

View File

@@ -1,5 +0,0 @@
/**
* author: sin
* time: 2020/5/14 15:26
*/
package cn.iocoder.mall.promotion.rest.response;

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>promotion</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>promotion-rpc-api</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-biz-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>promotion</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>promotion-rpc</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>promotion-rpc-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>system-biz</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- RPC 相关 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- Registry 和 Config 相关 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -56,100 +56,4 @@ public class AdminsCouponController {
return success(CouponTemplateConvert.ADMINS.convertPage(result));
}
@PostMapping("/template/add_card")
@ApiOperation(value = "创建优惠劵模板")
@ApiImplicitParams({
@ApiImplicitParam(name = "title", value = "标题", required = true, example = "优惠劵牛逼"),
@ApiImplicitParam(name = "description", value = "使用说明", example = "我只是描述"),
@ApiImplicitParam(name = "quota", value = "每人限领个数", required = true),
@ApiImplicitParam(name = "total", value = "发行总量"),
@ApiImplicitParam(name = "priceAvailable", value = "是否设置满多少金额可用,单位:分", example = "0-不限制大于0-多少金额可用"),
@ApiImplicitParam(name = "rangeType", value = "可用范围的类型", required = true, example = "参见 CouponTemplateRangeTypeEnum 枚举"),
@ApiImplicitParam(name = "rangeValues", value = "指定商品 / 分类列表,使用逗号分隔商品编号"),
@ApiImplicitParam(name = "dateType", value = "生效日期类型", example = "参见 CouponTemplateDateTypeEnum 枚举"),
@ApiImplicitParam(name = "validStartTime", value = "固定日期-生效开始时间", example = "当 dateType 为固定日期时,非空"),
@ApiImplicitParam(name = "validEndTime", value = "固定日期-生效结束时间", example = "当 dateType 为固定日期时,非空"),
@ApiImplicitParam(name = "fixedBeginTerm", value = "领取日期-开始天数", example = "当 dateType 为领取日期时,非空"),
@ApiImplicitParam(name = "fixedEndTerm", value = "领取日期-结束天数", example = "当 dateType 为领取日期时,非空"),
@ApiImplicitParam(name = "preferentialType", value = "优惠类型", example = "参见 CouponTemplatePreferentialTypeEnum 枚举"),
@ApiImplicitParam(name = "priceOff", value = "优惠金额,单位:分", example = "当 preferentialType 为现金券时,非空"),
@ApiImplicitParam(name = "percentOff", value = "折扣百分比", example = "当 preferentialType 为折扣卷时,非空"),
@ApiImplicitParam(name = "discountPriceLimit", value = "折扣上限", example = "当 preferentialType 为折扣卷时,非空"),
})
public CommonResult<AdminsCouponTemplateVO> templateCardAdd(@RequestParam(value = "title") String title,
@RequestParam(value = "description", required = false) String description,
@RequestParam(value = "quota") Integer quota,
@RequestParam(value = "total", required = false) Integer total,
@RequestParam(value = "priceAvailable") Integer priceAvailable,
@RequestParam(value = "rangeType") Integer rangeType,
@RequestParam(value = "rangeValues", required = false) String rangeValues,
@RequestParam(value = "dateType") Integer dateType,
@DateTimeFormat(pattern = "yyyy-MM-dd")
@RequestParam(value = "validStartTime", required = false) Date validStartTime,
@DateTimeFormat(pattern = "yyyy-MM-dd")
@RequestParam(value = "validEndTime", required = false) Date validEndTime,
@RequestParam(value = "fixedBeginTerm", required = false) Integer fixedBeginTerm,
@RequestParam(value = "fixedEndTerm", required = false) Integer fixedEndTerm,
@RequestParam(value = "preferentialType") Integer preferentialType,
@RequestParam(value = "priceOff", required = false) Integer priceOff,
@RequestParam(value = "percentOff", required = false) Integer percentOff,
@RequestParam(value = "discountPriceLimit", required = false) Integer discountPriceLimit) {
// 创建 CouponCardTemplateAddDTO 对象
validStartTime = DateUtil.getDayBegin(validStartTime); // 开始时间,以当前 00:00:00 为准
validEndTime = DateUtil.getDayBegin(validEndTime); // 结束时间,以当前 25:59:59 为准
CouponCardTemplateAddDTO couponCardTemplateAddDTO = new CouponCardTemplateAddDTO()
.setTitle(title).setDescription(description)
.setQuota(quota).setTotal(total)
.setPriceAvailable(priceAvailable).setRangeType(rangeType).setRangeValues(rangeValues)
.setDateType(dateType).setValidStartTime(validStartTime).setValidEndTime(validEndTime)
.setFixedBeginTerm(fixedBeginTerm).setFixedEndTerm(fixedEndTerm)
.setPreferentialType(preferentialType).setPriceOff(priceOff).setPercentOff(percentOff).setDiscountPriceLimit(discountPriceLimit);
// 提交请求
CouponTemplateBO result = couponService.addCouponCardTemplate(couponCardTemplateAddDTO);
// 返回结果
return success(CouponTemplateConvert.ADMINS.convert(result));
}
@PostMapping("/template/update_card")
@ApiOperation(value = "更新优惠劵模板")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1"),
@ApiImplicitParam(name = "title", value = "标题", required = true, example = "优惠劵牛逼"),
@ApiImplicitParam(name = "description", value = "使用说明", example = "我只是描述"),
@ApiImplicitParam(name = "quota", value = "每人限领个数", required = true),
@ApiImplicitParam(name = "total", value = "发行总量"),
@ApiImplicitParam(name = "rangeType", value = "可用范围的类型", required = true, example = "参见 CouponTemplateRangeTypeEnum 枚举"),
@ApiImplicitParam(name = "rangeValues", value = "指定商品 / 分类列表,使用逗号分隔商品编号"),
})
public CommonResult<Boolean> templateCardUpdate(@RequestParam(value = "id") Integer id,
@RequestParam(value = "title") String title,
@RequestParam(value = "description", required = false) String description,
@RequestParam(value = "quota") Integer quota,
@RequestParam(value = "total", required = false) Integer total,
@RequestParam(value = "rangeType") Integer rangeType,
@RequestParam(value = "rangeValues", required = false) String rangeValues) {
// 创建 CouponCardTemplateAddDTO 对象
CouponCardTemplateUpdateDTO couponCardTemplateUpdateDTO = new CouponCardTemplateUpdateDTO()
.setId(id)
.setTitle(title).setDescription(description)
.setQuota(quota).setTotal(total)
.setRangeType(rangeType).setRangeValues(rangeValues);
return success(couponService.updateCouponCardTemplate(couponCardTemplateUpdateDTO));
}
@PostMapping("/template/update_status")
@ApiOperation(value = "更新优惠劵(码)模板状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "Banner 编号", required = true, example = "1"),
@ApiImplicitParam(name = "status", value = "状态。1 - 开启2 - 禁用", required = true, example = "1"),
})
public CommonResult<Boolean> templateUpdateStatus(@RequestParam("id") Integer id,
@RequestParam("status") Integer status) {
return success(couponService.updateCouponTemplateStatus(AdminSecurityContextHolder.getContext().getAdminId(), id, status));
}
// ========== 优惠劵 ==========
// ========== 优惠码 ==========
}

View File

@@ -1,20 +0,0 @@
package cn.iocoder.mall.promotion.application.vo.admins;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@ApiModel("优惠劵(码)分页 VO")
@Data
@Accessors(chain = true)
public class AdminsCouponTemplatePageVO {
@ApiModelProperty(value = "优惠劵(码)数组")
private List<AdminsCouponTemplateVO> list;
@ApiModelProperty(value = "优惠劵(码)总数")
private Integer total;
}

View File

@@ -1,80 +0,0 @@
package cn.iocoder.mall.promotion.application.vo.admins;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@ApiModel("CouponTemplate VO")
@Data
@Accessors(chain = true)
public class AdminsCouponTemplateVO {
// ========== 基本信息 BEGIN ==========
@ApiModelProperty(value = "模板编号,自增唯一", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "标题", required = true, example = "优惠劵牛逼")
private String title;
@ApiModelProperty(value = "使用说明", required = true, example = "我只是描述")
private String description;
@ApiModelProperty(value = "优惠劵类型", required = true, example = "参见 CouponTemplateTypeEnum 枚举")
private Integer type;
/**
* 码类型
*
* 1-一卡一码UNIQUE
* 2-通用码GENERAL
*
* 【优惠码独有】 @see CouponCodeDO
*/
// TODO
private Integer codeType;
@ApiModelProperty(value = "优惠码状态", required = true, example = "参见 CouponTemplateStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "每人限领个数", example = "null - 则表示不限制")
private Integer quota;
@ApiModelProperty(value = "发放总量")
private Integer total;
// ========== 领取规则 END ==========
// ========== 使用规则 BEGIN ==========
@ApiModelProperty(value = "是否设置满多少金额可用,单位:分", required = true, example = "0-不限制大于0-多少金额可用")
private Integer priceAvailable;
@ApiModelProperty(value = "可用范围的类型", required = true, example = "参见 CouponTemplateRangeTypeEnum 枚举")
private Integer rangeType;
@ApiModelProperty(value = "指定商品 / 分类列表,使用逗号分隔商品编号", example = "参见 CouponTemplateRangeTypeEnum 枚举")
private String rangeValues;
@ApiModelProperty(value = "生效日期类型", example = "参见 CouponTemplateDateTypeEnum 枚举")
private Integer dateType;
@ApiModelProperty(value = "固定日期-生效开始时间")
private Date validStartTime;
@ApiModelProperty(value = "固定日期-生效结束时间")
private Date validEndTime;
@ApiModelProperty(value = "领取日期-开始天数", example = "例如0-当天1-次天")
private Integer fixedStartTerm;
@ApiModelProperty(value = "领取日期-结束天数")
private Integer fixedEndTerm;
// ========== 使用规则 END ==========
// ========== 使用效果 BEGIN ==========
@ApiModelProperty(value = "优惠类型", required = true, example = "参见 CouponTemplatePreferentialTypeEnum 枚举")
private Integer preferentialType;
@ApiModelProperty(value = "折扣百分比")
private Integer percentOff;
@ApiModelProperty(value = "优惠金额,单位:分")
private Integer priceOff;
@ApiModelProperty(value = "折扣上限")
private Integer discountPriceLimit;
// ========== 使用效果 END ==========
// ========== 统计信息 BEGIN ==========
@ApiModelProperty(value = "领取优惠券的次数", required = true)
private Integer statFetchNum;
// ========== 统计信息 END ==========
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@@ -1,20 +0,0 @@
package cn.iocoder.mall.promotion.application.vo.admins;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@ApiModel("商品推荐分页 VO")
@Data
@Accessors(chain = true)
public class AdminsProductRecommendPageVO {
@ApiModelProperty(value = "商品推荐数组")
private List<AdminsProductRecommendVO> list;
@ApiModelProperty(value = "商品推荐总数")
private Integer total;
}