Z*!6!6;)p1d3!Z-k#!J*I%)}N;U}|GAJoy9>2yb<)#Ce9x
zD!{5TsGG5X+OtdMO)eXjT2_oTl4~i~duw$X3w(AMiN*(GO8k|=sZGTObg9^ZoeF-W;>UPVVEp0hZ#aC{fkQX%
zJAC)SLkDj@dg~oW_U>hFs`v>usaT0~75r4i&*a0;@e6^8*^MqJSa~Q4Ov&lH?zTgF
zuYLLM-7gK@bmZ#CUK%>^^1TOCtjGBR^M~t*GBsR1;X2v|uUvPYe}2kH8Ot)mEdLU%
z%}(6e%zZ9Jglh@A>$tX_^b3eHrV78T#V-E*O2tb!q~NfMmvKbJQT$rLZ&dsiuc+ui
zr-I+9_&xrh;EyW)gg;YRj!ph1q~I?q{))emiAVPCJN)oHhpxR*#owiZf8d|oE{@)J
z0Tyc|5EX9ysF|gydof41fb$|{D*Y&bmx}_whJQ%fXScdc1YHm&D)HfDwPUF
zl&PXzR0y0f+~B1tGu9{Td*jHeyJb1bQ$ETohnu}B<+Q4zQdB8IQAJ2pDV%+BFW(XLGVMoj1>>_4(eoB`kKZh|r;p!WI&Yoi{ML}nYZi7_*5
z+ai1o*_A!VO81f6Qnr|hzNMMXU+Fj8R4uT)ChKhu$U!gv$q$G>}ryh6wk*bAW{i#<>yn7E3(u%K{MYY?+JnFtcWLFwoDWA
z)h-**?Jjv9NkqA`G7BV;{bsp}!@3k5pD&QHgHuQ6%4$!~>gC)kZ9T!VWS3deswzF1^b)J3glEMP!QR0LO_kQ@F|$|i)p_J}
zT-lRpYr590^?hLRaxM9oiR1BDk`2`499+!)Xv(&YgsXM)B;3Q(7?J0W(bK)6i#GUS
z@;odtl~$HJlA!12`!-_G*BnQiUmy%uS~84m8QfVyc#3la1PV@ZS!9Q!IJ~ONl9JUs
z=^AZ{Sir8ZC_bh9VbMMIJWS^|!sQTHfeL^L
zr)j1%bV*Zl8f9se--+r-#SkhVXnF)y&HJI0p>u8;p(jwiw&f|l3}!~$pihB;EgY$2L&zV2ehg5I9*XA~iE56$
zAUzyg%1I6%!_P<>)uS}!ig8Hf<%xqN{VyXR6%;JREkvVBJ$@fiZG`9?4
zZXH@4g0>&?tN4|90jHeO8mbRP7N&7(eW+eZ7A$r=p$wJDXfOhY?@O_$`A;mhK=&cax@dKDe
z>IF(}WsqlJUw~8-_6A6;#x2-Ji3)1g5#wDY^^$`&r}Co)iXom9*YN@FlI=8RA8eGxp=m
zGITT#p|!I_%t>z<@(jRhTO!p%Xd~feWXn8GM?7uamhtlmN2Gn-{4M8iB(iu2XLZgch1%0NdkE*`)(mqFNard_OBAO0
z5?K@?LB3Scs>^W&XXi4YHY}??1>|DOX}qij6X@lV0&=FYv}yQ)^9YRQE$CN`3Ahqh
zQTpxtmwI+*mbtQ44!ncIWw<(9v);*+YvEX!-yE8SCg!3Z@8`2rb{h@49Us8${{<7U
B!&d+R
literal 0
HcmV?d00001
diff --git a/bwie-auth/target/maven-archiver/pom.properties b/bwie-auth/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..34c155a
--- /dev/null
+++ b/bwie-auth/target/maven-archiver/pom.properties
@@ -0,0 +1,3 @@
+artifactId=bwie-auth
+groupId=com.bwie
+version=1.0-SNAPSHOT
diff --git a/bwie-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/bwie-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..3ba0280
--- /dev/null
+++ b/bwie-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,7 @@
+com\bwie\auth\config\ConfirmCallbackConfig.class
+com\bwie\auth\service\AuthServiceimpl.class
+com\bwie\auth\controller\AuthController.class
+com\bwie\auth\feign\UserFeignService.class
+com\bwie\auth\AuthApp.class
+com\bwie\auth\service\AuthService.class
+com\bwie\auth\config\ReturnCallbackConfig.class
diff --git a/bwie-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/bwie-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..a2ed063
--- /dev/null
+++ b/bwie-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,7 @@
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\AuthApp.java
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\config\ConfirmCallbackConfig.java
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\feign\UserFeignService.java
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\service\AuthService.java
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\controller\AuthController.java
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\service\AuthServiceimpl.java
+D:\zhuangao5\safeway\bwie-auth\src\main\java\com\bwie\auth\config\ReturnCallbackConfig.java
diff --git a/bwie-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/bwie-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
new file mode 100644
index 0000000..e69de29
diff --git a/bwie-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/bwie-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 0000000..e69de29
diff --git a/bwie-common/pom.xml b/bwie-common/pom.xml
new file mode 100644
index 0000000..1cd06c9
--- /dev/null
+++ b/bwie-common/pom.xml
@@ -0,0 +1,112 @@
+
+
+
+ safeway
+ com.bwie
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ bwie-common
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-loadbalancer
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.80
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ cn.hutool
+ hutool-all
+ 5.8.3
+
+
+
+ com.aliyun
+ dysmsapi20170525
+ 2.0.1
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.12.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+ com.github.tobato
+ fastdfs-client
+ 1.26.5
+
+
+
+
diff --git a/bwie-common/src/main/java/com/bwie/common/config/RedisConfig.java b/bwie-common/src/main/java/com/bwie/common/config/RedisConfig.java
new file mode 100644
index 0000000..b62e4b1
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/config/RedisConfig.java
@@ -0,0 +1,40 @@
+package com.bwie.common.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+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 redisTemplate(RedisConnectionFactory factory) {
+ RedisTemplate template = new RedisTemplate<>();
+ template.setConnectionFactory(factory);
+ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
+ Jackson2JsonRedisSerializer(Object.class);
+ ObjectMapper om = new ObjectMapper();
+ om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+ om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+ jackson2JsonRedisSerializer.setObjectMapper(om);
+
+ StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+ // key采用String的序列化方式
+ template.setKeySerializer(stringRedisSerializer);
+ // hash的key也采用String的序列化方式
+ template.setHashKeySerializer(stringRedisSerializer);
+ // value序列化方式采用jackson
+ template.setValueSerializer(jackson2JsonRedisSerializer);
+ // hash的value序列化方式采用jackson
+ template.setHashValueSerializer(jackson2JsonRedisSerializer);
+ template.afterPropertiesSet();
+
+ return template;
+ }
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/constants/Constants.java b/bwie-common/src/main/java/com/bwie/common/constants/Constants.java
new file mode 100644
index 0000000..2fdc9fe
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/constants/Constants.java
@@ -0,0 +1,18 @@
+package com.bwie.common.constants;
+
+/**
+ * @description: 系统常量
+ * @author DongZl
+ */
+public class Constants {
+ /**
+ * 成功标记
+ */
+ public static final Integer SUCCESS = 200;
+ public static final String SUCCESS_MSG = "操作成功";
+ /**
+ * 失败标记
+ */
+ public static final Integer ERROR = 500;
+ public static final String ERROR_MSG = "操作异常";
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java b/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java
new file mode 100644
index 0000000..03692c1
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java
@@ -0,0 +1,29 @@
+package com.bwie.common.constants;
+
+/**
+ * @author DongZl
+ * @description: Jwt常量
+ */
+public class JwtConstants {
+
+ /**
+ * 用户ID字段
+ */
+ public static final String DETAILS_USER_ID = "user_id";
+
+ /**
+ * 用户名字段
+ */
+ public static final String DETAILS_USERNAME = "username";
+
+ /**
+ * 用户标识
+ */
+ public static final String USER_KEY = "user_key";
+
+ /**
+ * 令牌秘钥
+ */
+ public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
+
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQQueueConstants.java b/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQQueueConstants.java
new file mode 100644
index 0000000..b054d9c
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQQueueConstants.java
@@ -0,0 +1,25 @@
+package com.bwie.common.constants;
+
+/**
+ * @ClassName:
+ * @Description: RabbitMQ 队列名称常量
+ * @Author: zhuwenqiang
+ * @Date: 2023/9/19
+ */
+public class RabbitMQQueueConstants {
+
+ /**
+ * 短信队列名称
+ */
+ public static final String SENS_SMS_QUEUE = "send_sms_queue";
+
+ /**
+ * 登录日志队列名称
+ */
+ public static final String LONG_LOG_QUEUE = "long_log_queue";
+
+ /**
+ * 添加入库队列名称
+ */
+ public static final String ADD_RECEIPT_QUEUE = "add_receipt_queue";
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/constants/RabbitName.java b/bwie-common/src/main/java/com/bwie/common/constants/RabbitName.java
new file mode 100644
index 0000000..e0d4956
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/constants/RabbitName.java
@@ -0,0 +1,5 @@
+package com.bwie.common.constants;
+
+public class RabbitName {
+ public static final String RabbitConName = "rabbit";
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java b/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java
new file mode 100644
index 0000000..1871fb7
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java
@@ -0,0 +1,24 @@
+package com.bwie.common.constants;
+
+/**
+ * @author DongZl
+ * @description: 令牌常量
+ */
+public class TokenConstants {
+ /**
+ * 缓存有效期,默认720(分钟)
+ */
+ public final static long EXPIRATION = 720;
+ /**
+ * 缓存刷新时间,默认120(分钟)
+ */
+ public final static long REFRESH_TIME = 120;
+ /**
+ * 权限缓存前缀
+ */
+ public final static String LOGIN_TOKEN_KEY = "login_tokens:";
+ /**
+ * token标识
+ */
+ public static final String TOKEN = "token";
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/Merch.java b/bwie-common/src/main/java/com/bwie/common/domain/Merch.java
new file mode 100644
index 0000000..c681b3d
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/Merch.java
@@ -0,0 +1,22 @@
+package com.bwie.common.domain;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class Merch {
+
+ private Integer merchId;
+ private String merchName;
+ private String merchType;
+ private Double merchPrice;
+ private String barCode;
+ private Double salesProPrice;
+ private Integer factoryId;
+ private Integer provideId;
+ private Date merchDeadTime;
+ private Integer merchNum;
+ private String merchSta;
+
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/User.java b/bwie-common/src/main/java/com/bwie/common/domain/User.java
new file mode 100644
index 0000000..57a8741
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/User.java
@@ -0,0 +1,18 @@
+package com.bwie.common.domain;
+
+import lombok.Data;
+
+@Data
+public class User {
+ private Integer userID;
+ private String userName;
+ private String userPW;
+ private Integer userType;
+ private String userIDCard;
+ private Integer userAge;
+ private String userGender;
+ private String userAddress;
+ private String userPosition;
+ private Integer userSal;
+ private String Phone;
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java b/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java
new file mode 100644
index 0000000..36c8497
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java
@@ -0,0 +1,9 @@
+package com.bwie.common.domain.request;
+
+import lombok.Data;
+
+@Data
+public class LoginRequest {
+ private String phone;
+ private String code;
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/request/MerchRequest.java b/bwie-common/src/main/java/com/bwie/common/domain/request/MerchRequest.java
new file mode 100644
index 0000000..374624f
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/request/MerchRequest.java
@@ -0,0 +1,11 @@
+package com.bwie.common.domain.request;
+
+import lombok.Data;
+
+@Data
+public class MerchRequest {
+ private String barCode;
+ private Integer merchNum;
+ private Integer pageNum=1;
+ private Integer pageSize=3;
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/domain/response/JwtResponse.java b/bwie-common/src/main/java/com/bwie/common/domain/response/JwtResponse.java
new file mode 100644
index 0000000..df20d8a
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/domain/response/JwtResponse.java
@@ -0,0 +1,9 @@
+package com.bwie.common.domain.response;
+
+import lombok.Data;
+
+@Data
+public class JwtResponse {
+ private String token;
+ private String time;
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/result/PageResult.java b/bwie-common/src/main/java/com/bwie/common/result/PageResult.java
new file mode 100644
index 0000000..85ecdda
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/result/PageResult.java
@@ -0,0 +1,34 @@
+package com.bwie.common.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author DongZl
+ * @description: 列表返回结果集
+ */
+@Data
+public class PageResult implements Serializable {
+ /**
+ * 总条数
+ */
+ private long total;
+ /**
+ * 结果集合
+ */
+ private List list;
+ public PageResult() {
+ }
+ public PageResult(long total, List list) {
+ this.total = total;
+ this.list = list;
+ }
+ public static PageResult toPageResult(long total, List list){
+ return new PageResult(total , list);
+ }
+ public static Result> toResult(long total, List list){
+ return Result.success(PageResult.toPageResult(total,list));
+ }
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/result/Result.java b/bwie-common/src/main/java/com/bwie/common/result/Result.java
new file mode 100644
index 0000000..30b1e73
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/result/Result.java
@@ -0,0 +1,76 @@
+package com.bwie.common.result;
+
+import com.bwie.common.constants.Constants;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author DongZl
+ * @description: 响应信息主体
+ */
+@Data
+public class Result implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ /**
+ * 成功
+ */
+ public static final int SUCCESS = Constants.SUCCESS;
+ /**
+ * 失败
+ */
+ public static final int FAIL = Constants.ERROR;
+ /**
+ * 返回状态码
+ */
+ private int code;
+ /**
+ * 响应信息
+ */
+ private String msg;
+ /**
+ * 响应数据
+ */
+ private T data;
+
+ public static Result success() {
+ return restResult(null, SUCCESS, Constants.SUCCESS_MSG);
+ }
+
+ public static Result success(T data) {
+ return restResult(data, SUCCESS, Constants.SUCCESS_MSG);
+ }
+
+ public static Result success(T data, String msg) {
+ return restResult(data, SUCCESS, msg);
+ }
+
+ public static Result error() {
+ return restResult(null, FAIL, Constants.ERROR_MSG);
+ }
+
+ public static Result error(String msg) {
+ return restResult(null, FAIL, msg);
+ }
+
+ public static Result error(T data) {
+ return restResult(data, FAIL, Constants.ERROR_MSG);
+ }
+
+ public static Result error(T data, String msg) {
+ return restResult(data, FAIL, msg);
+ }
+
+ public static Result error(int code, String msg) {
+ return restResult(null, code, msg);
+ }
+
+ private static Result restResult(T data, int code, String msg) {
+ Result apiResult = new Result<>();
+ apiResult.setCode(code);
+ apiResult.setData(data);
+ apiResult.setMsg(msg);
+ return apiResult;
+ }
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/utils/FastUtil.java b/bwie-common/src/main/java/com/bwie/common/utils/FastUtil.java
new file mode 100644
index 0000000..94b1722
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/utils/FastUtil.java
@@ -0,0 +1,55 @@
+package com.bwie.common.utils;
+
+import org.springframework.stereotype.Component;
+import com.github.tobato.fastdfs.domain.fdfs.StorePath;
+import com.github.tobato.fastdfs.service.FastFileStorageClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+/**
+ * @BelongsProject: 0107day02
+ * @BelongsPackage: com.bw.config
+ * @Author: zhupengfei
+ * @CreateTime: 2023-02-01 08:52
+ */
+@Component
+public class FastUtil {
+ private static final Logger log = LoggerFactory.getLogger(FastUtil.class);
+
+ @Resource
+ private FastFileStorageClient storageClient ;
+
+ /**
+ * 上传文件
+ */
+ public String upload(MultipartFile multipartFile) throws Exception{
+ String originalFilename = multipartFile.getOriginalFilename().
+ substring(multipartFile.getOriginalFilename().
+ lastIndexOf(".") + 1);
+ StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
+ multipartFile.getInputStream(),
+ multipartFile.getSize(),originalFilename , null);
+ return storePath.getFullPath() ;
+ }
+ /**
+ * 删除文件
+ */
+ public String deleteFile(String fileUrl) {
+ if (StringUtils.isEmpty(fileUrl)) {
+ log.info("fileUrl == >>文件路径为空...");
+ return "文件路径不能为空";
+ }
+ try {
+ StorePath storePath = StorePath.parseFromUrl(fileUrl);
+ storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ return "删除成功";
+ }
+
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java b/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java
new file mode 100644
index 0000000..f560aa9
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java
@@ -0,0 +1,109 @@
+package com.bwie.common.utils;
+
+import com.bwie.common.constants.JwtConstants;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Map;
+
+/**
+ * @description: Jwt工具类
+ * @author DongZl
+ */
+public class JwtUtils {
+
+ /**
+ * 秘钥
+ */
+ public static String secret = JwtConstants.SECRET;
+
+ /**
+ * 从数据声明生成令牌
+ *
+ * @param claims 数据声明
+ * @return 令牌
+ */
+ public static String createToken(Map claims){
+ String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
+ return token;
+ }
+
+ /**
+ * 从令牌中获取数据声明
+ *
+ * @param token 令牌
+ * @return 数据声明
+ */
+ public static Claims parseToken(String token){
+ return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
+ }
+ /**
+ * 根据令牌获取用户标识
+ *
+ * @param token 令牌
+ * @return 用户ID
+ */
+ public static String getUserKey(String token){
+ Claims claims = parseToken(token);
+ return getValue(claims, JwtConstants.USER_KEY);
+ }
+ /**
+ * 根据令牌获取用户标识
+ *
+ * @param claims 身份信息
+ * @return 用户ID
+ */
+ public static String getUserKey(Claims claims){
+ return getValue(claims, JwtConstants.USER_KEY);
+ }
+ /**
+ * 根据令牌获取用户ID
+ *
+ * @param token 令牌
+ * @return 用户ID
+ */
+ public static String getUserId(String token){
+ Claims claims = parseToken(token);
+ return getValue(claims, JwtConstants.DETAILS_USER_ID);
+ }
+ /**
+ * 根据身份信息获取用户ID
+ *
+ * @param claims 身份信息
+ * @return 用户ID
+ */
+ public static String getUserId(Claims claims){
+ return getValue(claims, JwtConstants.DETAILS_USER_ID);
+ }
+ /**
+ * 根据令牌获取用户名
+ *
+ * @param token 令牌
+ * @return 用户名
+ */
+ public static String getUserName(String token){
+ Claims claims = parseToken(token);
+ return getValue(claims, JwtConstants.DETAILS_USERNAME);
+ }
+ /**
+ * 根据身份信息获取用户名
+ *
+ * @param claims 身份信息
+ * @return 用户名
+ */
+ public static String getUserName(Claims claims){
+ return getValue(claims, JwtConstants.DETAILS_USERNAME);
+ }
+ /**
+ * 根据身份信息获取键值
+ *
+ * @param claims 身份信息
+ * @param key 键
+ * @return 值
+ */
+ public static String getValue(Claims claims, String key){
+ Object obj = claims.get(key);
+ return obj == null ? "" : obj.toString();
+ }
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/utils/OssUtil.java b/bwie-common/src/main/java/com/bwie/common/utils/OssUtil.java
new file mode 100644
index 0000000..9c1383f
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/utils/OssUtil.java
@@ -0,0 +1,153 @@
+package com.bwie.common.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.aliyun.oss.model.PutObjectRequest;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+/**
+ * Oss服务调用
+ */
+@Log4j2
+public class OssUtil {
+
+ /**
+ * Endpoint 存储对象概述 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 访问路径前缀 存储对象概述
+ */
+ private static String endPoint = "oss-cn-shanghai.aliyuncs.com";
+ private static String accessKeyId = "LTAI5tD2tppzLQ4Rb6yKYyph";
+ private static String accessKeySecret = "KEKNKwVvDq7PZLjE63NPBouqHXox4Q";
+ private static String accessPre = "https://dzlmuyu.oss-cn-shanghai.aliyuncs.com/";
+
+ /**
+ * bucket名称
+ * @return
+ */
+ private static String bucketName = "dzlmuyu";
+
+ private static OSS ossClient ;
+
+ static {
+ ossClient = new OSSClientBuilder().build(
+ endPoint,
+ accessKeyId,
+ accessKeySecret);
+ log.info("oss服务连接成功!");
+ }
+
+ /**
+ * 默认路径上传本地文件
+ * @param filePath
+ */
+ public static String uploadFile(String filePath){
+ return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath);
+ }
+
+ /**
+ * 默认路径上传multipartFile文件
+ * @param multipartFile
+ */
+ public static String uploadMultipartFile(MultipartFile multipartFile) {
+ return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile);
+ }
+ /**
+ * 上传 multipartFile 类型文件
+ * @param bucketName
+ * @param ossPath
+ * @param multipartFile
+ */
+ public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){
+ InputStream inputStream = null;
+ try {
+ inputStream = multipartFile.getInputStream();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
+ return accessPre+ossPath;
+ }
+
+ /**
+ * 使用File上传PutObject上传文件 ** 程序默认使用次方法上传
+ * @param bucketName 实例名称
+ * @param ossPath oss存储路径
+ * @param filePath 本地文件路径
+ */
+ public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) {
+ // 创建PutObjectRequest对象。
+ PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));
+
+ // 上传
+ ossClient.putObject(putObjectRequest);
+ return accessPre+ossPath;
+ }
+
+ /**
+ * 使用文件流上传到指定的bucket实例
+ * @param bucketName 实例名称
+ * @param ossPath oss存储路径
+ * @param filePath 本地文件路径
+ */
+ public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){
+
+ // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
+ InputStream inputStream = null;
+ try {
+ inputStream = new FileInputStream(filePath);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
+ uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
+ return accessPre+ossPath;
+ }
+
+ public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){
+ ossClient.putObject(bucketName, ossPath, inputStream);
+ }
+
+ /**
+ * 下载
+ * @param ossFilePath
+ * @param filePath
+ */
+ public static void downloadFile(String ossFilePath , String filePath ){
+ downloadFileForBucket(bucketName , ossFilePath , filePath);
+ }
+ /**
+ * 下载
+ * @param bucketName 实例名称
+ * @param ossFilePath oss存储路径
+ * @param filePath 本地文件路径
+ */
+ public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){
+ ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
+ }
+
+ /**
+ *
+ * @return
+ */
+ public static String getOssDefaultPath(){
+ LocalDateTime now = LocalDateTime.now();
+ String url =
+ now.getYear()+"/"+
+ now.getMonth()+"/"+
+ now.getDayOfMonth()+"/"+
+ now.getHour()+"/"+
+ now.getMinute()+"/";
+ return url;
+ }
+
+ public static String getOssFilePath(String filePath){
+ String fileSuf = filePath.substring(filePath.indexOf(".") + 1);
+ return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf;
+ }
+
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java b/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java
new file mode 100644
index 0000000..93c47fd
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java
@@ -0,0 +1,68 @@
+package com.bwie.common.utils;
+
+import org.springframework.util.AntPathMatcher;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author DongZl
+ * @description: 字符串处理工具类
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils {
+
+ /**
+ * * 判断一个对象是否为空
+ *
+ * @param object Object
+ * @return true:为空 false:非空
+ */
+ public static boolean isNull(Object object) {
+ return object == null;
+ }
+
+ /**
+ * * 判断一个Collection是否为空, 包含List,Set,Queue
+ *
+ * @param coll 要判断的Collection
+ * @return true:为空 false:非空
+ */
+ public static boolean isEmpty(Collection> coll) {
+ return isNull(coll) || coll.isEmpty();
+ }
+
+ /**
+ * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
+ *
+ * @param str 指定字符串
+ * @param strs 需要检查的字符串数组
+ * @return 是否匹配
+ */
+ public static boolean matches(String str, List strs) {
+ if (isEmpty(str) || isEmpty(strs)) {
+ return false;
+ }
+ for (String pattern : strs) {
+ if (isMatch(pattern, str))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断url是否与规则配置:
+ * ? 表示单个字符;
+ * * 表示一层路径内的任意字符串,不可跨层级;
+ * ** 表示任意层路径;
+ *
+ * @param pattern 匹配规则
+ * @param url 需要匹配的url
+ * @return
+ */
+ public static boolean isMatch(String pattern, String url) {
+ AntPathMatcher matcher = new AntPathMatcher();
+ return matcher.match(pattern, url);
+ }
+}
diff --git a/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java b/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java
new file mode 100644
index 0000000..36a1207
--- /dev/null
+++ b/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java
@@ -0,0 +1,88 @@
+package com.bwie.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import lombok.extern.log4j.Log4j2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 短信工具类
+ */
+@Log4j2
+public class TelSmsUtils {
+
+ /**
+ * 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限
+ */
+ private static String accessKeyId = "LTAI5tQYiKvBrFCLCdJViegZ";
+ private static String accessKeySecret = "pzGYeyC6BuXrdIW8f8ueLbdgHSb8MW";
+ private static String templateCode = "SMS10001";
+ /**
+ * 短信访问域名
+ */
+ private static String endpoint = "dysmsapi.aliyuncs.com";
+ /**
+ * 短信签名
+ */
+ private static String signName = "登录验证";
+
+ /**
+ * 实例化短信对象
+ */
+ private static Client client;
+
+ static {
+ log.info("初始化短信服务开始");
+ long startTime = System.currentTimeMillis();
+ try {
+ client = initClient();
+ log.info("初始化短信成功:{}",signName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ log.info("初始化短信服务结束:耗时:{}MS",(System.currentTimeMillis()-startTime));
+ }
+ /**
+ * 初始化短信对象
+ * @return
+ * @throws Exception
+ */
+ private static Client initClient() throws Exception{
+ Config config = new Config()
+ // 您的AccessKey ID
+ .setAccessKeyId(accessKeyId)
+ // 您的AccessKey Secret
+ .setAccessKeySecret(accessKeySecret);
+ // 访问的域名
+ config.endpoint = endpoint;
+ return new Client(config);
+ }
+
+ /**
+ * 发送单条短信
+ * @param phone
+ * @param sendDataMap
+ */
+ public static String sendSms(String phone , Map sendDataMap){
+ SendSmsRequest sendSmsRequest = new SendSmsRequest()
+ .setPhoneNumbers(phone)
+ .setSignName(signName)
+ .setTemplateCode(templateCode)
+ .setTemplateParam(JSONObject.toJSONString(sendDataMap));
+ SendSmsResponse sendSmsResponse = null;
+ try {
+ log.info("发送短信验证码:消息内容是:【{}】", JSONObject.toJSONString(sendDataMap));
+ sendSmsResponse = client.sendSms(sendSmsRequest);
+ } catch (Exception e) {
+ log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", phone, sendDataMap, e);
+ }
+ return JSONObject.toJSONString(sendSmsResponse.getBody());
+ }
+
+
+}
diff --git a/bwie-common/target/bwie-common-1.0-SNAPSHOT.jar b/bwie-common/target/bwie-common-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d103b363cb3b165d3b26c470037a20df602f2ee4
GIT binary patch
literal 27075
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