Browse Source

update

main
wangshaoping 1 year ago
parent
commit
685c62086f
  1. 2
      io.sc.platform.core.frontend/package.json
  2. 17
      io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts
  3. 6
      io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts
  4. 4
      io.sc.platform.core.frontend/template-project/package.json
  5. 3
      io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java
  6. 2
      io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java
  7. 17
      io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java
  8. 23
      io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java
  9. 2
      io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogStatus.java
  10. 3
      io.sc.platform.core/src/main/java/io/sc/platform/core/enums/LogLevel.java
  11. 12
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java
  12. 32
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties
  13. 32
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties
  14. 32
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties
  15. 1
      io.sc.platform.mvc/build.gradle
  16. 12
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java
  17. 104
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java
  18. 2
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java
  19. 29
      io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java
  20. 2
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java
  21. 2
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java
  22. 2
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java
  23. 2
      io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java
  24. 1
      io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java
  25. 37
      io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java
  26. 30
      io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java
  27. 48
      io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java
  28. 2
      io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java
  29. 2
      io.sc.platform.system.frontend/package.json
  30. 20
      io.sc.platform.system.frontend/src/views/corporation/Corporation.vue
  31. 32
      io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue
  32. 21
      io.sc.platform.system.frontend/src/views/monitor/Log.vue
  33. 102
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java
  34. 25
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelConfiguredLevelComparator.java
  35. 24
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelEffectiveLevelComparator.java
  36. 26
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelNameComparator.java
  37. 5
      io.sc.platform.system/src/main/resources/META-INF/platform/plugins/p6spy.json

2
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.92",
"version": "8.1.94",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",

17
io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts

@ -30,4 +30,19 @@ const trueFalse = (includeEmpty: boolean = true) => {
}
};
export { yesNo, trueFalse };
const successFailed = (includeEmpty: boolean = true) => {
if (includeEmpty) {
return [
{ value: null, label: '' },
{ value: 'success', label: i18n.global.t('success') },
{ value: 'failed', label: i18n.global.t('failed') },
];
} else {
return [
{ value: 'success', label: i18n.global.t('success') },
{ value: 'failed', label: i18n.global.t('failed') },
];
}
};
export { yesNo, trueFalse, successFailed };

6
io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts

@ -1,5 +1,5 @@
import type { EnumType } from '@/platform/types';
import { yesNo, trueFalse } from './BooleanOptions';
import { yesNo, trueFalse, successFailed } from './BooleanOptions';
import { EnumOptions } from './EnumOptions';
class Options {
@ -13,6 +13,10 @@ class Options {
return trueFalse();
}
public static successFailed() {
return successFailed();
}
public static enum(enumType: EnumType, includeEmpty: boolean = true) {
if (enumType) {
let enumOptions = Options.#enumOptionsMap[enumType.name];

4
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.92",
"version": "8.1.94",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.92",
"platform-core": "8.1.94",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

3
io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java

@ -1,5 +1,6 @@
package io.sc.platform.core.annotation;
import io.sc.platform.core.enums.AuditLogAction;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.Documented;
@ -25,4 +26,6 @@ public @interface AuditLog {
@AliasFor("value")
String category() default "";
AuditLogAction action() default AuditLogAction.UNKNOWN;
}

2
io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java

@ -26,7 +26,7 @@ public class AuditLog {
private String action; //AuditLog 注解中指定的操作
private String status; //请求方法的执行状态
private Date startDate; //方法开始执行时间
private Date startDate =new Date();//方法开始执行时间
private Long executeTime; //方法执行的时间(单位:毫秒)
private String url; //请求的 URL

17
io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java

@ -1,17 +0,0 @@
package io.sc.platform.core.audit;
/**
* 审计日志分类常量
*/
public class AuditLogAction {
public static final String ADD ="io.sc.platform.core.audit.AuditLogAction.ADD";
public static final String REMOVE ="io.sc.platform.core.audit.AuditLogAction.REMOVE";
public static final String UPDATE ="io.sc.platform.core.audit.AuditLogAction.UPDATE";
public static final String QUERY ="io.sc.platform.core.audit.AuditLogAction.QUERY";
public static final String FIND_ONE ="io.sc.platform.core.audit.AuditLogAction.FIND_ONE";
public static final String EXPORT ="io.sc.platform.core.audit.AuditLogAction.EXPORT";
public static final String LOGIN ="io.sc.platform.core.audit.AuditLogAction.LOGIN";
public static final String LOGOUT ="io.sc.platform.core.audit.AuditLogAction.LOGOUT";
private AuditLogAction(){}
}

23
io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java

@ -0,0 +1,23 @@
package io.sc.platform.core.enums;
public enum AuditLogAction {
UNKNOWN("UNKNOWN"),
ADD("ADD"),
REMOVE("REMOVE"),
UPDATE("UPDATE"),
QUERY("QUERY"),
FIND_ONE("FIND_ONE"),
EXPORT("EXPORT"),
LOGIN("LOGIN"),
LOGOUT("LOGOUT");
private final String value;
private AuditLogAction(String value){
this.value =value;
}
public String getValue(){
return this.value;
}
}

2
io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogStatus.java → io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogStatus.java

@ -1,4 +1,4 @@
package io.sc.platform.core.audit;
package io.sc.platform.core.enums;
/**
* 审计日志状态枚举

3
io.sc.platform.core/src/main/java/io/sc/platform/core/support/LogLevel.java → io.sc.platform.core/src/main/java/io/sc/platform/core/enums/LogLevel.java

@ -1,10 +1,9 @@
package io.sc.platform.core.support;
package io.sc.platform.core.enums;
/**
* 日志级别枚举
*/
public enum LogLevel {
OFF, //关闭
ERROR, //错误
WARN, //警告
INFO, //信息

12
io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java

@ -140,6 +140,18 @@ public class EnumUtil {
return null;
}
public static <E extends Enum<E>> int compare(E o1, E o2){
if(o1!=null && o2==null){
return 1;
}else if(o1==null && o2!=null){
return -1;
}else if(o1==null && o2==null){
return 0;
}else{
return o1.compareTo(o2);
}
}
private static boolean contain(String[] arrays,String str) {
if(arrays==null || arrays.length==0) {
return false;

32
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties

@ -1,21 +1,21 @@
io.sc.platform.core.support.LogLevel.OFF=OFF
io.sc.platform.core.support.LogLevel.ERROR=ERROR
io.sc.platform.core.support.LogLevel.WARN=WARN
io.sc.platform.core.support.LogLevel.INFO=INFO
io.sc.platform.core.support.LogLevel.DEBUG=DEBUG
io.sc.platform.core.support.LogLevel.TRACE=TRACE
io.sc.platform.core.enums.LogLevel.ERROR=ERROR
io.sc.platform.core.enums.LogLevel.WARN=WARN
io.sc.platform.core.enums.LogLevel.INFO=INFO
io.sc.platform.core.enums.LogLevel.DEBUG=DEBUG
io.sc.platform.core.enums.LogLevel.TRACE=TRACE
io.sc.platform.core.audit.AuditLogStatus.SUCCESS=Success
io.sc.platform.core.audit.AuditLogStatus.FAILED=Failed
io.sc.platform.core.enums.AuditLogStatus.SUCCESS=Success
io.sc.platform.core.enums.AuditLogStatus.FAILED=Failed
io.sc.platform.core.audit.AuditLogAction.ADD=Add
io.sc.platform.core.audit.AuditLogAction.REMOVE=Remove
io.sc.platform.core.audit.AuditLogAction.UPDATE=Update
io.sc.platform.core.audit.AuditLogAction.QUERY=Query
io.sc.platform.core.audit.AuditLogAction.FIND_ONE=Find One
io.sc.platform.core.audit.AuditLogAction.EXPORT=Export
io.sc.platform.core.audit.AuditLogAction.LOGIN=Login
io.sc.platform.core.audit.AuditLogAction.LOGOUT=Logout
io.sc.platform.core.enums.AuditLogAction.UNKNOWN=Unknown
io.sc.platform.core.enums.AuditLogAction.ADD=Add
io.sc.platform.core.enums.AuditLogAction.REMOVE=Remove
io.sc.platform.core.enums.AuditLogAction.UPDATE=Update
io.sc.platform.core.enums.AuditLogAction.QUERY=Query
io.sc.platform.core.enums.AuditLogAction.FIND_ONE=Find One
io.sc.platform.core.enums.AuditLogAction.EXPORT=Export
io.sc.platform.core.enums.AuditLogAction.LOGIN=Login
io.sc.platform.core.enums.AuditLogAction.LOGOUT=Logout
io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587

32
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties

@ -1,21 +1,21 @@
io.sc.platform.core.support.LogLevel.OFF=\u95DC\u9589
io.sc.platform.core.support.LogLevel.ERROR=\u932F\u8AA4
io.sc.platform.core.support.LogLevel.WARN=\u8B66\u544A
io.sc.platform.core.support.LogLevel.INFO=\u4FE1\u606F
io.sc.platform.core.support.LogLevel.DEBUG=\u8ABF\u8A66
io.sc.platform.core.support.LogLevel.TRACE=\u8DDF\u8E64
io.sc.platform.core.enums.LogLevel.ERROR=\u932F\u8AA4
io.sc.platform.core.enums.LogLevel.WARN=\u8B66\u544A
io.sc.platform.core.enums.LogLevel.INFO=\u4FE1\u606F
io.sc.platform.core.enums.LogLevel.DEBUG=\u8ABF\u8A66
io.sc.platform.core.enums.LogLevel.TRACE=\u8DDF\u8E64
io.sc.platform.core.audit.AuditLogStatus.SUCCESS=\u6210\u529F
io.sc.platform.core.audit.AuditLogStatus.FAILED=\u5931\u6557
io.sc.platform.core.enums.AuditLogStatus.SUCCESS=\u6210\u529F
io.sc.platform.core.enums.AuditLogStatus.FAILED=\u5931\u6557
io.sc.platform.core.audit.AuditLogAction.ADD=\u65B0\u589E
io.sc.platform.core.audit.AuditLogAction.REMOVE=\u522A\u9664
io.sc.platform.core.audit.AuditLogAction.UPDATE=\u66F4\u65B0
io.sc.platform.core.audit.AuditLogAction.QUERY=\u67E5\u8A62
io.sc.platform.core.audit.AuditLogAction.FIND_ONE=\u67E5\u627E\u55AE\u500B
io.sc.platform.core.audit.AuditLogAction.EXPORT=\u5C0E\u51FA
io.sc.platform.core.audit.AuditLogAction.LOGIN=\u767B\u9304
io.sc.platform.core.audit.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.AuditLogAction.UNKNOWN=\u672A\u77E5
io.sc.platform.core.enums.AuditLogAction.ADD=\u65B0\u589E
io.sc.platform.core.enums.AuditLogAction.REMOVE=\u522A\u9664
io.sc.platform.core.enums.AuditLogAction.UPDATE=\u66F4\u65B0
io.sc.platform.core.enums.AuditLogAction.QUERY=\u67E5\u8A62
io.sc.platform.core.enums.AuditLogAction.FIND_ONE=\u67E5\u627E\u55AE\u500B
io.sc.platform.core.enums.AuditLogAction.EXPORT=\u5C0E\u51FA
io.sc.platform.core.enums.AuditLogAction.LOGIN=\u767B\u9304
io.sc.platform.core.enums.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587

32
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties

@ -1,21 +1,21 @@
io.sc.platform.core.support.LogLevel.OFF=\u5173\u95ED
io.sc.platform.core.support.LogLevel.ERROR=\u9519\u8BEF
io.sc.platform.core.support.LogLevel.WARN=\u8B66\u544A
io.sc.platform.core.support.LogLevel.INFO=\u4FE1\u606F
io.sc.platform.core.support.LogLevel.DEBUG=\u8C03\u8BD5
io.sc.platform.core.support.LogLevel.TRACE=\u8DDF\u8E2A
io.sc.platform.core.enums.LogLevel.ERROR=\u9519\u8BEF
io.sc.platform.core.enums.LogLevel.WARN=\u8B66\u544A
io.sc.platform.core.enums.LogLevel.INFO=\u4FE1\u606F
io.sc.platform.core.enums.LogLevel.DEBUG=\u8C03\u8BD5
io.sc.platform.core.enums.LogLevel.TRACE=\u8DDF\u8E2A
io.sc.platform.core.audit.AuditLogStatus.SUCCESS=\u6210\u529F
io.sc.platform.core.audit.AuditLogStatus.FAILED=\u5931\u8D25
io.sc.platform.core.enums.AuditLogStatus.SUCCESS=\u6210\u529F
io.sc.platform.core.enums.AuditLogStatus.FAILED=\u5931\u8D25
io.sc.platform.core.audit.AuditLogAction.ADD=\u65B0\u589E
io.sc.platform.core.audit.AuditLogAction.REMOVE=\u522A\u9664
io.sc.platform.core.audit.AuditLogAction.UPDATE=\u66F4\u65B0
io.sc.platform.core.audit.AuditLogAction.QUERY=\u67E5\u8BE2
io.sc.platform.core.audit.AuditLogAction.FIND_ONE=\u67E5\u627E\u5355\u4E2A
io.sc.platform.core.audit.AuditLogAction.EXPORT=\u5BFC\u51FA
io.sc.platform.core.audit.AuditLogAction.LOGIN=\u767B\u5F55
io.sc.platform.core.audit.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.AuditLogAction.UNKNOWN=\u672A\u77E5
io.sc.platform.core.enums.AuditLogAction.ADD=\u65B0\u589E
io.sc.platform.core.enums.AuditLogAction.REMOVE=\u522A\u9664
io.sc.platform.core.enums.AuditLogAction.UPDATE=\u66F4\u65B0
io.sc.platform.core.enums.AuditLogAction.QUERY=\u67E5\u8BE2
io.sc.platform.core.enums.AuditLogAction.FIND_ONE=\u67E5\u627E\u5355\u4E2A
io.sc.platform.core.enums.AuditLogAction.EXPORT=\u5BFC\u51FA
io.sc.platform.core.enums.AuditLogAction.LOGIN=\u767B\u5F55
io.sc.platform.core.enums.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587

1
io.sc.platform.mvc/build.gradle

@ -1,6 +1,7 @@
dependencies {
api(
project(":io.sc.platform.orm"),
project(":io.sc.platform.security"),
project(":io.sc.platform.mvc.frontend"),
"org.webjars:webjars-locator-core",

12
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java

@ -2,13 +2,15 @@ package io.sc.platform.mvc.autoconfigure.support;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.audit.AuditLogStatus;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.response.ValidationError;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.IpUtil;
import io.sc.platform.orm.entity.AuditorEntity;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.security.util.SecurityUtil;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
@ -19,6 +21,7 @@ import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
@ -110,12 +113,17 @@ public class AuditLogAspectorBean {
if(httpServletRequest!=null) {
auditLog.setUrl(httpServletRequest.getRequestURL().toString());
auditLog.setLoginName(httpServletRequest.getRemoteUser());
//auditLog.setLoginName(httpServletRequest.getRemoteUser());
auditLog.setLoginName(SecurityUtil.getLoginName());
auditLog.setIp(IpUtil.getRemoteIp(httpServletRequest));
//审计日志注解
io.sc.platform.core.annotation.AuditLog annotation = method.getAnnotation(io.sc.platform.core.annotation.AuditLog.class);
String key = annotation.value();
if(!StringUtils.hasText(key)){
AuditLogAction action =annotation.action();
key =action.toString();
}
String action =messageSource.getMessage(key, null, key, httpServletRequest.getLocale());
auditLog.setAction(action);
}

104
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java

@ -1,7 +1,7 @@
package io.sc.platform.mvc.controller.support;
import io.sc.platform.core.annotation.AuditLog;
import io.sc.platform.core.audit.AuditLogAction;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.response.ValidateException;
import io.sc.platform.core.util.ValidatorUtil;
import io.sc.platform.orm.api.vo.BaseVo;
@ -26,7 +26,7 @@ import java.util.List;
public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<V>, ID extends Serializable, R extends DaoRepository<E,ID>, S extends DaoService<E,ID,R>> {
@Autowired protected S service;
@AuditLog(AuditLogAction.ADD)
@AuditLog(action= AuditLogAction.ADD)
@PostMapping("")
@ResponseBody
public V _add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
@ -45,7 +45,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return null;
}
@AuditLog(AuditLogAction.REMOVE)
@AuditLog(action=AuditLogAction.REMOVE)
@DeleteMapping("{id}")
@ResponseBody
public ID _remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
@ -56,7 +56,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return service.remove(id);
}
@AuditLog(AuditLogAction.UPDATE)
@AuditLog(action=AuditLogAction.UPDATE)
@PutMapping("{id}")
@ResponseBody
public V _update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
@ -75,7 +75,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return null;
}
@AuditLog(AuditLogAction.FIND_ONE)
@AuditLog(action=AuditLogAction.FIND_ONE)
@GetMapping("{id}")
@ResponseBody
public V _findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
@ -90,7 +90,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return null;
}
@AuditLog(AuditLogAction.QUERY)
@AuditLog(action=AuditLogAction.QUERY)
@GetMapping("")
@ResponseBody
public Page<V> _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{
@ -111,96 +111,4 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
}
return new PageImpl<>(vos,page.getPageable(),page.getTotalElements());
}
/*
@AuditLog(AuditLogAction.ADD)
@PostMapping("")
@ResponseBody
public E _add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
ValidateException result =validationError(bindingResult);
if(result!=null){
throw result;
}
return add(request,response,entity);
}
protected E add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity) throws Exception{
return service.add(entity);
}
@AuditLog(AuditLogAction.REMOVE)
@DeleteMapping("{id}")
@ResponseBody
public ID _remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return remove(request,response,id);
}
protected ID remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return service.remove(id);
}
@AuditLog(AuditLogAction.UPDATE)
@PutMapping("{id}")
@ResponseBody
public E _update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
ValidateException result =validationError(bindingResult);
if(result!=null){
throw result;
}
return update(request,response,id,entity);
}
protected E update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity) throws Exception{
return service.update(id,entity);
}
@AuditLog(AuditLogAction.FIND_ONE)
@GetMapping("{id}")
@ResponseBody
public E _findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return findById(request,response,id);
}
protected E findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return service.findById(id);
}
@AuditLog(AuditLogAction.QUERY)
@GetMapping("")
@ResponseBody
public Page<E> _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{
return query(request,response,queryParameter);
}
protected Page<E> query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{
return service.query(queryParameter);
}
private ValidateException validationError(BindingResult bindingResult) {
if(bindingResult==null || !bindingResult.hasErrors()){
return null;
}
List<FieldError> errors =bindingResult.getFieldErrors();
if(errors==null || errors.size()==0){
return null;
}
List<ValidationError> errorList =new ArrayList<ValidationError>();
for(FieldError error : errors){
errorList.add(new ValidationError(getFieldName(error.getField()),error.getDefaultMessage()));
}
return new ValidateException(errorList);
}
private String getFieldName(String field){
int index =field.lastIndexOf(".");
if(index>-1){
return field.substring(index+1);
}else{
return field;
}
}
*/
}

2
io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java

@ -33,7 +33,7 @@ public class QueryResult {
int total =list.size();
int first =pageSize * page;
List<T> result =new ArrayList<>();
for(int i=first;i<first+pageSize;i++){
for(int i=first;i<first+pageSize && i<total;i++){
result.add(list.get(i));
}
return new PageImpl<T>(result,pageable,total);

29
io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java

@ -1,13 +1,11 @@
package io.sc.platform.security.loginform.autoconfigure;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.service.RuntimeService;
import io.sc.platform.security.handler.PlatformAccessDeniedHandler;
import io.sc.platform.security.handler.PlatformAuthenticationEntryPoint;
import io.sc.platform.security.handler.PlatformAuthenticationFailureHandler;
import io.sc.platform.security.handler.PlatformAuthenticationSuccessHandler;
import io.sc.platform.security.service.SecurityConfigureService;
import io.sc.platform.security.SecurityProperties;
import io.sc.platform.security.handler.*;
import io.sc.platform.security.service.SecurityConfigureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@ -26,6 +24,7 @@ import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
/**
* 框架安全自动配置类
@ -41,6 +40,7 @@ public class WebSecurityAutoConfiguration {
@Autowired private UserDetailsService userDetailsService;
@Autowired private PasswordEncoder passwordEncoder;
@Autowired private AuthenticationProvider authenticationProvider;
@Autowired private AuditLogPersistenterManager auditLogPersistenterManager;
/**
* 认证成功处理器
@ -49,7 +49,7 @@ public class WebSecurityAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public AuthenticationSuccessHandler authenticationSuccessHandler(){
return new PlatformAuthenticationSuccessHandler();
return new PlatformAuthenticationSuccessHandler(securityProperties,auditLogPersistenterManager);
}
/**
@ -59,7 +59,17 @@ public class WebSecurityAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public AuthenticationFailureHandler authenticationFailureHandler(){
return new PlatformAuthenticationFailureHandler(securityProperties.getFormLogin().getFailureUrl());
return new PlatformAuthenticationFailureHandler(securityProperties,auditLogPersistenterManager);
}
/**
* 退出处理器
* @return 退出处理器
*/
@Bean
@ConditionalOnMissingBean
public LogoutSuccessHandler logoutSuccessHandler(){
return new PlatformLogoutSuccessHandler(auditLogPersistenterManager);
}
/**
@ -84,12 +94,13 @@ public class WebSecurityAutoConfiguration {
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE + 300)
public SecurityFilterChain platformWebSecurityFilterChain(HttpSecurity http) throws Exception {
public SecurityFilterChain loginFormWebSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable();
}).build();
}
return http
// 在匹配了上述 SecurityFilterChain 规则的基础上进行权限控制
.authorizeRequests(authorizeRequests -> {
@ -127,6 +138,7 @@ public class WebSecurityAutoConfiguration {
.logout(logoutConfigurer -> {
logoutConfigurer.logoutUrl(securityProperties.getLogout().getLogoutUrl());
logoutConfigurer.logoutSuccessUrl(securityProperties.getLogout().getLogoutSuccessUrl());
logoutConfigurer.logoutSuccessHandler(logoutSuccessHandler());
})
.headers(headersConfigurer -> {
//接收从 iframe 发送的请求
@ -136,6 +148,7 @@ public class WebSecurityAutoConfiguration {
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint())
.accessDeniedHandler(accessDeniedHandler()).and()
.build();
}
}

2
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java

@ -62,7 +62,7 @@ public class PlatformOauth2AuthorizationServerAutoConfiguration {
}
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
public SecurityFilterChain auth2AuthorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable();

2
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java

@ -34,7 +34,7 @@ public class PlatformWebSecurityAutoConfiguration {
}
@Bean
public SecurityFilterChain platformWebSecurityFilterChain(HttpSecurity http) throws Exception {
public SecurityFilterChain auth2WebSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable();

2
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java

@ -39,7 +39,7 @@ public class SecurityAutoConfiguration {
@Bean
@Order(1)
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
public SecurityFilterChain auth2AuthorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
// Enable OpenID Connect 1.0
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());

2
io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java

@ -48,7 +48,7 @@ public class PlatformOauth2ResourceServerAutoConfiguration {
*/
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE + 100)
SecurityFilterChain frameworkResourceServerSecurityFilterChain(HttpSecurity http) throws Exception {
SecurityFilterChain oauth2ResourceServerSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable();

1
io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java

@ -2,7 +2,6 @@ package io.sc.platform.security.autoconfigure;
import io.sc.platform.security.autoconfigure.support.EncodePasswordAuthenticationProvider;
import io.sc.platform.security.service.impl.UserDetailsServiceImpl;
import org.apache.catalina.security.SecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;

37
io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java

@ -1,12 +1,18 @@
package io.sc.platform.security.handler;
import io.sc.platform.core.response.ResponseWrapper;
import io.sc.platform.core.response.ResponseWrapperBuilder;
import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.HttpServletRequestUtil;
import io.sc.platform.core.util.ObjectMapper4Json;
import io.sc.platform.core.util.IpUtil;
import io.sc.platform.security.SecurityProperties;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@ -14,12 +20,33 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PlatformAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
public PlatformAuthenticationFailureHandler(String defaultFailureUrl) {
setDefaultFailureUrl(defaultFailureUrl);
private SecurityProperties securityProperties;
private AuditLogPersistenterManager auditLogPersistenterManager;
public PlatformAuthenticationFailureHandler(SecurityProperties securityProperties,AuditLogPersistenterManager auditLogPersistenterManager) {
this.auditLogPersistenterManager =auditLogPersistenterManager;
setDefaultFailureUrl(securityProperties.getFormLogin().getFailureUrl());
}
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
AuditLogPersistenter logger =auditLogPersistenterManager.getAuditLogPersister();
if(logger!=null){
AuditLog auditLog =new AuditLog();
auditLog.setAction(AuditLogAction.LOGIN.getValue());
auditLog.setExecuteTime(10L);
auditLog.setClassName(UsernamePasswordAuthenticationFilter.class.getName());
auditLog.setMethodName("attemptAuthentication");
auditLog.setHttpMethod("POST");
auditLog.setStatus(AuditLogStatus.FAILED.getValue());
auditLog.setUrl(request.getRequestURL().toString());
auditLog.setLoginName(request.getParameter(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_FORM_USERNAME_KEY));
auditLog.setIp(IpUtil.getRemoteIp(request));
auditLog.setException(exception.getClass().getName());
auditLog.setExceptionMessage(exception.getMessage());
auditLog.setExceptionStackTrace(ExceptionUtils.getStackTrace(exception));
logger.log(auditLog);
}
if(HttpServletRequestUtil.isTextHtmlMediaType(request)) {
super.onAuthenticationFailure(request,response,exception);
} else {

30
io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java

@ -1,12 +1,20 @@
package io.sc.platform.security.handler;
import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.response.ResponseWrapper;
import io.sc.platform.core.response.ResponseWrapperBuilder;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.HttpServletRequestUtil;
import io.sc.platform.core.util.IpUtil;
import io.sc.platform.core.util.ObjectMapper4Json;
import io.sc.platform.security.SecurityProperties;
import io.sc.platform.security.util.SecurityUtil;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@ -14,8 +22,30 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PlatformAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
private SecurityProperties securityProperties;
private AuditLogPersistenterManager auditLogPersistenterManager;
public PlatformAuthenticationSuccessHandler(SecurityProperties securityProperties,AuditLogPersistenterManager auditLogPersistenterManager){
this.securityProperties =securityProperties;
this.auditLogPersistenterManager =auditLogPersistenterManager;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
AuditLogPersistenter logger =auditLogPersistenterManager.getAuditLogPersister();
if(logger!=null){
AuditLog auditLog =new AuditLog();
auditLog.setAction(AuditLogAction.LOGIN.getValue());
auditLog.setExecuteTime(10L);
auditLog.setClassName(UsernamePasswordAuthenticationFilter.class.getName());
auditLog.setMethodName("attemptAuthentication");
auditLog.setHttpMethod("POST");
auditLog.setStatus(AuditLogStatus.SUCCESS.getValue());
auditLog.setUrl(request.getRequestURL().toString());
auditLog.setLoginName(request.getParameter(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_FORM_USERNAME_KEY));
auditLog.setIp(IpUtil.getRemoteIp(request));
logger.log(auditLog);
}
if(HttpServletRequestUtil.isTextHtmlMediaType(request)) {
super.onAuthenticationSuccess(request,response,authentication);
}else{

48
io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java

@ -0,0 +1,48 @@
package io.sc.platform.security.handler;
import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.IpUtil;
import io.sc.platform.security.support.SecurityUser;
import io.sc.platform.security.util.SecurityUtil;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PlatformLogoutSuccessHandler implements LogoutSuccessHandler {
private AuditLogPersistenterManager auditLogPersistenterManager;
public PlatformLogoutSuccessHandler(AuditLogPersistenterManager auditLogPersistenterManager){
this.auditLogPersistenterManager =auditLogPersistenterManager;
}
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
AuditLogPersistenter logger =auditLogPersistenterManager.getAuditLogPersister();
if(logger!=null){
AuditLog auditLog =new AuditLog();
auditLog.setAction(AuditLogAction.LOGOUT.getValue());
auditLog.setExecuteTime(10L);
auditLog.setClassName(LogoutHandler.class.getName());
auditLog.setMethodName("logout");
auditLog.setHttpMethod("POST");
auditLog.setStatus(AuditLogStatus.SUCCESS.getValue());
auditLog.setUrl(request.getRequestURL().toString());
if(authentication!=null && authentication.getPrincipal() instanceof SecurityUser){
auditLog.setLoginName(((SecurityUser)authentication.getPrincipal()).getLoginName());
}
auditLog.setIp(IpUtil.getRemoteIp(request));
logger.log(auditLog);
}
}
}

2
io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java

@ -1,5 +1,7 @@
package io.sc.platform.security.service.impl;
import io.sc.platform.core.annotation.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.security.service.support.*;
import io.sc.platform.security.support.SecurityRole;
import io.sc.platform.security.support.SecurityUser;

2
io.sc.platform.system.frontend/package.json

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.92",
"platform-core": "8.1.94",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

20
io.sc.platform.system.frontend/src/views/corporation/Corporation.vue

@ -5,7 +5,6 @@
<w-grid
ref="corporationTreeGridRef"
:tree="true"
dense-body
:title="$t('system.corporation.grid.title')"
:data-url="Environment.apiContextPath('/api/system/corporation')"
selection="multiple"
@ -20,12 +19,12 @@
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', ['addTop', 'addChild'], 'edit', 'remove', 'separator', 'view']"
:columns="[
{ width: 250, name: 'name', label: $t('name') },
{ name: 'code', label: $t('code') },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() },
{ width: 100, name: 'enable', label: $t('status'), format: Formater.enableTag() },
{ width: '100%', name: 'name', label: $t('name') },
{ width: 150, name: 'code', label: $t('code') },
{ width: 90, name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ width: 100, name: 'lastModifier', label: $t('lastModifier') },
{ width: 110, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() },
{ width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag() },
]"
:editor="{
dialog: {
@ -65,6 +64,13 @@
userGridRef?.refresh();
}
"
@request-data-before="
() => {
console.log('>>>>>');
currentSelectedCorporationCode = '';
userGridRef?.refresh();
}
"
></w-grid>
</div>
</template>

32
io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue

@ -5,10 +5,10 @@
selection="multiple"
:data-url="Environment.apiContextPath('/api/system/monitor/auditlog')"
:query-form-fields="[
{ name: 'code', label: $t('code'), type: 'text' },
{ name: 'message', label: $t('i18nMessage'), type: 'text' },
{ name: 'lang', label: $t('language'), type: 'select' },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), type: 'select' },
{ name: 'status', label: $t('status'), type: 'select', queryOperator: 'equals', options: Options.successFailed() },
{ name: 'action', label: $t('action'), type: 'select', queryOperator: 'equals', options: Options.enum(AuditLogActionEnum) },
{ name: 'loginName', label: $t('loginName'), type: 'text' },
{ name: 'startDate', label: $t('startDate'), type: 'text' },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'view', 'export']"
@ -16,16 +16,14 @@
sortBy: 'startDate',
descending: true,
}"
:checkbox-selection="false"
:columns="[
{ width: 80, name: 'status', label: $t('status'), format: Formater.successTag() },
{
width: 60,
width: 80,
name: 'action',
label: $t('action'),
format: (value) => {
console.log(value);
return value ? AuditLogAction[value] : '';
},
format: Formater.enum(AuditLogActionEnum),
},
{ width: 150, name: 'startDate', label: $t('startDate') },
{ width: 100, name: 'executeTime', label: $t('executeTime') },
@ -82,21 +80,9 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, axios, Formater, Options } from 'platform-core';
const { t } = useI18n();
import { Environment, EnumTools, Formater, Options } from 'platform-core';
const AuditLogAction = {
'io.sc.platform.core.audit.AuditLogAction.ADD': t('io.sc.platform.core.audit.AuditLogAction.ADD'),
'io.sc.platform.core.audit.AuditLogAction.REMOVE': t('io.sc.platform.core.audit.AuditLogAction.REMOVE'),
'io.sc.platform.core.audit.AuditLogAction.UPDATE': t('io.sc.platform.core.audit.AuditLogAction.UPDATE'),
'io.sc.platform.core.audit.AuditLogAction.QUERY': t('io.sc.platform.core.audit.AuditLogAction.QUERY'),
'io.sc.platform.core.audit.AuditLogAction.FIND_ONE': t('io.sc.platform.core.audit.AuditLogAction.FIND_ONE'),
'io.sc.platform.core.audit.AuditLogAction.EXPORT': t('io.sc.platform.core.audit.AuditLogAction.EXPORT'),
'io.sc.platform.core.audit.AuditLogAction.LOGIN': t('io.sc.platform.core.audit.AuditLogAction.LOGIN'),
'io.sc.platform.core.audit.AuditLogAction.LOGOUT': t('io.sc.platform.core.audit.AuditLogAction.LOGOUT'),
};
const AuditLogActionEnum = await EnumTools.fetch('io.sc.platform.core.enums.AuditLogAction');
const auditLogGridRef = ref();
</script>

21
io.sc.platform.system.frontend/src/views/monitor/Log.vue

@ -47,8 +47,6 @@
},
},
]"
:pageable="false"
dense-body
:pagination="{
sortBy: 'startDate',
descending: true,
@ -77,15 +75,15 @@
:data-url="Environment.apiContextPath('/api/monitor/logger/getLogConfigurationLevels')"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'edit']"
dense-body
:checkbox-selection="false"
:pagination="{
sortBy: 'startDate',
descending: true,
sortBy: 'name',
descending: false,
}"
:query-form-fields="[
{ name: 'name', label: $t('name'), type: 'text' },
{ name: 'configuredLevel', label: $t('system.monitor.log.level.entity.configuredLevel'), type: 'select' },
{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select' },
{ name: 'configuredLevel', label: $t('system.monitor.log.level.entity.configuredLevel'), type: 'select', options: Options.enum(LogLevelEnum) },
{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select', options: Options.enum(LogLevelEnum) },
]"
:columns="[
{ width: 700, name: 'name', label: $t('name') },
@ -99,7 +97,9 @@
},
form: {
colsNum: 1,
fields: [{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select' }],
fields: [
{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select', options: Options.enum(LogLevelEnum) },
],
},
}"
>
@ -111,10 +111,9 @@
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, axios } from 'platform-core';
import { Environment, axios, EnumTools, Options } from 'platform-core';
const { t } = useI18n();
const LogLevelEnum = await EnumTools.fetch('io.sc.platform.core.enums.LogLevel');
const selectedTabRef = ref('view');
const logRows = ref(20);

102
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java

@ -7,9 +7,7 @@ import io.sc.platform.core.util.FileUtil;
import io.sc.platform.mvc.support.FileDownloader;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.system.monitor.support.LogFileLastModifyDateComparator;
import io.sc.platform.system.monitor.support.LogFileNameComparator;
import io.sc.platform.system.monitor.support.LogFileSizeComparator;
import io.sc.platform.system.monitor.support.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.logging.LoggersEndpoint;
import org.springframework.boot.actuate.logging.LoggersEndpoint.LoggerLevels;
@ -17,14 +15,16 @@ import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort.Order;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/monitor/logger")
@ -73,7 +73,7 @@ public class LogViewerWebController {
}
}
}
return QueryResult.page(result);
return QueryResult.page(result,queryParameter.getJpaPageable());
}
return QueryResult.emptyPage();
}
@ -88,7 +88,7 @@ public class LogViewerWebController {
if(o==null){
return QueryResult.emptyPage();
}
List<LoggerLevelInfo> result =new ArrayList<LoggerLevelInfo>();
List<LoggerLevelInfo> result =new ArrayList<LoggerLevelInfo>(10000);
if(o instanceof Map){
Map<String, LoggerLevels> map =(Map<String, LoggerLevels>)o;
for(String key : map.keySet()){
@ -96,6 +96,32 @@ public class LogViewerWebController {
result.add(new LoggerLevelInfo(key,loggerLevels.getConfiguredLevel(),"INFO"));
}
}
if(queryParameter!=null){
Order order =queryParameter.getFirstSort();
if(order!=null){
String fieldName =order.getProperty();
boolean asc =order.isAscending();
if("name".equalsIgnoreCase(fieldName)){
if(asc){
result.sort(new LogLevelNameComparator(true));
}else{
result.sort(new LogLevelNameComparator(false));
}
}else if("configuredLevel".equalsIgnoreCase(fieldName)){
if(asc){
result.sort(new LogLevelConfiguredLevelComparator(true));
}else{
result.sort(new LogLevelConfiguredLevelComparator(false));
}
}else if("effectiveLevel".equalsIgnoreCase(fieldName)){
if(asc){
result.sort(new LogLevelEffectiveLevelComparator(true));
}else{
result.sort(new LogLevelEffectiveLevelComparator(false));
}
}
}
}
return QueryResult.page(result,queryParameter.getJpaPageable());
}
@ -111,66 +137,4 @@ public class LogViewerWebController {
Resource resource =new DefaultResourceLoader().getResource("file://" + DirectoryManager.getInstance().getByName("dir.log") + "/" + fileName);
FileDownloader.download(request, response, fileName, resource);
}
public Page<LoggerLevelInfo> findLevelsFromActuator(QueryParameter queryParameter) throws Exception {
Map<String,Object> configurations =loggersEndpoint.loggers();
if(configurations==null){
return QueryResult.emptyPage();
}
Object o =configurations.get("loggers");
if(o==null){
return QueryResult.emptyPage();
}
List<LoggerLevelInfo> result =new ArrayList<LoggerLevelInfo>();
if(o instanceof Map){
Map<String, LoggerLevels> map =(Map<String, LoggerLevels>)o;
for(String key : map.keySet()){
LoggerLevels loggerLevels =map.get(key);
result.add(new LoggerLevelInfo(key,loggerLevels.getConfiguredLevel(),"INFO"));
}
}
return QueryResult.page(result,queryParameter.getJpaPageable());
/*
if(
!StringUtils.hasText(levelInfo.getName())
&& levelInfo.getConfiguredLevel()!=null
&& levelInfo.getEffectiveLevel()!=null
){
return result;
}
//filter
List<LoggerLevelInfo> filter =new ArrayList<LoggerLevelInfo>();
if(StringUtils.hasText(levelInfo.getName())){
for(LoggerLevelInfo info : result){
if(info.getName().toLowerCase().contains(levelInfo.getName().trim().toLowerCase())){
filter.add(info);
}
}
result =filter;
}
filter =new ArrayList<LoggerLevelInfo>();
if(levelInfo.getConfiguredLevel()!=null){
for(LoggerLevelInfo info : result){
if(info.getConfiguredLevel()!=null && info.getConfiguredLevel().equals(levelInfo.getConfiguredLevel())){
filter.add(info);
}
}
result =filter;
}
filter =new ArrayList<LoggerLevelInfo>();
if(levelInfo.getEffectiveLevel()!=null){
for(LoggerLevelInfo info : result){
if(info.getEffectiveLevel()!=null && info.getEffectiveLevel().equals(levelInfo.getEffectiveLevel())){
filter.add(info);
}
}
result =filter;
}
return result;
*/
}
}

25
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelConfiguredLevelComparator.java

@ -0,0 +1,25 @@
package io.sc.platform.system.monitor.support;
import io.sc.platform.core.support.LoggerLevelInfo;
import io.sc.platform.core.util.EnumUtil;
import java.util.Comparator;
public class LogLevelConfiguredLevelComparator implements Comparator<LoggerLevelInfo> {
private boolean asc =true;
public LogLevelConfiguredLevelComparator(){}
public LogLevelConfiguredLevelComparator(boolean asc){
this.asc =asc;
}
@Override
public int compare(LoggerLevelInfo o1, LoggerLevelInfo o2) {
if(asc) {
return EnumUtil.compare(o1.getConfiguredLevel(),o2.getConfiguredLevel());
}else{
return EnumUtil.compare(o2.getConfiguredLevel(),o1.getConfiguredLevel());
}
}
}

24
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelEffectiveLevelComparator.java

@ -0,0 +1,24 @@
package io.sc.platform.system.monitor.support;
import io.sc.platform.core.support.LoggerLevelInfo;
import java.util.Comparator;
public class LogLevelEffectiveLevelComparator implements Comparator<LoggerLevelInfo> {
private boolean asc =true;
public LogLevelEffectiveLevelComparator(){}
public LogLevelEffectiveLevelComparator(boolean asc){
this.asc =asc;
}
@Override
public int compare(LoggerLevelInfo o1, LoggerLevelInfo o2) {
if(asc) {
return o1.getEffectiveLevel().compareTo(o2.getEffectiveLevel());
}else{
return o2.getEffectiveLevel().compareTo(o1.getEffectiveLevel());
}
}
}

26
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelNameComparator.java

@ -0,0 +1,26 @@
package io.sc.platform.system.monitor.support;
import io.sc.platform.core.support.FileWrapper;
import io.sc.platform.core.support.LoggerLevelInfo;
import io.sc.platform.core.util.PinyinUtil;
import java.util.Comparator;
public class LogLevelNameComparator implements Comparator<LoggerLevelInfo> {
private boolean asc =true;
public LogLevelNameComparator(){}
public LogLevelNameComparator(boolean asc){
this.asc =asc;
}
@Override
public int compare(LoggerLevelInfo o1, LoggerLevelInfo o2) {
if(asc) {
return o1.getName().compareTo(o2.getName());
}else{
return o2.getName().compareTo(o1.getName());
}
}
}

5
io.sc.platform.system/src/main/resources/META-INF/platform/plugins/p6spy.json

@ -0,0 +1,5 @@
{
"ignoredPatterns":[
"^insert into sys_audit_log"
]
}
Loading…
Cancel
Save