From dabd76298b98ee7551c3cbfe261f8273e0502cda Mon Sep 17 00:00:00 2001 From: "[yxf]" <[1524240689@qq.com]> Date: Tue, 28 Apr 2026 14:37:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AFip=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implatform/controller/UserController.java | 26 ++++++++++- .../com/bx/implatform/entity/AutoReply.java | 6 +-- .../entity/PlatformConfiguration.java | 1 - .../com/bx/implatform/entity/QuickReply.java | 1 - .../bx/implatform/util/IpLocationUtil.java | 46 +++++++++++++++++++ .../com/bx/implatform/vo/AutoReplyVO.java | 4 +- .../com/bx/implatform/vo/QuickReplyVO.java | 4 +- 7 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 im-platform/src/main/java/com/bx/implatform/util/IpLocationUtil.java diff --git a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java index 151967c..d609482 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java @@ -13,7 +13,9 @@ import com.bx.implatform.service.UserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; +import com.bx.implatform.util.IpLocationUtil; import com.bx.implatform.vo.OnlineTerminalVO; +import com.bx.implatform.vo.SystemMessageVO; import com.bx.implatform.vo.UserVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,6 +28,8 @@ import com.bx.implatform.enums.ResultCode; import com.alibaba.fastjson.JSON; import com.bx.imcommon.util.JwtUtil; import com.bx.implatform.config.props.JwtProperties; +import com.bx.imclient.IMClient; +import com.bx.imcommon.model.IMSystemMessage; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +44,8 @@ public class UserController { private final UserService userService; private final JwtProperties jwtProperties; + private final IMClient imClient; + private final IpLocationUtil ipLocationUtil; @GetMapping("/terminal/online") @Operation(summary = "判断用户哪个终端在线", description = "返回在线的用户id的终端集合") @@ -285,13 +291,22 @@ public class UserController { return ResultUtils.error(ResultCode.XSS_PARAM_ERROR, "目标用户不存在"); } + // 发送强制下线消息(0报错) + SystemMessageVO msgVo = new SystemMessageVO(); + msgVo.setType(2); + + IMSystemMessage systemMessage = new IMSystemMessage<>(); + systemMessage.getRecvIds().add(targetUserId); + systemMessage.setData(msgVo); + imClient.sendSystemMessage(systemMessage); + UserSession newSession = BeanUtils.copyProperties(targetUser, UserSession.class); newSession.setUserId(targetUser.getId()); newSession.setTerminal(terminal); String strJson = JSON.toJSONString(newSession); - String accessToken = JwtUtil.sign(targetUser.getId(), strJson, + String accessToken = JwtUtil.sign(targetUserId, strJson, jwtProperties.getAccessTokenExpireIn(), jwtProperties.getAccessTokenSecret()); - String refreshToken = JwtUtil.sign(targetUser.getId(), strJson, + String refreshToken = JwtUtil.sign(targetUserId, strJson, jwtProperties.getRefreshTokenExpireIn(), jwtProperties.getRefreshTokenSecret()); LoginVO vo = new LoginVO(); @@ -338,4 +353,11 @@ public class UserController { return ResultUtils.success("移除成功"); } + @GetMapping("/ip/location") + @Operation(summary = "获取IP地理位置(中文)") + public Result getIpLocation(@RequestParam("ip") String ip) { + String location = ipLocationUtil.getIpLocation(ip); + return ResultUtils.success(location,"获取成功"); + } + } \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/entity/AutoReply.java b/im-platform/src/main/java/com/bx/implatform/entity/AutoReply.java index 0150ef4..98820f4 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/AutoReply.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/AutoReply.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import java.time.LocalDateTime; +import java.util.Date; @Data @TableName("im_auto_reply") @@ -17,8 +17,8 @@ public class AutoReply { private String replyTitle; private String replyContent; private String remark; - private LocalDateTime createdTime; - private LocalDateTime updatedTime; + private Date createdTime; + private Date updatedTime; private Long creatorId; private Long updaterId; } \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/entity/PlatformConfiguration.java b/im-platform/src/main/java/com/bx/implatform/entity/PlatformConfiguration.java index b6b15e1..56eb3a1 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/PlatformConfiguration.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/PlatformConfiguration.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import java.time.LocalDateTime; @Data @TableName("im_platform_configuration") diff --git a/im-platform/src/main/java/com/bx/implatform/entity/QuickReply.java b/im-platform/src/main/java/com/bx/implatform/entity/QuickReply.java index 2952372..e969da4 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/QuickReply.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/QuickReply.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import java.time.LocalDateTime; @Data @TableName("im_quick_reply") diff --git a/im-platform/src/main/java/com/bx/implatform/util/IpLocationUtil.java b/im-platform/src/main/java/com/bx/implatform/util/IpLocationUtil.java new file mode 100644 index 0000000..f40b5c0 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/util/IpLocationUtil.java @@ -0,0 +1,46 @@ +package com.bx.implatform.util; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class IpLocationUtil { + + private static final String IP_API_URL = "http://ip-api.com/json/{ip}?lang=zh-CN"; + + public String getIpLocation(String ip) { + try { + String url = IP_API_URL.replace("{ip}", ip); + + HttpResponse response = HttpRequest.get(url) + .timeout(5000) + .execute(); + + String body = response.body(); + JSONObject result = JSONUtil.parseObj(body); + + if (!"success".equals(result.getStr("status"))) { + log.warn("IP查询失败, ip:{}, res:{}", ip, body); + return ""; + } + + String country = result.getStr("country", ""); + String regionName = result.getStr("regionName", ""); + String city = result.getStr("city", ""); + + // 拼接中文地址 + return (country + " " + regionName + " " + city).trim(); + + } catch (Exception e) { + log.error("IP地理位置查询异常, ip:{}", ip, e); + return ""; + } + } +} \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/vo/AutoReplyVO.java b/im-platform/src/main/java/com/bx/implatform/vo/AutoReplyVO.java index 8f65200..a6f15c0 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/AutoReplyVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/AutoReplyVO.java @@ -1,7 +1,7 @@ package com.bx.implatform.vo; import lombok.Data; -import java.time.LocalDateTime; +import java.util.Date; @Data public class AutoReplyVO { @@ -12,5 +12,5 @@ public class AutoReplyVO { private String replyTitle; private String replyContent; private String remark; - private LocalDateTime createdTime; + private Date createdTime; } \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/vo/QuickReplyVO.java b/im-platform/src/main/java/com/bx/implatform/vo/QuickReplyVO.java index 0d5b180..774108e 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/QuickReplyVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/QuickReplyVO.java @@ -1,7 +1,7 @@ package com.bx.implatform.vo; import lombok.Data; -import java.time.LocalDateTime; +import java.util.Date; @Data public class QuickReplyVO { @@ -12,5 +12,5 @@ public class QuickReplyVO { private String replyTitle; private String replyContent; private String remark; - private LocalDateTime createdTime; + private Date createdTime; } \ No newline at end of file