From 78470e42799e2174872f2adf6b953881f0db3672 Mon Sep 17 00:00:00 2001
From: jieyuu <645634619@qq.com>
Date: Sat, 27 Jul 2024 16:24:19 +0800
Subject: [PATCH] =?UTF-8?q?=E9=A2=86=E5=88=B8=E5=9F=BA=E6=9C=AC=E5=BC=80?=
=?UTF-8?q?=E5=8F=91=E5=AE=8C=E6=88=90--=E9=81=97=E7=95=99=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../jieyuu/config/MybatisPlusPageConfig.java | 29 ++++
.../net/jieyuu/enums/CouponCategoryEnum.java | 17 ++
.../net/jieyuu/enums/CouponPublishEnum.java | 17 ++
.../net/jieyuu/enums/CouponStateEnum.java | 19 ++
.../main/java/net/jieyuu/model/LoginUser.java | 5 +
.../main/java/net/jieyuu/utils/JWTUtil.java | 18 +-
xdclass-coupon-service/pom.xml | 8 +
.../java/net/jieyuu/CouponApplication.java | 13 ++
.../net/jieyuu/config/InterceptorConfig.java | 25 +++
.../jieyuu/controller/CouponController.java | 54 ++++++
.../controller/CouponRecordController.java | 21 +++
.../java/net/jieyuu/mapper/CouponMapper.java | 22 +++
.../net/jieyuu/mapper/CouponRecordMapper.java | 16 ++
.../main/java/net/jieyuu/model/CouponDO.java | 91 ++++++++++
.../java/net/jieyuu/model/CouponRecordDO.java | 86 +++++++++
.../net/jieyuu/service/CouponService.java | 34 ++++
.../service/impl/CouponServiceImpl.java | 164 ++++++++++++++++++
.../src/main/java/net/jieyuu/vo/CouponVO.java | 78 +++++++++
.../src/main/resources/application.yml | 29 ++++
.../main/resources/mapper/CouponMapper.xml | 27 +++
.../resources/mapper/CouponRecordMapper.xml | 26 +++
.../net/jieyuu/db/MyBatisPlusGenerator.java | 94 ++++++++++
22 files changed, 882 insertions(+), 11 deletions(-)
create mode 100644 xdclass-common/src/main/java/net/jieyuu/config/MybatisPlusPageConfig.java
create mode 100644 xdclass-common/src/main/java/net/jieyuu/enums/CouponCategoryEnum.java
create mode 100644 xdclass-common/src/main/java/net/jieyuu/enums/CouponPublishEnum.java
create mode 100644 xdclass-common/src/main/java/net/jieyuu/enums/CouponStateEnum.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/CouponApplication.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/config/InterceptorConfig.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponController.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponMapper.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponDO.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponRecordDO.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponService.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponServiceImpl.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/vo/CouponVO.java
create mode 100644 xdclass-coupon-service/src/main/resources/application.yml
create mode 100644 xdclass-coupon-service/src/main/resources/mapper/CouponMapper.xml
create mode 100644 xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml
create mode 100644 xdclass-coupon-service/src/test/java/net/jieyuu/db/MyBatisPlusGenerator.java
diff --git a/xdclass-common/src/main/java/net/jieyuu/config/MybatisPlusPageConfig.java b/xdclass-common/src/main/java/net/jieyuu/config/MybatisPlusPageConfig.java
new file mode 100644
index 0000000..e31c2d3
--- /dev/null
+++ b/xdclass-common/src/main/java/net/jieyuu/config/MybatisPlusPageConfig.java
@@ -0,0 +1,29 @@
+package net.jieyuu.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusPageConfig {
+
+ /* 旧版本配置
+ @Bean
+ public PaginationInterceptor paginationInterceptor(){
+ return new PaginationInterceptor();
+ }*/
+
+ /**
+ * 新的分页插件,一缓和二缓遵循mybatis的规则,
+ * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
+ */
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+ return interceptor;
+ }
+
+}
\ No newline at end of file
diff --git a/xdclass-common/src/main/java/net/jieyuu/enums/CouponCategoryEnum.java b/xdclass-common/src/main/java/net/jieyuu/enums/CouponCategoryEnum.java
new file mode 100644
index 0000000..057ecef
--- /dev/null
+++ b/xdclass-common/src/main/java/net/jieyuu/enums/CouponCategoryEnum.java
@@ -0,0 +1,17 @@
+package net.jieyuu.enums;
+
+public enum CouponCategoryEnum {
+
+ /**
+ * 新人注册
+ */
+ NEW_USER,
+ /**
+ * 活动任务
+ */
+ TASK,
+ /**
+ * 促销
+ */
+ PROMOTION
+}
diff --git a/xdclass-common/src/main/java/net/jieyuu/enums/CouponPublishEnum.java b/xdclass-common/src/main/java/net/jieyuu/enums/CouponPublishEnum.java
new file mode 100644
index 0000000..6fd7910
--- /dev/null
+++ b/xdclass-common/src/main/java/net/jieyuu/enums/CouponPublishEnum.java
@@ -0,0 +1,17 @@
+package net.jieyuu.enums;
+
+public enum CouponPublishEnum {
+ /**
+ * 线上
+ */
+ PUBLISH,
+
+ /**
+ * 草稿
+ */
+ DRAFT,
+ /**
+ * 下线
+ */
+ OFFLINE
+}
diff --git a/xdclass-common/src/main/java/net/jieyuu/enums/CouponStateEnum.java b/xdclass-common/src/main/java/net/jieyuu/enums/CouponStateEnum.java
new file mode 100644
index 0000000..85956e2
--- /dev/null
+++ b/xdclass-common/src/main/java/net/jieyuu/enums/CouponStateEnum.java
@@ -0,0 +1,19 @@
+package net.jieyuu.enums;
+
+public enum CouponStateEnum {
+
+ /**
+ * 未使用
+ */
+ NEW ,
+ /**
+ * 已经使用
+ */
+ USED,
+
+ /**
+ * 过期
+ */
+ EXPIRED;
+
+}
diff --git a/xdclass-common/src/main/java/net/jieyuu/model/LoginUser.java b/xdclass-common/src/main/java/net/jieyuu/model/LoginUser.java
index 4736f8b..6ad4797 100644
--- a/xdclass-common/src/main/java/net/jieyuu/model/LoginUser.java
+++ b/xdclass-common/src/main/java/net/jieyuu/model/LoginUser.java
@@ -2,10 +2,15 @@ package net.jieyuu.model;
import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
+
@Data
+@AllArgsConstructor
+@NoArgsConstructor
@Builder
public class LoginUser {
/**
diff --git a/xdclass-common/src/main/java/net/jieyuu/utils/JWTUtil.java b/xdclass-common/src/main/java/net/jieyuu/utils/JWTUtil.java
index 149eb13..ab74b55 100644
--- a/xdclass-common/src/main/java/net/jieyuu/utils/JWTUtil.java
+++ b/xdclass-common/src/main/java/net/jieyuu/utils/JWTUtil.java
@@ -35,20 +35,16 @@ public class JWTUtil {
/**
* 根据用户信息,生成令牌
*
- * @param loginUser
+ * @param user
* @return
*/
- public static String geneJsonWebToken(LoginUser loginUser) {
- if (loginUser == null) {
- throw new NullPointerException("loginUser对象为空");
- }
- long userid = loginUser.getId();
-
+ public static String geneJsonWebToken(LoginUser user) {
+ Long userId = user.getId();
String token = Jwts.builder().setSubject(SUBJECT)
- .claim("head_img", loginUser.getHeadImg())
- .claim("id", userid)
- .claim("name", loginUser.getName())
- .claim("mail", loginUser.getMail())
+ .claim("head_img", user.getHeadImg())
+ .claim("id", userId)
+ .claim("name", user.getName())
+ .claim("mail", user.getMail())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.signWith(SignatureAlgorithm.HS256, SECRET).compact();
diff --git a/xdclass-coupon-service/pom.xml b/xdclass-coupon-service/pom.xml
index c5fc622..b9f7bfc 100644
--- a/xdclass-coupon-service/pom.xml
+++ b/xdclass-coupon-service/pom.xml
@@ -11,6 +11,14 @@
xdclass-coupon-service
+
+
+ net.jieyuu
+ xdclass-common
+ 1.0-SNAPSHOT
+
+
+
8
8
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/CouponApplication.java b/xdclass-coupon-service/src/main/java/net/jieyuu/CouponApplication.java
new file mode 100644
index 0000000..d048e3d
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/CouponApplication.java
@@ -0,0 +1,13 @@
+package net.jieyuu;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("net.jieyuu.mapper")
+public class CouponApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(CouponApplication.class, args);
+ }
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/config/InterceptorConfig.java b/xdclass-coupon-service/src/main/java/net/jieyuu/config/InterceptorConfig.java
new file mode 100644
index 0000000..325e5dd
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/config/InterceptorConfig.java
@@ -0,0 +1,25 @@
+package net.jieyuu.config;
+
+
+import lombok.extern.slf4j.Slf4j;
+import net.jieyuu.interceptor.LoginInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@Slf4j
+public class InterceptorConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry
+ .addInterceptor(new LoginInterceptor())
+ //拦截的路径
+ .addPathPatterns("/api/coupon/*/**","/api/coupon_record/v1/*/**")
+ //放行的路径
+ .excludePathPatterns("/api/coupon/*/page_coupon");
+
+ WebMvcConfigurer.super.addInterceptors(registry);
+ }
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponController.java b/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponController.java
new file mode 100644
index 0000000..3c58a57
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponController.java
@@ -0,0 +1,54 @@
+package net.jieyuu.controller;
+
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import net.jieyuu.enums.CouponCategoryEnum;
+import net.jieyuu.service.CouponService;
+import net.jieyuu.utils.JsonData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+@RestController
+@RequestMapping("/api/coupon/v1")
+public class CouponController {
+
+ @Autowired
+ private CouponService couponService;
+
+ @ApiOperation("分页查询优惠券")
+ @GetMapping("page_coupon")
+ public JsonData pageCouponList(
+ @ApiParam("当前页")
+ @RequestParam(name = "page", defaultValue = "1") int page,
+ @ApiParam("显示多少条")
+ @RequestParam(name = "size", defaultValue = "10") int size) {
+ Map stringObjectMap = couponService.pageCouponActivity(page, size);
+ return JsonData.buildSuccess(stringObjectMap);
+
+ }
+
+
+
+ @ApiOperation("领取优惠券")
+ @GetMapping("add/promotion/{coupon_id}")
+ public JsonData addPromotionCoupon(
+ @ApiParam(value = "优惠券id",required = true)
+ @PathVariable("coupon_id")long couponId) {
+
+ JsonData jsonData = couponService.addCoupon(couponId, CouponCategoryEnum.PROMOTION);
+ return jsonData;
+ }
+
+}
+
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java b/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java
new file mode 100644
index 0000000..db12e9f
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java
@@ -0,0 +1,21 @@
+package net.jieyuu.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+@RestController
+@RequestMapping("/couponRecordDO")
+public class CouponRecordController {
+
+}
+
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponMapper.java b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponMapper.java
new file mode 100644
index 0000000..f6f0761
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponMapper.java
@@ -0,0 +1,22 @@
+package net.jieyuu.mapper;
+
+import net.jieyuu.model.CouponDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+public interface CouponMapper extends BaseMapper {
+
+ /**
+ * 扣减库存
+ * @param couponId
+ * @return
+ */
+ int reduceStock(long couponId);
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java
new file mode 100644
index 0000000..80258fc
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java
@@ -0,0 +1,16 @@
+package net.jieyuu.mapper;
+
+import net.jieyuu.model.CouponRecordDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+public interface CouponRecordMapper extends BaseMapper {
+
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponDO.java b/xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponDO.java
new file mode 100644
index 0000000..c67fb5b
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponDO.java
@@ -0,0 +1,91 @@
+package net.jieyuu.model;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ *
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("coupon")
+public class CouponDO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 优惠卷类型[NEW_USER注册赠券,TASK任务卷,PROMOTION促销劵]
+ */
+ private String category;
+
+ /**
+ * 发布状态, PUBLISH发布,DRAFT草稿,OFFLINE下线
+ */
+ private String publish;
+
+ /**
+ * 优惠券图片
+ */
+ private String couponImg;
+
+ /**
+ * 优惠券标题
+ */
+ private String couponTitle;
+
+ /**
+ * 抵扣价格
+ */
+ private BigDecimal price;
+
+ /**
+ * 每人限制张数
+ */
+ private Integer userLimit;
+
+ /**
+ * 优惠券开始有效时间
+ */
+ private Date startTime;
+
+ /**
+ * 优惠券失效时间
+ */
+ private Date endTime;
+
+ /**
+ * 优惠券总量
+ */
+ private Integer publishCount;
+
+ /**
+ * 库存
+ */
+ private Integer stock;
+
+ private Date createTime;
+
+ /**
+ * 满多少才可以使用
+ */
+ private BigDecimal conditionPrice;
+
+
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponRecordDO.java b/xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponRecordDO.java
new file mode 100644
index 0000000..6d07132
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/model/CouponRecordDO.java
@@ -0,0 +1,86 @@
+package net.jieyuu.model;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ *
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("coupon_record")
+public class CouponRecordDO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 优惠券id
+ */
+ private Long couponId;
+
+ /**
+ * 创建时间获得时间
+ */
+ private Date createTime;
+
+ /**
+ * 使用状态 可用 NEW,已使用USED,过期 EXPIRED;
+ */
+ private String useState;
+
+ /**
+ * 用户id
+ */
+ private Long userId;
+
+ /**
+ * 用户昵称
+ */
+ private String userName;
+
+ /**
+ * 优惠券标题
+ */
+ private String couponTitle;
+
+ /**
+ * 开始时间
+ */
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ private Date endTime;
+
+ /**
+ * 订单id
+ */
+ private Long orderId;
+
+ /**
+ * 抵扣价格
+ */
+ private BigDecimal price;
+
+ /**
+ * 满多少才可以使用
+ */
+ private BigDecimal conditionPrice;
+
+
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponService.java b/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponService.java
new file mode 100644
index 0000000..3a0ac07
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponService.java
@@ -0,0 +1,34 @@
+package net.jieyuu.service;
+
+
+import net.jieyuu.enums.CouponCategoryEnum;
+import net.jieyuu.utils.JsonData;
+
+import java.util.Map;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+public interface CouponService {
+ /**
+ * 分页查询优惠券
+ * @param page
+ * @param size
+ * @return
+ */
+ Map pageCouponActivity(int page, int size);
+
+
+ /**
+ * 领取优惠券
+ * @param couponId
+ * @param couponCategoryEnum
+ * @return
+ */
+ JsonData addCoupon(long couponId, CouponCategoryEnum couponCategoryEnum);
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponServiceImpl.java b/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponServiceImpl.java
new file mode 100644
index 0000000..3ad2582
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponServiceImpl.java
@@ -0,0 +1,164 @@
+package net.jieyuu.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import net.jieyuu.enums.BizCodeEnum;
+import net.jieyuu.enums.CouponCategoryEnum;
+import net.jieyuu.enums.CouponPublishEnum;
+import net.jieyuu.enums.CouponStateEnum;
+import net.jieyuu.exception.BizException;
+import net.jieyuu.interceptor.LoginInterceptor;
+import net.jieyuu.mapper.CouponRecordMapper;
+import net.jieyuu.model.CouponDO;
+import net.jieyuu.mapper.CouponMapper;
+import net.jieyuu.model.CouponRecordDO;
+import net.jieyuu.model.LoginUser;
+import net.jieyuu.service.CouponService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.jieyuu.utils.CommonUtil;
+import net.jieyuu.utils.JsonData;
+import net.jieyuu.vo.CouponVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author jieyuu
+ * @since 2024-07-15
+ */
+@Service
+@Slf4j
+public class CouponServiceImpl implements CouponService {
+
+ @Autowired
+ private CouponMapper couponMapper;
+
+ @Autowired
+ private CouponRecordMapper couponRecordMapper;
+
+ @Override
+ public Map pageCouponActivity(int page, int size) {
+ Page pageInfo = new Page<>(page, size);
+
+ IPage couponDOIPage = couponMapper.selectPage(pageInfo, new QueryWrapper()
+ .eq("publish", CouponPublishEnum.PUBLISH)
+ .eq("category", CouponCategoryEnum.PROMOTION)
+ .orderByAsc("create_time"));
+
+ Map pageMap = new HashMap<>(3);
+
+ pageMap.put("total_record", couponDOIPage.getTotal());
+ pageMap.put("total_page", couponDOIPage.getPages());
+ pageMap.put("current_data", couponDOIPage.getRecords().stream().map(obj -> beanProcess(obj)).collect(Collectors.toList()));
+
+ return pageMap;
+ }
+
+ /**
+ * 领券接口
+ * 1、获取优惠券是否纯在
+ * 2、校验优惠券是否可以领取: 时间 库存 超过限制
+ * 3、扣减库存
+ * 4、保存领券记录
+ *
+ * @param couponId
+ * @param category
+ * @return
+ */
+ @Override
+ public JsonData addCoupon(long couponId, CouponCategoryEnum category) {
+ LoginUser loginUser = LoginInterceptor.threadLocal.get();
+
+ CouponDO couponDO = couponMapper.selectOne(new QueryWrapper()
+ .eq("id", couponId)
+ .eq("category", category.name()));
+ //优惠券是否可以领取
+ this.couponCheck(couponDO, loginUser.getId());
+
+ //构建领券记录
+ CouponRecordDO couponRecordDO = new CouponRecordDO();
+ BeanUtils.copyProperties(couponDO, couponRecordDO);
+ couponRecordDO.setCreateTime(new Date());
+ couponRecordDO.setUseState(CouponStateEnum.NEW.name());
+ couponRecordDO.setCouponId(couponId);
+ couponRecordDO.setUserName(loginUser.getName());
+ couponRecordDO.setUserId(loginUser.getId());
+ couponRecordDO.setId(null);
+
+ //扣减库存 todo
+ int rows = 1;//couponMapper.reduceStock(couponId);
+
+ if (rows == 1) {
+ //扣减库存成功才保存记录
+ couponRecordMapper.insert(couponRecordDO);
+ } else {
+ log.warn("发放优惠券错误:{},用户:{}", couponDO, loginUser);
+ throw new BizException(BizCodeEnum.COUPON_NO_STOCK);
+ }
+
+ return JsonData.buildSuccess();
+ }
+
+ /**
+ * 校验优惠券是否可以领取
+ *
+ * @param couponDO
+ * @param id
+ */
+ private void couponCheck(CouponDO couponDO, Long id) {
+
+ if (couponDO == null) {
+ throw new BizException(BizCodeEnum.COUPON_NO_EXITS);
+ }
+
+ //库存不足
+ if (couponDO.getStock() <= 0) {
+ throw new BizException(BizCodeEnum.COUPON_NO_STOCK);
+ }
+
+ //未经发布优惠券 确认非法
+ if (!couponDO.getPublish().equals(CouponPublishEnum.PUBLISH.name())) {
+ throw new BizException(BizCodeEnum.COUPON_GET_FAIL);
+ }
+
+ //判断是否在领取时间
+ long time = CommonUtil.getCurrentTimestamp();
+ long start = couponDO.getStartTime().getTime();
+ long end = couponDO.getEndTime().getTime();
+ if (time < start || time > end) {
+ throw new BizException(BizCodeEnum.COUPON_OUT_OF_TIME);
+ }
+
+ //用户是否超过限制
+ //查询用户已经拥有的优惠券数量
+ int recordNum = couponRecordMapper.selectCount(new QueryWrapper()
+ .eq("coupon_id", couponDO.getId())
+ .eq("user_id", id));
+
+ //判断优惠券是否超过限制
+ if (recordNum >= couponDO.getUserLimit()) {
+ throw new BizException(BizCodeEnum.COUPON_OUT_OF_LIMIT);
+ }
+ }
+
+
+ private CouponVO beanProcess(CouponDO couponDO) {
+
+ CouponVO couponVO = new CouponVO();
+ BeanUtils.copyProperties(couponDO, couponVO);
+
+ return couponVO;
+ }
+
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/vo/CouponVO.java b/xdclass-coupon-service/src/main/java/net/jieyuu/vo/CouponVO.java
new file mode 100644
index 0000000..289c601
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/vo/CouponVO.java
@@ -0,0 +1,78 @@
+package net.jieyuu.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class CouponVO {
+
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 优惠卷类型[NEW_USER注册赠券,TASK任务卷,PROMOTION促销劵]
+ */
+ private String category;
+
+ /**
+ * 优惠券图片
+ */
+ @JsonProperty("coupon_img")
+ private String couponImg;
+
+ /**
+ * 优惠券标题
+ */
+ @JsonProperty("coupon_title")
+ private String couponTitle;
+
+ /**
+ * 抵扣价格
+ */
+ private BigDecimal price;
+
+ /**
+ * 每人限制张数
+ */
+ @JsonProperty("user_limit")
+ private Integer userLimit;
+
+ /**
+ * 优惠券开始有效时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8")
+ @JsonProperty("start_time")
+ private Date startTime;
+
+ /**
+ * 优惠券失效时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8")
+ @JsonProperty("end_time")
+ private Date endTime;
+
+ /**
+ * 优惠券总量
+ */
+ @JsonProperty("publish_count")
+ private Integer publishCount;
+
+ /**
+ * 库存
+ */
+ private Integer stock;
+
+ /**
+ * 满多少才可以使用
+ */
+ @JsonProperty("condition_price")
+ private BigDecimal conditionPrice;
+}
diff --git a/xdclass-coupon-service/src/main/resources/application.yml b/xdclass-coupon-service/src/main/resources/application.yml
new file mode 100644
index 0000000..d5c9492
--- /dev/null
+++ b/xdclass-coupon-service/src/main/resources/application.yml
@@ -0,0 +1,29 @@
+server:
+ port: 9002
+
+spring:
+ application:
+ name: xdclass_coupon-service
+
+ #数据库配置
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://134.175.219.253:3306/xdclass_coupon?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+ username: root
+ password: 59ae8683c59fead903132a8d440bd7d9fd4936529d1d6f45f9d41111d7537bdd
+ redis:
+ host: 134.175.219.253
+ password: 123456
+ port: 8000
+
+#配置plus打印sql日志
+mybatis-plus:
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+#设置日志级别,ERROR/WARN/INFO/DEBUG,默认是INFO以上才显示
+logging:
+ level:
+ root: INFO
+
+
diff --git a/xdclass-coupon-service/src/main/resources/mapper/CouponMapper.xml b/xdclass-coupon-service/src/main/resources/mapper/CouponMapper.xml
new file mode 100644
index 0000000..44a9b76
--- /dev/null
+++ b/xdclass-coupon-service/src/main/resources/mapper/CouponMapper.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, category, publish, coupon_img, coupon_title, price, user_limit, start_time, end_time, publish_count, stock, create_time, condition_price
+
+
+
diff --git a/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml b/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml
new file mode 100644
index 0000000..9c9e85e
--- /dev/null
+++ b/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, coupon_id, create_time, use_state, user_id, user_name, coupon_title, start_time, end_time, order_id, price, condition_price
+
+
+
diff --git a/xdclass-coupon-service/src/test/java/net/jieyuu/db/MyBatisPlusGenerator.java b/xdclass-coupon-service/src/test/java/net/jieyuu/db/MyBatisPlusGenerator.java
new file mode 100644
index 0000000..0d29d61
--- /dev/null
+++ b/xdclass-coupon-service/src/test/java/net/jieyuu/db/MyBatisPlusGenerator.java
@@ -0,0 +1,94 @@
+package net.jieyuu.db;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+public class MyBatisPlusGenerator {
+
+ public static void main(String[] args) {
+ //1. 全局配置
+ GlobalConfig config = new GlobalConfig();
+ // 是否支持AR模式
+ config.setActiveRecord(true)
+ // 作者
+ .setAuthor("jieyuu")
+ // 生成路径,最好使用绝对路径,window路径是不一样的
+ //TODO TODO TODO TODO
+ .setOutputDir("D:\\workspace\\project\\xdclass-shop\\xdclass-shop\\xdclass-coupon-service\\src\\main\\java")
+ // 文件覆盖
+ .setFileOverride(true)
+ // 主键策略
+ .setIdType(IdType.AUTO)
+
+ .setDateType(DateType.ONLY_DATE)
+ // 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的
+ .setServiceName("%sService")
+
+ //实体类结尾名称
+ .setEntityName("%sDO")
+
+ //生成基本的resultMap
+ .setBaseResultMap(true)
+
+ //不使用AR模式
+ .setActiveRecord(false)
+
+ //生成基本的SQL片段
+ .setBaseColumnList(true);
+
+ //2. 数据源配置
+ DataSourceConfig dsConfig = new DataSourceConfig();
+ // 设置数据库类型
+ dsConfig.setDbType(DbType.MYSQL)
+ .setDriverName("com.mysql.cj.jdbc.Driver")
+ //TODO TODO TODO TODO
+ .setUrl("jdbc:mysql://134.175.219.253:3306/xdclass_coupon?useSSL=false")
+ .setUsername("root")
+ .setPassword("59ae8683c59fead903132a8d440bd7d9fd4936529d1d6f45f9d41111d7537bdd");
+
+ //3. 策略配置globalConfiguration中
+ StrategyConfig stConfig = new StrategyConfig();
+
+ //全局大写命名
+ stConfig.setCapitalMode(true)
+ // 数据库表映射到实体的命名策略
+ .setNaming(NamingStrategy.underline_to_camel)
+
+ //使用lombok
+ .setEntityLombokModel(true)
+
+ //使用restcontroller注解
+ .setRestControllerStyle(true)
+
+ // 生成的表, 支持多表一起生成,以数组形式填写
+ //TODO TODO TODO TODO
+ .setInclude("coupon","coupon_record");
+
+ //4. 包名策略配置
+ PackageConfig pkConfig = new PackageConfig();
+ pkConfig.setParent("net.jieyuu")
+ .setMapper("mapper")
+ .setService("service")
+ .setController("controller")
+ .setEntity("model")
+ .setXml("mapper");
+
+ //5. 整合配置
+ AutoGenerator ag = new AutoGenerator();
+ ag.setGlobalConfig(config)
+ .setDataSource(dsConfig)
+ .setStrategy(stConfig)
+ .setPackageInfo(pkConfig);
+
+ //6. 执行操作
+ ag.execute();
+ System.out.println("======= 小滴课堂 Done 相关代码生成完毕 ========");
+ }
+}
\ No newline at end of file