From 04b66da1ba04e0b6843247394e2ac31f0027692f Mon Sep 17 00:00:00 2001
From: xjs <1294405880@qq.com>
Date: Sat, 15 Jan 2022 23:18:15 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=90=8E=E7=AB=AF=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?=E5=85=AC=E7=BD=91IP=20,=E7=84=B6=E5=90=8E=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?=E5=9C=B0=E7=90=86=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/com/xjs/consts/ApiConst.java | 6 +
.../main/java/com/xjs/consts/RedisConst.java | 12 +-
.../src/main/java/com/xjs/utils/IPUtil.java | 177 ++++++++++++++++++
.../service/impl/EnglishWordServiceImpl.java | 2 +-
.../client/api/roll/RollIPFeignClient.java | 29 +++
.../client/factory/RollIPFeignFactory.java | 27 +++
.../xjs/copywriting/domain/RequestBody.java | 5 +
.../xjs/weather/controller/IPController.java | 39 ++++
.../java/com/xjs/weather/domain/IPInfoVo.java | 52 +++++
.../com/xjs/weather/factory/IPFactory.java | 16 ++
.../weather/factory/impl/RollIPFactory.java | 58 ++++++
.../com/xjs/weather/service/IPService.java | 18 ++
.../weather/service/impl/IPServiceImpl.java | 44 +++++
13 files changed, 482 insertions(+), 3 deletions(-)
create mode 100644 xjs-business/xjs-business-common/src/main/java/com/xjs/utils/IPUtil.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/api/roll/RollIPFeignClient.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/factory/RollIPFeignFactory.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/controller/IPController.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/domain/IPInfoVo.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/IPFactory.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/impl/RollIPFactory.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/IPService.java
create mode 100644 xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/impl/IPServiceImpl.java
diff --git a/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/ApiConst.java b/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/ApiConst.java
index 5e9dcbeb..f72a703d 100644
--- a/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/ApiConst.java
+++ b/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/ApiConst.java
@@ -41,6 +41,8 @@ public class ApiConst {
public static final String TIANXING_TOPSEARCHDOUYIN= "天行-抖音热搜榜";
+ public static final String ROLL_IP= "ROLL-IP信息";
+
@@ -80,6 +82,10 @@ public class ApiConst {
public static final String TIANXING_TOPSEARCHDOUYIN_URL= "http://api.tianapi.com/douyinhot/index";
+ public static final String ROLL_IP_URL= "https://www.mxnzp.com/api/ip/aim_ip";
+
+
+
diff --git a/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/RedisConst.java b/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/RedisConst.java
index b59d0ea1..9c5be521 100644
--- a/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/RedisConst.java
+++ b/xjs-business/xjs-business-common/src/main/java/com/xjs/consts/RedisConst.java
@@ -27,14 +27,22 @@ public class RedisConst {
/**
* websocket常量key
*/
- public static final String WEBSOCKET= "WEBSOCKET";
+ public static final String WEBSOCKET = "WEBSOCKET";
+
+ /**
+ * ip信息常量key
+ */
+ public static final String IP_INFO = "IPInfo";
//-------------------有效时间-----------------------
- public static final Integer TRAN_DICT_EXPIRE = 7; //天
+ public static final Integer TRAN_DICT_EXPIRE = 1; //小时
public static final Integer ONE_ENGLISH_EXPIRE = 3; //分钟
public static final Long HOT_EXPIRE = 10L; //分钟
+ public static final Long IP_INFO_EXPIRE = 30L; //分钟
+
+
}
diff --git a/xjs-business/xjs-business-common/src/main/java/com/xjs/utils/IPUtil.java b/xjs-business/xjs-business-common/src/main/java/com/xjs/utils/IPUtil.java
new file mode 100644
index 00000000..666b2deb
--- /dev/null
+++ b/xjs-business/xjs-business-common/src/main/java/com/xjs/utils/IPUtil.java
@@ -0,0 +1,177 @@
+package com.xjs.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Ip工具类
+ *
+ * @author xiejs
+ * @since 2022-01-15
+ */
+public class IPUtil {
+
+ /**
+ * 获取外网ip
+ * @return
+ */
+ public static String getV4IP() throws Exception {
+ String ip = null;
+ // 第一种方式
+ try {
+ ip = IPUtil.getNowIP1();
+ ip.trim();
+ } catch (Exception e) {
+ System.out.println("getPublicIP - getNowIP1 failed ~ ");
+ }
+ if (!StringUtils.isEmpty(ip))
+ return ip;
+ // 第二种方式
+ try {
+ ip = IPUtil.getNowIP2();
+ ip.trim();
+ } catch (Exception e) {
+ System.out.println("getPublicIP - getNowIP2 failed ~ ");
+ }
+ if (!StringUtils.isEmpty(ip))
+ return ip;
+ // 第三种方式
+ try {
+ ip = IPUtil.getNowIP3();
+ ip.trim();
+ } catch (Exception e) {
+ System.out.println("getPublicIP - getNowIP3 failed ~ ");
+ }
+ if (!StringUtils.isEmpty(ip))
+ return ip;
+ // 第四种方式
+ try {
+ ip = IPUtil.getNowIP4();
+ ip.trim();
+ } catch (Exception e) {
+ System.out.println("getPublicIP - getNowIP4 failed ~ ");
+ }
+ if (!StringUtils.isEmpty(ip))
+ return ip;
+ return ip;
+ }
+
+ // 方法1
+ private static String getNowIP1() throws IOException {
+ String ip = null;
+ String chinaz = "http://ip.chinaz.com";
+ StringBuilder inputLine = new StringBuilder();
+ String read = "";
+ URL url = null;
+ HttpURLConnection urlConnection = null;
+ BufferedReader in = null;
+ try {
+ url = new URL(chinaz);
+ urlConnection = (HttpURLConnection) url.openConnection();
+ in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
+ while ((read = in.readLine()) != null) {
+ inputLine.append(read + "\r\n");
+ }
+ Pattern p = Pattern.compile("\\
(.*?)\\<\\/dd>");
+ Matcher m = p.matcher(inputLine.toString());
+ if (m.find()) {
+ String ipstr = m.group(1);
+ ip = ipstr;
+ }
+ } finally {
+ if (in != null) {
+ in.close();
+ }
+ }
+ if (StringUtils.isEmpty(ip)) {
+ throw new RuntimeException();
+ }
+ return ip;
+ }
+ // 方法2
+ private static String getNowIP2() throws IOException {
+ String ip = null;
+ BufferedReader br = null;
+ try {
+ URL url = new URL("https://v6r.ipip.net/?format=callback");
+ br = new BufferedReader(new InputStreamReader(url.openStream()));
+ String s = "";
+ StringBuffer sb = new StringBuffer("");
+ String webContent = "";
+ while ((s = br.readLine()) != null) {
+ sb.append(s + "\r\n");
+ }
+ webContent = sb.toString();
+ int start = webContent.indexOf("(") + 2;
+ int end = webContent.indexOf(")") - 1;
+ webContent = webContent.substring(start, end);
+ ip = webContent;
+ } finally {
+ if (br != null)
+ br.close();
+ }
+ if (StringUtils.isEmpty(ip)) {
+ throw new RuntimeException();
+ }
+ return ip;
+ }
+ // 方法3
+ private static String getNowIP3() throws IOException {
+ String ip = null;
+ String objWebURL = "https://ip.900cha.com/";
+ BufferedReader br = null;
+ try {
+ URL url = new URL(objWebURL);
+ br = new BufferedReader(new InputStreamReader(url.openStream()));
+ String s = "";
+ String webContent = "";
+ while ((s = br.readLine()) != null) {
+ if (s.indexOf("我的IP:") != -1) {
+ ip = s.substring(s.indexOf(":") + 1);
+ break;
+ }
+ }
+ } finally {
+ if (br != null)
+ br.close();
+ }
+ if (StringUtils.isEmpty(ip)) {
+ throw new RuntimeException();
+ }
+ return ip;
+ }
+ // 方法4
+ private static String getNowIP4() throws IOException {
+ String ip = null;
+ String objWebURL = "https://bajiu.cn/ip/";
+ BufferedReader br = null;
+ try {
+ URL url = new URL(objWebURL);
+ br = new BufferedReader(new InputStreamReader(url.openStream()));
+ String s = "";
+ String webContent = "";
+ while ((s = br.readLine()) != null) {
+ if (s.indexOf("互联网IP") != -1) {
+ ip = s.substring(s.indexOf("'") + 1, s.lastIndexOf("'"));
+ break;
+ }
+ }
+ } finally {
+ if (br != null)
+ br.close();
+ }
+ if (StringUtils.isEmpty(ip)) {
+ throw new RuntimeException();
+ }
+ return ip;
+ }
+
+
+}
diff --git a/xjs-business/xjs-business-english/src/main/java/com/xjs/word/service/impl/EnglishWordServiceImpl.java b/xjs-business/xjs-business-english/src/main/java/com/xjs/word/service/impl/EnglishWordServiceImpl.java
index 6aca9d0e..6c374732 100644
--- a/xjs-business/xjs-business-english/src/main/java/com/xjs/word/service/impl/EnglishWordServiceImpl.java
+++ b/xjs-business/xjs-business-english/src/main/java/com/xjs/word/service/impl/EnglishWordServiceImpl.java
@@ -86,7 +86,7 @@ public class EnglishWordServiceImpl implements IEnglishWordService {
Map build = new HashMap<>();
build.put(hkey, englishWord);
redisService.setCacheMap(TRAN_DICT, build);
- redisService.expire(TRAN_DICT, TRAN_DICT_EXPIRE, TimeUnit.DAYS);
+ redisService.expire(TRAN_DICT, TRAN_DICT_EXPIRE, TimeUnit.HOURS);
return englishWord;
}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/api/roll/RollIPFeignClient.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/api/roll/RollIPFeignClient.java
new file mode 100644
index 00000000..191821e8
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/api/roll/RollIPFeignClient.java
@@ -0,0 +1,29 @@
+package com.xjs.common.client.api.roll;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xjs.annotation.ApiLog;
+import com.xjs.common.client.factory.RollIPFeignFactory;
+import com.xjs.copywriting.domain.RequestBody;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.cloud.openfeign.SpringQueryMap;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import static com.xjs.consts.ApiConst.ROLL_IP;
+import static com.xjs.consts.ApiConst.ROLL_IP_URL;
+
+/**
+ * rollip信息查询接口api调用
+ *
+ * @author xiejs
+ * @since 2022-01-15
+ */
+@FeignClient(name = "rollIP", url = ROLL_IP_URL, fallbackFactory = RollIPFeignFactory.class)
+public interface RollIPFeignClient {
+
+ @GetMapping()
+ @ApiLog(name = ROLL_IP,
+ url = ROLL_IP_URL,
+ method = "Get")
+ JSONObject IpApi(@SpringQueryMap RequestBody requestBody);
+
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/factory/RollIPFeignFactory.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/factory/RollIPFeignFactory.java
new file mode 100644
index 00000000..6c4f34af
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/client/factory/RollIPFeignFactory.java
@@ -0,0 +1,27 @@
+package com.xjs.common.client.factory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import com.xjs.common.client.api.roll.RollIPFeignClient;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author xiejs
+ * @since 2022-01-15
+ */
+@Component
+@Log4j2
+public class RollIPFeignFactory implements FallbackFactory {
+
+ @Override
+ public RollIPFeignClient create(Throwable cause) {
+ log.error("api模块roll IP服务调用失败:{},执行降级处理", cause.getMessage());
+ return requestBody -> {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("error", R.FAIL);
+ return jsonObject;
+ };
+ }
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/copywriting/domain/RequestBody.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/copywriting/domain/RequestBody.java
index cc43afd7..1d51ccd7 100644
--- a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/copywriting/domain/RequestBody.java
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/copywriting/domain/RequestBody.java
@@ -40,4 +40,9 @@ public class RequestBody {
* 返回值数量
*/
private Integer count;
+
+ /**
+ * ip
+ */
+ private String ip;
}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/controller/IPController.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/controller/IPController.java
new file mode 100644
index 00000000..7b0b1f94
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/controller/IPController.java
@@ -0,0 +1,39 @@
+package com.xjs.weather.controller;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.security.annotation.RequiresLogin;
+import com.xjs.weather.domain.IPInfoVo;
+import com.xjs.weather.service.IPService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * ip信息控制器
+ * @author xiejs
+ * @since 2022-01-15
+ */
+@RestController
+@RequestMapping("ipInfo")
+@Api(tags = "业务模块-IP信息")
+@Log4j2
+public class IPController {
+
+ @Autowired
+ private IPService ipService;
+
+
+ @GetMapping
+ @ApiOperation("获取IP信息")
+ @Log(title = "获取IP")
+ @RequiresLogin
+ public R getIPApiData() {
+ return R.ok(ipService.getIPApiData());
+ }
+
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/domain/IPInfoVo.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/domain/IPInfoVo.java
new file mode 100644
index 00000000..a87e09d1
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/domain/IPInfoVo.java
@@ -0,0 +1,52 @@
+package com.xjs.weather.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * IP信息实体
+ * @author xiejs
+ * @since 2022-01-15
+ */
+@Data
+public class IPInfoVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ip地址
+ */
+ private String ip;
+
+ /**
+ * 省份
+ */
+ private String province;
+
+ /**
+ * 省份Id
+ */
+ private String code;
+
+ /**
+ * 城市
+ */
+ private String city;
+
+ /**
+ * 城市id
+ */
+ private String cityId;
+
+ /**
+ * 网络服务商名称 例如 电信
+ */
+ private String isp;
+
+ /**
+ * 拼接好的描述信息
+ */
+ private String desc;
+
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/IPFactory.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/IPFactory.java
new file mode 100644
index 00000000..649137c1
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/IPFactory.java
@@ -0,0 +1,16 @@
+package com.xjs.weather.factory;
+
+/**
+ * 获取ip的API接口工厂
+ * @author xiejs
+ * @since 2022-01-15
+ */
+public interface IPFactory {
+
+ /**
+ * 获取ip工厂方法
+ * @return T
+ */
+ T IpApi();
+
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/impl/RollIPFactory.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/impl/RollIPFactory.java
new file mode 100644
index 00000000..4fdd59ef
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/factory/impl/RollIPFactory.java
@@ -0,0 +1,58 @@
+package com.xjs.weather.factory.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.redis.service.RedisService;
+import com.xjs.common.client.api.roll.RollIPFeignClient;
+import com.xjs.config.RollProperties;
+import com.xjs.copywriting.domain.RequestBody;
+import com.xjs.utils.IPUtil;
+import com.xjs.weather.domain.IPInfoVo;
+import com.xjs.weather.factory.IPFactory;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import static com.xjs.consts.RedisConst.IP_INFO;
+
+/**
+ * roll IP信息查询API工厂实现
+ *
+ * @author xiejs
+ * @since 2022-01-15
+ */
+@Component
+@Log4j2
+public class RollIPFactory implements IPFactory {
+
+ @Autowired
+ private RollProperties rollProperties;
+ @Autowired
+ private RollIPFeignClient rollIPFeignClient;
+ @Autowired
+ private RedisService redisService;
+
+ @Override
+ public IPInfoVo IpApi() {
+ RequestBody requestBody = new RequestBody();
+ try {
+ requestBody.setIp(IPUtil.getV4IP());
+ } catch (Exception e) {
+ requestBody.setIp("127.0.0.1");
+ }
+ requestBody.setApp_id(rollProperties.getApp_id());
+ requestBody.setApp_secret(rollProperties.getApp_secret());
+ JSONObject jsonObject = rollIPFeignClient.IpApi(requestBody);
+ if (!jsonObject.containsKey("error") && jsonObject.getInteger("code") == 1) {
+ JSONObject data = jsonObject.getJSONObject("data");
+ return data.toJavaObject(IPInfoVo.class);
+ } else {
+ log.error("天行全网热搜服务调用成功,但返回异常");
+ if (redisService.hasKey(IP_INFO)){
+ return (IPInfoVo) redisService.getCacheObject(IP_INFO);
+ }else {
+ return null;
+ }
+ }
+ }
+
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/IPService.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/IPService.java
new file mode 100644
index 00000000..82c33403
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/IPService.java
@@ -0,0 +1,18 @@
+package com.xjs.weather.service;
+
+import com.xjs.weather.domain.IPInfoVo;
+
+/**
+ * ip api服务接口
+ * @author xiejs
+ * @since 2022-01-15
+ */
+public interface IPService {
+
+ /**
+ * 获取IP的数据
+ * @return IPInfoVo
+ */
+ IPInfoVo getIPApiData();
+
+}
diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/impl/IPServiceImpl.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/impl/IPServiceImpl.java
new file mode 100644
index 00000000..69d7e8a1
--- /dev/null
+++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/weather/service/impl/IPServiceImpl.java
@@ -0,0 +1,44 @@
+package com.xjs.weather.service.impl;
+
+import com.ruoyi.common.redis.service.RedisService;
+import com.xjs.exception.BusinessException;
+import com.xjs.weather.domain.IPInfoVo;
+import com.xjs.weather.factory.impl.RollIPFactory;
+import com.xjs.weather.service.IPService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import static com.xjs.consts.RedisConst.IP_INFO;
+import static com.xjs.consts.RedisConst.IP_INFO_EXPIRE;
+
+/**
+ * ip api服务实现
+ * @author xiejs
+ * @since 2022-01-15
+ */
+@Service
+public class IPServiceImpl implements IPService {
+
+ @Autowired
+ private RollIPFactory rollIPFactory;
+ @Autowired
+ private RedisService redisService;
+
+ @Override
+ public IPInfoVo getIPApiData() {
+ if (redisService.hasKey(IP_INFO)) {
+ return (IPInfoVo) redisService.getCacheObject(IP_INFO);
+ }else {
+ IPInfoVo ipInfoVo = rollIPFactory.IpApi();
+ if (Objects.nonNull(ipInfoVo)) {
+ redisService.setCacheObject(IP_INFO, ipInfoVo, IP_INFO_EXPIRE, TimeUnit.MINUTES);
+ return ipInfoVo;
+ }else {
+ throw new BusinessException("获取IP信息异常!!");
+ }
+ }
+ }
+}