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