yu_u66 1 settimana fa
parent
commit
2ae5eadb64
45 ha cambiato i file con 1821 aggiunte e 0 eliminazioni
  1. 6 0
      src/main/java/com/futu/course/commons/config/Dome.java
  2. 60 0
      src/main/java/com/futu/course/commons/config/RedisConfig.java
  3. 25 0
      src/main/java/com/futu/course/commons/config/RedissionConfig.java
  4. 53 0
      src/main/java/com/futu/course/commons/exceptions/RRException.java
  5. 73 0
      src/main/java/com/futu/course/commons/utils/SnowflakeIdWorker.java
  6. 114 0
      src/main/java/com/futu/course/commons/utils/TokenUtils.java
  7. 47 0
      src/main/java/com/futu/course/commons/vo/AppHttpCodeEnum.java
  8. 141 0
      src/main/java/com/futu/course/commons/vo/ResponseResult.java
  9. 31 0
      src/main/java/com/futu/course/orders/controller/CouponController.java
  10. 25 0
      src/main/java/com/futu/course/orders/controller/OrdersController.java
  11. 94 0
      src/main/java/com/futu/course/orders/domain/Coupons.java
  12. 111 0
      src/main/java/com/futu/course/orders/domain/OrderInfo.java
  13. 109 0
      src/main/java/com/futu/course/orders/domain/OrderItem.java
  14. 68 0
      src/main/java/com/futu/course/orders/domain/UserCoupon.java
  15. 13 0
      src/main/java/com/futu/course/orders/dto/AddOrderDto.java
  16. 9 0
      src/main/java/com/futu/course/orders/dto/OrderItemDto.java
  17. 18 0
      src/main/java/com/futu/course/orders/mapper/CouponsMapper.java
  18. 18 0
      src/main/java/com/futu/course/orders/mapper/OrderInfoMapper.java
  19. 18 0
      src/main/java/com/futu/course/orders/mapper/OrderItemMapper.java
  20. 18 0
      src/main/java/com/futu/course/orders/mapper/UserCouponMapper.java
  21. 13 0
      src/main/java/com/futu/course/orders/service/CouponsService.java
  22. 16 0
      src/main/java/com/futu/course/orders/service/OrderInfoService.java
  23. 13 0
      src/main/java/com/futu/course/orders/service/OrderItemService.java
  24. 13 0
      src/main/java/com/futu/course/orders/service/UserCouponService.java
  25. 22 0
      src/main/java/com/futu/course/orders/service/impl/CouponsServiceImpl.java
  26. 117 0
      src/main/java/com/futu/course/orders/service/impl/OrderInfoServiceImpl.java
  27. 22 0
      src/main/java/com/futu/course/orders/service/impl/OrderItemServiceImpl.java
  28. 22 0
      src/main/java/com/futu/course/orders/service/impl/UserCouponServiceImpl.java
  29. 34 0
      src/main/java/com/futu/course/sku/controller/SkuController.java
  30. 94 0
      src/main/java/com/futu/course/sku/domain/Sku.java
  31. 18 0
      src/main/java/com/futu/course/sku/mapper/SkuMapper.java
  32. 13 0
      src/main/java/com/futu/course/sku/service/SkuService.java
  33. 22 0
      src/main/java/com/futu/course/sku/service/impl/SkuServiceImpl.java
  34. 22 0
      src/main/java/com/futu/course/user/controller/UserController.java
  35. 117 0
      src/main/java/com/futu/course/user/domain/UserLogin.java
  36. 10 0
      src/main/java/com/futu/course/user/dto/LoginDto.java
  37. 18 0
      src/main/java/com/futu/course/user/mapper/UserLoginMapper.java
  38. 16 0
      src/main/java/com/futu/course/user/service/UserLoginService.java
  39. 50 0
      src/main/java/com/futu/course/user/service/impl/UserLoginServiceImpl.java
  40. 19 0
      src/main/resources/mapper/CouponsMapper.xml
  41. 20 0
      src/main/resources/mapper/OrderInfoMapper.xml
  42. 22 0
      src/main/resources/mapper/OrderItemMapper.xml
  43. 19 0
      src/main/resources/mapper/SkuMapper.xml
  44. 15 0
      src/main/resources/mapper/UserCouponMapper.xml
  45. 23 0
      src/main/resources/mapper/UserLoginMapper.xml

+ 6 - 0
src/main/java/com/futu/course/commons/config/Dome.java

@@ -0,0 +1,6 @@
+package com.futu.course.commons.config;
+
+public class Dome {
+
+    private static  final  Integer INTEGER=1;
+}

+ 60 - 0
src/main/java/com/futu/course/commons/config/RedisConfig.java

@@ -0,0 +1,60 @@
+package com.futu.course.commons.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+
+import org.springframework.context.annotation.Bean;
+
+import org.springframework.context.annotation.Configuration;
+
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+
+import org.springframework.data.redis.core.RedisTemplate;
+
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+
+@Configuration
+public class RedisConfig {
+
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+
+        template.setConnectionFactory(factory);
+
+
+        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
+
+        ObjectMapper om = new ObjectMapper();
+
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+
+        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+
+        serializer.setObjectMapper(om);
+
+
+        template.setKeySerializer(new StringRedisSerializer());
+
+        template.setHashKeySerializer(new StringRedisSerializer());
+
+        template.setValueSerializer(serializer);
+
+        template.setHashValueSerializer(serializer);
+
+        template.afterPropertiesSet();
+
+
+        return template;
+    }
+}

+ 25 - 0
src/main/java/com/futu/course/commons/config/RedissionConfig.java

@@ -0,0 +1,25 @@
+package com.futu.course.commons.config;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RedissionConfig {
+    @Value("${spring.redis.host}")
+    private String host;
+    @Value("${spring.redis.port}")
+    private Integer port;
+    @Value("${spring.redis.database}")
+    private Integer database;
+
+    @Bean
+    public RedissonClient RedissionClient() {
+        Config config = new Config();
+        config.useSingleServer().setAddress("redis://" + host + ":" + port).setDatabase(database);
+        return Redisson.create(config);
+    }
+}

+ 53 - 0
src/main/java/com/futu/course/commons/exceptions/RRException.java

@@ -0,0 +1,53 @@
+
+package com.futu.course.commons.exceptions;
+
+/**
+ * 自定义异常
+ *
+ */
+public class RRException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+
+    private String msg;
+    private int code = 500;
+
+    public RRException(String msg) {
+		super(msg);
+		this.msg = msg;
+	}
+
+	public RRException(String msg, Throwable e) {
+		super(msg, e);
+		this.msg = msg;
+	}
+
+	public RRException(String msg, int code) {
+		super(msg);
+		this.msg = msg;
+		this.code = code;
+	}
+
+	public RRException(String msg, int code, Throwable e) {
+		super(msg, e);
+		this.msg = msg;
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+
+}

+ 73 - 0
src/main/java/com/futu/course/commons/utils/SnowflakeIdWorker.java

@@ -0,0 +1,73 @@
+package com.futu.course.commons.utils;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class SnowflakeIdWorker {
+    // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
+    private final long twepoch = 1288834974657L;
+    // 机器标识位数
+    private final long workerIdBits = 5L;
+    // 数据标识位数
+    private final long datacenterIdBits = 5L;
+    // 支持的最大机器标识数
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+    // 支持的最大数据标识数
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+    // 序列在id中占的位数
+    private final long sequenceBits = 12L;
+    // 机器ID向左移12位
+    private final long workerIdShift = sequenceBits;
+    // 数据标识符向左移17位(12+5)
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+    // 时间戳向左移22位(5+5+12)
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+    private long workerId;
+    private long datacenterId;
+    private long sequence = 0L;
+    private long lastTimestamp = -1L;
+    private final AtomicLong sequenceGenerator = new AtomicLong(0L);
+
+    public SnowflakeIdWorker(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0L;
+        }
+        lastTimestamp = timestamp;
+        return ((timestamp - twepoch) << timestampLeftShift) |
+                (datacenterId << datacenterIdShift) |
+                (workerId << workerIdShift) |
+                sequence;
+    }
+
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+}

+ 114 - 0
src/main/java/com/futu/course/commons/utils/TokenUtils.java

@@ -0,0 +1,114 @@
+package com.futu.course.commons.utils;
+
+
+
+import com.futu.course.commons.exceptions.RRException;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.bind.DatatypeConverter;
+import java.security.Key;
+import java.util.Date;
+
+/**
+ * 生成Token工具类
+ */
+public class TokenUtils {
+
+    /**
+     * 签名秘钥
+     */
+    public static final String SECRET = "cjyfutu1688";
+
+    /**
+     * 生成token
+     * @param id 一般传入userName
+     * @return
+     */
+    public static String createJwtToken(String id){
+        String issuer = "www.futureading.com";
+        String subject = "65532781@qq.com";
+        long ttlMillis = System.currentTimeMillis();
+        return createJwtToken(id, issuer, subject, ttlMillis);
+    }
+
+    /**
+     * 生成Token
+     *
+     * @param id
+     *            编号
+     * @param issuer
+     *            该JWT的签发者,是否使用是可选的
+     * @param subject
+     *            该JWT所面向的用户,是否使用是可选的;
+     * @param ttlMillis
+     *            签发时间
+     * @return token String
+     */
+    public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
+
+        // 签名算法 ,将对token进行签名
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+
+        // 生成签发时间
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+
+        // 通过秘钥签名JWT
+        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
+        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
+
+        // Let's set the JWT Claims
+        JwtBuilder builder = Jwts.builder().setId(id)
+                .setIssuedAt(now)
+                .setSubject(subject)
+                .setIssuer(issuer)
+                .signWith(signatureAlgorithm, signingKey);
+
+        // if it has been specified, let's add the expiration
+        if (ttlMillis >= 0) {
+            long expMillis = nowMillis + ttlMillis;
+            Date exp = new Date(expMillis);
+            builder.setExpiration(exp);
+        }
+
+        // Builds the JWT and serializes it to a compact, URL-safe string
+        return builder.compact();
+
+    }
+
+    // Sample method to validate and read the JWT
+    public static Claims parseJWT(String jwt) {
+        // This line will throw an exception if it is not a signed JWS (as expected)
+        Claims claims = Jwts.parser()
+                .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET))
+                .parseClaimsJws(jwt).getBody();
+        return claims;
+    }
+
+    public static Long getUserId(String token){
+        Claims claims = null;
+        try {
+            claims = TokenUtils.parseJWT(token);
+        } catch (Exception e) {
+            throw new RRException("token错误,请重新登录",101);
+        }
+
+        if(null==claims) {
+            throw new RRException("token错误,请重新登录",101);
+        }
+        String id = claims.getId();
+        Long userId=Long.valueOf(id);
+
+        return userId;
+
+
+    }
+
+    public static void main(String[] args) {
+        System.out.println(TokenUtils.createJwtToken("admin"));
+    }
+}

+ 47 - 0
src/main/java/com/futu/course/commons/vo/AppHttpCodeEnum.java

@@ -0,0 +1,47 @@
+package com.futu.course.commons.vo;
+
+public enum AppHttpCodeEnum {
+    // 成功段固定为200
+    SUCCESS(200, "操作成功"),
+    // 登录段1~50
+    NEED_LOGIN(1, "需要登录后操作"),
+    LOGIN_PASSWORD_ERROR(2, "密码错误"),
+    // TOKEN50~100
+    TOKEN_INVALID(50, "无效的TOKEN"),
+    TOKEN_EXPIRE(51, "TOKEN已过期"),
+    TOKEN_REQUIRE(52, "TOKEN是必须的"),
+    // SIGN验签 100~120
+    SIGN_INVALID(100, "无效的SIGN"),
+    SIG_TIMEOUT(101, "SIGN已过期"),
+    // 参数错误 500~1000
+    PARAM_REQUIRE(500, "缺少参数"),
+    PARAM_INVALID(501, "无效参数"),
+    PARAM_IMAGE_FORMAT_ERROR(502, "图片格式有误"),
+    SERVER_ERROR(503, "服务器内部错误"),
+    // 数据错误 1000~2000
+    DATA_EXIST(1000, "数据已经存在"),
+    AP_USER_DATA_NOT_EXIST(1001, "ApUser数据不存在"),
+    DATA_NOT_EXIST(1002, "数据不存在"),
+    // 数据错误 3000~3500
+    NO_OPERATOR_AUTH(3000, "无权限操作"),
+    NEED_ADMIND(3001, "需要管理员权限"),
+
+    // 自媒体文章错误 3501~3600
+    MATERIASL_REFERENCE_FAIL(3501, "素材引用失效");
+
+    int code;
+    String errorMessage;
+
+    AppHttpCodeEnum(int code, String errorMessage) {
+        this.code = code;
+        this.errorMessage = errorMessage;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+}

+ 141 - 0
src/main/java/com/futu/course/commons/vo/ResponseResult.java

@@ -0,0 +1,141 @@
+package com.futu.course.commons.vo;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 通用的结果返回类
+ *
+ * @param <T>
+ */
+public class ResponseResult<T> implements Serializable {
+
+    private String host;
+
+    private Integer code;
+
+    private String errorMessage;
+
+    private T data;
+
+    public ResponseResult() {
+        this.code = 200;
+    }
+
+    public ResponseResult(Integer code, T data) {
+        this.code = code;
+        this.data = data;
+    }
+
+    public ResponseResult(Integer code, String msg, T data) {
+        this.code = code;
+        this.errorMessage = msg;
+        this.data = data;
+    }
+
+    public ResponseResult(Integer code, String msg) {
+        this.code = code;
+        this.errorMessage = msg;
+    }
+
+    public static ResponseResult errorResult(int code, String msg) {
+        ResponseResult result = new ResponseResult();
+        return result.error(code, msg);
+    }
+
+    public static ResponseResult okResult(int code, String msg) {
+        ResponseResult result = new ResponseResult();
+        return result.ok(code, null, msg);
+    }
+
+    public static ResponseResult okResult(int code, String msg, Object data) {
+        ResponseResult result = new ResponseResult();
+        return result.ok(code, data, msg);
+    }
+
+    public static ResponseResult okResult(Object data) {
+        ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getErrorMessage());
+        if (data != null) {
+            result.setData(data);
+        }
+        return result;
+    }
+
+    public static ResponseResult errorResult(AppHttpCodeEnum enums) {
+        return setAppHttpCodeEnum(enums, enums.getErrorMessage());
+    }
+
+    public static ResponseResult errorResult(AppHttpCodeEnum enums, String errorMessage) {
+        return setAppHttpCodeEnum(enums, errorMessage);
+    }
+
+    public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums) {
+        return okResult(enums.getCode(), enums.getErrorMessage());
+    }
+
+    private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String errorMessage) {
+        return okResult(enums.getCode(), errorMessage);
+    }
+
+    public ResponseResult<?> error(Integer code, String msg) {
+        this.code = code;
+        this.errorMessage = msg;
+        return this;
+    }
+
+    public ResponseResult<?> ok(Integer code, T data) {
+        this.code = code;
+        this.data = data;
+        return this;
+    }
+
+    public ResponseResult<?> ok(Integer code, T data, String msg) {
+        this.code = code;
+        this.data = data;
+        this.errorMessage = msg;
+        return this;
+    }
+
+    public ResponseResult<?> ok(T data) {
+        this.data = data;
+        return this;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+
+
+
+}

+ 31 - 0
src/main/java/com/futu/course/orders/controller/CouponController.java

@@ -0,0 +1,31 @@
+package com.futu.course.orders.controller;
+
+import com.futu.course.commons.utils.SnowflakeIdWorker;
+import com.futu.course.commons.vo.AppHttpCodeEnum;
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.orders.domain.Coupons;
+import com.futu.course.orders.service.CouponsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("coupon")
+public class CouponController {
+
+    @Autowired
+    private CouponsService service;
+
+
+    @PostMapping("addCoupon")
+    public ResponseResult addCoupon(@RequestBody Coupons dto)
+    {
+        SnowflakeIdWorker worker=new SnowflakeIdWorker(1,1);
+        dto.setId(worker.nextId());
+        dto.setCreateTime(new Date());
+        boolean b = service.save(dto);
+        return b?ResponseResult.okResult(dto):ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
+    }
+
+}

+ 25 - 0
src/main/java/com/futu/course/orders/controller/OrdersController.java

@@ -0,0 +1,25 @@
+package com.futu.course.orders.controller;
+
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.orders.dto.AddOrderDto;
+import com.futu.course.orders.service.OrderInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+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 OrdersController {
+
+    @Autowired
+    private OrderInfoService service;
+    @Transactional
+    @PostMapping("createOrder")
+    public ResponseResult createOrder(@RequestBody AddOrderDto dto)
+    {
+          return    service.createOrder(dto);
+    }
+}

+ 94 - 0
src/main/java/com/futu/course/orders/domain/Coupons.java

@@ -0,0 +1,94 @@
+package com.futu.course.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 coupons
+ */
+@TableName(value ="coupons")
+@Data
+public class Coupons implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private Long id;
+
+    /**
+     *
+     */
+    private Integer type;
+
+    /**
+     *
+     */
+    private BigDecimal minPrice;
+
+    /**
+     *
+     */
+    private BigDecimal totalValue;
+
+    /**
+     *
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Coupons other = (Coupons) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType()))
+            && (this.getMinPrice() == null ? other.getMinPrice() == null : this.getMinPrice().equals(other.getMinPrice()))
+            && (this.getTotalValue() == null ? other.getTotalValue() == null : this.getTotalValue().equals(other.getTotalValue()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getType() == null) ? 0 : getType().hashCode());
+        result = prime * result + ((getMinPrice() == null) ? 0 : getMinPrice().hashCode());
+        result = prime * result + ((getTotalValue() == null) ? 0 : getTotalValue().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", type=").append(type);
+        sb.append(", minPrice=").append(minPrice);
+        sb.append(", totalValue=").append(totalValue);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 111 - 0
src/main/java/com/futu/course/orders/domain/OrderInfo.java

@@ -0,0 +1,111 @@
+package com.futu.course.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_info
+ */
+@TableName(value ="order_info")
+@Data
+public class OrderInfo implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private Long id;
+
+    /**
+     *
+     */
+    private Long userId;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAount;
+
+    /**
+     * 优惠金额
+     */
+    private BigDecimal desAount;
+
+    /**
+     * 实付金额
+     */
+    private BigDecimal queAount;
+
+    /**
+     *
+     */
+    private Date createTime;
+
+    private Long couponId;
+    private Integer status;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        OrderInfo other = (OrderInfo) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
+            && (this.getTotalAount() == null ? other.getTotalAount() == null : this.getTotalAount().equals(other.getTotalAount()))
+            && (this.getDesAount() == null ? other.getDesAount() == null : this.getDesAount().equals(other.getDesAount()))
+            && (this.getQueAount() == null ? other.getQueAount() == null : this.getQueAount().equals(other.getQueAount()))
+            && (this.getCouponId() == null ? other.getCouponId() == null : this.getCouponId().equals(other.getCouponId()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        result = prime * result + ((getTotalAount() == null) ? 0 : getTotalAount().hashCode());
+        result = prime * result + ((getDesAount() == null) ? 0 : getDesAount().hashCode());
+        result = prime * result + ((getQueAount() == null) ? 0 : getQueAount().hashCode());
+        result = prime * result + ((getCouponId() == null) ? 0 : getCouponId().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", userId=").append(userId);
+        sb.append(", totalAount=").append(totalAount);
+        sb.append(", desAount=").append(desAount);
+        sb.append(", queAount=").append(queAount);
+        sb.append(", couponId=").append(couponId);
+        sb.append(", status=").append(status);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 109 - 0
src/main/java/com/futu/course/orders/domain/OrderItem.java

@@ -0,0 +1,109 @@
+package com.futu.course.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 lombok.Data;
+
+/**
+ * 
+ * @TableName order_item
+ */
+@TableName(value ="order_item")
+@Data
+public class OrderItem implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 
+     */
+    private Long userId;
+
+    /**
+     * 
+     */
+    private Long orderId;
+
+    /**
+     * 
+     */
+    private Integer quantity;
+
+    /**
+     * 
+     */
+    private BigDecimal price;
+
+    /**
+     * 
+     */
+    private BigDecimal subTotal;
+
+    /**
+     * 
+     */
+    private String status;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        OrderItem other = (OrderItem) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
+            && (this.getOrderId() == null ? other.getOrderId() == null : this.getOrderId().equals(other.getOrderId()))
+            && (this.getQuantity() == null ? other.getQuantity() == null : this.getQuantity().equals(other.getQuantity()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getSubTotal() == null ? other.getSubTotal() == null : this.getSubTotal().equals(other.getSubTotal()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        result = prime * result + ((getOrderId() == null) ? 0 : getOrderId().hashCode());
+        result = prime * result + ((getQuantity() == null) ? 0 : getQuantity().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getSubTotal() == null) ? 0 : getSubTotal().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", userId=").append(userId);
+        sb.append(", orderId=").append(orderId);
+        sb.append(", quantity=").append(quantity);
+        sb.append(", price=").append(price);
+        sb.append(", subTotal=").append(subTotal);
+        sb.append(", status=").append(status);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 68 - 0
src/main/java/com/futu/course/orders/domain/UserCoupon.java

@@ -0,0 +1,68 @@
+package com.futu.course.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 lombok.Data;
+
+/**
+ * 
+ * @TableName user_coupon
+ */
+@TableName(value ="user_coupon")
+@Data
+public class UserCoupon implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long userId;
+
+    /**
+     * 
+     */
+    private Long couponId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        UserCoupon other = (UserCoupon) that;
+        return (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
+            && (this.getCouponId() == null ? other.getCouponId() == null : this.getCouponId().equals(other.getCouponId()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        result = prime * result + ((getCouponId() == null) ? 0 : getCouponId().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", userId=").append(userId);
+        sb.append(", couponId=").append(couponId);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 13 - 0
src/main/java/com/futu/course/orders/dto/AddOrderDto.java

@@ -0,0 +1,13 @@
+package com.futu.course.orders.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddOrderDto {
+
+
+    private Long userId;
+    private List<OrderItemDto>dtos;
+}

+ 9 - 0
src/main/java/com/futu/course/orders/dto/OrderItemDto.java

@@ -0,0 +1,9 @@
+package com.futu.course.orders.dto;
+
+import lombok.Data;
+
+@Data
+public class OrderItemDto {
+    private Integer quantity;
+    private Long skuId;
+}

+ 18 - 0
src/main/java/com/futu/course/orders/mapper/CouponsMapper.java

@@ -0,0 +1,18 @@
+package com.futu.course.orders.mapper;
+
+import com.futu.course.orders.domain.Coupons;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author yuu
+* @description 针对表【coupons】的数据库操作Mapper
+* @createDate 2025-05-10 10:01:58
+* @Entity com.futu.course.orders.domain.Coupons
+*/
+public interface CouponsMapper extends BaseMapper<Coupons> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/futu/course/orders/mapper/OrderInfoMapper.java

@@ -0,0 +1,18 @@
+package com.futu.course.orders.mapper;
+
+import com.futu.course.orders.domain.OrderInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author yuu
+* @description 针对表【order_info】的数据库操作Mapper
+* @createDate 2025-05-10 10:01:58
+* @Entity com.futu.course.orders.domain.OrderInfo
+*/
+public interface OrderInfoMapper extends BaseMapper<OrderInfo> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/futu/course/orders/mapper/OrderItemMapper.java

@@ -0,0 +1,18 @@
+package com.futu.course.orders.mapper;
+
+import com.futu.course.orders.domain.OrderItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author yuu
+* @description 针对表【order_item】的数据库操作Mapper
+* @createDate 2025-05-10 10:01:58
+* @Entity com.futu.course.orders.domain.OrderItem
+*/
+public interface OrderItemMapper extends BaseMapper<OrderItem> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/com/futu/course/orders/mapper/UserCouponMapper.java

@@ -0,0 +1,18 @@
+package com.futu.course.orders.mapper;
+
+import com.futu.course.orders.domain.UserCoupon;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author yuu
+* @description 针对表【user_coupon】的数据库操作Mapper
+* @createDate 2025-05-10 10:02:29
+* @Entity com.futu.course.orders.domain.UserCoupon
+*/
+public interface UserCouponMapper extends BaseMapper<UserCoupon> {
+
+}
+
+
+
+

+ 13 - 0
src/main/java/com/futu/course/orders/service/CouponsService.java

@@ -0,0 +1,13 @@
+package com.futu.course.orders.service;
+
+import com.futu.course.orders.domain.Coupons;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author yuu
+* @description 针对表【coupons】的数据库操作Service
+* @createDate 2025-05-10 10:01:58
+*/
+public interface CouponsService extends IService<Coupons> {
+
+}

+ 16 - 0
src/main/java/com/futu/course/orders/service/OrderInfoService.java

@@ -0,0 +1,16 @@
+package com.futu.course.orders.service;
+
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.orders.domain.OrderInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.futu.course.orders.dto.AddOrderDto;
+
+/**
+* @author yuu
+* @description 针对表【order_info】的数据库操作Service
+* @createDate 2025-05-10 10:01:58
+*/
+public interface OrderInfoService extends IService<OrderInfo> {
+
+    ResponseResult createOrder(AddOrderDto dto);
+}

+ 13 - 0
src/main/java/com/futu/course/orders/service/OrderItemService.java

@@ -0,0 +1,13 @@
+package com.futu.course.orders.service;
+
+import com.futu.course.orders.domain.OrderItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author yuu
+* @description 针对表【order_item】的数据库操作Service
+* @createDate 2025-05-10 10:01:58
+*/
+public interface OrderItemService extends IService<OrderItem> {
+
+}

+ 13 - 0
src/main/java/com/futu/course/orders/service/UserCouponService.java

@@ -0,0 +1,13 @@
+package com.futu.course.orders.service;
+
+import com.futu.course.orders.domain.UserCoupon;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author yuu
+* @description 针对表【user_coupon】的数据库操作Service
+* @createDate 2025-05-10 10:02:29
+*/
+public interface UserCouponService extends IService<UserCoupon> {
+
+}

+ 22 - 0
src/main/java/com/futu/course/orders/service/impl/CouponsServiceImpl.java

@@ -0,0 +1,22 @@
+package com.futu.course.orders.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.orders.domain.Coupons;
+import com.futu.course.orders.service.CouponsService;
+import com.futu.course.orders.mapper.CouponsMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author yuu
+* @description 针对表【coupons】的数据库操作Service实现
+* @createDate 2025-05-10 10:01:58
+*/
+@Service
+public class CouponsServiceImpl extends ServiceImpl<CouponsMapper, Coupons>
+    implements CouponsService{
+
+}
+
+
+
+

+ 117 - 0
src/main/java/com/futu/course/orders/service/impl/OrderInfoServiceImpl.java

@@ -0,0 +1,117 @@
+package com.futu.course.orders.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.commons.utils.SnowflakeIdWorker;
+import com.futu.course.commons.utils.TokenUtils;
+import com.futu.course.commons.vo.AppHttpCodeEnum;
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.orders.domain.Coupons;
+import com.futu.course.orders.domain.OrderInfo;
+import com.futu.course.orders.domain.OrderItem;
+import com.futu.course.orders.domain.UserCoupon;
+import com.futu.course.orders.dto.AddOrderDto;
+import com.futu.course.orders.dto.OrderItemDto;
+import com.futu.course.orders.mapper.CouponsMapper;
+import com.futu.course.orders.mapper.UserCouponMapper;
+import com.futu.course.orders.service.OrderInfoService;
+import com.futu.course.orders.mapper.OrderInfoMapper;
+import com.futu.course.orders.service.OrderItemService;
+import com.futu.course.sku.domain.Sku;
+import com.futu.course.sku.mapper.SkuMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+* @author yuu
+* @description 针对表【order_info】的数据库操作Service实现
+* @createDate 2025-05-10 10:01:58
+*/
+@Service
+public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo>
+    implements OrderInfoService{
+
+    @Autowired
+    private OrderInfoMapper mapper;
+
+    @Autowired
+    private CouponsMapper couponsMapper;
+
+    @Autowired
+    private UserCouponMapper userCouponMapper;
+
+    @Autowired
+    private SkuMapper skuMapper;
+
+    @Autowired
+    private OrderItemService service;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Override
+    public ResponseResult createOrder(AddOrderDto dto) {
+
+        String token =(String) redisTemplate.opsForValue().get("user");
+        Long userId = TokenUtils.getUserId(token);
+        System.out.println(userId);
+        SnowflakeIdWorker worker=new SnowflakeIdWorker(1,1);
+        OrderInfo info = new OrderInfo();
+        info.setId(worker.nextId());
+
+
+        List<Sku> skus = skuMapper.selectBatchIds(dto.getDtos().stream().map(OrderItemDto::getSkuId).collect(Collectors.toList()));
+        HashMap<Long,Sku>map=new HashMap<>();
+        for (Sku sku : skus) {
+            map.put(sku.getId(),sku);
+        }
+        BigDecimal total = BigDecimal.ZERO;
+        List<OrderItem>items=new ArrayList<>();
+        for (OrderItemDto itemDto : dto.getDtos()) {
+            Sku sku = map.get(itemDto.getSkuId());
+            BigDecimal multiply = sku.getPrice().multiply(BigDecimal.valueOf(itemDto.getQuantity()));
+            total=total.add(multiply);
+            OrderItem item = new OrderItem();
+            item.setId(worker.nextId());
+            item.setOrderId(info.getId());
+            item.setPrice(sku.getPrice());
+            item.setStatus(null);
+            item.setQuantity(itemDto.getQuantity());
+            item.setSubTotal(multiply);
+            item.setUserId(userId);
+            items.add(item);
+
+        }
+        UserCoupon userCoupon = userCouponMapper.selectOne(new LambdaQueryWrapper<UserCoupon>().eq(UserCoupon::getUserId, userId));
+        Coupons coupons = couponsMapper.selectById(userCoupon.getCouponId());
+        System.out.println(coupons);
+        info.setUserId(userId);
+        info.setCreateTime(new Date());
+        info.setTotalAount(total);
+         info.setCouponId(coupons.getId());
+         info.setStatus(1);
+        info.setDesAount(coupons.getTotalValue());
+        info.setQueAount(total.subtract(coupons.getTotalValue()));
+        boolean b = service.saveBatch(items);
+        int insert = mapper.insert(info);
+        if (insert>0)
+        {
+          return   ResponseResult.okResult(info);
+        }
+        else {
+        return     ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
+        }
+
+    }
+}
+
+
+
+

+ 22 - 0
src/main/java/com/futu/course/orders/service/impl/OrderItemServiceImpl.java

@@ -0,0 +1,22 @@
+package com.futu.course.orders.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.orders.domain.OrderItem;
+import com.futu.course.orders.service.OrderItemService;
+import com.futu.course.orders.mapper.OrderItemMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author yuu
+* @description 针对表【order_item】的数据库操作Service实现
+* @createDate 2025-05-10 10:01:58
+*/
+@Service
+public class OrderItemServiceImpl extends ServiceImpl<OrderItemMapper, OrderItem>
+    implements OrderItemService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/futu/course/orders/service/impl/UserCouponServiceImpl.java

@@ -0,0 +1,22 @@
+package com.futu.course.orders.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.orders.domain.UserCoupon;
+import com.futu.course.orders.service.UserCouponService;
+import com.futu.course.orders.mapper.UserCouponMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author yuu
+* @description 针对表【user_coupon】的数据库操作Service实现
+* @createDate 2025-05-10 10:02:29
+*/
+@Service
+public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon>
+    implements UserCouponService{
+
+}
+
+
+
+

+ 34 - 0
src/main/java/com/futu/course/sku/controller/SkuController.java

@@ -0,0 +1,34 @@
+package com.futu.course.sku.controller;
+
+import com.futu.course.commons.utils.SnowflakeIdWorker;
+import com.futu.course.commons.vo.AppHttpCodeEnum;
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.sku.domain.Sku;
+import com.futu.course.sku.service.SkuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("sku")
+public class SkuController {
+
+
+    @Autowired
+    private SkuService service;
+
+
+    @PostMapping("addSku")
+    public ResponseResult addSku(@RequestBody Sku sku)
+    {
+        SnowflakeIdWorker worker=new SnowflakeIdWorker(1,1);
+        sku.setId(worker.nextId());
+        sku.setCreateBy(new Date());
+        boolean b = service.save(sku);
+        return b?ResponseResult.okResult(sku):ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
+    }
+}

+ 94 - 0
src/main/java/com/futu/course/sku/domain/Sku.java

@@ -0,0 +1,94 @@
+package com.futu.course.sku.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 sku
+ */
+@TableName(value ="sku")
+@Data
+public class Sku implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 
+     */
+    private String name;
+
+    /**
+     * 
+     */
+    private BigDecimal price;
+
+    /**
+     * 
+     */
+    private String address;
+
+    /**
+     * 
+     */
+    private Date createBy;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Sku other = (Sku) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress()))
+            && (this.getCreateBy() == null ? other.getCreateBy() == null : this.getCreateBy().equals(other.getCreateBy()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
+        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode());
+        result = prime * result + ((getCreateBy() == null) ? 0 : getCreateBy().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", name=").append(name);
+        sb.append(", price=").append(price);
+        sb.append(", address=").append(address);
+        sb.append(", createBy=").append(createBy);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 18 - 0
src/main/java/com/futu/course/sku/mapper/SkuMapper.java

@@ -0,0 +1,18 @@
+package com.futu.course.sku.mapper;
+
+import com.futu.course.sku.domain.Sku;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author yuu
+* @description 针对表【sku】的数据库操作Mapper
+* @createDate 2025-05-10 10:02:15
+* @Entity com.futu.course.sku.domain.Sku
+*/
+public interface SkuMapper extends BaseMapper<Sku> {
+
+}
+
+
+
+

+ 13 - 0
src/main/java/com/futu/course/sku/service/SkuService.java

@@ -0,0 +1,13 @@
+package com.futu.course.sku.service;
+
+import com.futu.course.sku.domain.Sku;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author yuu
+* @description 针对表【sku】的数据库操作Service
+* @createDate 2025-05-10 10:02:15
+*/
+public interface SkuService extends IService<Sku> {
+
+}

+ 22 - 0
src/main/java/com/futu/course/sku/service/impl/SkuServiceImpl.java

@@ -0,0 +1,22 @@
+package com.futu.course.sku.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.sku.domain.Sku;
+import com.futu.course.sku.service.SkuService;
+import com.futu.course.sku.mapper.SkuMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author yuu
+* @description 针对表【sku】的数据库操作Service实现
+* @createDate 2025-05-10 10:02:15
+*/
+@Service
+public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku>
+    implements SkuService{
+
+}
+
+
+
+

+ 22 - 0
src/main/java/com/futu/course/user/controller/UserController.java

@@ -0,0 +1,22 @@
+package com.futu.course.user.controller;
+
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.user.dto.LoginDto;
+import com.futu.course.user.service.UserLoginService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("user")
+public class UserController {
+
+    @Autowired
+    private UserLoginService service;
+
+
+    @PostMapping("login")
+    public ResponseResult login(@RequestBody LoginDto dto )
+    {
+        return  service.login(dto);
+    }
+}

+ 117 - 0
src/main/java/com/futu/course/user/domain/UserLogin.java

@@ -0,0 +1,117 @@
+package com.futu.course.user.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.util.Date;
+import lombok.Data;
+
+/**
+ * 
+ * @TableName user_login
+ */
+@TableName(value ="user_login")
+@Data
+public class UserLogin implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 
+     */
+    private Long openId;
+
+    /**
+     * 
+     */
+    private Long unionId;
+
+    /**
+     * 
+     */
+    private String sesseionKey;
+
+    /**
+     * 
+     */
+    private String username;
+
+    /**
+     * 
+     */
+    private String password;
+
+    /**
+     * 
+     */
+    private String phone;
+
+    /**
+     * 
+     */
+    private Date createBy;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        UserLogin other = (UserLogin) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getOpenId() == null ? other.getOpenId() == null : this.getOpenId().equals(other.getOpenId()))
+            && (this.getUnionId() == null ? other.getUnionId() == null : this.getUnionId().equals(other.getUnionId()))
+            && (this.getSesseionKey() == null ? other.getSesseionKey() == null : this.getSesseionKey().equals(other.getSesseionKey()))
+            && (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))
+            && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()))
+            && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
+            && (this.getCreateBy() == null ? other.getCreateBy() == null : this.getCreateBy().equals(other.getCreateBy()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getOpenId() == null) ? 0 : getOpenId().hashCode());
+        result = prime * result + ((getUnionId() == null) ? 0 : getUnionId().hashCode());
+        result = prime * result + ((getSesseionKey() == null) ? 0 : getSesseionKey().hashCode());
+        result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());
+        result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());
+        result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
+        result = prime * result + ((getCreateBy() == null) ? 0 : getCreateBy().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", openId=").append(openId);
+        sb.append(", unionId=").append(unionId);
+        sb.append(", sesseionKey=").append(sesseionKey);
+        sb.append(", username=").append(username);
+        sb.append(", password=").append(password);
+        sb.append(", phone=").append(phone);
+        sb.append(", createBy=").append(createBy);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 10 - 0
src/main/java/com/futu/course/user/dto/LoginDto.java

@@ -0,0 +1,10 @@
+package com.futu.course.user.dto;
+
+import lombok.Data;
+
+@Data
+public class LoginDto {
+
+    private String username;
+    private String password;
+        }

+ 18 - 0
src/main/java/com/futu/course/user/mapper/UserLoginMapper.java

@@ -0,0 +1,18 @@
+package com.futu.course.user.mapper;
+
+import com.futu.course.user.domain.UserLogin;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author yuu
+* @description 针对表【user_login】的数据库操作Mapper
+* @createDate 2025-05-10 10:02:39
+* @Entity com.futu.course.user.domain.UserLogin
+*/
+public interface UserLoginMapper extends BaseMapper<UserLogin> {
+
+}
+
+
+
+

+ 16 - 0
src/main/java/com/futu/course/user/service/UserLoginService.java

@@ -0,0 +1,16 @@
+package com.futu.course.user.service;
+
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.user.domain.UserLogin;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.futu.course.user.dto.LoginDto;
+
+/**
+* @author yuu
+* @description 针对表【user_login】的数据库操作Service
+* @createDate 2025-05-10 10:02:39
+*/
+public interface UserLoginService extends IService<UserLogin> {
+
+    ResponseResult login(LoginDto dto);
+}

+ 50 - 0
src/main/java/com/futu/course/user/service/impl/UserLoginServiceImpl.java

@@ -0,0 +1,50 @@
+package com.futu.course.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.commons.utils.TokenUtils;
+import com.futu.course.commons.vo.AppHttpCodeEnum;
+import com.futu.course.commons.vo.ResponseResult;
+import com.futu.course.user.domain.UserLogin;
+import com.futu.course.user.dto.LoginDto;
+import com.futu.course.user.service.UserLoginService;
+import com.futu.course.user.mapper.UserLoginMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+* @author yuu
+* @description 针对表【user_login】的数据库操作Service实现
+* @createDate 2025-05-10 10:02:39
+*/
+@Service
+public class UserLoginServiceImpl extends ServiceImpl<UserLoginMapper, UserLogin>
+    implements UserLoginService{
+
+    @Autowired
+    private UserLoginMapper mapper;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Override
+    public ResponseResult login(LoginDto dto) {
+
+        System.out.println(dto);
+        UserLogin login = mapper.selectOne(new LambdaQueryWrapper<UserLogin>().eq(UserLogin::getUsername, dto.getUsername()).eq(UserLogin::getPassword, dto.getPassword()));
+        if (login!=null)
+        {
+            String token = TokenUtils.createJwtToken(login.getId().toString());
+            redisTemplate.opsForValue().set("user",token,1, TimeUnit.DAYS);
+            return ResponseResult.okResult(token);
+        }else {
+            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
+        }
+    }
+}
+
+
+
+

+ 19 - 0
src/main/resources/mapper/CouponsMapper.xml

@@ -0,0 +1,19 @@
+<?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.futu.course.orders.mapper.CouponsMapper">
+
+    <resultMap id="BaseResultMap" type="com.futu.course.orders.domain.Coupons">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="type" column="type" jdbcType="VARCHAR"/>
+            <result property="minPrice" column="min_price" jdbcType="DECIMAL"/>
+            <result property="totalValue" column="total_value" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,type,min_price,
+        total_value,create_time
+    </sql>
+</mapper>

+ 20 - 0
src/main/resources/mapper/OrderInfoMapper.xml

@@ -0,0 +1,20 @@
+<?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.futu.course.orders.mapper.OrderInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.futu.course.orders.domain.OrderInfo">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="totalAount" column="total_aount" jdbcType="VARCHAR"/>
+            <result property="desAount" column="des_aount" jdbcType="VARCHAR"/>
+            <result property="queAount" column="que_aount" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,total_aount,
+        des_aount,que_aount,create_time
+    </sql>
+</mapper>

+ 22 - 0
src/main/resources/mapper/OrderItemMapper.xml

@@ -0,0 +1,22 @@
+<?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.futu.course.orders.mapper.OrderItemMapper">
+
+    <resultMap id="BaseResultMap" type="com.futu.course.orders.domain.OrderItem">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="orderId" column="order_id" jdbcType="BIGINT"/>
+            <result property="quantity" column="quantity" jdbcType="INTEGER"/>
+            <result property="price" column="price" jdbcType="DECIMAL"/>
+            <result property="subTotal" column="sub_total" jdbcType="DECIMAL"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,order_id,
+        quantity,price,sub_total,
+        status
+    </sql>
+</mapper>

+ 19 - 0
src/main/resources/mapper/SkuMapper.xml

@@ -0,0 +1,19 @@
+<?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.futu.course.sku.mapper.SkuMapper">
+
+    <resultMap id="BaseResultMap" type="com.futu.course.sku.domain.Sku">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="price" column="price" jdbcType="DECIMAL"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="createBy" column="create_by" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,name,price,
+        address,create_by
+    </sql>
+</mapper>

+ 15 - 0
src/main/resources/mapper/UserCouponMapper.xml

@@ -0,0 +1,15 @@
+<?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.futu.course.orders.mapper.UserCouponMapper">
+
+    <resultMap id="BaseResultMap" type="com.futu.course.orders.domain.UserCoupon">
+            <id property="userId" column="user_id" jdbcType="BIGINT"/>
+            <result property="couponId" column="coupon_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        user_id,coupon_id
+    </sql>
+</mapper>

+ 23 - 0
src/main/resources/mapper/UserLoginMapper.xml

@@ -0,0 +1,23 @@
+<?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.futu.course.user.mapper.UserLoginMapper">
+
+    <resultMap id="BaseResultMap" type="com.futu.course.user.domain.UserLogin">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="openId" column="open_id" jdbcType="BIGINT"/>
+            <result property="unionId" column="union_id" jdbcType="BIGINT"/>
+            <result property="sesseionKey" column="sesseion_key" jdbcType="VARCHAR"/>
+            <result property="username" column="username" jdbcType="VARCHAR"/>
+            <result property="password" column="password" jdbcType="VARCHAR"/>
+            <result property="phone" column="phone" jdbcType="VARCHAR"/>
+            <result property="createBy" column="create_by" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,open_id,union_id,
+        sesseion_key,username,password,
+        phone,create_by
+    </sql>
+</mapper>