完善日志备份功能

This commit is contained in:
weiweiw 2024-11-07 15:00:44 +08:00
parent 7addd31f7a
commit 59dc67b8d4
8 changed files with 65 additions and 39 deletions

View File

@ -145,7 +145,7 @@ public class SysLogsVo {
private String endTime; private String endTime;
//日志类型 1 业务日志 0 系统日志 2异常日志 //查询类型 1 按日志类型 2 按操作类型 3 按操作人
private String type; private String type;
private String capacity; private String capacity;

View File

@ -264,10 +264,6 @@ public class PasswordValidatorService {
public void handleIpValidation(String username, SysUser user) { public void handleIpValidation(String username, SysUser user) {
try { try {
String nowIp = IpUtils.getIpAddr(); String nowIp = IpUtils.getIpAddr();
AjaxResult ajaxResult = remoteUserService.selectSysIpWhitelist(SecurityConstants.INNER);
if (ajaxResult.isSuccess()){
}
String hisIp = redisService.getCacheObject("IP:" + user.getUserId()); String hisIp = redisService.getCacheObject("IP:" + user.getUserId());
if (!nowIp.equals(hisIp)) { if (!nowIp.equals(hisIp)) {
recordLogService.saveErrorLogs(username, System.currentTimeMillis(), user.getUserId().toString()); recordLogService.saveErrorLogs(username, System.currentTimeMillis(), user.getUserId().toString());

View File

@ -78,13 +78,12 @@ public class SysPasswordService {
if (!matches(user, password)) { if (!matches(user, password)) {
retryCount = retryCount + 1; retryCount = retryCount + 1;
recordLogService.saveLogs(username, startTime, "密码输入错误", "用户不存在/密码错误", null, null); recordLogService.saveLogs(username, startTime, "密码输入错误", "用户不存在/密码错误", null, null);
redisService.setCacheObject(getCacheKey(username), retryCount, dynamicLockTime, TimeUnit.MINUTES); redisService.setCacheObject(getCacheKey(username), retryCount, (long)lockTime, TimeUnit.MINUTES);
throw new ServiceException("用户不存在/密码错误"); throw new ServiceException("用户不存在/密码错误");
} else { } else {
clearLoginRecordCache(username); clearLoginRecordCache(username);
} }
} }
public boolean matches(SysUser user, String rawPassword) { public boolean matches(SysUser user, String rawPassword) {
return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
} }

View File

@ -78,7 +78,7 @@ public class SysLogController extends BaseController {
@ApiOperation(value = "查询系统日志") @ApiOperation(value = "查询系统日志")
@GetMapping("getSystemLogs") @GetMapping("getSystemLogs")
@SysLog(title = "审计日志", module = "审计日志->系统日志", businessType = OperaType.QUERY, details = "查询系统日志列表", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志->系统日志", businessType = OperaType.QUERY, details = "查询系统日志列表", type = "系统日志",logType = 0)
public TableDataInfo getSystemLogs(SysLogsVo dto) { public TableDataInfo getSystemLogs(SysLogsVo dto) {
try{ try{
dto.setLogType(0); dto.setLogType(0);
@ -124,31 +124,31 @@ public class SysLogController extends BaseController {
@GetMapping("downloadErrLogs") @GetMapping("downloadErrLogs")
@SysLog(title = "审计日志", module = "审计日志->异常日志", businessType = OperaType.COPY_LOG, logType = 0, details = "异常日志备份", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志->异常日志", businessType = OperaType.COPY_LOG, logType = 0, details = "异常日志备份", type = "系统日志")
public void downloadErrLogs(HttpServletRequest request, HttpServletResponse response) { public void downloadErrLogs(HttpServletRequest request, HttpServletResponse response) {
// try { try {
// String dateTimeNow=exportSqlService.export("2"); String dateTimeNow=exportSqlService.export("2");
// String path=filePath + ExportSqlService.TABLE_NAME + dateTimeNow+ SystemGlobal.TEXT_FIX; String path=filePath + ExportSqlService.TABLE_NAME + dateTimeNow+ SystemGlobal.TEXT_FIX;
// WordUtils.fileDown(path, "sys_log"+ dateTimeNow+".sql",response); FileUtils.fileDownload(path, "sys_log"+ dateTimeNow+".sql",response);
// } catch (Exception e) { } catch (Exception e) {
// logger.error("文件下载失败", e); logger.error("文件下载失败", e);
// } }
} }
@ApiOperation(value = "日志备份") @ApiOperation(value = "日志备份")
@GetMapping("downloadYwLogs") @GetMapping("downloadYwLogs")
@SysLog(title = "审计日志", module = "审计日志-->业务日志", businessType = OperaType.COPY_LOG,logType = 0, details = "业务日志备份", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志-->业务日志", businessType = OperaType.COPY_LOG,logType = 0, details = "业务日志备份", type = "系统日志")
public void downloadYwLogs(HttpServletRequest request, HttpServletResponse response) { public void downloadYwLogs(HttpServletRequest request, HttpServletResponse response) {
// try { try {
// String dateTimeNow=exportSqlService.export("1"); String dateTimeNow=exportSqlService.export("1");
// String path=filePath + ExportSqlService.TABLE_NAME + dateTimeNow+ SystemGlobal.TEXT_FIX; String path=filePath + ExportSqlService.TABLE_NAME + dateTimeNow+ SystemGlobal.TEXT_FIX;
// WordUtils.fileDown(path, "sys_log"+ dateTimeNow+".sql",response); FileUtils.fileDownload(path, "sys_log"+ dateTimeNow+".sql",response);
// } catch (Exception e) { } catch (Exception e) {
// logger.error("文件下载失败", e); logger.error("文件下载失败", e);
// } }
} }
@ApiOperation(value = "日志备份") @ApiOperation(value = "日志备份")
@GetMapping("downloadSysLogs") @GetMapping("downloadSysLogs")
@SysLog(title = "审计日志", module = "审计日志->系统日志", businessType = OperaType.COPY_LOG, details = "系统日志备份", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志->系统日志", businessType = OperaType.COPY_LOG, details = "系统日志备份", type = "系统日志",logType = 0)
public void downloadSysLogs(HttpServletRequest request, HttpServletResponse response) { public void downloadSysLogs(HttpServletRequest request, HttpServletResponse response) {
try { try {
String dateTimeNow=exportSqlService.export("0"); String dateTimeNow=exportSqlService.export("0");
@ -162,7 +162,7 @@ public class SysLogController extends BaseController {
@ApiOperation(value = "查询日志容量") @ApiOperation(value = "查询日志容量")
@PostMapping("getLogsSet") @PostMapping("getLogsSet")
@SysLog(title = "审计日志", module = "审计日志->日志容量配置", businessType = OperaType.QUERY, details = "查询日志容量", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志->日志容量配置", businessType = OperaType.QUERY, details = "查询日志容量", type = "系统日志",logType = 0)
public R<String> getLogsSet() { public R<String> getLogsSet() {
return service.getLogsSet(); return service.getLogsSet();
} }
@ -170,7 +170,7 @@ public class SysLogController extends BaseController {
@ApiOperation(value = "设置日志容量") @ApiOperation(value = "设置日志容量")
@PostMapping("setLogsSet") @PostMapping("setLogsSet")
@SysLog(title = "审计日志", module = "审计日志->日志容量配置", businessType = OperaType.QUERY, details = "修改日志容量", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志->日志容量配置", businessType = OperaType.QUERY, details = "修改日志容量", type = "系统日志",logType = 0)
public R<String> setLogsSet(@RequestBody SysLogsVo dto) { public R<String> setLogsSet(@RequestBody SysLogsVo dto) {
return service.setLogsSet(dto.getCapacity()); return service.setLogsSet(dto.getCapacity());
@ -179,7 +179,7 @@ public class SysLogController extends BaseController {
@ApiOperation(value = "查询日志统计分析") @ApiOperation(value = "查询日志统计分析")
@PostMapping("getLogStatistics") @PostMapping("getLogStatistics")
@SysLog(title = "审计日志", module = "审计日志->日志分析", businessType = OperaType.QUERY, details = "查询日志分析", type = "系统日志") @SysLog(title = "审计日志", module = "审计日志->日志分析", businessType = OperaType.QUERY, details = "查询日志分析", type = "系统日志",logType = 0)
public R<Map<String,Object>> getLogStatistics(@RequestBody SysLogsVo dto) { public R<Map<String,Object>> getLogStatistics(@RequestBody SysLogsVo dto) {
return service.getLogStatistics(dto); return service.getLogStatistics(dto);
} }

View File

@ -59,11 +59,19 @@ public interface SysLogMapper {
int getLogStatistics(SysLogsVo dto); int getLogStatistics(SysLogsVo dto);
/** /**
* 按照类型查询 * 按照操作类型查询
* @param dto * @param dto
* @return * @return
*/ */
List<SysLogsVo> getLogsList(SysLogsVo dto); List<SysLogsVo> getLogsListByOperType(SysLogsVo dto);
/**
* 按照操作人查询
* @param dto
* @return
*/
List<SysLogsVo> getLogsListByOperUserName(SysLogsVo dto);
/** /**
* 通过 方法查找模块 * 通过 方法查找模块

View File

@ -36,8 +36,6 @@ public class ExportSqlService {
@SneakyThrows @SneakyThrows
public String export(String logType ) { public String export(String logType ) {
String dateTimeNow= DateUtils.dateTimeNow(); String dateTimeNow= DateUtils.dateTimeNow();
String path=filePath + TABLE_NAME + dateTimeNow; String path=filePath + TABLE_NAME + dateTimeNow;
List<SysLogsVo> list=mapper.getLogsLists(logType); List<SysLogsVo> list=mapper.getLogsLists(logType);
@ -48,7 +46,7 @@ public class ExportSqlService {
try { try {
// 根据你的表结构生成你需要的SQL行 // 根据你的表结构生成你需要的SQL行
String rowSql = "INSERT INTO sys_logs (log_id, opera_user_name,ip,user_id,model" + String rowSql = "INSERT INTO sys_logs (log_id, opera_user_name,ip,user_id,model" +
",oper_time,method,params,operate_detail,oper_type,oper_uri,log_type,result,times,failure_reason,grade,err_type,method_type,title) VALUES ('" ",oper_time,method,params,operate_detail,oper_type,oper_uri,log_type,result,times,failure_reason,grade,err_type,method_type,title,result_data) VALUES ('"
+ isNotNull(logs.getLogId())+ "', '" + isNotNull(logs.getLogId())+ "', '"
+isNotNull(logs.getOperaUserName())+ "', '" +isNotNull(logs.getOperaUserName())+ "', '"
+isNotNull(logs.getIp() )+ "', '" +isNotNull(logs.getIp() )+ "', '"
@ -66,8 +64,9 @@ public class ExportSqlService {
+ isNotNull(logs.getFailureReason()) + "', '" + isNotNull(logs.getFailureReason()) + "', '"
+isNotNull( logs.getGrade()) + "', '" +isNotNull( logs.getGrade()) + "', '"
+isNotNull(logs.getErrType()) + "', '" +isNotNull(logs.getErrType()) + "', '"
+ isNotNull(logs.getMethod()) + "', '"+ +isNotNull(logs.getMethodType()) + "', '"
isNotNull(logs.getTitle())+ "');"; + isNotNull(logs.getTitle()) + "', '"+
isNotNull(logs.getResultData())+ "');";
writer.write(rowSql + System.lineSeparator()); writer.write(rowSql + System.lineSeparator());
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);

View File

@ -186,6 +186,7 @@ public class SysLogServiceImpl implements ISysLogService {
dto.setEndTime(dto.getOperTime().split(" - ")[1].trim()); dto.setEndTime(dto.getOperTime().split(" - ")[1].trim());
} }
List<SysLogsVo> all=mapper.getAllLogs(dto); List<SysLogsVo> all=mapper.getAllLogs(dto);
//先按操作结果查询
if(StringUtils.isNotEmpty(all)){ if(StringUtils.isNotEmpty(all)){
int allNum= all.stream().mapToInt(SysLogsVo::getNum).sum(); int allNum= all.stream().mapToInt(SysLogsVo::getNum).sum();
map.put("allNum",allNum); map.put("allNum",allNum);
@ -197,7 +198,9 @@ public class SysLogServiceImpl implements ISysLogService {
} }
}); });
} }
if (SystemGlobal.LOG_TYPE.equals(dto.getType())){ if (SystemGlobal.LOG_TYPE.equals(dto.getType())){
//按日志类型查询
List<Integer> type=new ArrayList<>(); List<Integer> type=new ArrayList<>();
List<String> typeList=new ArrayList<>(); List<String> typeList=new ArrayList<>();
typeList.add("系统日志");typeList.add("业务日志");typeList.add("异常日志"); typeList.add("系统日志");typeList.add("业务日志");typeList.add("异常日志");
@ -210,16 +213,27 @@ public class SysLogServiceImpl implements ISysLogService {
}); });
map.put("list",typeList); map.put("list",typeList);
map.put("nums",nums); map.put("nums",nums);
}else { }else if("2".equals(dto.getType())){
//按操作类型查询
List<String> typeList=new ArrayList<>(); List<String> typeList=new ArrayList<>();
List<Integer> nums=new ArrayList<>(); List<Integer> nums=new ArrayList<>();
List<SysLogsVo> list=mapper.getLogsList(dto); List<SysLogsVo> list=mapper.getLogsListByOperType(dto);
list.forEach(vo->{ list.forEach(vo->{
typeList.add(vo.getOperType()); typeList.add(vo.getOperType());
nums.add(vo.getNum()); nums.add(vo.getNum());
}); });
map.put("list",typeList); map.put("list",typeList);
map.put("nums",nums); map.put("nums",nums);
}else if ("3".equals(dto.getType())){
List<String> typeList=new ArrayList<>();
List<Integer> nums=new ArrayList<>();
List<SysLogsVo> list=mapper.getLogsListByOperUserName(dto);
list.forEach(vo->{
typeList.add(vo.getOperaUserName());
nums.add(vo.getNum());
});
map.put("list",typeList);
map.put("nums",nums);
} }
return R.ok(map); return R.ok(map);
}catch (Exception e){ }catch (Exception e){

View File

@ -132,13 +132,13 @@
ip ip
</if> </if>
<if test='logSort=="5"'> <if test='logSort=="5"'>
grade oper_type
</if> </if>
<if test='logDesc=="1"'> <if test='logDesc=="1"'>
DESC COLLATE utf8mb4_unicode_ci DESC
</if> </if>
<if test='logDesc=="2"'> <if test='logDesc=="2"'>
ASC COLLATE utf8mb4_unicode_ci ASC
</if> </if>
</if> </if>
</select> </select>
@ -154,7 +154,7 @@
and oper_time BETWEEN concat(#{startTime}, ' 00:00:00') AND CONCAT(#{endTime},' 23:59:59') and oper_time BETWEEN concat(#{startTime}, ' 00:00:00') AND CONCAT(#{endTime},' 23:59:59')
</if> </if>
</select> </select>
<select id="getLogsList" resultType="com.bonus.system.api.domain.SysLogsVo"> <select id="getLogsListByOperType" resultType="com.bonus.system.api.domain.SysLogsVo">
select COUNT(1) num,oper_type operType select COUNT(1) num,oper_type operType
FROM sys_logs FROM sys_logs
WHERE oper_type IS NOT NULL WHERE oper_type IS NOT NULL
@ -163,6 +163,16 @@
</if> </if>
GROUP by oper_type GROUP by oper_type
</select> </select>
<select id="getLogsListByOperUserName" resultType="com.bonus.system.api.domain.SysLogsVo">
select COUNT(1) num,opera_user_name operaUserName
FROM sys_logs
WHERE opera_user_name IS NOT NULL
<if test="endTime!=null and endTime!=''">
and oper_time BETWEEN CONCAT(#{startTime}, ' 00:00:00') AND CONCAT(#{endTime},' 23:59:59')
</if>
GROUP by opera_user_name
</select>
<!--查询模块--> <!--查询模块-->
<select id="getModule" resultType="com.bonus.system.api.domain.SysLogsVo"> <select id="getModule" resultType="com.bonus.system.api.domain.SysLogsVo">
select CONCAT(IFNULL(sm.menu_name,''),'->',IFNULL(sm2.menu_name,'')) module ,sm3.menu_name operateDetail select CONCAT(IFNULL(sm.menu_name,''),'->',IFNULL(sm2.menu_name,'')) module ,sm3.menu_name operateDetail