mirror of https://gitee.com/y_project/RuoYi.git
commit
90f1ffee63
|
@ -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离线',
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 + "]";
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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 + "]";
|
||||
}
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -16,6 +16,10 @@ $(function() {
|
|||
field: 'ipaddr',
|
||||
title: '主机'
|
||||
},
|
||||
{
|
||||
field: 'loginLocation',
|
||||
title: '登录地点'
|
||||
},
|
||||
{
|
||||
field: 'browser',
|
||||
title: '浏览器'
|
||||
|
|
|
@ -20,6 +20,10 @@ $(function() {
|
|||
field: 'ipaddr',
|
||||
title: '主机'
|
||||
},
|
||||
{
|
||||
field: 'longinLocation',
|
||||
title: '登录地点'
|
||||
},
|
||||
{
|
||||
field: 'browser',
|
||||
title: '浏览器'
|
||||
|
|
|
@ -28,6 +28,10 @@ $(function() {
|
|||
field: 'operIp',
|
||||
title: '主机'
|
||||
},
|
||||
{
|
||||
field: 'operLocation',
|
||||
title: '操作地点'
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
title: '操作状态',
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue