Commit b368a54b36e0c92469e33f9c53e04d79b159844d

Authored by franky
2 parents eb5bdda3 bb0edc2a

Merge remote-tracking branch 'origin/feature/1.8.0-uniapp' into feature/1.8.0-uniapp

Showing 19 changed files with 1000 additions and 1 deletions
sql/mall.sql
@@ -253,3 +253,35 @@ create table product_sku @@ -253,3 +253,35 @@ create table product_sku
253 collate utf8mb4_general_ci; 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 package cn.iocoder.yudao.framework.common.enums; 1 package cn.iocoder.yudao.framework.common.enums;
2 2
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
3 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
4 import lombok.Getter; 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,11 +13,14 @@ import lombok.Getter;
10 */ 13 */
11 @Getter 14 @Getter
12 @AllArgsConstructor 15 @AllArgsConstructor
13 -public enum CommonStatusEnum { 16 +public enum CommonStatusEnum implements IntArrayValuable {
14 17
15 ENABLE(0, "开启"), 18 ENABLE(0, "开启"),
16 DISABLE(1, "关闭"); 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,4 +30,9 @@ public enum CommonStatusEnum {
24 */ 30 */
25 private final String name; 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,4 +12,7 @@ public interface ErrorCodeConstants {
12 12
13 // ========== 促销活动相关 1003001000============ 13 // ========== 促销活动相关 1003001000============
14 ErrorCode ACTIVITY_NOT_EXISTS = new ErrorCode(1003001000, "促销活动不存在"); 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,6 +5,9 @@ import java.util.*;
5 import io.swagger.annotations.*; 5 import io.swagger.annotations.*;
6 import javax.validation.constraints.*; 6 import javax.validation.constraints.*;
7 7
  8 +/**
  9 + * @author xia
  10 + */
8 @ApiModel("管理后台 - 促销活动创建 Request VO") 11 @ApiModel("管理后台 - 促销活动创建 Request VO")
9 @Data 12 @Data
10 @EqualsAndHashCode(callSuper = true) 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/controller/app/banner/AppBannerController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.controller.app.banner;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.module.market.controller.admin.banner.vo.BannerRespVO;
  5 +import cn.iocoder.yudao.module.market.convert.banner.BannerConvert;
  6 +import cn.iocoder.yudao.module.market.dal.dataobject.banner.BannerDO;
  7 +import cn.iocoder.yudao.module.market.service.banner.BannerService;
  8 +import io.swagger.annotations.Api;
  9 +import io.swagger.annotations.ApiOperation;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.security.access.prepost.PreAuthorize;
  12 +import org.springframework.validation.annotation.Validated;
  13 +import org.springframework.web.bind.annotation.GetMapping;
  14 +import org.springframework.web.bind.annotation.RequestMapping;
  15 +import org.springframework.web.bind.annotation.RestController;
  16 +
  17 +import java.util.List;
  18 +
  19 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  20 +
  21 +/**
  22 + * @author: XIA
  23 + */
  24 +@RestController
  25 +@RequestMapping("/market/banner")
  26 +@Api(tags = "用户APP- 首页Banner")
  27 +@Validated
  28 +public class AppBannerController {
  29 +
  30 + @Autowired
  31 + private BannerService bannerService;
  32 +
  33 + @GetMapping("/list")
  34 + @ApiOperation("获得banner列表")
  35 + @PreAuthorize("@ss.hasPermission('market:banner:query')")
  36 + public CommonResult<List<BannerRespVO>> getBannerList() {
  37 + List<BannerDO> list = bannerService.getBannerList();
  38 + return success(BannerConvert.INSTANCE.convertList(list));
  39 + }
  40 +
  41 +}
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 0 → 100644
  1 +package cn.iocoder.yudao.module.market.service.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.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;
  9 +
  10 +import javax.validation.Valid;
  11 +import java.util.Collection;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 首页Banner Service 接口
  16 + *
  17 + * @author xia
  18 + */
  19 +public interface BannerService {
  20 +
  21 + /**
  22 + * 创建Banner
  23 + *
  24 + * @param createReqVO 创建信息
  25 + * @return 编号
  26 + */
  27 + Long createBanner(@Valid BannerCreateReqVO createReqVO);
  28 +
  29 + /**
  30 + * 更新Banner
  31 + *
  32 + * @param updateReqVO 更新信息
  33 + */
  34 + void updateBanner(@Valid BannerUpdateReqVO updateReqVO);
  35 +
  36 + /**
  37 + * 删除Banner
  38 + *
  39 + * @param id 编号
  40 + */
  41 + void deleteBanner(Long id);
  42 +
  43 + /**
  44 + * 获得Banner
  45 + *
  46 + * @param id 编号
  47 + * @return Banner
  48 + */
  49 + BannerDO getBanner(Long id);
  50 +
  51 + /**
  52 + * 获得Banner列表
  53 + *
  54 + * @param ids 编号
  55 + * @return Banner列表
  56 + */
  57 + List<BannerDO> getBannerList(Collection<Long> ids);
  58 +
  59 + /**
  60 + * 获得所有Banner列表
  61 + * @return Banner列表
  62 + */
  63 + List<BannerDO> getBannerList();
  64 +
  65 + /**
  66 + * 获得Banner分页
  67 + *
  68 + * @param pageReqVO 分页查询
  69 + * @return Banner分页
  70 + */
  71 + PageResult<BannerDO> getBannerPage(BannerPageReqVO pageReqVO);
  72 +
  73 + void updateBannerStatus(BannerUpdateStatusReqVO reqVO);
  74 +}
yudao-module-mall/yudao-module-market-biz/src/main/java/cn/iocoder/yudao/module/market/service/banner/BannerServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.market.service.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.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;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.validation.annotation.Validated;
  13 +
  14 +import javax.annotation.Resource;
  15 +import java.util.Collection;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.market.enums.ErrorCodeConstants.*;
  20 +
  21 +/**
  22 + * 首页banner 实现类
  23 + *
  24 + * @author xia
  25 + */
  26 +@Service
  27 +@Validated
  28 +public class BannerServiceImpl implements BannerService {
  29 +
  30 + @Resource
  31 + private BannerMapper bannerMapper;
  32 +
  33 + @Override
  34 + public Long createBanner(BannerCreateReqVO createReqVO) {
  35 + // 插入
  36 + BannerDO banner = BannerConvert.INSTANCE.convert(createReqVO);
  37 + bannerMapper.insert(banner);
  38 + // 返回
  39 + return banner.getId();
  40 + }
  41 +
  42 + @Override
  43 + public void updateBanner(BannerUpdateReqVO updateReqVO) {
  44 + // 校验存在
  45 + this.validateBannerExists(updateReqVO.getId());
  46 + // 更新
  47 + BannerDO updateObj = BannerConvert.INSTANCE.convert(updateReqVO);
  48 + bannerMapper.updateById(updateObj);
  49 + }
  50 +
  51 + @Override
  52 + public void deleteBanner(Long id) {
  53 + // 校验存在
  54 + this.validateBannerExists(id);
  55 + // 删除
  56 + bannerMapper.deleteById(id);
  57 + }
  58 +
  59 + private void validateBannerExists(Long id) {
  60 + if (bannerMapper.selectById(id) == null) {
  61 + throw exception(BANNER_NOT_EXISTS);
  62 + }
  63 + }
  64 +
  65 + @Override
  66 + public BannerDO getBanner(Long id) {
  67 + return bannerMapper.selectById(id);
  68 + }
  69 +
  70 + @Override
  71 + public List<BannerDO> getBannerList(Collection<Long> ids) {
  72 + return bannerMapper.selectBatchIds(ids);
  73 + }
  74 +
  75 + @Override
  76 + public List<BannerDO> getBannerList() {
  77 + return bannerMapper.selectList();
  78 + }
  79 +
  80 + @Override
  81 + public PageResult<BannerDO> getBannerPage(BannerPageReqVO pageReqVO) {
  82 + return bannerMapper.selectPage(pageReqVO);
  83 + }
  84 +
  85 + @Override
  86 + public void updateBannerStatus(BannerUpdateStatusReqVO updateStatusReqVO) {
  87 + // 校验是否可以更新
  88 + this.validateBannerExists(updateStatusReqVO.getId());
  89 + // 更新状态
  90 + BannerDO updateObj = BannerConvert.INSTANCE.convert(updateStatusReqVO);
  91 + bannerMapper.updateById(updateObj);
  92 + }
  93 +
  94 +}
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>