Crunchy
2025-03-15 314ccc3fbb5b4cb1be4a77bc107a0ca1a2b2f0a3
浪潮单点登录,注册,心跳
已修改3个文件
已添加3个文件
295 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tide/TideController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tide/TidePojo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tide/TideUtils.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tide/TideController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.web.controller.tide;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.system.service.ISysUserService;
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;
@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 String code) {
        String token = TideUtils.getToken(code);
        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 = new SysUser();
        String randomString = TideUtils.getRandomString(12);
        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);
        return TideUtils.getResult(20000, "成功", null);
    }
    public static void main(String[] args) {
        String password = SecurityUtils.encryptPassword("tzvy7lB.");
        System.out.println(password);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tide/TidePojo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.web.controller.tide;
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;
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tide/TideUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
package com.ruoyi.web.controller.tide;
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.scheduling.annotation.Scheduled;
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);
            // ä¸ºx-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);
            // ä¸ºx-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();
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -71,7 +71,7 @@
    # æ•°æ®åº“索引
    database: 0
    #    # å¯†ç 
    #    password: root2022!
    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
@@ -96,7 +96,7 @@
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    log-impl: # org.apache.ibatis.logging.stdout.StdOutImpl
# Swagger配置
swagger:
ruoyi-admin/src/main/resources/application.yml
@@ -7,7 +7,7 @@
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /javaWork/lims-ruoyi/file/uploadPath
  profile: D:\webapp
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
@@ -33,7 +33,7 @@
# æ—¥å¿—配置
logging:
  file-location: /javaWork/lims-ruoyi
  file-location: D:\webapp
  level:
    com.ruoyi: info
    org.springframework: warn
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -100,7 +100,7 @@
    public String login(String username, String password, String code, String uuid)
    {
        // éªŒè¯ç æ ¡éªŒ
        validateCaptcha(username, code, uuid);
//        validateCaptcha(username, code, uuid);
        // ç™»å½•前置校验
        loginPreCheck(username, password);
        // ç”¨æˆ·éªŒè¯