ansteel-biz/pom.xml
@@ -111,6 +111,11 @@ <version>2.3.2</version> </dependency> <dependency> <groupId>com.iailab</groupId> <artifactId>iailab-common-mq</artifactId> </dependency> </dependencies> <build> ansteel-biz/src/main/java/com/iailab/module/ansteel/client/OAuth2Client.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/client/UserClient.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/oauth2/OAuth2AccessTokenRespDTO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/oauth2/OAuth2CheckTokenRespDTO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/user/UserInfoRespDTO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/user/UserUpdateReqDTO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/config/FeignTokenInterceptor.java
对比新文件 @@ -0,0 +1,43 @@ package com.iailab.module.ansteel.config; import com.iailab.module.ansteel.util.token.IailabClient; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @Configuration public class FeignTokenInterceptor implements RequestInterceptor { @Autowired private IailabClient iailabClient; @Override public void apply(RequestTemplate requestTemplate) { // 从当前请求上下文中获取Token String token = getTokenFromCurrentRequest(); if (token == null) { // 如果没有获取到Token,从system-server中获取token token = iailabClient.getToken(); if (token!= null) { requestTemplate.header(HttpHeaders.AUTHORIZATION, token); } Long tenantId = iailabClient.getTenantId(); if (tenantId != null) { requestTemplate.header("tenant-id", String.valueOf(tenantId)); } } } private String getTokenFromCurrentRequest() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes!= null) { return attributes.getRequest().getHeader(HttpHeaders.AUTHORIZATION); } return null; } } ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/auth/AuthController.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/DemoController.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoPageReqVO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoRespVO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoSaveReqVO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/package-info.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/ip/AppAreaController.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/ip/vo/AppAreaNodeRespVO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/package-info.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/package-info.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/dataobject/demo/DemoDO.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/dataobject/package-info.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/mysql/demo/DemoMapper.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/mysql/package-info.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/common/constant/CommonConstant.java
对比新文件 @@ -0,0 +1,26 @@ package com.iailab.module.ansteel.mq.common.constant; /** * @Description: 通用常量 */ public interface CommonConstant { //压缩空气调度方案code String COMPRESSOR_CODE = "Air"; //蒸汽调度方案code String STEAM_CODE = "sha01"; //氧气班平衡计划方案code String OXYGEN_ONE_CODE = "oxygen01"; //氧气系统优化调度决策方案code String OXYGEN_TWO_CODE = "oxygen02"; //超上限 String EXCEEDING_UPPER_LIMIT = "UpperLimit"; //超下限 String EXCEEDING_LOWER_LIMIT = "LowerLimit"; } ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/common/constant/RoutingConstant.java
对比新文件 @@ -0,0 +1,12 @@ package com.iailab.module.ansteel.mq.common.constant; public interface RoutingConstant { String EXCHANGE = "FastAnsteel"; // 预测模型完成路由 String Iailab_Model_PredictFinish = "Iailab.Model.PredictFinish"; //预警消息路由 String Iailab_Model_Alarm = "Iailab.Model.Alarm"; } ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/package-info.java
对比新文件 @@ -0,0 +1 @@ package com.iailab.module.ansteel.mq; ansteel-biz/src/main/java/com/iailab/module/ansteel/service/demo/DemoService.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/service/demo/DemoServiceImpl.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/service/package-info.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/util/SecurityUtils.java
文件已删除 ansteel-biz/src/main/java/com/iailab/module/ansteel/util/SpringContextUtils.java
对比新文件 @@ -0,0 +1,47 @@ package com.iailab.module.ansteel.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * Spring Context 工具类 * * @author Mark sunlightcs@gmail.com */ @Component public class SpringContextUtils implements ApplicationContextAware { public static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtils.applicationContext = applicationContext; } public static Object getBean(String name) { return applicationContext.getBean(name); } public static <T> T getBean(Class<T> requiredType) { return applicationContext.getBean(requiredType); } public static <T> T getBean(String name, Class<T> requiredType) { return applicationContext.getBean(name, requiredType); } public static boolean containsBean(String name) { return applicationContext.containsBean(name); } public static boolean isSingleton(String name) { return applicationContext.isSingleton(name); } public static Class<? extends Object> getType(String name) { return applicationContext.getType(name); } } ansteel-biz/src/main/java/com/iailab/module/ansteel/util/token/IailabClient.java
对比新文件 @@ -0,0 +1,145 @@ package com.iailab.module.ansteel.util.token; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.Assert; import org.springframework.util.Base64Utils; import org.springframework.util.ObjectUtils; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.Map; /** * @author PanZhibao * @Description * @createTime 2024年11月21日 */ @Slf4j @Component public class IailabClient { /** * 平台地址 */ @Value("${iailab.token.base-url}") private String BASE_URL; /** * 租户编号 */ @Value("${iailab.token.tenant-id}") private String TENANT_ID; /** * 客户端信息 */ @Value("${iailab.token.client-id}") private String CLIENT_ID; @Value("${iailab.token.client-secret}") private String CLIENT_SECRET; @Value("${iailab.token.username}") private String USERNAME; @Value("${iailab.token.password}") private String PASSWORD; private static final String GRAND_TYPE = "password"; private static final String SCOPE = "user.read user.write"; private static final RestTemplate restTemplate = new RestTemplate(); // 鉴权token private String accessToken; // 刷新token private String refreshToken; // 鉴权token过期时间 private Long expireTime; /** * 用户名密码方式获取平台token */ private synchronized void authenticate() { log.info("获取平台token"); // 1.1 构建请求头 HttpHeaders headers = new HttpHeaders(); addClientHeader(headers); // 1.2 构建authenticate请求URL String authenticateUrl = BASE_URL + "/oauth2/token?" // 密码模式的参数 + "grant_type=" + GRAND_TYPE + "&username=" + USERNAME + "&password=" + PASSWORD + "&scope=" + SCOPE; // 2. 执行请求 ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( authenticateUrl, HttpMethod.POST, new org.springframework.http.HttpEntity<>(headers), new ParameterizedTypeReference<Map<String, Object>>() { }); Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); log.info(exchange.toString()); Map<String, Object> authMap = exchange.getBody(); accessToken = authMap.get("access_token").toString(); refreshToken = authMap.get("refresh_token").toString(); expireTime = Long.valueOf(authMap.get("expires_time").toString()); } private synchronized void refreshToken() { log.info("刷新token"); // 1.1 构建请求头 HttpHeaders headers = new HttpHeaders(); addClientHeader(headers); // 1.2 构建authenticate请求URL String authenticateUrl = BASE_URL + "/system/auth/client-refresh-token?refreshToken=" + refreshToken + "&clientId=" + CLIENT_ID; // 2. 执行请求 ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( authenticateUrl, HttpMethod.POST, new org.springframework.http.HttpEntity<>(headers), new ParameterizedTypeReference<Map<String, Object>>() { }); Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); Map<String, Object> authMap = exchange.getBody(); //刷新token过期,重新获取token if (!ObjectUtils.isEmpty(authMap.get("code"))) { Integer code = Integer.valueOf(authMap.get("code").toString()); if (code == 401) { authenticate(); } } else { accessToken = authMap.get("access_token").toString(); expireTime = Long.valueOf(authMap.get("expires_time").toString()); } } private void addClientHeader(HttpHeaders headers) { // client 拼接,需要 BASE64 编码 String client = CLIENT_ID + ":" + CLIENT_SECRET; client = Base64Utils.encodeToString(client.getBytes(StandardCharsets.UTF_8)); headers.add("Authorization", "Basic " + client); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); headers.set("tenant-id", getTenantId().toString()); } public String getToken() { //第一次请求或者token过期,需要重新获取token if(ObjectUtils.isEmpty(accessToken)) { authenticate(); } else if (expireTime < System.currentTimeMillis() / 1000) { refreshToken(); } return accessToken; } public Long getTenantId() { return Long.valueOf(TENANT_ID); } } pom.xml
@@ -154,17 +154,10 @@ <version>${revision}</version> </dependency> <!-- Spring 核心 --> <dependency> <!-- 用于生成自定义的 Spring @ConfigurationProperties 配置类的说明文件 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>${spring.boot.version}</version> </dependency> <!-- 消息队列相关 --> <dependency> <groupId>com.iailab</groupId> <artifactId>iailab-common-env</artifactId> <artifactId>iailab-common-mq</artifactId> <version>${revision}</version> </dependency> @@ -182,12 +175,6 @@ </dependency> <dependency> <groupId>com.iailab</groupId> <artifactId>iailab-common-websocket</artifactId> <version>${revision}</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <!-- 接口文档 UI:默认 --> <artifactId>springdoc-openapi-ui</artifactId> <version>${springdoc.version}</version> @@ -197,22 +184,12 @@ <artifactId>knife4j-openapi3-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <!-- 接口文档 UI:knife4j【网关专属】 --> <artifactId>knife4j-gateway-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency> <!-- DB 相关 --> <dependency> <groupId>com.iailab</groupId> <artifactId>iailab-common-mybatis</artifactId> <version>${revision}</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-webflux-ui</artifactId> <version>${springdoc.version}</version> </dependency> <dependency> @@ -225,11 +202,7 @@ <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <!-- 代码生成器,使用它解析表结构 --> <version>${mybatis-plus-generator.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 --> @@ -279,29 +252,11 @@ <version>${redisson.version}</version> </dependency> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>${dm8.jdbc.version}</version> </dependency> <!-- RPC 远程调用相关 --> <dependency> <groupId>com.iailab</groupId> <artifactId>iailab-common-rpc</artifactId> <version>${revision}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>lock4j-redisson-spring-boot-starter</artifactId> <version>${lock4j.version}</version> <exclusions> <exclusion> <artifactId>redisson-spring-boot-starter</artifactId> <groupId>org.redisson</groupId> </exclusion> </exclusions> </dependency> <!-- 监控相关 --> @@ -372,38 +327,11 @@ <version>${easyexcel.verion}</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <!-- 文件类型的识别 --> <version>${tika-core.version}</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>${velocity.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <groupId>cn.smallbun.screw</groupId> <artifactId>screw-core</artifactId> <!-- 实现数据库文档 --> <version>${screw.version}</version> <exclusions> <exclusion> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <!-- 移除 Freemarker 依赖,采用 Velocity 作为模板引擎 --> </exclusion> <exclusion> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <!-- 最新版screw-core1.0.5依赖fastjson1.2.73存在漏洞,移除。 --> </exclusion> </exclusions> </dependency> <dependency> @@ -413,26 +341,9 @@ </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>${guice.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>transmittable-thread-local</artifactId> <!-- 解决 ThreadLocal 父子线程的传值问题 --> <version>${transmittable-thread-local.version}</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <!-- 解决 ftp 连接 --> <version>${commons-net.version}</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <!-- 解决 sftp 连接 --> <version>${jsch.version}</version> </dependency> <dependency>