Browse Source

调整log日志

集成easyexcel
dev
wangwei 4 days ago
parent
commit
afb2b6c414
  1. 13
      pom.xml
  2. 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
  3. 18
      ruoyi-admin/src/main/resources/logback.xml
  4. 5
      ruoyi-common/pom.xml
  5. 32
      ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
  6. 4
      ruoyi-plan/src/main/java/com/ruoyi/dhc/service/impl/DhcCountryServiceImpl.java
  7. 35
      ruoyi-system/src/main/java/com/ruoyi/dhc/domain/EnumFiledConvert.java
  8. 251
      ruoyi-system/src/main/java/com/ruoyi/dhc/domain/SysOperLog.java
  9. 138
      ruoyi-system/src/main/java/com/ruoyi/dhc/domain/read/EasyExcelConvert.java

13
pom.xml

@ -33,6 +33,7 @@
<jwt.version>0.9.1</jwt.version> <jwt.version>0.9.1</jwt.version>
<knife4j.version>3.0.3</knife4j.version> <knife4j.version>3.0.3</knife4j.version>
<mybatis-plus.version>3.5.2</mybatis-plus.version> <mybatis-plus.version>3.5.2</mybatis-plus.version>
<easyexcel.version>3.3.2</easyexcel.version>
</properties> </properties>
<!-- 依赖声明 --> <!-- 依赖声明 -->
@ -201,6 +202,18 @@
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java

@ -48,7 +48,7 @@ public class SysOperlogController extends BaseController
{ {
List<SysOperLog> list = operLogService.selectOperLogList(operLog); List<SysOperLog> list = operLogService.selectOperLogList(operLog);
ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
util.exportExcel(response, list, "操作日志"); util.exportEasyExcel(response, list, "操作日志");
} }
@Log(title = "操作日志", businessType = BusinessType.DELETE) @Log(title = "操作日志", businessType = BusinessType.DELETE)

18
ruoyi-admin/src/main/resources/logback.xml

@ -5,11 +5,23 @@
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!--控制台输出内容的颜色转换以及格式-->
<substitutionProperty name="logging.pattern.console"
value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 控制台输出 --> <!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${log.pattern}</pattern> <pattern>
</encoder> ${logging.pattern.console}
</pattern>
</layout>
</appender> </appender>
<!-- 系统日志输出 --> <!-- 系统日志输出 -->

5
ruoyi-common/pom.xml

@ -128,6 +128,11 @@
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

32
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java

@ -24,6 +24,8 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.FieldUtils;
@ -1809,4 +1811,34 @@ public class ExcelUtil<T>
} }
return method; return method;
} }
/**
* 对excel表单默认第一个索引名转换成listEasyExcel
*
* @param is 输入流
* @return 转换后集合
*/
public List<T> importEasyExcel(InputStream is) throws Exception
{
return EasyExcel.read(is).head(clazz).sheet().doReadSync();
}
/**
* 对list数据源将其里面的数据导入到excel表单EasyExcel
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @return 结果
*/
public void exportEasyExcel(HttpServletResponse response, List<T> list, String sheetName)
{
try
{
EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(list);
}
catch (IOException e)
{
log.error("导出EasyExcel异常{}", e.getMessage());
}
}
} }

4
ruoyi-plan/src/main/java/com/ruoyi/dhc/service/impl/DhcCountryServiceImpl.java

@ -44,9 +44,7 @@ public class DhcCountryServiceImpl implements IDhcCountryService
public List<DhcCountry> selectDhcCountryList(DhcCountry dhcCountry) public List<DhcCountry> selectDhcCountryList(DhcCountry dhcCountry)
{ {
dhcCountry.setDelFlag("0"); dhcCountry.setDelFlag("0");
// return dhcCountryMapper.selectDhcCountryList(dhcCountry); return dhcCountryMapper.selectDhcCountryList(dhcCountry);
LambdaQueryWrapper<DhcCountry> eq = new LambdaQueryWrapper<DhcCountry>();
return dhcCountryMapper.selectList(eq);
} }
/** /**

35
ruoyi-system/src/main/java/com/ruoyi/dhc/domain/EnumFiledConvert.java

@ -0,0 +1,35 @@
package com.ruoyi.dhc.domain;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 对excel导入时处理枚举转化
* @Author 996
* @Date 2024/3/13
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumFiledConvert {
/**
* 枚举映射map key-value,key-value,key-value,key-value
* @return
*/
String enumMap() default "";
/**
* 枚举类导入导出在excel中的分隔符号
* @return
*/
String spiteChar() default ",";
/**
* 单选 or 多选
* @return
*/
boolean single() default true;
}

251
ruoyi-system/src/main/java/com/ruoyi/dhc/domain/SysOperLog.java

@ -1,269 +1,304 @@
package com.ruoyi.dhc.domain; package com.ruoyi.dhc.domain;
import java.util.Date; import java.util.Date;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.dhc.domain.read.EasyExcelConvert;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/** /**
* 操作日志记录表 oper_log * 操作日志记录表 oper_log
* *
* @author ruoyi * @author ruoyi
*/ */
public class SysOperLog extends BaseEntity @ExcelIgnoreUnannotated
{ @ColumnWidth(16)
@HeadRowHeight(14)
@HeadFontStyle(fontHeightInPoints = 11)
public class SysOperLog extends BaseEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** 日志主键 */ /**
@Excel(name = "操作序号", cellType = ColumnType.NUMERIC) * 日志主键
*/
@ExcelProperty(value = "操作序号")
private Long operId; private Long operId;
/** 操作模块 */ /**
@Excel(name = "操作模块") * 操作模块
*/
@ExcelProperty(value = "操作模块")
private String title; private String title;
/** 业务类型(0其它 1新增 2修改 3删除) */ /**
@Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") * 业务类型0其它 1新增 2修改 3删除
*/
@ExcelProperty(value = "业务类型", converter = EasyExcelConvert.class)
@EnumFiledConvert(enumMap = "0-其它,1-新增,2-修改,3-删除,4-授权,5-导出,6-导入,7-强退,8-生成代码,9-清空数据")
private Integer businessType; private Integer businessType;
/** 业务类型数组 */ /**
* 业务类型数组
*/
private Integer[] businessTypes; private Integer[] businessTypes;
/** 请求方法 */ /**
@Excel(name = "请求方法") * 请求方法
*/
@ExcelProperty(value = "请求方法")
private String method; private String method;
/** 请求方式 */ /**
@Excel(name = "请求方式") * 请求方式
*/
@ExcelProperty(value = "请求方式")
private String requestMethod; private String requestMethod;
/** 操作类别(0其它 1后台用户 2手机端用户) */ /**
@Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") * 操作类别0其它 1后台用户 2手机端用户
*/
@ExcelProperty(value = "操作类别", converter = EasyExcelConvert.class)
@EnumFiledConvert(enumMap = "0-其它,1-后台用户,2-手机端用户")
private Integer operatorType; private Integer operatorType;
/** 操作人员 */ /**
@Excel(name = "操作人员") * 操作人员
*/
@ExcelProperty(value = "操作人员")
private String operName; private String operName;
/** 部门名称 */ /**
@Excel(name = "部门名称") * 部门名称
*/
@ExcelProperty(value = "部门名称")
private String deptName; private String deptName;
/** 请求url */ /**
@Excel(name = "请求地址") * 请求url
*/
@ExcelProperty(value = "请求地址")
private String operUrl; private String operUrl;
/** 操作地址 */ /**
@Excel(name = "操作地址") * 操作地址
*/
@ExcelProperty(value = "操作地址")
private String operIp; private String operIp;
/** 操作地点 */ /**
@Excel(name = "操作地点") * 操作地点
*/
@ExcelProperty(value = "操作地点")
private String operLocation; private String operLocation;
/** 请求参数 */ /**
@Excel(name = "请求参数") * 请求参数
*/
@ExcelProperty(value = "请求参数")
private String operParam; private String operParam;
/** 返回参数 */ /**
@Excel(name = "返回参数") * 返回参数
*/
@ExcelProperty(value = "返回参数")
private String jsonResult; private String jsonResult;
/** 操作状态(0正常 1异常) */ /**
@Excel(name = "状态", readConverterExp = "0=正常,1=异常") * 操作状态0正常 1异常
*/
@ExcelProperty(value = "状态", converter = EasyExcelConvert.class)
@EnumFiledConvert(enumMap = "0-正常,1-异常")
private Integer status; private Integer status;
/** 错误消息 */ /**
@Excel(name = "错误消息") * 错误消息
*/
@ExcelProperty(value = "错误消息")
private String errorMsg; private String errorMsg;
/** 操作时间 */ /**
* 操作时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "操作时间")
private Date operTime; private Date operTime;
/** 消耗时间 */ /** 消耗时间 */
@Excel(name = "消耗时间", suffix = "毫秒") @Excel(name = "消耗时间", suffix = "毫秒")
private Long costTime; private Long costTime;
public Long getOperId() public Long getOperId() {
{
return operId; return operId;
} }
public void setOperId(Long operId) public void setOperId(Long operId) {
{
this.operId = operId; this.operId = operId;
} }
public String getTitle() public String getTitle() {
{
return title; return title;
} }
public void setTitle(String title) public void setTitle(String title) {
{
this.title = title; this.title = title;
} }
public Integer getBusinessType() public Integer getBusinessType() {
{
return businessType; return businessType;
} }
public void setBusinessType(Integer businessType) public void setBusinessType(Integer businessType) {
{
this.businessType = businessType; this.businessType = businessType;
} }
public Integer[] getBusinessTypes() public Integer[] getBusinessTypes() {
{
return businessTypes; return businessTypes;
} }
public void setBusinessTypes(Integer[] businessTypes) public void setBusinessTypes(Integer[] businessTypes) {
{
this.businessTypes = businessTypes; this.businessTypes = businessTypes;
} }
public String getMethod() public String getMethod() {
{
return method; return method;
} }
public void setMethod(String method) public void setMethod(String method) {
{
this.method = method; this.method = method;
} }
public String getRequestMethod() public String getRequestMethod() {
{
return requestMethod; return requestMethod;
} }
public void setRequestMethod(String requestMethod) public void setRequestMethod(String requestMethod) {
{
this.requestMethod = requestMethod; this.requestMethod = requestMethod;
} }
public Integer getOperatorType() public Integer getOperatorType() {
{
return operatorType; return operatorType;
} }
public void setOperatorType(Integer operatorType) public void setOperatorType(Integer operatorType) {
{
this.operatorType = operatorType; this.operatorType = operatorType;
} }
public String getOperName() public String getOperName() {
{
return operName; return operName;
} }
public void setOperName(String operName) public void setOperName(String operName) {
{
this.operName = operName; this.operName = operName;
} }
public String getDeptName() public String getDeptName() {
{
return deptName; return deptName;
} }
public void setDeptName(String deptName) public void setDeptName(String deptName) {
{
this.deptName = deptName; this.deptName = deptName;
} }
public String getOperUrl() public String getOperUrl() {
{
return operUrl; return operUrl;
} }
public void setOperUrl(String operUrl) public void setOperUrl(String operUrl) {
{
this.operUrl = operUrl; this.operUrl = operUrl;
} }
public String getOperIp() public String getOperIp() {
{
return operIp; return operIp;
} }
public void setOperIp(String operIp) public void setOperIp(String operIp) {
{
this.operIp = operIp; this.operIp = operIp;
} }
public String getOperLocation() public String getOperLocation() {
{
return operLocation; return operLocation;
} }
public void setOperLocation(String operLocation) public void setOperLocation(String operLocation) {
{
this.operLocation = operLocation; this.operLocation = operLocation;
} }
public String getOperParam() public String getOperParam() {
{
return operParam; return operParam;
} }
public void setOperParam(String operParam) public void setOperParam(String operParam) {
{
this.operParam = operParam; this.operParam = operParam;
} }
public String getJsonResult() public String getJsonResult() {
{
return jsonResult; return jsonResult;
} }
public void setJsonResult(String jsonResult) public void setJsonResult(String jsonResult) {
{
this.jsonResult = jsonResult; this.jsonResult = jsonResult;
} }
public Integer getStatus() public Integer getStatus() {
{
return status; return status;
} }
public void setStatus(Integer status) public void setStatus(Integer status) {
{
this.status = status; this.status = status;
} }
public String getErrorMsg() public String getErrorMsg() {
{
return errorMsg; return errorMsg;
} }
public void setErrorMsg(String errorMsg) public void setErrorMsg(String errorMsg) {
{
this.errorMsg = errorMsg; this.errorMsg = errorMsg;
} }
public Date getOperTime() public Date getOperTime() {
{
return operTime; return operTime;
} }
public void setOperTime(Date operTime) public void setOperTime(Date operTime) {
{
this.operTime = operTime; this.operTime = operTime;
} }
public Long getCostTime() public Long getCostTime() {
{
return costTime; return costTime;
} }
public void setCostTime(Long costTime) public void setCostTime(Long costTime) {
{
this.costTime = costTime; this.costTime = costTime;
} }
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("operId", getOperId())
.append("title", getTitle())
.append("businessType", getBusinessType())
.append("businessTypes", getBusinessTypes())
.append("method", getMethod())
.append("requestMethod", getRequestMethod())
.append("operatorType", getOperatorType())
.append("operName", getOperName())
.append("deptName", getDeptName())
.append("operUrl", getOperUrl())
.append("operIp", getOperIp())
.append("operLocation", getOperLocation())
.append("operParam", getOperParam())
.append("status", getStatus())
.append("errorMsg", getErrorMsg())
.append("operTime", getOperTime())
.toString();
}
} }

138
ruoyi-system/src/main/java/com/ruoyi/dhc/domain/read/EasyExcelConvert.java

@ -0,0 +1,138 @@
package com.ruoyi.dhc.domain.read;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.ruoyi.dhc.domain.EnumFiledConvert;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* excel导入导出针对枚举类型的转换器
*
* @Author 996
* @Date 2024/3/13
*/
public class EasyExcelConvert implements Converter<Object> {
/**
* 枚举列表
*/
private Map<String, String> enumMap = new HashMap<>();
/**
* excel转化后的类型
*
* @return
*/
@Override
public Class<?> supportJavaTypeKey() {
return Object.class;
}
/**
* excel中的数据类型,统一设置字符串
*
* @return
*/
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 导入转换
* @param cellData 当前单元格对象
* @param contentProperty 当前单元格属性
* @param globalConfiguration
* @return
* @throws Exception
*/
@Override
public Object convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
String cellMsg = cellData.getStringValue();
Field field = contentProperty.getField();
EnumFiledConvert enumFiledConvert = field.getAnnotation(EnumFiledConvert.class);
if (enumFiledConvert == null) {
return null;
}
String enumStr = enumFiledConvert.enumMap();
// 解析枚举映射关系
getEnumMap(enumStr, true);
// 是否为单选
boolean single = enumFiledConvert.single();
// 如果是单选,默认Java属性为integer
if (single) {
String res = enumMap.get(cellMsg);
return StringUtils.hasText(res) ? Integer.valueOf(res) : null;
} else {
// 多选分隔符
String spiteChar = enumFiledConvert.spiteChar();
// 多选枚举,默认Java属性为字符串,格式为 key1,key2,key3
List<String> strStr = Arrays.asList(cellMsg.split(spiteChar)).stream().map(s -> String.valueOf(enumMap.get(s))).collect(Collectors.toList());
String str = String.join(spiteChar, strStr);
return str;
}
}
/**
* 导出转化
* @param value 当前值
* @param contentProperty 当前单元格属性
* @param globalConfiguration
* @return
* @throws Exception
*/
@Override
public WriteCellData<?> convertToExcelData(Object value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
Field field = contentProperty.getField();
EnumFiledConvert enumFiledConvert = field.getAnnotation(EnumFiledConvert.class);
if (enumFiledConvert == null) {
return new WriteCellData();
}
// 解析枚举字符串
String enumStr = enumFiledConvert.enumMap();
getEnumMap(enumStr, false);
// 是否为单选
boolean single = enumFiledConvert.single();
// 如果是单选,默认Java属性为integer
if (single) {
return new WriteCellData(enumMap.getOrDefault(String.valueOf(value), ""));
} else {
// 多选分隔符
String spiteChar = enumFiledConvert.spiteChar();
// 多选枚举,默认Java属性为字符串,格式为 key1,key2,key3
List<String> strStr = Arrays.asList(String.valueOf(value).split(spiteChar)).stream().map(s -> String.valueOf(enumMap.get(s))).collect(Collectors.toList());
String str = String.join(spiteChar, strStr);
return new WriteCellData(str);
}
}
/**
* 根据注解配置的枚举映射字符串进行解析到map中
* @param mapStr
* @param readOrWrite 读excel 写excel
*/
private void getEnumMap(String mapStr, boolean readOrWrite) {
String[] enumS = mapStr.split(",");
for (String anEnum : enumS) {
String[] data = anEnum.split("-");
if (readOrWrite) {
// 读excel excel中的数据都是value,转换成key
enumMap.put(data[1], data[0]);
} else {
// 写excel Java中的数据都是key,转换成value
enumMap.put(data[0], data[1]);
}
}
}
}
Loading…
Cancel
Save