Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java
@@ -141,6 +141,11 @@ * æä¸¾å¼ */ private List<String> itemValueList = null; /*** * æä¸¾å¼éå */ private List<KeyValue> itemKeyValueList=new ArrayList<>(); /** *ä¸çº§åç § */ @@ -695,6 +700,14 @@ // } public List<KeyValue> getItemKeyValueList() { return itemKeyValueList; } public void setItemKeyValueList(List<KeyValue> itemKeyValueList) { this.itemKeyValueList = itemKeyValueList; } @Override public String toString() { return "PRMItemDTO{" + @@ -729,6 +742,7 @@ ", itemScript='" + itemScript + '\'' + ", itemTips='" + itemTips + '\'' + ", itemValueList=" + itemValueList + ", itemKeyValueList=" + itemKeyValueList + ", itemListTable='" + itemListTable + '\'' + ", itemListTxt='" + itemListTxt + '\'' + ", itemListVal='" + itemListVal + '\'' + Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/RoleRightDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,123 @@ package com.vci.dto; import java.io.Serializable; import java.util.Date; /** * UIæé * @author xiej * @date 2024-09-05 */ public class RoleRightDTO implements Serializable { private static final long serialVersionUID = 2956142041726150499L; /** * ID */ private String id = ""; /** *è§è²ID */ private String roleId = ""; /** * 模åID */ private String funcId = ""; /** * æéå¼ */ private long rightValue = -1; /** * æéç±»åï¼è¶ 级管çåç»ç®¡çåææä¸º1ï¼ç®¡çåç»æ®éç¨æ·ææä¸º2 */ private short rightType = -1; /**æ°å¢æ°æ®å建è ï¼ä¿®æ¹è ï¼å建æ¶é´ï¼ä¿®æ¹æ¶é´ï¼ææè ***/ private String createUser = ""; private Date createTime = new Date(); private String licensor = ""; private String modifyUser = ""; private Date modifyTime = new Date(); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getRoleId() { return roleId; } public void setRoleId(String roleId) { this.roleId = roleId; } public String getFuncId() { return funcId; } public void setFuncId(String funcId) { this.funcId = funcId; } public long getRightValue() { return rightValue; } public void setRightValue(long rightValue) { this.rightValue = rightValue; } public short getRightType() { return rightType; } public void setRightType(short rightType) { this.rightType = rightType; } public String getCreateUser() { return createUser; } public void setCreateUser(String createUser) { this.createUser = createUser; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getLicensor() { return licensor; } public void setLicensor(String licensor) { this.licensor = licensor; } public String getModifyUser() { return modifyUser; } public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } public Date getModifyTime() { return modifyTime; } public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } } Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/UIAuthorDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ package com.vci.dto; import com.vci.starter.web.pagemodel.Tree; import lombok.Data; import java.io.Serializable; import java.util.List; /** * ææå¯¹è±¡ * @author xiej * @date 2024-09-05 */ public class UIAuthorDTO implements Serializable { private static final long serialVersionUID = -1996329568646378902L; /** *è§è²ID */ private String roleId; /** *ä¸å¡ç±»å */ private String type; /** *ä¸ä¸æ */ private String context; /** * ææçèç¹ */ List<Tree> selectTreeList; public String getRoleId() { return roleId; } public void setRoleId(String roleId) { this.roleId = roleId; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getContext() { return context; } public void setContext(String context) { this.context = context; } public List<Tree> getSelectTreeList() { return selectTreeList; } public void setSelectTreeList(List<Tree> selectTreeList) { this.selectTreeList = selectTreeList; } @Override public String toString() { return "UIAuthorDTO{" + "roleId='" + roleId + '\'' + ", type='" + type + '\'' + ", context='" + context + '\'' + ", selectTreeList=" + selectTreeList + '}'; } } Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMItemDO.java
@@ -127,7 +127,10 @@ * æä¸¾å¼ */ private List<String> itemValueList = null; /*** * æä¸¾å¼éå */ private List<KeyValue> itemKeyValueList=new ArrayList<>(); /** *ä¸çº§åç § */ @@ -664,6 +667,15 @@ public void setItemDateFormat(String itemDateFormat) { this.itemDateFormat = itemDateFormat; } public List<KeyValue> getItemKeyValueList() { return itemKeyValueList; } public void setItemKeyValueList(List<KeyValue> itemKeyValueList) { this.itemKeyValueList = itemKeyValueList; } @Override public String toString() { return "PRMItemDO{" + @@ -693,6 +705,7 @@ ", itemScript='" + itemScript + '\'' + ", itemTips='" + itemTips + '\'' + ", itemValueList=" + itemValueList + ", itemKeyValueList=" + itemKeyValueList + ", itemListTable='" + itemListTable + '\'' + ", itemListTxt='" + itemListTxt + '\'' + ", itemListVal='" + itemListVal + '\'' + Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/RoleRightDO.java
@@ -8,9 +8,9 @@ import java.util.Date; /** * ç¶ææ± * @author weidy * @date 2022-2-15 * UIæé * @author xiej * @date 2024-09-05 */ @VciBtmType(name = "UIAuthor",text = "UIæé",tableName = "PLROLERIGHT",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE) @Transient Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMItemVO.java
@@ -144,7 +144,10 @@ * æä¸¾å¼ */ private List<String> itemValueList = null; /*** * æä¸¾å¼éå */ private List<KeyValue> itemKeyValueList=new ArrayList<>(); /** *ä¸çº§åç § @@ -633,6 +636,14 @@ this.itemSearchFieldList = itemSearchFieldList; } public List<KeyValue> getItemKeyValueList() { return itemKeyValueList; } public void setItemKeyValueList(List<KeyValue> itemKeyValueList) { this.itemKeyValueList = itemKeyValueList; } @Override public String toString() { return "PRMItemVO{" + @@ -667,6 +678,7 @@ ", itemScript='" + itemScript + '\'' + ", itemTips='" + itemTips + '\'' + ", itemValueList=" + itemValueList + ", itemKeyValueList=" + itemKeyValueList + ", itemListTable='" + itemListTable + '\'' + ", itemListTxt='" + itemListTxt + '\'' + ", itemListVal='" + itemListVal + '\'' + Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java
@@ -3,6 +3,8 @@ import com.vci.corba.common.PLException; import com.vci.corba.portal.data.PLUILayout; import com.vci.dto.OsBtmTypeDTO; import com.vci.dto.RoleRightDTO; import com.vci.dto.UIAuthorDTO; import com.vci.pagemodel.PLUILayoutCloneVO; import com.vci.starter.web.annotation.log.VciBusinessLog; import com.vci.starter.web.pagemodel.BaseQueryObject; @@ -169,4 +171,20 @@ } } /*** * @param selectTreeList å¾éçéè¦ä¿åçæ°æ®å¯¹è±¡ * @return */ @PostMapping( "/authorizedUI") @VciBusinessLog(operateName = "UIææ") public BaseResult authorizedUI(UIAuthorDTO uiAuthorDTO){ try { return uiManagerService.authorizedUI(uiAuthorDTO)?BaseResult.success("æææå!"):BaseResult.fail("ææå¤±è´¥ï¼"); }catch (Throwable e) { e.printStackTrace(); String exceptionMessage = "UIææåºç°é误ï¼åå ï¼" + VciBaseUtil.getExceptionMessage(e); logger.error(exceptionMessage); return BaseResult.fail(exceptionMessage); } } } Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java
@@ -2,6 +2,8 @@ import com.vci.corba.common.PLException; import com.vci.corba.portal.data.PLUILayout; import com.vci.dto.RoleRightDTO; import com.vci.dto.UIAuthorDTO; import com.vci.pagemodel.PLUILayoutCloneVO; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseQueryObject; @@ -70,4 +72,12 @@ * @throws VciBaseException */ List<Tree> getUIAuthor(BaseQueryObject baseQueryObject)throws Exception; /*** * UIææ * @param uiAuthorDTO * @return * @throws Exception */ public boolean authorizedUI(UIAuthorDTO uiAuthorDTO)throws Exception; } Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
@@ -988,6 +988,15 @@ prmItemDO.setItemHttpPathField(prmItemDTO.getItemHttpPathField()); if(viType==PortalVIType.Table.getIntVal()) {//妿æ¯è¡¨æ ¼ initTableConfigDTOO2DOData(prmItemDO,prmItemDTO); }else{ List<String> itemValueList=new ArrayList<>(); List<KeyValue> keyValueList=prmItemDTO.getItemKeyValueList(); Optional.ofNullable(keyValueList).orElseGet(()->new ArrayList<>()).stream().forEach(keyValue -> { String value= keyValue.getValue()+"{"+keyValue.getKey()+"}"; itemValueList.add(value); }); prmItemDO.setItemValueList(itemValueList); } return prmItemDO; } @@ -1052,8 +1061,20 @@ prmItemVO.setItemIsHttpSave(prmItemDO.getItemIsHttpSave()); prmItemVO.setItemHttpVolumnPath(prmItemDO.getItemHttpVolumnPath()); prmItemVO.setItemHttpPathField(prmItemDO.getItemHttpPathField()); if(viType==PortalVIType.Table.getIntVal()) {//妿æ¯è¡¨æ ¼ initTableConfigDOO2VOData(prmItemVO,prmItemDO); }else{ List<String> enumList= prmItemDO.getItemValueList(); List<KeyValue>itemKeyValueList=new ArrayList<>(); Optional.ofNullable(enumList).orElseGet(()->new ArrayList<>()).stream().forEach(enumValue->{ List<String> keyValueList= VciBaseUtil.str2List(VciBaseUtil.removeComma(enumValue,"}"),"\\{"); KeyValue keyValue=new KeyValue(); keyValue.setKey(keyValueList.get(1)); keyValue.setValue(keyValueList.get(0)); itemKeyValueList.add(keyValue); }); prmItemVO.setItemKeyValueList(itemKeyValueList); } return prmItemVO; } @@ -1120,6 +1141,17 @@ prmItemDTO.setItemHttpPathField(prmItemDO.getItemHttpPathField()); if(viType==PortalVIType.Table.getIntVal()) {//妿æ¯è¡¨æ ¼ initTableConfigDOO2VOData(prmItemDTO,prmItemDO); }else{ List<String> enumList= prmItemDO.getItemValueList(); List<KeyValue>itemKeyValueList=new ArrayList<>(); Optional.ofNullable(enumList).orElseGet(()->new ArrayList<>()).stream().forEach(enumValue->{ List<String> keyValueList= VciBaseUtil.str2List(VciBaseUtil.removeComma(enumValue,"}"),"\\{"); KeyValue keyValue=new KeyValue(); keyValue.setKey(keyValueList.get(1)); keyValue.setValue(keyValueList.get(0)); itemKeyValueList.add(keyValue); }); prmItemDTO.setItemKeyValueList(itemKeyValueList); } return prmItemDTO; } Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
@@ -8,15 +8,14 @@ import com.vci.corba.omd.btm.BizType; import com.vci.corba.portal.PortalService; import com.vci.corba.portal.data.*; import com.vci.dto.RoleRightDTO; import com.vci.dto.UIAuthorDTO; import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI; import com.vci.pagemodel.OsBtmTypeVO; import com.vci.pagemodel.PLUILayoutCloneVO; import com.vci.pagemodel.RoleRightVO; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseQueryObject; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.SessionInfo; import com.vci.starter.web.pagemodel.Tree; import com.vci.starter.web.pagemodel.*; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.util.VciDateUtil; import com.vci.starter.web.util.WebThreadLocalUtil; @@ -111,16 +110,31 @@ /** * tonéè¿ä¸å¡ç±»åååç§°æ¥è¯¢ * @param btemName * @param code * @param context * @return * @throws PLException */ public List<PLUILayout> getUIContextDataByBtName(String btemName,String code) throws PLException { public List<PLUILayout> getUIContextDataByBtName(String btemName,String context) throws PLException { VciBaseUtil.alertNotNull(btemName,"ä¸å¡ç±»å"); List<PLUILayout> pluiLayoutList=new ArrayList<>(); PLUILayout[] pluiLayouts= platformClientUtil.getUIService().getPLUILayoutEntityByTypeAndCode(btemName,code); if(pluiLayouts!=null&&pluiLayouts.length>0){ pluiLayoutList= Stream.of(pluiLayouts).collect(Collectors.toList()); List<String> contextList= VciBaseUtil.str2List(context); if(StringUtils.isNotBlank(context)){ contextList=VciBaseUtil.str2List(context); }else{ contextList.add(""); } contextList.stream().forEach(code->{ PLUILayout[] pluiLayouts= new PLUILayout[0]; try { pluiLayouts = platformClientUtil.getUIService().getPLUILayoutEntityByTypeAndCode(btemName,code); } catch (PLException e) { e.printStackTrace(); } if(pluiLayouts!=null&&pluiLayouts.length>0) { pluiLayoutList.addAll(Arrays.stream(pluiLayouts).collect(Collectors.toList())); } }); return pluiLayoutList; } @@ -319,17 +333,93 @@ bizTypeTree.setParentId(rootNode.getOid()); bizTypeTree.setParentName(rootNode.getText()); bizTypeTree.setShowCheckbox(true); bizTypeTree.setParentBtmName(bizTypes[i].name); childList.add(bizTypeTree); List<PLUILayout>contextList=getUIContextDataByBtName(bizTypes[i].name,context); List<Tree> btmChildList=new ArrayList<>(); btmChildList.add(bizTypeTree); setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox); if(roleRightVOMap.containsKey(bizTypes[i].oid)){ List<PLUILayout>contextList=getUIContextDataByBtName(bizTypes[i].name,context); List<Tree> btmChildList=new ArrayList<>(); btmChildList.add(bizTypeTree); setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox); } } rootNode.setChildren(childList); treeList.add(rootNode); return treeList; } @Override public boolean authorizedUI(UIAuthorDTO uiAuthorDTO) throws Exception { boolean res=false; if(uiAuthorDTO==null||CollectionUtil.isEmpty(uiAuthorDTO.getSelectTreeList())){ throw new VciBaseException("è¯·éæ©èç¹è¿è¡ææ!"); } BaseQueryObject treeQueryObject=new BaseQueryObject(); Map<String,String> conditionMap = new HashMap<>(); conditionMap.put("roleId",uiAuthorDTO.getRoleId()); conditionMap.put("type",uiAuthorDTO.getType()); conditionMap.put("context",uiAuthorDTO.getContext()); conditionMap.put("showCheckBox","true"); treeQueryObject.setConditionMap(conditionMap); List<Tree> treeList=this.getUIAuthor(treeQueryObject); HashMap<String,Tree> allTreeMap=new HashMap<>(); if(!CollectionUtil.isEmpty(treeList)){ convertTreeDOO2Map(treeList,allTreeMap); List<RoleRightDTO> roleRightDTOList=new ArrayList<>(); List<Tree> selectTreeList= uiAuthorDTO.getSelectTreeList(); getRoleRightDTOS(uiAuthorDTO.getRoleId(),selectTreeList,allTreeMap,roleRightDTOList); } return res; } private void getRoleRightDTOS(String roleOid,List<Tree> selectTreeList,HashMap<String,Tree> allTreeMap, List<RoleRightDTO> roleRightDTOList){ selectTreeList.stream().forEach(tree -> { RoleRightDTO roleRightDTO=new RoleRightDTO(); String id=ObjectUtility.getNewObjectID36(); Object data= tree.getData(); if (data instanceof BizType) {//ä¸å¡ç±»å BizType bizType=(BizType)data; roleRightDTO.setId(id);//ä¸»é® roleRightDTO.setCreateUser(null);//å建è roleRightDTO.setCreateTime(null);//å建æ¶é´ roleRightDTO.setModifyUser(null);//ä¿®æ¹è roleRightDTO.setModifyTime(null);//ä¿®æ¹æ¶é´ roleRightDTO.setRoleId(roleOid);//è§è²ID roleRightDTO.setRightValue(1);// æéå¼ roleRightDTO.setRightType((short) -1);//æéç±»å æéç±»åï¼è¶ 级管çåç»ç®¡çåææä¸º1ï¼ç®¡çåç»æ®éç¨æ·ææä¸º2 roleRightDTO.setFuncId(null); roleRightDTO.setLicensor(null); }else if (data instanceof PLUILayout){//UI }else if (data instanceof PLTabPage) {//UIä¸ä¸æ }else if (data instanceof PLPageDefination) {// }else if (data instanceof PLTabButton) {//æé® } }); } /** * * @param treeList æ èç¹ * @param allTreeMapï¼ææçèç¹ */ private void convertTreeDOO2Map(List<Tree> treeList,Map<String,Tree> allTreeMap){ Optional.ofNullable(treeList).orElseGet(()->new ArrayList<Tree>()).stream().forEach(tree -> { List<Tree> childTreeList= tree.getChildren(); allTreeMap.put(tree.getOid(),tree); if(!CollectionUtil.isEmpty(childTreeList)){ convertTreeDOO2Map(childTreeList,allTreeMap); } }); } private void setChildNode(List<Tree> parentTree, List<PLUILayout>contextList,Map<String,RoleRightVO> roleRightVOMap,boolean isShowCheckBox){ Optional.ofNullable(parentTree).orElseGet(()->new ArrayList<Tree>()).stream().forEach(pTree -> { Object funcObj= pTree.getData(); @@ -340,6 +430,7 @@ contextList.stream().forEach(context->{ Tree childTree=new Tree(context.plOId,context.plName+"("+context.plCode+")",context); childTree.setParentName(pTree.getText()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setParentId(pTree.getOid()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); @@ -364,6 +455,7 @@ Tree childTree=new Tree(plTabPage.plOId,plTabPage.plName,plTabPage); childTree.setParentName(pTree.getText()); childTree.setParentId(pTree.getOid()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); chiledTreeList.add(childTree); @@ -385,6 +477,7 @@ Tree childTree=new Tree(plPageDefination.plOId,plPageDefination.name,plPageDefination); childTree.setParentName(pTree.getText()); childTree.setParentId(pTree.getOid()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); chiledTreeList.add(childTree); @@ -409,6 +502,7 @@ Tree childTree=new Tree(plTabButton.plOId,plTabButton.plLabel,plTabButton); childTree.setParentName(pTree.getText()); childTree.setParentId(pTree.getOid()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); childTree.setLeaf(true); @@ -424,9 +518,18 @@ } }else if (funcObj instanceof PLTabButton) {//æé® String id = ((PLTabButton) funcObj).plTableOId; PLTabButton plTabButton= (PLTabButton) funcObj; String id =plTabButton.plTableOId; if(roleRightVOMap.containsKey(id)){ pTree.setChecked(true); RoleRightVO roleRightVO = roleRightVOMap.get(id); Long rightValue = roleRightVO.getRightValue(); int nodeValue = plTabButton.plSeq; if (nodeValue >= 0 && nodeValue <= 63) { long preValue = (rightValue >> nodeValue) & 1; if (preValue == 1) { pTree.setChecked(true); } } }else{ pTree.setChecked(false); } Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/tt.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ <?xml version="1.0" encoding="UTF-8"?> <JD_DATASET> <JD_SHOWCOLS>3</JD_SHOWCOLS> <JD_FORMQTNAME></JD_FORMQTNAME> <JD_ITEM> <JD_field></JD_field> <JD_or></JD_or> <JD_eq></JD_eq> <JD_trim></JD_trim> <JD_dbl>0</JD_dbl> <JD_cut></JD_cut> <JD_inObj>assignedpartform</JD_inObj> <JD_addFilter>testéå æ¥è¯¢æ¡ä»¶</JD_addFilter> <JD_outType></JD_outType> <JD_pageSize>10</JD_pageSize> <JD_imgWH>60,</JD_imgWH> <JD_outFields>workcontextoid.productnumber,isexpire,partoid.name</JD_outFields> <JD_keyFields></JD_keyFields> <JD_bat></JD_bat> <JD_txf></JD_txf> <JD_name></JD_name> <JD_type></JD_type> <JD_value></JD_value> <JD_showExpression></JD_showExpression> <JD_dateFormat></JD_dateFormat> <JD_cols></JD_cols> <JD_rows></JD_rows> <JD_style></JD_style> <JD_script></JD_script> <JD_tips></JD_tips> <JD_valuelist></JD_valuelist> <JD_listTable></JD_listTable> <JD_listTxt></JD_listTxt> <JD_listVal></JD_listVal> <JD_isEditable></JD_isEditable> <JD_EditableProgram></JD_EditableProgram> <JD_qtName></JD_qtName> <JD_isRequired></JD_isRequired> <JD_seniorQueryCols></JD_seniorQueryCols> <JD_seniorQueryColsCounts></JD_seniorQueryColsCounts> <JD_hrefFields></JD_hrefFields> <JD_hrefConf></JD_hrefConf> <JD_queryRefFields></JD_queryRefFields> <JD_customClass></JD_customClass> <JD_ctrlDisplyCol></JD_ctrlDisplyCol> <JD_ctrlDisplyCondition></JD_ctrlDisplyCondition> <JD_isHttpSave></JD_isHttpSave> <JD_httpVolumnPath></JD_httpVolumnPath> <JD_httpPathField></JD_httpPathField> <JD_editCondition></JD_editCondition> <JD_isNavigatorExpand>true</JD_isNavigatorExpand> <JD_isShowFolder>true</JD_isShowFolder> <JD_parentFolderName>father</JD_parentFolderName> <JD_filterColWidth>250</JD_filterColWidth> <JD_QuerySql></JD_QuerySql> <JD_right></JD_right> </JD_ITEM> </JD_DATASET> Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml
@@ -6,7 +6,7 @@ private-token-key: vciweb20210212 ###tomcatç¸å ³çé ç½® server: port: 12000 port: 12005 servlet: context-path: /web tomcat: @@ -42,7 +42,7 @@ host: localhost # ipå°å database: 2 # redisæ°æ®åº 0-15 port: 6379 # 端å£å· password: 123456 # æ å¯ç ä¸å¡« password: foobared # æ å¯ç ä¸å¡« timeout: 30000s # è¿æ¥è¶ æ¶æ¶é´ ï¼é»è®¤1å¤©ï¼ lettuce: shutdown-timeout: 100ms # å ³éè¶ æ¶æ¶é´ é»è®¤ 100ms