Browse Source

调整log日志

集成easyexcel
dev
wangwei 3 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. 253
      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 @@ @@ -33,6 +33,7 @@
<jwt.version>0.9.1</jwt.version>
<knife4j.version>3.0.3</knife4j.version>
<mybatis-plus.version>3.5.2</mybatis-plus.version>
<easyexcel.version>3.3.2</easyexcel.version>
</properties>
<!-- 依赖声明 -->
@ -201,6 +202,18 @@ @@ -201,6 +202,18 @@
<version>${ruoyi.version}</version>
</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>
</dependencyManagement>

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

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

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

@ -5,11 +5,23 @@ @@ -5,11 +5,23 @@
<!-- 日志输出格式 -->
<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">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
${logging.pattern.console}
</pattern>
</layout>
</appender>
<!-- 系统日志输出 -->

5
ruoyi-common/pom.xml

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

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

@ -24,6 +24,8 @@ import java.util.Set; @@ -24,6 +24,8 @@ import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
@ -1809,4 +1811,34 @@ public class ExcelUtil<T> @@ -1809,4 +1811,34 @@ public class ExcelUtil<T>
}
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 @@ -44,9 +44,7 @@ public class DhcCountryServiceImpl implements IDhcCountryService
public List<DhcCountry> selectDhcCountryList(DhcCountry dhcCountry)
{
dhcCountry.setDelFlag("0");
// return dhcCountryMapper.selectDhcCountryList(dhcCountry);
LambdaQueryWrapper<DhcCountry> eq = new LambdaQueryWrapper<DhcCountry>();
return dhcCountryMapper.selectList(eq);
return dhcCountryMapper.selectDhcCountryList(dhcCountry);
}
/**

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

@ -0,0 +1,35 @@ @@ -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;
}

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

@ -1,269 +1,304 @@ @@ -1,269 +1,304 @@
package com.ruoyi.dhc.domain;
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.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
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
*
*
* @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;
/** 日志主键 */
@Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
/**
* 日志主键
*/
@ExcelProperty(value = "操作序号")
private Long operId;
/** 操作模块 */
@Excel(name = "操作模块")
/**
* 操作模块
*/
@ExcelProperty(value = "操作模块")
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[] businessTypes;
/** 请求方法 */
@Excel(name = "请求方法")
/**
* 请求方法
*/
@ExcelProperty(value = "请求方法")
private String method;
/** 请求方式 */
@Excel(name = "请求方式")
/**
* 请求方式
*/
@ExcelProperty(value = "请求方式")
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;
/** 操作人员 */
@Excel(name = "操作人员")
/**
* 操作人员
*/
@ExcelProperty(value = "操作人员")
private String operName;
/** 部门名称 */
@Excel(name = "部门名称")
/**
* 部门名称
*/
@ExcelProperty(value = "部门名称")
private String deptName;
/** 请求url */
@Excel(name = "请求地址")
/**
* 请求url
*/
@ExcelProperty(value = "请求地址")
private String operUrl;
/** 操作地址 */
@Excel(name = "操作地址")
/**
* 操作地址
*/
@ExcelProperty(value = "操作地址")
private String operIp;
/** 操作地点 */
@Excel(name = "操作地点")
/**
* 操作地点
*/
@ExcelProperty(value = "操作地点")
private String operLocation;
/** 请求参数 */
@Excel(name = "请求参数")
/**
* 请求参数
*/
@ExcelProperty(value = "请求参数")
private String operParam;
/** 返回参数 */
@Excel(name = "返回参数")
/**
* 返回参数
*/
@ExcelProperty(value = "返回参数")
private String jsonResult;
/** 操作状态(0正常 1异常) */
@Excel(name = "状态", readConverterExp = "0=正常,1=异常")
/**
* 操作状态0正常 1异常
*/
@ExcelProperty(value = "状态", converter = EasyExcelConvert.class)
@EnumFiledConvert(enumMap = "0-正常,1-异常")
private Integer status;
/** 错误消息 */
@Excel(name = "错误消息")
/**
* 错误消息
*/
@ExcelProperty(value = "错误消息")
private String errorMsg;
/** 操作时间 */
/**
* 操作时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "操作时间")
private Date operTime;
/** 消耗时间 */
@Excel(name = "消耗时间", suffix = "毫秒")
private Long costTime;
public Long getOperId()
{
public Long getOperId() {
return operId;
}
public void setOperId(Long operId)
{
public void setOperId(Long operId) {
this.operId = operId;
}
public String getTitle()
{
public String getTitle() {
return title;
}
public void setTitle(String title)
{
public void setTitle(String title) {
this.title = title;
}
public Integer getBusinessType()
{
public Integer getBusinessType() {
return businessType;
}
public void setBusinessType(Integer businessType)
{
public void setBusinessType(Integer businessType) {
this.businessType = businessType;
}
public Integer[] getBusinessTypes()
{
public Integer[] getBusinessTypes() {
return businessTypes;
}
public void setBusinessTypes(Integer[] businessTypes)
{
public void setBusinessTypes(Integer[] businessTypes) {
this.businessTypes = businessTypes;
}
public String getMethod()
{
public String getMethod() {
return method;
}
public void setMethod(String method)
{
public void setMethod(String method) {
this.method = method;
}
public String getRequestMethod()
{
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod)
{
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public Integer getOperatorType()
{
public Integer getOperatorType() {
return operatorType;
}
public void setOperatorType(Integer operatorType)
{
public void setOperatorType(Integer operatorType) {
this.operatorType = operatorType;
}
public String getOperName()
{
public String getOperName() {
return operName;
}
public void setOperName(String operName)
{
public void setOperName(String operName) {
this.operName = operName;
}
public String getDeptName()
{
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName)
{
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getOperUrl()
{
public String getOperUrl() {
return operUrl;
}
public void setOperUrl(String operUrl)
{
public void setOperUrl(String operUrl) {
this.operUrl = operUrl;
}
public String getOperIp()
{
public String getOperIp() {
return operIp;
}
public void setOperIp(String operIp)
{
public void setOperIp(String operIp) {
this.operIp = operIp;
}
public String getOperLocation()
{
public String getOperLocation() {
return operLocation;
}
public void setOperLocation(String operLocation)
{
public void setOperLocation(String operLocation) {
this.operLocation = operLocation;
}
public String getOperParam()
{
public String getOperParam() {
return operParam;
}
public void setOperParam(String operParam)
{
public void setOperParam(String operParam) {
this.operParam = operParam;
}
public String getJsonResult()
{
public String getJsonResult() {
return jsonResult;
}
public void setJsonResult(String jsonResult)
{
public void setJsonResult(String jsonResult) {
this.jsonResult = jsonResult;
}
public Integer getStatus()
{
public Integer getStatus() {
return status;
}
public void setStatus(Integer status)
{
public void setStatus(Integer status) {
this.status = status;
}
public String getErrorMsg()
{
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg)
{
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public Date getOperTime()
{
public Date getOperTime() {
return operTime;
}
public void setOperTime(Date operTime)
{
public void setOperTime(Date operTime) {
this.operTime = operTime;
}
public Long getCostTime()
{
public Long getCostTime() {
return costTime;
}
public void setCostTime(Long costTime)
{
public void setCostTime(Long 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 @@ @@ -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