diff --git a/aos-common/pom.xml b/aos-common/pom.xml index 3a2cfd3..384ba33 100644 --- a/aos-common/pom.xml +++ b/aos-common/pom.xml @@ -3,9 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - aos-core + aos-dependencies com.aos 1.0-SNAPSHOT + ../aos-dependencies/pom.xml 4.0.0 @@ -15,5 +16,18 @@ 8 8 - + + + io.jsonwebtoken + jjwt + + + com.google.guava + guava + + + com.alibaba + transmittable-thread-local + + \ No newline at end of file diff --git a/aos-common/src/main/java/com/aos/common/model/ResultCodeInterface.java b/aos-common/src/main/java/com/aos/common/model/ResultCodeInterface.java new file mode 100644 index 0000000..a3486c0 --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/model/ResultCodeInterface.java @@ -0,0 +1,29 @@ +package com.aos.common.model; + +/** + * 错误码接口 + * + * @author wangyl + * @version V1.0 + * @ClassName: ResultCodeInterface + * @Date: 2022/1/6 16:26 + */ +public interface ResultCodeInterface { + /** + * @return java.lang.Integer + * @Description 获取错误码 + * @Date 2020/11/8 15:37 + * @Author wangyl + * @Version V1.0 + */ + String getCode(); + + /** + * @return java.lang.String + * @Description 获取错误信息 + * @Date 2020/11/8 15:38 + * @Author wangyl + * @Version V1.0 + */ + String getMsg(); +} diff --git a/aos-common/src/main/java/com/aos/common/model/context/CurrentUserContextHolder.java b/aos-common/src/main/java/com/aos/common/model/context/CurrentUserContextHolder.java new file mode 100644 index 0000000..e2e1d86 --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/model/context/CurrentUserContextHolder.java @@ -0,0 +1,56 @@ +/* + * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.aos.common.model.context; + +import com.alibaba.ttl.TransmittableThreadLocal; + +import java.util.Objects; + +/** + * @author: wangyl + * @date: 2022/11/3 + * @description: 用户信息上下文 + */ +public class CurrentUserContextHolder { + private static ThreadLocal userHolder = new TransmittableThreadLocal<>(); + + /** + * 清空 + */ + public static void clearContext() { + userHolder.remove(); + } + + /** + * 删除 + */ + public static SecurityUserInfo getContext() { + SecurityUserInfo securityUserInfo = userHolder.get(); + if (Objects.isNull(securityUserInfo)) { + securityUserInfo = new SecurityUserInfo(); + } + return securityUserInfo; + } + + /** + * 设置 + */ + public static void setContext(SecurityUserInfo context) { + userHolder.set(context); + } + +} diff --git a/aos-common/src/main/java/com/aos/common/model/context/SecurityUserInfo.java b/aos-common/src/main/java/com/aos/common/model/context/SecurityUserInfo.java new file mode 100644 index 0000000..d6423ea --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/model/context/SecurityUserInfo.java @@ -0,0 +1,30 @@ +package com.aos.common.model.context; + +import lombok.Data; + +/** + * @author wangyl + * @version V1.0 + * @ClassName: SecurityUserInfo + * @Function: 认证的用户信息 + * @Date: 2019/12/17 21:24 + */ +@Data +public class SecurityUserInfo { + /** + * 用户名 + */ + private String username = "未知"; + /** + * 登录id + */ + private Long loginId = -1L; + /** + * 邮箱 + */ + private String email = ""; + /** + * 手机号 + */ + private String phone = ""; +} diff --git a/aos-common/src/main/java/com/aos/common/model/exception/AosBaseBizException.java b/aos-common/src/main/java/com/aos/common/model/exception/AosBaseBizException.java new file mode 100644 index 0000000..333c962 --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/model/exception/AosBaseBizException.java @@ -0,0 +1,71 @@ +package com.aos.common.model.exception; + +import com.aos.common.model.ResultCodeInterface; +import lombok.Data; + +/** + * 统一异常 + * + * @author wyl + * @version V1.0 + * @ClassName: BizException + * @Date: 2020/4/12 20:13 + */ +@Data +public class AosBaseBizException extends RuntimeException { + + + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + protected String errorCode; + /** + * 错误信息 + */ + protected String errorMsg; + + public AosBaseBizException() { + super(); + } + + public AosBaseBizException(ResultCodeInterface resultCode) { + super(resultCode.getCode()); + this.errorCode = resultCode.getCode(); + this.errorMsg = resultCode.getMsg(); + } + + public AosBaseBizException(ResultCodeInterface resultCode, Throwable cause) { + super(resultCode.getCode(), cause); + this.errorCode = resultCode.getCode(); + this.errorMsg = resultCode.getMsg(); + } + + public AosBaseBizException(String errorMsg) { + super(errorMsg); + this.errorMsg = errorMsg; + } + + public AosBaseBizException(String errorCode, String errorMsg) { + super(errorCode.toString()); + this.errorCode = errorCode; + this.errorMsg = errorMsg; + } + + public AosBaseBizException(String errorCode, String errorMsg, Throwable cause) { + super(errorCode.toString(), cause); + this.errorCode = errorCode; + this.errorMsg = errorMsg; + } + + @Override + public String getMessage() { + return errorMsg; + } + + @Override + public Throwable fillInStackTrace() { + return this; + } +} diff --git a/aos-common/src/main/java/com/aos/common/model/result/ResultCode.java b/aos-common/src/main/java/com/aos/common/model/result/ResultCode.java new file mode 100644 index 0000000..8b4dd38 --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/model/result/ResultCode.java @@ -0,0 +1,28 @@ +package com.aos.common.model.result; + +import com.aos.common.model.ResultCodeInterface; + +public enum ResultCode implements ResultCodeInterface { + /** + * + */ + SUCCEED("200", "成功"), + FAILED("-1", "系统异常"); + private String code; + private String msg; + + ResultCode(String code, String msg) { + this.code = code; + this.msg = msg; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getMsg() { + return msg; + } +} diff --git a/aos-common/src/main/java/com/aos/common/model/result/WebResult.java b/aos-common/src/main/java/com/aos/common/model/result/WebResult.java new file mode 100644 index 0000000..2020b70 --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/model/result/WebResult.java @@ -0,0 +1,51 @@ +package com.aos.common.model.result; + +import com.aos.common.model.ResultCodeInterface; +import lombok.Getter; +import lombok.Setter; + +/** + * @author wangyl + * @version V1.0 + * @ClassName: WebResult + * @Function: 返回对象 + * @Date: 2020/3/27 10:49 + */ +@Getter +@Setter +public class WebResult { + /** + * 返回码 + */ + private String code; + /** + * 描述信息 + */ + private String msg; + /** + * 返回数据 + */ + private T data; + + public WebResult() { + + } + + public WebResult(String code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public WebResult(ResultCodeInterface resultCode) { + this(resultCode, null); + } + + public WebResult(ResultCodeInterface resultCode, T data) { + this(resultCode.getCode(), resultCode.getMsg(), data); + } + + public WebResult(String code, String msg) { + this(code, msg, null); + } +} diff --git a/aos-common/src/main/java/com/aos/common/thread/TtlThreadPool.java b/aos-common/src/main/java/com/aos/common/thread/TtlThreadPool.java new file mode 100644 index 0000000..8a09f5f --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/thread/TtlThreadPool.java @@ -0,0 +1,20 @@ +package com.aos.common.thread; + +import com.alibaba.ttl.TtlRunnable; +import lombok.Builder; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @author: wangyl + * @date: 2022/11/4 + * @description: ttl的线程池 + */ +@Builder +public class TtlThreadPool extends ThreadPoolExecutor { + + @Override + public void execute(Runnable command) { + TtlRunnable.get(command); + } +} diff --git a/aos-common/src/main/java/com/aos/common/token/TokenUtilBase.java b/aos-common/src/main/java/com/aos/common/token/TokenUtilBase.java new file mode 100644 index 0000000..2dd9f38 --- /dev/null +++ b/aos-common/src/main/java/com/aos/common/token/TokenUtilBase.java @@ -0,0 +1,189 @@ +/** + * @Author wangyl + * @E-mail wangyl@dsgdata.com + **/ +package com.aos.common.token; + +import com.google.common.base.Strings; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; +import java.util.Date; +import java.util.Map; +import java.util.Objects; + +/** + * @author wyl + * @version V1.0 + * @ClassName: TokenUtilBase + * @Function: 提供部分jwt 基础接口 + * @Date: 2019/12/17 0:36 + */ +public class TokenUtilBase { + + /** + * 生成一个token + * + * @param claims 需要存储的信息 + * @param expireTime 设置token的超时时间 + * @return java.lang.String + * @Date 2019/12/17 1:02 + * @Author wangyl + * @Version V1.0 + */ + public static String generateToken(Map claims, Long expireTime, String jwtSecret) { + Date expirationDate = generalExpirationDate(expireTime); + return Jwts.builder() + .setClaims(claims) + .setExpiration(expirationDate) + .signWith(SignatureAlgorithm.HS512, generalKey(jwtSecret)) + .compact(); + } + + /** + * 使用默认的密钥,默认超时时间 生成token + * + * @param claims + * @return java.lang.String + * @Date 2022/11/3 + * @Author wangyl + */ + public static String generateToken(Map claims) { + return generateToken(claims, null, null); + } + + /** + * 使用默认的密钥,指定超时时间 生成token + * + * @param claims + * @param expireTime + * @return java.lang.String + * @Date 2022/11/3 + * @Author wangyl + */ + public static String generateToken(Map claims, Long expireTime) { + return generateToken(claims, expireTime, null); + } + + /** + * 使用默认的超时时间,指定密钥 生成token + * + * @param claims 需要存储的信息 + * @return java.lang.String + * @Date 2019/12/17 20:38 + * @Author wangyl + * @Version V1.0 + */ + public static String generateToken(Map claims, String jwtSecret) { + return generateToken(claims, null, jwtSecret); + } + + + /** + * 从Token中获取Claims信息 + * + * @param token + * @return io.jsonwebtoken.Claims + * @Date 2019/12/17 13:24 + * @Author wangyl + * @Version V1.0 + */ + public static Claims getClaimsFromToken(String token, String jwtSecret) { + Claims claims = Jwts.parser() + .setSigningKey(generalKey(jwtSecret)) + .parseClaimsJws(token) + .getBody(); + return claims; + } + + /** + * 从Token中获取Claims信息 + * + * @param token + * @return io.jsonwebtoken.Claims + * @Date 2019/12/17 13:24 + * @Author wangyl + * @Version V1.0 + */ + public static Claims getClaimsFromToken(String token) { + return getClaimsFromToken(token, null); + } + + /** + * @param token + * @return java.lang.Boolean + * @Description 判断Token是否时效 + * @Date 2019/12/17 13:41 + * @Author wangyl + * @Version V1.0 + */ + public Boolean tokenExpired(String token, String jwtSecret) { + Claims claims = getClaimsFromToken(token, jwtSecret); + Date expiration = claims.getExpiration(); + return expiration.after(new Date()); + } + + + /** + * 判断Token是否时效 + * + * @param token + * @return java.lang.Boolean + * @Date 2019/12/17 13:41 + * @Author wangyl + * @Version V1.0 + */ + public Boolean tokenExpired(String token) { + return tokenExpired(token, null); + } + + /** + * @param + * @return javax.crypto.SecretKey + * @Description 通过Base64加密生成秘钥 + * @Date 2019/12/17 0:56 + * @Author wangyl + * @Version V1.0 + */ + private static SecretKey generalKey(String jwtSecret) { + if (Strings.isNullOrEmpty(jwtSecret)) { + jwtSecret = TokenConstant.jwtSecret; + } + byte[] encodedKey = Base64.getDecoder().decode(jwtSecret); + SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); + return key; + } + + /** + * 生成超时时间 + * + * @param expireTime + * @return java.util.Date + * @Date 2022/11/3 + * @Author wangyl + */ + private static Date generalExpirationDate(Long expireTime) { + if (Objects.isNull(expireTime) || Objects.equals(expireTime, 0L)) { + expireTime = TokenConstant.expireTime; + } + Date expirationDate = new Date(System.currentTimeMillis() + expireTime); + return expirationDate; + } +} + +class TokenConstant { + /** + * 密钥 + */ + final static String jwtSecret = "wylaigyx"; + /** + * 默认有效期1小时 + */ + final static long expireTime = 60 * 60 * 1000; + +} + diff --git a/aos-dependencies/pom.xml b/aos-dependencies/pom.xml index 8d8393b..6f6b0a5 100644 --- a/aos-dependencies/pom.xml +++ b/aos-dependencies/pom.xml @@ -6,6 +6,7 @@ aos-core com.aos 1.0-SNAPSHOT + ../pom.xml 4.0.0 aos-dependencies @@ -30,6 +31,8 @@ 2.2.7.RELEASE Hoxton.SR12 2.3.12.RELEASE + 0.9.1 + 2.11.4 @@ -75,7 +78,12 @@ mybatis-plus-extension ${mybatis-plus.version} - + + + com.google.guava + guava + ${guava.version} + io.springfox @@ -98,6 +106,19 @@ knife4j-spring-ui ${swagger-bootstrap-ui.knife4j.version} + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + com.alibaba + transmittable-thread-local + ${ttl.version} + + @@ -105,7 +126,6 @@ org.projectlombok lombok 1.18.24 - provided org.slf4j @@ -113,18 +133,26 @@ 1.7.30 + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.0 + + true + + + + compile + + jar + + + + + + - - - nexus - releases - https://maven.wylgyx.top/repository/maven-releases/ - - - nexus - snapshots - https://maven.wylgyx.top/repository/maven-snapshots/ - - \ No newline at end of file diff --git a/aos-log/pom.xml b/aos-log/pom.xml index a20e038..1c3f490 100644 --- a/aos-log/pom.xml +++ b/aos-log/pom.xml @@ -3,9 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - aos-core + aos-dependencies com.aos 1.0-SNAPSHOT + ../aos-dependencies/pom.xml 4.0.0 diff --git a/aos-swagger/pom.xml b/aos-swagger/pom.xml new file mode 100644 index 0000000..8ecb5fb --- /dev/null +++ b/aos-swagger/pom.xml @@ -0,0 +1,39 @@ + + + + aos-dependencies + com.aos + 1.0-SNAPSHOT + ../aos-dependencies/pom.xml + + 4.0.0 + + aos-swagger + + + 8 + 8 + + + + + io.springfox + springfox-swagger2 + + + io.swagger + swagger-annotations + + + + io.springfox + springfox-swagger-ui + + + com.github.xiaoymin + knife4j-spring-ui + + + \ No newline at end of file diff --git a/aos-swagger/src/main/java/com/aos/swagger/conf/SwaggerConfig.java b/aos-swagger/src/main/java/com/aos/swagger/conf/SwaggerConfig.java new file mode 100644 index 0000000..d18d294 --- /dev/null +++ b/aos-swagger/src/main/java/com/aos/swagger/conf/SwaggerConfig.java @@ -0,0 +1,71 @@ +package com.aos.swagger.conf; + +import com.aos.swagger.enable.EnableSwagger; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.type.AnnotationMetadata; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @author: zeng li liang + * @date: 2022/4/21 + * @description: + */ +public class SwaggerConfig implements ImportBeanDefinitionRegistrar { + + @Override + public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { + + //获取EnableEcho注解的所有属性的value + Map attributes = annotationMetadata.getAnnotationAttributes(EnableSwagger.class.getName()); + //获取package属性的value + List applicationNames = Arrays.asList((String[]) attributes.get("applicationName")); + List scanPackagesPaths = Arrays.asList((String[]) attributes.get("scanPackagesPath")); + int size = applicationNames.size(); + for (int i = 0; i < size; i++) { + //使用beanDefinitionRegistry对象将EchoBeanPostProcessor注入至Spring容器中 + String applicationName = applicationNames.get(i); + String scanPackagesPath = scanPackagesPaths.get(i); + + beanDefinitionRegistry.registerBeanDefinition(applicationName, beanDefinitionBuilder.getBeanDefinition()); + AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(); + ConfigurableListableBeanFactory beanFactory = annotationConfigApplicationContext.getBeanFactory(); + beanFactory.registerSingleton(); + } + + } + + + // @Value("${spring.application.name}") +// private String applicationName; +// + public Docket createRestApi(String applicationName) { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo(applicationName)) + .groupName(applicationName) + .select() + .apis(RequestHandlerSelectors.basePackage("com.asura")) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo(String applicationName) { + return new ApiInfoBuilder() + .title(applicationName + " swagger apis") + .description("swagger-bootstrap-ui") + .termsOfServiceUrl("") + .version("1.0") + .build(); + } +} diff --git a/aos-swagger/src/main/java/com/aos/swagger/enable/EnableSwagger.java b/aos-swagger/src/main/java/com/aos/swagger/enable/EnableSwagger.java new file mode 100644 index 0000000..83673e1 --- /dev/null +++ b/aos-swagger/src/main/java/com/aos/swagger/enable/EnableSwagger.java @@ -0,0 +1,27 @@ +package com.aos.swagger.enable; + +import com.aos.swagger.conf.SwaggerConfig; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author: wangyl + * @date: 2022/11/4 + * @description: 启动swagger的注解 + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import({SwaggerConfig.class}) +public @interface EnableSwagger { + /** + * swagger显示的名称 + * + * @param + * @return java.lang.String + * @Date 2022/11/4 + * @Author wangyl + */ + String applicationName(); +} diff --git a/aos-web/pom.xml b/aos-web/pom.xml new file mode 100644 index 0000000..2b51990 --- /dev/null +++ b/aos-web/pom.xml @@ -0,0 +1,39 @@ + + + + aos-dependencies + com.aos + 1.0-SNAPSHOT + ../aos-dependencies/pom.xml + + 4.0.0 + + aos-web + + + 8 + 8 + + + + + io.springfox + springfox-swagger2 + + + io.swagger + swagger-annotations + + + + io.springfox + springfox-swagger-ui + + + com.github.xiaoymin + knife4j-spring-ui + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 902412f..d36eb4e 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,20 @@ aos-common aos-feign aos-log - aos-common + aos-swagger + aos-web pom + + + nexus + releases + https://maven.wylgyx.top/repository/maven-releases/ + + + nexus + snapshots + https://maven.wylgyx.top/repository/maven-snapshots/ + +