From 44a3a059ab5b3c52bf475a5e7fdc30223ddf0a87 Mon Sep 17 00:00:00 2001 From: zouyu <2723363702@qq.com> Date: 星期二, 12 八月 2025 14:19:02 +0800 Subject: [PATCH] 浪潮对接单点登录 --- src/main/java/com/ruoyi/tide/controller/TideController.java | 94 ++++++++++ src/main/java/com/ruoyi/tide/pojo/TidePojo.java | 31 +++ pom.xml | 5 src/main/java/com/ruoyi/tide/utils/TideUtils.java | 172 +++++++++++++++++++ src/main/resources/application-tide.yml | 219 ++++++++++++++++++++++++ src/main/resources/application.yml | 2 6 files changed, 522 insertions(+), 1 deletions(-) diff --git a/pom.xml b/pom.xml index c802315..6a0e071 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,11 @@ </properties> <dependencies> + <dependency> + <groupId>cn.hutool</groupId> + <artifactId>hutool-all</artifactId> + <version>5.8.18</version> + </dependency> <!-- ruoyi-springboot2 / swagger knife4j 閰嶇疆 --> <dependency> <groupId>com.github.xiaoymin</groupId> diff --git a/src/main/java/com/ruoyi/tide/controller/TideController.java b/src/main/java/com/ruoyi/tide/controller/TideController.java new file mode 100644 index 0000000..335b174 --- /dev/null +++ b/src/main/java/com/ruoyi/tide/controller/TideController.java @@ -0,0 +1,94 @@ +package com.ruoyi.tide.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.aspectj.lang.annotation.Anonymous; +import com.ruoyi.framework.security.service.SysLoginService; +import com.ruoyi.framework.web.domain.AjaxResult; +import com.ruoyi.project.system.domain.SysUser; +import com.ruoyi.project.system.service.ISysUserService; +import com.ruoyi.tide.pojo.TidePojo; +import com.ruoyi.tide.utils.TideUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +@RequestMapping("/tide") +@RestController +@Api(tags = "瀵规帴娴疆绯荤粺") +@Anonymous +@Slf4j +public class TideController { + + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysUserService userService; + + @ApiOperation(value = "鐧诲綍") + @PostMapping("/tideLogin") + public AjaxResult login(@RequestBody TidePojo tidePojo) { + String token = TideUtils.getToken(tidePojo.getCode()); + JSONObject userInfo = TideUtils.getUserInfo(token); + JSONObject tenant = JSONObject.parseObject(userInfo.get("tenant").toString()); + AjaxResult ajax = AjaxResult.success(); + // 鐢熸垚浠ょ墝 + String generateToken = loginService.login(tenant.get("tenantAccount").toString(), tenant.get("tenantPassword").toString(), null, + IdWorker.get32UUID()); + ajax.put(Constants.TOKEN, generateToken); + return ajax; + } + + @PostMapping("/applicationOrdering") + public JSONObject order (@RequestBody TidePojo tidePojo) { + SysUser user = userService.selectUserByUserName(tidePojo.getPltAccountLogin()); + String randomString = TideUtils.getRandomString(12); + //璐﹀彿涓嶅瓨鍦紝鎵ц鏂板鎿嶄綔 + if(Objects.isNull(user)){ + user = new SysUser(); + String password = SecurityUtils.encryptPassword(randomString); + user.setPassword(password); + user.setUserName(tidePojo.getPltAccountLogin()); + user.setNickName(tidePojo.getEnterpriseName()); + user.setStatus("0"); + user.setDelFlag("0"); + user.setPostIds(new Long[]{1L}); + user.setRoleId(1L); + userService.insertUser(user); + } + Map<String, Object> map = new HashMap<>(); + map.put("account", tidePojo.getPltAccountLogin()); + map.put("token", randomString); + map.put("tenantId", user.getUserId()); + return TideUtils.getResult(20000, "鎴愬姛", map); + } + + @PostMapping("/cancellation") + public JSONObject cancellation (@RequestBody TidePojo tidePojo) { + log.info("鎵ц浜嗘敞閿�淇℃伅锛�" + tidePojo); + if(Objects.nonNull(tidePojo)){ + SysUser sysUser = userService.selectUserByUserName(tidePojo.getPltAccountLogin()); + if(Objects.nonNull(sysUser)){ + userService.deleteUserById(sysUser.getUserId()); + } + } + return TideUtils.getResult(20000, "鎴愬姛", null); + } + + public static void main(String[] args) { + String password = SecurityUtils.encryptPassword("c($Rb_@!n%U7"); + System.out.println(password); + } +} diff --git a/src/main/java/com/ruoyi/tide/pojo/TidePojo.java b/src/main/java/com/ruoyi/tide/pojo/TidePojo.java new file mode 100644 index 0000000..45e5eab --- /dev/null +++ b/src/main/java/com/ruoyi/tide/pojo/TidePojo.java @@ -0,0 +1,31 @@ +package com.ruoyi.tide.pojo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class TidePojo { + @ApiModelProperty("浼佷笟鍚嶇О") + private String enterpriseName; + + @ApiModelProperty("骞冲彴鐢ㄦ埛") + private String pltUserCn; + + @ApiModelProperty("骞冲彴璐﹀彿") + private String pltAccountLogin; + + @ApiModelProperty("璁㈣喘鏃堕暱") + private Integer purchaseDuration; + + @ApiModelProperty("璁㈠崟鏃堕暱鍗曚綅") + private String purchaseUnit; + + @ApiModelProperty("appKey") + private String appKey; + + @ApiModelProperty("appSecret") + private String appSecret; + + @ApiModelProperty("code") + private String code; +} diff --git a/src/main/java/com/ruoyi/tide/utils/TideUtils.java b/src/main/java/com/ruoyi/tide/utils/TideUtils.java new file mode 100644 index 0000000..4cac75a --- /dev/null +++ b/src/main/java/com/ruoyi/tide/utils/TideUtils.java @@ -0,0 +1,172 @@ +package com.ruoyi.tide.utils; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.digest.HMac; +import cn.hutool.crypto.digest.HmacAlgorithm; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.HashMap; + +@Data +@Component +@Slf4j +public class TideUtils { + private final static String appId = "19472937-3039-4bf1-8334-13dc20e076e5"; + + private final static String appSecret = "b57bbad60724f810e7bb7e1e7b8791b63eba50e50faef6fa819ade822fac9e4a"; + + // 鍐呯綉鍦板潃 + private final static String ip = "http://58.56.84.138:8083"; + + // MD5鍔犲瘑骞惰浆鎹负16杩涘埗 + public static String md5Encryption(String input) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(input.getBytes()); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b & 0xff)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + } + + // get璇锋眰 + public static HashMap<String, String> getGetHeader(String parameter) { + // 鏃堕棿鎴� + String xTime = String.valueOf(DateUtil.current()); + // 鑾峰彇闅忔満16浣嶅瓧绗︿覆 + String xRandom = RandomUtil.randomString(16); + String xSignSplicingTogether; + // 鏈夊弬鏁� + if (ObjectUtils.isNotEmpty(parameter)) { + // 鍔犲瘑寰楀嚭x-body + String xBody = md5Encryption(parameter); + // 涓簒-sign鍔犲瘑鍋氭嫾鎺� + xSignSplicingTogether = "x-body=" + xBody + "&x-random=" + xRandom + "&x-time=" + xTime; + // 鏃犲弬鏁� + } else { + xSignSplicingTogether = "x-random=" + xRandom + "&x-time=" + xTime; + } + // 閰嶇疆鍔犲瘑鏂瑰紡涓庡瘑閽� + HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, appSecret.getBytes()); + // 寰楀嚭x-sign + String xSign = hMac.digestHex(xSignSplicingTogether); + HashMap<String, String> result = new HashMap<>(); + result.put("x-time", xTime); + result.put("x-random", xRandom); + result.put("x-sign", xSign); + result.put("appKey", appId); + return result; + } + + // post璇锋眰 + public static HashMap<String, String> getPostHeader(String parameter) { + // 鏃堕棿鎴� + String xTime = String.valueOf(DateUtil.current()); + // 鑾峰彇闅忔満16浣嶅瓧绗︿覆 + String xRandom = RandomUtil.randomString(16); + String xSignSplicingTogether; + // 鏈夊弬鏁� + if (ObjectUtils.isNotEmpty(parameter)) { + // 鍔犲瘑寰楀嚭x-body + String xBody = md5Encryption(parameter); + // 涓簒-sign鍔犲瘑鍋氭嫾鎺� + xSignSplicingTogether = "x-body=" + xBody + "&x-random=" + xRandom + "&x-time=" + xTime; + // 鏃犲弬鏁� + } else { + xSignSplicingTogether = "x-random=" + xRandom + "&x-time=" + xTime; + } + // x-sign 鍔犲瘑 + HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, appSecret.getBytes()); + String xSign = hMac.digestHex(xSignSplicingTogether); + HashMap<String, String> result = new HashMap<>(); + result.put("x-time", xTime); + result.put("x-random", xRandom); + result.put("x-sign", xSign); + result.put("appKey", appId); + return result; + } + + /** + * 浜斿垎閽熶竴娆$殑蹇冭烦 + */ +// @Scheduled(cron = "0 0/5 * * * ?") + public static void heartbeat(){ + HashMap<String, String> header = getGetHeader(null); + String url = ip + "/cpn/api/extra/v1/application/heartbeat"; + String body = HttpRequest.get(url).headerMap(header, false).execute().body(); + System.out.println(body + "=======MES蹇冭烦鎵ц鎴愬姛锛�"); + } + + // 鑾峰彇token + public static String getToken(String code) { + String url = ip + "/cpn/extral/applicationCode/appAuthCheck"; + JSONObject json = new JSONObject(); + json.put("code", code); + json.put("appID", appId); + json.put("appSecret", appSecret); + HashMap<String, String> header = getPostHeader(json.toString()); + String body = HttpRequest.post(url) + .headerMap(header, false) + .body(json.toString()) + .execute().body(); + JSONObject jsonObject = JSONObject.parseObject(body); + return jsonObject.get("data").toString(); + } + + // 鑾峰彇鐢ㄦ埛淇℃伅 + public static JSONObject getUserInfo(String token) { + String url = ip + "/cpn/api/extral/applicationCode/getUserInfoByToken"; + JSONObject json = new JSONObject(); + json.put("appID", appId); + HashMap<String, String> header = getPostHeader(json.toString()); + header.put("Authorization", token); + String body = HttpRequest.post(url) + .headerMap(header, false) + .body(json.toString()) + .execute().body(); + JSONObject jsonObject = JSONObject.parseObject(body); + return JSONObject.parseObject(jsonObject.get("data").toString()); + } + + public static JSONObject getResult(Integer code, String msg, Object data) { + JSONObject json = new JSONObject(); + json.put("code", code); + json.put("msg", msg); + json.put("data", data); + String xRandom = RandomUtil.randomString(16); + json.put("traceId", xRandom); + return json; + } + + public static String getRandomString(int length) { + SecureRandom random = new SecureRandom(); + String uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + String lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"; + String numbers = "0123456789"; + String specialCharacters = "!@$%^&*()_+-=."; + String characterSet = uppercaseLetters + lowercaseLetters + numbers + specialCharacters; + StringBuilder passwordBuilder = new StringBuilder(); + + for (int i = 0; i < length; i++) { + int randomIndex = random.nextInt(characterSet.length()); + char randomChar = characterSet.charAt(randomIndex); + passwordBuilder.append(randomChar); + } + + return passwordBuilder.toString(); + } +} \ No newline at end of file diff --git a/src/main/resources/application-tide.yml b/src/main/resources/application-tide.yml new file mode 100644 index 0000000..cdfff17 --- /dev/null +++ b/src/main/resources/application-tide.yml @@ -0,0 +1,219 @@ +# 椤圭洰鐩稿叧閰嶇疆 +ruoyi: + # 鍚嶇О + name: RuoYi + # 鐗堟湰 + version: 3.8.9 + # 鐗堟潈骞翠唤 + copyrightYear: 2025 + # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛� + profile: /center-lims/mis/file + + # 鑾峰彇ip鍦板潃寮�鍏� + addressEnabled: false + # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉 + captchaType: math + +# 寮�鍙戠幆澧冮厤缃� +server: + # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080 + port: 7003 + servlet: + # 搴旂敤鐨勮闂矾寰� + context-path: / + tomcat: + # tomcat鐨刄RI缂栫爜 + uri-encoding: UTF-8 + # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100 + accept-count: 1000 + threads: + # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200 + max: 800 + # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10 + min-spare: 100 + +# 鏃ュ織閰嶇疆 +logging: + level: + com.ruoyi: warn + org.springframework: warn + +minio: + endpoint: http://114.132.189.42/ + port: 7019 + secure: false + accessKey: admin + secretKey: 12345678 + preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂 + default-bucket: uploadPath +# 鐢ㄦ埛閰嶇疆 +user: + password: + # 瀵嗙爜鏈�澶ч敊璇鏁� + maxRetryCount: 5 + # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛� + lockTime: 10 + +# Spring閰嶇疆 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 涓诲簱鏁版嵁婧� + master: + url: jdbc:mysql://10.136.12.71:3306/mis_ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: zttZTT123! + # 浠庡簱鏁版嵁婧� + slave: + # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴 + enabled: false + url: + username: + password: + # 鍒濆杩炴帴鏁� + initialSize: 5 + # 鏈�灏忚繛鎺ユ睜鏁伴噺 + minIdle: 10 + # 鏈�澶ц繛鎺ユ睜鏁伴噺 + maxActive: 20 + # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂� + maxWait: 60000 + # 閰嶇疆杩炴帴瓒呮椂鏃堕棿 + connectTimeout: 30000 + # 閰嶇疆缃戠粶瓒呮椂鏃堕棿 + socketTimeout: 60000 + # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣 + timeBetweenEvictionRunsMillis: 60000 + # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣 + minEvictableIdleTimeMillis: 300000 + # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣 + maxEvictableIdleTimeMillis: 900000 + # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁� + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂� + allow: + url-pattern: /druid/* + # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮� + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 鎱QL璁板綍 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # 璧勬簮淇℃伅 + messages: + # 鍥介檯鍖栬祫婧愭枃浠惰矾寰� + basename: i18n/messages + # 鏂囦欢涓婁紶 + servlet: + multipart: + # 鍗曚釜鏂囦欢澶у皬 + max-file-size: 1GB + # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬 + max-request-size: 2GB + # 鏈嶅姟妯″潡 + devtools: + restart: + # 鐑儴缃插紑鍏� + enabled: false + # redis 閰嶇疆 + redis: + # 鍦板潃 + host: 127.0.0.1 +# host: 172.17.0.1 + # 绔彛锛岄粯璁や负6379 + port: 6379 + # 鏁版嵁搴撶储寮� + database: 0 + # 瀵嗙爜 + password: 123456 +# password: + + # 杩炴帴瓒呮椂鏃堕棿 + timeout: 10s + lettuce: + pool: + # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺� + min-idle: 0 + # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺� + max-idle: 8 + # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁� + max-active: 8 + # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級 + max-wait: -1ms + +# token閰嶇疆 +token: + # 浠ょ墝鑷畾涔夋爣璇� + header: Authorization + # 浠ょ墝瀵嗛挜 + secret: abcdefghijklmnopqrstuvwxyz + # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛� + expireTime: 450 + +# MyBatis Plus閰嶇疆 +mybatis-plus: + # 鎼滅储鎸囧畾鍖呭埆鍚� 鏍规嵁鑷繁鐨勯」鐩潵 + typeAliasesPackage: com.ruoyi.**.pojo + # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠� + configLocation: classpath:mybatis/mybatis-config.xml + global-config: + enable-sql-runner: true + db-config: + id-type: auto + +# PageHelper鍒嗛〉鎻掍欢 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger閰嶇疆 +swagger: + # 鏄惁寮�鍚痵wagger + enabled: false + # 璇锋眰鍓嶇紑 + pathMapping: /dev-api + +# 闃叉XSS鏀诲嚮 +xss: + # 杩囨护寮�鍏� + enabled: true + # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛� + excludes: /system/notice + # 鍖归厤閾炬帴 + urlPatterns: /system/*,/monitor/*,/tool/* + +# 浠g爜鐢熸垚 +gen: + # 浣滆�� + author: ruoyi + # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool + packageName: com.ruoyi.project.system + # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true + autoRemovePre: false + # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛� + tablePrefix: sys_ + # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽 + allowOverwrite: false + +file: + temp-dir: /center-lims/mis/file/temp/uploads + upload-dir: /center-lims/mis/file/prod/uploads \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a87ef6b..9e740c8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,4 @@ # Spring閰嶇疆 spring: profiles: - active: prod \ No newline at end of file + active: tide \ No newline at end of file -- Gitblit v1.9.3