Commit 247d299cca2f6a068b657202cff16ede6c875321

Authored by xiaxiaoYY
1 parent e31091c0

Banner模块 for review

Showing 18 changed files with 852 additions and 50 deletions
sql/mall.sql
... ... @@ -253,3 +253,35 @@ create table product_sku
253 253 collate utf8mb4_general_ci;
254 254  
255 255  
  256 +---Market-Banner管理SQL
  257 +drop table if exists market_banner;
  258 +CREATE TABLE `market_banner` (
  259 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Banner编号',
  260 + `title` varchar(64) NOT NULL DEFAULT '' COMMENT 'Banner标题',
  261 + `pic_url` varchar(255) NOT NULL COMMENT '图片URL',
  262 + `status` tinyint(4) NOT NULL DEFAULT '-1' COMMENT '活动状态',
  263 + `url` varchar(255) NOT NULL COMMENT '跳转地址',
  264 + `creator` varchar(64) DEFAULT '' COMMENT '创建者',
  265 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  266 + `updater` varchar(64) DEFAULT '' COMMENT '更新者',
  267 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  268 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  269 + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
  270 + `sort` tinyint(4) DEFAULT NULL COMMENT '排序',
  271 + `memo` varchar(255) DEFAULT NULL COMMENT '描述',
  272 + PRIMARY KEY (`id`) USING BTREE
  273 +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='Banner管理';
  274 +-- 菜单 SQL
  275 +INSERT INTO `system_menu`(`id`,`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
  276 +VALUES (2002, 'Banner管理', '', 2, 1, 2000, 'brand', '', 'mall/market/banner/index', 0);
  277 +-- 按钮父菜单ID
  278 +SELECT @parentId := LAST_INSERT_ID();
  279 +-- 按钮 SQL
  280 +INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
  281 +VALUES ('Banner查询', 'market:banner:query', 3, 1, @parentId, '', '', '', 0);
  282 +INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
  283 +VALUES ('Banner创建', 'market:banner:create', 3, 2, @parentId, '', '', '', 0);
  284 +INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
  285 +VALUES ('Banner更新', 'market:banner:update', 3, 3, @parentId, '', '', '', 0);
  286 +INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
  287 +VALUES ('Banner删除', 'market:banner:delete', 3, 4, @parentId, '', '', '', 0);
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/CommonStatusEnum.java
1 1 package cn.iocoder.yudao.framework.common.enums;
2 2  
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
3 4 import lombok.AllArgsConstructor;
4 5 import lombok.Getter;
5 6  
  7 +import java.util.Arrays;
  8 +
6 9 /**
7 10 * 通用状态枚举
8 11 *
... ... @@ -10,11 +13,14 @@ import lombok.Getter;
10 13 */
11 14 @Getter
12 15 @AllArgsConstructor
13   -public enum CommonStatusEnum {
  16 +public enum CommonStatusEnum implements IntArrayValuable {
14 17  
15 18 ENABLE(0, "开启"),
16 19 DISABLE(1, "关闭");
17 20  
  21 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray();
  22 +
  23 +
18 24 /**
19 25 * 状态值
20 26 */
... ... @@ -24,4 +30,9 @@ public enum CommonStatusEnum {
24 30 */
25 31 private final String name;
26 32  
  33 + @Override
  34 + public int[] array() {
  35 + return ARRAYS;
  36 + }
  37 +
27 38 }
... ...
yudao-module-mall/yudao-module-market-api/src/main/java/cn/iocoder/yudao/module/market/enums/ErrorCodeConstants.java
... ... @@ -12,4 +12,7 @@ public interface ErrorCodeConstants {
12 12  
13 13 // ========== 促销活动相关 1003001000============
14 14 ErrorCode ACTIVITY_NOT_EXISTS = new ErrorCode(1003001000, "促销活动不存在");
  15 +
  16 + // ========== banner相关 1003002000============
  17 + ErrorCode BANNER_NOT_EXISTS = new ErrorCode(1003002000, "Banner不存在");
15 18 }
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/activity/vo/ActivityCreateReqVO.java
... ... @@ -5,6 +5,9 @@ import java.util.*;
5 5 import io.swagger.annotations.*;
6 6 import javax.validation.constraints.*;
7 7  
  8 +/**
  9 + * @author xia
  10 + */
8 11 @ApiModel("管理后台 - 促销活动创建 Request VO")
9 12 @Data
10 13 @EqualsAndHashCode(callSuper = true)
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/BannerController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.*;
  6 +import cn.iocoder.yudao.module.market.convert.banner.BannerConvert;
  7 +import cn.iocoder.yudao.module.market.dal.dataobject.banner.BannerDO;
  8 +import cn.iocoder.yudao.module.market.service.banner.BannerService;
  9 +import io.swagger.annotations.Api;
  10 +import io.swagger.annotations.ApiImplicitParam;
  11 +import io.swagger.annotations.ApiOperation;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.*;
  15 +
  16 +import javax.annotation.Resource;
  17 +import javax.validation.Valid;
  18 +import java.util.Collection;
  19 +import java.util.List;
  20 +
  21 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  22 +
  23 +@Api(tags = "管理后台 - Banner管理")
  24 +@RestController
  25 +@RequestMapping("/market/banner")
  26 +@Validated
  27 +public class BannerController {
  28 +
  29 + @Resource
  30 + private BannerService bannerService;
  31 +
  32 + @PostMapping("/create")
  33 + @ApiOperation("创建banner")
  34 + @PreAuthorize("@ss.hasPermission('market:banner:create')")
  35 + public CommonResult<Long> createBanner(@Valid @RequestBody BannerCreateReqVO createReqVO) {
  36 + return success(bannerService.createBanner(createReqVO));
  37 + }
  38 +
  39 + @PutMapping("/update")
  40 + @ApiOperation("更新banner")
  41 + @PreAuthorize("@ss.hasPermission('market:banner:update')")
  42 + public CommonResult<Boolean> updateBanner(@Valid @RequestBody BannerUpdateReqVO updateReqVO) {
  43 + bannerService.updateBanner(updateReqVO);
  44 + return success(true);
  45 + }
  46 +
  47 + @DeleteMapping("/delete")
  48 + @ApiOperation("删除banner")
  49 + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
  50 + @PreAuthorize("@ss.hasPermission('market:banner:delete')")
  51 + public CommonResult<Boolean> deleteBanner(@RequestParam("id") Long id) {
  52 + bannerService.deleteBanner(id);
  53 + return success(true);
  54 + }
  55 +
  56 + @GetMapping("/get")
  57 + @ApiOperation("获得banner")
  58 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  59 + @PreAuthorize("@ss.hasPermission('market:banner:query')")
  60 + public CommonResult<BannerRespVO> getBanner(@RequestParam("id") Long id) {
  61 + BannerDO banner = bannerService.getBanner(id);
  62 + return success(BannerConvert.INSTANCE.convert(banner));
  63 + }
  64 +
  65 + @GetMapping("/list")
  66 + @ApiOperation("获得banner列表")
  67 + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
  68 + @PreAuthorize("@ss.hasPermission('market:banner:query')")
  69 + public CommonResult<List<BannerRespVO>> getBannerList(@RequestParam("ids") Collection<Long> ids) {
  70 + List<BannerDO> list = bannerService.getBannerList(ids);
  71 + return success(BannerConvert.INSTANCE.convertList(list));
  72 + }
  73 +
  74 + @GetMapping("/page")
  75 + @ApiOperation("获得Banner分页")
  76 + @PreAuthorize("@ss.hasPermission('market:banner:query')")
  77 + public CommonResult<PageResult<BannerRespVO>> getBannerPage(@Valid BannerPageReqVO pageVO) {
  78 + PageResult<BannerDO> pageResult = bannerService.getBannerPage(pageVO);
  79 + return success(BannerConvert.INSTANCE.convertPage(pageResult));
  80 + }
  81 +
  82 +
  83 + @GetMapping("/update-status")
  84 + @ApiOperation("Banner上下架")
  85 + @PreAuthorize("@ss.hasPermission('market:banner:update')")
  86 + public CommonResult<Boolean> updateBannerStatus(@Valid @RequestBody BannerUpdateStatusReqVO reqVO) {
  87 + bannerService.updateBannerStatus(reqVO);
  88 + return success(true);
  89 + }
  90 +
  91 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +/**
  11 +* Banner Base VO,提供给添加、修改、详细的子 VO 使用
  12 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  13 + * @author xia
  14 + */
  15 +@Data
  16 +public class BannerBaseVO {
  17 +
  18 + @ApiModelProperty(value = "标题", required = true)
  19 + @NotNull(message = "标题不能为空")
  20 + private String title;
  21 +
  22 + @ApiModelProperty(value = "跳转链接", required = true)
  23 + @NotNull(message = "跳转链接不能为空")
  24 + /**
  25 + * 跳转链接
  26 + */
  27 + private String url;
  28 +
  29 + @ApiModelProperty(value = "图片地址", required = true)
  30 + @NotNull(message = "图片地址不能为空")
  31 + /**
  32 + * 图片链接
  33 + */
  34 + private String picUrl;
  35 +
  36 +
  37 + @ApiModelProperty(value = "排序", required = true)
  38 + @NotNull(message = "排序不能为空")
  39 + private Integer sort;
  40 +
  41 +
  42 + @ApiModelProperty(value = "状态", required = true)
  43 + @NotNull(message = "状态不能为空")
  44 + @InEnum(CommonStatusEnum.class)
  45 + private Integer status;
  46 +
  47 + @ApiModelProperty(value = "备注")
  48 + private String memo;
  49 +
  50 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +/**
  12 + * @author xia
  13 + */
  14 +@ApiModel("管理后台 - Banner 创建 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class BannerCreateReqVO extends BannerBaseVO {
  19 +
  20 +
  21 +
  22 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  5 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  6 +import io.swagger.annotations.ApiModel;
  7 +import io.swagger.annotations.ApiModelProperty;
  8 +import lombok.Data;
  9 +import lombok.EqualsAndHashCode;
  10 +import lombok.ToString;
  11 +import org.springframework.format.annotation.DateTimeFormat;
  12 +
  13 +import java.util.Date;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  16 +
  17 +/**
  18 + * @author xia
  19 + */
  20 +@ApiModel("管理后台 - Banner 分页 Request VO")
  21 +@Data
  22 +@EqualsAndHashCode(callSuper = true)
  23 +@ToString(callSuper = true)
  24 +public class BannerPageReqVO extends PageParam {
  25 +
  26 + @ApiModelProperty(value = "标题")
  27 + private String title;
  28 +
  29 +
  30 + @ApiModelProperty(value = "状态")
  31 + @InEnum(CommonStatusEnum.class)
  32 + private Integer status;
  33 +
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + @ApiModelProperty(value = "开始创建时间")
  36 + private Date beginCreateTime;
  37 +
  38 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  39 + @ApiModelProperty(value = "结束创建时间")
  40 + private Date endCreateTime;
  41 +
  42 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +import java.util.Date;
  10 +
  11 +/**
  12 + * @author xia
  13 + */
  14 +@ApiModel("管理后台 - Banner Response VO")
  15 +@Data
  16 +@ToString(callSuper = true)
  17 +public class BannerRespVO extends BannerBaseVO {
  18 +
  19 + @ApiModelProperty(value = "banner编号", required = true)
  20 + @NotNull(message = "banner编号不能为空")
  21 + private Long id;
  22 +
  23 + @ApiModelProperty(value = "创建时间", required = true)
  24 + private Date createTime;
  25 +
  26 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import io.swagger.annotations.ApiModel;
  6 +import io.swagger.annotations.ApiModelProperty;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
  10 +
  11 +import javax.validation.constraints.NotNull;
  12 +
  13 +/**
  14 + * @author xia
  15 + */
  16 +@ApiModel("管理后台 - Banner更新 Request VO")
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +public class BannerUpdateReqVO extends BannerBaseVO {
  21 +
  22 + @ApiModelProperty(value = "banner编号", required = true)
  23 + @NotNull(message = "banner编号不能为空")
  24 + private Long id;
  25 +
  26 +
  27 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/controller/admin/banner/vo/BannerUpdateStatusReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.admin.banner.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * @Copyright: 南京淘点网络科技有限公司
  12 + * @author: wangxia
  13 + */
  14 +@Data
  15 +public class BannerUpdateStatusReqVO {
  16 +
  17 + @ApiModelProperty(value = "banner编号", required = true)
  18 + @NotNull(message = "banner编号不能为空")
  19 + private Long id;
  20 +
  21 + @ApiModelProperty(value = "状态", required = true)
  22 + @NotNull(message = "状态不能为空")
  23 + @InEnum(CommonStatusEnum.class)
  24 + private Integer status;
  25 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/convert/banner/BannerConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.convert.banner;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerCreateReqVO;
  5 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerRespVO;
  6 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerUpdateReqVO;
  7 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerUpdateStatusReqVO;
  8 +import cn.iocoder.yudao.module.market.dal.dataobject.banner.BannerDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * Banner Convert
  16 + *
  17 + * @author xia
  18 + */
  19 +@Mapper
  20 +public interface BannerConvert {
  21 +
  22 + BannerConvert INSTANCE = Mappers.getMapper(BannerConvert.class);
  23 +
  24 +
  25 + List<BannerRespVO> convertList(List<BannerDO> list);
  26 +
  27 + PageResult<BannerRespVO> convertPage(PageResult<BannerDO> pageResult);
  28 +
  29 + BannerRespVO convert(BannerDO banner);
  30 +
  31 + BannerDO convert(BannerCreateReqVO createReqVO);
  32 +
  33 + BannerDO convert(BannerUpdateReqVO updateReqVO);
  34 +
  35 + BannerDO convert(BannerUpdateStatusReqVO updateStatusReqVO);
  36 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/dal/dataobject/banner/BannerDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.dal.dataobject.banner;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.TableName;
  5 +import lombok.*;
  6 +
  7 +/**
  8 + * banner DO
  9 + *
  10 + * @author xia
  11 + */
  12 +@TableName("market_banner")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +@Builder
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +public class BannerDO extends BaseDO {
  20 +
  21 + /**
  22 + * 编号
  23 + */
  24 + private Long id;
  25 + /**
  26 + * 标题
  27 + */
  28 + private String title;
  29 + /**
  30 + * 跳转链接
  31 + */
  32 + private String url;
  33 + /**
  34 + * 图片链接
  35 + */
  36 + private String picUrl;
  37 + /**
  38 + * 排序
  39 + */
  40 + private Integer sort;
  41 +
  42 + /**
  43 + * 状态 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
  44 + */
  45 + private Integer status;
  46 + /**
  47 + * 备注
  48 + */
  49 + private String memo;
  50 +
  51 + // TODO 芋艿 点击次数。&& 其他数据相关
  52 +
  53 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/dal/mysql/banner/BannerMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.dal.mysql.banner;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerPageReqVO;
  7 +import cn.iocoder.yudao.module.market.dal.dataobject.banner.BannerDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * Banner Mapper
  12 + *
  13 + * @author xia
  14 + */
  15 +@Mapper
  16 +public interface BannerMapper extends BaseMapperX<BannerDO> {
  17 +
  18 + default PageResult<BannerDO> selectPage(BannerPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<BannerDO>()
  20 + .likeIfPresent(BannerDO::getTitle, reqVO.getTitle())
  21 + .eqIfPresent(BannerDO::getStatus, reqVO.getStatus())
  22 + .betweenIfPresent(BannerDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  23 + .betweenIfPresent(BannerDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  24 + .orderByDesc(BannerDO::getSort));
  25 + }
  26 +
  27 +}
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/service/banner/BannerService.java
1 1 package cn.iocoder.yudao.module.market.service.banner;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.market.controller.admin.activity.vo.ActivityCreateReqVO;
5   -import cn.iocoder.yudao.module.market.controller.admin.activity.vo.ActivityPageReqVO;
6   -import cn.iocoder.yudao.module.market.controller.admin.activity.vo.ActivityUpdateReqVO;
7   -import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
  4 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerCreateReqVO;
  5 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerPageReqVO;
  6 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerUpdateReqVO;
  7 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerUpdateStatusReqVO;
  8 +import cn.iocoder.yudao.module.market.dal.dataobject.banner.BannerDO;
8 9  
9 10 import javax.validation.Valid;
10 11 import java.util.Collection;
... ... @@ -15,52 +16,53 @@ import java.util.List;
15 16 *
16 17 * @author xia
17 18 */
18   -public interface ActivityService {
  19 +public interface BannerService {
19 20  
20 21 /**
21   - * 创建促销活动
  22 + * 创建Banner
22 23 *
23 24 * @param createReqVO 创建信息
24 25 * @return 编号
25 26 */
26   - Long createActivity(@Valid ActivityCreateReqVO createReqVO);
  27 + Long createBanner(@Valid BannerCreateReqVO createReqVO);
27 28  
28 29 /**
29   - * 更新促销活动
  30 + * 更新Banner
30 31 *
31 32 * @param updateReqVO 更新信息
32 33 */
33   - void updateActivity(@Valid ActivityUpdateReqVO updateReqVO);
  34 + void updateBanner(@Valid BannerUpdateReqVO updateReqVO);
34 35  
35 36 /**
36   - * 删除促销活动
  37 + * 删除Banner
37 38 *
38 39 * @param id 编号
39 40 */
40   - void deleteActivity(Long id);
  41 + void deleteBanner(Long id);
41 42  
42 43 /**
43   - * 获得促销活动
  44 + * 获得Banner
44 45 *
45 46 * @param id 编号
46   - * @return 促销活动
  47 + * @return Banner
47 48 */
48   - ActivityDO getActivity(Long id);
  49 + BannerDO getBanner(Long id);
49 50  
50 51 /**
51   - * 获得促销活动列表
  52 + * 获得Banner列表
52 53 *
53 54 * @param ids 编号
54   - * @return 促销活动列表
  55 + * @return Banner列表
55 56 */
56   - List<ActivityDO> getActivityList(Collection<Long> ids);
  57 + List<BannerDO> getBannerList(Collection<Long> ids);
57 58  
58 59 /**
59   - * 获得促销活动分页
  60 + * 获得Banner分页
60 61 *
61 62 * @param pageReqVO 分页查询
62   - * @return 促销活动分页
  63 + * @return Banner分页
63 64 */
64   - PageResult<ActivityDO> getActivityPage(ActivityPageReqVO pageReqVO);
  65 + PageResult<BannerDO> getBannerPage(BannerPageReqVO pageReqVO);
65 66  
  67 + void updateBannerStatus(BannerUpdateStatusReqVO reqVO);
66 68 }
... ...
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/service/banner/BannerServiceImpl.java
1 1 package cn.iocoder.yudao.module.market.service.banner;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.market.controller.admin.activity.vo.ActivityCreateReqVO;
5   -import cn.iocoder.yudao.module.market.controller.admin.activity.vo.ActivityPageReqVO;
6   -import cn.iocoder.yudao.module.market.controller.admin.activity.vo.ActivityUpdateReqVO;
7   -import cn.iocoder.yudao.module.market.convert.activity.ActivityConvert;
8   -import cn.iocoder.yudao.module.market.dal.dataobject.activity.ActivityDO;
9   -import cn.iocoder.yudao.module.market.dal.mysql.activity.ActivityMapper;
  4 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerCreateReqVO;
  5 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerPageReqVO;
  6 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerUpdateReqVO;
  7 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerUpdateStatusReqVO;
  8 +import cn.iocoder.yudao.module.market.convert.banner.BannerConvert;
  9 +import cn.iocoder.yudao.module.market.dal.dataobject.banner.BannerDO;
  10 +import cn.iocoder.yudao.module.market.dal.mysql.banner.BannerMapper;
10 11 import org.springframework.stereotype.Service;
11 12 import org.springframework.validation.annotation.Validated;
12 13  
... ... @@ -15,7 +16,7 @@ import java.util.Collection;
15 16 import java.util.List;
16 17  
17 18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
18   -import static cn.iocoder.yudao.module.market.enums.ErrorCodeConstants.ACTIVITY_NOT_EXISTS;
  19 +import static cn.iocoder.yudao.module.market.enums.ErrorCodeConstants.*;
19 20  
20 21 /**
21 22 * 首页banner 实现类
... ... @@ -24,56 +25,65 @@ import static cn.iocoder.yudao.module.market.enums.ErrorCodeConstants.ACTIVITY_N
24 25 */
25 26 @Service
26 27 @Validated
27   -public class ActivityServiceImpl implements ActivityService {
  28 +public class BannerServiceImpl implements BannerService {
28 29  
29 30 @Resource
30   - private ActivityMapper activityMapper;
  31 + private BannerMapper bannerMapper;
31 32  
32 33 @Override
33   - public Long createActivity(ActivityCreateReqVO createReqVO) {
  34 + public Long createBanner(BannerCreateReqVO createReqVO) {
34 35 // 插入
35   - ActivityDO activity = ActivityConvert.INSTANCE.convert(createReqVO);
36   - activityMapper.insert(activity);
  36 + BannerDO banner = BannerConvert.INSTANCE.convert(createReqVO);
  37 + bannerMapper.insert(banner);
37 38 // 返回
38   - return activity.getId();
  39 + return banner.getId();
39 40 }
40 41  
41 42 @Override
42   - public void updateActivity(ActivityUpdateReqVO updateReqVO) {
  43 + public void updateBanner(BannerUpdateReqVO updateReqVO) {
43 44 // 校验存在
44   - this.validateActivityExists(updateReqVO.getId());
  45 + this.validateBannerExists(updateReqVO.getId());
45 46 // 更新
46   - ActivityDO updateObj = ActivityConvert.INSTANCE.convert(updateReqVO);
47   - activityMapper.updateById(updateObj);
  47 + BannerDO updateObj = BannerConvert.INSTANCE.convert(updateReqVO);
  48 + bannerMapper.updateById(updateObj);
48 49 }
49 50  
50 51 @Override
51   - public void deleteActivity(Long id) {
  52 + public void deleteBanner(Long id) {
52 53 // 校验存在
53   - this.validateActivityExists(id);
  54 + this.validateBannerExists(id);
54 55 // 删除
55   - activityMapper.deleteById(id);
  56 + bannerMapper.deleteById(id);
56 57 }
57 58  
58   - private void validateActivityExists(Long id) {
59   - if (activityMapper.selectById(id) == null) {
60   - throw exception(ACTIVITY_NOT_EXISTS);
  59 + private void validateBannerExists(Long id) {
  60 + if (bannerMapper.selectById(id) == null) {
  61 + throw exception(BANNER_NOT_EXISTS);
61 62 }
62 63 }
63 64  
64 65 @Override
65   - public ActivityDO getActivity(Long id) {
66   - return activityMapper.selectById(id);
  66 + public BannerDO getBanner(Long id) {
  67 + return bannerMapper.selectById(id);
67 68 }
68 69  
69 70 @Override
70   - public List<ActivityDO> getActivityList(Collection<Long> ids) {
71   - return activityMapper.selectBatchIds(ids);
  71 + public List<BannerDO> getBannerList(Collection<Long> ids) {
  72 + return bannerMapper.selectBatchIds(ids);
72 73 }
73 74  
74 75 @Override
75   - public PageResult<ActivityDO> getActivityPage(ActivityPageReqVO pageReqVO) {
76   - return activityMapper.selectPage(pageReqVO);
  76 + public PageResult<BannerDO> getBannerPage(BannerPageReqVO pageReqVO) {
  77 + return bannerMapper.selectPage(pageReqVO);
  78 + }
  79 +
  80 + @Override
  81 + public void updateBannerStatus(BannerUpdateStatusReqVO updateStatusReqVO) {
  82 + // 校验是否可以更新
  83 + this.validateBannerExists(updateStatusReqVO.getId());
  84 + // 更新状态
  85 + BannerDO updateObj = BannerConvert.INSTANCE.convert(updateStatusReqVO);
  86 + bannerMapper.updateById(updateObj);
77 87 }
78 88  
79 89 }
... ...
yudao-ui-admin/src/api/mall/market/banner.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 创建Banner
  4 +export function createBanner(data) {
  5 + return request({
  6 + url: '/market/banner/create',
  7 + method: 'post',
  8 + data: data
  9 + })
  10 +}
  11 +
  12 +// 更新Banner
  13 +export function updateBanner(data) {
  14 + return request({
  15 + url: '/market/banner/update',
  16 + method: 'put',
  17 + data: data
  18 + })
  19 +}
  20 +
  21 +// 删除Banner
  22 +export function deleteBanner(id) {
  23 + return request({
  24 + url: '/market/banner/delete?id=' + id,
  25 + method: 'delete'
  26 + })
  27 +}
  28 +
  29 +// 获得Banner
  30 +export function getBanner(id) {
  31 + return request({
  32 + url: '/market/banner/get?id=' + id,
  33 + method: 'get'
  34 + })
  35 +}
  36 +
  37 +// 获得Banner分页
  38 +export function getBannerPage(query) {
  39 + return request({
  40 + url: '/market/banner/page',
  41 + method: 'get',
  42 + params: query
  43 + })
  44 +}
  45 +
  46 +// 导出Banner Excel
  47 +export function exportBannerExcel(query) {
  48 + return request({
  49 + url: '/market/banner/export-excel',
  50 + method: 'get',
  51 + params: query,
  52 + responseType: 'blob'
  53 + })
  54 +}
... ...
yudao-ui-admin/src/views/mall/market/banner/index.vue 0 → 100644
  1 +<template>
  2 + <div class="app-container">
  3 +
  4 + <!-- 搜索工作栏 -->
  5 + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  6 + <el-form-item label="标题" prop="title">
  7 + <el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter.native="handleQuery"/>
  8 + </el-form-item>
  9 + <el-form-item label="状态" prop="status">
  10 + <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
  11 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
  12 + :key="dict.value" :label="dict.label" :value="dict.value"/>
  13 + </el-select>
  14 + </el-form-item>
  15 + <el-form-item label="创建时间">
  16 + <el-date-picker v-model="dateRangeCreateTime" style="width: 240px" value-format="yyyy-MM-dd"
  17 + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"/>
  18 + </el-form-item>
  19 + <el-form-item>
  20 + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
  21 + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
  22 + </el-form-item>
  23 + </el-form>
  24 +
  25 + <!-- 操作工具栏 -->
  26 + <el-row :gutter="10" class="mb8">
  27 + <el-col :span="1.5">
  28 + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
  29 + v-hasPermi="['market:banner:create']">新增
  30 + </el-button>
  31 + </el-col>
  32 +<!-- <el-col :span="1.5">-->
  33 +<!-- <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"-->
  34 +<!-- :loading="exportLoading"-->
  35 +<!-- v-hasPermi="['market:banner:export']">导出-->
  36 +<!-- </el-button>-->
  37 +<!-- </el-col>-->
  38 + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  39 + </el-row>
  40 +
  41 + <!-- 列表 -->
  42 + <el-table v-loading="loading" :data="list">
  43 + <el-table-column label="标题" align="center" prop="title"/>
  44 +
  45 + <el-table-column label="缩略图" align="center" prop="picUrl">
  46 + <template slot-scope="scope">
  47 + <img v-if="scope.row.picUrl" :src="scope.row.picUrl" alt="缩略图片" class="img-height"/>
  48 + </template>
  49 + </el-table-column>
  50 + <el-table-column label="跳转链接" align="center" prop="url"/>
  51 + <el-table-column label="排序" align="center" prop="sort"/>
  52 + <el-table-column label="描述" align="center" prop="memo"/>
  53 + <el-table-column label="状态" align="center" prop="status">
  54 + <template slot-scope="scope">
  55 + <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
  56 + </template>
  57 + </el-table-column>
  58 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  59 + <template slot-scope="scope">
  60 + <span>{{ parseTime(scope.row.createTime) }}</span>
  61 + </template>
  62 + </el-table-column>
  63 + <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  64 + <template slot-scope="scope">
  65 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  66 + v-hasPermi="['market:banner:update']">修改
  67 + </el-button>
  68 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  69 + v-hasPermi="['market:banner:delete']">删除
  70 + </el-button>
  71 + </template>
  72 + </el-table-column>
  73 + </el-table>
  74 + <!-- 分页组件 -->
  75 + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  76 + @pagination="getList"/>
  77 +
  78 + <!-- 对话框(添加 / 修改) -->
  79 + <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  80 + <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  81 + <el-form-item label="标题" prop="title">
  82 + <el-input v-model="form.title" placeholder="请输入标题"/>
  83 + </el-form-item>
  84 + <el-form-item label="缩略图" prop="picUrl">
  85 + <imageUpload v-model="form.picUrl" :limit="1"/>
  86 + </el-form-item>
  87 + <el-form-item label="跳转链接" prop="url">
  88 + <el-input v-model="form.url" placeholder="请输入跳转链接"/>
  89 + </el-form-item>
  90 + <el-form-item label="排序" prop="sort">
  91 + <el-input v-model="form.sort" placeholder="请输入排序"/>
  92 + </el-form-item>
  93 + <el-form-item label="描述" prop="memo">
  94 + <el-input v-model="form.memo" type="textarea" placeholder="请输入描述"/>
  95 + </el-form-item>
  96 + <el-form-item label="状态" prop="status">
  97 + <el-radio-group v-model="form.status">
  98 + <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
  99 + :key="dict.value" :label="parseInt(dict.value)">{{ dict.label }}
  100 + </el-radio>
  101 + </el-radio-group>
  102 + </el-form-item>
  103 + </el-form>
  104 + <div slot="footer" class="dialog-footer">
  105 + <el-button type="primary" @click="submitForm">确 定</el-button>
  106 + <el-button @click="cancel">取 消</el-button>
  107 + </div>
  108 + </el-dialog>
  109 + </div>
  110 +</template>
  111 +
  112 +<script>
  113 +import {
  114 + createBanner,
  115 + deleteBanner,
  116 + exportBannerExcel,
  117 + getBanner,
  118 + getBannerPage,
  119 + updateBanner
  120 +} from "@/api/mall/market/banner";
  121 +import ImageUpload from '@/components/ImageUpload';
  122 +
  123 +export default {
  124 + name: "Banner",
  125 + components: {
  126 + ImageUpload
  127 + },
  128 + data() {
  129 + return {
  130 + // 遮罩层
  131 + loading: true,
  132 + // 导出遮罩层
  133 + exportLoading: false,
  134 + // 显示搜索条件
  135 + showSearch: true,
  136 + // 总条数
  137 + total: 0,
  138 + // 品牌列表
  139 + list: [],
  140 + // 弹出层标题
  141 + title: "",
  142 + // 是否显示弹出层
  143 + open: false,
  144 + dateRangeCreateTime: [],
  145 + // 查询参数
  146 + queryParams: {
  147 + pageNo: 1,
  148 + pageSize: 10,
  149 + title: null,
  150 + status: null,
  151 + },
  152 + // 商品分类树选项
  153 + categoryOptions: [],
  154 + // 表单参数
  155 + form: {},
  156 + // 表单校验
  157 + rules: {
  158 + title: [{required: true, message: "标题不能不空", trigger: "blur"}],
  159 + picUrl: [{required: true, message: "图片地址不能为空", trigger: "blur"}],
  160 + url: [{required: true, message: "跳转地址不能为空", trigger: "blur"}],
  161 + sort: [{required: true, message: "排序不能为空", trigger: "blur"}],
  162 + status: [{required: true, message: "状态不能为空", trigger: "change"}],
  163 + }
  164 + };
  165 + },
  166 + created() {
  167 + this.getList();
  168 + },
  169 + methods: {
  170 + /** 查询列表 */
  171 + getList() {
  172 + this.loading = true;
  173 + // 处理查询参数
  174 + let params = {...this.queryParams};
  175 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
  176 + // 执行查询
  177 + getBannerPage(params).then(response => {
  178 + this.list = response.data.list;
  179 + this.total = response.data.total;
  180 + this.loading = false;
  181 + });
  182 + },
  183 + /** 取消按钮 */
  184 + cancel() {
  185 + this.open = false;
  186 + this.reset();
  187 + },
  188 + /** 表单重置 */
  189 + reset() {
  190 + this.form = {
  191 + id: undefined,
  192 + title: undefined,
  193 + link: undefined,
  194 + imgUrl: undefined,
  195 + sort: undefined,
  196 + memo: undefined,
  197 + status: undefined,
  198 + };
  199 + this.resetForm("form");
  200 + },
  201 + /** 搜索按钮操作 */
  202 + handleQuery() {
  203 + this.queryParams.pageNo = 1;
  204 + this.getList();
  205 + },
  206 + /** 重置按钮操作 */
  207 + resetQuery() {
  208 + this.dateRangeCreateTime = [];
  209 + this.resetForm("queryForm");
  210 + this.handleQuery();
  211 + },
  212 + /** 新增按钮操作 */
  213 + handleAdd() {
  214 + this.reset();
  215 + this.open = true;
  216 + this.title = "添加Banner";
  217 + },
  218 + /** 修改按钮操作 */
  219 + handleUpdate(row) {
  220 + this.reset();
  221 + const id = row.id;
  222 + getBanner(id).then(response => {
  223 + this.form = response.data;
  224 + this.open = true;
  225 + this.title = "修改Banner";
  226 + });
  227 + },
  228 + /** 提交按钮 */
  229 + submitForm() {
  230 + this.$refs["form"].validate(valid => {
  231 + if (!valid) {
  232 + return;
  233 + }
  234 + // 修改的提交
  235 + if (this.form.id != null) {
  236 + updateBanner(this.form).then(response => {
  237 + this.$modal.msgSuccess("修改成功");
  238 + this.open = false;
  239 + this.getList();
  240 + });
  241 + return;
  242 + }
  243 + // 添加的提交
  244 + createBanner(this.form).then(response => {
  245 + this.$modal.msgSuccess("新增成功");
  246 + this.open = false;
  247 + this.getList();
  248 + });
  249 + });
  250 + },
  251 + /** 删除按钮操作 */
  252 + handleDelete(row) {
  253 + const id = row.id;
  254 + this.$modal.confirm('是否确认删除Banner编号为"' + id + '"的数据项?').then(function () {
  255 + return deleteBanner(id);
  256 + }).then(() => {
  257 + this.getList();
  258 + this.$modal.msgSuccess("删除成功");
  259 + }).catch(() => {
  260 + });
  261 + },
  262 + /** 导出按钮操作 */
  263 + handleExport() {
  264 + // 处理查询参数
  265 + let params = {...this.queryParams};
  266 + params.pageNo = undefined;
  267 + params.pageSize = undefined;
  268 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
  269 + // 执行导出
  270 + this.$modal.confirm('是否确认导出所有Banner数据项?').then(() => {
  271 + this.exportLoading = true;
  272 + return exportBannerExcel(params);
  273 + }).then(response => {
  274 + this.$download.excel(response, "Banner.xls");
  275 + this.exportLoading = false;
  276 + }).catch(() => {
  277 + });
  278 + }
  279 + }
  280 +};
  281 +</script>
  282 +
  283 +<style scoped lang="scss">
  284 +//
  285 +.img-height {
  286 + height: 150px;
  287 +}
  288 +</style>
... ...