From eede2ab52ac10e69e98758a2fd4acbf54994abc4 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Wed, 26 Nov 2025 11:18:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6=E5=8F=91?= =?UTF-8?q?=E5=B8=83:=208.2.43=20=20=201.=20=E5=86=B3=E7=AD=96=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E5=A2=9E=E5=8A=A0=E8=BE=93=E5=85=A5=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E7=9A=84=E2=80=9C=E6=98=AF=E5=90=A6=E4=BD=9C=E4=B8=BA=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E5=B1=95=E7=A4=BA=E2=80=9D=EF=BC=8C=E2=80=9C?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=98=BE=E7=A4=BA=E9=80=89=E9=A1=B9=E2=80=9D?= =?UTF-8?q?=EF=BC=8C=E2=80=9C=E4=B8=8D=E5=BD=95=E9=A1=B9=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=E2=80=9D=E7=AD=89=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.platform/src/main/webapp/WEB-INF/web.xml | 6 + erm.frontend/src/views/kpi/Lib.vue | 2 +- .../src/views/kpi/SelectIndicatorDialog.vue | 2 +- .../META-INF/platform/plugins/liquibase.json | 14 +-- ..._20221020__ERM_Appetite_Database_Data.xml} | 0 ...020__ERM_Appetite_Database_Schema_DDL.xml} | 0 ...21020__ERM_Capital_Plan_Database_Data.xml} | 0 ...20221020__ERM_Capital_Plan_Schema_DDL.xml} | 0 ...1020__ERM_Economic_Capital_Schema_DDL.xml} | 0 ...1.0.0_20221020__ERM_KPI_Database_Data.xml} | 0 ...20221020__ERM_KPI_Database_Schema_DDL.xml} | 0 .../plugins/exportable-resources.json | 32 +++--- .../rule/core/code/ExecuteUnit4Resource.java | 13 ++- .../po/model/ParameterInOptionAddtion.java | 9 ++ .../core/po/model/ParameterInOptionItem.java | 7 ++ .../po/model/parameter/InOptionParameter.java | 9 ++ .../src/i18n/messages.json | 2 + .../src/i18n/messages_tw_CN.json | 2 + .../src/i18n/messages_zh_CN.json | 2 + .../src/views/resources/designer/Addition.vue | 28 +++++ .../src/views/resources/designer/Option.vue | 21 ++++ .../views/resources/designer/Parameter.vue | 10 ++ .../converter/ParameterEntityConverter.java | 2 + ...ameterInOptionAdditionEntityConverter.java | 2 + .../ParameterInOptionItemEntityConverter.java | 2 + .../ParameterInOptionAdditionEntity.java | 32 +++++- .../entity/ParameterInOptionItemEntity.java | 29 ++++- .../parameter/InOptionParameterEntity.java | 13 +++ .../model/vo/ParameterInOptionAdditionVo.java | 9 ++ .../model/vo/ParameterInOptionItemVo.java | 11 ++ .../vo/parameter/InOptionParameterVo.java | 10 ++ ...20515__Rule_Engine_Database_Schema_DDL.xml | 5 +- .../plugins/application-properties.json | 2 +- .../core/config/application.properties | 3 + .../platform/core/config/logback-spring.xml | 6 +- .../WebSecurityAutoConfiguration.java | 4 +- .../controller/LoginWebController.java | 30 ++++- .../security/loginform/view/logined.html | 103 ++++++++++++++++++ .../exception/AccountExpiredException.java | 23 ++++ .../exception/AccountLockedException.java | 23 ++++ .../CredentialsExpiredException.java | 23 ++++ .../service/impl/UserDetailsServiceImpl.java | 15 ++- .../security/support/SecurityUser.java | 16 +++ .../security/i18n/messages.properties | 1 + .../security/i18n/messages_tw_CN.properties | 3 +- .../security/i18n/messages_zh_CN.properties | 3 +- 46 files changed, 485 insertions(+), 44 deletions(-) create mode 100644 app.platform/src/main/webapp/WEB-INF/web.xml rename erm/src/main/resources/liquibase/appetite/{erm.appetite_1.0.0_20221020__ERM Appetite Database Data.xml => erm.appetite_1.0.0_20221020__ERM_Appetite_Database_Data.xml} (100%) rename erm/src/main/resources/liquibase/appetite/{erm.appetite_1.0.0_20221020__ERM Appetite Database Schema DDL.xml => erm.appetite_1.0.0_20221020__ERM_Appetite_Database_Schema_DDL.xml} (100%) rename erm/src/main/resources/liquibase/capitalplan/{erm.capitalpan_1.0.0_20221020__ERM Capital Plan Database Data.xml => erm.capitalpan_1.0.0_20221020__ERM_Capital_Plan_Database_Data.xml} (100%) rename erm/src/main/resources/liquibase/capitalplan/{erm.capitalpan_1.0.0_20221020__ERM Capital Plan Schema DDL.xml => erm.capitalpan_1.0.0_20221020__ERM_Capital_Plan_Schema_DDL.xml} (100%) rename erm/src/main/resources/liquibase/economiccapital/{erm.capitalpan_1.0.0_20221020__ERM Economic Capital Schema DDL.xml => erm.capitalpan_1.0.0_20221020__ERM_Economic_Capital_Schema_DDL.xml} (100%) rename erm/src/main/resources/liquibase/kpi/{erm.kpi_1.0.0_20221020__ERM KPI Database Data.xml => erm.kpi_1.0.0_20221020__ERM_KPI_Database_Data.xml} (100%) rename erm/src/main/resources/liquibase/kpi/{erm.kpi_1.0.0_20221020__ERM KPI Database Schema DDL.xml => erm.kpi_1.0.0_20221020__ERM_KPI_Database_Schema_DDL.xml} (100%) create mode 100644 io.sc.platform.security.loginform/src/main/resources/templates/io/sc/platform/security/loginform/view/logined.html create mode 100644 io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountExpiredException.java create mode 100644 io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountLockedException.java create mode 100644 io.sc.platform.security/src/main/java/io/sc/platform/security/exception/CredentialsExpiredException.java diff --git a/app.platform/src/main/webapp/WEB-INF/web.xml b/app.platform/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..2e302847 --- /dev/null +++ b/app.platform/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/erm.frontend/src/views/kpi/Lib.vue b/erm.frontend/src/views/kpi/Lib.vue index 2d8b8fe0..86cffbe1 100644 --- a/erm.frontend/src/views/kpi/Lib.vue +++ b/erm.frontend/src/views/kpi/Lib.vue @@ -36,7 +36,7 @@ { width: '100%', name: 'name', label: $t('name') }, { width: 120, name: 'code', label: $t('code') }, { width: 100, name: 'lastModifier', label: $t('lastModifier') }, - { width: 110, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() }, + { width: 110, name: 'lastModifyDate', label: $t('lastModifyDate') }, { width: 80, name: 'enable', label: $t('status'), align: 'center', sortable: false, format: Formater.enableTag() }, ]" :editor="{ diff --git a/erm.frontend/src/views/kpi/SelectIndicatorDialog.vue b/erm.frontend/src/views/kpi/SelectIndicatorDialog.vue index d96e33a3..02a77c0f 100644 --- a/erm.frontend/src/views/kpi/SelectIndicatorDialog.vue +++ b/erm.frontend/src/views/kpi/SelectIndicatorDialog.vue @@ -15,7 +15,7 @@ }, ]" > -
+
items =inOptionParameter.getOptions(); if(items==null || items.isEmpty()) { continue; } for(ParameterInOptionItem item : items){ - PlaceHolder placeHolder =PlaceHolder.extract(item.getConfig()); + PlaceHolder placeHolder =PlaceHolder.extract(item.getCondition()); Set enumRefs =placeHolder.getEnumRefs(); if(enumRefs==null || enumRefs.isEmpty()) { continue; } + for(String enumRef : enumRefs){ + String enumValue =findEnumValue(enumRef); + if(!StringUtils.hasText(enumValue)){ continue; } + item.setCondition(item.getCondition().replace("#{" + enumRef.replace(".","}.#{") + "}",enumValue)); + } + + placeHolder =PlaceHolder.extract(item.getConfig()); + enumRefs =placeHolder.getEnumRefs(); + if(enumRefs==null || enumRefs.isEmpty()) { continue; } for(String enumRef : enumRefs){ String enumValue =findEnumValue(enumRef); if(!StringUtils.hasText(enumValue)){ continue; } item.setConfig(item.getConfig().replace("#{" + enumRef.replace(".","}.#{") + "}",enumValue)); } } + // } } } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java index f6b3eb31..c64c7968 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionAddtion.java @@ -7,6 +7,7 @@ public class ParameterInOptionAddtion { protected String code; protected String name; protected String description; + protected String defaultValue; protected String condition; protected Boolean enable =true; protected Integer order; @@ -55,6 +56,14 @@ public class ParameterInOptionAddtion { this.description = description; } + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + public String getCondition() { return condition; } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionItem.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionItem.java index b49020d8..2e8454f9 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionItem.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterInOptionItem.java @@ -7,6 +7,7 @@ public class ParameterInOptionItem { protected String title;//选项显示文本 protected String description;//描述 protected Integer order;//排序 + protected String condition;//显示条件 protected String config;//配置 public String getId() { @@ -45,6 +46,12 @@ public class ParameterInOptionItem { public void setOrder(Integer order) { this.order = order; } + public String getCondition() { + return condition; + } + public void setCondition(String condition) { + this.condition = condition; + } public String getConfig() { return config; } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java index 218ed177..7e36d958 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/InOptionParameter.java @@ -20,6 +20,9 @@ import com.fasterxml.jackson.annotation.JsonTypeName; public class InOptionParameter extends Parameter { //当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项 protected Boolean disableOnAutoSelected; + //当参数类型是输入(选项)时,是否采用选择框呈现 + protected Boolean uiSelect; + //选项列表 protected List options =new ArrayList<>(); //不录项列表 @@ -36,6 +39,12 @@ public class InOptionParameter extends Parameter { public void setDisableOnAutoSelected(Boolean disableOnAutoSelected) { this.disableOnAutoSelected = disableOnAutoSelected; } + public Boolean getUiSelect() { + return uiSelect; + } + public void setUiSelect(Boolean uiSelect) { + this.uiSelect = uiSelect; + } public List getOptions() { return options; } diff --git a/io.sc.engine.rule.frontend/src/i18n/messages.json b/io.sc.engine.rule.frontend/src/i18n/messages.json index 76924f1b..06f24e34 100644 --- a/io.sc.engine.rule.frontend/src/i18n/messages.json +++ b/io.sc.engine.rule.frontend/src/i18n/messages.json @@ -98,6 +98,7 @@ "re.parameter.grid.entity.libVersion": "Library Version", "re.parameter.grid.entity.indicatorCode": "Indicator", "re.parameter.grid.entity.persistentAsIndicator": "Persistent As Indicator", + "re.parameter.grid.entity.uiSelect": "Is Select Component In UI", "re.parameter.grid.entity.disableOnAutoSelected": "Disabled On System Auto Selected a Option", "re.parameter.grid.entity.properties": "Extension Properties", "re.parameter.grid.entity.property.name": "Property Name", @@ -121,6 +122,7 @@ "re.option.grid.entity.inputValue": "Input Value", "re.option.grid.entity.value": "Value", "re.option.grid.entity.title": "Title", + "re.option.grid.entity.condition": "Show Condition(Show the Option Item When Condition is true)", "re.option.grid.entity.config": "Condition of Auto Selected(Auto Select Item When Condition is true)", "re.addition.grid.title": "Addition Items", diff --git a/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json b/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json index 3545f761..4991973b 100644 --- a/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json +++ b/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json @@ -98,6 +98,7 @@ "re.parameter.grid.entity.libVersion": "指標庫版本", "re.parameter.grid.entity.indicatorCode": "指標", "re.parameter.grid.entity.persistentAsIndicator": "是否作為指標存儲", + "re.parameter.grid.entity.uiSelect": "是否採用下拉選擇框", "re.parameter.grid.entity.disableOnAutoSelected": "當系統自動選擇了輸入選項中的某一項時, 是否禁止用戶選擇其他項", "re.parameter.grid.entity.properties": "擴展屬性", "re.parameter.grid.entity.property.name": "屬性名", @@ -121,6 +122,7 @@ "re.option.grid.entity.inputValue": "輸入值", "re.option.grid.entity.value": "計算值", "re.option.grid.entity.title": "顯示文本", + "re.option.grid.entity.condition": "顯示條件(當條件成立時,顯示該選項)", "re.option.grid.entity.config": "自動選擇條件(當條件滿足時,自動選中該項)", "re.addition.grid.title": "補錄項", diff --git a/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json b/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json index 149eb38a..683ce5ca 100644 --- a/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json +++ b/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json @@ -98,6 +98,7 @@ "re.parameter.grid.entity.libVersion": "指标库版本", "re.parameter.grid.entity.indicatorCode": "指标", "re.parameter.grid.entity.persistentAsIndicator": "是否作为指标存储", + "re.parameter.grid.entity.uiSelect": "是否采用下拉选择框", "re.parameter.grid.entity.disableOnAutoSelected": "当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项", "re.parameter.grid.entity.properties": "扩展属性", "re.parameter.grid.entity.property.name": "属性名", @@ -122,6 +123,7 @@ "re.option.grid.entity.inputValue": "输入值", "re.option.grid.entity.value": "计算值", "re.option.grid.entity.title": "显示文本", + "re.option.grid.entity.condition": "显示条件(当条件成立时,显示该选项)", "re.option.grid.entity.config": "自动选择条件(当条件满足时,自动选中该项)", "re.addition.grid.title": "补录项", diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue index 275c6387..4c4a0571 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Addition.vue @@ -67,12 +67,25 @@ width: 300, name: 'condition', label: $t('re.addition.grid.entity.condition'), + html: true, + format: (value: any, row: any) => { + return PlaceHolder.replace(value); + }, }, { width: 100, name: 'description', label: $t('re.addition.grid.entity.description'), }, + { + width: 200, + name: 'defaultValue', + label: $t('defaultValue'), + html: true, + format: (value: any, row: any) => { + return PlaceHolder.replace(value); + }, + }, { width: 100, name: 'componentType', @@ -175,6 +188,20 @@ rows: 3, }, { colSpan: 2, name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true }, + { + colSpan: 2, + name: 'defaultValue', + label: $t('defaultValue'), + type: 'w-code-mirror', + toolbar: false, + lang: 'java', + height: 30, + placeholder: true, + lineWrap: true, + lineBreak: false, + autoCompletion: autoCompletionManager.autoCompletion(), + userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), + }, { colSpan: 2, name: 'condition', @@ -302,6 +329,7 @@ import { Environment, Formater, CorporationAuditorEntityManager } from 'platform import { EngineEnums } from '@/views/shared/enums/EngineEnums'; import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager'; import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager'; +import { PlaceHolder } from '@/utils/PlaceHolder'; const props = defineProps({ fetchDataUrl: { type: String, default: '' }, diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue index 952e92a8..eaec5a1a 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue @@ -50,6 +50,15 @@ { width: 100, name: 'inputValue', label: $t('re.option.grid.entity.inputValue') }, { width: 100, name: 'value', label: $t('re.option.grid.entity.value') }, { width: 400, name: 'title', label: $t('re.option.grid.entity.title') }, + { + width: 300, + name: 'condition', + label: $t('re.option.grid.entity.condition'), + html: true, + format: (value: any, row: any) => { + return PlaceHolder.replace(value); + }, + }, { width: 400, name: 'config', @@ -90,6 +99,18 @@ label: $t('description'), type: 'w-text', }, + { + name: 'condition', + label: $t('re.option.grid.entity.condition'), + type: 'w-code-mirror', + toolbar: false, + lang: 'java', + rows: 4, + lineWrap: true, + lineBreak: false, + placeholder: true, + autoCompletion: autoCompletionManager.autoCompletion(), + }, { name: 'config', label: $t('re.option.grid.entity.config'), diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue index a36e5378..27d7bad6 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue @@ -227,6 +227,15 @@ return 'IN_OPTION' === args.form.getFieldValue('type'); }, }, + { + name: 'uiSelect', + label: $t('re.parameter.grid.entity.uiSelect'), + type: 'w-checkbox', + defaultValue: false, + showIf: (args: any) => { + return 'IN_OPTION' === args.form.getFieldValue('type'); + }, + }, { name: 'properties', label: $t('re.parameter.grid.entity.properties'), @@ -272,6 +281,7 @@ name: 'value', label: $t('re.parameter.grid.entity.property.value'), sortable: false, + html: true, format: (value: any) => { return PlaceHolder.replace(value); }, diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java index 3d6148e8..b6c688d0 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java @@ -35,6 +35,7 @@ public class ParameterEntityConverter { InOptionParameterEntity _entity =(InOptionParameterEntity)entity; InOptionParameter _po =new InOptionParameter(); _po.setDisableOnAutoSelected(_entity.getDisableOnAutoSelected()); + _po.setUiSelect(_entity.getUiSelect()); _po.setOptions(ParameterInOptionItemEntityConverter.toPo(_entity.getOptions())); _po.setAdditons(ParameterInOptionAdditionEntityConverter.toPo(_entity.getAdditions())); po =_po; @@ -108,6 +109,7 @@ public class ParameterEntityConverter { InOptionParameter _po =(InOptionParameter)po; InOptionParameterEntity _entity =new InOptionParameterEntity(); _entity.setDisableOnAutoSelected(_po.getDisableOnAutoSelected()); + _entity.setUiSelect(_po.getUiSelect()); List options =ParameterInOptionItemEntityConverter.fromPo(_po.getOptions()); if(options!=null && options.size()>0) { diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java index 89f5858a..e43be37d 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionAdditionEntityConverter.java @@ -22,6 +22,7 @@ public class ParameterInOptionAdditionEntityConverter { po.setCode(entity.getCode()); po.setName(entity.getName()); po.setDescription(entity.getDescription()); + po.setDefaultValue(entity.getDefaultValue()); po.setCondition(entity.getCondition()); po.setEnable(entity.getEnable()); po.setOrder(entity.getOrder()); @@ -71,6 +72,7 @@ public class ParameterInOptionAdditionEntityConverter { entity.setCode(po.getCode()); entity.setName(po.getName()); entity.setDescription(po.getDescription()); + entity.setDefaultValue(po.getDefaultValue()); entity.setCondition(po.getCondition()); entity.setEnable(po.getEnable()); entity.setOrder(po.getOrder()); diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionItemEntityConverter.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionItemEntityConverter.java index 79451ca3..5b624e88 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionItemEntityConverter.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterInOptionItemEntityConverter.java @@ -24,6 +24,7 @@ public class ParameterInOptionItemEntityConverter { po.setTitle(entity.getTitle()); po.setDescription(entity.getDescription()); po.setOrder(entity.getOrder()); + po.setCondition(entity.getCondition()); po.setConfig(entity.getConfig()); return po; } @@ -60,6 +61,7 @@ public class ParameterInOptionItemEntityConverter { entity.setTitle(po.getTitle()); entity.setDescription(po.getDescription()); entity.setOrder(po.getOrder()); + entity.setCondition(po.getCondition()); entity.setConfig(po.getConfig()); return entity; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java index a2ce6229..8de655fd 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionAdditionEntity.java @@ -51,6 +51,11 @@ public class ParameterInOptionAdditionEntity extends CorporationAuditorEntity code2codeMapping) { - String replaced = ParameterCodeReplacer.replace(this.condition, code2codeMapping); + String replaced = ParameterCodeReplacer.replace(this.defaultValue, code2codeMapping); replaced =(replaced==null?"":replaced); boolean result =false; + if(!replaced.equals(this.defaultValue)) { + result =true; + } + this.defaultValue =replaced; + + replaced = ParameterCodeReplacer.replace(this.condition, code2codeMapping); + replaced =(replaced==null?"":replaced); if(!replaced.equals(this.condition)) { result =true; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionItemEntity.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionItemEntity.java index 34bb1b24..94c95f21 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionItemEntity.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterInOptionItemEntity.java @@ -54,8 +54,12 @@ public class ParameterInOptionItemEntity extends CorporationAuditorEntity getOptions() { return options; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java index 4f90d1ed..35f865f1 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionAdditionVo.java @@ -15,6 +15,7 @@ public class ParameterInOptionAdditionVo extends CorporationAuditorVo { protected String code; protected String name; protected String description; + protected String defaultValue; protected String condition; protected Boolean enable =true; protected Integer order; @@ -71,6 +72,14 @@ public class ParameterInOptionAdditionVo extends CorporationAuditorVo { this.description = description; } + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + public String getCondition() { return condition; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionItemVo.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionItemVo.java index 076b529f..569ab4ad 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionItemVo.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterInOptionItemVo.java @@ -27,6 +27,9 @@ public class ParameterInOptionItemVo extends CorporationAuditorVo { //排序 protected Integer order; + + //显示条件 + protected String condition; //配置 protected String config; @@ -88,6 +91,14 @@ public class ParameterInOptionItemVo extends CorporationAuditorVo { this.order = order; } + public String getCondition() { + return condition; + } + + public void setCondition(String condition) { + this.condition = condition; + } + public String getConfig() { return config; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java index 03651f2f..02be515d 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/parameter/InOptionParameterVo.java @@ -9,6 +9,8 @@ import io.sc.engine.rule.server.model.vo.ParameterVo; public class InOptionParameterVo extends ParameterVo { //当系统自动选择了输入选项中某一项时, 是否禁止用户选择其他项 protected Boolean disableOnAutoSelected; + //当参数类型是输入(选项)时,是否采用选择框呈现 + protected Boolean uiSelect; @Override public ParameterType getType() { @@ -22,4 +24,12 @@ public class InOptionParameterVo extends ParameterVo { public void setDisableOnAutoSelected(Boolean disableOnAutoSelected) { this.disableOnAutoSelected = disableOnAutoSelected; } + + public Boolean getUiSelect() { + return uiSelect; + } + + public void setUiSelect(Boolean uiSelect) { + this.uiSelect = uiSelect; + } } diff --git a/io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule_Engine_Database_Schema_DDL.xml b/io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule_Engine_Database_Schema_DDL.xml index 08212261..838ad4c0 100644 --- a/io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule_Engine_Database_Schema_DDL.xml +++ b/io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule_Engine_Database_Schema_DDL.xml @@ -169,6 +169,7 @@ + @@ -221,7 +222,8 @@ - + + @@ -265,6 +267,7 @@ + diff --git a/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json b/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json index a6b3342b..ef4e7d4f 100644 --- a/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json +++ b/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/application-properties.json @@ -61,7 +61,7 @@ "server.servlet.session.timeout = 30m", "server.servlet.session.cookie.http-only = true", "server.servlet.session.cookie.secure = true", - "server.servlet.session.cookie.same-site = STRICT", + "server.servlet.session.cookie.same-site = LAX", "server.error.path = /error", "server.error.whitelabel.enabled = true", "server.error.include-exception = true", diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/application.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/application.properties index 8f19d604..cc4671d9 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/application.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/application.properties @@ -34,6 +34,9 @@ server.address = server.port = 8080 server.servlet.context-path = / server.servlet.session.timeout = 30m +server.servlet.session.cookie.http-only = true +server.servlet.session.cookie.secure = true +server.servlet.session.cookie.same-site = LAX server.error.path = /error server.error.whitelabel.enabled = true server.error.include-exception = true diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/logback-spring.xml b/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/logback-spring.xml index efab000d..c656d001 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/logback-spring.xml +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/config/logback-spring.xml @@ -101,12 +101,12 @@ - + - - + + 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 d77825a0..ed226bcb 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 @@ -118,7 +118,9 @@ public class WebSecurityAutoConfiguration { // 在用户名密码认证过滤器前添加 jwt 认证过滤器 JwtUsernamePasswordAuthenticationFilter jwtUsernamePasswordAuthenticationFilter =new JwtUsernamePasswordAuthenticationFilter(jwtDecoder,securityConfigureService.getIgnoredUrlMatchers()); http.addFilterBefore(jwtUsernamePasswordAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + //http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + }else{ + http.sessionManagement().maximumSessions(1).expiredUrl(securityProperties.getFormLogin().getLoginPage() + "/logined"); } return http.build(); } diff --git a/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/controller/LoginWebController.java b/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/controller/LoginWebController.java index e02a635b..14416d18 100644 --- a/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/controller/LoginWebController.java +++ b/io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/controller/LoginWebController.java @@ -20,10 +20,11 @@ import java.util.Map; public class LoginWebController { private static final String SPRING_THYMELEAF_PREFIX ="spring.thymeleaf.prefix"; private static final String DEFAULT_LOGIN_TEMPLATE ="io/sc/platform/security/loginform/view/login.html"; + private static final String DEFAULT_LOGINED_TEMPLATE ="io/sc/platform/security/loginform/view/logined.html"; private static final String DEFAULT_LOGIN_ERROR_TEMPLATE ="io/sc/platform/security/loginform/view/login.html"; @Autowired ConfigurableEnvironment env; @Autowired ConfigureService configureService; - + @RequestMapping(value="/login",method=RequestMethod.GET) public ModelAndView loginByPage(HttpServletRequest request, Principal principal) throws Exception{ if(principal!=null && principal.getName()!=null){ @@ -34,7 +35,18 @@ public class LoginWebController { mv.addAllObjects(getModelData()); return mv; } - + + @RequestMapping(value="/login/logined",method=RequestMethod.GET) + public ModelAndView logined(HttpServletRequest request, Principal principal) throws Exception{ + if(principal!=null && principal.getName()!=null){ + return new ModelAndView("redirect:/"); + } + String loginPagetemplate =getLoginedPageTemplate(); + ModelAndView mv =new ModelAndView(loginPagetemplate); + mv.addAllObjects(getModelData()); + return mv; + } + @RequestMapping(value="/login-error",method=RequestMethod.GET) public ModelAndView loginError(HttpServletRequest request, Principal principal) throws Exception{ if(principal!=null && principal.getName()!=null){ @@ -46,7 +58,7 @@ public class LoginWebController { mv.addObject("error",true); return mv; } - + private String getLoginPageTemplate() throws Exception{ String loginPagetemplate =DEFAULT_LOGIN_TEMPLATE; String thymeleafPrefix =env.getProperty(SPRING_THYMELEAF_PREFIX, String.class, "classpath:/templates/"); @@ -56,7 +68,17 @@ public class LoginWebController { } return loginPagetemplate; } - + + private String getLoginedPageTemplate() throws Exception{ + String loginPagetemplate =DEFAULT_LOGINED_TEMPLATE; + String thymeleafPrefix =env.getProperty(SPRING_THYMELEAF_PREFIX, String.class, "classpath:/templates/"); + Resource resource =new DefaultResourceLoader().getResource(thymeleafPrefix + loginPagetemplate); + if(!resource.exists()){ + loginPagetemplate =DEFAULT_LOGINED_TEMPLATE; + } + return loginPagetemplate; + } + private String getLoginErrorPageTemplate() throws Exception{ String loginPagetemplate =DEFAULT_LOGIN_ERROR_TEMPLATE; String thymeleafPrefix =env.getProperty(SPRING_THYMELEAF_PREFIX, String.class, "classpath:/templates/"); diff --git a/io.sc.platform.security.loginform/src/main/resources/templates/io/sc/platform/security/loginform/view/logined.html b/io.sc.platform.security.loginform/src/main/resources/templates/io/sc/platform/security/loginform/view/logined.html new file mode 100644 index 00000000..a6fc9214 --- /dev/null +++ b/io.sc.platform.security.loginform/src/main/resources/templates/io/sc/platform/security/loginform/view/logined.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountExpiredException.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountExpiredException.java new file mode 100644 index 00000000..a7a262f9 --- /dev/null +++ b/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountExpiredException.java @@ -0,0 +1,23 @@ +package io.sc.platform.security.exception; + +public class AccountExpiredException extends RuntimeException{ + public AccountExpiredException() { + super(); + } + + public AccountExpiredException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public AccountExpiredException(String message, Throwable cause) { + super(message, cause); + } + + public AccountExpiredException(String message) { + super(message); + } + + public AccountExpiredException(Throwable cause) { + super(cause); + } +} diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountLockedException.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountLockedException.java new file mode 100644 index 00000000..cef8cec0 --- /dev/null +++ b/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/AccountLockedException.java @@ -0,0 +1,23 @@ +package io.sc.platform.security.exception; + +public class AccountLockedException extends RuntimeException{ + public AccountLockedException() { + super(); + } + + public AccountLockedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public AccountLockedException(String message, Throwable cause) { + super(message, cause); + } + + public AccountLockedException(String message) { + super(message); + } + + public AccountLockedException(Throwable cause) { + super(cause); + } +} diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/CredentialsExpiredException.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/CredentialsExpiredException.java new file mode 100644 index 00000000..949fd744 --- /dev/null +++ b/io.sc.platform.security/src/main/java/io/sc/platform/security/exception/CredentialsExpiredException.java @@ -0,0 +1,23 @@ +package io.sc.platform.security.exception; + +public class CredentialsExpiredException extends RuntimeException{ + public CredentialsExpiredException() { + super(); + } + + public CredentialsExpiredException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public CredentialsExpiredException(String message, Throwable cause) { + super(message, cause); + } + + public CredentialsExpiredException(String message) { + super(message); + } + + public CredentialsExpiredException(Throwable cause) { + super(cause); + } +} 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 1a2a3d8b..8c4d4d56 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,13 +1,13 @@ 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.exception.AccountExpiredException; +import io.sc.platform.security.exception.AccountLockedException; +import io.sc.platform.security.exception.CredentialsExpiredException; import io.sc.platform.security.service.support.*; import io.sc.platform.security.support.SecurityRole; import io.sc.platform.security.support.SecurityUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.RowMapper; @@ -61,6 +61,15 @@ public class UserDetailsServiceImpl implements UserDetailsService{ if(StringUtils.hasText(username)){ User u =jdbcTemplate.query(userQuery, userExtractor, username); if(u!=null){ + if(u.getAccountLocked()){ + throw new AccountLockedException(); + } + if(u.getAccountExpired()){ + throw new AccountExpiredException(); + } + if(u.getCredentialsExpired()){ + throw new CredentialsExpiredException(); + } //获取用户所属角色 List roles =jdbcTemplate.query(roleQuery, roleRowMapper, u.getId()); //构建安全认证用户对象 diff --git a/io.sc.platform.security/src/main/java/io/sc/platform/security/support/SecurityUser.java b/io.sc.platform.security/src/main/java/io/sc/platform/security/support/SecurityUser.java index e8f71ab7..b399a998 100644 --- a/io.sc.platform.security/src/main/java/io/sc/platform/security/support/SecurityUser.java +++ b/io.sc.platform.security/src/main/java/io/sc/platform/security/support/SecurityUser.java @@ -178,4 +178,20 @@ public class SecurityUser extends User{ public void setCorporationName(String corporationName) { this.corporationName = corporationName; } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + SecurityUser that = (SecurityUser) o; + return userId.equals(that.userId); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + userId.hashCode(); + return result; + } } diff --git a/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages.properties b/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages.properties index 9837b32e..c5de5495 100644 --- a/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages.properties +++ b/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages.properties @@ -8,6 +8,7 @@ AdministratorInstallerItem.admin_password=Password # login security.login.title=System Authentication security.login.message.error=authentication failed! please check your user name and password. +security.login.message.alreadyLogin=You was logined on anther device. security.login.username.placeholder=Please input login name security.login.password.placeholder=Please input password diff --git a/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_tw_CN.properties b/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_tw_CN.properties index 28fc4b1a..9c5099d2 100644 --- a/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_tw_CN.properties +++ b/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_tw_CN.properties @@ -6,7 +6,8 @@ AdministratorInstallerItem.admin_password=\u5BC6\u78BC # login security.login.title=\u7CFB\u7D71\u767B\u9304 -security.login.message.error=\u8A8D\u8B49\u5931\u6557\uFF01\u8ACB\u6AA2\u67E5\u60A8\u8F38\u5165\u7684\u767B\u9678\u540D\u548C\u5BC6\u78BC\u662F\u5426\u6B63\u78BA +security.login.message.error=\u8A8D\u8B49\u5931\u6557\uFF01\u8ACB\u6AA2\u67E5\u60A8\u8F38\u5165\u7684\u767B\u9678\u540D\u548C\u5BC6\u78BC\u662F\u5426\u6B63\u78BA. +security.login.message.alreadyLogin=\u60A8\u5DF2\u7D93\u5728\u5176\u4ED6\u8A2D\u5099\u4E0A\u767B\u9304\u904E\u4E86 security.login.username.placeholder=\u8ACB\u8F38\u5165\u767B\u9304\u540D security.login.password.placeholder=\u8ACB\u8F38\u5165\u5BC6\u78BC diff --git a/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_zh_CN.properties b/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_zh_CN.properties index 8d42365d..c941bf00 100644 --- a/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_zh_CN.properties +++ b/io.sc.platform.security/src/main/resources/io/sc/platform/security/i18n/messages_zh_CN.properties @@ -7,7 +7,8 @@ AdministratorInstallerItem.admin_password=\u5BC6\u7801 # login security.login.title=\u7CFB\u7EDF\u767B\u5F55 -security.login.message.error=\u8BA4\u8BC1\u5931\u8D25! \u8BF7\u68C0\u67E5\u60A8\u8F93\u5165\u7684\u767B\u5F55\u540D\u548C\u5BC6\u7801\u662F\u5426\u6B63\u786E\u3002 +security.login.message.error=\u8BA4\u8BC1\u5931\u8D25! \u8BF7\u68C0\u67E5\u60A8\u8F93\u5165\u7684\u767B\u5F55\u540D\u548C\u5BC6\u7801\u662F\u5426\u6B63\u786E. +security.login.message.alreadyLogin=\u60A8\u5DF2\u7ECF\u5728\u5176\u4ED6\u8BBE\u5907\u4E0A\u767B\u5F55\u8FC7\u4E86 security.login.username.placeholder=\u8BF7\u8F93\u5165\u767B\u5F55\u540D security.login.password.placeholder=\u8BF7\u8F93\u5165\u5BC6\u7801