From a059c9093dca1dfd6165ad5e08530c7921b89e74 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Tue, 30 Jan 2024 08:38:33 +0800 Subject: [PATCH 1/2] update --- gradle.properties | 4 +- io.sc.platform.core.frontend/package.json | 2 +- .../formater/BooleanFormater.ts | 9 +- .../components-ext/formater/EnumFormater.ts | 10 +- .../platform/components-ext/formater/index.ts | 6 +- .../{WEditor.vue => WSelectUserText.vue} | 11 +- .../src/platform/components/index.ts | 3 + .../components/tag/WSuccessFailedTag.vue | 13 ++ .../src/platform/index.ts | 1 + .../src/views/TreeGrid.vue | 100 +++++------ .../template-project/package.json | 4 +- .../template-project/src/views/TreeGrid.vue | 100 +++++------ .../sc/platform/core/support/FileWrapper.java | 35 ++-- .../io/sc/platform/core/i18n/words.properties | 4 +- .../platform/core/i18n/words_tw_CN.properties | 4 +- .../platform/core/i18n/words_zh_CN.properties | 4 +- .../package.json | 6 +- .../src/views/plugin/Menus.vue | 79 ++++++++- .../templates/pgp/app/build.gradle | 4 + .../java/app/platform/Application.java.txt | 3 - .../templates/pgp/setup/build.gradle.txt | 4 +- .../templates/pgp/setup/gradle.properties | 8 +- io.sc.platform.lcdp.frontend/package.json | 6 +- io.sc.platform.mvc.frontend/package.json | 6 +- .../orm/service/support/QueryResult.java | 18 ++ io.sc.platform.security.frontend/package.json | 8 +- io.sc.platform.system.frontend/package.json | 6 +- .../src/i18n/messages.json | 22 ++- .../src/i18n/messages_tw_CN.json | 22 ++- .../src/i18n/messages_zh_CN.json | 24 ++- .../src/views/dictionary/Dictionary.vue | 109 ++++++------ .../src/views/i18n/I18n.vue | 160 +++++++++++------- .../src/views/menu/ImportMenuPluginDialog.vue | 135 +++++++++++++++ .../src/views/menu/Menu.vue | 54 ++++-- .../src/views/monitor/AuditLog.vue | 158 +++++++++-------- .../src/views/monitor/Log.vue | 156 ++++++++--------- .../src/views/parameter/Parameter.vue | 154 +++++++++-------- .../jpa/entity/DictionaryEntity.java | 2 +- .../system/i18n/jpa/entity/I18nEntity.java | 2 +- .../i18n/service/impl/I18nServiceImpl.java | 4 + .../menu/controller/MenuWebController.java | 16 +- .../system/menu/service/MenuService.java | 7 +- .../menu/service/impl/MenuServiceImpl.java | 71 ++------ .../controller/LogViewerWebController.java | 109 +++++++----- .../LogFileLastModifyDateComparator.java | 36 ++++ .../support/LogFileNameComparator.java | 25 +++ .../support/LogFileSizeComparator.java | 38 +++++ .../parameter/jpa/entity/ParameterEntity.java | 2 +- .../system/plugins/PluginManager.java | 1 + .../system/plugins/item/MenuItem.java | 11 ++ 50 files changed, 1139 insertions(+), 637 deletions(-) rename io.sc.platform.core.frontend/src/platform/components/form/elements/{WEditor.vue => WSelectUserText.vue} (92%) create mode 100644 io.sc.platform.core.frontend/src/platform/components/tag/WSuccessFailedTag.vue create mode 100644 io.sc.platform.system.frontend/src/views/menu/ImportMenuPluginDialog.vue create mode 100644 io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileLastModifyDateComparator.java create mode 100644 io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileNameComparator.java create mode 100644 io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileSizeComparator.java diff --git a/gradle.properties b/gradle.properties index 6327bfd0..9bab43b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,9 +36,9 @@ application_version=1.0.0 # platform ########################################################### platform_group=io.sc -platform_version=8.1.20 +platform_version=8.1.22 platform_plugin_version=8.1.13 -platform_core_frontend_version=8.1.83 +platform_core_frontend_version=8.1.88 ########################################################### # dependencies version diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index df67488a..e28fc76e 100644 --- a/io.sc.platform.core.frontend/package.json +++ b/io.sc.platform.core.frontend/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.1.87", + "version": "8.1.92", "description": "前端核心包,用于快速构建前端的脚手架", "//main": "库的主文件", "main": "dist/platform-core.js", diff --git a/io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts b/io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts index 516f8018..3d794ed6 100644 --- a/io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts +++ b/io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts @@ -21,4 +21,11 @@ const enableTagFormater = (value) => { }; }; -export { yesNoFormater, trueFalseFormater, enableTagFormater }; +const successFailedTagFormater = (value) => { + return { + componentType: 'WSuccessFailedTag', + attrs: { success: value }, + }; +}; + +export { yesNoFormater, trueFalseFormater, enableTagFormater, successFailedTagFormater }; diff --git a/io.sc.platform.core.frontend/src/platform/components-ext/formater/EnumFormater.ts b/io.sc.platform.core.frontend/src/platform/components-ext/formater/EnumFormater.ts index 90e1cd7d..6c82d4a3 100644 --- a/io.sc.platform.core.frontend/src/platform/components-ext/formater/EnumFormater.ts +++ b/io.sc.platform.core.frontend/src/platform/components-ext/formater/EnumFormater.ts @@ -1,19 +1,25 @@ import type { OptionItemType } from '@/platform/types'; import { i18n } from '@/platform/plugin'; +import { Tools } from '@/platform/utils'; class EnumFormater { #enumMap = {}; constructor(options: OptionItemType[]) { for (const option of options) { - this.#enumMap[option.value] = option.label; + if (!Tools.isUndefinedOrNull(option.value)) { + this.#enumMap[option.value] = option.label; + } } } public formater() { const enumMap = this.#enumMap; return (value) => { - return i18n.global.t(enumMap[value]); + if (!Tools.isUndefinedOrNull(value)) { + return i18n.global.t(enumMap[value]); + } + return ''; }; } } diff --git a/io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts b/io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts index 6083e4f4..2bf264dd 100644 --- a/io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts +++ b/io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts @@ -1,5 +1,5 @@ import type { EnumType } from '@/platform/types'; -import { yesNoFormater, trueFalseFormater, enableTagFormater } from './BooleanFormater'; +import { yesNoFormater, trueFalseFormater, enableTagFormater, successFailedTagFormater } from './BooleanFormater'; import { dateOnlyFormater } from './DatetimeFormater'; import { menuTypeFormater } from './MenuTypeFormater'; import { EnumFormater } from './EnumFormater'; @@ -11,6 +11,10 @@ class Formater { return enableTagFormater; } + public static successTag() { + return successFailedTagFormater; + } + public static yesNo() { return yesNoFormater; } diff --git a/io.sc.platform.core.frontend/src/platform/components/form/elements/WEditor.vue b/io.sc.platform.core.frontend/src/platform/components/form/elements/WSelectUserText.vue similarity index 92% rename from io.sc.platform.core.frontend/src/platform/components/form/elements/WEditor.vue rename to io.sc.platform.core.frontend/src/platform/components/form/elements/WSelectUserText.vue index b31df7cd..095917a1 100644 --- a/io.sc.platform.core.frontend/src/platform/components/form/elements/WEditor.vue +++ b/io.sc.platform.core.frontend/src/platform/components/form/elements/WSelectUserText.vue @@ -2,18 +2,19 @@
+
@@ -22,7 +23,7 @@ import { ref, computed, defineProps, useAttrs } from 'vue'; import { FormValidators } from '@/platform/components'; -const textareaRef = ref(); +const textRef = ref(); const attrs = useAttrs(); const inRules = attrs.rules; const props = defineProps({ @@ -65,8 +66,8 @@ const rulesComputed = computed(() => { } else if (hideIfComputed.value) { rules = []; } - if (textareaRef?.value) { - textareaRef.value.resetValidation(); + if (textRef?.value) { + textRef.value.resetValidation(); } return rules; }); diff --git a/io.sc.platform.core.frontend/src/platform/components/index.ts b/io.sc.platform.core.frontend/src/platform/components/index.ts index b5d42198..a472af4f 100644 --- a/io.sc.platform.core.frontend/src/platform/components/index.ts +++ b/io.sc.platform.core.frontend/src/platform/components/index.ts @@ -27,6 +27,7 @@ import WInfoPanel from './panel/WInfoPanel.vue'; import WGrid from './grid/WGrid.vue'; import WToolbar from './toolbar/WToolbar.vue'; import WEnableTag from './tag/WEnableTag.vue'; +import WSuccessFailedTag from './tag/WSuccessFailedTag.vue'; export default { install: (app: App) => { @@ -57,6 +58,7 @@ export default { app.component('WGrid', WGrid); app.component('WToolbar', WToolbar); app.component('WEnableTag', WEnableTag); + app.component('WSuccessFailedTag', WSuccessFailedTag); }, }; @@ -83,6 +85,7 @@ export { WGrid, WToolbar, WEnableTag, + WSuccessFailedTag, }; export { PlatformIconEnum } from './utils'; diff --git a/io.sc.platform.core.frontend/src/platform/components/tag/WSuccessFailedTag.vue b/io.sc.platform.core.frontend/src/platform/components/tag/WSuccessFailedTag.vue new file mode 100644 index 00000000..07143f98 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/components/tag/WSuccessFailedTag.vue @@ -0,0 +1,13 @@ + + diff --git a/io.sc.platform.core.frontend/src/platform/index.ts b/io.sc.platform.core.frontend/src/platform/index.ts index c063cd01..9ffed838 100644 --- a/io.sc.platform.core.frontend/src/platform/index.ts +++ b/io.sc.platform.core.frontend/src/platform/index.ts @@ -120,6 +120,7 @@ export { WGrid, WTreeGrid, WEnableTag, + WSuccessFailedTag, } from './components'; export { PlatformIconEnum } from './components'; diff --git a/io.sc.platform.core.frontend/src/views/TreeGrid.vue b/io.sc.platform.core.frontend/src/views/TreeGrid.vue index 16438869..91556376 100644 --- a/io.sc.platform.core.frontend/src/views/TreeGrid.vue +++ b/io.sc.platform.core.frontend/src/views/TreeGrid.vue @@ -1,56 +1,58 @@ - diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 5c4867b9..03654e94 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/io.sc.platform.core.frontend/template-project/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.1.87", + "version": "8.1.92", "description": "前端核心包,用于快速构建前端的脚手架", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.87", + "platform-core": "8.1.92", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", diff --git a/io.sc.platform.core.frontend/template-project/src/views/TreeGrid.vue b/io.sc.platform.core.frontend/template-project/src/views/TreeGrid.vue index 16438869..91556376 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/TreeGrid.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/TreeGrid.vue @@ -1,56 +1,58 @@ - diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/support/FileWrapper.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/support/FileWrapper.java index 21abf486..8ac3c473 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/support/FileWrapper.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/support/FileWrapper.java @@ -1,18 +1,22 @@ package io.sc.platform.core.support; +import io.sc.platform.core.util.StringUtil; + import java.util.Date; public class FileWrapper { private String name; - private Date lastModified; - private String size; + private Date lastModifyDate; + private long size; + private String commaSize; public FileWrapper(){} - public FileWrapper(String name,Date lastModified,String size){ + public FileWrapper(String name,Date lastModifyDate,long size){ this.name =name; - this.lastModified =lastModified; + this.lastModifyDate =lastModifyDate; this.size =size; + this.commaSize = StringUtil.commaStyle(size); } public String getName() { @@ -21,16 +25,27 @@ public class FileWrapper { public void setName(String name) { this.name = name; } - public Date getLastModified() { - return lastModified; + + public Date getLastModifyDate() { + return lastModifyDate; } - public void setLastModified(Date lastModified) { - this.lastModified = lastModified; + + public void setLastModifyDate(Date lastModifyDate) { + this.lastModifyDate = lastModifyDate; } - public String getSize() { + + public long getSize() { return size; } - public void setSize(String size) { + public void setSize(long size) { this.size = size; } + + public String getCommaSize() { + return commaSize; + } + + public void setCommaSize(String commaSize) { + this.commaSize = commaSize; + } } diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties index 2016f8a8..e0e52932 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties @@ -115,6 +115,7 @@ query=Query redirect=Redirect refresh=Refresh remove=Remove +removeAll=Remove All reset=Reset restore=Restore reverse=Reverse @@ -156,4 +157,5 @@ confirmNewPassword=Confirm New Password accountExpired=Expired accountLocked=Locked credentialsExpired=Credentials Expired -javascript=JavaScript +icon=Icon +i18nMessage=I18N Message \ No newline at end of file diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties index 710b8fa5..3db413c9 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties @@ -115,6 +115,7 @@ query=\u67E5\u8A62 redirect=\u91CD\u5B9A\u5411 refresh=\u5237\u65B0 remove=\u79FB\u9664 +removeAll=\u79FB\u9664\u6240\u6709 reset=\u91CD\u7F6E restore=\u6062\u5FA9 reverse=\u53CD\u8F49 @@ -156,4 +157,5 @@ confirmNewPassword=\u78BA\u8A8D\u65B0\u5BC6\u78BC accountExpired=\u904E\u671F accountLocked=\u9396\u5B9A credentialsExpired=\u5BC6\u78BC\u904E\u671F -javascript=JavaScript +icon=\u5716\u6A19 +i18nMessage=\u591A\u8A9E\u8A00\u6D88\u606F \ No newline at end of file diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties index 2e8421c3..552d2ffb 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties @@ -115,6 +115,7 @@ query=\u67E5\u8BE2 redirect=\u91CD\u5B9A\u5411 refresh=\u5237\u65B0 remove=\u79FB\u9664 +removeAll=\u79FB\u9664\u6240\u6709 reset=\u91CD\u7F6E restore=\u6062\u590D reverse=\u53CD\u8F6C @@ -156,4 +157,5 @@ confirmNewPassword=\u786E\u8BA4\u65B0\u5BC6\u7801 accountExpired=\u8FC7\u671F accountLocked=\u9501\u5B9A credentialsExpired=\u5BC6\u7801\u8FC7\u671F -javascript=JavaScript \ No newline at end of file +icon=\u56FE\u6807 +i18nMessage=\u591A\u8BED\u8A00\u6D88\u606F \ No newline at end of file diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index 7fe8487f..cf550c11 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.developer.frontend", - "version": "8.1.20", + "version": "8.1.22", "description": "", "private": false, "keywords": [], @@ -78,7 +78,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.83", + "platform-core": "8.1.88", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", @@ -100,4 +100,4 @@ "codemirror": "6.0.1", "vue-codemirror6": "1.2.0" } -} +} \ No newline at end of file diff --git a/io.sc.platform.developer.frontend/src/views/plugin/Menus.vue b/io.sc.platform.developer.frontend/src/views/plugin/Menus.vue index 27af1444..752ddac4 100644 --- a/io.sc.platform.developer.frontend/src/views/plugin/Menus.vue +++ b/io.sc.platform.developer.frontend/src/views/plugin/Menus.vue @@ -1,4 +1,79 @@ - + diff --git a/io.sc.platform.gradle/templates/pgp/app/build.gradle b/io.sc.platform.gradle/templates/pgp/app/build.gradle index cd2ddcf8..e6e470a4 100644 --- a/io.sc.platform.gradle/templates/pgp/app/build.gradle +++ b/io.sc.platform.gradle/templates/pgp/app/build.gradle @@ -13,7 +13,11 @@ dependencies { implementation ( project(":io.sc.platform.app"), project(":io.sc.platform.developer"), + + //project(":io.sc.platform.job.core"), + //project(":io.sc.platform.job.executor"), //project(":io.sc.platform.job.manager"), + ) } diff --git a/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt b/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt index de40ec3f..e8a7f8e9 100644 --- a/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt +++ b/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt @@ -2,12 +2,9 @@ package app.platform; import io.sc.platform.core.ApplicationLauncher; import io.sc.platform.core.PlatformSpringBootServletInitializer; -import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.WebApplicationInitializer; -import java.sql.Types; - /** * 应用程序入口 */ diff --git a/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt b/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt index 655059bd..04bd9898 100644 --- a/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt +++ b/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt @@ -371,8 +371,6 @@ subprojects { * pnpm sync *----------------------------------------------------------------*/ task frontendNpmSync(type:Exec){ - commandLine 'cd', '.' - /* if(isFrontendProject(file('.')) && !project.name.contains("io.sc.platform.security.frontend")){ workingDir '.' if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ @@ -386,7 +384,7 @@ subprojects { }else{ commandLine 'cd', '.' } - }*/ + } } tasks.frontendNpmSync.doFirst { if(isFrontendProject(file('.'))) { diff --git a/io.sc.platform.gradle/templates/pgp/setup/gradle.properties b/io.sc.platform.gradle/templates/pgp/setup/gradle.properties index 7a5cf595..9bab43b1 100644 --- a/io.sc.platform.gradle/templates/pgp/setup/gradle.properties +++ b/io.sc.platform.gradle/templates/pgp/setup/gradle.properties @@ -36,9 +36,9 @@ application_version=1.0.0 # platform ########################################################### platform_group=io.sc -platform_version=8.1.19 +platform_version=8.1.22 platform_plugin_version=8.1.13 -platform_core_frontend_version=8.1.45 +platform_core_frontend_version=8.1.88 ########################################################### # dependencies version @@ -50,6 +50,7 @@ cxf_version=3.2.7 dm_hibernate_version=8.1.2.192 flowable_version=6.8.0 guava_version=31.1-jre +ipaddress_version=5.4.0 jackson_version=2.13.5 jasypt_version=2.1.2 jboss_logging_version=3.3.2.Final @@ -64,6 +65,7 @@ mybatis_version=3.5.10 opencsv_version=5.7.1 oshi_version=6.4.2 p6spy_version=3.9.1 +pinyin4j_version=2.5.1 poi_ooxml_version=3.17 schemacrawler_version=16.19.11 #schemacrawler_version=14.21.02 @@ -71,7 +73,7 @@ spring_boot_version=2.7.18 spring_cloud_alibaba_version=2021.0.4.0 spring_cloud_context_version=3.1.4 spring_cloud_version=2021.0.8 -spring_security_oauth2_authorization_server_version=0.4.4 +spring_security_oauth2_authorization_server_version=0.4.5 spring_statemachine_version=3.2.1 webjars_locator_weblogic_version=0.10 zip4j_version=2.11.5 diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index 9a5ea6ae..7e175caa 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.lcdp.frontend", - "version": "8.1.20", + "version": "8.1.22", "description": "", "private": false, "keywords": [], @@ -91,7 +91,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.83", + "platform-core": "8.1.88", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", @@ -100,4 +100,4 @@ "vue-router": "4.2.5", "vue-codemirror6": "1.2.0" } -} +} \ No newline at end of file diff --git a/io.sc.platform.mvc.frontend/package.json b/io.sc.platform.mvc.frontend/package.json index 7f39f5e9..019551f0 100644 --- a/io.sc.platform.mvc.frontend/package.json +++ b/io.sc.platform.mvc.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.mvc.frontend", - "version": "8.1.20", + "version": "8.1.22", "description": "", "private": false, "keywords": [], @@ -78,7 +78,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.83", + "platform-core": "8.1.88", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", @@ -100,4 +100,4 @@ "codemirror": "6.0.1", "vue-codemirror6": "1.2.0" } -} +} \ No newline at end of file diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java index faa34eb9..ce908a88 100644 --- a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java +++ b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java @@ -2,7 +2,9 @@ package io.sc.platform.orm.service.support; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -23,4 +25,20 @@ public class QueryResult { return new PageImpl(Collections.emptyList()); } } + + public static Page page(List list, Pageable pageable){ + if(list!=null && !list.isEmpty()) { + int page =pageable.getPageNumber(); + int pageSize =pageable.getPageSize(); + int total =list.size(); + int first =pageSize * page; + List result =new ArrayList<>(); + for(int i=first;i(result,pageable,total); + }else{ + return new PageImpl(Collections.emptyList()); + } + } } diff --git a/io.sc.platform.security.frontend/package.json b/io.sc.platform.security.frontend/package.json index 0d1438eb..5ff4acca 100644 --- a/io.sc.platform.security.frontend/package.json +++ b/io.sc.platform.security.frontend/package.json @@ -1,10 +1,10 @@ { "name": "io.sc.platform.security.frontend", - "version": "8.1.20", + "version": "8.1.22", "description": "", "private": false, "keywords": [ - + ], "author": "", "license": "ISC", @@ -99,6 +99,6 @@ "vue-dompurify-html": "5.0.1", "vue-i18n": "9.8.0", "vue-router": "4.2.5", - "platform-core": "8.1.83" + "platform-core": "8.1.88" } -} +} \ No newline at end of file diff --git a/io.sc.platform.system.frontend/package.json b/io.sc.platform.system.frontend/package.json index 8fcc549d..1677d3e3 100644 --- a/io.sc.platform.system.frontend/package.json +++ b/io.sc.platform.system.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.system.frontend", - "version": "8.1.20", + "version": "8.1.22", "description": "", "private": false, "keywords": [], @@ -78,7 +78,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.87", + "platform-core": "8.1.92", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", @@ -100,4 +100,4 @@ "codemirror": "6.0.1", "vue-codemirror6": "1.2.0" } -} +} \ No newline at end of file diff --git a/io.sc.platform.system.frontend/src/i18n/messages.json b/io.sc.platform.system.frontend/src/i18n/messages.json index d57403c5..274ecdbd 100644 --- a/io.sc.platform.system.frontend/src/i18n/messages.json +++ b/io.sc.platform.system.frontend/src/i18n/messages.json @@ -51,6 +51,8 @@ "system.shared.selectMenu.grid.toolbar.save":"Save", "system.shared.selectMenu.grid.toolbar.save.tip":"Are you sure to update menus?", + "system.shared.importMenuPlugin.dialog.title": "Import Menu Plugins", + "system.corporation.grid.title":"Corporation Tree", "system.corporation.grid.toolbar.addTop":"Add Top Corporation", "system.corporation.grid.toolbar.addChild":"Add Child Corporation", @@ -66,19 +68,29 @@ "system.role.grid.title":"Role List", "system.org.grid.title":"Organization Tree", - "system.org.grid.toolbar.addTop":"Add Top Org", - "system.org.grid.toolbar.addChild":"Add Child Org", "system.menu.grid.title":"Menu Tree", - "system.menu.grid.toolbar.addTop":"Add Top Menu", - "system.menu.grid.toolbar.addChild":"Add Child Menu", "system.menu.grid.entity.titleI18nKey":"Title i18n Key", - "system.menu.grid.entity.routeName":"Title i18n Key", + "system.menu.grid.entity.javaScript":"JavaScript", + "system.menu.grid.entity.routeName":"Route Name", + "system.menu.grid.entity.routeQuery":"Route Query", + "system.menu.grid.entity.url":"URL", + "system.menu.grid.entity.urlOpenType":"URL Open Type", "system.announcementManager.grid.title":"Announcement List", "system.notification.grid.title":"Messages List", + "system.i18n.grid.toolbar.removeAll.tip":"Are you sure to remove ALL i18n messages?", + "system.i18n.grid.toolbar.importAll.tip":"Are you sure to import ALL i18n messages?", + + "system.monitor.log.viewer.logRows":"The Last Row Count of Log File", + "system.monitor.log.viewer.autoRefresh":"Auto Refresh(1 / 2 sec, stop after 300 times auto refreshed)", + "system.monitor.log.viewer.action.refreshNow":"Refresh", + "system.monitor.log.download.grid.title":"Log File List", + "system.monitor.log.level.grid.title":"Log Level List", + "system.monitor.log.level.entity.configuredLevel":"Configured", + "system.monitor.log.level.entity.effectiveLevel":"Effective", "system.monitor.log.tab.view":"Log View", "system.monitor.log.tab.download":"Log Download", diff --git a/io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json b/io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json index 3b8e8573..d7f612ed 100644 --- a/io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json +++ b/io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json @@ -87,17 +87,35 @@ "system.shared.selectMenu.grid.toolbar.save":"保存", "system.shared.selectMenu.grid.toolbar.save.tip":"您确定要更新菜單吗?", + "system.shared.importMenuPlugin.dialog.title": "導入菜單插件", + "system.announcement.gridTitle":"公告列表", "system.monitor.auditlog.gridTitle":"審計日誌列表", - "system.menu.action.addTop":"新增頂級菜單", - "system.menu.action.addChild":"新增子菜單", + "system.menu.grid.title":"菜單樹", + "system.menu.grid.entity.titleI18nKey":"標題多語言消息鍵", + "system.menu.grid.entity.javaScript":"JavaScript", + "system.menu.grid.entity.routeName":"路由名稱", + "system.menu.grid.entity.routeQuery":"路由查詢參數", + "system.menu.grid.entity.url":"URL", + "system.menu.grid.entity.urlOpenType":"URL 打開方式", "system.announcementManager.grid.title":"公告列表", "system.notification.grid.title":"消息列表", + "system.i18n.grid.toolbar.removeAll.tip":"您確定要刪除所有多語言消息嗎?", + "system.i18n.grid.toolbar.importAll.tip":"您確定要所導入所有多語言消息嗎?", + + "system.monitor.log.viewer.logRows":"顯示日誌文件最後行數", + "system.monitor.log.viewer.autoRefresh":"自動刷新(頻率:1次/2秒,超過 300 次后停止自動刷新)", + "system.monitor.log.viewer.action.refreshNow":"刷新", + "system.monitor.log.download.grid.title":"日誌文件列表", + "system.monitor.log.level.grid.title":"日誌級別列表", + "system.monitor.log.level.entity.configuredLevel":"配置級別", + "system.monitor.log.level.entity.effectiveLevel":"生效級別", + "system.corporation.action.addTop":"新增頂級法人", "system.corporation.action.addChild":"新增子法人", diff --git a/io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json b/io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json index 2a6915d1..9661e87f 100644 --- a/io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json +++ b/io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json @@ -51,6 +51,8 @@ "system.shared.selectMenu.grid.toolbar.save":"保存", "system.shared.selectMenu.grid.toolbar.save.tip":"您确定要更新菜单吗?", + "system.shared.importMenuPlugin.dialog.title": "导入菜单插件", + "system.corporation.grid.title":"法人树", "system.corporation.grid.toolbar.addTop":"新增顶级法人", "system.corporation.grid.toolbar.addChild":"新增子法人", @@ -66,18 +68,30 @@ "system.role.grid.title":"角色列表", "system.org.grid.title":"机构树", - "system.org.grid.toolbar.addTop":"新增顶级机构", - "system.org.grid.toolbar.addChild":"新增子机构", "system.menu.grid.title":"菜单树", - "system.menu.grid.toolbar.addTop":"新增顶级菜单", - "system.menu.grid.toolbar.addChild":"新增子菜单", + "system.menu.grid.entity.titleI18nKey":"标题多语言消息键", + "system.menu.grid.entity.javaScript":"JavaScript", + "system.menu.grid.entity.routeName":"路由名称", + "system.menu.grid.entity.routeQuery":"路由查询参数", + "system.menu.grid.entity.url":"URL", + "system.menu.grid.entity.urlOpenType":"URL 打开方式", "system.announcementManager.grid.title":"公告列表", "system.notification.grid.title":"消息列表", - + "system.i18n.grid.toolbar.removeAll.tip":"您确定要删除所有多语言消息吗?", + "system.i18n.grid.toolbar.importAll.tip":"您确定要导入所有多语言消息吗?", + + + "system.monitor.log.viewer.logRows":"显示日志文件最后行数", + "system.monitor.log.viewer.autoRefresh":"自动刷新(频率:1次/2秒,超过 300 次后停止自动刷新)", + "system.monitor.log.viewer.action.refreshNow":"刷新", + "system.monitor.log.download.grid.title":"日志文件列表", + "system.monitor.log.level.grid.title":"日志级别列表", + "system.monitor.log.level.entity.configuredLevel":"配置级别", + "system.monitor.log.level.entity.effectiveLevel":"生效级别", "system.announcement.gridTitle":"公告列表", "system.monitor.auditlog.gridTitle":"审计日志列表", diff --git a/io.sc.platform.system.frontend/src/views/dictionary/Dictionary.vue b/io.sc.platform.system.frontend/src/views/dictionary/Dictionary.vue index 28bd4a66..5940c582 100644 --- a/io.sc.platform.system.frontend/src/views/dictionary/Dictionary.vue +++ b/io.sc.platform.system.frontend/src/views/dictionary/Dictionary.vue @@ -1,62 +1,63 @@ diff --git a/io.sc.platform.system.frontend/src/views/menu/ImportMenuPluginDialog.vue b/io.sc.platform.system.frontend/src/views/menu/ImportMenuPluginDialog.vue new file mode 100644 index 00000000..a162985e --- /dev/null +++ b/io.sc.platform.system.frontend/src/views/menu/ImportMenuPluginDialog.vue @@ -0,0 +1,135 @@ + + diff --git a/io.sc.platform.system.frontend/src/views/menu/Menu.vue b/io.sc.platform.system.frontend/src/views/menu/Menu.vue index a2f850cf..9fafbed5 100644 --- a/io.sc.platform.system.frontend/src/views/menu/Menu.vue +++ b/io.sc.platform.system.frontend/src/views/menu/Menu.vue @@ -34,7 +34,10 @@ { name: 'import', label: $t('import'), - click: () => {}, + icon: 'bi-arrow-right-circle', + click: () => { + importMenuPluginDialogRef.open(); + }, }, 'separator', 'view', @@ -44,7 +47,7 @@ { width: '100%', name: 'titleI18nKey', - label: $t('name'), + label: $t('system.menu.grid.entity.titleI18nKey'), sortable: false, format: (value, row) => { if (row.type === 'SEPARATOR') { @@ -66,33 +69,57 @@ :editor="{ dialog: { width: '600px', - height: '550px', + height: '450px', }, form: { colsNum: 1, fields: [ - { name: 'type', label: $t('type'), type: 'select', required: true, options: Options.enum(MenuTypeEnum, false) }, - { name: 'titleI18nKey', label: $t('titleI18nKey'), type: 'text', required: true }, + { name: 'type', label: $t('type'), type: 'select', required: true, options: Options.enum(MenuTypeEnum, false), defaultValue: 'GROUP' }, + { name: 'titleI18nKey', label: $t('system.menu.grid.entity.titleI18nKey'), type: 'text', required: true }, { name: 'icon', label: $t('icon'), type: 'text' }, { name: 'enable', label: $t('enable'), type: 'checkbox', defaultValue: true }, { name: 'order', label: $t('order'), type: 'text' }, { name: 'javaScript', - label: $t('javascript'), + label: $t('system.menu.grid.entity.javaScript'), + type: 'textarea', + showIf: (form) => { + return form.getFieldValue('type') === 'JAVASCRIPT'; + }, + }, + { + name: 'routeName', + label: $t('system.menu.grid.entity.routeName'), type: 'text', - enableIf: (row) => { - console.log(row); + showIf: (form) => { + return form.getFieldValue('type') === 'ROUTE'; + }, + }, + { + name: 'routeQuery', + label: $t('system.menu.grid.entity.routeQuery'), + type: 'text', + showIf: (form) => { + return form.getFieldValue('type') === 'ROUTE'; + }, + }, + { + name: 'url', + label: $t('url'), + type: 'text', + showIf: (form) => { + return form.getFieldValue('type') === 'URL'; }, }, - { name: 'routeName', label: $t('routeName'), type: 'text' }, - { name: 'routeQuery', label: $t('routeQuery'), type: 'text' }, - { name: 'url', label: $t('url'), type: 'text' }, { name: 'urlOpenType', - label: $t('urlOpenType'), + label: $t('system.menu.grid.entity.urlOpenType'), type: 'select', options: Options.enum(UrlOpenTypeEnum, false), defaultValue: 'NEW_WINDOW', + showIf: (form) => { + return form.getFieldValue('type') === 'URL'; + }, }, ], }, @@ -167,6 +194,7 @@ + @@ -177,6 +205,7 @@ import { ref } from 'vue'; import { Environment, axios, EnumTools, Formater, Options } from 'platform-core'; import SelectRoleGrid from '../shared/SelectRoleGrid.vue'; import SelectOrgTreeGrid from '../shared/SelectOrgTreeGrid.vue'; +import ImportMenuPluginDialog from './ImportMenuPluginDialog.vue'; import AddTopMenuDialog from './AddTopMenuDialog.vue'; import AddMenuDialog from './AddMenuDialog.vue'; import EditMenuDialog from './EditMenuDialog.vue'; @@ -189,6 +218,7 @@ console.log(Options.enum(UrlOpenTypeEnum, false)); const menuTreeGridRef = ref(); const roleGridRef = ref(); const orgTreeGridRef = ref(); +const importMenuPluginDialogRef = ref(); const selectedTabRef = ref('role'); const currentSelectedMenuId = ref(''); diff --git a/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue b/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue index 2eb7e4c5..309ff0e4 100644 --- a/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue +++ b/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue @@ -1,39 +1,93 @@ diff --git a/io.sc.platform.system.frontend/src/views/monitor/Log.vue b/io.sc.platform.system.frontend/src/views/monitor/Log.vue index 73132ca9..3f827028 100644 --- a/io.sc.platform.system.frontend/src/views/monitor/Log.vue +++ b/io.sc.platform.system.frontend/src/views/monitor/Log.vue @@ -3,21 +3,21 @@ - +
- +
- +
- +
@@ -27,43 +27,90 @@
- - + - - +
diff --git a/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue b/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue index 73070a5d..7f470f60 100644 --- a/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue +++ b/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue @@ -1,73 +1,91 @@ diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/dictionary/jpa/entity/DictionaryEntity.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/dictionary/jpa/entity/DictionaryEntity.java index e0a297d4..a17b1c23 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/dictionary/jpa/entity/DictionaryEntity.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/dictionary/jpa/entity/DictionaryEntity.java @@ -47,7 +47,7 @@ public class DictionaryEntity extends CorporationAuditorEntity { @Override public DictionaryVo toVo() { DictionaryVo vo =new DictionaryVo(); - CorporationAuditorEntity.toVo(vo,this); + super.toVo(vo); vo.setId(this.getId()); vo.setCode(this.getCode()); vo.setValue(this.getValue()); diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/jpa/entity/I18nEntity.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/jpa/entity/I18nEntity.java index 4779d7cc..4115ad0d 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/jpa/entity/I18nEntity.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/jpa/entity/I18nEntity.java @@ -52,7 +52,7 @@ public class I18nEntity extends CorporationAuditorEntity { @Override public I18nVo toVo() { I18nVo vo =new I18nVo(); - CorporationAuditorEntity.toVo(vo,this); + super.toVo(vo); vo.setId(this.getId()); vo.setCode(this.getCode()); vo.setLang(this.getLang().toString()); diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/service/impl/I18nServiceImpl.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/service/impl/I18nServiceImpl.java index 805351b0..7d2f8845 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/service/impl/I18nServiceImpl.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/i18n/service/impl/I18nServiceImpl.java @@ -42,6 +42,10 @@ public class I18nServiceImpl extends DaoServiceImpl map) throws Exception{ - service.addMenu(map); - } - - @PostMapping("updateMenu") - public void updateMenu(@RequestBody Map map) throws Exception{ - service.updateMenu(map); - } - /** * 列出所有菜单树,并且将角色所拥有的菜单列表作出标记 * @param roleId 角色ID @@ -157,6 +148,11 @@ public class MenuWebController extends RestCrudController getAllMenuPlugins() throws Exception{ + return service.getAllMenuPlugins(); + } + /** * 将菜单插件导入到菜单表中 * @param pluginIds 需要导入的菜单插件ID集合 diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/MenuService.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/MenuService.java index a31abfa6..5c8bfdef 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/MenuService.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/MenuService.java @@ -7,16 +7,12 @@ import io.sc.platform.system.api.menu.MenuVo; import io.sc.platform.system.menu.jpa.entity.MenuEntity; import io.sc.platform.system.menu.jpa.repository.MenuRepository; import io.sc.platform.system.org.jpa.entity.OrgEntity; +import io.sc.platform.system.plugins.item.MenuItem; import java.util.List; import java.util.Map; public interface MenuService extends DaoService { - public void addMenu(Map map) throws Exception; - - public void updateMenu(Map map) throws Exception; - - public List getMenusByUser(String userId) throws Exception; @@ -91,6 +87,7 @@ public interface MenuService extends DaoService wrapper) throws Exception; + public List getAllMenuPlugins() throws Exception; /** * 导入菜单插件 * @param pluginIds 需要导入的菜单插件ID集合 diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/impl/MenuServiceImpl.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/impl/MenuServiceImpl.java index e7b2b25e..79a6f4fd 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/impl/MenuServiceImpl.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/menu/service/impl/MenuServiceImpl.java @@ -38,63 +38,6 @@ public class MenuServiceImpl extends DaoServiceImpl treeBuilder =new MenuEntityTreeBuilder(); @Autowired private JdbcTemplate jdbcTemplate; - @Transactional - public void addMenu(Map map) throws Exception{ - String parentId =map.get("parentId"); - if(!StringUtils.hasText(parentId)){ - MenuGroupEntity entity = new MenuGroupEntity(); - entity.setName(map.get("name")); - entity.setTitleI18nKey(map.get("name")); - entity.setIcon(map.get("icon")); - entity.setEnable(Boolean.parseBoolean(map.get("enable"))); - entity.setOrder(Integer.parseInt(map.get("order"))); - this.add(entity); - return; - } - - MenuEntity parentEntity =this.findById(parentId); - if(parentEntity!=null && parentEntity instanceof MenuGroupEntity) { - MenuGroupEntity parent = (MenuGroupEntity) parentEntity; - MenuRouteEntity entity = new MenuRouteEntity(); - entity.setName(map.get("name")); - entity.setTitleI18nKey(map.get("name")); - entity.setIcon(map.get("icon")); - entity.setEnable(Boolean.parseBoolean(map.get("enable"))); - entity.setOrder(Integer.parseInt(map.get("order"))); - entity.setRouteName(map.get("routeName")); - String routeQuery =map.get("routeQuery"); - if(StringUtils.hasText(routeQuery)) { - entity.setRouteQuery(ObjectMapper4Json.getMapper().readValue(map.get("routeQuery"), new TypeReference>() {})); - } - entity.setParent(parent); - this.add(entity); - } - } - - @Transactional - public void updateMenu(Map map) throws Exception{ - String id =map.get("id"); - if(StringUtils.hasText(id)){ - MenuEntity menuEntity =this.findById(id); - if(menuEntity!=null && menuEntity instanceof MenuRouteEntity) { - MenuRouteEntity entity = (MenuRouteEntity) menuEntity; - entity.setName(map.get("name")); - entity.setTitleI18nKey(map.get("name")); - entity.setIcon(map.get("icon")); - entity.setEnable(Boolean.parseBoolean(map.get("enable"))); - entity.setOrder(Integer.parseInt(map.get("order"))); - entity.setRouteName(map.get("routeName")); - String routeQuery = map.get("routeQuery"); - System.out.println(routeQuery); - if (StringUtils.hasText(routeQuery)) { - entity.setRouteQuery(ObjectMapper4Json.getMapper().readValue(routeQuery, new TypeReference>() { - })); - } - repository.save(entity); - } - } - } - @Override public List getMenusByUser(String userId) throws Exception { if(!StringUtils.hasText(userId)){ @@ -375,6 +318,20 @@ public class MenuServiceImpl extends DaoServiceImpl getAllMenuPlugins() throws Exception { + List result =PluginManager.getInstance().getMenuItems(); + if(result!=null && !result.isEmpty()){ + result.sort(new Comparator() { + @Override + public int compare(MenuItem o1, MenuItem o2) { + return o1.getOrder()-o2.getOrder(); + } + }); + } + return result; + } + @Override public List getAllMenus() { List entities =jdbcTemplate.query("select * from SYS_MENU where ENABLE_=1 order by ORDER_",new MenuEntityMapper()); diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java index 81c5185f..bbd8b1ab 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java @@ -1,16 +1,22 @@ package io.sc.platform.system.monitor.controller; import io.sc.platform.core.DirectoryManager; +import io.sc.platform.core.support.FileWrapper; import io.sc.platform.core.support.LoggerLevelInfo; import io.sc.platform.core.util.FileUtil; -import io.sc.platform.core.util.StringUtil; 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 org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.logging.LoggersEndpoint; +import org.springframework.boot.actuate.logging.LoggersEndpoint.LoggerLevels; 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.*; @@ -32,23 +38,65 @@ public class LogViewerWebController { } @GetMapping("getLogFiles") - public Page getLogFiles() throws IOException { + public Page getLogFiles(QueryParameter queryParameter) throws IOException { File dir =new File(DirectoryManager.getInstance().getByName("dir.log")); File[] files =dir.listFiles(); if(files!=null && files.length>0){ List result =new ArrayList(); for(File file : files){ - FileWrapper wrapper =new FileWrapper(file.getName(),new Date(file.lastModified()), StringUtil.commaStyle(file.length())); + FileWrapper wrapper =new FileWrapper(file.getName(),new Date(file.lastModified()), file.length()); result.add(wrapper); } + 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 LogFileNameComparator(true)); + }else{ + result.sort(new LogFileNameComparator(false)); + } + }else if("size".equalsIgnoreCase(fieldName)){ + if(asc){ + result.sort(new LogFileSizeComparator(true)); + }else{ + result.sort(new LogFileSizeComparator(false)); + } + }else if("lastModifyDate".equalsIgnoreCase(fieldName)){ + if(asc){ + result.sort(new LogFileLastModifyDateComparator(true)); + }else{ + result.sort(new LogFileLastModifyDateComparator(false)); + } + } + } + } return QueryResult.page(result); } return QueryResult.emptyPage(); } @GetMapping("getLogConfigurationLevels") - public Page getLogConfigurationLevels(LoggerLevelInfo levelInfo) throws Exception{ - return QueryResult.page(findLevelsFromActuator(levelInfo)); + public Page getLogConfigurationLevels(QueryParameter queryParameter) throws Exception{ + Map configurations =loggersEndpoint.loggers(); + if(configurations==null){ + return QueryResult.emptyPage(); + } + Object o =configurations.get("loggers"); + if(o==null){ + return QueryResult.emptyPage(); + } + List result =new ArrayList(); + if(o instanceof Map){ + Map map =(Map)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()); } /** @@ -64,61 +112,26 @@ public class LogViewerWebController { FileDownloader.download(request, response, fileName, resource); } - - private static class FileWrapper{ - private String name; - private Date lastModifyDate; - private String size; - - public FileWrapper(String name,Date lastModifyDate,String size){ - this.name =name; - this.lastModifyDate =lastModifyDate; - this.size =size; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getLastModifyDate() { - return lastModifyDate; - } - - public void setLastModifyDate(Date lastModifyDate) { - this.lastModifyDate = lastModifyDate; - } - - public String getSize() { - return size; - } - - public void setSize(String size) { - this.size = size; - } - } - - public List findLevelsFromActuator(LoggerLevelInfo levelInfo) throws Exception { + public Page findLevelsFromActuator(QueryParameter queryParameter) throws Exception { Map configurations =loggersEndpoint.loggers(); if(configurations==null){ - return Collections.emptyList(); + return QueryResult.emptyPage(); } Object o =configurations.get("loggers"); if(o==null){ - return Collections.emptyList(); + return QueryResult.emptyPage(); } List result =new ArrayList(); if(o instanceof Map){ - Map map =(Map)o; + Map map =(Map)o; for(String key : map.keySet()){ - LoggersEndpoint.LoggerLevels loggerLevels =map.get(key); + 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 @@ -157,5 +170,7 @@ public class LogViewerWebController { result =filter; } return result; + + */ } } diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileLastModifyDateComparator.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileLastModifyDateComparator.java new file mode 100644 index 00000000..36d9214c --- /dev/null +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileLastModifyDateComparator.java @@ -0,0 +1,36 @@ +package io.sc.platform.system.monitor.support; + +import io.sc.platform.core.support.FileWrapper; + +import java.util.Comparator; + +public class LogFileLastModifyDateComparator implements Comparator { + private boolean asc =true; + + public LogFileLastModifyDateComparator(){} + + public LogFileLastModifyDateComparator(boolean asc){ + this.asc =asc; + } + + @Override + public int compare(FileWrapper o1, FileWrapper o2) { + if(asc) { + if(o1.getLastModifyDate().getTime()>o2.getLastModifyDate().getTime()){ + return 1; + }else if(o1.getLastModifyDate().getTime()==o2.getLastModifyDate().getTime()){ + return 0; + }else{ + return -1; + } + }else{ + if(o2.getLastModifyDate().getTime()>o1.getLastModifyDate().getTime()){ + return 1; + }else if(o2.getLastModifyDate().getTime()==o1.getLastModifyDate().getTime()){ + return 0; + }else{ + return -1; + } + } + } +} diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileNameComparator.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileNameComparator.java new file mode 100644 index 00000000..b002313e --- /dev/null +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileNameComparator.java @@ -0,0 +1,25 @@ +package io.sc.platform.system.monitor.support; + +import io.sc.platform.core.support.FileWrapper; +import io.sc.platform.core.util.PinyinUtil; + +import java.util.Comparator; + +public class LogFileNameComparator implements Comparator { + private boolean asc =true; + + public LogFileNameComparator(){} + + public LogFileNameComparator(boolean asc){ + this.asc =asc; + } + + @Override + public int compare(FileWrapper o1, FileWrapper o2) { + if(asc) { + return PinyinUtil.compare(o1.getName(), o2.getName()); + }else{ + return PinyinUtil.compare(o2.getName(), o1.getName()); + } + } +} diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileSizeComparator.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileSizeComparator.java new file mode 100644 index 00000000..f5295d34 --- /dev/null +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogFileSizeComparator.java @@ -0,0 +1,38 @@ +package io.sc.platform.system.monitor.support; + +import io.sc.platform.core.support.FileWrapper; +import io.sc.platform.core.util.PinyinUtil; +import io.sc.platform.system.api.org.OrgVo; + +import java.util.Comparator; + +public class LogFileSizeComparator implements Comparator { + private boolean asc =true; + + public LogFileSizeComparator(){} + + public LogFileSizeComparator(boolean asc){ + this.asc =asc; + } + + @Override + public int compare(FileWrapper o1, FileWrapper o2) { + if(asc) { + if(o1.getSize()>o2.getSize()){ + return 1; + }else if(o1.getSize()==o2.getSize()){ + return 0; + }else{ + return -1; + } + }else{ + if(o2.getSize()>o1.getSize()){ + return 1; + }else if(o2.getSize()==o1.getSize()){ + return 0; + }else{ + return -1; + } + } + } +} diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/jpa/entity/ParameterEntity.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/jpa/entity/ParameterEntity.java index c0249751..440f6e7a 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/jpa/entity/ParameterEntity.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/jpa/entity/ParameterEntity.java @@ -43,7 +43,7 @@ public class ParameterEntity extends CorporationAuditorEntity { @Override public ParameterVo toVo() { ParameterVo vo =new ParameterVo(); - CorporationAuditorEntity.toVo(vo,this); + super.toVo(vo); vo.setId(this.getId()); vo.setCode(this.getCode()); vo.setValue(this.getValue()); diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/PluginManager.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/PluginManager.java index 8fe04339..71a97c5a 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/PluginManager.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/PluginManager.java @@ -80,6 +80,7 @@ public class PluginManager { if(menu.getId()==null){ menu.setId(UUID.randomUUID().toString()); } + menu.setConfigurationFileUrl(plugin.getFileUrl()); menuItemMap.put(menu.getId(),menu); items.add(menu); } diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/item/MenuItem.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/item/MenuItem.java index 73382c15..63f4284d 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/item/MenuItem.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/plugins/item/MenuItem.java @@ -20,6 +20,9 @@ public abstract class MenuItem { private String icon; private int order; + //附加属性 + private String configurationFileUrl; //菜单贡献项配置文件位置 + public String getId() { return id; } @@ -59,4 +62,12 @@ public abstract class MenuItem { public void setOrder(int order) { this.order = order; } + + public String getConfigurationFileUrl() { + return configurationFileUrl; + } + + public void setConfigurationFileUrl(String configurationFileUrl) { + this.configurationFileUrl = configurationFileUrl; + } } From 685c62086fcfe9ce58aa03b53005e3f9ebc809c5 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Tue, 30 Jan 2024 17:18:10 +0800 Subject: [PATCH 2/2] update --- io.sc.platform.core.frontend/package.json | 2 +- .../components-ext/options/BooleanOptions.ts | 17 ++- .../platform/components-ext/options/index.ts | 6 +- .../template-project/package.json | 4 +- .../sc/platform/core/annotation/AuditLog.java | 3 + .../io/sc/platform/core/audit/AuditLog.java | 2 +- .../platform/core/audit/AuditLogAction.java | 17 --- .../platform/core/enums/AuditLogAction.java | 23 ++++ .../core/{audit => enums}/AuditLogStatus.java | 2 +- .../core/{support => enums}/LogLevel.java | 3 +- .../io/sc/platform/core/util/EnumUtil.java | 12 ++ .../io/sc/platform/core/i18n/enums.properties | 32 +++--- .../platform/core/i18n/enums_tw_CN.properties | 32 +++--- .../platform/core/i18n/enums_zh_CN.properties | 32 +++--- io.sc.platform.mvc/build.gradle | 1 + .../support/AuditLogAspectorBean.java | 14 ++- .../support/RestCrudController.java | 104 +----------------- .../orm/service/support/QueryResult.java | 2 +- .../WebSecurityAutoConfiguration.java | 29 +++-- ...2AuthorizationServerAutoConfiguration.java | 2 +- .../PlatformWebSecurityAutoConfiguration.java | 2 +- .../configure/SecurityAutoConfiguration.java | 2 +- ...Oauth2ResourceServerAutoConfiguration.java | 2 +- .../PlatformWebSecurityAutoConfiguration.java | 1 - .../PlatformAuthenticationFailureHandler.java | 37 ++++++- .../PlatformAuthenticationSuccessHandler.java | 30 +++++ .../handler/PlatformLogoutSuccessHandler.java | 48 ++++++++ .../service/impl/UserDetailsServiceImpl.java | 2 + io.sc.platform.system.frontend/package.json | 2 +- .../src/views/corporation/Corporation.vue | 20 ++-- .../src/views/monitor/AuditLog.vue | 32 ++---- .../src/views/monitor/Log.vue | 21 ++-- .../controller/LogViewerWebController.java | 102 ++++++----------- .../LogLevelConfiguredLevelComparator.java | 25 +++++ .../LogLevelEffectiveLevelComparator.java | 24 ++++ .../support/LogLevelNameComparator.java | 26 +++++ .../META-INF/platform/plugins/p6spy.json | 5 + 37 files changed, 415 insertions(+), 305 deletions(-) delete mode 100644 io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java create mode 100644 io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java rename io.sc.platform.core/src/main/java/io/sc/platform/core/{audit => enums}/AuditLogStatus.java (88%) rename io.sc.platform.core/src/main/java/io/sc/platform/core/{support => enums}/LogLevel.java (72%) create mode 100644 io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java create mode 100644 io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelConfiguredLevelComparator.java create mode 100644 io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelEffectiveLevelComparator.java create mode 100644 io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelNameComparator.java create mode 100644 io.sc.platform.system/src/main/resources/META-INF/platform/plugins/p6spy.json diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index e28fc76e..b53e6b85 100644 --- a/io.sc.platform.core.frontend/package.json +++ b/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", diff --git a/io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts b/io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts index 2adf7e96..46fedf49 100644 --- a/io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts +++ b/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 }; diff --git a/io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts b/io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts index 2a27bf08..801cb473 100644 --- a/io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts +++ b/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]; diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 03654e94..c21637cc 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/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", diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java index 3fbf5a21..f193899a 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java +++ b/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; } diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java index fe3cb7f8..2b71df43 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java +++ b/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 diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java deleted file mode 100644 index 4335ad26..00000000 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java +++ /dev/null @@ -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(){} -} diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java new file mode 100644 index 00000000..aa62fc19 --- /dev/null +++ b/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; + } +} diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogStatus.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogStatus.java similarity index 88% rename from io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogStatus.java rename to io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogStatus.java index bbd7033b..502bac58 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogStatus.java +++ b/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; /** * 审计日志状态枚举 diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/support/LogLevel.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/enums/LogLevel.java similarity index 72% rename from io.sc.platform.core/src/main/java/io/sc/platform/core/support/LogLevel.java rename to io.sc.platform.core/src/main/java/io/sc/platform/core/enums/LogLevel.java index 5ab4a9c0..3b4784b1 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/support/LogLevel.java +++ b/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, //信息 diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java index a8c1fc8b..7719e99d 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java @@ -139,6 +139,18 @@ public class EnumUtil { } return null; } + + public static > 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) { diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties index 27959068..b1c75c30 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties +++ b/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 diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties index f35aaa87..66baece5 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties +++ b/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 diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties index eb109241..cc3cebf7 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties +++ b/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 diff --git a/io.sc.platform.mvc/build.gradle b/io.sc.platform.mvc/build.gradle index 05a55a04..f68f8ca4 100644 --- a/io.sc.platform.mvc/build.gradle +++ b/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", diff --git a/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java b/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java index 39151ebb..2cd05453 100644 --- a/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java +++ b/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(); + 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); } diff --git a/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java b/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java index c401612f..930f6dfb 100644 --- a/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java +++ b/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, ID extends Serializable, R extends DaoRepository, S extends DaoService> { @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 _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{ @@ -111,96 +111,4 @@ public abstract class RestCrudController(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 _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{ - return query(request,response,queryParameter); - } - - protected Page 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 errors =bindingResult.getFieldErrors(); - if(errors==null || errors.size()==0){ - return null; - } - - List errorList =new ArrayList(); - 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; - } - } - */ } diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java index ce908a88..78b9f7e4 100644 --- a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java +++ b/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 result =new ArrayList<>(); - for(int i=first;i(result,pageable,total); diff --git a/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java b/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java index b0b81942..ef238f9c 100644 --- a/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java +++ b/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(); } } \ No newline at end of file diff --git a/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java b/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java index 30b35a7b..c3e71000 100644 --- a/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java +++ b/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(); diff --git a/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java b/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java index da92aa59..5d2f7ca2 100644 --- a/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java +++ b/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(); diff --git a/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java b/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java index 3ecdcf4e..cbf8df7a 100644 --- a/io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java +++ b/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()); diff --git a/io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java b/io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java index c0a35981..ce9acf3e 100644 --- a/io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java +++ b/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(); diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java index 9d6af325..b2e95b02 100644 --- a/io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java +++ b/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; diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java index c82b261d..9f8e0f29 100644 --- a/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java +++ b/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 { diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java index a8529229..db39466f 100644 --- a/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java +++ b/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{ diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java new file mode 100644 index 00000000..a614141a --- /dev/null +++ b/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); + } + } +} diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java index c25740ab..1a2a3d8b 100644 --- a/io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java +++ b/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; diff --git a/io.sc.platform.system.frontend/package.json b/io.sc.platform.system.frontend/package.json index 1677d3e3..ed435375 100644 --- a/io.sc.platform.system.frontend/package.json +++ b/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", diff --git a/io.sc.platform.system.frontend/src/views/corporation/Corporation.vue b/io.sc.platform.system.frontend/src/views/corporation/Corporation.vue index f300dba1..ebb2b67e 100644 --- a/io.sc.platform.system.frontend/src/views/corporation/Corporation.vue +++ b/io.sc.platform.system.frontend/src/views/corporation/Corporation.vue @@ -5,7 +5,6 @@ diff --git a/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue b/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue index 309ff0e4..ea3db51c 100644 --- a/io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue +++ b/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 @@ diff --git a/io.sc.platform.system.frontend/src/views/monitor/Log.vue b/io.sc.platform.system.frontend/src/views/monitor/Log.vue index 3f827028..91753d18 100644 --- a/io.sc.platform.system.frontend/src/views/monitor/Log.vue +++ b/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 @@