diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtils.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtils.java index 90f1bd1fb..9dd90026c 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtils.java +++ b/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 { + /** + * 初始化 SEARCHER + */ + @SuppressWarnings("InstantiationOfUtilityClass") + private final static AreaUtils INSTANCE = new AreaUtils(); + + private static Map areas; - static { - // 懒加载,使用时初始化 - init(); - } - - /** - * 初始化 - */ - private static synchronized void init() { + 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); } /** diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtils.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtils.java index 712c6b32a..8ad794637 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtils.java +++ b/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 工具类 - *

- * 依赖于ip2region.xdb精简版,来源于 - * region精简为城市编码 * - * @author 芋道源码 + * IP 数据源来自 ip2region.xdb 精简版,基于 项目 + * + * @author wanglhup */ @Slf4j public class IPUtils { /** - * 根据ip搜索 - * 启动加载到内存中 - */ - private static Searcher SEARCHER; - - /** - * 初始化SEARCHER + * 初始化 SEARCHER */ + @SuppressWarnings("InstantiationOfUtilityClass") private final static IPUtils INSTANCE = new IPUtils(); + /** + * IP 查询器,启动加载到内存中 + */ + 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) { diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java index e8871419b..761a1aa63 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java +++ b/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()); - } -} \ No newline at end of file + +}