haungxing
2 years ago
265 changed files with 9634 additions and 744 deletions
@ -1,21 +0,0 @@
|
||||
# http://editorconfig.org |
||||
root = true |
||||
|
||||
# 空格替代Tab缩进在各种编辑工具下效果一致 |
||||
[*] |
||||
indent_style = space |
||||
indent_size = 4 |
||||
charset = utf-8 |
||||
end_of_line = lf |
||||
trim_trailing_whitespace = true |
||||
insert_final_newline = true |
||||
|
||||
[*.java] |
||||
indent_style = tab |
||||
|
||||
[*.{json,yml}] |
||||
indent_size = 2 |
||||
|
||||
[*.md] |
||||
insert_final_newline = false |
||||
trim_trailing_whitespace = false |
@ -0,0 +1,48 @@
|
||||
package com.hnac.hzims.common.logs.annotation; |
||||
|
||||
import com.hnac.hzims.common.logs.enums.BusinessType; |
||||
import com.hnac.hzims.common.logs.enums.OperatorType; |
||||
|
||||
import java.lang.annotation.*; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/3/29 11:38 |
||||
*/ |
||||
@Documented |
||||
@Retention(RetentionPolicy.RUNTIME) |
||||
@Target({ ElementType.PARAMETER, ElementType.METHOD }) |
||||
public @interface OperationAnnotation { |
||||
|
||||
/** |
||||
* 操作模块 |
||||
* @return |
||||
*/ |
||||
String title() default "操作模块"; |
||||
|
||||
/** |
||||
* 系统类型(网页端,app端) |
||||
*/ |
||||
OperatorType operatorType() default OperatorType.OTHER; |
||||
|
||||
|
||||
/** |
||||
* 操作类型 |
||||
* @return |
||||
*/ |
||||
BusinessType businessType() default BusinessType.OTHER; |
||||
|
||||
|
||||
/** |
||||
* 是否保存响应的参数 |
||||
*/ |
||||
public boolean isSaveResponseData() default true; |
||||
|
||||
/** |
||||
* 功能说明 |
||||
* @return |
||||
*/ |
||||
String action() default "功能说明"; |
||||
} |
@ -0,0 +1,259 @@
|
||||
package com.hnac.hzims.common.logs.aop; |
||||
|
||||
import com.alibaba.fastjson.JSON; |
||||
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; |
||||
import com.hnac.hzims.common.logs.annotation.OperationAnnotation; |
||||
import com.hnac.hzims.common.logs.consumer.SysLogQueue; |
||||
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||
import com.hnac.hzims.common.logs.enums.BusinessStatus; |
||||
import com.hnac.hzims.common.logs.utils.StringUtils; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.aspectj.lang.JoinPoint; |
||||
import org.aspectj.lang.annotation.*; |
||||
import org.aspectj.lang.reflect.CodeSignature; |
||||
import org.springblade.core.launch.props.BladeProperties; |
||||
import org.springblade.core.launch.server.ServerInfo; |
||||
import org.springblade.core.secure.utils.AuthUtil; |
||||
import org.springblade.core.tool.constant.BladeConstant; |
||||
import org.springblade.core.tool.utils.Func; |
||||
import org.springblade.core.tool.utils.WebUtil; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Component; |
||||
import org.springframework.util.StopWatch; |
||||
import org.springframework.web.context.request.RequestAttributes; |
||||
import org.springframework.web.context.request.RequestContextHolder; |
||||
import org.springframework.web.context.request.ServletRequestAttributes; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import java.lang.reflect.Method; |
||||
import java.time.LocalDateTime; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author dfy |
||||
* @date 2023/3/29 |
||||
* @description: 操作日志切面处理类 |
||||
*/ |
||||
@Aspect |
||||
@Component |
||||
@Slf4j |
||||
public class SysLogAspect { |
||||
|
||||
|
||||
@Autowired |
||||
private ServerInfo serverInfo; |
||||
|
||||
|
||||
@Autowired |
||||
private BladeProperties bladeProperties; |
||||
|
||||
|
||||
@Autowired |
||||
private SysLogQueue sysLogQueue; |
||||
|
||||
/** |
||||
* 请求地址 |
||||
*/ |
||||
private String requestPath = null; |
||||
|
||||
/** |
||||
* 操作人 |
||||
*/ |
||||
private String userName = null; |
||||
|
||||
/** |
||||
* 请求 |
||||
*/ |
||||
private HttpServletRequest request = null; |
||||
|
||||
|
||||
private Long userId = -1L; |
||||
|
||||
|
||||
private StopWatch stopWatch = new StopWatch(); |
||||
|
||||
|
||||
/** |
||||
* 设置操作日志切入点 在注解的位置切入代码 |
||||
*/ |
||||
@Pointcut("@annotation(com.hnac.hzims.common.logs.annotation.OperationAnnotation)") |
||||
public void logPointCut() { |
||||
} |
||||
|
||||
/** |
||||
* @param joinPoint |
||||
* @Description 前置通知 方法调用前触发 记录开始时间,从session中获取操作人 |
||||
*/ |
||||
@Before(value = "logPointCut()") |
||||
public void before(JoinPoint joinPoint) { |
||||
stopWatch.start(); |
||||
log.info("前置通知"); |
||||
} |
||||
|
||||
/** |
||||
* @param joinPoint |
||||
* @Description 后置通知 方法调用后触发 记录结束时间 ,操作人 ,入参等 |
||||
*/ |
||||
@AfterReturning(value = "logPointCut()", returning = "jsonResult") |
||||
public void after(JoinPoint joinPoint, Object jsonResult) { |
||||
log.info("=========返回通知=============="); |
||||
request = getHttpServletRequest(); |
||||
handleLog(joinPoint, jsonResult, null); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @param joinPoint |
||||
* @return |
||||
* @Description 获取入参方法参数 |
||||
*/ |
||||
public Map<String, Object> getNameAndValue(JoinPoint joinPoint) { |
||||
Map<String, Object> param = new HashMap<>(16); |
||||
Object[] paramValues = joinPoint.getArgs(); |
||||
String[] paramNames = ((CodeSignature) joinPoint.getSignature()).getParameterNames(); |
||||
for (int i = 0; i < paramNames.length; i++) { |
||||
if (paramValues[i] instanceof Integer || paramValues[i] instanceof String) { |
||||
param.put(paramNames[i], paramValues[i]); |
||||
} |
||||
} |
||||
return param; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @Description: 获取request |
||||
*/ |
||||
public HttpServletRequest getHttpServletRequest() { |
||||
RequestAttributes ra = RequestContextHolder.getRequestAttributes(); |
||||
ServletRequestAttributes sra = (ServletRequestAttributes) ra; |
||||
HttpServletRequest request = sra.getRequest(); |
||||
return request; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @param joinPoint |
||||
* @Description 异常通知 |
||||
*/ |
||||
@AfterThrowing(pointcut = "logPointCut()", throwing = "e") |
||||
public void throwing(JoinPoint joinPoint, Exception e) { |
||||
log.info("=========异常通知=============="); |
||||
handleLog(joinPoint, null, e); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 转换request 请求参数 |
||||
* |
||||
* @param paramMap request获取的参数数组 |
||||
*/ |
||||
public Map<String, String> converMap(Map<String, String[]> paramMap) { |
||||
Map<String, String> rtnMap = new HashMap<String, String>(); |
||||
for (String key : paramMap.keySet()) { |
||||
rtnMap.put(key, paramMap.get(key)[0]); |
||||
} |
||||
return rtnMap; |
||||
} |
||||
|
||||
/** |
||||
* 转换异常信息为字符串 |
||||
* |
||||
* @param exceptionName 异常名称 |
||||
* @param exceptionMessage 异常信息 |
||||
* @param elements 堆栈信息 |
||||
*/ |
||||
public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) { |
||||
StringBuffer strbuff = new StringBuffer(); |
||||
for (StackTraceElement stet : elements) { |
||||
strbuff.append(stet + "\n"); |
||||
} |
||||
String message = exceptionName + ":" + exceptionMessage + "\n\t" + strbuff.toString(); |
||||
return message; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 处理操作日志结果集 |
||||
* |
||||
* @param joinPoint |
||||
* @param jsonResult |
||||
* @param exception |
||||
*/ |
||||
private void handleLog(JoinPoint joinPoint, Object jsonResult, Exception exception) { |
||||
String targetName = joinPoint.getTarget().getClass().getName(); |
||||
String methodName = joinPoint.getSignature().getName(); |
||||
Object[] arguments = joinPoint.getArgs(); |
||||
Class<?> targetClass = null; |
||||
try { |
||||
targetClass = Class.forName(targetName); |
||||
} catch (ClassNotFoundException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
Method[] methods = targetClass.getMethods(); |
||||
String title; |
||||
String action; |
||||
String businessType; |
||||
String operatorType; |
||||
Class<?>[] clazzs; |
||||
for (Method method : methods) { |
||||
if (method.getName().equals(methodName)) { |
||||
clazzs = method.getParameterTypes(); |
||||
if (clazzs != null && clazzs.length == arguments.length && method.getAnnotation(OperationAnnotation.class) != null) { |
||||
// 获取请求的类名
|
||||
String className = joinPoint.getTarget().getClass().getName(); |
||||
methodName = className + "." + methodName; |
||||
request = getHttpServletRequest(); |
||||
requestPath = request.getServletPath(); |
||||
OperationAnnotation annotation = method.getAnnotation(OperationAnnotation.class); |
||||
title = annotation.title(); |
||||
action = annotation.action(); |
||||
businessType = annotation.businessType().getValue(); |
||||
operatorType = annotation.operatorType().getValue(); |
||||
// 获取当前用户信息
|
||||
userName = AuthUtil.getUserAccount(request); |
||||
userId = AuthUtil.getUserId(request); |
||||
SysLogTo sysLog = new SysLogTo(); |
||||
if (StringUtils.isBlank(userName) && userId == -1) { |
||||
userName = "当前用户未登录"; |
||||
} |
||||
sysLog.setOperationUserName(userName); |
||||
sysLog.setOperationUserId(userId); |
||||
sysLog.setTenantId(Func.toStr(AuthUtil.getTenantId(), BladeConstant.ADMIN_TENANT_ID)); |
||||
sysLog.setLocalIp(WebUtil.getIP(request));// 请求IP
|
||||
stopWatch.stop(); |
||||
sysLog.setCostTime(stopWatch.getTotalTimeMillis() + "ms"); |
||||
sysLog.setPath(requestPath); |
||||
sysLog.setTitle(title); |
||||
sysLog.setAction(action); |
||||
sysLog.setOperatorType(operatorType); |
||||
sysLog.setBusinessType(businessType); |
||||
sysLog.setParameter(getNameAndValue(joinPoint).toString()); |
||||
sysLog.setMethodClass(className); |
||||
sysLog.setMethodName(methodName); |
||||
sysLog.setServerName(bladeProperties.getName()); |
||||
sysLog.setServerHost(serverInfo.getHostName()); |
||||
sysLog.setServerIp(serverInfo.getIpWithPort()); |
||||
sysLog.setEnv(bladeProperties.getEnv()); |
||||
sysLog.setMethod(request.getMethod()); |
||||
sysLog.setUserAgent(request.getHeader(WebUtil.USER_AGENT_HEADER)); |
||||
sysLog.setOperationTime(LocalDateTime.now()); |
||||
|
||||
//返回结果集
|
||||
if (ObjectUtils.isNotEmpty(jsonResult)) { |
||||
sysLog.setStatus(BusinessStatus.SUCCESS.getKey()); |
||||
sysLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); |
||||
} |
||||
|
||||
//异常结果集
|
||||
if (exception != null) { |
||||
sysLog.setStatus(BusinessStatus.FAIL.getKey()); |
||||
sysLog.setErrorMsg(StringUtils.substring(exception.getMessage(), 0, 2000)); |
||||
} |
||||
//保存到阻塞队列里
|
||||
sysLogQueue.add(sysLog); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,118 @@
|
||||
package com.hnac.hzims.common.logs.consumer; |
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
||||
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||
import com.hnac.hzims.common.logs.fegin.SysLogFeignService; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import javax.annotation.PostConstruct; |
||||
import javax.annotation.PreDestroy; |
||||
import javax.annotation.Resource; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 执行异步线程操作 |
||||
* @Author dfy |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/4/3 14:00 |
||||
*/ |
||||
@Slf4j |
||||
@Component |
||||
public class SysLogConsumer implements Runnable { |
||||
|
||||
/** |
||||
* 默认16 |
||||
*/ |
||||
private static final int DEFAULT_BATCH_SIZE = 16; |
||||
|
||||
@Resource |
||||
private SysLogQueue auditLogQueue; |
||||
/** |
||||
* 批次数 |
||||
*/ |
||||
private int batchSize = DEFAULT_BATCH_SIZE; |
||||
|
||||
@Autowired |
||||
private SysLogFeignService sysLogFeignService; |
||||
|
||||
|
||||
/** |
||||
* 默认为true |
||||
*/ |
||||
private boolean active = true; |
||||
|
||||
private Thread thread; |
||||
|
||||
|
||||
/** |
||||
* 启动线程 |
||||
*/ |
||||
@PostConstruct |
||||
public void init() { |
||||
thread = new Thread(this); |
||||
thread.start(); |
||||
} |
||||
|
||||
/** |
||||
* 使用该注解在项目结束的舒缓关闭 |
||||
*/ |
||||
@PreDestroy |
||||
public void close() { |
||||
active = false; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 执行线程操作 |
||||
*/ |
||||
@Override |
||||
public void run() { |
||||
while (active) { |
||||
execute(); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 执行业务处理操作,新增日志记录 |
||||
*/ |
||||
public void execute() { |
||||
List<SysLogTo> sysLogs = new ArrayList<>(); |
||||
try { |
||||
int size = 0; |
||||
while (size < batchSize) { |
||||
//从队列中取出一个
|
||||
SysLogTo sysLog = auditLogQueue.poll(); |
||||
if (sysLog == null) { |
||||
break; |
||||
} |
||||
sysLogs.add(sysLog); |
||||
size++; |
||||
} |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
log.error(e.toString()); |
||||
} |
||||
//如果当前的日志list不为空
|
||||
if (CollectionUtils.isNotEmpty(sysLogs)) { |
||||
log.info("日志操作数据:" + sysLogs); |
||||
// TODO: 2023/4/4 添加到数据库
|
||||
try { |
||||
// TODO: 2023/4/4 后期采取kafka+elk实现,可以提高效率,操作日志数据越来越大,查询效率变大,提高性能
|
||||
sysLogFeignService.saveBatch(sysLogs); |
||||
} catch (Exception e) { |
||||
// TODO: 2023/4/4 出现异常呢,
|
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,43 @@
|
||||
package com.hnac.hzims.common.logs.consumer; |
||||
|
||||
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import java.util.concurrent.BlockingQueue; |
||||
import java.util.concurrent.LinkedBlockingQueue; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
/** |
||||
* 定义队列 |
||||
* @Author dfy |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/4/3 14:01 |
||||
*/ |
||||
@Component |
||||
public class SysLogQueue { |
||||
|
||||
/** |
||||
* BlockingDequeue为双端阻塞队列,blockingQueue阻塞队列 |
||||
*/ |
||||
private BlockingQueue<SysLogTo> blockingQueue = new LinkedBlockingQueue<>(); |
||||
|
||||
/** |
||||
* 存入数据 |
||||
* @param auditLog |
||||
*/ |
||||
public void add(SysLogTo auditLog) { |
||||
blockingQueue.add(auditLog); |
||||
} |
||||
|
||||
/** |
||||
* poll从队列的头部获取到信息 |
||||
* @return |
||||
* @throws InterruptedException |
||||
*/ |
||||
public SysLogTo poll() throws InterruptedException { |
||||
//每秒钟执行一次
|
||||
return blockingQueue.poll(1, TimeUnit.SECONDS); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,33 @@
|
||||
package com.hnac.hzims.common.logs.enums; |
||||
|
||||
import lombok.Getter; |
||||
|
||||
/** |
||||
* 操作状态 |
||||
* |
||||
* @author ruoyi |
||||
* |
||||
*/ |
||||
public enum BusinessStatus |
||||
{ |
||||
/** |
||||
* 成功 |
||||
*/ |
||||
SUCCESS(0,"执行成功"), |
||||
|
||||
/** |
||||
* 异常 |
||||
*/ |
||||
FAIL(1,"执行异常"); |
||||
|
||||
@Getter |
||||
private Integer key; |
||||
|
||||
@Getter |
||||
private String value; |
||||
|
||||
BusinessStatus(Integer key,String value){ |
||||
this.key = key; |
||||
this.value = value; |
||||
} |
||||
} |
@ -0,0 +1,73 @@
|
||||
package com.hnac.hzims.common.logs.enums; |
||||
|
||||
|
||||
import lombok.Getter; |
||||
|
||||
/** |
||||
* 业务操作类型 |
||||
* |
||||
* @author ruoyi |
||||
*/ |
||||
public enum BusinessType |
||||
{ |
||||
/** |
||||
* 其它 |
||||
*/ |
||||
OTHER("OTHER","其他"), |
||||
|
||||
/** |
||||
* 新增 |
||||
*/ |
||||
INSERT("INSERT","新增"), |
||||
|
||||
/** |
||||
* 修改 |
||||
*/ |
||||
UPDATE("UPDATE","修改"), |
||||
|
||||
/** |
||||
* 删除 |
||||
*/ |
||||
DELETE("DELETE","删除"), |
||||
|
||||
/** |
||||
* 授权 |
||||
*/ |
||||
GRANT("GRANT","授权"), |
||||
|
||||
/** |
||||
* 导出 |
||||
*/ |
||||
EXPORT("EXPORT","导出"), |
||||
|
||||
/** |
||||
* 导入 |
||||
*/ |
||||
IMPORT("IMPORT","导入"), |
||||
|
||||
/** |
||||
* 强退 |
||||
*/ |
||||
FORCE("FORCE","强退"), |
||||
|
||||
/** |
||||
* 查询 |
||||
*/ |
||||
GENCODE("GENCODE","查询"), |
||||
|
||||
/** |
||||
* 清空数据 |
||||
*/ |
||||
CLEAN("CLEAN","清空数据"); |
||||
|
||||
@Getter |
||||
private String key; |
||||
|
||||
@Getter |
||||
private String value; |
||||
|
||||
BusinessType(String key,String value){ |
||||
this.key = key; |
||||
this.value = value; |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.hnac.hzims.common.logs.enums; |
||||
|
||||
import lombok.Getter; |
||||
|
||||
/** |
||||
* 操作人类别 |
||||
* |
||||
* @author ruoyi |
||||
*/ |
||||
public enum OperatorType |
||||
{ |
||||
/** |
||||
* 其它 |
||||
*/ |
||||
OTHER("OTHER","其它"), |
||||
|
||||
/** |
||||
* 后台用户 |
||||
*/ |
||||
MANAGE("MANAGE","后台用户"), |
||||
|
||||
/** |
||||
* web 端 |
||||
*/ |
||||
MOBILE("MOBILE","web端"), |
||||
/** |
||||
* app 端 |
||||
*/ |
||||
APPSYSTEMS("APPSYSTEMS","app端"); |
||||
|
||||
|
||||
@Getter |
||||
private String key; |
||||
|
||||
@Getter |
||||
private String value; |
||||
|
||||
|
||||
OperatorType(String key,String value){ |
||||
this.key = key; |
||||
this.value = value; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.hnac.hzims.common.logs.fegin; |
||||
|
||||
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||
import com.hnac.hzims.common.logs.fegin.fallback.SysLogFeignServiceFallback; |
||||
import org.springframework.cloud.openfeign.FeignClient; |
||||
import org.springframework.stereotype.Repository; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestBody; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/4/3 13:46 |
||||
*/ |
||||
@Repository |
||||
@FeignClient(value = "hzims-middle",fallback = SysLogFeignServiceFallback.class) |
||||
public interface SysLogFeignService { |
||||
|
||||
/** |
||||
* 报存日志操作 |
||||
* |
||||
* @param sysLogs |
||||
*/ |
||||
@PostMapping("/systemlog/sys-log/batchSave") |
||||
void saveBatch(@RequestBody List<SysLogTo> sysLogs); |
||||
} |
@ -0,0 +1,30 @@
|
||||
package com.hnac.hzims.common.logs.fegin.fallback; |
||||
|
||||
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||
import com.hnac.hzims.common.logs.fegin.SysLogFeignService; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/4/4 9:45 |
||||
*/ |
||||
@Slf4j |
||||
@Service |
||||
public class SysLogFeignServiceFallback implements SysLogFeignService { |
||||
/** |
||||
* 报存日志操作 |
||||
* |
||||
* @param sysLogs |
||||
*/ |
||||
@Override |
||||
public void saveBatch(List<SysLogTo> sysLogs) { |
||||
log.error("报存日志操作异常发生,进入fallback方法"); |
||||
log.error("获取异常的数据 {}", sysLogs); |
||||
throw new IllegalArgumentException("报存日志操作异常发生,进入fallback方法"); |
||||
} |
||||
} |
@ -0,0 +1,88 @@
|
||||
package com.hnac.hzims.common.logs.text; |
||||
|
||||
|
||||
import com.hnac.hzims.common.logs.utils.StringUtils; |
||||
|
||||
import java.nio.charset.Charset; |
||||
import java.nio.charset.StandardCharsets; |
||||
|
||||
/** |
||||
* 字符集工具类 |
||||
* |
||||
* @author dfy |
||||
*/ |
||||
public class CharsetKit |
||||
{ |
||||
/** ISO-8859-1 */ |
||||
public static final String ISO_8859_1 = "ISO-8859-1"; |
||||
/** UTF-8 */ |
||||
public static final String UTF_8 = "UTF-8"; |
||||
/** GBK */ |
||||
public static final String GBK = "GBK"; |
||||
|
||||
/** ISO-8859-1 */ |
||||
public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); |
||||
/** UTF-8 */ |
||||
public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); |
||||
/** GBK */ |
||||
public static final Charset CHARSET_GBK = Charset.forName(GBK); |
||||
|
||||
/** |
||||
* 转换为Charset对象 |
||||
* |
||||
* @param charset 字符集,为空则返回默认字符集 |
||||
* @return Charset |
||||
*/ |
||||
public static Charset charset(String charset) |
||||
{ |
||||
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); |
||||
} |
||||
|
||||
/** |
||||
* 转换字符串的字符集编码 |
||||
* |
||||
* @param source 字符串 |
||||
* @param srcCharset 源字符集,默认ISO-8859-1 |
||||
* @param destCharset 目标字符集,默认UTF-8 |
||||
* @return 转换后的字符集 |
||||
*/ |
||||
public static String convert(String source, String srcCharset, String destCharset) |
||||
{ |
||||
return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); |
||||
} |
||||
|
||||
/** |
||||
* 转换字符串的字符集编码 |
||||
* |
||||
* @param source 字符串 |
||||
* @param srcCharset 源字符集,默认ISO-8859-1 |
||||
* @param destCharset 目标字符集,默认UTF-8 |
||||
* @return 转换后的字符集 |
||||
*/ |
||||
public static String convert(String source, Charset srcCharset, Charset destCharset) |
||||
{ |
||||
if (null == srcCharset) |
||||
{ |
||||
srcCharset = StandardCharsets.ISO_8859_1; |
||||
} |
||||
|
||||
if (null == destCharset) |
||||
{ |
||||
destCharset = StandardCharsets.UTF_8; |
||||
} |
||||
|
||||
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) |
||||
{ |
||||
return source; |
||||
} |
||||
return new String(source.getBytes(srcCharset), destCharset); |
||||
} |
||||
|
||||
/** |
||||
* @return 系统字符集编码 |
||||
*/ |
||||
public static String systemCharset() |
||||
{ |
||||
return Charset.defaultCharset().name(); |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,93 @@
|
||||
package com.hnac.hzims.common.logs.text; |
||||
|
||||
|
||||
import com.hnac.hzims.common.logs.utils.StringUtils; |
||||
|
||||
/** |
||||
* 字符串格式化 |
||||
* |
||||
* @author ruoyi |
||||
*/ |
||||
public class StrFormatter |
||||
{ |
||||
public static final String EMPTY_JSON = "{}"; |
||||
public static final char C_BACKSLASH = '\\'; |
||||
public static final char C_DELIM_START = '{'; |
||||
public static final char C_DELIM_END = '}'; |
||||
|
||||
/** |
||||
* 格式化字符串<br> |
||||
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
||||
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
||||
* 例:<br> |
||||
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
||||
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
||||
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
||||
* |
||||
* @param strPattern 字符串模板 |
||||
* @param argArray 参数列表 |
||||
* @return 结果 |
||||
*/ |
||||
public static String format(final String strPattern, final Object... argArray) |
||||
{ |
||||
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) |
||||
{ |
||||
return strPattern; |
||||
} |
||||
final int strPatternLength = strPattern.length(); |
||||
|
||||
// 初始化定义好的长度以获得更好的性能
|
||||
StringBuilder sbuf = new StringBuilder(strPatternLength + 50); |
||||
|
||||
int handledPosition = 0; |
||||
int delimIndex;// 占位符所在位置
|
||||
for (int argIndex = 0; argIndex < argArray.length; argIndex++) |
||||
{ |
||||
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); |
||||
if (delimIndex == -1) |
||||
{ |
||||
if (handledPosition == 0) |
||||
{ |
||||
return strPattern; |
||||
} |
||||
else |
||||
{ // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
|
||||
sbuf.append(strPattern, handledPosition, strPatternLength); |
||||
return sbuf.toString(); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) |
||||
{ |
||||
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) |
||||
{ |
||||
// 转义符之前还有一个转义符,占位符依旧有效
|
||||
sbuf.append(strPattern, handledPosition, delimIndex - 1); |
||||
sbuf.append(Convert.utf8Str(argArray[argIndex])); |
||||
handledPosition = delimIndex + 2; |
||||
} |
||||
else |
||||
{ |
||||
// 占位符被转义
|
||||
argIndex--; |
||||
sbuf.append(strPattern, handledPosition, delimIndex - 1); |
||||
sbuf.append(C_DELIM_START); |
||||
handledPosition = delimIndex + 1; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
// 正常占位符
|
||||
sbuf.append(strPattern, handledPosition, delimIndex); |
||||
sbuf.append(Convert.utf8Str(argArray[argIndex])); |
||||
handledPosition = delimIndex + 2; |
||||
} |
||||
} |
||||
} |
||||
// 加入最后一个占位符后所有的字符
|
||||
sbuf.append(strPattern, handledPosition, strPattern.length()); |
||||
|
||||
return sbuf.toString(); |
||||
} |
||||
} |
@ -0,0 +1,145 @@
|
||||
package com.hnac.hzims.common.logs.to; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.time.LocalDateTime; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/3/29 13:24 |
||||
*/ |
||||
@Data |
||||
public class SysLogTo { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
|
||||
private Long id; |
||||
|
||||
/** |
||||
* 租户ID |
||||
*/ |
||||
private String tenantId; |
||||
|
||||
/** |
||||
* 服务器ip |
||||
*/ |
||||
protected String serverIp; |
||||
|
||||
|
||||
/** |
||||
* 服务器地址 |
||||
*/ |
||||
protected String serverHost; |
||||
|
||||
/** |
||||
* 服务名称 |
||||
*/ |
||||
protected String serverName; |
||||
|
||||
|
||||
/** |
||||
* 环境 |
||||
*/ |
||||
protected String env; |
||||
|
||||
|
||||
/** |
||||
* 操作人 id |
||||
*/ |
||||
private Long operationUserId; |
||||
|
||||
|
||||
/** |
||||
* 操作人 |
||||
*/ |
||||
private String operationUserName; |
||||
|
||||
/** |
||||
* 请求路径 (操作地址) |
||||
*/ |
||||
private String path; |
||||
|
||||
|
||||
/** |
||||
* 用户代理 |
||||
*/ |
||||
protected String userAgent; |
||||
|
||||
|
||||
/** |
||||
* 操作方式 |
||||
*/ |
||||
protected String method; |
||||
|
||||
/** |
||||
* 方法类 |
||||
*/ |
||||
protected String methodClass; |
||||
|
||||
/** |
||||
* 方法名 |
||||
*/ |
||||
protected String methodName; |
||||
|
||||
/** |
||||
* 方法执行时间 消耗时间 毫秒 |
||||
*/ |
||||
private String costTime; |
||||
|
||||
/** |
||||
* 方法入参 |
||||
*/ |
||||
private String parameter; |
||||
|
||||
/** |
||||
* 操作方法 |
||||
*/ |
||||
private String title; |
||||
|
||||
/** |
||||
* 方法描述 |
||||
*/ |
||||
private String action; |
||||
|
||||
/** |
||||
* 系统类型 |
||||
*/ |
||||
private String operatorType; |
||||
|
||||
/** |
||||
* 操作人类别 |
||||
*/ |
||||
private String businessType; |
||||
|
||||
|
||||
/** |
||||
* 返回结果 |
||||
* |
||||
* @param jsonResult |
||||
*/ |
||||
public String jsonResult; |
||||
|
||||
/** |
||||
* 请求的Ip |
||||
*/ |
||||
private String localIp; |
||||
|
||||
/** |
||||
* 错误消息 |
||||
*/ |
||||
private String errorMsg; |
||||
/** |
||||
* 操作时间 |
||||
*/ |
||||
private LocalDateTime operationTime; |
||||
|
||||
|
||||
/** |
||||
* 操作状态(0 正常 1 异常) |
||||
*/ |
||||
private Integer status; |
||||
|
||||
} |
@ -0,0 +1,130 @@
|
||||
package com.hnac.hzims.common.logs.utils; |
||||
|
||||
/** |
||||
* 通用常量信息 |
||||
* |
||||
* @author ruoyi |
||||
*/ |
||||
public class Constants |
||||
{ |
||||
/** |
||||
* UTF-8 字符集 |
||||
*/ |
||||
public static final String UTF8 = "UTF-8"; |
||||
|
||||
/** |
||||
* GBK 字符集 |
||||
*/ |
||||
public static final String GBK = "GBK"; |
||||
|
||||
/** |
||||
* www主域 |
||||
*/ |
||||
public static final String WWW = "www."; |
||||
|
||||
/** |
||||
* RMI 远程方法调用 |
||||
*/ |
||||
public static final String LOOKUP_RMI = "rmi:"; |
||||
|
||||
/** |
||||
* LDAP 远程方法调用 |
||||
*/ |
||||
public static final String LOOKUP_LDAP = "ldap:"; |
||||
|
||||
/** |
||||
* LDAPS 远程方法调用 |
||||
*/ |
||||
public static final String LOOKUP_LDAPS = "ldaps:"; |
||||
|
||||
/** |
||||
* http请求 |
||||
*/ |
||||
public static final String HTTP = "http://"; |
||||
|
||||
/** |
||||
* https请求 |
||||
*/ |
||||
public static final String HTTPS = "https://"; |
||||
|
||||
/** |
||||
* 成功标记 |
||||
*/ |
||||
public static final Integer SUCCESS = 200; |
||||
|
||||
/** |
||||
* 失败标记 |
||||
*/ |
||||
public static final Integer FAIL = 500; |
||||
|
||||
/** |
||||
* 登录成功状态 |
||||
*/ |
||||
public static final String LOGIN_SUCCESS_STATUS = "0"; |
||||
|
||||
/** |
||||
* 登录失败状态 |
||||
*/ |
||||
public static final String LOGIN_FAIL_STATUS = "1"; |
||||
|
||||
/** |
||||
* 登录成功 |
||||
*/ |
||||
public static final String LOGIN_SUCCESS = "Success"; |
||||
|
||||
/** |
||||
* 注销 |
||||
*/ |
||||
public static final String LOGOUT = "Logout"; |
||||
|
||||
/** |
||||
* 注册 |
||||
*/ |
||||
public static final String REGISTER = "Register"; |
||||
|
||||
/** |
||||
* 登录失败 |
||||
*/ |
||||
public static final String LOGIN_FAIL = "Error"; |
||||
|
||||
/** |
||||
* 当前记录起始索引 |
||||
*/ |
||||
public static final String PAGE_NUM = "pageNum"; |
||||
|
||||
/** |
||||
* 每页显示记录数 |
||||
*/ |
||||
public static final String PAGE_SIZE = "pageSize"; |
||||
|
||||
/** |
||||
* 排序列 |
||||
*/ |
||||
public static final String ORDER_BY_COLUMN = "orderByColumn"; |
||||
|
||||
/** |
||||
* 排序的方向 "desc" 或者 "asc". |
||||
*/ |
||||
public static final String IS_ASC = "isAsc"; |
||||
|
||||
/** |
||||
* 验证码有效期(分钟) |
||||
*/ |
||||
public static final long CAPTCHA_EXPIRATION = 2; |
||||
|
||||
/** |
||||
* 资源映射路径 前缀 |
||||
*/ |
||||
public static final String RESOURCE_PREFIX = "/profile"; |
||||
|
||||
/** |
||||
* 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) |
||||
*/ |
||||
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; |
||||
|
||||
/** |
||||
* 定时任务违规的字符 |
||||
*/ |
||||
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", |
||||
"org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" }; |
||||
} |
@ -0,0 +1,567 @@
|
||||
package com.hnac.hzims.common.logs.utils; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/3/31 15:43 |
||||
*/ |
||||
|
||||
import java.util.Collection; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import com.hnac.hzims.common.logs.text.StrFormatter; |
||||
import org.springframework.util.AntPathMatcher; |
||||
|
||||
/** |
||||
* 字符串工具类 |
||||
* |
||||
* @author ruoyi |
||||
*/ |
||||
public class StringUtils extends org.apache.commons.lang3.StringUtils |
||||
{ |
||||
/** 空字符串 */ |
||||
private static final String NULLSTR = ""; |
||||
|
||||
/** 下划线 */ |
||||
private static final char SEPARATOR = '_'; |
||||
|
||||
/** |
||||
* 获取参数不为空值 |
||||
* |
||||
* @param value defaultValue 要判断的value |
||||
* @return value 返回值 |
||||
*/ |
||||
public static <T> T nvl(T value, T defaultValue) |
||||
{ |
||||
return value != null ? value : defaultValue; |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个Collection是否为空, 包含List,Set,Queue |
||||
* |
||||
* @param coll 要判断的Collection |
||||
* @return true:为空 false:非空 |
||||
*/ |
||||
public static boolean isEmpty(Collection<?> coll) |
||||
{ |
||||
return isNull(coll) || coll.isEmpty(); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个Collection是否非空,包含List,Set,Queue |
||||
* |
||||
* @param coll 要判断的Collection |
||||
* @return true:非空 false:空 |
||||
*/ |
||||
public static boolean isNotEmpty(Collection<?> coll) |
||||
{ |
||||
return !isEmpty(coll); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个对象数组是否为空 |
||||
* |
||||
* @param objects 要判断的对象数组 |
||||
** @return true:为空 false:非空 |
||||
*/ |
||||
public static boolean isEmpty(Object[] objects) |
||||
{ |
||||
return isNull(objects) || (objects.length == 0); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个对象数组是否非空 |
||||
* |
||||
* @param objects 要判断的对象数组 |
||||
* @return true:非空 false:空 |
||||
*/ |
||||
public static boolean isNotEmpty(Object[] objects) |
||||
{ |
||||
return !isEmpty(objects); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个Map是否为空 |
||||
* |
||||
* @param map 要判断的Map |
||||
* @return true:为空 false:非空 |
||||
*/ |
||||
public static boolean isEmpty(Map<?, ?> map) |
||||
{ |
||||
return isNull(map) || map.isEmpty(); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个Map是否为空 |
||||
* |
||||
* @param map 要判断的Map |
||||
* @return true:非空 false:空 |
||||
*/ |
||||
public static boolean isNotEmpty(Map<?, ?> map) |
||||
{ |
||||
return !isEmpty(map); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个字符串是否为空串 |
||||
* |
||||
* @param str String |
||||
* @return true:为空 false:非空 |
||||
*/ |
||||
public static boolean isEmpty(String str) |
||||
{ |
||||
return isNull(str) || NULLSTR.equals(str.trim()); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个字符串是否为非空串 |
||||
* |
||||
* @param str String |
||||
* @return true:非空串 false:空串 |
||||
*/ |
||||
public static boolean isNotEmpty(String str) |
||||
{ |
||||
return !isEmpty(str); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个对象是否为空 |
||||
* |
||||
* @param object Object |
||||
* @return true:为空 false:非空 |
||||
*/ |
||||
public static boolean isNull(Object object) |
||||
{ |
||||
return object == null; |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个对象是否非空 |
||||
* |
||||
* @param object Object |
||||
* @return true:非空 false:空 |
||||
*/ |
||||
public static boolean isNotNull(Object object) |
||||
{ |
||||
return !isNull(object); |
||||
} |
||||
|
||||
/** |
||||
* * 判断一个对象是否是数组类型(Java基本型别的数组) |
||||
* |
||||
* @param object 对象 |
||||
* @return true:是数组 false:不是数组 |
||||
*/ |
||||
public static boolean isArray(Object object) |
||||
{ |
||||
return isNotNull(object) && object.getClass().isArray(); |
||||
} |
||||
|
||||
/** |
||||
* 去空格 |
||||
*/ |
||||
public static String trim(String str) |
||||
{ |
||||
return (str == null ? "" : str.trim()); |
||||
} |
||||
|
||||
/** |
||||
* 截取字符串 |
||||
* |
||||
* @param str 字符串 |
||||
* @param start 开始 |
||||
* @return 结果 |
||||
*/ |
||||
public static String substring(final String str, int start) |
||||
{ |
||||
if (str == null) |
||||
{ |
||||
return NULLSTR; |
||||
} |
||||
|
||||
if (start < 0) |
||||
{ |
||||
start = str.length() + start; |
||||
} |
||||
|
||||
if (start < 0) |
||||
{ |
||||
start = 0; |
||||
} |
||||
if (start > str.length()) |
||||
{ |
||||
return NULLSTR; |
||||
} |
||||
|
||||
return str.substring(start); |
||||
} |
||||
|
||||
/** |
||||
* 截取字符串 |
||||
* |
||||
* @param str 字符串 |
||||
* @param start 开始 |
||||
* @param end 结束 |
||||
* @return 结果 |
||||
*/ |
||||
public static String substring(final String str, int start, int end) |
||||
{ |
||||
if (str == null) |
||||
{ |
||||
return NULLSTR; |
||||
} |
||||
|
||||
if (end < 0) |
||||
{ |
||||
end = str.length() + end; |
||||
} |
||||
if (start < 0) |
||||
{ |
||||
start = str.length() + start; |
||||
} |
||||
|
||||
if (end > str.length()) |
||||
{ |
||||
end = str.length(); |
||||
} |
||||
|
||||
if (start > end) |
||||
{ |
||||
return NULLSTR; |
||||
} |
||||
|
||||
if (start < 0) |
||||
{ |
||||
start = 0; |
||||
} |
||||
if (end < 0) |
||||
{ |
||||
end = 0; |
||||
} |
||||
|
||||
return str.substring(start, end); |
||||
} |
||||
|
||||
/** |
||||
* 判断是否为空,并且不是空白字符 |
||||
* |
||||
* @param str 要判断的value |
||||
* @return 结果 |
||||
*/ |
||||
public static boolean hasText(String str) |
||||
{ |
||||
return (str != null && !str.isEmpty() && containsText(str)); |
||||
} |
||||
|
||||
private static boolean containsText(CharSequence str) |
||||
{ |
||||
int strLen = str.length(); |
||||
for (int i = 0; i < strLen; i++) |
||||
{ |
||||
if (!Character.isWhitespace(str.charAt(i))) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 格式化文本, {} 表示占位符<br> |
||||
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
||||
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
||||
* 例:<br> |
||||
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
||||
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
||||
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
||||
* |
||||
* @param template 文本模板,被替换的部分用 {} 表示 |
||||
* @param params 参数值 |
||||
* @return 格式化后的文本 |
||||
*/ |
||||
public static String format(String template, Object... params) |
||||
{ |
||||
if (isEmpty(params) || isEmpty(template)) |
||||
{ |
||||
return template; |
||||
} |
||||
return StrFormatter.format(template, params); |
||||
} |
||||
|
||||
/** |
||||
* 是否为http(s)://开头
|
||||
* |
||||
* @param link 链接 |
||||
* @return 结果 |
||||
*/ |
||||
public static boolean ishttp(String link) |
||||
{ |
||||
return startsWithAny(link, Constants.HTTP, Constants.HTTPS); |
||||
} |
||||
|
||||
/** |
||||
* 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value |
||||
* |
||||
* @param array 给定的数组 |
||||
* @return boolean 结果 |
||||
*/ |
||||
public static boolean containsAny(Collection<String> collection, String... array) |
||||
{ |
||||
if (isEmpty(collection) || isEmpty(array)) |
||||
{ |
||||
return false; |
||||
} |
||||
else |
||||
{ |
||||
for (String str : array) |
||||
{ |
||||
if (collection.contains(str)) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 驼峰转下划线命名 |
||||
*/ |
||||
public static String toUnderScoreCase(String str) |
||||
{ |
||||
if (str == null) |
||||
{ |
||||
return null; |
||||
} |
||||
StringBuilder sb = new StringBuilder(); |
||||
// 前置字符是否大写
|
||||
boolean preCharIsUpperCase = true; |
||||
// 当前字符是否大写
|
||||
boolean curreCharIsUpperCase = true; |
||||
// 下一字符是否大写
|
||||
boolean nexteCharIsUpperCase = true; |
||||
for (int i = 0; i < str.length(); i++) |
||||
{ |
||||
char c = str.charAt(i); |
||||
if (i > 0) |
||||
{ |
||||
preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); |
||||
} |
||||
else |
||||
{ |
||||
preCharIsUpperCase = false; |
||||
} |
||||
|
||||
curreCharIsUpperCase = Character.isUpperCase(c); |
||||
|
||||
if (i < (str.length() - 1)) |
||||
{ |
||||
nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); |
||||
} |
||||
|
||||
if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) |
||||
{ |
||||
sb.append(SEPARATOR); |
||||
} |
||||
else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) |
||||
{ |
||||
sb.append(SEPARATOR); |
||||
} |
||||
sb.append(Character.toLowerCase(c)); |
||||
} |
||||
|
||||
return sb.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 是否包含字符串 |
||||
* |
||||
* @param str 验证字符串 |
||||
* @param strs 字符串组 |
||||
* @return 包含返回true |
||||
*/ |
||||
public static boolean inStringIgnoreCase(String str, String... strs) |
||||
{ |
||||
if (str != null && strs != null) |
||||
{ |
||||
for (String s : strs) |
||||
{ |
||||
if (str.equalsIgnoreCase(trim(s))) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld |
||||
* |
||||
* @param name 转换前的下划线大写方式命名的字符串 |
||||
* @return 转换后的驼峰式命名的字符串 |
||||
*/ |
||||
public static String convertToCamelCase(String name) |
||||
{ |
||||
StringBuilder result = new StringBuilder(); |
||||
// 快速检查
|
||||
if (name == null || name.isEmpty()) |
||||
{ |
||||
// 没必要转换
|
||||
return ""; |
||||
} |
||||
else if (!name.contains("_")) |
||||
{ |
||||
// 不含下划线,仅将首字母大写
|
||||
return name.substring(0, 1).toUpperCase() + name.substring(1); |
||||
} |
||||
// 用下划线将原始字符串分割
|
||||
String[] camels = name.split("_"); |
||||
for (String camel : camels) |
||||
{ |
||||
// 跳过原始字符串中开头、结尾的下换线或双重下划线
|
||||
if (camel.isEmpty()) |
||||
{ |
||||
continue; |
||||
} |
||||
// 首字母大写
|
||||
result.append(camel.substring(0, 1).toUpperCase()); |
||||
result.append(camel.substring(1).toLowerCase()); |
||||
} |
||||
return result.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 驼峰式命名法 |
||||
* 例如:user_name->userName |
||||
*/ |
||||
public static String toCamelCase(String s) |
||||
{ |
||||
if (s == null) |
||||
{ |
||||
return null; |
||||
} |
||||
if (s.indexOf(SEPARATOR) == -1) |
||||
{ |
||||
return s; |
||||
} |
||||
s = s.toLowerCase(); |
||||
StringBuilder sb = new StringBuilder(s.length()); |
||||
boolean upperCase = false; |
||||
for (int i = 0; i < s.length(); i++) |
||||
{ |
||||
char c = s.charAt(i); |
||||
|
||||
if (c == SEPARATOR) |
||||
{ |
||||
upperCase = true; |
||||
} |
||||
else if (upperCase) |
||||
{ |
||||
sb.append(Character.toUpperCase(c)); |
||||
upperCase = false; |
||||
} |
||||
else |
||||
{ |
||||
sb.append(c); |
||||
} |
||||
} |
||||
return sb.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 |
||||
* |
||||
* @param str 指定字符串 |
||||
* @param strs 需要检查的字符串数组 |
||||
* @return 是否匹配 |
||||
*/ |
||||
public static boolean matches(String str, List<String> strs) |
||||
{ |
||||
if (isEmpty(str) || isEmpty(strs)) |
||||
{ |
||||
return false; |
||||
} |
||||
for (String pattern : strs) |
||||
{ |
||||
if (isMatch(pattern, str)) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 判断url是否与规则配置: |
||||
* ? 表示单个字符; |
||||
* * 表示一层路径内的任意字符串,不可跨层级; |
||||
* ** 表示任意层路径; |
||||
* |
||||
* @param pattern 匹配规则 |
||||
* @param url 需要匹配的url |
||||
* @return |
||||
*/ |
||||
public static boolean isMatch(String pattern, String url) |
||||
{ |
||||
AntPathMatcher matcher = new AntPathMatcher(); |
||||
return matcher.match(pattern, url); |
||||
} |
||||
|
||||
@SuppressWarnings("unchecked") |
||||
public static <T> T cast(Object obj) |
||||
{ |
||||
return (T) obj; |
||||
} |
||||
|
||||
/** |
||||
* 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 |
||||
* |
||||
* @param num 数字对象 |
||||
* @param size 字符串指定长度 |
||||
* @return 返回数字的字符串格式,该字符串为指定长度。 |
||||
*/ |
||||
public static final String padl(final Number num, final int size) |
||||
{ |
||||
return padl(num.toString(), size, '0'); |
||||
} |
||||
|
||||
/** |
||||
* 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 |
||||
* |
||||
* @param s 原始字符串 |
||||
* @param size 字符串指定长度 |
||||
* @param c 用于补齐的字符 |
||||
* @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 |
||||
*/ |
||||
public static final String padl(final String s, final int size, final char c) |
||||
{ |
||||
final StringBuilder sb = new StringBuilder(size); |
||||
if (s != null) |
||||
{ |
||||
final int len = s.length(); |
||||
if (s.length() <= size) |
||||
{ |
||||
for (int i = size - len; i > 0; i--) |
||||
{ |
||||
sb.append(c); |
||||
} |
||||
sb.append(s); |
||||
} |
||||
else |
||||
{ |
||||
return s.substring(len - size, len); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
for (int i = size; i > 0; i--) |
||||
{ |
||||
sb.append(c); |
||||
} |
||||
} |
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.hnac.hzims.common.utils; |
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/3/29 11:45 |
||||
*/ |
||||
public class IPUtils { |
||||
|
||||
/** |
||||
* 获取客户端ip地址 |
||||
* @param request |
||||
* @return |
||||
*/ |
||||
public static String getIpAddress(HttpServletRequest request) { |
||||
|
||||
String sourceIp = null; |
||||
|
||||
String ipAddresses = request.getHeader("x-forwarded-for"); |
||||
|
||||
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||
ipAddresses = request.getHeader("Proxy-Client-IP"); |
||||
} |
||||
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||
ipAddresses = request.getHeader("WL-Proxy-Client-IP"); |
||||
} |
||||
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||
ipAddresses = request.getHeader("HTTP_CLIENT_IP"); |
||||
} |
||||
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||
ipAddresses = request.getHeader("HTTP_X_FORWARDED_FOR"); |
||||
} |
||||
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { |
||||
ipAddresses = request.getRemoteAddr(); |
||||
} |
||||
if (StringUtils.isEmpty(ipAddresses)) { |
||||
sourceIp = ipAddresses.split(",")[0]; |
||||
} |
||||
|
||||
return sourceIp; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,85 @@
|
||||
package com.hnac.hzims.operational.duty.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.SqlCondition; |
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import org.springblade.core.mp.support.QueryField; |
||||
import org.springblade.core.tenant.mp.TenantEntity; |
||||
import org.springblade.core.tool.utils.DateUtil; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
||||
import java.util.Date; |
||||
|
||||
|
||||
/** |
||||
* 实体类 |
||||
* |
||||
* @author ty |
||||
*/ |
||||
@Data |
||||
@TableName("hz_ims_duty_emergency") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
@ApiModel(value = "ImsDutyEmergency对象", description = "突发事件登记") |
||||
public class ImsDutyEmergencyEntity extends TenantEntity { |
||||
|
||||
private static final long serialVersionUID = 4259568798118459986L; |
||||
/** |
||||
* 值班日期 |
||||
*/ |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@ApiModelProperty(value = "值班日期") |
||||
private Date dutyTime; |
||||
|
||||
/** |
||||
* 班次 |
||||
*/ |
||||
@ApiModelProperty(value = "班次") |
||||
private Long dutyClass; |
||||
/** |
||||
* 登记人 |
||||
*/ |
||||
@ApiModelProperty(value = "登记人") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Long registrant; |
||||
/** |
||||
* 值班长 |
||||
*/ |
||||
@ApiModelProperty(value = "值班长") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Long chargePerson; |
||||
/** |
||||
* 登记时间 |
||||
*/ |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@ApiModelProperty(value = "登记时间") |
||||
private Date registerTime; |
||||
/** |
||||
* 事件主题 |
||||
*/ |
||||
@QueryField(condition = SqlCondition.LIKE) |
||||
@ApiModelProperty(value = "事件主题") |
||||
private String eventTitle; |
||||
/** |
||||
* 事件内容 |
||||
*/ |
||||
@QueryField(condition = SqlCondition.LIKE) |
||||
@ApiModelProperty(value = "事件内容") |
||||
private String eventInfo; |
||||
|
||||
/** |
||||
* 事件方式 |
||||
*/ |
||||
@QueryField(condition = SqlCondition.LIKE) |
||||
@ApiModelProperty(value = "事件方式") |
||||
private String eventType; |
||||
|
||||
|
||||
} |
@ -0,0 +1,82 @@
|
||||
package com.hnac.hzims.operational.duty.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField; |
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import org.springblade.core.tenant.mp.TenantEntity; |
||||
import org.springblade.core.tool.utils.DateUtil; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
||||
import java.util.Date; |
||||
|
||||
|
||||
/** |
||||
* 实体类 |
||||
* |
||||
* @author TY |
||||
*/ |
||||
@Data |
||||
@TableName("hz_ims_duty_main_person") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
@ApiModel(value = "ImsDutyMainPerson对象", description = "值班-人员信息") |
||||
public class ImsDutyMainPersonEntity extends TenantEntity { |
||||
|
||||
private static final long serialVersionUID = -1913292438493450113L; |
||||
|
||||
/** |
||||
* 值班组id |
||||
*/ |
||||
@ApiModelProperty(value = "值班组id") |
||||
private Long dutyGroupId; |
||||
|
||||
/** |
||||
* 值班人ID |
||||
*/ |
||||
@ApiModelProperty(value = "值班人ID") |
||||
private Long dutyPerson; |
||||
/** |
||||
* 值班负责人ID |
||||
*/ |
||||
@ApiModelProperty(value = "值班负责人ID") |
||||
private Long dutyChargePerson; |
||||
/** |
||||
* 值班日期 |
||||
*/ |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATE) |
||||
@ApiModelProperty(value = "值班日期") |
||||
private Date dutyDate; |
||||
|
||||
/** |
||||
* 班次ID |
||||
*/ |
||||
@ApiModelProperty(value = "班次ID") |
||||
private Long classId; |
||||
// /**
|
||||
// * 班次名称
|
||||
// */
|
||||
// @TableField(exist=false)
|
||||
// @ApiModelProperty(value = "班次名称")
|
||||
// private String className;
|
||||
/** |
||||
* 值班班组名称 |
||||
*/ |
||||
@TableField(exist=false) |
||||
@ApiModelProperty(value = "值班班组名称") |
||||
private String dutyGroupName; |
||||
/** |
||||
* 值班-班组ID |
||||
*/ |
||||
@ApiModelProperty(value = "值班-班组ID") |
||||
private Long dutyMainId; |
||||
/** |
||||
* 备注 |
||||
*/ |
||||
@ApiModelProperty(value = "备注") |
||||
private String remark; |
||||
|
||||
} |
@ -0,0 +1,41 @@
|
||||
package com.hnac.hzims.operational.duty.vo; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import com.hnac.hzims.operational.duty.entity.ImsDutyMainEntity; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
import org.springblade.core.tool.utils.DateUtil; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
||||
import java.util.Date; |
||||
import java.util.List; |
||||
|
||||
@Data |
||||
@ApiModel(value = "调班对象", description = "调班填写的相关信息") |
||||
public class ChangeDutyMainVo extends ImsDutyMainEntity { |
||||
|
||||
@ApiModelProperty(value = "人员ID") |
||||
private List<String> personId; |
||||
|
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATE) |
||||
@ApiModelProperty(value = "调班开始日期") |
||||
private Date changeStartDate; |
||||
|
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATE) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATE) |
||||
@ApiModelProperty(value = "调班开始日期") |
||||
private Date changeEndtDate; |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
@ApiModelProperty(value = "班次ID") |
||||
private Long classId; |
||||
/** |
||||
* 调班类型 |
||||
* 1为调入,2为调出 |
||||
*/ |
||||
@ApiModelProperty(value = "调班类型") |
||||
private Integer type;//1为调入,2为调出
|
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.hnac.hzims.operational.duty.vo; |
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class FlexibleSchedulingVo { |
||||
|
||||
|
||||
/** |
||||
* 值班组长ID |
||||
*/ |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
@ApiModelProperty("值班组长ID") |
||||
private String chargeId; |
||||
|
||||
/** |
||||
* 人员IDs |
||||
*/ |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
@ApiModelProperty("人员ID") |
||||
private List<String> personIds; |
||||
|
||||
} |
@ -0,0 +1,86 @@
|
||||
package com.hnac.hzims.operational.duty.vo; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.SqlCondition; |
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
import org.springblade.core.mp.support.QueryField; |
||||
import org.springblade.core.tenant.mp.TenantEntity; |
||||
import org.springblade.core.tool.utils.DateUtil; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
||||
import java.util.Date; |
||||
import java.util.List; |
||||
|
||||
|
||||
/** |
||||
* 实体类 |
||||
* |
||||
* @author ty |
||||
*/ |
||||
@Data |
||||
public class ImsDutyEmergencyVo extends TenantEntity { |
||||
|
||||
private static final long serialVersionUID = 4259568798118459986L; |
||||
/** |
||||
* 值班开始日期 |
||||
*/ |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@ApiModelProperty(value = "值班开始日期") |
||||
private Date dutyStartTime; |
||||
/** |
||||
* 值班结束日期 |
||||
*/ |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@ApiModelProperty(value = "值班结束日期") |
||||
private Date dutyEndTime; |
||||
/** |
||||
* 班次 |
||||
*/ |
||||
@ApiModelProperty(value = "班次") |
||||
private List<Long> dutyClass; |
||||
/** |
||||
* 登记人 |
||||
*/ |
||||
@ApiModelProperty(value = "登记人") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private List<Long> registrant; |
||||
/** |
||||
* 值班长 |
||||
*/ |
||||
@ApiModelProperty(value = "值班长") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private List<Long> chargePerson; |
||||
/** |
||||
* 登记时间 |
||||
*/ |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@ApiModelProperty(value = "登记时间") |
||||
private Date registerTime; |
||||
/** |
||||
* 事件主题 |
||||
*/ |
||||
@QueryField(condition = SqlCondition.LIKE) |
||||
@ApiModelProperty(value = "事件主题") |
||||
private String eventTitle; |
||||
/** |
||||
* 事件内容 |
||||
*/ |
||||
@QueryField(condition = SqlCondition.LIKE) |
||||
@ApiModelProperty(value = "事件内容") |
||||
private String eventInfo; |
||||
|
||||
/** |
||||
* 事件方式 |
||||
*/ |
||||
@QueryField(condition = SqlCondition.LIKE) |
||||
@ApiModelProperty(value = "事件方式") |
||||
private String eventType; |
||||
|
||||
|
||||
} |
@ -0,0 +1,22 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
|
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* @author ysj |
||||
* @date 2023/03/24 09:58:57 |
||||
* @version 4.0.0 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "发电量数据") |
||||
public class GenerationVo { |
||||
|
||||
@ApiModelProperty(value = "周期") |
||||
private String period; |
||||
|
||||
@ApiModelProperty(value = "月发电量") |
||||
private Float power; |
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
@ApiModel(value = "光伏设备排行对象") |
||||
public class PhotovoltaicDeviceChartsVo { |
||||
|
||||
@ApiModelProperty(value = "机构Id") |
||||
private Long deptId; |
||||
|
||||
@ApiModelProperty(value = "设备Code") |
||||
private String deviceCode; |
||||
|
||||
@ApiModelProperty(value = "设备名称") |
||||
private String deviceName; |
||||
|
||||
@ApiModelProperty(value = "实时功率: kW") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double load; |
||||
|
||||
@ApiModelProperty(value = "发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generate; |
||||
} |
@ -0,0 +1,87 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
|
||||
/** |
||||
* @author ysj |
||||
* @date 2023/03/29 15:14:34 |
||||
* @version 4.0.0 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "光伏设备数据对象") |
||||
public class PhotovoltaicDeviceVo { |
||||
|
||||
@ApiModelProperty(value = "机构Id") |
||||
private Long deptId; |
||||
|
||||
@ApiModelProperty(value = "设备Code") |
||||
private String deviceCode; |
||||
|
||||
@ApiModelProperty(value = "设备名称") |
||||
private String deviceName; |
||||
|
||||
@ApiModelProperty(value = "容量: kW") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double capacity; |
||||
|
||||
@ApiModelProperty(value = "实时功率: kW") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double load; |
||||
|
||||
@ApiModelProperty(value = "环比功率") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double loadRatio; |
||||
|
||||
@ApiModelProperty(value = "发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generate; |
||||
|
||||
@ApiModelProperty(value = "日发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateDay; |
||||
|
||||
@ApiModelProperty(value = "环比功率") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateDayRatio; |
||||
|
||||
@ApiModelProperty(value = "月发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateMon; |
||||
|
||||
@ApiModelProperty(value = "年发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateYear; |
||||
|
||||
@ApiModelProperty(value = "电压: V") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double voltage; |
||||
|
||||
@ApiModelProperty(value = "电流: A") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double current; |
||||
|
||||
@ApiModelProperty(value = "co2减排: kg") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double co2; |
||||
|
||||
@ApiModelProperty(value = "节约标准煤减排: kt") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double tec; |
||||
|
||||
@ApiModelProperty(value = "收益: 元") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double income; |
||||
|
||||
@ApiModelProperty(value = "当日机组有功功率") |
||||
private List<PhotovoltaicPowerVo> activePowerVoList; |
||||
|
||||
@ApiModelProperty(value = "近30天用电量") |
||||
private List<GenerationPowerVo> generationPowerVoList; |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* @author ysj |
||||
* @date 2023/03/29 15:26:07 |
||||
* @version 4.0.0 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "月发电对象") |
||||
public class PhotovoltaicGenerateYearVo { |
||||
|
||||
@ApiModelProperty(value = "月份") |
||||
private String mon; |
||||
|
||||
@ApiModelProperty(value = "发电量") |
||||
private Float generate; |
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
|
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
@ApiModel(value = "当日机组有功功率") |
||||
public class PhotovoltaicPowerVo { |
||||
|
||||
@ApiModelProperty(value = "小时") |
||||
private String hour; |
||||
|
||||
@ApiModelProperty(value = "有功功率") |
||||
private String activePower; |
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* @author ysj |
||||
* @date 2023/03/24 10:55:02 |
||||
* @version 4.0.0 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "光伏实时数据") |
||||
public class PhotovoltaicRealVo { |
||||
|
||||
@ApiModelProperty(value = "机构Id") |
||||
private Long deptId; |
||||
|
||||
@ApiModelProperty(value = "设备Code") |
||||
private String deviceCode; |
||||
|
||||
@ApiModelProperty(value = "设备名称") |
||||
private String deviceName; |
||||
|
||||
@ApiModelProperty(value = "状态: 0-运行") |
||||
private Integer state; |
||||
|
||||
@ApiModelProperty(value = "容量: kW") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double capacity; |
||||
|
||||
@ApiModelProperty(value = "总发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generate; |
||||
|
||||
@ApiModelProperty(value = "电压: V") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double voltage; |
||||
|
||||
@ApiModelProperty(value = "电流: A") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double current; |
||||
|
||||
@ApiModelProperty(value = "功率: kW") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double load; |
||||
|
||||
@ApiModelProperty(value = "上次功率: kW") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double lastLoad; |
||||
|
||||
} |
@ -0,0 +1,89 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import com.hnac.hzims.hzimsweather.response.weather.Daily; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
import org.springblade.core.tool.utils.DateUtil; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
||||
import java.time.LocalDateTime; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author ysj |
||||
* @date 2023/03/29 15:14:34 |
||||
* @version 4.0.0 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "水利站点首页对象") |
||||
public class PhotovoltaicStationVo { |
||||
|
||||
@ApiModelProperty(value = "机构Id") |
||||
private Long deptId; |
||||
|
||||
@ApiModelProperty(value = "机构名称") |
||||
private String deptName; |
||||
|
||||
@ApiModelProperty(value = "站点编码") |
||||
private String stationCode; |
||||
|
||||
@ApiModelProperty(value = "地址") |
||||
private String address; |
||||
|
||||
@ApiModelProperty(value = "投运时间") |
||||
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME) |
||||
private LocalDateTime operationTime; |
||||
|
||||
@ApiModelProperty(value = "总装机容量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double capacity; |
||||
|
||||
@ApiModelProperty(value = "安全运行天数") |
||||
private Integer runDay; |
||||
|
||||
@ApiModelProperty(value = "总发电负荷") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double load; |
||||
|
||||
@ApiModelProperty(value = "日发电量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateDay; |
||||
|
||||
@ApiModelProperty(value = "月发电量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateMon; |
||||
|
||||
@ApiModelProperty(value = "年发电量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generateYear; |
||||
|
||||
@ApiModelProperty(value = "总发电量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generate; |
||||
|
||||
@ApiModelProperty(value = "站点实时温度") |
||||
private String temp; |
||||
|
||||
@ApiModelProperty(value = "站点收益") |
||||
private Double income; |
||||
|
||||
@ApiModelProperty(value = "逆变器数量") |
||||
private Integer inverterCount; |
||||
|
||||
@ApiModelProperty(value = "七日内天气") |
||||
private List<Daily> weather; |
||||
|
||||
@ApiModelProperty(value = "发电排行") |
||||
private List<PhotovoltaicDeviceVo> devices; |
||||
|
||||
@ApiModelProperty(value = "年发电量完成百分比") |
||||
private List<PowerYearVo> generateSurvey; |
||||
|
||||
@ApiModelProperty(value = "设备信息") |
||||
private List<PhotovoltaicDeviceChartsVo> charts; |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
@ApiModel(value = "光伏指标数据对象") |
||||
public class PhotovoltaicTargetVo { |
||||
|
||||
@ApiModelProperty(value = "机构Id") |
||||
private Long deptId; |
||||
|
||||
@ApiModelProperty(value = "机构名称") |
||||
private String deptName; |
||||
|
||||
@ApiModelProperty(value = "设备Code") |
||||
private String deviceCode; |
||||
|
||||
@ApiModelProperty(value = "设备名称") |
||||
private String deviceName; |
||||
|
||||
@ApiModelProperty(value = "当日运行时长") |
||||
private Double runHours; |
||||
|
||||
@ApiModelProperty(value = "年发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generationYear; |
||||
|
||||
@ApiModelProperty(value = "月发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generationMon; |
||||
|
||||
@ApiModelProperty(value = "节约标准煤:1kwh = 0.0001229吨煤") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double tec; |
||||
|
||||
@ApiModelProperty(value = "二氧化碳减排:1kwh = 0.000997吨二氧化碳排放") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double co2; |
||||
|
||||
@ApiModelProperty(value = "收益:1kwh = 0.3 ~ 0.425人名币") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double income; |
||||
|
||||
@ApiModelProperty(value = "减少森林砍伐:1kwh = 0.000553") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double deforest; |
||||
|
||||
@ApiModelProperty(value = "日发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generationDay; |
||||
|
||||
@ApiModelProperty(value = "昨日发电量: kWh") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generationYesterday; |
||||
|
||||
@ApiModelProperty(value = "当日机组有功功率") |
||||
private List<PhotovoltaicPowerVo> activePowerVoList; |
||||
|
||||
@ApiModelProperty(value = "近30天用电量") |
||||
private List<GenerationPowerVo> generationPowerVoList; |
||||
} |
@ -0,0 +1,87 @@
|
||||
package com.hnac.hzims.operational.main.vo; |
||||
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; |
||||
import com.hnac.hzims.hzimsweather.response.weather.Daily; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author ysj |
||||
* @date 2023/03/24 09:58:57 |
||||
* @version 4.0.0 |
||||
*/ |
||||
@Data |
||||
@ApiModel(value = "发电量数据") |
||||
public class SubordinateVo { |
||||
|
||||
@ApiModelProperty(value = "机构ID") |
||||
private Long deptId; |
||||
|
||||
@ApiModelProperty(value = "机构名称") |
||||
private String deptName; |
||||
|
||||
@ApiModelProperty(value = "地市编码") |
||||
private String areaCode; |
||||
|
||||
@ApiModelProperty(value = "地市名称") |
||||
private String areaName; |
||||
|
||||
@ApiModelProperty(value = "光伏站点类型:0-个体光伏站 1-厂房光伏站") |
||||
private Long type; |
||||
|
||||
@ApiModelProperty("经度(东经)") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Float lgtd; |
||||
|
||||
@ApiModelProperty("纬度(北纬)") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Float lttd; |
||||
|
||||
@ApiModelProperty(value = "容量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double capacity; |
||||
|
||||
@ApiModelProperty(value = "功率") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double load; |
||||
|
||||
@ApiModelProperty(value = "发电量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generation; |
||||
|
||||
@ApiModelProperty(value = "发电占比") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double generationRate; |
||||
|
||||
@ApiModelProperty(value = "容量利用率") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double capacityUse; |
||||
|
||||
@ApiModelProperty(value = "电站利用率") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Double stationUse; |
||||
|
||||
@ApiModelProperty(value = "站点实时温度") |
||||
private String temp; |
||||
|
||||
@ApiModelProperty(value = "七日内天气") |
||||
private List<Daily> weather; |
||||
|
||||
@ApiModelProperty(value = "排序") |
||||
private Integer sort; |
||||
|
||||
@ApiModelProperty(value = "站点数量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Long stationCount; |
||||
|
||||
@ApiModelProperty(value = "站点使用数量") |
||||
@JsonSerialize(nullsUsing = NullSerializer.class) |
||||
private Long stationUseCount; |
||||
|
||||
|
||||
} |
@ -1,117 +0,0 @@
|
||||
/* |
||||
* Copyright 2007-present the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
import java.net.*; |
||||
import java.io.*; |
||||
import java.nio.channels.*; |
||||
import java.util.Properties; |
||||
|
||||
public class MavenWrapperDownloader { |
||||
|
||||
private static final String WRAPPER_VERSION = "0.5.6"; |
||||
/** |
||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. |
||||
*/ |
||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" |
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; |
||||
|
||||
/** |
||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to |
||||
* use instead of the default one. |
||||
*/ |
||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH = |
||||
".mvn/wrapper/maven-wrapper.properties"; |
||||
|
||||
/** |
||||
* Path where the maven-wrapper.jar will be saved to. |
||||
*/ |
||||
private static final String MAVEN_WRAPPER_JAR_PATH = |
||||
".mvn/wrapper/maven-wrapper.jar"; |
||||
|
||||
/** |
||||
* Name of the property which should be used to override the default download url for the wrapper. |
||||
*/ |
||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; |
||||
|
||||
public static void main(String args[]) { |
||||
System.out.println("- Downloader started"); |
||||
File baseDirectory = new File(args[0]); |
||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); |
||||
|
||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
||||
// wrapperUrl parameter.
|
||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); |
||||
String url = DEFAULT_DOWNLOAD_URL; |
||||
if(mavenWrapperPropertyFile.exists()) { |
||||
FileInputStream mavenWrapperPropertyFileInputStream = null; |
||||
try { |
||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); |
||||
Properties mavenWrapperProperties = new Properties(); |
||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); |
||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); |
||||
} catch (IOException e) { |
||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); |
||||
} finally { |
||||
try { |
||||
if(mavenWrapperPropertyFileInputStream != null) { |
||||
mavenWrapperPropertyFileInputStream.close(); |
||||
} |
||||
} catch (IOException e) { |
||||
// Ignore ...
|
||||
} |
||||
} |
||||
} |
||||
System.out.println("- Downloading from: " + url); |
||||
|
||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); |
||||
if(!outputFile.getParentFile().exists()) { |
||||
if(!outputFile.getParentFile().mkdirs()) { |
||||
System.out.println( |
||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); |
||||
} |
||||
} |
||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); |
||||
try { |
||||
downloadFileFromURL(url, outputFile); |
||||
System.out.println("Done"); |
||||
System.exit(0); |
||||
} catch (Throwable e) { |
||||
System.out.println("- Error downloading"); |
||||
e.printStackTrace(); |
||||
System.exit(1); |
||||
} |
||||
} |
||||
|
||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception { |
||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { |
||||
String username = System.getenv("MVNW_USERNAME"); |
||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); |
||||
Authenticator.setDefault(new Authenticator() { |
||||
@Override |
||||
protected PasswordAuthentication getPasswordAuthentication() { |
||||
return new PasswordAuthentication(username, password); |
||||
} |
||||
}); |
||||
} |
||||
URL website = new URL(urlString); |
||||
ReadableByteChannel rbc; |
||||
rbc = Channels.newChannel(website.openStream()); |
||||
FileOutputStream fos = new FileOutputStream(destination); |
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); |
||||
fos.close(); |
||||
rbc.close(); |
||||
} |
||||
|
||||
} |
Binary file not shown.
@ -1,2 +0,0 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip |
||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar |
@ -0,0 +1,21 @@
|
||||
package com.hnac.hzims.middle; |
||||
|
||||
import org.mybatis.spring.annotation.MapperScan; |
||||
import org.springblade.core.cloud.feign.EnableBladeFeign; |
||||
import org.springblade.core.launch.BladeApplication; |
||||
import org.springframework.boot.SpringApplication; |
||||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
import org.springframework.cloud.client.SpringCloudApplication; |
||||
import org.springframework.context.annotation.ComponentScan; |
||||
|
||||
@EnableBladeFeign |
||||
@SpringCloudApplication |
||||
@MapperScan("com.hnac.hzims.*.**.mapper.**") |
||||
@ComponentScan(basePackages = {"com.hnac.*"}) |
||||
public class MiddleApplication { |
||||
|
||||
public static void main(String[] args) { |
||||
BladeApplication.run("hzims-middle", MiddleApplication.class, args); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,104 @@
|
||||
package com.hnac.hzims.middle.mybatisplus; |
||||
|
||||
import com.baomidou.mybatisplus.generator.AutoGenerator; |
||||
import com.baomidou.mybatisplus.generator.InjectionConfig; |
||||
import com.baomidou.mybatisplus.generator.config.*; |
||||
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/4/4 9:07 |
||||
*/ |
||||
public class CodeGenerator { |
||||
|
||||
|
||||
public static void main(String[] args) { |
||||
// 代码生成器
|
||||
AutoGenerator mpg = new AutoGenerator(); |
||||
|
||||
// 全局配置
|
||||
GlobalConfig gc = new GlobalConfig(); |
||||
String projectPath = System.getProperty("user.dir") + "/hzims-service/hzims-middle"; |
||||
gc.setOutputDir(projectPath + "/src/main/java"); |
||||
gc.setAuthor("dfy"); |
||||
gc.setOpen(false); |
||||
// gc.setSwagger2(true); 实体属性 Swagger2 注解
|
||||
mpg.setGlobalConfig(gc); |
||||
|
||||
// 数据源配置
|
||||
DataSourceConfig dsc = new DataSourceConfig(); |
||||
dsc.setUrl("jdbc:mysql://192.168.1.20:3576/dev_hzims_middle?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true"); |
||||
// dsc.setSchemaName("public");
|
||||
dsc.setDriverName("com.mysql.cj.jdbc.Driver"); |
||||
dsc.setUsername("root"); |
||||
dsc.setPassword("123"); |
||||
mpg.setDataSource(dsc); |
||||
|
||||
// 包配置
|
||||
PackageConfig pc = new PackageConfig(); |
||||
pc.setModuleName("systemlog"); |
||||
pc.setParent("com.hnac.hzims.middle"); |
||||
mpg.setPackageInfo(pc); |
||||
|
||||
// 自定义配置
|
||||
InjectionConfig cfg = new InjectionConfig() { |
||||
@Override |
||||
public void initMap() { |
||||
// to do nothing
|
||||
} |
||||
}; |
||||
|
||||
// 如果模板引擎是 freemarker
|
||||
String templatePath = "/templates/mapper.xml.ftl"; |
||||
// 如果模板引擎是 velocity
|
||||
// String templatePath = "/templates/mapper.xml.vm";
|
||||
|
||||
// 自定义输出配置
|
||||
List<FileOutConfig> focList = new ArrayList<>(); |
||||
cfg.setFileOutConfigList(focList); |
||||
mpg.setCfg(cfg); |
||||
|
||||
// 配置模板
|
||||
TemplateConfig templateConfig = new TemplateConfig(); |
||||
|
||||
// 配置自定义输出模板
|
||||
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
|
||||
// templateConfig.setEntity("templates/entity2.java");
|
||||
// templateConfig.setService();
|
||||
// templateConfig.setController();
|
||||
|
||||
// templateConfig.setXml(null);
|
||||
mpg.setTemplate(templateConfig); |
||||
|
||||
// 策略配置
|
||||
StrategyConfig strategy = new StrategyConfig(); |
||||
strategy.setNaming(NamingStrategy.underline_to_camel); |
||||
strategy.setColumnNaming(NamingStrategy.underline_to_camel); |
||||
// strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
|
||||
strategy.setEntityLombokModel(true); |
||||
strategy.setRestControllerStyle(true); |
||||
strategy.setEntityBooleanColumnRemoveIsPrefix(true); |
||||
strategy.setEntityLombokModel(true); |
||||
strategy.setEntitySerialVersionUID(true); |
||||
strategy.setChainModel(true); |
||||
strategy.setEntityTableFieldAnnotationEnable(true); |
||||
// strategy.setFieldPrefix("hzims_");
|
||||
// 公共父类
|
||||
// strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
|
||||
// 写于父类中的公共字段
|
||||
// strategy.setSuperEntityColumns("id");
|
||||
strategy.setInclude("hzims_sys_log"); |
||||
strategy.setControllerMappingHyphenStyle(true); |
||||
strategy.setTablePrefix("hzims_"); |
||||
mpg.setStrategy(strategy); |
||||
// mpg.setTemplateEngine(new FreemarkerTemplateEngine());
|
||||
mpg.execute(); |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,60 @@
|
||||
package com.hnac.hzims.middle.systemlog.controller; |
||||
|
||||
|
||||
|
||||
import com.hnac.hzims.common.logs.to.SysLogTo; |
||||
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||
import com.hnac.hzims.middle.systemlog.service.SysLogService; |
||||
import io.swagger.annotations.Api; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.beans.BeanUtils; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestBody; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
import java.util.List; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* <p> |
||||
* 前端控制器 |
||||
* </p> |
||||
* |
||||
* @author dfy |
||||
* @since 2023-04-04 |
||||
*/ |
||||
@Api(tags = "系统日志") |
||||
@Slf4j |
||||
@RequiredArgsConstructor |
||||
@RestController |
||||
@RequestMapping("/systemlog/sys-log") |
||||
public class SysLogController { |
||||
|
||||
private final SysLogService sysLogService; |
||||
|
||||
|
||||
/** |
||||
* 保存操作日志 |
||||
* @param sysLogToList |
||||
*/ |
||||
@PostMapping("/batchSave") |
||||
public void saveBatch(@RequestBody List<SysLogTo> sysLogToList) { |
||||
//数据转换
|
||||
List<SysLog> collect = sysLogToList.stream().map(item -> { |
||||
SysLog sysLog = new SysLog(); |
||||
BeanUtils.copyProperties(item, sysLog); |
||||
return sysLog; |
||||
}).collect(Collectors.toList()); |
||||
//添加到数据库
|
||||
boolean save = sysLogService.saveBatch(collect); |
||||
if (save) { |
||||
log.info("操作日志新增成功 ~~~"); |
||||
return; |
||||
} |
||||
log.info("操作日志新增失败 ~~~"); |
||||
throw new IllegalArgumentException("操作日志新增失败"); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,191 @@
|
||||
package com.hnac.hzims.middle.systemlog.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import java.time.LocalDateTime; |
||||
import java.sql.Blob; |
||||
import com.baomidou.mybatisplus.annotation.TableField; |
||||
import java.io.Serializable; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
/** |
||||
* <p> |
||||
* |
||||
* </p> |
||||
* |
||||
* @author dfy |
||||
* @since 2023-04-04 |
||||
*/ |
||||
@Data |
||||
@EqualsAndHashCode(callSuper = false) |
||||
@Accessors(chain = true) |
||||
@TableName("hzims_sys_log") |
||||
public class SysLog implements Serializable { |
||||
|
||||
private static final long serialVersionUID=1L; |
||||
|
||||
/** |
||||
* 操作日志编号 |
||||
*/ |
||||
@TableField("id") |
||||
private Long id; |
||||
|
||||
/** |
||||
* 租户ID |
||||
*/ |
||||
@TableField("tenant_id") |
||||
private String tenantId; |
||||
|
||||
/** |
||||
* 服务器ip |
||||
*/ |
||||
@TableField("server_ip") |
||||
private String serverIp; |
||||
|
||||
/** |
||||
* 服务器地址 |
||||
*/ |
||||
@TableField("server_host") |
||||
private String serverHost; |
||||
|
||||
/** |
||||
* 服务名称 |
||||
*/ |
||||
@TableField("server_name") |
||||
private String serverName; |
||||
|
||||
/** |
||||
* 环境 |
||||
*/ |
||||
@TableField("env") |
||||
private String env; |
||||
|
||||
/** |
||||
* 操作人Id |
||||
*/ |
||||
@TableField("operation_user_id") |
||||
private Long operationUserId; |
||||
|
||||
/** |
||||
* 操作人名称 |
||||
*/ |
||||
@TableField("operation_user_name") |
||||
private String operationUserName; |
||||
|
||||
/** |
||||
* 请求路径 (操作地址) |
||||
*/ |
||||
@TableField("path") |
||||
private String path; |
||||
|
||||
/** |
||||
* 用户代理 |
||||
*/ |
||||
@TableField("user_agent") |
||||
private String userAgent; |
||||
|
||||
/** |
||||
* 操作方式 |
||||
*/ |
||||
@TableField("method") |
||||
private String method; |
||||
|
||||
/** |
||||
* 方法类 |
||||
*/ |
||||
@TableField("method_class") |
||||
private String methodClass; |
||||
|
||||
/** |
||||
* 方法名 |
||||
*/ |
||||
@TableField("method_name") |
||||
private String methodName; |
||||
|
||||
/** |
||||
* 方法执行时间 消耗时间 毫秒 |
||||
*/ |
||||
@TableField("cost_time") |
||||
private String costTime; |
||||
|
||||
/** |
||||
* 方法入参 |
||||
*/ |
||||
@TableField("parameter") |
||||
private String parameter; |
||||
|
||||
/** |
||||
* 操作方法 |
||||
*/ |
||||
@TableField("title") |
||||
private String title; |
||||
|
||||
/** |
||||
* 方法描述 |
||||
*/ |
||||
@TableField("action") |
||||
private String action; |
||||
|
||||
/** |
||||
* 系统类型 |
||||
*/ |
||||
@TableField("operator_type") |
||||
private String operatorType; |
||||
|
||||
/** |
||||
* 操作人类别 |
||||
*/ |
||||
@TableField("business_type") |
||||
private String businessType; |
||||
|
||||
/** |
||||
* 返回结果 |
||||
*/ |
||||
@TableField("json_result") |
||||
private String jsonResult; |
||||
|
||||
/** |
||||
* 请求的Ip |
||||
*/ |
||||
@TableField("local_ip") |
||||
private String localIp; |
||||
|
||||
/** |
||||
* 错误消息 |
||||
*/ |
||||
@TableField("error_msg") |
||||
private String errorMsg; |
||||
|
||||
/** |
||||
* 操作时间 |
||||
*/ |
||||
@TableField("operation_time") |
||||
private LocalDateTime operationTime; |
||||
|
||||
/** |
||||
* 操作状态(0 正常 1 异常) |
||||
*/ |
||||
@TableField("status") |
||||
private Integer status; |
||||
|
||||
/** |
||||
* 创建时间 |
||||
*/ |
||||
@TableField("create_time") |
||||
private LocalDateTime createTime; |
||||
|
||||
/** |
||||
* 更新时间 |
||||
*/ |
||||
@TableField("update_time") |
||||
private LocalDateTime updateTime; |
||||
|
||||
/** |
||||
* 逻辑删除 (0 可用 1 删除) |
||||
*/ |
||||
@TableField("is_deleted") |
||||
private Integer isDeleted; |
||||
|
||||
|
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.hnac.hzims.middle.systemlog.mapper; |
||||
|
||||
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
||||
/** |
||||
* <p> |
||||
* Mapper 接口 |
||||
* </p> |
||||
* |
||||
* @author dfy |
||||
* @since 2023-04-04 |
||||
*/ |
||||
public interface SysLogMapper extends BaseMapper<SysLog> { |
||||
|
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.hnac.hzims.middle.systemlog.service; |
||||
|
||||
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
|
||||
/** |
||||
* <p> |
||||
* 服务类 |
||||
* </p> |
||||
* |
||||
* @author dfy |
||||
* @since 2023-04-04 |
||||
*/ |
||||
public interface SysLogService extends IService<SysLog> { |
||||
|
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.hnac.hzims.middle.systemlog.service.impl; |
||||
|
||||
import com.hnac.hzims.middle.systemlog.entity.SysLog; |
||||
import com.hnac.hzims.middle.systemlog.mapper.SysLogMapper; |
||||
import com.hnac.hzims.middle.systemlog.service.SysLogService; |
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
/** |
||||
* <p> |
||||
* 服务实现类 |
||||
* </p> |
||||
* |
||||
* @author dfy |
||||
* @since 2023-04-04 |
||||
*/ |
||||
@Service |
||||
public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements SysLogService { |
||||
|
||||
} |
@ -0,0 +1,38 @@
|
||||
#服务器端口 |
||||
server: |
||||
port: 8400 |
||||
|
||||
#数据源配置 |
||||
spring: |
||||
#排除DruidDataSourceAutoConfigure |
||||
autoconfigure: |
||||
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure |
||||
datasource: |
||||
url: jdbc:mysql://192.168.1.20:3576/dev_hzims_middle?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true |
||||
username: root |
||||
password: 123 |
||||
|
||||
|
||||
#mybatis-plus配置 |
||||
mybatis-plus: |
||||
mapper-locations: |
||||
- classpath:com/hnac/hzims/**/mapper/*Mapper.xml |
||||
- classpath:/mapper/*Mapper.xml |
||||
#实体扫描,多个package用逗号或者分号分隔 |
||||
typeAliasesPackage: com.hnac.hzims.**.entity |
||||
|
||||
#swagger扫描路径配置 |
||||
swagger: |
||||
base-packages: |
||||
- org.springbalde |
||||
- com.hnac |
||||
|
||||
blade: |
||||
data-scope: |
||||
enabled: false |
||||
lock: |
||||
enabled: true |
||||
address: redis://192.168.1.20:3577 |
||||
password: 1qaz2WSX@redis |
||||
database: 0 |
||||
ssl: false |
@ -0,0 +1,7 @@
|
||||
spring: |
||||
cloud: |
||||
nacos: |
||||
discovery: |
||||
server-addr: 175.6.40.67:10042 |
||||
|
||||
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
<mapper namespace="com.hnac.hzims.middle.systemlog.mapper.SysLogMapper"> |
||||
|
||||
</mapper> |
@ -0,0 +1,15 @@
|
||||
package com.hnac.hzims.middle; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
import org.springframework.boot.test.context.SpringBootTest; |
||||
|
||||
@SpringBootTest |
||||
class MiddleApplicationTests { |
||||
|
||||
@Test |
||||
void contextLoads() { |
||||
|
||||
System.out.println("1"); |
||||
} |
||||
|
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue