diff --git a/group-auth/src/main/java/com/group/auth/service/impl/AuthServiceImpl.java b/group-auth/src/main/java/com/group/auth/service/impl/AuthServiceImpl.java
index 3d3800a..6378f1e 100644
--- a/group-auth/src/main/java/com/group/auth/service/impl/AuthServiceImpl.java
+++ b/group-auth/src/main/java/com/group/auth/service/impl/AuthServiceImpl.java
@@ -2,14 +2,13 @@ package com.group.auth.service.impl;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
-import com.group.auth.feign.UserService;
import com.group.auth.service.AuthService;
import com.group.auth.strategy.LoginContext;
import com.group.auth.strategy.LoginType;
import com.group.common.config.JwtUtils;
import com.group.common.constants.JwtConstants;
import com.group.common.constants.TokenConstants;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
import com.group.common.domin.request.ReqLogin;
import com.group.common.redis.RedisCache;
import com.group.common.result.R;
@@ -17,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
-import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
diff --git a/group-auth/src/main/java/com/group/auth/strategy/LoginByName.java b/group-auth/src/main/java/com/group/auth/strategy/LoginByName.java
index 61e76e4..e8a6d4c 100644
--- a/group-auth/src/main/java/com/group/auth/strategy/LoginByName.java
+++ b/group-auth/src/main/java/com/group/auth/strategy/LoginByName.java
@@ -2,7 +2,7 @@ package com.group.auth.strategy;
import com.alibaba.fastjson.JSON;
import com.group.auth.feign.UserService;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
import com.group.common.domin.request.ReqLogin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
diff --git a/group-auth/src/main/java/com/group/auth/strategy/LoginByPhone.java b/group-auth/src/main/java/com/group/auth/strategy/LoginByPhone.java
index 52d6928..f394f37 100644
--- a/group-auth/src/main/java/com/group/auth/strategy/LoginByPhone.java
+++ b/group-auth/src/main/java/com/group/auth/strategy/LoginByPhone.java
@@ -2,9 +2,8 @@ package com.group.auth.strategy;
import com.alibaba.fastjson.JSON;
import com.group.auth.feign.UserService;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
import com.group.common.domin.request.ReqLogin;
-import com.group.common.handle.BizException;
import com.group.common.redis.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
diff --git a/group-auth/src/main/java/com/group/auth/strategy/LoginType.java b/group-auth/src/main/java/com/group/auth/strategy/LoginType.java
index 4227312..546e796 100644
--- a/group-auth/src/main/java/com/group/auth/strategy/LoginType.java
+++ b/group-auth/src/main/java/com/group/auth/strategy/LoginType.java
@@ -1,6 +1,6 @@
package com.group.auth.strategy;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
import com.group.common.domin.request.ReqLogin;
diff --git a/group-common/pom.xml b/group-common/pom.xml
index 885ce42..57631c0 100644
--- a/group-common/pom.xml
+++ b/group-common/pom.xml
@@ -19,6 +19,10 @@
+
+ org.springframework.boot
+ spring-boot-starter-web
+
org.springframework.cloud
@@ -134,5 +138,15 @@
xxl-job-core
2.3.0
+
+ org.redisson
+ redisson
+ 3.16.0
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.15.1
+
\ No newline at end of file
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/CouponEntity.java b/group-common/src/main/java/com/group/common/domin/pojo/CouponEntity.java
similarity index 95%
rename from group-module/group-user/src/main/java/com/group/user/pojo/CouponEntity.java
rename to group-common/src/main/java/com/group/common/domin/pojo/CouponEntity.java
index fdc8dfb..383d2da 100644
--- a/group-module/group-user/src/main/java/com/group/user/pojo/CouponEntity.java
+++ b/group-common/src/main/java/com/group/common/domin/pojo/CouponEntity.java
@@ -1,4 +1,4 @@
-package com.group.user.pojo;
+package com.group.common.domin.pojo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
diff --git a/group-common/src/main/java/com/group/common/domin/pojo/KillOrderEntity.java b/group-common/src/main/java/com/group/common/domin/pojo/KillOrderEntity.java
new file mode 100644
index 0000000..a4f5d77
--- /dev/null
+++ b/group-common/src/main/java/com/group/common/domin/pojo/KillOrderEntity.java
@@ -0,0 +1,42 @@
+package com.group.common.domin.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 秒杀订单表
+ */
+@Data
+@TableName("t_kill_order")
+public class KillOrderEntity {
+ /**
+ * 秒杀订单主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id ;
+ /**
+ * 秒杀商品id
+ */
+ private Integer goodsId ;
+ /**
+ * 购买人id
+ */
+ private Integer userId ;
+ /**
+ * 秒杀订单编号
+ */
+ private String killId ;
+ /**
+ * 秒杀订单状态 1-未支付 2-支付成功 3-支付失败
+ */
+ private Integer killState ;
+ /**
+ * 秒杀订单创建时间
+ */
+ private Date orderCreate ;
+
+}
diff --git a/group-common/src/main/java/com/group/common/domin/pojo/PayDetail.java b/group-common/src/main/java/com/group/common/domin/pojo/PayDetail.java
new file mode 100644
index 0000000..b19ea0f
--- /dev/null
+++ b/group-common/src/main/java/com/group/common/domin/pojo/PayDetail.java
@@ -0,0 +1,54 @@
+package com.group.common.domin.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 订单支付详情类
+ */
+@TableName("t_pay_detail")
+@Data
+@Builder
+public class PayDetail {
+ /**
+ *
+ */
+ @TableId
+ private Integer payId ;
+ /**
+ * 订单支付金额
+ */
+ @TableField("pay_title")
+ private BigDecimal payTitle ;
+ /**
+ * 订单id
+ */
+ @TableField("pay_order")
+ private Integer payOrder ;
+ /**
+ * 支付宝编号
+ */
+ @TableField("pay_pay")
+ private String payPay ;
+ /**
+ * 明细状态 1-待支付 2-已支付 3-支付失败
+ */
+ @TableField("pay_state")
+ private Integer payState ;
+ /**
+ * 创建时间
+ */
+ @TableField("pay_create")
+ private Date payCreate ;
+ /**
+ * 支付时间
+ */
+ @TableField("pay_payed")
+ private Date payPayed ;
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/RegistrationEntity.java b/group-common/src/main/java/com/group/common/domin/pojo/RegistrationEntity.java
similarity index 95%
rename from group-module/group-user/src/main/java/com/group/user/pojo/RegistrationEntity.java
rename to group-common/src/main/java/com/group/common/domin/pojo/RegistrationEntity.java
index 9cc5277..3452e5d 100644
--- a/group-module/group-user/src/main/java/com/group/user/pojo/RegistrationEntity.java
+++ b/group-common/src/main/java/com/group/common/domin/pojo/RegistrationEntity.java
@@ -1,4 +1,4 @@
-package com.group.user.pojo;
+package com.group.common.domin.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
diff --git a/group-common/src/main/java/com/group/common/domin/pojo/SeckillEntity.java b/group-common/src/main/java/com/group/common/domin/pojo/SeckillEntity.java
new file mode 100644
index 0000000..4b1e423
--- /dev/null
+++ b/group-common/src/main/java/com/group/common/domin/pojo/SeckillEntity.java
@@ -0,0 +1,49 @@
+package com.group.common.domin.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 秒杀表
+
+ *
+ * @author song
+ * @email song@gmail.com
+ * @date 2024-04-20 10:24:59
+ */
+@Data
+@TableName("t_seckill")
+public class SeckillEntity implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 秒杀id
+ */
+ @TableId
+ private Integer seckillId;
+ /**
+ * 商品详情id
+ */
+ private Integer seckillGoodsDetail;
+ /**
+ * 秒杀活动商品库存
+ */
+ private String seckillInventory;
+ /**
+ * 创建时间
+ */
+ private Date seckillCreate;
+ /**
+ * 秒杀价格
+ */
+ private BigDecimal seckillPrice;
+ /**
+ * 场次id
+ */
+ private Integer sessionId;
+}
diff --git a/group-common/src/main/java/com/group/common/domin/pojo/SessionEntity.java b/group-common/src/main/java/com/group/common/domin/pojo/SessionEntity.java
new file mode 100644
index 0000000..0bf000c
--- /dev/null
+++ b/group-common/src/main/java/com/group/common/domin/pojo/SessionEntity.java
@@ -0,0 +1,26 @@
+package com.group.common.domin.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 场次实体表
+ */
+@Data
+@TableName("t_session")
+public class SessionEntity {
+ /**
+ * 场次id
+ */
+ private Integer sessionId;
+ /**
+ * 场次开始id
+ */
+ private Date sessionBegin;
+ /**
+ * 场次结束id
+ */
+ private Date sessionEnd;
+}
diff --git a/group-common/src/main/java/com/group/common/domin/UserEntity.java b/group-common/src/main/java/com/group/common/domin/pojo/UserEntity.java
similarity index 62%
rename from group-common/src/main/java/com/group/common/domin/UserEntity.java
rename to group-common/src/main/java/com/group/common/domin/pojo/UserEntity.java
index c5ba216..32330d7 100644
--- a/group-common/src/main/java/com/group/common/domin/UserEntity.java
+++ b/group-common/src/main/java/com/group/common/domin/pojo/UserEntity.java
@@ -1,5 +1,6 @@
-package com.group.common.domin;
+package com.group.common.domin.pojo;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -29,34 +30,57 @@ public class UserEntity implements Serializable {
/**
* 用户名
*/
+ @TableField("user_name")
private String userName;
/**
* 用户密码
*/
+ @TableField("user_pwd")
private String userPwd;
/**
* 用户手机
*/
+ @TableField("user_phone")
private String userPhone;
/**
* 会员登记
*/
+ @TableField("user_honor")
private Integer userHonor;
/**
* 用户余额
*/
+ @TableField("user_residue")
private BigDecimal userResidue;
/**
* 用户积分
*/
+ @TableField("user_score")
private Integer userScore;
/**
* 用户角色(0-普通用户 1-团长 2-客服)
*/
+ @TableField("user_role")
private Integer userRole;
/**
* 用户地址
*/
+ @TableField("user_address")
private String userAddress;
+ /**
+ * 身份证号
+ */
+ @TableField("user_card")
+ private String userCard;
+ /**
+ * 用户真实姓名
+ */
+ @TableField("user_real_name")
+ private String userRealName;
+ /**
+ * 用户户籍所在地
+ */
+ @TableField("user_real_address")
+ private String userRealAddress;
}
diff --git a/group-common/src/main/java/com/group/common/redis/RedisCache.java b/group-common/src/main/java/com/group/common/redis/RedisCache.java
index e244403..400a764 100644
--- a/group-common/src/main/java/com/group/common/redis/RedisCache.java
+++ b/group-common/src/main/java/com/group/common/redis/RedisCache.java
@@ -257,4 +257,11 @@ public class RedisCache {
public Collection keys (final String pattern) {
return redisTemplate.keys(pattern);
}
+
+ /**
+ * 将键对应的值递减
+ */
+ public void decreaseKey(String key){
+ redisTemplate.opsForValue().decrement(key);
+ }
}
diff --git a/group-common/src/main/java/com/group/common/redis/RedissonConfig.java b/group-common/src/main/java/com/group/common/redis/RedissonConfig.java
new file mode 100644
index 0000000..488266b
--- /dev/null
+++ b/group-common/src/main/java/com/group/common/redis/RedissonConfig.java
@@ -0,0 +1,10 @@
+package com.group.common.redis;
+
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * redisson配置类
+ */
+@Configuration
+public class RedissonConfig {
+}
diff --git a/group-common/src/main/java/com/group/common/util/UserUtil.java b/group-common/src/main/java/com/group/common/util/UserUtil.java
new file mode 100644
index 0000000..f66ca7e
--- /dev/null
+++ b/group-common/src/main/java/com/group/common/util/UserUtil.java
@@ -0,0 +1,16 @@
+package com.group.common.util;
+
+
+import com.group.common.constants.JwtConstants;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 用户工具类
+ */
+public class UserUtil {
+ public static Integer getUserId(HttpServletRequest servletRequest){
+ return Integer.valueOf(servletRequest.getHeader(JwtConstants.DETAILS_USER_ID));
+ }
+}
diff --git a/group-gateway/src/main/java/com/group/gateway/config/GatewaySentinelConfig.java b/group-gateway/src/main/java/com/group/gateway/config/GatewaySentinelConfig.java
deleted file mode 100644
index 201ba01..0000000
--- a/group-gateway/src/main/java/com/group/gateway/config/GatewaySentinelConfig.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.group.gateway.config;
-
-import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
-import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
-import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
-import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.http.codec.ServerCodecConfigurer;
-import org.springframework.web.reactive.result.view.ViewResolver;
-
-import javax.annotation.PostConstruct;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @deprecation: 网关限流控件
- * @author DongZl
- */
-@Configuration
-public class GatewaySentinelConfig {
- /**
- * 查看解析器
- */
- private final List viewResolvers;
- /**
- * 服务器编解码器配置
- */
- private final ServerCodecConfigurer serverCodecConfigurer;
- public GatewaySentinelConfig(ObjectProvider> viewResolversProvider,
- ServerCodecConfigurer serverCodecConfigurer) {
- this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
- this.serverCodecConfigurer = serverCodecConfigurer;
- }
- /**
- * Sentinel 网关块异常处理程序
- * @return
- */
- @Bean
- @Order(Ordered.HIGHEST_PRECEDENCE)
- public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
- // 给 Spring Cloud Gateway 注册块异常处理程序。
- return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
- }
-
- /**
- * 初始化网关配置
- */
- @PostConstruct
- public void doInit() {
- initGatewayRules();
- }
- /**
- * 配置限流规则
- */
- private void initGatewayRules() {
- Set rules = new HashSet<>();
- rules.add(new GatewayFlowRule("cloud-user")
- // 限流阈值
- .setCount(1)
- // 统计时间窗口,单位是秒,默认是 1 秒
- .setIntervalSec(5)
- );
- //添加到限流规则当中
- GatewayRuleManager.loadRules(rules);
- }
-}
diff --git a/group-gateway/src/main/resources/bootstrap.yml b/group-gateway/src/main/resources/bootstrap.yml
index 1a69b08..22be892 100644
--- a/group-gateway/src/main/resources/bootstrap.yml
+++ b/group-gateway/src/main/resources/bootstrap.yml
@@ -14,6 +14,7 @@ spring:
allow-circular-references: true
# 允许定义相同的bean对象 去覆盖原有的
allow-bean-definition-overriding: true
+ web-application-type: reactive
cloud:
nacos:
discovery:
@@ -26,4 +27,4 @@ spring:
file-extension: yml
# 共享配置
shared-configs:
- - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
\ No newline at end of file
diff --git a/group-module/group-user/src/main/java/com/group/user/config/CheckLifeImpl.java b/group-module/group-user/src/main/java/com/group/user/config/CheckLifeImpl.java
new file mode 100644
index 0000000..7e318f4
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/config/CheckLifeImpl.java
@@ -0,0 +1,49 @@
+package com.group.user.config;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson.JSON;
+import com.group.common.result.R;
+import com.group.user.pojo.SelfDTO;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Console;
+import java.util.HashMap;
+import java.util.Objects;
+
+/**
+ * 身份检测实现类
+ */
+@Component
+@Log4j2
+public class CheckLifeImpl {
+
+
+ @Value("${song.life.url}")
+ private String httpUrl;
+
+ @Value("${song.appCode}")
+ private String appCode;
+
+ public R checkLife(String url,String motions){
+
+ HashMap params = new HashMap<>();
+ params.put("complexity", "1");
+ params.put("motions", motions);
+ params.put("url", url);
+ String body = HttpRequest.post(httpUrl)
+ .header("Authorization", "APPCODE "+appCode)
+ .form(params)
+ .execute()
+ .body();
+ if (!new JSONObject(body).get("code").equals(200)){
+ return R.error("视频上传不合格,请重新上传");
+ }
+ log.info(body);
+ return R.ok();
+ }
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/config/IdCardConfig.java b/group-module/group-user/src/main/java/com/group/user/config/IdCardConfig.java
new file mode 100644
index 0000000..1dd461d
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/config/IdCardConfig.java
@@ -0,0 +1,75 @@
+package com.group.user.config;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.group.common.result.R;
+import com.group.user.pojo.IdCardPeople;
+import lombok.Data;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.Objects;
+
+/**
+ * 身份证照片
+ */
+@Component
+@Log4j2
+public class IdCardConfig {
+
+ @Value("${song.appCode}")
+ private String appCode;
+
+ @Value("${song.card.host}")
+ private String host;
+
+ @Value("${song.card.path}")
+ private String path;
+
+ @Autowired
+ private OssConfig ossConfig;
+
+ public IdCardPeople checkCard(MultipartFile file,String side){
+
+
+ String fileString = ossConfig.upload(file);
+
+
+ //configure配置
+ JSONObject configObj = new JSONObject();
+ configObj.put("side", side);
+ configObj.put("quality_info",false);
+ String config_str = configObj.toString();
+
+ //拼装请求body的json字符串
+ JSONObject requestObj = new JSONObject();
+ requestObj.put("image",fileString);
+ if (!configObj.isEmpty()){
+ requestObj.put("configure",config_str);
+ }
+ String body = requestObj.toString();
+
+ String string = HttpRequest.post(host + path)
+ .header("Authorization", "APPCODE " + appCode)
+ .header("Content-Type", "application/json; charset=UTF-8")
+ .body(body)
+ .execute()
+ .body();
+ log.info(string);
+
+ IdCardPeople idCardPeople = null;
+ try {
+ idCardPeople = JSON.parseObject(string, IdCardPeople.class);
+ } catch (Exception e) {
+ throw new RuntimeException("身份证格式不对");
+ }
+ return idCardPeople;
+ }
+
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/config/OssConfig.java b/group-module/group-user/src/main/java/com/group/user/config/OssConfig.java
new file mode 100644
index 0000000..19a91f2
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/config/OssConfig.java
@@ -0,0 +1,63 @@
+package com.group.user.config;
+
+import com.aliyun.oss.*;
+import com.aliyun.oss.common.comm.ResponseMessage;
+import lombok.Data;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import com.aliyun.oss.common.auth.*;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInput;
+import java.util.Date;
+
+/**
+ * oss相关配置
+ */
+@Component
+@Log4j2
+public class OssConfig {
+
+ @Value("${song.oss.endpoint}")
+ private String endpoint;
+ @Value("${song.oss.accessKeyId}")
+ private String accessKeyId;
+ @Value("${song.oss.secretAccessKey}")
+ private String secretAccessKey;
+ @Value("${song.oss.bucketName}")
+ private String bucketName;
+ @Value("${song.oss.objectName}")
+ private String objectName;
+
+ public String upload(MultipartFile file) {
+
+ try {
+
+ InputStream stream = file.getInputStream();
+
+ String fileName = file.getOriginalFilename();
+ //创建oss实例
+ OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, secretAccessKey);
+
+ //上传文件
+ PutObjectRequest request = new PutObjectRequest(bucketName, objectName + fileName, stream);
+
+ ossClient.putObject(request);
+
+ Date date = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7);
+
+ return ossClient.generatePresignedUrl(bucketName, objectName + fileName, date).toString();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/config/RealID.java b/group-module/group-user/src/main/java/com/group/user/config/RealID.java
new file mode 100644
index 0000000..5802082
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/config/RealID.java
@@ -0,0 +1,48 @@
+package com.group.user.config;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson.JSON;
+import com.group.common.result.R;
+import com.group.user.pojo.IdCard;
+import com.group.user.pojo.IdCardEntity;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+
+/**
+ * 身份证和姓名的正确校验
+ */
+@Component
+@Log4j2
+public class RealID {
+
+ @Value("${song.check.url}")
+ private String url;
+
+ @Value("${song.appCode}")
+ private String appCode;
+
+ public R checkId(IdCard idCard){
+
+ HashMap map = new HashMap<>();
+ map.put("realName",idCard.getRealName());
+ map.put("cardNo",idCard.getCardNo());
+
+ String body = HttpRequest.post(url)
+ .header("Authorization", "APPCODE " + appCode)
+ .header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
+ .form(map)
+ .execute()
+ .body();
+ if (!new JSONObject(body).get("error_code").equals(0)){
+ return R.error("未通过检测");
+ }
+ IdCardEntity idCardEntity = JSON.parseObject(body, IdCardEntity.class);
+ log.info(idCardEntity);
+ return R.ok().put("data",idCardEntity);
+ }
+
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/controller/UserController.java b/group-module/group-user/src/main/java/com/group/user/controller/UserController.java
index ba87905..ba2e160 100644
--- a/group-module/group-user/src/main/java/com/group/user/controller/UserController.java
+++ b/group-module/group-user/src/main/java/com/group/user/controller/UserController.java
@@ -3,13 +3,19 @@ package com.group.user.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.group.common.result.R;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
+import com.group.user.config.IdCardConfig;
+import com.group.user.config.OssConfig;
+import com.group.user.config.RealID;
+import com.group.user.pojo.IdCard;
+import com.group.user.pojo.ReqGroup;
import com.group.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
/**
* 用户控制层
@@ -38,6 +44,35 @@ public class UserController {
public R getUserByName(@PathVariable String name) {
UserEntity user = userService.getOne(new LambdaQueryWrapper()
.eq(UserEntity::getUserName, name));
- return R.ok().put("data",JSON.toJSONString(user) );
+ return R.ok().put("data", JSON.toJSONString(user));
}
+
+ /**
+ * 申请成为团长
+ */
+ @PostMapping("/apply")
+ public R apply(@RequestBody ReqGroup reqGroup) {
+
+ return userService.apply(reqGroup);
+ }
+
+ @Autowired
+ private OssConfig ossConfig;
+
+ /**
+ * 上传视频或者照片
+ */
+ @PostMapping("/upload")
+ public R upload(@RequestParam("file") MultipartFile file) {
+ return R.ok().put("data",ossConfig.upload(file));
+ }
+
+ /**
+ * 上传身份证正面照片获取用户真实姓名和身份证号
+ */
+ @PostMapping("/getRealName")
+ public R getRealName(@RequestParam("file")MultipartFile file){
+ return userService.getRealName(file);
+ }
+
}
diff --git a/group-module/group-user/src/main/java/com/group/user/mapper/CouponMapper.java b/group-module/group-user/src/main/java/com/group/user/mapper/CouponMapper.java
index 486ba87..a32a46a 100644
--- a/group-module/group-user/src/main/java/com/group/user/mapper/CouponMapper.java
+++ b/group-module/group-user/src/main/java/com/group/user/mapper/CouponMapper.java
@@ -1,7 +1,7 @@
package com.group.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.group.user.pojo.CouponEntity;
+import com.group.common.domin.pojo.CouponEntity;
import org.apache.ibatis.annotations.Mapper;
/**
diff --git a/group-module/group-user/src/main/java/com/group/user/mapper/RegistrationMapper.java b/group-module/group-user/src/main/java/com/group/user/mapper/RegistrationMapper.java
index 52ca18d..1c62bb1 100644
--- a/group-module/group-user/src/main/java/com/group/user/mapper/RegistrationMapper.java
+++ b/group-module/group-user/src/main/java/com/group/user/mapper/RegistrationMapper.java
@@ -1,7 +1,7 @@
package com.group.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.group.user.pojo.RegistrationEntity;
+import com.group.common.domin.pojo.RegistrationEntity;
import org.apache.ibatis.annotations.Mapper;
/**
diff --git a/group-module/group-user/src/main/java/com/group/user/mapper/UserMapper.java b/group-module/group-user/src/main/java/com/group/user/mapper/UserMapper.java
index 9ddc44d..1e48540 100644
--- a/group-module/group-user/src/main/java/com/group/user/mapper/UserMapper.java
+++ b/group-module/group-user/src/main/java/com/group/user/mapper/UserMapper.java
@@ -1,7 +1,7 @@
package com.group.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
import org.apache.ibatis.annotations.Mapper;
/**
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/IdCard.java b/group-module/group-user/src/main/java/com/group/user/pojo/IdCard.java
new file mode 100644
index 0000000..a62ca3a
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/pojo/IdCard.java
@@ -0,0 +1,14 @@
+package com.group.user.pojo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 用户实名信息
+ */
+@Data
+@Builder
+public class IdCard {
+ private String realName;
+ private String cardNo;
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/IdCardEntity.java b/group-module/group-user/src/main/java/com/group/user/pojo/IdCardEntity.java
new file mode 100644
index 0000000..b1695fa
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/pojo/IdCardEntity.java
@@ -0,0 +1,52 @@
+package com.group.user.pojo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 持有人的相关信息
+ */
+@NoArgsConstructor
+@Data
+public class IdCardEntity {
+
+ @JsonProperty("error_code")
+ private Integer errorCode;
+ @JsonProperty("reason")
+ private String reason;
+ @JsonProperty("result")
+ private ResultDTO result;
+ @JsonProperty("sn")
+ private String sn;
+
+ @NoArgsConstructor
+ @Data
+ public static class ResultDTO {
+ @JsonProperty("realname")
+ private String realname;
+ @JsonProperty("idcard")
+ private String idcard;
+ @JsonProperty("isok")
+ private Boolean isok;
+ @JsonProperty("IdCardInfor")
+ private IdCardInforDTO idCardInfor;
+
+ @NoArgsConstructor
+ @Data
+ public static class IdCardInforDTO {
+ @JsonProperty("province")
+ private String province;
+ @JsonProperty("city")
+ private String city;
+ @JsonProperty("district")
+ private String district;
+ @JsonProperty("area")
+ private String area;
+ @JsonProperty("sex")
+ private String sex;
+ @JsonProperty("birthday")
+ private String birthday;
+ }
+ }
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/IdCardPeople.java b/group-module/group-user/src/main/java/com/group/user/pojo/IdCardPeople.java
new file mode 100644
index 0000000..fccc072
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/pojo/IdCardPeople.java
@@ -0,0 +1,91 @@
+package com.group.user.pojo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 身份证正面信息
+ */
+@NoArgsConstructor
+@Data
+public class IdCardPeople {
+
+ @JsonProperty("address")
+ private String address;
+ @JsonProperty("angle")
+ private Integer angle;
+ @JsonProperty("birth")
+ private String birth;
+ @JsonProperty("card_region")
+ private List cardRegion;
+ @JsonProperty("config_str")
+ private String configStr;
+ @JsonProperty("face_rect")
+ private FaceRectDTO faceRect;
+ @JsonProperty("face_rect_vertices")
+ private List faceRectVertices;
+ @JsonProperty("is_fake")
+ private Boolean isFake;
+ @JsonProperty("name")
+ private String name;
+ @JsonProperty("nationality")
+ private String nationality;
+ @JsonProperty("num")
+ private String num;
+ @JsonProperty("request_id")
+ private String requestId;
+ @JsonProperty("sex")
+ private String sex;
+ @JsonProperty("success")
+ private Boolean success;
+
+ @NoArgsConstructor
+ @Data
+ public static class FaceRectDTO {
+ @JsonProperty("angle")
+ private Integer angle;
+ @JsonProperty("center")
+ private CenterDTO center;
+ @JsonProperty("size")
+ private SizeDTO size;
+
+ @NoArgsConstructor
+ @Data
+ public static class CenterDTO {
+ @JsonProperty("x")
+ private Integer x;
+ @JsonProperty("y")
+ private Integer y;
+ }
+
+ @NoArgsConstructor
+ @Data
+ public static class SizeDTO {
+ @JsonProperty("height")
+ private Integer height;
+ @JsonProperty("width")
+ private Integer width;
+ }
+ }
+
+ @NoArgsConstructor
+ @Data
+ public static class CardRegionDTO {
+ @JsonProperty("x")
+ private Integer x;
+ @JsonProperty("y")
+ private Integer y;
+ }
+
+ @NoArgsConstructor
+ @Data
+ public static class FaceRectVerticesDTO {
+ @JsonProperty("x")
+ private Integer x;
+ @JsonProperty("y")
+ private Integer y;
+ }
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/ReqGroup.java b/group-module/group-user/src/main/java/com/group/user/pojo/ReqGroup.java
new file mode 100644
index 0000000..4f792b2
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/pojo/ReqGroup.java
@@ -0,0 +1,26 @@
+package com.group.user.pojo;
+
+import lombok.Data;
+
+/**
+ * 团长申请表单
+ */
+@Data
+public class ReqGroup {
+ /**
+ * 活体视频 网址
+ */
+ private String idCardUrl;
+ /**
+ * 用户真实姓名
+ */
+ private String realName;
+ /**
+ * 身份证号
+ */
+ private String cardNo;
+ /**
+ * 活体视频 动作
+ */
+ private String motions;
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/pojo/SelfDTO.java b/group-module/group-user/src/main/java/com/group/user/pojo/SelfDTO.java
new file mode 100644
index 0000000..7dab272
--- /dev/null
+++ b/group-module/group-user/src/main/java/com/group/user/pojo/SelfDTO.java
@@ -0,0 +1,47 @@
+package com.group.user.pojo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 视频验证结果
+ */
+@NoArgsConstructor
+@Data
+public class SelfDTO {
+ @JsonProperty("msg")
+ private String msg;
+ @JsonProperty("success")
+ private Boolean success;
+ @JsonProperty("code")
+ private Integer code;
+ @JsonProperty("data")
+ private DataDTO data;
+
+ @NoArgsConstructor
+ @Data
+ public static class DataDTO {
+ @JsonProperty("order_no")
+ private String orderNo;
+ @JsonProperty("motions")
+ private MotionsDTO motions;
+ @JsonProperty("passed")
+ private Boolean passed;
+ @JsonProperty("feature_image_id")
+ private String featureImageId;
+ @JsonProperty("hack_score")
+ private Double hackScore;
+
+ @NoArgsConstructor
+ @Data
+ public static class MotionsDTO {
+ @JsonProperty("score")
+ private Double score;
+ @JsonProperty("motion")
+ private String motion;
+ @JsonProperty("passed")
+ private Boolean passed;
+ }
+ }
+}
diff --git a/group-module/group-user/src/main/java/com/group/user/service/CouponService.java b/group-module/group-user/src/main/java/com/group/user/service/CouponService.java
index 4cc1825..face14a 100644
--- a/group-module/group-user/src/main/java/com/group/user/service/CouponService.java
+++ b/group-module/group-user/src/main/java/com/group/user/service/CouponService.java
@@ -2,7 +2,7 @@ package com.group.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.group.common.result.R;
-import com.group.user.pojo.CouponEntity;
+import com.group.common.domin.pojo.CouponEntity;
/**
* 优惠券业务层
diff --git a/group-module/group-user/src/main/java/com/group/user/service/RegistrationService.java b/group-module/group-user/src/main/java/com/group/user/service/RegistrationService.java
index 346b562..a943c33 100644
--- a/group-module/group-user/src/main/java/com/group/user/service/RegistrationService.java
+++ b/group-module/group-user/src/main/java/com/group/user/service/RegistrationService.java
@@ -2,7 +2,7 @@ package com.group.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.group.common.result.R;
-import com.group.user.pojo.RegistrationEntity;
+import com.group.common.domin.pojo.RegistrationEntity;
/**
* 签到服务层
diff --git a/group-module/group-user/src/main/java/com/group/user/service/UserService.java b/group-module/group-user/src/main/java/com/group/user/service/UserService.java
index b42a1b3..73fc17f 100644
--- a/group-module/group-user/src/main/java/com/group/user/service/UserService.java
+++ b/group-module/group-user/src/main/java/com/group/user/service/UserService.java
@@ -1,10 +1,18 @@
package com.group.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
+import com.group.common.result.R;
+import com.group.user.pojo.ReqGroup;
+import org.springframework.web.multipart.MultipartFile;
/**
* 用户服务层
*/
public interface UserService extends IService {
+
+ R getRealName(MultipartFile file);
+
+ R apply(ReqGroup reqGroup);
+
}
diff --git a/group-module/group-user/src/main/java/com/group/user/service/impl/CouponServiceImpl.java b/group-module/group-user/src/main/java/com/group/user/service/impl/CouponServiceImpl.java
index 6d6238f..78269ce 100644
--- a/group-module/group-user/src/main/java/com/group/user/service/impl/CouponServiceImpl.java
+++ b/group-module/group-user/src/main/java/com/group/user/service/impl/CouponServiceImpl.java
@@ -4,16 +4,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.group.common.constants.JwtConstants;
import com.group.common.result.R;
import com.group.user.mapper.CouponMapper;
-import com.group.user.pojo.CouponEntity;
+import com.group.common.domin.pojo.CouponEntity;
import com.group.user.service.CouponService;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
/**
* 优惠券实现层
*/
+@Service
public class CouponServiceImpl extends ServiceImpl
implements CouponService {
diff --git a/group-module/group-user/src/main/java/com/group/user/service/impl/RegistrationServiceImpl.java b/group-module/group-user/src/main/java/com/group/user/service/impl/RegistrationServiceImpl.java
index 6692c17..e7e35fc 100644
--- a/group-module/group-user/src/main/java/com/group/user/service/impl/RegistrationServiceImpl.java
+++ b/group-module/group-user/src/main/java/com/group/user/service/impl/RegistrationServiceImpl.java
@@ -3,10 +3,11 @@ package com.group.user.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.group.common.constants.JwtConstants;
-import com.group.common.domin.UserEntity;
+import com.group.common.domin.pojo.UserEntity;
import com.group.common.result.R;
+import com.group.common.util.UserUtil;
import com.group.user.mapper.RegistrationMapper;
-import com.group.user.pojo.RegistrationEntity;
+import com.group.common.domin.pojo.RegistrationEntity;
import com.group.user.service.RegistrationService;
import com.group.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -34,14 +35,12 @@ public class RegistrationServiceImpl extends ServiceImpl list = list(new LambdaQueryWrapper()
- .eq(RegistrationEntity::getUserId, getUserId())
+ .eq(RegistrationEntity::getUserId, userId)
.le(RegistrationEntity::getRegistrationDate, date)
.ge(RegistrationEntity::getRegistrationDate, seven));
//判断今天是否已经 签到过
@@ -76,7 +75,7 @@ public class RegistrationServiceImpl extends ServiceImpl
implements UserService {
+ @Autowired
+ private CheckLifeImpl checkLife;
+
+
+ @Autowired
+ private IdCardConfig idCardConfig;
+
+
+ @Override
+ public R getRealName(MultipartFile file) {
+
+ IdCardPeople idCardPeople = idCardConfig.checkCard(file, "face");
+
+ IdCard idCard = IdCard.builder()
+ .cardNo(idCardPeople.getNum())
+ .realName(idCardPeople.getName())
+ .build();
+
+ return R.ok().put("data", idCard);
+ }
+
+ @Autowired
+ private RealID realID;
+
+ @Override
+ public R apply(ReqGroup reqGroup) {
+ //判断用户是否已经修改状态了
+ Integer id = getId();
+ UserEntity user = getById(id);
+ if (user.getUserRole() == 1) {
+ return R.error("用户已经申请过了,请不要重复申请");
+ }
+ //使用异步进行活体检查
+ //checkLife.checkLife(reqGroup.getIdCardUrl(), reqGroup.getMotions())
+ CompletableFuture future1 =
+ CompletableFuture.supplyAsync(() -> {
+ System.out.println("活体检测");
+ return checkLife.checkLife(reqGroup.getIdCardUrl(), reqGroup.getMotions());
+ }
+ );
+ //使用身份证号和姓名校验身份
+ //realID.checkId(IdCard.builder().realName(reqGroup.getRealName()).cardNo(reqGroup.getCardNo()).build()
+ CompletableFuture future2 =
+ CompletableFuture.supplyAsync(() -> {
+ System.out.println("校验身份");
+ return realID.checkId(IdCard.builder().realName(reqGroup.getRealName()).cardNo(reqGroup.getCardNo()).build());
+ }
+ );
+ R result1 = future1.join();
+ R result2 = future2.join();
+
+ // 在这里处理两个结果的逻辑
+ if (result1.get("code").equals(0) && result2.get("code").equals(0)) {
+ IdCardEntity idCard = (IdCardEntity) result2.get("data");
+ user.setUserRealAddress(idCard.getResult().getIdCardInfor().getArea());
+ user.setUserRealName(reqGroup.getRealName());
+ user.setUserCard(reqGroup.getCardNo());
+ user.setUserRole(1);
+ //修改用户状态
+ updateById(user);
+ } else {
+ return R.error("身份认证失败");
+ }
+ return R.ok();
+ }
+
+ @Autowired
+ private HttpServletRequest request;
+
+ private Integer getId() {
+ return Integer.valueOf(request.getHeader(JwtConstants.DETAILS_USER_ID));
+ }
}
diff --git a/group-module/group-user/src/main/java/com/group/user/xxl/config/JobConfig.java b/group-module/group-user/src/main/java/com/group/user/xxl/config/JobConfig.java
index 9fe96c1..1a4ded9 100644
--- a/group-module/group-user/src/main/java/com/group/user/xxl/config/JobConfig.java
+++ b/group-module/group-user/src/main/java/com/group/user/xxl/config/JobConfig.java
@@ -1,55 +1,55 @@
-package com.group.user.xxl.config;
-
-import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-
-
-/**
- * xxl-job的配置类
- */
-@ComponentScan(basePackages = "com.group.user.xxl.handle")
-@Configuration
-@Log4j2
-public class JobConfig {
-
- @Value("${xxl.job.admin.addresses}")
- private String adminAddresses;
-
- @Value("${xxl.job.executor.appname}")
- private String appName;
-
- @Value("${xxl.job.executor.ip}")
- private String ip;
-
- @Value("${xxl.job.executor.port}")
- private int port;
-
- @Value("${xxl.job.accessToken}")
- private String accessToken;
-
- @Value("${xxl.job.executor.logpath}")
- private String logPath;
-
- @Value("${xxl.job.executor.logretentiondays}")
- private int logRetentionDays;
-
-
- @Bean(initMethod = "start", destroyMethod = "destroy")
- public XxlJobSpringExecutor xxlJobExecutor() {
- log.info(">>>>>>>>>>> xxl-job config init.");
- XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
- xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
- xxlJobSpringExecutor.setAppname(appName);
- xxlJobSpringExecutor.setIp(ip);
- xxlJobSpringExecutor.setPort(port);
- xxlJobSpringExecutor.setAccessToken(accessToken);
- xxlJobSpringExecutor.setLogPath(logPath);
- xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
- return xxlJobSpringExecutor;
- }
-
-}
+//package com.group.user.xxl.config;
+//
+//import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+//import lombok.extern.log4j.Log4j2;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.ComponentScan;
+//import org.springframework.context.annotation.Configuration;
+//
+//
+///**
+// * xxl-job的配置类
+// */
+//@ComponentScan(basePackages = "com.group.user.xxl.handle")
+//@Configuration
+//@Log4j2
+//public class JobConfig {
+//
+// @Value("${xxl.job.admin.addresses}")
+// private String adminAddresses;
+//
+// @Value("${xxl.job.executor.appname}")
+// private String appName;
+//
+// @Value("${xxl.job.executor.ip}")
+// private String ip;
+//
+// @Value("${xxl.job.executor.port}")
+// private int port;
+//
+// @Value("${xxl.job.accessToken}")
+// private String accessToken;
+//
+// @Value("${xxl.job.executor.logpath}")
+// private String logPath;
+//
+// @Value("${xxl.job.executor.logretentiondays}")
+// private int logRetentionDays;
+//
+//
+// @Bean(initMethod = "start", destroyMethod = "destroy")
+// public XxlJobSpringExecutor xxlJobExecutor() {
+// log.info(">>>>>>>>>>> xxl-job config init.");
+// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+// xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+// xxlJobSpringExecutor.setAppname(appName);
+// xxlJobSpringExecutor.setIp(ip);
+// xxlJobSpringExecutor.setPort(port);
+// xxlJobSpringExecutor.setAccessToken(accessToken);
+// xxlJobSpringExecutor.setLogPath(logPath);
+// xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+// return xxlJobSpringExecutor;
+// }
+//
+//}
diff --git a/group-module/group-user/src/main/java/com/group/user/xxl/handle/XxlHandle.java b/group-module/group-user/src/main/java/com/group/user/xxl/handle/XxlHandle.java
index e8f936b..2b41ea7 100644
--- a/group-module/group-user/src/main/java/com/group/user/xxl/handle/XxlHandle.java
+++ b/group-module/group-user/src/main/java/com/group/user/xxl/handle/XxlHandle.java
@@ -1,18 +1,18 @@
-package com.group.user.xxl.handle;
-
-import com.xxl.job.core.context.XxlJobHelper;
-import com.xxl.job.core.handler.annotation.XxlJob;
-import org.springframework.stereotype.Component;
-
-/**
- * xxl任务执行器
- */
-@Component
-public class XxlHandle {
-
- @XxlJob("xxl")
- public void doSomeThing(){
- System.out.println("hello");
- }
-
-}
+//package com.group.user.xxl.handle;
+//
+//import com.xxl.job.core.context.XxlJobHelper;
+//import com.xxl.job.core.handler.annotation.XxlJob;
+//import org.springframework.stereotype.Component;
+//
+///**
+// * xxl任务执行器
+// */
+//@Component
+//public class XxlHandle {
+//
+// @XxlJob("xxl")
+// public void doSomeThing(){
+// System.out.println("hello");
+// }
+//
+//}
diff --git a/group-module/group-user/src/main/resources/application.properties b/group-module/group-user/src/main/resources/application.properties
index e594480..050fec0 100644
--- a/group-module/group-user/src/main/resources/application.properties
+++ b/group-module/group-user/src/main/resources/application.properties
@@ -1,23 +1,23 @@
-
-
-# log config
-logging.config=classpath:logback.xml
-
-
-### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
-xxl.job.admin.addresses=http://127.0.0.1:7070/xxl-job-admin
-
-### xxl-job, access token
-xxl.job.accessToken=default_token
-
-### xxl-job executor appname
-xxl.job.executor.appname=xxl-job-executor-sample
-### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
-
-### xxl-job executor server-info
-xxl.job.executor.ip=
-xxl.job.executor.port=10001
-### xxl-job executor log-path
-xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
-### xxl-job executor log-retention-days
-xxl.job.executor.logretentiondays=30
+#
+#
+## log config
+#logging.config=classpath:logback.xml
+#
+#
+#### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
+#xxl.job.admin.addresses=http://127.0.0.1:7070/xxl-job-admin
+#
+#### xxl-job, access token
+#xxl.job.accessToken=default_token
+#
+#### xxl-job executor appname
+#xxl.job.executor.appname=xxl-job-executor-sample
+#### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
+#
+#### xxl-job executor server-info
+#xxl.job.executor.ip=
+#xxl.job.executor.port=10001
+#### xxl-job executor log-path
+#xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
+#### xxl-job executor log-retention-days
+#xxl.job.executor.logretentiondays=30
diff --git a/group-module/group-user/src/main/resources/bootstrap.yml b/group-module/group-user/src/main/resources/bootstrap.yml
index c3a847f..b83b989 100644
--- a/group-module/group-user/src/main/resources/bootstrap.yml
+++ b/group-module/group-user/src/main/resources/bootstrap.yml
@@ -27,3 +27,27 @@ spring:
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ servlet:
+ multipart:
+ max-file-size: 10MB
+ max-request-size: 10MB
+
+
+song:
+ life:
+ url: https://life.shumaidata.com/checklife
+ appCode: 5becad81f5c64b36a883ad8c7b66fa66
+ oss:
+ endpoint: oss-cn-shanghai.aliyuncs.com
+ accessKeyId: LTAI5tEhxBCDjWFy6D2SEX3y
+ secretAccessKey: gw5SQHr5T0P2UkCLYiAfgOxBwOpTTN
+ bucketName: song-mp4
+ objectName: mp4/
+ card:
+ host: https://cardnumber.market.alicloudapi.com
+ path: /rest/160601/ocr/ocr_idcard.json
+ check:
+ url: https://zidv2.market.alicloudapi.com/idcheck/Post
+
+
+
diff --git a/group-module/group_goods/pom.xml b/group-module/group_goods/pom.xml
new file mode 100644
index 0000000..df181ae
--- /dev/null
+++ b/group-module/group_goods/pom.xml
@@ -0,0 +1,27 @@
+
+
+ 4.0.0
+ 商品模块
+
+ com.song
+ group-module
+ 1.0-SNAPSHOT
+
+
+ group_goods
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ com.song
+ group-common
+
+
+
\ No newline at end of file
diff --git a/group-module/group_goods/src/main/java/com/group/goods/GoodsApplication.java b/group-module/group_goods/src/main/java/com/group/goods/GoodsApplication.java
new file mode 100644
index 0000000..81d7aa7
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/GoodsApplication.java
@@ -0,0 +1,16 @@
+package com.group.goods;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * 商品模块启动类
+ */
+@SpringBootApplication
+@EnableFeignClients("com.group")
+public class GoodsApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(GoodsApplication.class,args);
+ }
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/controller/SecKillController.java b/group-module/group_goods/src/main/java/com/group/goods/controller/SecKillController.java
new file mode 100644
index 0000000..1e490e9
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/controller/SecKillController.java
@@ -0,0 +1,36 @@
+package com.group.goods.controller;
+
+import com.group.common.result.R;
+import com.group.goods.service.SecKillService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 秒杀商品控制层
+ */
+@RestController
+@RequestMapping("/goods/secKill")
+public class SecKillController {
+
+ @Autowired
+ private SecKillService secKillService;
+
+ /**
+ * 秒杀商品 - 采用最简单方式进行实现
+ */
+ @GetMapping("/buyGoodsByOne/{id}")
+ public R buyGoodsByOne(@PathVariable("id")Integer id){
+ return secKillService.buyGoodsByOne(id);
+ }
+
+ /**
+ * 秒杀方式 -- 采用降低锁粒度的方式实现
+ */
+
+ /**
+ * 秒杀商品 -- 采用redisson信号量的方式进行解决这个问题
+ */
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/controller/SessionController.java b/group-module/group_goods/src/main/java/com/group/goods/controller/SessionController.java
new file mode 100644
index 0000000..dd7ef5b
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/controller/SessionController.java
@@ -0,0 +1,12 @@
+package com.group.goods.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 场次信息控制层
+ */
+@RestController
+@RequestMapping("/session")
+public class SessionController {
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/feign/KillOrderService.java b/group-module/group_goods/src/main/java/com/group/goods/feign/KillOrderService.java
new file mode 100644
index 0000000..2a859e1
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/feign/KillOrderService.java
@@ -0,0 +1,15 @@
+package com.group.goods.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 远程调用秒杀订单方法
+ */
+@FeignClient(name = "song-order",path = "/order")
+public interface KillOrderService {
+
+ @GetMapping("/killOrder/exitResult")
+ public boolean exitResult(@RequestParam Integer goodsId, Integer userId);
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/mapper/SecKillMapper.java b/group-module/group_goods/src/main/java/com/group/goods/mapper/SecKillMapper.java
new file mode 100644
index 0000000..c19b100
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/mapper/SecKillMapper.java
@@ -0,0 +1,12 @@
+package com.group.goods.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.group.common.domin.pojo.SeckillEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 秒杀商品持久层
+ */
+@Mapper
+public interface SecKillMapper extends BaseMapper {
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/mapper/SessionMapper.java b/group-module/group_goods/src/main/java/com/group/goods/mapper/SessionMapper.java
new file mode 100644
index 0000000..fa2cce1
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/mapper/SessionMapper.java
@@ -0,0 +1,12 @@
+package com.group.goods.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.group.common.domin.pojo.SessionEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * session持久层
+ */
+@Mapper
+public interface SessionMapper extends BaseMapper {
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/service/SecKillService.java b/group-module/group_goods/src/main/java/com/group/goods/service/SecKillService.java
new file mode 100644
index 0000000..5ea586f
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/service/SecKillService.java
@@ -0,0 +1,12 @@
+package com.group.goods.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.group.common.domin.pojo.SeckillEntity;
+import com.group.common.result.R;
+
+/**
+ * 秒杀商品服务层
+ */
+public interface SecKillService extends IService {
+ R buyGoodsByOne(Integer id);
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/service/SessionService.java b/group-module/group_goods/src/main/java/com/group/goods/service/SessionService.java
new file mode 100644
index 0000000..58e4c51
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/service/SessionService.java
@@ -0,0 +1,10 @@
+package com.group.goods.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.group.common.domin.pojo.SessionEntity;
+
+/**
+ * 场次服务层
+ */
+public interface SessionService extends IService {
+}
diff --git a/group-module/group_goods/src/main/java/com/group/goods/service/impl/SecKillServiceImpl.java b/group-module/group_goods/src/main/java/com/group/goods/service/impl/SecKillServiceImpl.java
new file mode 100644
index 0000000..0efcb38
--- /dev/null
+++ b/group-module/group_goods/src/main/java/com/group/goods/service/impl/SecKillServiceImpl.java
@@ -0,0 +1,87 @@
+package com.group.goods.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.group.common.domin.pojo.KillOrderEntity;
+import com.group.common.domin.pojo.SessionEntity;
+import com.group.common.redis.RedisCache;
+import com.group.common.result.R;
+import com.group.common.util.UserUtil;
+import com.group.goods.feign.KillOrderService;
+import com.group.goods.mapper.SecKillMapper;
+import com.group.common.domin.pojo.SeckillEntity;
+import com.group.goods.service.SecKillService;
+import com.group.goods.service.SessionService;
+import org.redisson.Redisson;
+import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 秒杀商品业务层
+ */
+public class SecKillServiceImpl extends ServiceImpl
+ implements SecKillService {
+
+ /**
+ * 场次信息数据获取
+ */
+ @Autowired
+ private SessionService sessionService;
+
+ @Autowired
+ private HttpServletRequest request;
+
+ @Autowired
+ private KillOrderService killOrderService;
+
+ @Autowired
+ private RedisCache redisCache;
+
+ @Autowired
+ private Redisson redisson;
+
+ @Override
+ public R buyGoodsByOne(Integer id) {
+ //通过商品id获取商品信息
+ //获取redis中的所有数据
+ List list = redisCache.getCacheList("secKill");
+ SeckillEntity secKill = list.stream().filter(c -> c.getSeckillId().equals(id)).collect(Collectors.toList()).get(0);
+ //首先校验该商品是否在当前时间段
+ //通过场次id获取商品场次的信息
+ SessionEntity session = sessionService.getById(secKill.getSessionId());
+ //当前时间毫秒值
+ long time = new Date().getTime();
+ if (session.getSessionBegin().getTime()>time){
+ throw new RuntimeException("场次尚未开始");
+ }
+ if (session.getSessionEnd().getTime()