helixiao 1 anno fa
parent
commit
b99cbbc52a

+ 36 - 8
src/main/java/com/ydtech/modules/admin/controller/websocket/PCSocketServer.java

@@ -5,6 +5,7 @@ import com.ydtech.config.SpringContextUtils;
 import com.ydtech.modules.admin.constants.SystemType;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.dto.IpInfoDto;
+import com.ydtech.modules.admin.model.dto.LocationResponse;
 import com.ydtech.modules.admin.model.po.SysPcAddress;
 import com.ydtech.modules.admin.service.SysPcAddressService;
 import com.ydtech.modules.admin.service.SysUserService;
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Component;
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -27,6 +29,10 @@ public class PCSocketServer {
 
     private Session session;
 
+    public final static String URL = "https://api.map.baidu.com/location/ip?";
+
+    public final static String AK = "UuGafLbAJs9kYJsRg2cxCLwAscGZg1Jj";
+
     private static Map<String, Session> sessionClientMap = new ConcurrentHashMap<>();
 
     /**静态变量,用来记录当前在线连接数*/
@@ -60,15 +66,16 @@ public class PCSocketServer {
     public void onMessage(String message, Session session) {
         JSONObject jsonObject = JSONObject.parseObject(message);
         String userId = jsonObject.getString("userId");
-        String longitude = jsonObject.getString("lng");
-        String latitude = jsonObject.getString("lat");
-        String province = jsonObject.getString("prov");
-        String city = jsonObject.getString("city");
-        String district = jsonObject.getString("district");
+//        String longitude = jsonObject.getString("lng");
+//        String latitude = jsonObject.getString("lat");
+//        String province = jsonObject.getString("prov");
+//        String city = jsonObject.getString("city");
+//        String district = jsonObject.getString("district");
         String ip = jsonObject.getString("ip");
         String systemType = jsonObject.getString("systemType");
-        saveLocationData(userId, latitude, longitude,province,city,district,ip,systemType);
+        saveLocationData(userId,ip,systemType);
         log.info("服务端收到PC用户消息:{} ,主体:{}", message, userId);
+
         sendMessage("服务端已收到PC用户信息:" +message);
     }
 
@@ -107,13 +114,28 @@ public class PCSocketServer {
         this.session.getAsyncRemote().sendText(message);
     }
 
-    public void saveLocationData(String userId, String latitude, String longitude,
-                                 String province,String city,String district,
+    public void saveLocationData(String userId,
                                  String ip,String systemType) {
         SysPcAddressService sysPcAddressService = SpringContextUtils.getBean(SysPcAddressService.class);
         SysUserService sysUserService = SpringContextUtils.getBean(SysUserService.class);
         if (SystemType.ST_1.getCode().equals(systemType)) {
             try {
+                SearchHttpAK searchHttpAK = new SearchHttpAK();
+
+                Map params = new LinkedHashMap<String, String>();
+                params.put("ip", ip);
+                params.put("coor", "bd09ll");
+                params.put("ak", AK);
+
+                LocationResponse locationResponse = searchHttpAK.requestGetAK(URL, params);
+                String province = locationResponse.getContent().getAddressDetail().getProvince();
+                String city = locationResponse.getContent().getAddressDetail().getCity();
+                String district = locationResponse.getContent().getAddressDetail().getDistrict();
+
+                String longitude = locationResponse.getContent().getPoint().getX();
+                String latitude = locationResponse.getContent().getPoint().getY();
+
+
                 IpInfoDto ipInfoDto = new IpInfoDto();
                 ipInfoDto.setIp(ip);
                 ipInfoDto.setLng(longitude);
@@ -129,4 +151,10 @@ public class PCSocketServer {
         }
     }
 
+
+
+
+
+
+
 }

+ 78 - 0
src/main/java/com/ydtech/modules/admin/controller/websocket/SearchHttpAK.java

@@ -0,0 +1,78 @@
+package com.ydtech.modules.admin.controller.websocket;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ydtech.modules.admin.model.dto.LocationResponse;
+import org.springframework.web.util.UriUtils;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class SearchHttpAK {
+
+//    public static String URL = "https://api.map.baidu.com/location/ip?";
+//
+//    public static String AK = "UuGafLbAJs9kYJsRg2cxCLwAscGZg1Jj";
+//
+//    public static void main(String[] args) throws Exception {
+//
+//        SearchHttpAK snCal = new SearchHttpAK();
+//
+//        Map params = new LinkedHashMap<String, String>();
+//        params.put("ip", "111.206.214.37");
+//        params.put("coor", "bd09ll");
+//        params.put("ak", AK);
+//
+//
+//        snCal.requestGetAK(URL, params);
+//    }
+
+    /**
+     * 默认ak
+     * 选择了ak,使用IP白名单校验:
+     * 根据您选择的AK已为您生成调用代码
+     * 检测到您当前的ak设置了IP白名单校验
+     * 您的IP白名单中的IP非公网IP,请设置为公网IP,否则将请求失败
+     * 请在IP地址为xxxxxxx的计算发起请求,否则将请求失败
+     */
+    public LocationResponse requestGetAK(String strUrl, Map<String, String> param) throws Exception {
+        if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {
+            return null;
+        }
+
+        StringBuffer queryString = new StringBuffer();
+        queryString.append(strUrl);
+        for (Map.Entry<?, ?> pair : param.entrySet()) {
+            queryString.append(pair.getKey() + "=");
+            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
+            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
+            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
+        }
+
+        if (queryString.length() > 0) {
+            queryString.deleteCharAt(queryString.length() - 1);
+        }
+
+        java.net.URL url = new URL(queryString.toString());
+        System.out.println(queryString.toString());
+        URLConnection httpConnection = (HttpURLConnection) url.openConnection();
+        httpConnection.connect();
+
+        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
+        BufferedReader reader = new BufferedReader(isr);
+        StringBuffer buffer = new StringBuffer();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            buffer.append(line);
+        }
+        reader.close();
+        isr.close();
+        System.out.println("AK: " + buffer.toString());
+        return JSONObject.parseObject(buffer.toString(), LocationResponse.class);
+    }
+}

+ 44 - 0
src/main/java/com/ydtech/modules/admin/model/dto/LocationResponse.java

@@ -0,0 +1,44 @@
+package com.ydtech.modules.admin.model.dto;
+
+import lombok.Data;
+
+@Data
+public class LocationResponse {
+
+    private String address;
+    private Content content;
+    private int status;
+
+
+    @Data
+    public static class Content {
+
+        private String address;
+        private AddressDetail addressDetail;
+        private Point point;
+
+        @Data
+        public static class AddressDetail {
+
+            private String adcode;
+            private String city;
+            private int cityCode;
+            private String district;
+            private String province;
+            private String street;
+            private String streetNumber;
+
+            // Getters and Setters
+        }
+        @Data
+        public static class Point {
+
+            private String x;
+            private String y;
+
+
+        }
+    }
+
+
+}

+ 1 - 1
src/main/java/com/ydtech/modules/admin/service/impl/SysPcAddressServiceImpl.java

@@ -80,7 +80,7 @@ public class SysPcAddressServiceImpl extends ServiceImpl<SysPcAddressMapper, Sys
         sysPcAddress.setCity(ipInfoDto.getCity());
         sysPcAddress.setDistrict(ipInfoDto.getDistrict());
         sysPcAddress.setSource(sysDept.getManagementSource());
-        sysPcAddress.setAddress(ipInfoDto.getProv() + ipInfoDto.getCity() + ipInfoDto.getDistrict());
+        sysPcAddress.setAddress(ipInfoDto.getProv() + ipInfoDto.getCity() + Optional.ofNullable(ipInfoDto.getDistrict()).orElse(""));
         sysPcAddress.setOperationTime(new Date());
         sysPcAddress.setLeaderName(user.getLeaderName());