Przeglądaj źródła

!5 增加操作日志操作地点、登录日志的登录地点、在线用户登录地点。
Merge pull request !5 from yangzhengze/master

yangzhengze 6 lat temu
rodzic
commit
90f1ffee63

+ 3 - 0
sql/ry_20180526.sql

@@ -372,6 +372,7 @@ create table sys_oper_log (
   dept_name 		varchar(50)     default '' 		 	 	   comment '部门名称',
   oper_url 		    varchar(255) 	default '' 				   comment '请求URL',
   oper_ip 			varchar(30) 	default '' 				   comment '主机地址',
+  oper_location    varchar(255)     default ''                 comment '操作地点',
   oper_param 		varchar(255) 	default '' 				   comment '请求参数',
   status 			int(1) 		    default 0				   comment '操作状态 0正常 1异常',
   error_msg 		varchar(2000) 	default '' 				   comment '错误消息',
@@ -475,6 +476,7 @@ create table sys_logininfor (
   info_id 		int(11) 	 not null auto_increment   comment '访问ID',
   login_name 	varchar(50)  default '' 			   comment '登录账号',
   ipaddr 		varchar(50)  default '' 			   comment '登录IP地址',
+  login_location   varchar(255)  default ''            comment '登录地点',
   browser  		varchar(50)  default '' 			   comment '浏览器类型',
   os      		varchar(50)  default '' 			   comment '操作系统',
   status 		int(1) 		 default 0 			 	   comment '登录状态 0成功 1失败',
@@ -493,6 +495,7 @@ create table sys_user_online (
   login_name 	    varchar(50)  default '' 		 	 	comment '登录账号',
   dept_name 		varchar(50)  default '' 		 	 	comment '部门名称',
   ipaddr 		    varchar(50)  default '' 			 	comment '登录IP地址',
+  login_location   varchar(255) default ''                  comment '登录地点',
   browser  		    varchar(50)  default '' 			 	comment '浏览器类型',
   os      		    varchar(50)  default '' 			 	comment '操作系统',
   status      	    varchar(10)  default '' 			 	comment '在线状态on_line在线off_line离线',

+ 174 - 0
src/main/java/com/ruoyi/common/utils/AddressUtils.java

@@ -0,0 +1,174 @@
+package com.ruoyi.common.utils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/**
+ * 获取地址类
+ */
+public class AddressUtils {
+    public static String getAddresses(String content, String encodingString) throws UnsupportedEncodingException {
+       /** 根据IP查询地址 http://ip.taobao.com/service/getIpInfo.php?ip=111.111.111.111*/
+        String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
+        String returnStr = getResult(urlStr, content, encodingString);
+        if (returnStr != null) {
+            returnStr = decodeUnicode(returnStr);
+            String[] temp = returnStr.split(",");
+            if (temp.length < 3) {
+                return "0";
+            }
+            return returnStr;
+        }
+        return null;
+    }
+
+    /**
+     * 获取查询结果
+     * @param urlStr
+     * @param content
+     * @param encoding
+     * @return
+     */
+    private static String getResult(String urlStr, String content, String encoding) {
+        URL url = null;
+        HttpURLConnection connection = null;
+        try {
+            url = new URL(urlStr);
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setConnectTimeout(2000);
+            connection.setReadTimeout(2000);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setRequestMethod("POST");
+            connection.setUseCaches(false);
+            connection.connect();
+            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
+            out.writeBytes(content);
+            out.flush();
+            out.close();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));
+            StringBuffer buffer = new StringBuffer();
+            String line = "";
+            while ((line = reader.readLine()) != null) {
+                buffer.append(line);
+            }
+            reader.close();
+            return buffer.toString();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+        return null;
+    }
+
+    /**
+     *
+     * @param theString
+     * @return
+     */
+    public static String decodeUnicode(String theString) {
+        char aChar;
+        int len = theString.length();
+        StringBuffer outBuffer = new StringBuffer(len);
+        for (int x = 0; x < len;) {
+            aChar = theString.charAt(x++);
+            if (aChar == '\\') {
+                aChar = theString.charAt(x++);
+                if (aChar == 'u') {
+                    int value = 0;
+                    for (int i = 0; i < 4; i++) {
+                        aChar = theString.charAt(x++);
+                        switch (aChar) {
+                            case '0':
+                            case '1':
+                            case '2':
+                            case '3':
+                            case '4':
+                            case '5':
+                            case '6':
+                            case '7':
+                            case '8':
+                            case '9':
+                                value = (value << 4) + aChar - '0';
+                                break;
+                            case 'a':
+                            case 'b':
+                            case 'c':
+                            case 'd':
+                            case 'e':
+                            case 'f':
+                                value = (value << 4) + 10 + aChar - 'a';
+                                break;
+                            case 'A':
+                            case 'B':
+                            case 'C':
+                            case 'D':
+                            case 'E':
+                            case 'F':
+                                value = (value << 4) + 10 + aChar - 'A';
+                                break;
+                            default:
+                                throw new IllegalArgumentException("Malformed      encoding.");
+                        }
+                    }
+                    outBuffer.append((char) value);
+                } else {
+                    if (aChar == 't') {
+                        aChar = '\t';
+                    } else if (aChar == 'r') {
+                        aChar = '\r';
+                    } else if (aChar == 'n') {
+                        aChar = '\n';
+                    } else if (aChar == 'f') {
+                        aChar = '\f';
+                    }
+                    outBuffer.append(aChar);
+                }
+            } else {
+                outBuffer.append(aChar);
+            }
+        }
+        return outBuffer.toString();
+    }
+
+    public static String getRealAddressByIP(String ip) {
+        String address = "";
+        try {
+
+            address = getAddresses("ip=" + ip, "utf-8");
+
+            ////把JSON文本parse成JSONObject,通俗就是把json文本转为json对象
+            JSONObject json= JSONObject.parseObject(address);
+
+            //通过其get的方法来获取data的value由于返回的是object对象,而data的value本身又是json字符串,所以我们可以进行强转
+            JSONObject object = (JSONObject)json.get("data");
+            String country=object.getString("country");
+            String region = object.getString("region");
+            String city = object.getString("city");
+            address = country+""+region + "" + city;
+        } catch (Exception e) {
+
+        }
+        return address;
+    }
+
+    public static void main(String[] args) {
+        try {
+            System.out.println(getAddresses("ip=111.85.32.37","utf-8"));
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        System.out.println(getRealAddressByIP("111.85.32.37"));
+    }
+}

+ 2 - 1
src/main/java/com/ruoyi/common/utils/IpUtils.java

@@ -37,6 +37,7 @@ public class IpUtils
         {
             ip = request.getRemoteAddr();
         }
-        return ip;
+
+        return  "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
     }
 }

+ 2 - 0
src/main/java/com/ruoyi/common/utils/SystemLogUtils.java

@@ -33,6 +33,7 @@ public class SystemLogUtils
     {
         StringBuilder s = new StringBuilder();
         s.append(LogUtils.getBlock(ShiroUtils.getIp()));
+        s.append(AddressUtils.getRealAddressByIP(ShiroUtils.getIp()));
         s.append(LogUtils.getBlock(username));
         s.append(LogUtils.getBlock(status));
         s.append(LogUtils.getBlock(msg));
@@ -61,6 +62,7 @@ public class SystemLogUtils
         logininfor.setLoginName(username);
         logininfor.setStatus(status);
         logininfor.setIpaddr(ShiroUtils.getIp());
+        logininfor.setLoginLocation(AddressUtils.getRealAddressByIP(ShiroUtils.getIp()));
         logininfor.setBrowser(browser);
         logininfor.setOs(os);
         logininfor.setMsg(message);

+ 5 - 1
src/main/java/com/ruoyi/framework/aspectj/LogAspect.java

@@ -3,6 +3,7 @@ package com.ruoyi.framework.aspectj;
 import java.lang.reflect.Method;
 import java.util.Map;
 
+import com.ruoyi.common.utils.AddressUtils;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.Signature;
 import org.aspectj.lang.annotation.AfterReturning;
@@ -72,7 +73,7 @@ public class LogAspect
     }
 
     @Async
-    private void handleLog(final JoinPoint joinPoint, final Exception e)
+    protected void handleLog(final JoinPoint joinPoint, final Exception e)
     {
         try
         {
@@ -92,6 +93,9 @@ public class LogAspect
             // 请求的地址
             String ip = ShiroUtils.getIp();
             operLog.setOperIp(ip);
+            //操作地点
+            operLog.setOperLocation(AddressUtils.getRealAddressByIP(ip));
+
             operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
             if (currentUser != null)
             {

+ 13 - 2
src/main/java/com/ruoyi/project/monitor/logininfor/domain/Logininfor.java

@@ -1,8 +1,9 @@
 package com.ruoyi.project.monitor.logininfor.domain;
 
-import java.util.Date;
 import com.ruoyi.framework.web.domain.BaseEntity;
 
+import java.util.Date;
+
 /**
  * 系统访问日志情况信息 sys_logininfor
  * 
@@ -19,6 +20,8 @@ public class Logininfor extends BaseEntity
     private String status;
     /** 登录IP地址 */
     private String ipaddr;
+    /**登录地点*/
+    private  String loginLocation;
     /** 浏览器类型 */
     private String browser;
     /** 操作系统 */
@@ -68,6 +71,14 @@ public class Logininfor extends BaseEntity
         this.ipaddr = ipaddr;
     }
 
+    public String getLoginLocation() {
+        return loginLocation;
+    }
+
+    public void setLoginLocation(String loginLocation) {
+        this.loginLocation = loginLocation;
+    }
+
     public String getBrowser()
     {
         return browser;
@@ -112,7 +123,7 @@ public class Logininfor extends BaseEntity
     public String toString()
     {
         return "Logininfor [infoId=" + infoId + ", loginName=" + loginName + ", status=" + status + ", ipaddr=" + ipaddr
-                + ", browser=" + browser + ", os=" + os + ", msg=" + msg + ", loginTime=" + loginTime + "]";
+                + ",loginLocation="+loginLocation+", browser=" + browser + ", os=" + os + ", msg=" + msg + ", loginTime=" + loginTime + "]";
     }
 
 }

+ 15 - 1
src/main/java/com/ruoyi/project/monitor/online/domain/UserOnline.java

@@ -1,9 +1,11 @@
 package com.ruoyi.project.monitor.online.domain;
 
-import java.util.Date;
+import com.ruoyi.common.utils.AddressUtils;
 import com.ruoyi.framework.web.domain.BaseEntity;
 import com.ruoyi.project.monitor.online.domain.OnlineSession.OnlineStatus;
 
+import java.util.Date;
+
 /**
  * 当前在线会话 sys_user_online
  * 
@@ -24,6 +26,9 @@ public class UserOnline extends BaseEntity
     /** 登录IP地址 */
     private String ipaddr;
 
+    /**登录地址*/
+    private String longinLocation;
+
     /** 浏览器类型 */
     private String browser;
 
@@ -58,6 +63,7 @@ public class UserOnline extends BaseEntity
         online.setLastAccessTime(session.getLastAccessTime());
         online.setExpireTime(session.getTimeout());
         online.setIpaddr(session.getHost());
+        online.setLonginLocation(AddressUtils.getRealAddressByIP(session.getHost()));
         online.setBrowser(session.getBrowser());
         online.setOs(session.getOs());
         online.setStatus(session.getStatus());
@@ -105,6 +111,14 @@ public class UserOnline extends BaseEntity
         this.ipaddr = ipaddr;
     }
 
+    public String getLonginLocation() {
+        return longinLocation;
+    }
+
+    public void setLonginLocation(String longinLocation) {
+        this.longinLocation = longinLocation;
+    }
+
     public String getBrowser()
     {
         return browser;

+ 13 - 2
src/main/java/com/ruoyi/project/monitor/operlog/domain/OperLog.java

@@ -1,8 +1,9 @@
 package com.ruoyi.project.monitor.operlog.domain;
 
-import java.util.Date;
 import com.ruoyi.framework.web.domain.BaseEntity;
 
+import java.util.Date;
+
 /**
  * 操作日志记录 oper_log
  * 
@@ -29,6 +30,8 @@ public class OperLog extends BaseEntity
     private String operUrl;
     /** 操作地址 */
     private String operIp;
+    /** 操作地点*/
+    private  String operLocation;
     /** 请求参数 */
     private String operParam;
     /** 状态0正常 1异常 */
@@ -128,6 +131,14 @@ public class OperLog extends BaseEntity
         this.operIp = operIp;
     }
 
+    public String getOperLocation() {
+        return operLocation;
+    }
+
+    public void setOperLocation(String operLocation) {
+        this.operLocation = operLocation;
+    }
+
     public String getOperParam()
     {
         return operParam;
@@ -173,7 +184,7 @@ public class OperLog extends BaseEntity
     {
         return "OperLog [operId=" + operId + ", title=" + title + ", action=" + action + ", method=" + method
                 + ", channel=" + channel + ", loginName=" + loginName + ", deptName=" + deptName + ", operUrl="
-                + operUrl + ", operIp=" + operIp + ", operParam=" + operParam + ", status=" + status + ", errorMsg="
+                + operUrl + ", operIp=" + operIp + ", operLocation=" + operLocation + ", operParam=" + operParam + ", status=" + status + ", errorMsg="
                 + errorMsg + ", operTime=" + operTime + "]";
     }
 

+ 3 - 2
src/main/resources/mybatis/monitor/LogininforMapper.xml

@@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="loginName"   column="login_name"   />
 		<result property="status"      column="status"       />
 		<result property="ipaddr"      column="ipaddr"       />
+		<result property="loginLocation"      column="login_location"       />
 		<result property="browser"     column="browser"      />
 		<result property="os"          column="os"           />
 		<result property="msg"         column="msg"          />
@@ -16,8 +17,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 
 	<insert id="insertLogininfor" parameterType="Logininfor">
-		insert into sys_logininfor (login_name, status, ipaddr, browser, os, msg, login_time) 
-		values (#{loginName}, #{status}, #{ipaddr}, #{browser}, #{os}, #{msg}, sysdate())
+		insert into sys_logininfor (login_name, status, ipaddr, login_location, browser, os, msg, login_time)
+		values (#{loginName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate())
 	</insert>
 	
 	<select id="selectLogininforList" parameterType="Logininfor" resultMap="LogininforResult">

+ 3 - 2
src/main/resources/mybatis/monitor/OnlineMapper.xml

@@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="loginName"         column="login_name"        />
 		<result property="deptName"          column="dept_name"         />
 		<result property="ipaddr"            column="ipaddr"            />
+		<result property="longinLocation"   column="login_location"     />
 		<result property="browser"           column="browser"           />
 		<result property="os"                column="os"                />
 		<result property="status"            column="status"            />
@@ -32,8 +33,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</select>
 
 	<insert id="saveOnline" parameterType="UserOnline">
-		replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, browser, os, status, start_timestsamp, last_access_time, expire_time) 
-        values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime})
+		replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestsamp, last_access_time, expire_time)
+        values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{longinLocation}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime})
 	</insert>
 	
  	<delete id="deleteOnlineById" parameterType="String">

+ 3 - 2
src/main/resources/mybatis/monitor/OperLogMapper.xml

@@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="deptName"       column="dept_name"     />
 		<result property="operUrl"        column="oper_url"     />
 		<result property="operIp"         column="oper_ip"      />
+		<result property="operLocation"   column="oper_location"    />
 		<result property="operParam"      column="oper_param"    />
 		<result property="status"         column="status"        />
 		<result property="errorMsg"       column="error_msg"     />
@@ -21,8 +22,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 
 	<insert id="insertOperlog" parameterType="OperLog">
-		insert into sys_oper_log(title, action, method, channel, login_name, dept_name, oper_url, oper_ip, oper_param, status, error_msg, oper_time) 
-        values (#{title}, #{action}, #{method}, #{channel}, #{loginName}, #{deptName}, #{operUrl}, #{operIp}, #{operParam}, #{status}, #{errorMsg}, sysdate())
+		insert into sys_oper_log(title, action, method, channel, login_name, dept_name, oper_url, oper_ip, oper_location, oper_param, status, error_msg, oper_time)
+        values (#{title}, #{action}, #{method}, #{channel}, #{loginName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{status}, #{errorMsg}, sysdate())
 	</insert>
 	
 	<select id="selectOperLogList" parameterType="OperLog" resultMap="OperLogResult">

+ 4 - 0
src/main/resources/static/ruoyi/monitor/logininfor/logininfor.js

@@ -16,6 +16,10 @@ $(function() {
             field: 'ipaddr',
             title: '主机'
         },
+        {
+            field: 'loginLocation',
+            title: '登录地点'
+        },
         {
             field: 'browser',
             title: '浏览器'

+ 4 - 0
src/main/resources/static/ruoyi/monitor/online/online.js

@@ -20,6 +20,10 @@ $(function() {
             field: 'ipaddr',
             title: '主机'
         },
+        {
+            field: 'longinLocation',
+            title: '登录地点'
+        },
         {
             field: 'browser',
             title: '浏览器'

+ 4 - 0
src/main/resources/static/ruoyi/monitor/operlog/operlog.js

@@ -28,6 +28,10 @@ $(function() {
             field: 'operIp',
             title: '主机'
         },
+        {
+            field: 'operLocation',
+            title: '操作地点'
+        },
         {
             field: 'status',
             title: '操作状态',

+ 1 - 1
src/main/resources/templates/monitor/operlog/detail.html

@@ -13,7 +13,7 @@
 		</div>
 		<div class="form-group">
 			<label class="col-sm-2 control-label">登录信息:</label>
-			<div class="form-control-static" th:text="${operLog.loginName} + ' / ' + ${operLog.deptName} + ' / ' + ${operLog.operIp}">
+			<div class="form-control-static" th:text="${operLog.loginName} + ' / ' + ${operLog.deptName} + ' / ' + ${operLog.operIp}+ ' / ' + ${operLog.operLocation}">
 			</div>
 		</div>
 		<div class="form-group">