userName hace 1 semana
padre
commit
e3cdc7388e
Se han modificado 36 ficheros con 1344 adiciones y 32 borrados
  1. 5 0
      pom.xml
  2. 13 0
      src/main/java/com/zhentao/annotation/NoLoginAnnotation.java
  3. 22 0
      src/main/java/com/zhentao/common/orders/controller/CouponController.java
  4. 28 0
      src/main/java/com/zhentao/common/orders/controller/OrderController.java
  5. 168 0
      src/main/java/com/zhentao/common/orders/domain/MarketingCoupon.java
  6. 168 0
      src/main/java/com/zhentao/common/orders/domain/MarketingCouponUser.java
  7. 82 0
      src/main/java/com/zhentao/common/orders/domain/OrderDetails.java
  8. 102 0
      src/main/java/com/zhentao/common/orders/domain/Orders.java
  9. 7 0
      src/main/java/com/zhentao/common/orders/dto/MarketingCouponDto.java
  10. 23 0
      src/main/java/com/zhentao/common/orders/dto/OrdersDto.java
  11. 20 0
      src/main/java/com/zhentao/common/orders/mapper/MarketingCouponMapper.java
  12. 20 0
      src/main/java/com/zhentao/common/orders/mapper/MarketingCouponUserMapper.java
  13. 19 0
      src/main/java/com/zhentao/common/orders/mapper/OrderDetailsMapper.java
  14. 19 0
      src/main/java/com/zhentao/common/orders/mapper/OrdersMapper.java
  15. 17 0
      src/main/java/com/zhentao/common/orders/service/MarketingCouponService.java
  16. 15 0
      src/main/java/com/zhentao/common/orders/service/MarketingCouponUserService.java
  17. 14 0
      src/main/java/com/zhentao/common/orders/service/OrderDetailsService.java
  18. 19 0
      src/main/java/com/zhentao/common/orders/service/OrdersService.java
  19. 35 0
      src/main/java/com/zhentao/common/orders/service/impl/MarketingCouponServiceImpl.java
  20. 24 0
      src/main/java/com/zhentao/common/orders/service/impl/MarketingCouponUserServiceImpl.java
  21. 22 0
      src/main/java/com/zhentao/common/orders/service/impl/OrderDetailsServiceImpl.java
  22. 59 0
      src/main/java/com/zhentao/common/orders/service/impl/OrdersServiceImpl.java
  23. 14 0
      src/main/java/com/zhentao/common/orders/vo/OrdersVo.java
  24. 5 4
      src/main/java/com/zhentao/common/user/controller/LoginController.java
  25. 3 2
      src/main/java/com/zhentao/common/user/service/GooseUserService.java
  26. 139 21
      src/main/java/com/zhentao/common/user/service/impl/GooseUserServiceImpl.java
  27. 6 1
      src/main/java/com/zhentao/constants/CommonConstant.java
  28. 7 0
      src/main/java/com/zhentao/enums/BaseExceptionEnum.java
  29. 21 0
      src/main/java/com/zhentao/exceptions/ApiException.java
  30. 45 0
      src/main/java/com/zhentao/exceptions/GlobalExceptionHandler.java
  31. 5 4
      src/main/java/com/zhentao/util/ResultVo.java
  32. 34 0
      src/main/java/com/zhentao/util/WXBizDataCryptUtil.java
  33. 51 0
      src/main/resources/mapper/MarketingCouponMapper.xml
  34. 51 0
      src/main/resources/mapper/MarketingCouponUserMapper.xml
  35. 28 0
      src/main/resources/mapper/OrderDetailsMapper.xml
  36. 34 0
      src/main/resources/mapper/OrdersMapper.xml

+ 5 - 0
pom.xml

@@ -15,6 +15,11 @@
     </properties>
     <dependencies>
         <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.70</version>
+        </dependency>
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>

+ 13 - 0
src/main/java/com/zhentao/annotation/NoLoginAnnotation.java

@@ -0,0 +1,13 @@
+package com.zhentao.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface NoLoginAnnotation {
+
+
+}

+ 22 - 0
src/main/java/com/zhentao/common/orders/controller/CouponController.java

@@ -0,0 +1,22 @@
+package com.zhentao.common.orders.controller;
+
+import com.zhentao.common.orders.domain.MarketingCoupon;
+import com.zhentao.common.orders.service.MarketingCouponService;
+import com.zhentao.util.ResultVo;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/coupon")
+public class CouponController {
+    @Resource
+    private MarketingCouponService couponService;
+
+    @RequestMapping("/addCoupon")
+    public ResultVo addCoupon(@RequestBody MarketingCoupon coupon){
+        return couponService.add(coupon);
+    }
+}

+ 28 - 0
src/main/java/com/zhentao/common/orders/controller/OrderController.java

@@ -0,0 +1,28 @@
+package com.zhentao.common.orders.controller;
+
+
+
+import com.zhentao.common.orders.dto.OrdersDto;
+import com.zhentao.common.orders.service.OrdersService;
+import com.zhentao.util.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("orders")
+public class OrderController {
+    @Autowired
+    private OrdersService ordersService;
+
+    @RequestMapping("add")
+    public ResultVo Add(@RequestBody OrdersDto ordersDto){
+        return ordersService.add(ordersDto);
+    }
+
+    @RequestMapping("findAll")
+    public ResultVo findAll(){
+        return ordersService.findAll();
+    }
+}

+ 168 - 0
src/main/java/com/zhentao/common/orders/domain/MarketingCoupon.java

@@ -0,0 +1,168 @@
+package com.zhentao.common.orders.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 优惠券表
+
+ * @TableName marketing_coupon
+ */
+@TableName(value ="marketing_coupon")
+@Data
+public class MarketingCoupon implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 活动类型 1平台 2活动优惠
+     */
+    private Integer getType;
+
+    /**
+     * 活动id
+     */
+    private Integer activeId;
+
+    /**
+     * 优惠券类型 1满减券 2满折券
+     */
+    private Integer tacticsType;
+
+    /**
+     * 优惠券名称
+     */
+    private String name;
+
+    /**
+     * 面值
+     */
+    private BigDecimal faceValue;
+
+    /**
+     * 优惠券图片
+     */
+    private String imgUrl;
+
+    /**
+     * 领取方式 1手动领取 2赠送券 3会员券
+     */
+    private Integer getWay;
+
+    /**
+     * 使用类型 1通用2指定分类3指定课程4活动券
+     */
+    private Integer productType;
+
+    /**
+     * 产品id 分类id
+     */
+    private String productValue;
+
+    /**
+     * 有无门槛0无门槛1有门槛
+     */
+    private Integer limitMinFlag;
+
+    /**
+     * 限制金额
+     */
+    private BigDecimal limitMin;
+
+    /**
+     * 有效标识1按天2时间段
+     */
+    private Integer validFlag;
+
+    /**
+     * 有效天数
+     */
+    private Integer validDays;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 截止时间
+     */
+    private Date endTime;
+
+    /**
+     * 领取时间0不限时1限时领取
+     */
+    private Integer getTimeLimit;
+
+    /**
+     * 领取开始时间
+     */
+    private Date getStartTime;
+
+    /**
+     * 领取结束时间
+     */
+    private Date getEndTime;
+
+    /**
+     * 是否限量0不限制1限制
+     */
+    private Integer totalLimit;
+
+    /**
+     * 优惠券数量
+     */
+    private Integer totalNum;
+
+    /**
+     * 状态1正常显示0隐藏
+     */
+    private Integer status;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 跳转链接
+     */
+    private String navHref;
+
+    /**
+     * 版本
+     */
+    private Integer reversion;
+
+    /**
+     * 创建时间
+     */
+    private Date createddTime;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updatedTime;
+
+    /**
+     * 更新者
+     */
+    private String updatedBy;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 168 - 0
src/main/java/com/zhentao/common/orders/domain/MarketingCouponUser.java

@@ -0,0 +1,168 @@
+package com.zhentao.common.orders.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 用户优惠券表
+
+ * @TableName marketing_coupon_user
+ */
+@TableName(value ="marketing_coupon_user")
+@Data
+public class MarketingCouponUser implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    /**
+     * 规则类型1满减券2满折券
+     */
+    private Integer couponTacticsType;
+
+    /**
+     * 规则类型描述
+     */
+    private String tacticsTypeDesc;
+
+    /**
+     * 适用类型1通用券2品类券3课程券4活动券
+     */
+    private Integer couponType;
+
+    /**
+     * 产品id分类id
+     */
+    private String productValue;
+
+    /**
+     * 有无门槛0无门槛1有门槛
+     */
+    private Integer limitMinFlag;
+
+    /**
+     * 限制金额
+     */
+    private BigDecimal limitMin;
+
+    /**
+     * 适用类型
+     */
+    private String typeName;
+
+    /**
+     * 面值
+     */
+    private BigDecimal faceValue;
+
+    /**
+     * 优惠券图片
+     */
+    private String imgUrl;
+
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 有效期截止时间
+     */
+    private Date endTime;
+
+    /**
+     * 获取日期
+     */
+    private String getTime;
+
+    /**
+     * 领取方式1手动领取 2后台赠送
+     */
+    private Integer getWay;
+
+    /**
+     * 使用时间
+     */
+    private Date usedTime;
+
+    /**
+     * 活动id
+     */
+    private Long activeId;
+
+    /**
+     * 使用状态0未使用1已使用2已过期
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 版本
+     */
+    private Integer reversion;
+
+    /**
+     * 版本标识0未统计1已统计
+     */
+    private Integer statFlag;
+
+    /**
+     * 创建时间
+     */
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 逻辑删除
+     */
+    private Integer delFlag;
+
+    /**
+     * 扫码领取
+     */
+    private Integer isReceive;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 82 - 0
src/main/java/com/zhentao/common/orders/domain/OrderDetails.java

@@ -0,0 +1,82 @@
+package com.zhentao.common.orders.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 订单明细表
+ * @TableName order_details
+ */
+@TableName(value ="order_details")
+@Data
+public class OrderDetails implements Serializable {
+    /**
+     * 订单明细编号
+     */
+    @TableId
+    private Long detailId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * 课程id
+     */
+    private Long courseId;
+
+    /**
+     * SKU
+     */
+    private Long skuId;
+
+    /**
+     * 课程名称
+     */
+    private String courseName;
+
+    /**
+     * 应付
+     */
+    private BigDecimal originalFee;
+
+    /**
+     * 实付
+     */
+    private BigDecimal actualFee;
+
+    /**
+     * 优惠类型 如折扣 满减 优惠券等
+     */
+    private BigDecimal discountAmount;
+
+    /**
+     * 订单创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 订单信息更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 102 - 0
src/main/java/com/zhentao/common/orders/domain/Orders.java

@@ -0,0 +1,102 @@
+package com.zhentao.common.orders.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 订单表
+ * @TableName orders
+ */
+@TableName(value ="orders")
+@Data
+public class Orders implements Serializable {
+    /**
+     * 订单编号
+     */
+    @TableId
+    private Long ordersId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 优惠券id
+     */
+    private Long couponId;
+
+    /**
+     * 课程名称
+     */
+    private String courseName;
+
+    /**
+     * 支付方式 0微信支付 1支付宝支付
+     */
+    private Integer paymentMethod;
+
+    /**
+     * 支付状态 0未支付 1已支付
+     */
+    private Integer paymentStatus;
+
+    /**
+     * 支付时间
+     */
+    private Date paymentTime;
+
+    /**
+     * 订单状态 0未支付 1已支付 2待评价 3完成 4订单超时
+     */
+    private Integer orderStatus;
+
+    /**
+     * 应付
+     */
+    private BigDecimal originalFee;
+
+    /**
+     * 实付
+     */
+    private BigDecimal actualFee;
+
+    /**
+     * 优惠金额
+     */
+    private BigDecimal discountAmount;
+
+    /**
+     * 订单创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 订单信息更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 逻辑删除 0存在(默认值为0) 1删除
+     */
+    private Integer isDelete;
+
+    /**
+     * 退款售后 0正常 1有退款
+     */
+    private Integer isRefund;
+
+    /**
+     * 用户或客服添加的备注信息,记录特殊要求
+     */
+    private String remark;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 7 - 0
src/main/java/com/zhentao/common/orders/dto/MarketingCouponDto.java

@@ -0,0 +1,7 @@
+package com.zhentao.common.orders.dto;
+
+import lombok.Data;
+
+@Data
+public class MarketingCouponDto {
+}

+ 23 - 0
src/main/java/com/zhentao/common/orders/dto/OrdersDto.java

@@ -0,0 +1,23 @@
+package com.zhentao.common.orders.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class OrdersDto {
+    private Long userId;
+    private Long couponId;
+    private String courseName;
+    private Integer paymentMethod;
+    private Date paymentTime;
+    private BigDecimal originalFee;
+    private BigDecimal actualFee;
+    private BigDecimal discountAmount;
+    private String remark;
+
+    private Long detailId;
+    private Long courseId;
+    private Long skuId;
+}

+ 20 - 0
src/main/java/com/zhentao/common/orders/mapper/MarketingCouponMapper.java

@@ -0,0 +1,20 @@
+package com.zhentao.common.orders.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhentao.common.orders.domain.MarketingCoupon;
+
+/**
+* @author lsk
+* @description 针对表【marketing_coupon(优惠券表
+)】的数据库操作Mapper
+* @createDate 2025-05-08 17:30:15
+* @Entity com.zhentao.domain.MarketingCoupon
+*/
+public interface MarketingCouponMapper extends BaseMapper<MarketingCoupon> {
+
+}
+
+
+
+

+ 20 - 0
src/main/java/com/zhentao/common/orders/mapper/MarketingCouponUserMapper.java

@@ -0,0 +1,20 @@
+package com.zhentao.common.orders.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhentao.common.orders.domain.MarketingCouponUser;
+
+/**
+* @author lsk
+* @description 针对表【marketing_coupon_user(用户优惠券表
+)】的数据库操作Mapper
+* @createDate 2025-05-08 17:30:15
+* @Entity com.zhentao.domain.MarketingCouponUser
+*/
+public interface MarketingCouponUserMapper extends BaseMapper<MarketingCouponUser> {
+
+}
+
+
+
+

+ 19 - 0
src/main/java/com/zhentao/common/orders/mapper/OrderDetailsMapper.java

@@ -0,0 +1,19 @@
+package com.zhentao.common.orders.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhentao.common.orders.domain.OrderDetails;
+
+/**
+* @author lsk
+* @description 针对表【order_details(订单明细表)】的数据库操作Mapper
+* @createDate 2025-05-08 17:30:15
+* @Entity com.zhentao.domain.OrderDetails
+*/
+public interface OrderDetailsMapper extends BaseMapper<OrderDetails> {
+
+}
+
+
+
+

+ 19 - 0
src/main/java/com/zhentao/common/orders/mapper/OrdersMapper.java

@@ -0,0 +1,19 @@
+package com.zhentao.common.orders.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhentao.common.orders.domain.Orders;
+
+/**
+* @author lsk
+* @description 针对表【orders(订单表)】的数据库操作Mapper
+* @createDate 2025-05-08 17:30:15
+* @Entity com.zhentao.domain.Orders
+*/
+public interface OrdersMapper extends BaseMapper<Orders> {
+
+}
+
+
+
+

+ 17 - 0
src/main/java/com/zhentao/common/orders/service/MarketingCouponService.java

@@ -0,0 +1,17 @@
+package com.zhentao.common.orders.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhentao.common.orders.domain.MarketingCoupon;
+import com.zhentao.util.ResultVo;
+
+/**
+* @author lsk
+* @description 针对表【marketing_coupon(优惠券表
+)】的数据库操作Service
+* @createDate 2025-05-08 17:30:15
+*/
+public interface MarketingCouponService extends IService<MarketingCoupon> {
+
+    ResultVo add(MarketingCoupon coupon);
+}

+ 15 - 0
src/main/java/com/zhentao/common/orders/service/MarketingCouponUserService.java

@@ -0,0 +1,15 @@
+package com.zhentao.common.orders.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhentao.common.orders.domain.MarketingCouponUser;
+
+/**
+* @author lsk
+* @description 针对表【marketing_coupon_user(用户优惠券表
+)】的数据库操作Service
+* @createDate 2025-05-08 17:30:15
+*/
+public interface MarketingCouponUserService extends IService<MarketingCouponUser> {
+
+}

+ 14 - 0
src/main/java/com/zhentao/common/orders/service/OrderDetailsService.java

@@ -0,0 +1,14 @@
+package com.zhentao.common.orders.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhentao.common.orders.domain.OrderDetails;
+
+/**
+* @author lsk
+* @description 针对表【order_details(订单明细表)】的数据库操作Service
+* @createDate 2025-05-08 17:30:15
+*/
+public interface OrderDetailsService extends IService<OrderDetails> {
+
+}

+ 19 - 0
src/main/java/com/zhentao/common/orders/service/OrdersService.java

@@ -0,0 +1,19 @@
+package com.zhentao.common.orders.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhentao.common.orders.domain.Orders;
+import com.zhentao.common.orders.dto.OrdersDto;
+import com.zhentao.util.ResultVo;
+
+/**
+* @author lsk
+* @description 针对表【orders(订单表)】的数据库操作Service
+* @createDate 2025-05-08 17:30:15
+*/
+public interface OrdersService extends IService<Orders> {
+
+    ResultVo add(OrdersDto ordersDto);
+
+    ResultVo findAll();
+}

+ 35 - 0
src/main/java/com/zhentao/common/orders/service/impl/MarketingCouponServiceImpl.java

@@ -0,0 +1,35 @@
+package com.zhentao.common.orders.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhentao.common.orders.domain.MarketingCoupon;
+import com.zhentao.common.orders.mapper.MarketingCouponMapper;
+import com.zhentao.common.orders.service.MarketingCouponService;
+import com.zhentao.util.ResultVo;
+import com.zhentao.util.SnowflakeIdGenerator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+* @author lsk
+* @description 针对表【marketing_coupon(优惠券表
+)】的数据库操作Service实现
+* @createDate 2025-05-08 17:30:15
+*/
+@Service
+public class MarketingCouponServiceImpl extends ServiceImpl<MarketingCouponMapper, MarketingCoupon>
+    implements MarketingCouponService {
+    @Autowired
+    private MarketingCouponMapper couponMapper;
+    @Override
+    public ResultVo add(MarketingCoupon coupon) {
+        coupon.setId(SnowflakeIdGenerator.getSnowId());
+        couponMapper.insert(coupon);
+
+        return null;
+    }
+}
+
+
+
+

+ 24 - 0
src/main/java/com/zhentao/common/orders/service/impl/MarketingCouponUserServiceImpl.java

@@ -0,0 +1,24 @@
+package com.zhentao.common.orders.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhentao.common.orders.domain.MarketingCouponUser;
+import com.zhentao.common.orders.mapper.MarketingCouponUserMapper;
+import com.zhentao.common.orders.service.MarketingCouponUserService;
+import org.springframework.stereotype.Service;
+
+/**
+* @author lsk
+* @description 针对表【marketing_coupon_user(用户优惠券表
+)】的数据库操作Service实现
+* @createDate 2025-05-08 17:30:15
+*/
+@Service
+public class MarketingCouponUserServiceImpl extends ServiceImpl<MarketingCouponUserMapper, MarketingCouponUser>
+    implements MarketingCouponUserService {
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/zhentao/common/orders/service/impl/OrderDetailsServiceImpl.java

@@ -0,0 +1,22 @@
+package com.zhentao.common.orders.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhentao.common.orders.domain.OrderDetails;
+import com.zhentao.common.orders.mapper.OrderDetailsMapper;
+import com.zhentao.common.orders.service.OrderDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+* @author lsk
+* @description 针对表【order_details(订单明细表)】的数据库操作Service实现
+* @createDate 2025-05-08 17:30:15
+*/
+@Service
+public class OrderDetailsServiceImpl extends ServiceImpl<OrderDetailsMapper, OrderDetails>
+    implements OrderDetailsService {
+
+}
+
+
+
+

+ 59 - 0
src/main/java/com/zhentao/common/orders/service/impl/OrdersServiceImpl.java

@@ -0,0 +1,59 @@
+package com.zhentao.common.orders.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhentao.common.orders.domain.OrderDetails;
+import com.zhentao.common.orders.domain.Orders;
+import com.zhentao.common.orders.dto.OrdersDto;
+import com.zhentao.common.orders.mapper.OrderDetailsMapper;
+import com.zhentao.common.orders.mapper.OrdersMapper;
+import com.zhentao.common.orders.service.OrdersService;
+import com.zhentao.util.ResultVo;
+import com.zhentao.util.SnowflakeIdGenerator;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author lsk
+* @description 针对表【orders(订单表)】的数据库操作Service实现
+* @createDate 2025-05-08 17:30:15
+*/
+@Service
+public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders>
+    implements OrdersService {
+    @Autowired
+    private OrdersMapper ordersMapper;
+    @Autowired
+    private OrderDetailsMapper orderDetailsMapper;
+
+    @Override
+    public ResultVo add(OrdersDto ordersDto) {
+        Orders orders = new Orders();
+        OrderDetails orderDetails = new OrderDetails();
+        BeanUtils.copyProperties(ordersDto , orders);
+        BeanUtils.copyProperties(ordersDto , orderDetails);
+        orders.setOrdersId(SnowflakeIdGenerator.getSnowId());
+        orderDetails.setDetailId(SnowflakeIdGenerator.getSnowId());
+        int i = ordersMapper.insert(orders);
+        int i1 = orderDetailsMapper.insert(orderDetails);
+        if(i > 0 && i1 > 0 ){
+            return ResultVo.OK();
+        }
+        return ResultVo.ERROR();
+    }
+
+    @Override
+    public ResultVo findAll() {
+        QueryWrapper<Orders> queryWrapper = new QueryWrapper<>();
+        List<Orders> orders = ordersMapper.selectList(queryWrapper);
+        return ResultVo.OK(orders);
+    }
+}
+
+
+
+

+ 14 - 0
src/main/java/com/zhentao/common/orders/vo/OrdersVo.java

@@ -0,0 +1,14 @@
+//package com.zhentao.common.orders.vo;
+//
+//import com.zhentao.common.orders.domain.Orders;
+//import lombok.AllArgsConstructor;
+//import lombok.Data;
+//import lombok.NoArgsConstructor;
+//
+//@Data
+//@AllArgsConstructor
+//@NoArgsConstructor
+//public class OrdersVo extends Orders {
+//
+//
+//}

+ 5 - 4
src/main/java/com/zhentao/common/user/controller/LoginController.java

@@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 @RestController
@@ -18,12 +19,12 @@ public class LoginController {
     @Resource
     private GooseUserService gooseUserService;
     @RequestMapping("/login")
-    public ResultVo login(@RequestBody LoginDto loginDto){
-        return gooseUserService.login(loginDto);
+    public ResultVo login(@RequestBody LoginDto loginDto,HttpServletRequest request){
+        return gooseUserService.login(loginDto,request);
     }
     @RequestMapping("/wx-login")
-    public ResultVo Wxlogin(@RequestBody Map<String, String> requestData){
-        return gooseUserService.Wxlogin(requestData);
+    public ResultVo Wxlogin(@RequestBody Map<String, String> requestData, HttpServletRequest request){
+        return gooseUserService.Wxlogin(requestData,request);
     }
     @RequestMapping("/getCode")
     public ResultVo getCode(@RequestBody GooseUser user){

+ 3 - 2
src/main/java/com/zhentao/common/user/service/GooseUserService.java

@@ -6,6 +6,7 @@ import com.zhentao.common.user.domain.GooseUser;
 import com.zhentao.common.user.dto.LoginDto;
 import com.zhentao.util.ResultVo;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -15,9 +16,9 @@ import java.util.Map;
 */
 public interface GooseUserService extends IService<GooseUser> {
 
-    ResultVo Wxlogin(Map<String, String> requestData);
+    ResultVo Wxlogin(Map<String, String> requestData, HttpServletRequest request);
 
     ResultVo getCode(GooseUser user);
 
-    ResultVo login(LoginDto loginDto);
+    ResultVo login(LoginDto loginDto,HttpServletRequest request);
 }

+ 139 - 21
src/main/java/com/zhentao/common/user/service/impl/GooseUserServiceImpl.java

@@ -6,13 +6,16 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zhentao.common.user.domain.GooseUser;
+import com.zhentao.common.user.domain.UserLocation;
+import com.zhentao.common.user.domain.UserLogin;
 import com.zhentao.common.user.dto.LoginDto;
 import com.zhentao.common.user.mapper.GooseUserMapper;
+import com.zhentao.common.user.mapper.UserLocationMapper;
+import com.zhentao.common.user.mapper.UserLoginMapper;
 import com.zhentao.common.user.service.GooseUserService;
-import com.zhentao.util.AppJwtUtil;
-import com.zhentao.util.HttpUtils;
-import com.zhentao.util.ResultVo;
-import com.zhentao.util.SnowflakeIdGenerator;
+import com.zhentao.constants.CommonConstant;
+import com.zhentao.exceptions.ApiException;
+import com.zhentao.util.*;
 import lombok.SneakyThrows;
 import org.apache.http.HttpResponse;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,7 +30,9 @@ import org.springframework.web.client.HttpClientErrorException;
 import org.springframework.web.client.RestTemplate;
 import redis.clients.jedis.Jedis;
 
+import javax.servlet.http.HttpServletRequest;
 import java.nio.charset.StandardCharsets;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -42,6 +47,8 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
         implements GooseUserService {
     @Autowired
     private GooseUserMapper userMapper;
+    @Autowired
+    private UserLocationMapper userLocationMapper;
     @Value("${wechat.appid}")
     private String APPID;
 
@@ -49,7 +56,7 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
     private String SECRET;
     private static final ObjectMapper objectMapper = new ObjectMapper(); // JSON 解析器
     @Override
-    public ResultVo login(LoginDto loginDto) {
+    public ResultVo login(LoginDto loginDto,HttpServletRequest request) {
         if(StringUtils.checkValNotNull(loginDto.getPhone())){
             QueryWrapper<GooseUser> queryWrapper=new QueryWrapper<>();
             queryWrapper.eq("phone",loginDto.getPhone());
@@ -60,13 +67,29 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
                 if(StringUtils.checkValNotNull(loginDto.getPassword())){
                     gooseUser1.setId(SnowflakeIdGenerator.getSnowId());
                     gooseUser1.setNickname("普通用户"+ UUID.randomUUID().toString().replace("-","").substring(0,8));
-                    String password = gooseUser1.getPassword();
-                    String salt=UUID.randomUUID().toString().replace(",","");
-                    String pwd= DigestUtils.md5DigestAsHex((password+salt).getBytes(StandardCharsets.UTF_8));
+                    String salt=UUID.randomUUID().toString().replace("-","");
+                    String pwd= DigestUtils.md5DigestAsHex((loginDto.getPassword()+salt).getBytes(StandardCharsets.UTF_8));
                     gooseUser1.setPassword(pwd);
                     gooseUser1.setSalt(salt);
                     userMapper.insert(gooseUser1);
                     String token= AppJwtUtil.getToken(gooseUser1.getId());
+                    UserLocation location=new UserLocation();
+                    location.setLastLoginTime(new Date());
+                    location.setUserId(user.getId());
+                    location.setAppId(APPID);
+                    String requestIp = request.getHeader("X-Forwarded-For");
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("WL-Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getRemoteAddr(); // 最后兜底
+                    }
+                    System.out.println("请求IP: " + requestIp);
+                    location.setReqIp(requestIp);
+                    userLocationMapper.insert(location);
                     return ResultVo.OK(token);
                 }
                 if(StringUtils.checkValNotNull(loginDto.getCode())){
@@ -77,6 +100,23 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
                     if(loginDto.getCode().equals(code)){
                         userMapper.insert(gooseUser1);
                         String token= AppJwtUtil.getToken(gooseUser1.getId());
+                        UserLocation location=new UserLocation();
+                        location.setLastLoginTime(new Date());
+                        location.setUserId(user.getId());
+                        location.setAppId(APPID);
+                        String requestIp = request.getHeader("X-Forwarded-For");
+                        if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                            requestIp = request.getHeader("Proxy-Client-IP");
+                        }
+                        if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                            requestIp = request.getHeader("WL-Proxy-Client-IP");
+                        }
+                        if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                            requestIp = request.getRemoteAddr(); // 最后兜底
+                        }
+                        System.out.println("请求IP: " + requestIp);
+                        location.setReqIp(requestIp);
+                        userLocationMapper.insert(location);
                         return ResultVo.OK(token);
                     }
                 }
@@ -88,7 +128,24 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
                 String pwd=DigestUtils.md5DigestAsHex((loginDto.getPassword()+salt).getBytes(StandardCharsets.UTF_8));
                 if(pwd.equals(password)){
                     String token=AppJwtUtil.getToken(user.getId());
-                    return ResultVo.OK();
+                    UserLocation location=new UserLocation();
+                    location.setLastLoginTime(new Date());
+                    location.setUserId(user.getId());
+                    location.setAppId(APPID);
+                    String requestIp = request.getHeader("X-Forwarded-For");
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("WL-Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getRemoteAddr(); // 最后兜底
+                    }
+                    System.out.println("请求IP: " + requestIp);
+                    location.setReqIp(requestIp);
+                    userLocationMapper.insert(location);
+                    return ResultVo.OK(token);
                 }
                 return ResultVo.ERROR();
             }
@@ -97,6 +154,23 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
                 String code = jedis.get("code");
                 if(loginDto.getCode().equals(code)){
                     String token=AppJwtUtil.getToken(user.getId());
+                    UserLocation location=new UserLocation();
+                    location.setLastLoginTime(new Date());
+                    location.setUserId(user.getId());
+                    location.setAppId(APPID);
+                    String requestIp = request.getHeader("X-Forwarded-For");
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("WL-Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getRemoteAddr(); // 最后兜底
+                    }
+                    System.out.println("请求IP: " + requestIp);
+                    location.setReqIp(requestIp);
+                    userLocationMapper.insert(location);
                     return ResultVo.OK(token);
                 }
             }
@@ -106,11 +180,17 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
 
     @SneakyThrows
     @Override
-    public ResultVo Wxlogin(Map<String, String> requestData) {
+    public ResultVo Wxlogin(Map<String, String> requestData, HttpServletRequest request) {
         String code = requestData.get("code");
+        String encryptedData = requestData.get("encryptedData");
+        String iv = requestData.get("iv");
+        String avatarUrl=requestData.get("avatar_url");
+        String nickname=requestData.get("nickname");
         System.out.println(code);
+        System.out.println(encryptedData);
+        System.out.println(iv);
         if (code == null) {
-            return new ResultVo(400,"Missing code",null);
+            return new ResultVo(CommonConstant.ERROR,"Missing code",null);
         }
         String url = "https://api.weixin.qq.com/sns/jscode2session?" +
                 "appid=" + APPID +
@@ -125,13 +205,10 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
             // 改用 String 接收响应,兼容所有 Content-Type
             ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
             String responseBody = response.getBody();
-
-            System.out.println(responseBody);
-
             // 手动解析 JSON
             Map<String, Object> result = objectMapper.readValue(responseBody, Map.class);
             if (result.containsKey("errcode")) { // 微信错误响应
-                return new ResultVo(400,"微信接口返回错误: " + result.get("errmsg"),null);
+                return new ResultVo(CommonConstant.ERROR,"微信接口返回错误: " + result.get("errmsg"),null);
             }
             // 成功响应
             QueryWrapper<GooseUser>queryWrapper=new QueryWrapper<>();
@@ -139,21 +216,63 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
             String session_key=(String) result.get("session_key");
             queryWrapper.eq("open_id",openId);
             GooseUser gooseUser = userMapper.selectOne(queryWrapper);
+            System.out.println(gooseUser);
             if(gooseUser==null){
                 GooseUser user=new GooseUser();
                 user.setId(SnowflakeIdGenerator.getSnowId());
                 user.setOpenId(openId);
-                user.setNickname("微信用户"+ UUID.randomUUID().toString().replace("-","").substring(0,8));
+                user.setNickname(nickname);
+                user.setAvatarUrl(avatarUrl);
                 userMapper.insert(user);
                 String token=AppJwtUtil.getToken(user.getId());
-                return new ResultVo(200,"登录成功",token);
+                String userInfo = WXBizDataCryptUtil.decryptData(APPID, session_key, encryptedData, iv);
+                System.out.println(userInfo);
+                UserLocation location=new UserLocation();
+                location.setLastLoginTime(new Date());
+                location.setUserId(user.getId());
+                location.setAppId(APPID);
+                location.setDeviceId(openId);
+                String requestIp = request.getHeader("X-Forwarded-For");
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getHeader("WL-Proxy-Client-IP");
+                    }
+                    if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                        requestIp = request.getRemoteAddr(); // 最后兜底
+                    }
+                    System.out.println("请求IP: " + requestIp);
+                    location.setReqIp(requestIp);
+                    userLocationMapper.insert(location);
+                return new ResultVo(CommonConstant.OK,"登录成功",token);
             }
+            String userInfo = WXBizDataCryptUtil.decryptData(APPID, session_key, encryptedData, iv);
+            System.out.println(userInfo);
             String token=AppJwtUtil.getToken(gooseUser.getId());
-            return new ResultVo(200,"登录成功",token);
+            UserLocation location=new UserLocation();
+            location.setLastLoginTime(new Date());
+            location.setUserId(gooseUser.getId());
+            location.setAppId(APPID);
+            location.setDeviceId(openId);
+            String requestIp = request.getHeader("X-Forwarded-For");
+            if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                requestIp = request.getHeader("Proxy-Client-IP");
+            }
+            if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                requestIp = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
+                requestIp = request.getRemoteAddr(); // 最后兜底
+            }
+            System.out.println("请求IP: " + requestIp);
+            location.setReqIp(requestIp);
+            userLocationMapper.insert(location);
+            return new ResultVo(CommonConstant.OK,"登录成功",token);
         } catch (HttpClientErrorException e) { // 处理 HTTP 错误(如 400、500)
-            return new ResultVo(400,"请求微信接口失败: " + e.getResponseBodyAsString(),null);
+            throw  new ApiException(CommonConstant.ERROR,"请求微信接口失败: " + e.getResponseBodyAsString());
         } catch (Exception e) { // 处理 JSON 解析错误
-            return new ResultVo(400,"响应解析失败: " + e.getMessage(),null);
+            throw  new ApiException(CommonConstant.ERROR,"响应解析失败: " + e.getMessage());
         }
     }
 
@@ -205,7 +324,6 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
         }
         return null;
     }
-
     // 构建成功响应
     private Map<String, Object> buildSuccessResponse(String openid, String sessionKey) {
         Map<String, Object> response = new HashMap<>();

+ 6 - 1
src/main/java/com/zhentao/constants/CommonConstant.java

@@ -61,7 +61,12 @@ public interface CommonConstant {
      * JWT刷新新token响应状态码
      */
     int JWT_REFRESH_TOKEN_CODE = 460;
-
+    int ERROR = 400;
+    int OK = 200;
+    int NOTFOUND = 404;
+    String SUCCESS="操作成功";
+    String NOPAGE="不存在页面请求";
+    String FAILD="操作失败";
     /**
      * JWT刷新新token响应状态码,
      * Redis中不存在,但jwt未过期,不生成新的token,返回361状态码

+ 7 - 0
src/main/java/com/zhentao/enums/BaseExceptionEnum.java

@@ -0,0 +1,7 @@
+package com.zhentao.enums;
+
+public interface BaseExceptionEnum {
+    Integer getCode();
+
+    String getMessage();
+}

+ 21 - 0
src/main/java/com/zhentao/exceptions/ApiException.java

@@ -0,0 +1,21 @@
+package com.zhentao.exceptions;
+
+
+import com.zhentao.enums.BaseExceptionEnum;
+import lombok.Data;
+
+@Data
+public class ApiException extends RuntimeException{
+    public Integer code;
+    public String msg;
+    public ApiException(BaseExceptionEnum baseExceptionEnum){
+        super(baseExceptionEnum.getMessage());
+        this.code=baseExceptionEnum.getCode();
+        this.msg=baseExceptionEnum.getMessage();
+    }
+    public ApiException(Integer code, String message){
+        super(message);
+        this.code=code;
+        this.msg=message;
+    }
+}

+ 45 - 0
src/main/java/com/zhentao/exceptions/GlobalExceptionHandler.java

@@ -0,0 +1,45 @@
+package com.zhentao.exceptions;
+
+
+import com.zhentao.constants.CommonConstant;
+import com.zhentao.util.ResultVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.multipart.MultipartException;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import javax.servlet.http.HttpServletRequest;
+
+@ControllerAdvice
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(value = Exception.class)
+    @ResponseBody
+    public ResultVo defaultErrorHandler(HttpServletRequest req, Exception e){
+        log.error(e.getMessage());
+        if(e instanceof NoHandlerFoundException){
+            return  new ResultVo(CommonConstant.NOTFOUND,CommonConstant.NOPAGE,null);
+        }
+        if(e instanceof ApiException){
+            ApiException costomException= (ApiException) e;
+            return new ResultVo(costomException.getCode(),costomException.getMessage(),null);
+        }
+        else if (e instanceof MultipartException){
+            log.error("系统异常{}",e);
+            return new ResultVo(1000,"上传文件异常",null);
+        } else if (e instanceof MethodArgumentNotValidException) {
+            MethodArgumentNotValidException methodArgumentNotValidException= (MethodArgumentNotValidException) e;
+            return new ResultVo(1002,methodArgumentNotValidException.getBindingResult().getFieldError().getDefaultMessage(),null);
+        }
+        else {
+            log.error("系统异常{}",e);
+            return new ResultVo(1001,"系统参数异常",null);
+        }
+    }
+}

+ 5 - 4
src/main/java/com/zhentao/util/ResultVo.java

@@ -1,5 +1,6 @@
 package com.zhentao.util;
 
+import com.zhentao.constants.CommonConstant;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -13,15 +14,15 @@ public class ResultVo {
     private Object data;
 
     public static ResultVo OK(){
-        return new ResultVo(200,"操作成功",null);
+        return new ResultVo(CommonConstant.OK,CommonConstant.SUCCESS,null);
     }
     public static ResultVo ERROR(){
-        return new ResultVo(400,"操作失败",null);
+        return new ResultVo(CommonConstant.ERROR,CommonConstant.FAILD,null);
     }
     public static ResultVo OK(Object data){
-        return new ResultVo(200,"操作成功",data);
+        return new ResultVo(CommonConstant.OK,CommonConstant.SUCCESS,data);
     }
     public static ResultVo ERROR(Object data){
-        return new ResultVo(200,"操作成功",data);
+        return new ResultVo(CommonConstant.ERROR,CommonConstant.FAILD,data);
     }
 }

+ 34 - 0
src/main/java/com/zhentao/util/WXBizDataCryptUtil.java

@@ -0,0 +1,34 @@
+package com.zhentao.util;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.Security;
+import java.util.Base64;
+
+public class WXBizDataCryptUtil {
+
+    static {
+        // 添加 Bouncy Castle 提供者
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    public static String decryptData(String appId, String sessionKey, String encryptedData, String iv) throws Exception {
+        byte[] sessionKeyBytes = Base64.getDecoder().decode(sessionKey);
+        byte[] encryptedDataBytes = Base64.getDecoder().decode(encryptedData);
+        byte[] ivBytes = Base64.getDecoder().decode(iv);
+
+        SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKeyBytes, "AES");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
+
+        // 使用 PKCS7Padding
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
+        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
+
+        byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes);
+        return new String(decryptedBytes, StandardCharsets.UTF_8);
+    }
+}

+ 51 - 0
src/main/resources/mapper/MarketingCouponMapper.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhentao.common.orders.mapper.MarketingCouponMapper">
+
+    <resultMap id="BaseResultMap" type="com.zhentao.common.orders.domain.MarketingCoupon">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="getType" column="get_type" jdbcType="INTEGER"/>
+            <result property="activeId" column="active_id" jdbcType="INTEGER"/>
+            <result property="tacticsType" column="tactics_type" jdbcType="INTEGER"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="faceValue" column="face_value" jdbcType="DECIMAL"/>
+            <result property="imgUrl" column="img_url" jdbcType="VARCHAR"/>
+            <result property="getWay" column="get_way" jdbcType="INTEGER"/>
+            <result property="productType" column="product_type" jdbcType="INTEGER"/>
+            <result property="productValue" column="product_value" jdbcType="VARCHAR"/>
+            <result property="limitMinFlag" column="limit_min_flag" jdbcType="INTEGER"/>
+            <result property="limitMin" column="limit_min" jdbcType="DECIMAL"/>
+            <result property="validFlag" column="valid_flag" jdbcType="INTEGER"/>
+            <result property="validDays" column="valid_days" jdbcType="INTEGER"/>
+            <result property="startTime" column="start_time" jdbcType="TIMESTAMP"/>
+            <result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
+            <result property="getTimeLimit" column="get_time_limit" jdbcType="INTEGER"/>
+            <result property="getStartTime" column="get_start_time" jdbcType="TIMESTAMP"/>
+            <result property="getEndTime" column="get_end_time" jdbcType="TIMESTAMP"/>
+            <result property="totalLimit" column="total_limit" jdbcType="INTEGER"/>
+            <result property="totalNum" column="total_num" jdbcType="INTEGER"/>
+            <result property="status" column="status" jdbcType="INTEGER"/>
+            <result property="sort" column="sort" jdbcType="INTEGER"/>
+            <result property="navHref" column="nav_href" jdbcType="VARCHAR"/>
+            <result property="reversion" column="reversion" jdbcType="INTEGER"/>
+            <result property="createddTime" column="createdd_time" jdbcType="TIMESTAMP"/>
+            <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+            <result property="updatedTime" column="updated_time" jdbcType="TIMESTAMP"/>
+            <result property="updatedBy" column="updated_by" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,get_type,active_id,
+        tactics_type,name,face_value,
+        img_url,get_way,product_type,
+        product_value,limit_min_flag,limit_min,
+        valid_flag,valid_days,start_time,
+        end_time,get_time_limit,get_start_time,
+        get_end_time,total_limit,total_num,
+        status,sort,nav_href,
+        reversion,createdd_time,create_by,
+        updated_time,updated_by
+    </sql>
+</mapper>

+ 51 - 0
src/main/resources/mapper/MarketingCouponUserMapper.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhentao.common.orders.mapper.MarketingCouponUserMapper">
+
+    <resultMap id="BaseResultMap" type="com.zhentao.common.orders.domain.MarketingCouponUser">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="userName" column="user_name" jdbcType="VARCHAR"/>
+            <result property="mobile" column="mobile" jdbcType="VARCHAR"/>
+            <result property="couponId" column="coupon_id" jdbcType="INTEGER"/>
+            <result property="couponName" column="coupon_name" jdbcType="VARCHAR"/>
+            <result property="couponTacticsType" column="coupon_tactics_type" jdbcType="INTEGER"/>
+            <result property="tacticsTypeDesc" column="tactics_type_desc" jdbcType="VARCHAR"/>
+            <result property="couponType" column="coupon_type" jdbcType="INTEGER"/>
+            <result property="productValue" column="product_value" jdbcType="VARCHAR"/>
+            <result property="limitMinFlag" column="limit_min_flag" jdbcType="INTEGER"/>
+            <result property="limitMin" column="limit_min" jdbcType="DECIMAL"/>
+            <result property="typeName" column="type_name" jdbcType="VARCHAR"/>
+            <result property="faceValue" column="face_value" jdbcType="DECIMAL"/>
+            <result property="imgUrl" column="img_url" jdbcType="VARCHAR"/>
+            <result property="startTime" column="start_time" jdbcType="TIMESTAMP"/>
+            <result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
+            <result property="getTime" column="get_time" jdbcType="VARCHAR"/>
+            <result property="getWay" column="get_way" jdbcType="INTEGER"/>
+            <result property="usedTime" column="used_time" jdbcType="TIMESTAMP"/>
+            <result property="activeId" column="active_id" jdbcType="BIGINT"/>
+            <result property="status" column="status" jdbcType="INTEGER"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <result property="reversion" column="reversion" jdbcType="INTEGER"/>
+            <result property="statFlag" column="stat_flag" jdbcType="INTEGER"/>
+            <result property="createdTime" column="created_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="isReceive" column="is_receive" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,user_name,
+        mobile,coupon_id,coupon_name,
+        coupon_tactics_type,tactics_type_desc,coupon_type,
+        product_value,limit_min_flag,limit_min,
+        type_name,face_value,img_url,
+        start_time,end_time,get_time,
+        get_way,used_time,active_id,
+        status,remark,reversion,
+        stat_flag,created_time,update_time,
+        del_flag,is_receive
+    </sql>
+</mapper>

+ 28 - 0
src/main/resources/mapper/OrderDetailsMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhentao.common.orders.mapper.OrderDetailsMapper">
+
+    <resultMap id="BaseResultMap" type="com.zhentao.common.orders.domain.OrderDetails">
+            <id property="detailId" column="detail_id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="orderId" column="order_id" jdbcType="BIGINT"/>
+            <result property="courseId" column="course_id" jdbcType="BIGINT"/>
+            <result property="skuId" column="sku_id" jdbcType="BIGINT"/>
+            <result property="courseName" column="course_name" jdbcType="VARCHAR"/>
+            <result property="originalFee" column="original_fee" jdbcType="DECIMAL"/>
+            <result property="actualFee" column="actual_fee" jdbcType="DECIMAL"/>
+            <result property="discountAmount" column="discount_amount" jdbcType="DECIMAL"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        detail_id,user_id,order_id,
+        course_id,sku_id,course_name,
+        original_fee,actual_fee,discount_amount,
+        create_time,update_time,remark
+    </sql>
+</mapper>

+ 34 - 0
src/main/resources/mapper/OrdersMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhentao.common.orders.mapper.OrdersMapper">
+
+    <resultMap id="BaseResultMap" type="com.zhentao.common.orders.domain.Orders">
+            <id property="ordersId" column="orders_id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="couponId" column="coupon_id" jdbcType="BIGINT"/>
+            <result property="courseName" column="course_name" jdbcType="VARCHAR"/>
+            <result property="paymentMethod" column="payment_method" jdbcType="INTEGER"/>
+            <result property="paymentStatus" column="payment_status" jdbcType="INTEGER"/>
+            <result property="paymentTime" column="payment_time" jdbcType="TIMESTAMP"/>
+            <result property="orderStatus" column="order_status" jdbcType="INTEGER"/>
+            <result property="originalFee" column="original_fee" jdbcType="DECIMAL"/>
+            <result property="actualFee" column="actual_fee" jdbcType="DECIMAL"/>
+            <result property="discountAmount" column="discount_amount" jdbcType="DECIMAL"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
+            <result property="isRefund" column="is_refund" jdbcType="INTEGER"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        orders_id,user_id,coupon_id,
+        course_name,payment_method,payment_status,
+        payment_time,order_status,original_fee,
+        actual_fee,discount_amount,create_time,
+        update_time,is_delete,is_refund,
+        remark
+    </sql>
+</mapper>