From b77abcbc0f17070a2a970e0c4aa5837e90f28e1f Mon Sep 17 00:00:00 2001
From: shikeying <pxzsky@163.com>
Date: 星期三, 03 四月 2024 14:02:49 +0800
Subject: [PATCH] 提供ip转地区离线查询(未完成)

---
 walker-support-milvus/src/main/java/com/walker/support/milvus/engine/DefaultOperateService.java |   10 +
 walker-web/src/main/java/com/walker/web/util/IpUtils.java                                       |   72 ++++++--
 walker-support-milvus/src/test/java/com/walker/support/milvus/MilvusEngine.java                 |  108 +++++++++++++
 walker-support-milvus/pom.xml                                                                   |    7 
 walker-support-milvus/src/main/java/com/walker/support/milvus/DataType.java                     |   48 +++++
 walker-support-milvus/src/test/java/com/walker/support/milvus/TestMilvus.java                   |   45 +++++
 walker-web/pom.xml                                                                              |   14 +
 walker-web/src/main/java/com/walker/web/agent/BrowserCapWebAgentService.java                    |   19 ++
 walker-web/src/main/resources/ip2region.xdb                                                     |    0 
 walker-support-milvus/src/main/java/com/walker/support/milvus/FieldType.java                    |  124 ++++++++++++---
 walker-support-milvus/src/main/java/com/walker/support/milvus/util/FieldTypeUtils.java          |    5 
 walker-support-milvus/src/main/java/com/walker/support/milvus/OutData.java                      |   12 
 12 files changed, 409 insertions(+), 55 deletions(-)

diff --git a/walker-support-milvus/pom.xml b/walker-support-milvus/pom.xml
index 0caf03e..755c824 100644
--- a/walker-support-milvus/pom.xml
+++ b/walker-support-milvus/pom.xml
@@ -18,6 +18,13 @@
     </properties>
 
     <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
         <dependency>
             <groupId>io.milvus</groupId>
             <artifactId>milvus-sdk-java</artifactId>
diff --git a/walker-support-milvus/src/main/java/com/walker/support/milvus/DataType.java b/walker-support-milvus/src/main/java/com/walker/support/milvus/DataType.java
index ef03486..f086b2c 100644
--- a/walker-support-milvus/src/main/java/com/walker/support/milvus/DataType.java
+++ b/walker-support-milvus/src/main/java/com/walker/support/milvus/DataType.java
@@ -21,9 +21,24 @@
             return Int64_VALUE;
         }
     },
+    /**
+     * 搴熷純浜嗚瀛楃涓茬被鍨嬶紝浣跨敤锛歏arChar銆�
+     * @date 2024-03-28
+     */
+    @Deprecated
     String{
         public int getIndex(){
             return String_VALUE;
+        }
+    },
+
+    /**
+     * 鏂扮増浣跨敤鐨勫瓧绗︿覆绫诲瀷
+     * @date 2024-03-28
+     */
+    VarChar {
+        public int getIndex(){
+            return VarChar_VALUE;
         }
     },
     FloatVector{
@@ -31,6 +46,12 @@
             return FloatVector_VALUE;
         }
     },
+    Float16Vector {
+        public int getIndex(){
+            return Float16Vector_VALUE;
+        }
+    },
+
     BinaryVector{
         public int getIndex(){
            return BinaryVector_VALUE;
@@ -39,6 +60,18 @@
     None{
         public int getIndex(){
             return None_VALUE;
+        }
+    },
+
+    Array {
+        public int getIndex(){
+            return Array_VALUE;
+        }
+    },
+
+    Json {
+        public int getIndex(){
+            return JSON_VALUE;
         }
     };
 
@@ -63,7 +96,15 @@
             return BinaryVector;
         } else if(index == None_VALUE){
             return None;
-        } else {
+        } else if(index == VarChar_VALUE){
+            return VarChar;
+        } else if(index == Array_VALUE){
+            return Array;
+        } else if(index == JSON_VALUE){
+            return Json;
+        } else if(index == Float16Vector_VALUE){
+            return Float16Vector;
+        }  else {
             throw new IllegalArgumentException("涓嶆敮鎸佺殑鏁版嵁鏍煎紡锛�" + index);
         }
     }
@@ -77,7 +118,10 @@
     public static final int Float_VALUE = 10;
     public static final int Double_VALUE = 11;
     public static final int String_VALUE = 20;
-//    public static final int VarChar_VALUE = 21;
+    public static final int VarChar_VALUE = 21;
+    public static final int Array_VALUE = 22;
+    public static final int JSON_VALUE = 23;
     public static final int BinaryVector_VALUE = 100;
     public static final int FloatVector_VALUE = 101;
+    public static final int Float16Vector_VALUE = 102;
 }
diff --git a/walker-support-milvus/src/main/java/com/walker/support/milvus/FieldType.java b/walker-support-milvus/src/main/java/com/walker/support/milvus/FieldType.java
index 6c12313..794e996 100644
--- a/walker-support-milvus/src/main/java/com/walker/support/milvus/FieldType.java
+++ b/walker-support-milvus/src/main/java/com/walker/support/milvus/FieldType.java
@@ -2,7 +2,8 @@
 
 //import io.milvus.param.ParamUtils;
 
-import org.apache.commons.lang3.StringUtils;
+import io.milvus.param.ParamUtils;
+import org.checkerframework.checker.nullness.qual.NonNull;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -15,6 +16,9 @@
     private String description;
     private DataType dataType;
     private Map<String, String> typeParams;
+    // 2024-03-28
+    private DataType elementType;
+    private boolean partitionKey;
 
     private FieldType(FieldType.Builder builder) {
         if (builder == null) {
@@ -26,6 +30,8 @@
             this.dataType = builder.dataType;
             this.typeParams = builder.typeParams;
 //            this.autoID = builder.autoID;
+            this.elementType = builder.elementType;
+            this.partitionKey = builder.partitionKey;
         }
     }
 
@@ -65,12 +71,16 @@
         private DataType dataType;
         private final Map<String, String> typeParams;
 //        private boolean autoID;
+        private DataType elementType;
+        private boolean partitionKey;
 
         private Builder() {
             this.primaryKey = false;
             this.description = "";
             this.typeParams = new HashMap();
 //            this.autoID = false;
+            this.elementType = DataType.None;
+            this.partitionKey = false;
         }
 
         public Builder withName(String name) {
@@ -101,6 +111,15 @@
                 throw new NullPointerException("dataType is marked non-null but is null");
             } else {
                 this.dataType = dataType;
+                return this;
+            }
+        }
+
+        public Builder withElementType(@NonNull DataType elementType) {
+            if (elementType == null) {
+                throw new NullPointerException("elementType is marked non-null but is null");
+            } else {
+                this.elementType = elementType;
                 return this;
             }
         }
@@ -148,52 +167,109 @@
 //            this.autoID = autoID;
 //            return this;
 //        }
+        public Builder withPartitionKey(boolean partitionKey) {
+            this.partitionKey = partitionKey;
+            return this;
+        }
 
         public FieldType build() throws ParamException {
-//            ParamUtils.CheckNullEmptyString(this.name, "Field name");
-            if (this.name == null || StringUtils.isBlank(this.name)) {
-                throw new ParamException(name + " cannot be null or empty");
-            }
+            ParamUtils.CheckNullEmptyString(this.name, "Field name");
             if (this.dataType != null && this.dataType != DataType.None) {
                 if (this.dataType == DataType.String) {
-                    throw new ParamException("String type is not supported, use VarChar instead");
+                    throw new io.milvus.exception.ParamException("String type is not supported, use Varchar instead");
                 } else {
                     int len;
                     if (this.dataType == DataType.FloatVector || this.dataType == DataType.BinaryVector) {
                         if (!this.typeParams.containsKey("dim")) {
-                            throw new ParamException("Vector field dimension must be specified");
+                            throw new io.milvus.exception.ParamException("Vector field dimension must be specified");
                         }
 
                         try {
                             len = Integer.parseInt((String)this.typeParams.get("dim"));
                             if (len <= 0) {
-                                throw new ParamException("Vector field dimension must be larger than zero");
+                                throw new io.milvus.exception.ParamException("Vector field dimension must be larger than zero");
                             }
                         } catch (NumberFormatException var3) {
-                            throw new ParamException("Vector field dimension must be an integer number");
+                            throw new io.milvus.exception.ParamException("Vector field dimension must be an integer number");
                         }
                     }
 
-//                    if (this.dataType == io.milvus.grpc.DataType.VarChar) {
-//                        if (!this.typeParams.containsKey("max_length")) {
-//                            throw new ParamException("Varchar field max length must be specified");
-//                        }
-//
-//                        try {
-//                            len = Integer.parseInt((String)this.typeParams.get("max_length"));
-//                            if (len <= 0) {
-//                                throw new ParamException("Varchar field max length must be larger than zero");
-//                            }
-//                        } catch (NumberFormatException var2) {
-//                            throw new ParamException("Varchar field max length must be an integer number");
-//                        }
-//                    }
+                    if (this.dataType == DataType.VarChar) {
+                        if (!this.typeParams.containsKey("max_length")) {
+                            throw new io.milvus.exception.ParamException("Varchar field max length must be specified");
+                        }
+
+                        try {
+                            len = Integer.parseInt((String)this.typeParams.get("max_length"));
+                            if (len <= 0) {
+                                throw new io.milvus.exception.ParamException("Varchar field max length must be larger than zero");
+                            }
+                        } catch (NumberFormatException var2) {
+                            throw new io.milvus.exception.ParamException("Varchar field max length must be an integer number");
+                        }
+                    }
+
+                    if (this.partitionKey) {
+                        if (this.primaryKey) {
+                            throw new io.milvus.exception.ParamException("Primary key field can not be partition key");
+                        }
+
+                        if (this.dataType != DataType.Long && this.dataType != DataType.VarChar) {
+                            throw new io.milvus.exception.ParamException("Only Int64 and Varchar type field can be partition key");
+                        }
+                    }
+
+                    if (this.dataType == DataType.Array) {
+                        if (this.elementType == DataType.String) {
+                            throw new io.milvus.exception.ParamException("String type is not supported, use Varchar instead");
+                        }
+
+                        if (this.elementType == DataType.None || this.elementType == DataType.Array || this.elementType == DataType.Json || this.elementType == DataType.String || this.elementType == DataType.FloatVector || this.elementType == DataType.Float16Vector || this.elementType == DataType.BinaryVector) {
+                            throw new io.milvus.exception.ParamException("Unsupported element type");
+                        }
+
+                        if (!this.typeParams.containsKey("max_capacity")) {
+                            throw new io.milvus.exception.ParamException("Array field max capacity must be specified");
+                        }
+
+                        if (this.elementType == DataType.VarChar && !this.typeParams.containsKey("max_length")) {
+                            throw new io.milvus.exception.ParamException("Varchar array field max length must be specified");
+                        }
+                    }
 
                     return new FieldType(this);
                 }
             } else {
-                throw new ParamException("Field data type is illegal");
+                throw new io.milvus.exception.ParamException("Field data type is illegal");
             }
+//            if (this.name == null || StringUtils.isBlank(this.name)) {
+//                throw new ParamException(name + " cannot be null or empty");
+//            }
+//            if (this.dataType != null && this.dataType != DataType.None) {
+//                if (this.dataType == DataType.String) {
+//                    throw new ParamException("String type is not supported, use VarChar instead");
+//                } else {
+//                    int len;
+//                    if (this.dataType == DataType.FloatVector || this.dataType == DataType.BinaryVector) {
+//                        if (!this.typeParams.containsKey("dim")) {
+//                            throw new ParamException("Vector field dimension must be specified");
+//                        }
+//
+//                        try {
+//                            len = Integer.parseInt((String)this.typeParams.get("dim"));
+//                            if (len <= 0) {
+//                                throw new ParamException("Vector field dimension must be larger than zero");
+//                            }
+//                        } catch (NumberFormatException var3) {
+//                            throw new ParamException("Vector field dimension must be an integer number");
+//                        }
+//                    }
+//                    return new FieldType(this);
+//                }
+//            } else {
+//                throw new ParamException("Field data type is illegal");
+//            }
         }
+
     }
 }
diff --git a/walker-support-milvus/src/main/java/com/walker/support/milvus/OutData.java b/walker-support-milvus/src/main/java/com/walker/support/milvus/OutData.java
index 2ce507e..6431417 100644
--- a/walker-support-milvus/src/main/java/com/walker/support/milvus/OutData.java
+++ b/walker-support-milvus/src/main/java/com/walker/support/milvus/OutData.java
@@ -23,7 +23,7 @@
 
     private List<Long> keyList = new ArrayList<>();
 
-    private List<Long> businessIdList = new ArrayList<>();
+    private List<String> businessIdList = new ArrayList<>();
 
     /**
      * 鏍规嵁milvus鏁版嵁搴撲富閿繑鍥炶褰曞搴旂殑棰勬祴鍒嗗�笺��
@@ -96,11 +96,11 @@
      * 杩斿洖涓氬姟缂栧彿闆嗗悎銆�
      * @return
      */
-    public List<Long> getBusinessIdList() {
+    public List<String> getBusinessIdList() {
         return businessIdList;
     }
 
-    public void setBusinessIdList(List<Long> businessIdList) {
+    public void setBusinessIdList(List<String> businessIdList) {
         this.businessIdList = businessIdList;
     }
 
@@ -111,7 +111,7 @@
     public static class Data implements Serializable {
 
         private long key;
-        private long businessId;
+        private String businessId;
 
         private float score = 0;
 
@@ -119,7 +119,7 @@
             return key;
         }
 
-        public long getBusinessId() {
+        public String getBusinessId() {
             return businessId;
         }
 
@@ -127,7 +127,7 @@
             return score;
         }
 
-        public Data(long key, long businessId, float score){
+        public Data(long key, String businessId, float score){
             this.key = key;
             this.businessId = businessId;
             this.score = score;
diff --git a/walker-support-milvus/src/main/java/com/walker/support/milvus/engine/DefaultOperateService.java b/walker-support-milvus/src/main/java/com/walker/support/milvus/engine/DefaultOperateService.java
index 0247b14..6228326 100644
--- a/walker-support-milvus/src/main/java/com/walker/support/milvus/engine/DefaultOperateService.java
+++ b/walker-support-milvus/src/main/java/com/walker/support/milvus/engine/DefaultOperateService.java
@@ -147,7 +147,7 @@
             return false;
         }
         if(statusR.getStatus().intValue() == R.Status.Success.getCode()){
-            logger.error("insert 杩斿洖鍊硷細" + statusR.getStatus().intValue());
+            logger.debug("insert 杩斿洖鍊硷細" + statusR.getStatus().intValue());
             return true;
         }
         return false;
@@ -254,6 +254,12 @@
         MetricType metricType = null;
         if(query.getMetricType() == null || query.getMetricType().equals("")){
             metricType = MetricType.L2;
+        } else if(query.getMetricType().equals(com.walker.support.milvus.MetricType.INDEX_IMAGE)){
+            metricType = MetricType.L2;
+        } else if(query.getMetricType().equals(com.walker.support.milvus.MetricType.INDEX_NLP)){
+            metricType = MetricType.IP;
+        } else {
+            throw new UnsupportedOperationException("鏆傛湭鏀寔鐨勮窛绂荤被鍨嬶細" + query.getMetricType());
         }
 
         SearchParam searchParam = SearchParam.newBuilder()
@@ -287,7 +293,7 @@
             if(outField.equals("id")){
                 outData.setKeyList((List<Long>)wrapperSearch.getFieldData("id", 0));
             } else {
-                outData.setBusinessIdList((List<Long>)wrapperSearch.getFieldData(outField, 0));
+                outData.setBusinessIdList((List<String>)wrapperSearch.getFieldData(outField, 0));
             }
         }
 //        System.out.println(wrapperSearch.getFieldData("book_id", 0));
diff --git a/walker-support-milvus/src/main/java/com/walker/support/milvus/util/FieldTypeUtils.java b/walker-support-milvus/src/main/java/com/walker/support/milvus/util/FieldTypeUtils.java
index ae4c399..050f10b 100644
--- a/walker-support-milvus/src/main/java/com/walker/support/milvus/util/FieldTypeUtils.java
+++ b/walker-support-milvus/src/main/java/com/walker/support/milvus/util/FieldTypeUtils.java
@@ -19,7 +19,10 @@
 
     public static DataType toMilvusDataType(com.walker.support.milvus.DataType dt){
         if(dt == com.walker.support.milvus.DataType.String){
-            return DataType.String;
+//            return DataType.String;
+            return DataType.VarChar;
+        } else if(dt == com.walker.support.milvus.DataType.VarChar){
+            return DataType.VarChar;
         } else if(dt == com.walker.support.milvus.DataType.Float){
             return DataType.Float;
         } else if(dt == com.walker.support.milvus.DataType.Double){
diff --git a/walker-support-milvus/src/test/java/com/walker/support/milvus/MilvusEngine.java b/walker-support-milvus/src/test/java/com/walker/support/milvus/MilvusEngine.java
new file mode 100644
index 0000000..b6f2eb6
--- /dev/null
+++ b/walker-support-milvus/src/test/java/com/walker/support/milvus/MilvusEngine.java
@@ -0,0 +1,108 @@
+package com.walker.support.milvus;
+
+import com.walker.support.milvus.engine.DefaultOperateService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MilvusEngine {
+
+    protected final transient Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    public MilvusEngine(String ip, int port){
+        DefaultOperateService service = new DefaultOperateService();
+        service.connect(ip, port);
+        this.operateService = service;
+        logger.info("connect milvus: {}:{}", ip, port);
+    }
+
+    public void close(){
+        if(this.operateService != null){
+            this.operateService.close();
+        }
+    }
+
+    /**
+     * 鍒涘缓琛細娴嬭瘯浠庤亰澶╀竴閿彁鍙栧伐鍗曞唴瀹逛娇鐢ㄣ��
+     * <pre>
+     *     1) 浠庡巻鍙插伐鍗曟暟鎹腑锛屾敹闆嗙敤鎴锋彁闂唴瀹癸紝鏁寸悊鍒拌〃涓�
+     *     2) 鎶婅繖浜涙暟鎹�氳繃鍚戦噺杞寲锛屽啓鍏ilvus鏁版嵁搴撱��
+     * </pre>
+     * @date 2024-03-28
+     */
+    public void createChatSimilarTable(){
+        Table chatSimilarTable = new Table();
+        chatSimilarTable.setCollectionName("chat_similar");
+        chatSimilarTable.setDescription("鑱婂ぉ鎻愬彇宸ュ崟鎽樿鍘嗗彶鏁版嵁");
+        chatSimilarTable.setShardsNum(1);
+        chatSimilarTable.setDimension(768); // 杩欎釜鏄牴鎹娇鐢ㄥ悜閲忔ā鍨嬬淮搴﹀畾鐨�
+
+        // 璁剧疆瀛楁
+        FieldType id = FieldType.newBuilder()
+                .withName("id").withPrimaryKey(true).withMaxLength(18).withDataType(DataType.Long).build();
+        FieldType title = FieldType.newBuilder()
+                .withName("title").withPrimaryKey(false).withMaxLength(180).withDataType(DataType.VarChar).build();
+        FieldType content = FieldType.newBuilder()
+                .withName("content").withPrimaryKey(false).withMaxLength(255).withDataType(DataType.VarChar).build();
+        FieldType answer = FieldType.newBuilder()
+                .withName("answer").withPrimaryKey(false).withMaxLength(255).withDataType(DataType.VarChar).build();
+        FieldType embedding = FieldType.newBuilder()
+                .withName("embedding").withPrimaryKey(false).withDataType(DataType.FloatVector).withDimension(768).build();
+
+        List<FieldType> fieldTypeList = new ArrayList<>(8);
+        fieldTypeList.add(id);
+        fieldTypeList.add(title);
+        fieldTypeList.add(content);
+        fieldTypeList.add(answer);
+        fieldTypeList.add(embedding);
+        chatSimilarTable.setFieldTypes(fieldTypeList);
+
+        this.operateService.createTable(chatSimilarTable);
+        logger.info("鍒涘缓浜� table = {}", chatSimilarTable.getCollectionName());
+
+        // 鍒涘缓绱㈠紩
+        this.operateService.createIndex(chatSimilarTable.getCollectionName()
+                , "embedding", "HNSW", "{\"nlist\":16384, \"efConstruction\":128, \"M\":8}", MetricType.NLP);
+        logger.info("鍒涘缓浜� index = {}", chatSimilarTable.getCollectionName() + "_index");
+    }
+
+    public void dropChatSimilarTable(){
+        this.operateService.dropTable("chat_similar");
+    }
+
+    public void insertTestData(){
+        DataSet dataSet = new DataSet();
+        dataSet.setTableName("chat_similar");
+
+        Map<String, List<?>> fieldMap = new HashMap();
+        fieldMap.put("id", Arrays.asList(new Long[]{100L}));
+        fieldMap.put("title", Arrays.asList(new String[]{"绗竴涓爣棰�"}));
+        fieldMap.put("content", Arrays.asList(new String[]{"绗竴涓唴瀹�"}));
+        fieldMap.put("answer", Arrays.asList(new String[]{"绗竴涓瓟妗�"}));
+        fieldMap.put("embedding", Arrays.asList(mockVector));
+        dataSet.setFields(fieldMap);
+        this.operateService.insertDataSet(dataSet);
+        logger.info("鍐欏叆浜嗘祴璇曟暟鎹�: {}", dataSet);
+    }
+
+    public OutData searchChatSimilar(List<List<Float>> vectors){
+        Query query = new Query();
+        query.setMetricType(MetricType.NLP.getIndex());
+        query.setTableName("chat_similar");
+        query.setTopK(4);
+        query.setVectorName("embedding");
+        query.setOutFieldList(Arrays.asList(new String[]{"id","title","content"}));
+        query.setFieldPrimaryKey("id");
+        query.setSearchVectors(vectors);
+        return this.operateService.searchVector(query);
+    }
+
+    private OperateService operateService;
+
+    private double[] mockVector = new double[]{-0.051114246249198914, 0.889954432};
+}
diff --git a/walker-support-milvus/src/test/java/com/walker/support/milvus/TestMilvus.java b/walker-support-milvus/src/test/java/com/walker/support/milvus/TestMilvus.java
new file mode 100644
index 0000000..fd5a4d6
--- /dev/null
+++ b/walker-support-milvus/src/test/java/com/walker/support/milvus/TestMilvus.java
@@ -0,0 +1,45 @@
+package com.walker.support.milvus;
+
+import org.junit.Test;
+
+public class TestMilvus {
+
+    public void testSearchMilvus(){
+
+    }
+
+//    @Test
+    public void testFloatParse(){
+        double d = 0.013319502584636211;
+        float f = Float.parseFloat(String.valueOf(d));
+        System.out.println("f = " + f);
+    }
+
+    /**
+     * 鍒涘缓鑱婂ぉ涓彁鍙栧伐鍗曟憳瑕佸姛鑳斤紝milvus娴嬭瘯琛ㄥ垱寤恒��
+     * <p>绗竴姝ワ細鍒涘缓琛ㄥ拰绱㈠紩</p>
+     */
+//    @Test
+    public void createTable(){
+        this.acquireMilvusEngine();
+        this.milvusEngine.createChatSimilarTable();
+    }
+
+    /**
+     * 娴嬭瘯锛氬啓鍏ヤ竴涓ā鎷熸暟鎹�
+     */
+//    @Test
+    public void insertTestMockData(){
+        this.acquireMilvusEngine();
+        this.milvusEngine.insertTestData();
+    }
+
+    private void acquireMilvusEngine(){
+        if(this.milvusEngine == null){
+            MilvusEngine engine = new MilvusEngine("120.26.128.84", 19530);
+            this.milvusEngine = engine;
+        }
+    }
+
+    private MilvusEngine milvusEngine;
+}
diff --git a/walker-web/pom.xml b/walker-web/pom.xml
index 4927724..2d4a243 100644
--- a/walker-web/pom.xml
+++ b/walker-web/pom.xml
@@ -14,6 +14,7 @@
     <packaging>jar</packaging>
 
     <properties>
+        <ip2region.version>2.7.0</ip2region.version>
     </properties>
 
     <dependencies>
@@ -55,6 +56,19 @@
             <artifactId>okhttp</artifactId>
         </dependency>
 
+        <!-- IP瀹氫綅锛屼竴涓紑婧恑p涓庡湴鍧�瀵瑰簲鐨勬湰鍦版暟鎹簱xdb锛�2024-04-02 -->
+        <dependency>
+            <groupId>org.lionsoul</groupId>
+            <artifactId>ip2region</artifactId>
+            <version>${ip2region.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
     </dependencies>
 
 </project>
diff --git a/walker-web/src/main/java/com/walker/web/agent/BrowserCapWebAgentService.java b/walker-web/src/main/java/com/walker/web/agent/BrowserCapWebAgentService.java
index b96e7e2..2511915 100644
--- a/walker-web/src/main/java/com/walker/web/agent/BrowserCapWebAgentService.java
+++ b/walker-web/src/main/java/com/walker/web/agent/BrowserCapWebAgentService.java
@@ -3,6 +3,7 @@
 import com.walker.web.WebAgentService;
 import com.walker.web.WebUserAgent;
 import com.walker.web.util.IpUtils;
+import org.lionsoul.ip2region.xdb.Searcher;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
@@ -15,6 +16,9 @@
 
     private Capabilities capabilities = null;
     private UserAgentParser parser = null;
+
+    // 鎼滅储鍦板尯鐨勬湰鍦板璞★紙璇诲彇鏈湴xdb鏁版嵁搴擄級锛�2024-04-02
+    private Searcher searcher = null;
 
     public BrowserCapWebAgentService(){
         try {
@@ -30,6 +34,11 @@
         } catch (Exception e) {
             throw new RuntimeException("鍒涘缓娴忚鍣ㄨВ鏋愬璞¢敊璇�:" + e.getMessage(), e);
         }
+
+//        this.searcher = Searcher.newWithFileOnly();
+//        ClassPathResource resource = new ClassPathResource();
+//        resource.getFile();
+//        RandomAccessFile randomAccessFile = new RandomAccessFile();
     }
 
     @Override
@@ -59,6 +68,7 @@
         return webUserAgent;
     }
 
+
     /**
      * 璁剧疆鏄惁鍔犺浇ip瀵瑰簲鐨勫尯鍩熷湴璐紝榛樿锛歠alse涓嶅姞杞斤紝鍥犱负闇�瑕佽繛澶栫綉鏌ユ壘銆�
      * @param loadLocation
@@ -68,5 +78,14 @@
         this.loadLocation = loadLocation;
     }
 
+    /**
+     * 璁剧疆锛歩p2region鏁版嵁搴撴枃浠惰矾寰勶紝濡傦細
+     * @param xdbPath
+     */
+    public void setXdbPath(String xdbPath) {
+        this.xdbPath = xdbPath;
+    }
+
+    private String xdbPath;
     private boolean loadLocation = false;
 }
diff --git a/walker-web/src/main/java/com/walker/web/util/IpUtils.java b/walker-web/src/main/java/com/walker/web/util/IpUtils.java
index d438d55..122f43c 100644
--- a/walker-web/src/main/java/com/walker/web/util/IpUtils.java
+++ b/walker-web/src/main/java/com/walker/web/util/IpUtils.java
@@ -32,37 +32,69 @@
      *
      * @param request 璇锋眰瀵硅薄
      * @return IP鍦板潃
+     * @date 2023-10-21
+     * @date 2024-04-02 澧炲姞鑾峰彇璇锋眰澶翠腑鍙傛暟锛堣ˉ鍏咃級
      */
-    public static String getIpAddr(HttpServletRequest request)
-    {
-        if (request == null)
-        {
+    public static String getIpAddr(HttpServletRequest request) {
+        if (request == null) {
             return "unknown";
         }
-        String ip = request.getHeader("x-forwarded-for");
-        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip))
-        {
-            ip = request.getHeader("Proxy-Client-IP");
-        }
-        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip))
-        {
+
+        String ip = null;
+
+        // 浠ヤ笅涓や釜鑾峰彇鍦╧8s涓紝灏嗙湡瀹炵殑瀹㈡埛绔疘P锛屾斁鍒颁簡x-Original-Forwarded-For銆傝�屽皢WAF鐨勫洖婧愬湴鍧�鏀惧埌浜� x-Forwarded-For浜嗐��
+        ip = request.getHeader("X-Original-Forwarded-For");
+        if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Forwarded-For");
         }
-        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip))
-        {
+
+        //鑾峰彇nginx绛変唬鐞嗙殑ip
+        if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
+            ip = request.getHeader("x-forwarded-for");
+        }
+
+        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
             ip = request.getHeader("WL-Proxy-Client-IP");
         }
-        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip))
-        {
+        if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Real-IP");
         }
-
-        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip))
-        {
-            ip = request.getRemoteAddr();
+        if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
         }
 
-        return "0:0:0:0:0:0:0:1".equals(ip) ? LOCALHOST : getMultistageReverseProxyIp(ip);
+        // 2.濡傛灉娌℃湁杞彂鐨刬p锛屽垯鍙栧綋鍓嶉�氫俊鐨勮姹傜鐨刬p(鍏煎k8s闆嗙兢鑾峰彇ip)
+        if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+            // 濡傛灉鏄�127.0.0.1锛屽垯鍙栨湰鍦扮湡瀹瀒p
+            if (LOCALHOST.equals(ip)) {
+                // 鏍规嵁缃戝崱鍙栨湰鏈洪厤缃殑IP
+                InetAddress inet = null;
+                try {
+                    inet = InetAddress.getLocalHost();
+                    ip = inet.getHostAddress();
+                } catch (UnknownHostException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        // 瀵逛簬閫氳繃澶氫釜浠g悊鐨勬儏鍐碉紝绗竴涓狪P涓哄鎴风鐪熷疄IP,澶氫釜IP鎸夌収','鍒嗗壊
+        if (ip != null && ip.length() > 15) {
+            // = 15
+            if (ip.indexOf(StringUtils.DEFAULT_SPLIT_SEPARATOR) > 0) {
+                ip = ip.substring(0, ip.indexOf(StringUtils.DEFAULT_SPLIT_SEPARATOR));
+            }
+        }
+
+//        return "0:0:0:0:0:0:0:1".equals(ip) ? LOCALHOST : getMultistageReverseProxyIp(ip);
+        return "0:0:0:0:0:0:0:1".equals(ip) ? LOCALHOST : ip;
     }
 
     /**
diff --git a/walker-web/src/main/resources/ip2region.xdb b/walker-web/src/main/resources/ip2region.xdb
new file mode 100644
index 0000000..7052c05
--- /dev/null
+++ b/walker-web/src/main/resources/ip2region.xdb
Binary files differ

--
Gitblit v1.9.1