Browse Source

fix: ip2region

shc 1 năm trước cách đây
mục cha
commit
49efa8f87c

+ 67 - 68
hnqz-common/hnqz-common-core/pom.xml

@@ -1,76 +1,75 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
-		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.qunzhixinxi</groupId>
-		<artifactId>hnqz-common</artifactId>
-		<version>3.9.0</version>
-	</parent>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common</artifactId>
+        <version>3.9.0</version>
+    </parent>
 
-	<artifactId>hnqz-common-core</artifactId>
-	<packaging>jar</packaging>
+    <artifactId>hnqz-common-core</artifactId>
+    <packaging>jar</packaging>
 
-	<description>hnqz 公共工具类核心包</description>
+    <description>hnqz 公共工具类核心包</description>
 
 
-	<dependencies>
-		<dependency>
-			<groupId>com.bribric</groupId>
-			<artifactId>beetroot</artifactId>
-			<version>0.0.6</version>
-			<scope>system</scope>
-			<systemPath>${pom.basedir}/src/main/resources/lib/beetroot-0.0.6.jar</systemPath>
-		</dependency>
-		<!--hutool-->
-		<dependency>
-			<groupId>cn.hutool</groupId>
-			<artifactId>hutool-all</artifactId>
-			<version>${hutool.version}</version>
-		</dependency>
-		<!--server-api-->
-		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
-		</dependency>
-		<!--hibernate-validator-->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-validation</artifactId>
-		</dependency>
-		<!--json模块-->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-json</artifactId>
-		</dependency>
-		<!--TTL-->
-		<dependency>
-			<groupId>com.alibaba</groupId>
-			<artifactId>transmittable-thread-local</artifactId>
-			<version>${ttl.version}</version>
-		</dependency>
-		<!-- commons-beanutils -->
-		<dependency>
-			<groupId>commons-beanutils</groupId>
-			<artifactId>commons-beanutils</artifactId>
-			<version>1.9.4</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-codec</groupId>
-			<artifactId>commons-codec</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>mybatis-plus-extension</artifactId>
-		</dependency>
-	</dependencies>
+    <dependencies>
+        <dependency>
+            <!--ip归属(离线)-->
+            <groupId>org.lionsoul</groupId>
+            <artifactId>ip2region</artifactId>
+            <version>2.6.6</version>
+        </dependency>
+        <!--hutool-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>${hutool.version}</version>
+        </dependency>
+        <!--server-api-->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+        </dependency>
+        <!--hibernate-validator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <!--json模块-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-json</artifactId>
+        </dependency>
+        <!--TTL-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>transmittable-thread-local</artifactId>
+            <version>${ttl.version}</version>
+        </dependency>
+        <!-- commons-beanutils -->
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+        </dependency>
+    </dependencies>
 </project>

+ 76 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/util/Ip2Region.java

@@ -0,0 +1,76 @@
+package com.qunzhixinxi.hnqz.common.core.util;
+
+import org.apache.commons.io.FileUtils;
+import org.lionsoul.ip2region.xdb.Searcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Ip工具类
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-12-21 14:41
+ */
+public final class Ip2Region {
+
+	private static final Logger log = LoggerFactory.getLogger(Ip2Region.class);
+
+	/**
+	 * 搜索器
+	 */
+	private Searcher searcher;
+
+	/**
+	 * 从 dbPath 加载整个 xdb 到内存。
+	 */
+	public Ip2Region() {
+
+		String XDB_PATH = "lib/ip2region.xdb";
+		String TARGET = "temp/ip2region.xdb";
+		try (InputStream is = Ip2Region.class.getClassLoader().getResourceAsStream(XDB_PATH)) {
+			File target = new File(TARGET);
+			FileUtils.copyInputStreamToFile(is, target);
+			byte[] cBuff = Searcher.loadContentFromFile(target.getAbsolutePath());
+			searcher = Searcher.newWithBuffer(cBuff);
+		} catch (IOException e) {
+			log.warn("从dbPath加载整个xdb到内存失败", e);
+		}
+	}
+
+	/**
+	 * 获取IP属地
+	 * <p>
+	 * 格式为:[province]·[city]
+	 * </p>
+	 *
+	 * @param remoteIp 远程IP
+	 * @return IP属地
+	 */
+	public String toRegion(final String remoteIp) throws RuntimeException {
+
+		try {
+
+			// 查询IP属地
+			long sTime = System.nanoTime();
+			String search = searcher.search(remoteIp);
+			long cost = TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - sTime);
+			log.info("{region: {}, ioCount: {}, took: {} μs}", search, searcher.getIOCount(), cost);
+
+			// 封装为固定格式[province]·[city]
+			search = search.replace("|0", "").replace("0|", "");
+			String[] split = search.split("\\|");
+			return (split.length == 2) ? split[0] + "·" + split[1] : split[1] + "·" + split[2];
+
+		} catch (Exception e) {
+			log.error("获取IP属地失败", e);
+			throw new RuntimeException(e.getMessage());
+		}
+	}
+
+}

BIN
hnqz-common/hnqz-common-core/src/main/resources/lib/ip2region.xdb


+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/config/CommonConfiguration.java

@@ -1,6 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.config;
 
-import com.bribric.beetroot.net.Ip2Region;
+import com.qunzhixinxi.hnqz.common.core.util.Ip2Region;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;

+ 2 - 5
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -9,12 +9,10 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -24,8 +22,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.bribric.beetroot.common.exception.BeetrootException;
-import com.bribric.beetroot.net.Ip2Region;
 import com.google.zxing.WriterException;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
@@ -138,6 +134,7 @@ import com.qunzhixinxi.hnqz.common.core.constant.enums.LoginTypeEnum;
 import com.qunzhixinxi.hnqz.common.core.constant.enums.UpmsState;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.HttpUtils;
+import com.qunzhixinxi.hnqz.common.core.util.Ip2Region;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
@@ -1274,7 +1271,7 @@ public class ApiController {
 	 */
 	@SysLog("新增任务内容表")
 	@PostMapping("/saveTaskContent")
-	public R<?> saveTaskContent(@RequestBody WmTaskContent wmTaskContent, HttpServletRequest request) throws BeetrootException {
+	public R<?> saveTaskContent(@RequestBody WmTaskContent wmTaskContent, HttpServletRequest request) {
 
 		String ipAddr = HttpUtils.getIpAddr(request);
 		String region = ip2Region.toRegion(ipAddr);