瀏覽代碼

Merge remote-tracking branch 'origin/feature/1.8.0-uniapp' into feature/1.8.0-uniapp

sfmind 2 年之前
父節點
當前提交
1a164943d7

+ 12 - 9
yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtils.java

@@ -6,6 +6,7 @@ import cn.hutool.core.text.csv.CsvUtil;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.framework.ip.core.Area;
 import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
+import lombok.extern.slf4j.Slf4j;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -17,19 +18,20 @@ import java.util.Map;
  *
  * @author 芋道源码
  */
+@Slf4j
 public class AreaUtils {
 
-    private static Map<Integer, Area> areas;
-
-    static {
-        // 懒加载,使用时初始化
-        init();
-    }
-
     /**
-     * 初始化
+     * 初始化 SEARCHER
      */
-    private static synchronized void init() {
+    @SuppressWarnings("InstantiationOfUtilityClass")
+    private final static AreaUtils INSTANCE = new AreaUtils();
+
+
+    private static Map<Integer, Area> areas;
+
+    private AreaUtils() {
+        long now = System.currentTimeMillis();
         areas = new HashMap<>();
         areas.put(Area.ID_GLOBAL, new Area(Area.ID_GLOBAL, "全球", 0,
                 null, new ArrayList<>()));
@@ -51,6 +53,7 @@ public class AreaUtils {
             area.setParent(parent);
             parent.getChildren().add(area);
         }
+        log.info("启动加载 AreaUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
     }
 
     /**

+ 32 - 39
yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtils.java

@@ -1,82 +1,74 @@
 package cn.iocoder.yudao.framework.ip.core.utils;
 
-import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.hutool.core.io.resource.ResourceUtil;
 import cn.iocoder.yudao.framework.ip.core.Area;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.lionsoul.ip2region.xdb.Searcher;
 
 import java.io.IOException;
 
-import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
-
 /**
  * IP 工具类
- * <p>
- * 依赖于ip2region.xdb精简版,来源于<a href="https://gitee.com/zhijiantianya/ip2region"/>
- * region精简为城市编码
  *
- * @author 芋道源码
+ * IP 数据源来自 ip2region.xdb 精简版,基于 <a href="https://gitee.com/zhijiantianya/ip2region"/> 项目
+ *
+ * @author wanglhup
  */
 @Slf4j
 public class IPUtils {
 
     /**
-     * 根据ip搜索
-     * 启动加载到内存中
+     * 初始化 SEARCHER
      */
-    private static Searcher SEARCHER;
+    @SuppressWarnings("InstantiationOfUtilityClass")
+    private final static IPUtils INSTANCE = new IPUtils();
 
     /**
-     * 初始化SEARCHER
+     * IP 查询器,启动加载到内存中
      */
-    private final static IPUtils INSTANCE = new IPUtils();
-
+    private static Searcher SEARCHER;
 
     /**
      * 私有化构造
      */
     private IPUtils() {
-        String dbPath = "ip2region.xdb";
-        dbPath = IPUtils.class.getClassLoader().getResource(dbPath).getPath();
         try {
-            SEARCHER = Searcher.newWithBuffer(Searcher.loadContentFromFile(dbPath));
+            long now = System.currentTimeMillis();
+            byte[] bytes = ResourceUtil.readBytes("ip2region.xdb");
+            SEARCHER = Searcher.newWithBuffer(bytes);
+            log.info("启动加载 IPUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
         } catch (IOException e) {
-            // 加载xdb文件异常,不影响启动
-            log.error("启动加载IP SEARCH异常", e);
-            SEARCHER = null;
+            log.error("启动加载 IPUtils 失败", e);
         }
     }
 
-
     /**
-     * 查询IP对应的地区ID,格式应为127.0.0.1
-     * @param ip ip地址
+     * 查询 IP 对应的地区编号
+     *
+     * @param ip IP 地址,格式为 127.0.0.1
      * @return 地区id
      */
+    @SneakyThrows
     public static Integer getAreaId(String ip) {
-        try {
-            return Integer.parseInt(SEARCHER.search(ip));
-        } catch (Exception e) {
-            throw new ServiceException(INTERNAL_SERVER_ERROR);
-        }
+        return Integer.parseInt(SEARCHER.search(ip));
     }
 
     /**
-     * 查询IP对应的地区ID,格式参考{@link Searcher#checkIP(String)} 的返回
-     * @param ip ip地址
-     * @return 地区id
+     * 查询 IP 对应的地区编号
+     *
+     * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回
+     * @return 地区编号
      */
+    @SneakyThrows
     public static Integer getAreaId(long ip) {
-        try {
-            return Integer.parseInt(SEARCHER.search(ip));
-        } catch (Exception e) {
-            throw new ServiceException(INTERNAL_SERVER_ERROR);
-        }
+        return Integer.parseInt(SEARCHER.search(ip));
     }
 
     /**
-     * 查询IP对应的地区,格式应为127.0.0.1
-     * @param ip ip地址
+     * 查询 IP 对应的地区
+     *
+     * @param ip IP 地址,格式为 127.0.0.1
      * @return 地区
      */
     public static Area getArea(String ip) {
@@ -84,8 +76,9 @@ public class IPUtils {
     }
 
     /**
-     * 查询IP对应的地区,格式参考{@link Searcher#checkIP(String)} 的返回
-     * @param ip ip地址
+     * 查询 IP 对应的地区
+     *
+     * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回
      * @return 地区
      */
     public static Area getArea(long ip) {

+ 11 - 19
yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java

@@ -9,47 +9,39 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * {@link IPUtils} 的单元测试
+ *
+ * @author wanglhup
  */
-class IPUtilsTest {
+public class IPUtilsTest {
 
     @Test
-    void getAreaId() {
+    public void testGetAreaId_string() {
         // 120.202.4.0|120.202.4.255|420600
         Integer areaId = IPUtils.getAreaId("120.202.4.50");
         assertEquals(420600, areaId);
     }
 
     @Test
-    void testGetAreaId() {
+    public void testGetAreaId_long() throws Exception {
         // 120.203.123.0|120.203.133.255|360900
-        long ip = 0L;
-        try {
-            ip = Searcher.checkIP("120.203.123.250");
-        } catch (Exception e) {
-            // ignore
-        }
+        long ip = Searcher.checkIP("120.203.123.250");
         Integer areaId = IPUtils.getAreaId(ip);
         assertEquals(360900, areaId);
     }
 
     @Test
-    void getArea() {
+    public void testGetArea_string() {
         // 120.202.4.0|120.202.4.255|420600
         Area area = IPUtils.getArea("120.202.4.50");
         assertEquals("襄阳市", area.getName());
     }
 
     @Test
-    void testGetArea() {
+    public void testGetArea_long() throws Exception {
         // 120.203.123.0|120.203.133.255|360900
-        long ip = 0L;
-        try {
-            ip = Searcher.checkIP("120.203.123.252");
-        } catch (Exception e) {
-            // ignore
-        }
+        long ip = Searcher.checkIP("120.203.123.252");
         Area area = IPUtils.getArea(ip);
         assertEquals("宜春市", area.getName());
-
     }
-}
+
+}