From b9cbf1dc0b05c4874979516bfbf2ade43a0d9032 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Thu, 21 Aug 2025 20:13:59 +0800
Subject: [PATCH] 1

---
 ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java |   46 +++++++++++++++
 ruoyi-admin/src/main/java/com/ruoyi/im/config/IpUtils.java  |   85 ++++++++++++++++++++++++++++
 2 files changed, 131 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
index 2ab0c4a..6fb0d5a 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
@@ -1,10 +1,21 @@
 package com.ruoyi.im;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.im.comm.Result;
+import com.ruoyi.im.config.IpUtils;
 import com.ruoyi.im.dto.UpdateUserBusinessDto;
 import com.ruoyi.im.service.ImApiServcie;
 import com.ruoyi.im.dto.RegisterDto;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.domain.UserAccount;
+import com.ruoyi.system.service.GroupWelcomeConfigService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.IpBlacklistService;
+import com.ruoyi.system.service.UserAccountService;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +26,7 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -34,6 +46,13 @@
     @Autowired
     private ImApiServcie imApiServcie;
 
+    @Autowired
+    IpBlacklistService ipBlacklistService;
+
+    @Autowired
+    UserAccountService userAccountService;
+
+
 
     @Value("${file.upload-dir}")
     private String uploadDir;
@@ -55,6 +74,33 @@
         }
     }
 
+    /**
+     * 获取ip地址并判断是否在黑名单
+     */
+    @GetMapping("/blacklist")
+    public Result blacklist(HttpServletRequest request,@PathVariable("account") String account){
+        try {
+            String clientIp = IpUtils.getClientIp(request);
+            if(StringUtils.isEmpty(clientIp)){
+                return Result.success();
+            }
+            long count = ipBlacklistService.count(new LambdaQueryWrapper<IpBlacklist>().eq(IpBlacklist::getIpAddress, clientIp));
+            if(count > 0){
+                return Result.error("账号异常,禁止登录!");
+            }
+            UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<>(UserAccount.class).eq(UserAccount::getCloudMessageAccount, account));
+            if(ObjectUtil.isEmpty(userAccount)){
+                return Result.error("账号不存在!");
+            }
+            userAccount.setLoginIp(clientIp);
+            userAccountService.updateById(userAccount);
+            return Result.success();
+        }catch (Exception e){
+            log.error("登录错误:",e);
+            return Result.error("登录错误,请稍后再试!");
+        }
+    }
+
 
     @PostMapping("/upload")
     public Result uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("accountId") String accountId) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/config/IpUtils.java b/ruoyi-admin/src/main/java/com/ruoyi/im/config/IpUtils.java
new file mode 100644
index 0000000..9d9ddd0
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/config/IpUtils.java
@@ -0,0 +1,85 @@
+package com.ruoyi.im.config;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 获取IP地址工具类
+ */
+public class IpUtils {
+
+    /**
+     * 获取客户端真实IP地址
+     * 考虑了反向代理、负载均衡等情况
+     */
+    public static String getClientIp(HttpServletRequest request) {
+        String ip = request.getHeader("X-Forwarded-For");
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        // 对于通过多个代理的情况,第一个IP为客户端真实IP
+        if (ip != null && ip.contains(",")) {
+            ip = ip.split(",")[0].trim();
+        }
+
+        // 处理本地地址
+        if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
+            // 根据实际网卡取本机配置的IP
+            ip = getLocalIp();
+        }
+
+        return ip;
+    }
+
+    /**
+     * 获取本机IP地址
+     */
+    public static String getLocalIp() {
+        try {
+            return InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+            return "127.0.0.1";
+        }
+    }
+
+    /**
+     * 获取请求的完整URL
+     */
+    public static String getRequestUrl(HttpServletRequest request) {
+        StringBuffer url = request.getRequestURL();
+        String queryString = request.getQueryString();
+        if (queryString != null) {
+            url.append("?").append(queryString);
+        }
+        return url.toString();
+    }
+
+    /**
+     * 获取用户代理信息
+     */
+    public static String getUserAgent(HttpServletRequest request) {
+        return request.getHeader("User-Agent");
+    }
+
+    /**
+     * 获取请求方法
+     */
+    public static String getMethod(HttpServletRequest request) {
+        return request.getMethod();
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3