!5 增加操作日志操作地点、登录日志的登录地点、在线用户登录地点。

Merge pull request !5 from yangzhengze/master
pull/788658/MERGE
yangzhengze 2018-05-29 09:51:12 +08:00 committed by 若依
commit 90f1ffee63
15 changed files with 249 additions and 14 deletions

View File

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

View File

@ -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.phpip=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"));
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,7 +13,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">登录信息:</label> <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> </div>
<div class="form-group"> <div class="form-group">