9 changed files with 384 additions and 116 deletions
@ -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; |
||||||
|
} |
@ -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(); |
||||||
|
} |
||||||
} |
} |
||||||
|
@ -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…
Reference in new issue