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信息异常!!"); + } + } + } +}