From 69b4d77c0402b73f5fd1ee6102b8143a232980da Mon Sep 17 00:00:00 2001
From: wanglizhong <wlz>
Date: 星期六, 03 五月 2025 01:38:45 +0800
Subject: [PATCH] feat:请求gps接口正常

---
 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java               |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/config/GpsServiceConfig.java            |   39 ++++
 ruoyi-system/pom.xml                                                                |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java |  144 ++++++++++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/MD5Util.java                      |   37 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginRequest.java             |   63 +++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/GpsCollectController.java |   36 ++++
 ruoyi-admin/src/main/resources/application.yml                                      |   12 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java                     |  119 +++++++++++++
 ruoyi-common/pom.xml                                                                |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginResponse.java            |   24 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java         |   16 +
 12 files changed, 504 insertions(+), 11 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/GpsCollectController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/GpsCollectController.java
new file mode 100644
index 0000000..ec7d4d0
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/GpsCollectController.java
@@ -0,0 +1,36 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.domain.GpsLoginRequest;
+import com.ruoyi.system.domain.GpsLoginResponse;
+import com.ruoyi.system.service.IGpsCollectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * GPS閲囬泦鎺ュ彛
+ */
+@RestController
+@RequestMapping("/system/gpscollect")
+public class GpsCollectController extends BaseController {
+    
+    @Autowired
+    private IGpsCollectService gpsCollectService;
+
+    /**
+     * 娴嬭瘯鐧诲綍鎺ュ彛
+     */
+    @Anonymous()
+    @GetMapping("/testLogin")
+    public AjaxResult testLogin() {
+        GpsLoginRequest request = new GpsLoginRequest();
+        request.setType("USER");
+        request.setFrom("WEB");
+        request.setBrowser("Chrome/104.0.0.0");
+        
+        GpsLoginResponse response = gpsCollectService.login(request);
+        return success(response);
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index db0b9f1..7d421e6 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -12,10 +12,7 @@
   addressEnabled: false
   # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
   captchaType: math
-  # 鍖垮悕璁块棶閰嶇疆
-  anonymous:
-    appId: appId1
-    securityKey: your_security_key
+ 
 
 # 寮�鍙戠幆澧冮厤缃�
 server:
@@ -131,3 +128,10 @@
   excludes: /system/notice
   # 鍖归厤閾炬帴
   urlPatterns: /system/*,/monitor/*,/tool/*
+
+# GPS鏈嶅姟閰嶇疆
+gps:
+  service:
+    domain: https://gps51.com
+    username: 鐜嬫煇浜�
+    password: Aa1357
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index fc5574e..5266477 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -46,7 +46,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
         <!--甯哥敤宸ュ叿绫� -->
         <dependency>
             <groupId>org.apache.commons</groupId>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java
new file mode 100644
index 0000000..9afdb90
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java
@@ -0,0 +1,119 @@
+package com.ruoyi.common.utils;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.X509Certificate;
+import com.alibaba.fastjson.JSON;
+
+/**
+ * HTTP宸ュ叿绫�
+ */
+public class HttpUtil {
+    
+    private static final int CONNECT_TIMEOUT = 5000;
+    private static final int READ_TIMEOUT = 5000;
+    
+    static {
+        try {
+            // 鍒涘缓淇′换鎵�鏈夎瘉涔︾殑TrustManager
+            TrustManager[] trustAllCerts = new TrustManager[] {
+                new X509TrustManager() {
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return null;
+                    }
+                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
+                    }
+                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
+                    }
+                }
+            };
+            
+            // 鍒濆鍖朣SLContext
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, trustAllCerts, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+            
+            // 璁剧疆涓绘満鍚嶉獙璇佸櫒
+            HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
+        } catch (Exception e) {
+            throw new RuntimeException("鍒濆鍖朣SL涓婁笅鏂囧け璐�", e);
+        }
+    }
+    
+    /**
+     * 鍙戦�丳OST璇锋眰
+     * @param url 璇锋眰URL
+     * @param params 璇锋眰鍙傛暟
+     * @return 鍝嶅簲鍐呭
+     */
+    public static String post(String url, Map<String, String> params) {
+        StringBuilder response = new StringBuilder();
+        HttpURLConnection conn = null;
+        try {
+            // 鍒涘缓杩炴帴
+            URL requestUrl = new URL(url);
+            boolean isHttps = url.toLowerCase().startsWith("https");
+            
+            // 鏍规嵁鍗忚绫诲瀷鍒涘缓杩炴帴
+            if (isHttps) {
+                conn = (HttpsURLConnection) requestUrl.openConnection();
+            } else {
+                conn = (HttpURLConnection) requestUrl.openConnection();
+            }
+            
+            // 璁剧疆璇锋眰灞炴��
+            conn.setRequestMethod("POST");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            conn.setUseCaches(false);
+            conn.setRequestProperty("Content-Type", "application/json");
+            conn.setRequestProperty("Accept", "application/json");
+            
+            // 璁剧疆瓒呮椂鏃堕棿
+            conn.setConnectTimeout(CONNECT_TIMEOUT);
+            conn.setReadTimeout(READ_TIMEOUT);
+            
+            // 鏋勫缓JSON鍙傛暟瀛楃涓�
+            String jsonParams = JSON.toJSONString(params);
+            
+            // 鍙戦�佽姹傚弬鏁�
+            try (OutputStream os = conn.getOutputStream()) {
+                os.write(jsonParams.getBytes(StandardCharsets.UTF_8));
+                os.flush();
+            }
+            
+            // 鑾峰彇鍝嶅簲鐮�
+            int responseCode = conn.getResponseCode();
+            if (responseCode != HttpURLConnection.HTTP_OK) {
+                throw new RuntimeException("HTTP璇锋眰澶辫触锛屽搷搴旂爜: " + responseCode);
+            }
+            
+            // 璇诲彇鍝嶅簲
+            try (BufferedReader reader = new BufferedReader(
+                    new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    response.append(line);
+                }
+            }
+            
+        } catch (Exception e) {
+            throw new RuntimeException("HTTP璇锋眰澶辫触: " + e.getMessage(), e);
+        } finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+        
+        return response.toString();
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MD5Util.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MD5Util.java
new file mode 100644
index 0000000..a945d79
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MD5Util.java
@@ -0,0 +1,37 @@
+package com.ruoyi.common.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * MD5鍔犲瘑宸ュ叿绫�
+ */
+public class MD5Util {
+    /**
+     * MD5鍔犲瘑锛�32浣嶅皬鍐欙級
+     * @param plainText 鏄庢枃
+     * @return 32浣嶅皬鍐橫D5
+     */
+    public static String md5(String plainText) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(plainText.getBytes());
+            byte[] b = md.digest();
+            StringBuilder buf = new StringBuilder("");
+            for (int offset = 0; offset < b.length; offset++) {
+                int i = b[offset];
+                if (i < 0) {
+                    i += 256;
+                }
+                if (i < 16) {
+                    buf.append("0");
+                }
+                buf.append(Integer.toHexString(i));
+            }
+            return buf.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
index 534d21c..edbf719 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
@@ -214,7 +214,7 @@
         String urlNameString = url + "?" + param;
         try
         {
-            log.info("sendSSLPost - {}", urlNameString);
+//            log.info("sendSSLPost - {}", urlNameString);
             SSLContext sc = SSLContext.getInstance("SSL");
             sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
             URL console = new URL(urlNameString);
@@ -240,25 +240,26 @@
                     result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
                 }
             }
-            log.info("recv - {}", result);
+//            log.info("recv - {}", result);
             conn.disconnect();
             br.close();
         }
         catch (ConnectException e)
         {
-            log.error("璋冪敤HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
+//            log.error("璋冪敤HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
         }
         catch (SocketTimeoutException e)
         {
-            log.error("璋冪敤HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+//            log.error("璋冪敤HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
         }
         catch (IOException e)
         {
-            log.error("璋冪敤HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
+//            log.error("璋冪敤HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
         }
         catch (Exception e)
         {
-            log.error("璋冪敤HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
+
+//            log.error("璋冪敤HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
         }
         return result.toString();
     }
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 44b16f5..f38f016 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -32,6 +32,12 @@
             <artifactId>lombok</artifactId>
             <scope>provided</scope>
         </dependency>
+        <!-- FastJSON -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
 
     </dependencies>
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/config/GpsServiceConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/config/GpsServiceConfig.java
new file mode 100644
index 0000000..9b708f9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/config/GpsServiceConfig.java
@@ -0,0 +1,39 @@
+package com.ruoyi.system.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * GPS鏈嶅姟閰嶇疆
+ */
+@Component
+@ConfigurationProperties(prefix = "gps.service")
+public class GpsServiceConfig {
+    private String domain;
+    private String username;
+    private String password;
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginRequest.java
new file mode 100644
index 0000000..55097cb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginRequest.java
@@ -0,0 +1,63 @@
+package com.ruoyi.system.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * GPS鐧诲綍璇锋眰瀹炰綋
+ */
+public class GpsLoginRequest {
+    @JsonProperty("username")
+    private String username;
+
+    @JsonProperty("password")
+    private String password;
+
+    @JsonProperty("from")
+    private String from;
+
+    @JsonProperty("type")
+    private String type;
+
+    @JsonProperty("browser")
+    private String browser;
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getFrom() {
+        return from;
+    }
+
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getBrowser() {
+        return browser;
+    }
+
+    public void setBrowser(String browser) {
+        this.browser = browser;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginResponse.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginResponse.java
new file mode 100644
index 0000000..14c66b3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsLoginResponse.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.domain;
+
+import lombok.Data;
+
+/**
+ * GPS鐧诲綍鍝嶅簲
+ */
+@Data
+public class GpsLoginResponse {
+    /**
+     * 鏄惁鎴愬姛
+     */
+    private boolean success;
+    
+    /**
+     * 娑堟伅
+     */
+    private String message;
+    
+    /**
+     * Token
+     */
+    private String token;
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java
new file mode 100644
index 0000000..33359e8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.system.domain.GpsLoginRequest;
+import com.ruoyi.system.domain.GpsLoginResponse;
+
+/**
+ * GPS閲囬泦鏈嶅姟鎺ュ彛
+ */
+public interface IGpsCollectService {
+    /**
+     * GPS鐧诲綍
+     * @param request 鐧诲綍璇锋眰
+     * @return 鐧诲綍鍝嶅簲
+     */
+    GpsLoginResponse login(GpsLoginRequest request);
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java
new file mode 100644
index 0000000..9cc92ea
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java
@@ -0,0 +1,144 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.system.domain.GpsLoginRequest;
+import com.ruoyi.system.domain.GpsLoginResponse;
+import com.ruoyi.system.service.IGpsCollectService;
+import com.ruoyi.system.config.GpsServiceConfig;
+import com.ruoyi.common.utils.MD5Util;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import java.util.HashMap;
+import java.util.Map;
+import org.springframework.util.StringUtils;
+import com.ruoyi.common.utils.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.exception.ServiceException;
+
+/**
+ * GPS閲囬泦鏈嶅姟瀹炵幇
+ */
+@Service
+public class GpsCollectServiceImpl implements IGpsCollectService {
+
+    private final RestTemplate restTemplate;
+    private final GpsServiceConfig gpsServiceConfig;
+
+    public GpsCollectServiceImpl(GpsServiceConfig gpsServiceConfig) {
+        this.restTemplate = new RestTemplate();
+        this.gpsServiceConfig = gpsServiceConfig;
+    }
+
+    @Override
+    public GpsLoginResponse login(GpsLoginRequest request) {
+        // 鍙傛暟鏍¢獙
+        if (StringUtils.isEmpty(request.getType()) || StringUtils.isEmpty(request.getFrom())) {
+            throw new ServiceException("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        // 鏋勫缓璇锋眰URL
+        String url = gpsServiceConfig.getDomain() + "/webapi?action=login";
+        
+        // 璁剧疆璇锋眰鍙傛暟
+        Map<String, String> params = new HashMap<>();
+        params.put("username", gpsServiceConfig.getUsername());
+        params.put("password", MD5Util.md5(gpsServiceConfig.getPassword()));
+        params.put("type", request.getType());
+        params.put("from", request.getFrom());
+        params.put("browser", request.getBrowser());
+
+        StringBuilder paramStr = new StringBuilder();
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+            if (paramStr.length() > 0) {
+                paramStr.append("&");
+            }
+            paramStr.append(entry.getKey()).append("=").append(entry.getValue());
+        }
+
+        // 鍙戦�佽姹�
+        String response = HttpUtil.post(url,params);
+        
+        // 瑙f瀽鍝嶅簲
+        GpsLoginResponse loginResponse = new GpsLoginResponse();
+        try {
+            JSONObject jsonResponse = JSONObject.parseObject(response);
+            int status = jsonResponse.getIntValue("status");
+            String username = jsonResponse.getString("username");
+            
+            // 鏍规嵁杩斿洖鐮佽缃搷搴斾俊鎭�
+            switch (status) {
+                case 0:
+                    loginResponse.setSuccess(true);
+                    loginResponse.setMessage("鐧诲綍鎴愬姛");
+                    loginResponse.setToken(jsonResponse.getString("token"));
+                    break;
+                case -1:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("鐧诲綍澶辫触");
+                    break;
+                case 1:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("瀵嗙爜閿欒");
+                    break;
+                case 2:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("绂佹鐧诲綍");
+                    break;
+                case 3:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("璐﹀彿宸茬鐢�");
+                    break;
+                case 4:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("璁惧鍒版湡");
+                    break;
+                case 5:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("璁惧杩囨湡");
+                    break;
+                case 9903:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("Token杩囨湡");
+                    break;
+                case 9906:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("璐﹀彿鍦ㄥ叾浠栧湴鏂圭櫥褰�");
+                    break;
+                default:
+                    loginResponse.setSuccess(false);
+                    loginResponse.setMessage("鏈煡閿欒");
+                    break;
+            }
+        } catch (Exception e) {
+            loginResponse.setSuccess(false);
+            loginResponse.setMessage("瑙f瀽鍝嶅簲澶辫触锛�" + e.getMessage());
+        }
+        
+        return loginResponse;
+    }
+
+    /**
+     * 鏍¢獙鐧诲綍鏉ユ簮
+     */
+    private boolean isValidFrom(String from) {
+        if (from == null) {
+            return false;
+        }
+        return "ANDROID".equals(from) || "IPHONE".equals(from) || 
+               "WEB".equals(from) || "WEIXIN".equals(from);
+    }
+
+    /**
+     * 鏍¢獙鐧诲綍绫诲瀷
+     */
+    private boolean isValidType(String type) {
+        if (type == null) {
+            return false;
+        }
+        return "USER".equals(type) || "DEVICE".equals(type);
+    }
+} 
\ No newline at end of file

--
Gitblit v1.9.1