From 0baeb5d2b147bf29add1e5373652ae70dd749b69 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期五, 24 三月 2023 21:08:55 +0800
Subject: [PATCH] 更新密码策略功能

---
 Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java          |   15 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java                |   20 +
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java              |    7 
 Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java            |   14 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java            |   16 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml                  |   17 +
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java                |    9 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java          |    2 
 Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/UserPwdstrategyVO.java            |   29 ++
 Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java        |   15 +
 Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java                             |    4 
 Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java                 |    6 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml                 |   17 +
 Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java                                           |    3 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java |   54 +++-
 Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java                                  |   22 +
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java             |    7 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPwdstrategyController.java    |   62 ++++
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java         |   18 +
 Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java                     |    6 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java                 |    7 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java     |    5 
 Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java                             |    1 
 Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java         |   58 ++++
 Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml                     |   15 
 Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java                  |   22 +
 Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java            |   10 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java           |   30 ++
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml             |   11 
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java      |   11 
 Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java                 |    7 
 Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java                |   29 ++
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java                         |   24 +
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java                   |   15 +
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java         |    4 
 Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java                       |   24 +
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java        |   49 +++
 Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml                    |   70 +----
 38 files changed, 591 insertions(+), 144 deletions(-)

diff --git a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java
index 979a7c8..562c53d 100644
--- a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java
+++ b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetails.java
@@ -79,6 +79,28 @@
 	 * 鐢ㄦ埛璇︽儏
 	 */
 	private final Kv detail;
+	/**
+	 * 瀵嗙爜绛栫暐淇敼鐘舵��
+	 */
+	private Long strategyUpdateStatus;
+
+
+	public BladeUserDetails(Long userId, String tenantId, String oauthId, String name, String realName, String deptId, String postId, String roleId, String roleName, String avatar, String username, String password, Kv detail, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities,Long strategyUpdateStatus) {
+		super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
+		this.userId = userId;
+		this.tenantId = tenantId;
+		this.oauthId = oauthId;
+		this.name = name;
+		this.realName = realName;
+		this.account = username;
+		this.deptId = deptId;
+		this.postId = postId;
+		this.roleId = roleId;
+		this.roleName = roleName;
+		this.avatar = avatar;
+		this.detail = detail;
+		this.strategyUpdateStatus = strategyUpdateStatus;
+	}
 
 	public BladeUserDetails(Long userId, String tenantId, String oauthId, String name, String realName, String deptId, String postId, String roleId, String roleName, String avatar, String username, String password, Kv detail, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
 		super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
diff --git a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
index d5c89f4..3efc4ed 100644
--- a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
+++ b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
@@ -31,6 +31,7 @@
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.*;
 import org.springblade.system.cache.ParamCache;
+import org.springblade.system.entity.Strategy;
 import org.springblade.system.entity.Tenant;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
@@ -77,6 +78,7 @@
 
 	private final JwtProperties jwtProperties;
 
+
 	/**
 	 * 瓒呯骇绠$悊鍛樹俊鎭�
 	 */
@@ -116,16 +118,21 @@
 
 		// 鎸囧畾绉熸埛ID
 		String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
+
+		Log.debug("褰撳墠鐧诲綍鐢ㄦ埛鐨勭鎴稩d涓猴細"+tenantId+"褰撳墠鐧诲綍鐢ㄦ埛鍚嶄负锛�"+username);
+		Strategy strategy = sysClient.getByTenantIdAndName(tenantId, username).getData();
+
 		// 鍒ゆ柇鐧诲綍鏄惁閿佸畾
 		int count = getFailCount(tenantId, username);
-		int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), FAIL_COUNT);
+		int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), Func.toInt(strategy.getLockingNum()));
+
 		if (count >= failCount) {
 			throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
 		}
 		//瓒呯骇绠$悊鍛橀厤缃枃浠堕厤缃处鍙峰瘑鐮侊紝瀹炵幇鐧诲綍, 榛樿绉熸埛id涓�000000
 		if(tenantId.equals(this.tenantId)){
 			if (!this.userName.equals(username) && !password.equalsIgnoreCase(this.password)) {
-				setFailCount(tenantId, username, count);
+				setFailCount(tenantId, username, count,strategy.getLockingTime());
 				throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
 			}
 			//濡傛灉ip姣斿鍚巊et鎶涘嚭寮傚父No value present灏辩洿鎺ユ姏寮傚父缁撴潫鐧诲綍
@@ -180,12 +187,13 @@
 				User user = userInfo.getUser();
 				// 鐢ㄦ埛涓嶅瓨鍦�,浣嗘彁绀虹敤鎴峰悕涓庡瘑鐮侀敊璇苟閿佸畾璐﹀彿
 				if (user == null || user.getId() == null) {
-					setFailCount(tenantId, username, count);
+					setFailCount(tenantId, username, count,strategy.getLockingTime());
 					throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
 				}
+				String hex = DigestUtil.hex(password);
 				// 鐢ㄦ埛瀛樺湪浣嗗瘑鐮侀敊璇�,瓒呰繃娆℃暟鍒欓攣瀹氳处鍙�
-				if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(DigestUtil.hex(password))) {
-					setFailCount(tenantId, username, count);
+				if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(hex)) {
+					setFailCount(tenantId, username, count,strategy.getLockingTime());
 					throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
 				}
 				// 鐢ㄦ埛瑙掕壊涓嶅瓨鍦�
@@ -210,7 +218,7 @@
 				BladeUserDetails bladeUserDetails = new BladeUserDetails(user.getId(),
 					user.getTenantId(), StringPool.EMPTY, user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(userInfo.getRoles()), Func.toStr(user.getAvatar(), TokenUtil.DEFAULT_AVATAR),
 					username, AuthConstant.ENCRYPT + user.getPassword(), userInfo.getDetail(), true, true, true, true,
-					AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())));
+					AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())),user.getStrategyUpdateStatus());
 				return bladeUserDetails;
 			} else {
 				throw new UsernameNotFoundException(result.getMsg());
@@ -279,8 +287,8 @@
 	 * @param username 璐﹀彿
 	 * @param count    娆℃暟
 	 */
-	private void setFailCount(String tenantId, String username, int count) {
-		bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username), count + 1, Duration.ofMinutes(30));
+	private void setFailCount(String tenantId, String username, int count, Long expir) {
+		bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username), count + 1, Duration.ofMinutes(expir));
 	}
 
 	/**
diff --git a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java
index c9fed81..5baaaee 100644
--- a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java
+++ b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/support/BladeJwtTokenEnhancer.java
@@ -64,6 +64,7 @@
 		info.put(TokenUtil.AVATAR, principal.getAvatar());
 		info.put(TokenUtil.DETAIL, principal.getDetail());
 		info.put(TokenUtil.LICENSE, TokenUtil.LICENSE_NAME);
+		info.put(TokenUtil.STRATEGYUPDATESTATUS, principal.getStrategyUpdateStatus());
 		((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);
 
 		//token鐘舵�佽缃�
diff --git a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
index b513083..f1f3f3c 100644
--- a/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
+++ b/Source/BladeX/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
@@ -21,7 +21,6 @@
 import org.springblade.core.launch.constant.TokenConstant;
 import org.springblade.core.tenant.BladeTenantProperties;
 import org.springblade.core.tool.constant.BladeConstant;
-import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.utils.*;
 import org.springblade.system.entity.Tenant;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -30,7 +29,6 @@
 
 import java.util.Base64;
 import java.util.Calendar;
-import java.util.Date;
 
 /**
  * 璁よ瘉宸ュ叿绫�
@@ -55,6 +53,7 @@
 	public final static String DETAIL = TokenConstant.DETAIL;
 	public final static String LICENSE = TokenConstant.LICENSE;
 	public final static String LICENSE_NAME = TokenConstant.LICENSE_NAME;
+	public final static String STRATEGYUPDATESTATUS = "strategyUpdateStatus";
 
 	public final static String DEPT_HEADER_KEY = "Dept-Id";
 	public final static String ROLE_HEADER_KEY = "Role-Id";
diff --git a/Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java b/Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
index f6f3d28..fdd1df6 100644
--- a/Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
+++ b/Source/BladeX/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
@@ -40,8 +40,8 @@
 	/**
 	 * nacos dev 鍦板潃
 	 */
-	String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
-	//String NACOS_DEV_ADDR = "192.168.93.133:38848";
+	//String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
+	String NACOS_DEV_ADDR = "192.168.93.133:38848";
 
 	/**
 	 * nacos prod 鍦板潃
diff --git a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java
index 63aecd3..8e9eaef 100644
--- a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java
+++ b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Strategy.java
@@ -146,6 +146,12 @@
 	private String licensors;
 
 	/**
+	 * 缁勫悎鏂瑰紡姝e垯
+	 */
+	@ApiModelProperty(value = "鎺堟潈浜�")
+	private String regex;
+
+	/**
 	 * 缁勫悎鍚嶇О
 	 */
 	@ApiModelProperty(value = "缁勫悎鍚嶇О")
diff --git a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java
index 9048e87..aefd34e 100644
--- a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java
+++ b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/UserPwdstrategy.java
@@ -1,6 +1,7 @@
 package org.springblade.system.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -26,15 +27,15 @@
 @ApiModel(value = "UserPwdStrtategy", description = "UserPwdStrtategy")
 public class UserPwdstrategy implements Serializable {
 
-	private static final long serialVersionUID = -556926788101426521L;
+	private static final long serialVersionUid = -556926788101426521L;
 
 	/**
 	 * 涓婚敭
 	 */
 	@JsonSerialize(using = ToStringSerializer.class)
 	@ApiModelProperty(value = "涓婚敭")
-	@TableId(value = "id", type = IdType.ASSIGN_ID)
-	private Long Id;
+	@TableId(value = "ID", type = IdType.ASSIGN_ID)
+	private Long id;
 
 	/**
 	 * 鐢ㄦ埛id
@@ -46,6 +47,7 @@
 	 * 瀵嗙爜绛栫暐id
 	 */
 	@ApiModelProperty(value = "瀵嗙爜绛栫暐id")
+	@TableField(value = "PWDSTRATEGY_ID")
 	private Long pwdstrategyId;
 
 	public UserPwdstrategy(Long userId, Long pwdStrategyId) {
@@ -62,11 +64,14 @@
 			return false;
 		}
 		UserPwdstrategy that = (UserPwdstrategy) o;
-		return Objects.equals(Id, that.Id) && Objects.equals(userId, that.userId) && Objects.equals(pwdstrategyId, that.pwdstrategyId);
+		return Objects.equals(id, that.id) && Objects.equals(userId, that.userId) && Objects.equals(pwdstrategyId, that.pwdstrategyId);
 	}
 
 	@Override
 	public int hashCode() {
-		return Objects.hash(Id, userId, pwdstrategyId);
+		return Objects.hash(id, userId, pwdstrategyId);
 	}
+
+
+
 }
diff --git a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
index 278ba4a..94d56f2 100644
--- a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
+++ b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
@@ -21,6 +21,8 @@
 import org.springblade.system.entity.*;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -63,6 +65,9 @@
 	String PARAM = API_PREFIX + "/param";
 	String PARAM_VALUE = API_PREFIX + "/param-value";
 	String REGION = API_PREFIX + "/region";
+	String STRATEGY = API_PREFIX + "/query-tenantid-name";
+	String STRATEGYBYID = API_PREFIX + "/query-userid";
+	String REGEX = API_PREFIX + "/combination-regex";
 
 	/**
 	 * 鑾峰彇鑿滃崟
@@ -285,4 +290,28 @@
 	@GetMapping(REGION)
 	R<Region> getRegion(@RequestParam("code") String code);
 
+	/**
+	 * 鏍规嵁绉熸埛id浠ュ強鐢ㄦ埛鍚嶈幏鍙栧瘑鐮佺瓥鐣�
+	 * @param tenantId
+	 * @param name
+	 * @return
+	 */
+	@PostMapping(STRATEGY)
+	R<Strategy>  getByTenantIdAndName(@RequestParam("tenantId") String tenantId, @RequestParam("name") String name);
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛id鑾峰彇瀵嗙爜绛栫暐
+	 * @param userId
+	 * @return
+	 */
+	@PostMapping(STRATEGYBYID)
+	R<Strategy>  getByUserId(@RequestParam("id") Long userId);
+
+	/**
+	 * 鏍规嵁缁勫悎鏂瑰紡id鑾峰彇鍊�
+	 * @return
+	 */
+	@PostMapping(REGEX)
+	R<String> getRegex(@RequestBody List<String> combinationIds);
+
 }
diff --git a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
index 069878c..10cf0a0 100644
--- a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
+++ b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
@@ -150,5 +150,20 @@
 		return R.fail("鑾峰彇鏁版嵁澶辫触");
 	}
 
+	@Override
+	public R<Strategy> getByTenantIdAndName(String tenantId, String name) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Strategy> getByUserId(Long userId) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<String> getRegex(List<String> combinationIds) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
 
 }
diff --git a/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/UserPwdstrategyVO.java b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/UserPwdstrategyVO.java
new file mode 100644
index 0000000..ba40eb1
--- /dev/null
+++ b/Source/BladeX/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/UserPwdstrategyVO.java
@@ -0,0 +1,29 @@
+package org.springblade.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.entity.UserPwdstrategy;
+
+import java.util.List;
+
+/**
+ * (UserPwdStrtategy)瀹炰綋绫�
+ *
+ * @author makejava
+ * @since 2023-03-20 14:59:29
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "TenantVO瀵硅薄", description = "TenantVO瀵硅薄")
+public class UserPwdstrategyVO extends UserPwdstrategy {
+
+	private static final long serialVersionUID = 336389756425054417L;
+
+	@ApiModelProperty(value = "闇�瑕佷慨鏀规垨鑰呮柊澧炲瘑鐮佺瓥鐣ョ殑鐢ㄦ埛id")
+	private List<Long> userIds;
+
+
+}
diff --git a/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java b/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
index 4d39097..b04494c 100644
--- a/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
+++ b/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
@@ -52,11 +52,6 @@
 	 * 瀵嗙爜
 	 */
 	private String password;
-	@TableField(exist = false)
-	/**
-	 * 瀵嗙爜绛栫暐
-	 */
-	private String pwdStrategy;
 	/**
 	 * 鏄电О
 	 */
@@ -94,8 +89,25 @@
 	 */
 	private String deptId;
 	/**
+	 * 瀵嗙爜绛栫暐
+	 */
+	@TableField(exist = false)
+	private String pwdStrategy;
+	/**
 	 * 宀椾綅id
 	 */
 	private String postId;
+	/**
+	 * 瀵嗙爜淇敼鏃堕棿
+	 */
+	private Date pwdUpdateTime;
+	/**
+	 * 鐢ㄦ埛瀵嗙骇
+	 */
+	private String secretgrade;
+	/**
+	 * 瀵嗙爜绛栫暐淇敼鐘舵��
+	 */
+	private Long strategyUpdateStatus;
 
 }
diff --git a/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java b/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
index c04e629..8a412cc 100644
--- a/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
+++ b/Source/BladeX/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
@@ -49,6 +49,7 @@
 	String SAVE_USER = API_PREFIX + "/save-user";
 	String SAVE_USER_LIST = API_PREFIX + "/save-user-list";
 	String REMOVE_USER = API_PREFIX + "/remove-user";
+	String UPDATE_USER = API_PREFIX+"/update-user";
 
 	/**
 	 * 鑾峰彇鐢ㄦ埛淇℃伅
@@ -58,7 +59,6 @@
 	 */
 	@GetMapping(USER_INFO_BY_ID)
 	R<User> userInfoById(@RequestParam("userId") Long userId);
-
 
 	/**
 	 * 鏍规嵁璐﹀彿鑾峰彇鐢ㄦ埛淇℃伅
@@ -126,4 +126,12 @@
 	@PostMapping(REMOVE_USER)
 	R<Boolean> removeUser(@RequestParam("tenantIds") String tenantIds);
 
+	/**
+	 * 淇敼鐢ㄦ埛鍩虹淇℃伅
+	 * @param user
+	 * @return
+	 */
+	@PostMapping(UPDATE_USER)
+	R<Boolean> updateUser(@RequestBody User user);
+
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java
index be8eb8a..d89b21a 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/StrategyController.java
@@ -20,7 +20,7 @@
 import java.util.List;
 
 /**
- * 瀵嗙爜绛栫暐(PlSysStrategy)琛ㄦ帶鍒跺眰
+ * 瀵嗙爜绛栫暐(Strategy)琛ㄦ帶鍒跺眰
  *
  * @author makejava
  * @since 2023-03-20 16:45:31
@@ -47,10 +47,23 @@
 	 */
 	@GetMapping("/page")
 	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "鍒嗛〉鏌ヨ", notes = "浼犲叆combination锛屽垎椤靛弬鏁皅uery")
+	@ApiOperation(value = "鍒嗛〉鏌ヨ", notes = "浼犲叆鍒嗛〉鍙傛暟query")
 	public R<Page<Strategy>> queryByPage(Query query) {
 		Page<Strategy> strategyPage = strategyService.queryAllByPage(query);
 		return R.data(strategyPage);
+	}
+
+	/**
+	 * 鏌ヨ榛樿瀵嗙爜绛栫暐
+	 *
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@GetMapping("/default")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "鏌ヨ榛樿瀵嗙爜绛栫暐")
+	public R<Strategy> queryByIsDefault() {
+		Strategy strategy = strategyService.queryByIsDefault();
+		return R.data(strategy);
 	}
 
 	/**
@@ -92,5 +105,18 @@
 		return ResponseEntity.ok(this.strategyService.deleteByIds(ids));
 	}
 
+	/**
+	 * 鏍规嵁鐢ㄦ埛id鏌ヨ瀵嗙爜绛栫暐
+	 *
+	 * @param userId 瀹炰綋
+	 * @return 鏂板缁撴灉
+	 */
+	@PostMapping("/query-userid")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "鏍规嵁鐢ㄦ埛id鏌ヨ瀵嗙爜绛栫暐", notes = "浼犲叆userId")
+	public R<Strategy> queryByUserId(@Valid @RequestParam Long userId) {
+		return R.data(this.strategyService.queryByUserId(userId));
+	}
+
 }
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPwdstrategyController.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPwdstrategyController.java
new file mode 100644
index 0000000..aaa6062
--- /dev/null
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPwdstrategyController.java
@@ -0,0 +1,62 @@
+package org.springblade.system.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.system.service.IUserPwdstrategyService;
+import org.springblade.system.vo.UserPwdstrategyVO;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * 鐢ㄦ埛瀵嗙爜绛栫暐鍏宠仈(UserPwdstrategy)琛ㄦ帶鍒跺眰
+ *
+ * @author ludc
+ * @since 2023-03-20 15:23:24
+ */
+@NonDS
+@ApiIgnore
+@AllArgsConstructor
+@RestController
+@RequestMapping("/user-pwdstrategy")
+@Api(value = "鐢ㄦ埛瀵嗙爜瀹夊叏绛栫暐鍏宠仈琛�", tags = "鎺ュ彛")
+public class UserPwdstrategyController {
+
+	@Resource
+	private IUserPwdstrategyService userPwdstrategyService;
+
+	/**
+	 * 鏂板鍜屼慨鏀规暟鎹�
+	 *
+	 * @param userPwdstrategyVO 瀹炰綋
+	 * @return 鏂板缁撴灉
+	 */
+	@PutMapping("/insert")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "鏂板鏁版嵁", notes = "浼犲叆userPwdstrategy")
+	public ResponseEntity<Boolean> insert(@Valid @RequestBody UserPwdstrategyVO userPwdstrategyVO) {
+		return ResponseEntity.ok(this.userPwdstrategyService.submit(userPwdstrategyVO));
+	}
+
+	/**
+	 * 鏂板鍜屼慨鏀规暟鎹�
+	 *
+	 * @param userPwdstrategyVO 瀹炰綋
+	 * @return 鏂板缁撴灉
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "淇敼鏁版嵁", notes = "浼犲叆userPwdstrategy")
+	public ResponseEntity<Boolean> update(@Valid @RequestBody UserPwdstrategyVO userPwdstrategyVO) {
+		return ResponseEntity.ok(this.userPwdstrategyService.submit(userPwdstrategyVO));
+	}
+
+
+
+}
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java
index 59c1594..6dca0b9 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/controller/ValueRangeController.java
@@ -21,9 +21,9 @@
 import java.util.List;
 
 /**
- * (ValueRange)琛ㄦ帶鍒跺眰
+ * (ValueRangeController)琛ㄦ帶鍒跺眰
  *
- * @author makejava
+ * @author ludc
  * @since 2023-03-20 15:23:24
  */
 @NonDS
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java
index 24898fa..ae2be56 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java
@@ -22,6 +22,8 @@
 import org.springblade.system.entity.*;
 import org.springblade.system.service.*;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
@@ -53,6 +55,10 @@
 	private final IParamService paramService;
 
 	private final IRegionService regionService;
+
+	private final IStrategyService strategyService;
+
+	private final ICombinationService combinationService;
 
 	@Override
 	@GetMapping(MENU)
@@ -191,5 +197,23 @@
 		return R.data(regionService.getById(code));
 	}
 
+	@Override
+	@PostMapping(STRATEGY)
+	public R<Strategy> getByTenantIdAndName(String tenantId, String name) {
+		return R.data(strategyService.queryByNameAndTenantId(tenantId,name));
+	}
+
+	@Override
+	@PostMapping(STRATEGYBYID)
+	public R<Strategy> getByUserId(Long userId) {
+		return R.data(strategyService.queryByUserId(userId));
+	}
+
+	@Override
+	@PostMapping(REGEX)
+	public R<String> getRegex(@RequestBody List<String> combinationIds) {
+		return R.data(combinationService.getRegex(combinationIds));
+	}
+
 
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java
index 6305297..f3fee85 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.system.entity.Combination;
 
 import java.util.List;
@@ -38,5 +39,13 @@
 	 */
 	long count(Combination combination);
 
+	/**
+	 * 鏌ヨ缁勫悎鏂瑰紡姝e垯
+	 *
+	 * @param combinationIds 鏌ヨ鏉′欢
+	 * @return 鎬昏鏁�
+	 */
+	String queryRegex(@Param("combinationIds") List<String> combinationIds);
+
 }
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml
index 401a0fc..159254d 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/CombinationMapper.xml
@@ -6,10 +6,10 @@
         <result property="id" column="ID" jdbcType="VARCHAR"/>
         <result property="name" column="NAME" jdbcType="VARCHAR"/>
         <result property="desc" column="DESC" jdbcType="VARCHAR"/>
-        <result property="createtime" column="CREATETIME" jdbcType="TIMESTAMP"/>
-        <result property="createuser" column="CREATEUSER" jdbcType="VARCHAR"/>
-        <result property="updatetime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
-        <result property="updateuser" column="UPDATEUSER" jdbcType="VARCHAR"/>
+        <result property="createTime" column="CREATETIME" jdbcType="TIMESTAMP"/>
+        <result property="createUser" column="CREATEUSER" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
+        <result property="updateUser" column="UPDATEUSER" jdbcType="VARCHAR"/>
         <result property="licensors" column="LICENSORS" jdbcType="VARCHAR"/>
     </resultMap>
 
@@ -87,5 +87,14 @@
         limit #{pageable.offset}, #{pageable.pageSize}
     </select>
 
+    <select id="queryRegex" resultType="java.lang.String">
+        SELECT REPLACE(WM_CONCAT(psc.REGEX),',[','[') from PL_SYS_COMBINATION psc
+        WHERE psc.ID IN (
+        <foreach collection="combinationIds" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </select>
+
 </mapper>
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java
index 4d6db55..40916fa 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.java
@@ -3,6 +3,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.system.entity.Strategy;
 
 import java.util.List;
@@ -31,5 +32,19 @@
 	 */
 	long count(Strategy plSysStrategy);
 
+	/**
+	 * 鏍规嵁鐢ㄦ埛鍚嶄互鍙婄鎴稩D鏌ヨ瀵嗙爜绛栫暐
+	 * @return
+	 */
+	Strategy queryByNameAndTenantId(@Param("tenantId") String tenantId,@Param("name") String name);
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛id杩涜鏌ヨ
+	 *
+	 * @param userId 鐢ㄦ埛id
+	 * @return 瀵硅薄
+	 */
+	Strategy queryByUserId(@Param("userId") Long userId);
+
 }
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml
index fdd77f4..5b3e32f 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/StrategyMapper.xml
@@ -7,7 +7,7 @@
         <result property="strategyName" column="STRATEGY_NAME" jdbcType="VARCHAR"/>
         <result property="minPwdLen" column="MIN_PWD_LEN" jdbcType="VARCHAR"/>
         <result property="maxPwdLen" column="MAX_PWD_LEN" jdbcType="VARCHAR"/>
-        <result property="combinationIds" column="COMBINATION " jdbcType="VARCHAR"/>
+        <result property="combinationIds" column="COMBINATION_IDS" jdbcType="VARCHAR"/>
         <result property="requiredType" column="REQUIRED_TYPE" jdbcType="VARCHAR"/>
         <result property="expirationTime" column="EXPIRATION_TIME" jdbcType="TIMESTAMP"/>
         <result property="reminderTime" column="REMINDER_TIME" jdbcType="TIMESTAMP"/>
@@ -20,6 +20,7 @@
         <result property="updateTime" column="UPDATE_TIME" jdbcType="TIMESTAMP"/>
         <result property="updateUser" column="UPDATE_USER" jdbcType="TIMESTAMP"/>
         <result property="combinationNames" column="COMBINATIONNAMES"/>
+        <result property="regex" column="REGEX"/>
     </resultMap>
 
     <!--鏌ヨ鎸囧畾琛屾暟鎹�-->
@@ -87,63 +88,18 @@
         </where>
     </select>
 
-    <!--閫氳繃涓婚敭淇敼鏁版嵁-->
-    <!--<update id="update">
-        update PL_SYS_STRATEGY
-        <set>
-            <if test="strategyName != null and strategyName != ''">
-                STRATEGY_NAME = #{strategyName},
-            </if>
-            <if test="minPwdLen != null and minPwdLen != ''">
-                MIN_PWD_LEN = #{minPwdLen},
-            </if>
-            <if test="maxPwdLen != null and maxPwdLen != ''">
-                MAX_PWD_LEN = #{maxPwdLen},
-            </if>
-            <if test="combination  != null and combination  != ''">
-                COMBINATION  = #{combination },
-            </if>
-            <if test="requiredType != null and requiredType != ''">
-                REQUIRED_TYPE = #{requiredType},
-            </if>
-            <if test="expirationTime != null">
-                EXPIRATION_TIME = #{expirationTime},
-            </if>
-            <if test="reminderTime != null">
-                REMINDER_TIME = #{reminderTime},
-            </if>
-            <if test="lockingNum != null and lockingNum != ''">
-                LOCKING_NUM = #{lockingNum},
-            </if>
-            <if test="lockingTime != null">
-                LOCKING_TIME = #{lockingTime},
-            </if>
-            <if test="desc != null and desc != ''">
-                DESC = #{desc},
-            </if>
-            <if test="isDefault != null and isDefault != ''">
-                IS_DEFAULT = #{isDefault},
-            </if>
-            <if test="createDate != null">
-                CREATE_DATE = #{createDate},
-            </if>
-            <if test="createUser != null">
-                CREATE_USER = #{createUser},
-            </if>
-            <if test="updateDate != null">
-                UPDATE_DATE = #{updateDate},
-            </if>
-            <if test="updateUser != null">
-                UPDATE_USER = #{updateUser},
-            </if>
-        </set>
-        where ID = #{id}
-    </update>
 
-    &lt;!&ndash;閫氳繃涓婚敭鍒犻櫎&ndash;&gt;
-    <delete id="deleteById">
-        delete from PL_SYS_STRATEGY where ID = #{id}
-    </delete>-->
+    <select id="queryByNameAndTenantId" resultMap="StrategyMap">
+        SELECT PSS.* FROM PL_SYS_STRATEGY PSS
+              LEFT JOIN PL_SYS_USER_PWDSTRATEGY PSUP ON PSS.ID=PSUP.PWDSTRATEGY_ID
+              LEFT JOIN PL_ORG_USER POU ON POU.ID=PSUP.USER_ID
+        WHERE POU.TENANT_ID = #{tenantId} AND POU.NAME=#{name};
+    </select>
+
+    <select id="queryByUserId" resultMap="StrategyMap">
+        SELECT PSS.* FROM PL_SYS_STRATEGY PSS LEFT JOIN PL_SYS_USER_PWDSTRATEGY PSUP ON PSS.ID=psup.PWDSTRATEGY_ID
+        WHERE PSUP.USER_ID = #{userId}
+    </select>
 
 </mapper>
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java
index 5fab84e..15876ae 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springblade.system.entity.UserPwdstrategy;
 
+import java.util.List;
+
 /**
  * 鐢ㄦ埛瀵嗙爜绛栫暐绠$悊琛�(UserPwdstrategy)琛ㄦ暟鎹簱璁块棶灞�
  *
@@ -20,14 +22,6 @@
 	UserPwdstrategy queryById(Long id);
 
 	/**
-	 * 缁熻鎬昏鏁�
-	 *
-	 * @param UserPwdstrategy 鏌ヨ鏉′欢
-	 * @return 鎬昏鏁�
-	 */
-	long count(UserPwdstrategy UserPwdstrategy);
-
-	/**
 	 * 淇敼鏁版嵁
 	 *
 	 * @param UserPwdstrategy 瀹炰緥瀵硅薄
@@ -36,12 +30,12 @@
 	int update(UserPwdstrategy UserPwdstrategy);
 
 	/**
-	 * 閫氳繃涓婚敭鍒犻櫎鏁版嵁
+	 * 閫氳繃鐢ㄦ埛id杩涜鍒犻櫎鏁版嵁
 	 *
-	 * @param id 涓婚敭
+	 * @param userIds 鐢ㄦ埛id
 	 * @return 褰卞搷琛屾暟
 	 */
-	int deleteById(Long id);
+	int deleteByUserIds(List<Long> userIds);
 
 }
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml
index 6092003..62eea8a 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserPwdstrategyMapper.xml
@@ -48,11 +48,12 @@
         where ID = #{id}
     </update>
 
-    <!--閫氳繃涓婚敭鍒犻櫎-->
-    <delete id="deleteById">
-        delete
-        from PL_SYS_USER_PWDSTRATEGY
-        where ID = #{id}
+    <delete id="deleteByUserIds">
+        DELETE FROM PL_SYS_USER_PWDSTRATEGY WHERE USER_ID IN (
+        <foreach collection="userIds" item="uId" separator=",">
+            #{uId}
+        </foreach>
+        )
     </delete>
 
 </mapper>
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java
index caf701c..05ef2cd 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.java
@@ -32,5 +32,12 @@
 	 */
 	long count(ValueRange valueRannge);
 
+
+	/**
+	 * 鏍圭┒缁勫悎id鏌ヨ鍙栧��
+	 * @return
+	 */
+	List<String> queryByCombinationIds(@Param("combinationIds") List<String> combinationIds);
+
 }
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml
index ebfcfa8..6b38726 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/mapper/ValueRangeMapper.xml
@@ -6,10 +6,10 @@
         <result property="id" column="ID" jdbcType="VARCHAR"/>
         <result property="value" column="VALUE" jdbcType="VARCHAR"/>
         <result property="combinationId" column="COMBINATION_ID" jdbcType="VARCHAR"/>
-        <result property="createuser" column="CREATEUSER" jdbcType="VARCHAR"/>
-        <result property="updatetime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
-        <result property="updateuser" column="UPDATEUSER" jdbcType="VARCHAR"/>
-        <result property="createtime" column="CREATETIME" jdbcType="TIMESTAMP"/>
+        <result property="updateTime" column="CREATEUSER" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="UPDATETIME" jdbcType="TIMESTAMP"/>
+        <result property="createUser" column="UPDATEUSER" jdbcType="VARCHAR"/>
+        <result property="createTime" column="CREATETIME" jdbcType="TIMESTAMP"/>
     </resultMap>
 
     <!--鏌ヨ鎸囧畾琛屾暟鎹�-->
@@ -72,5 +72,14 @@
         </where>
     </select>
 
+    <select id="queryByCombinationIds" resultType="java.util.List">
+        SELECT "VALUE" FROM PL_SYS_VALUE_RANGE PSVR
+        WHERE PSVR.COMBINATION_ID IN (
+            <foreach collection="combinationIds" item="id" separator=",">
+                #{id}
+            </foreach>
+        )
+    </select>
+
 </mapper>
 
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java
index 5d26a8a..fa3438d 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/ICombinationService.java
@@ -55,4 +55,11 @@
 	 */
 	List<Map<String,Object>> selectMaps();
 
+	/**
+	 * 涓嬫媺鏁版嵁婧愭煡璇�
+	 * 鏌ヨ缁勫悎id锛坘ey锛夛細缁勫悎鍚嶏紙value锛�
+	 * @return
+	 */
+	String getRegex(List<String> combinationIds);
+
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java
index 00e002d..bc3e471 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IStrategyService.java
@@ -24,6 +24,13 @@
 	Strategy queryById(String id);
 
 	/**
+	 * 鏌ヨ榛樿瀵嗙爜绛栫暐
+	 *
+	 * @return 瀹炰緥瀵硅薄
+	 */
+	Strategy queryByIsDefault();
+
+	/**
 	 * 鍒嗛〉鏌ヨ
 	 *
 	 * @param query 鍒嗛〉瀵硅薄
@@ -48,9 +55,18 @@
 	boolean deleteByIds(List<String> ids);
 
 	/**
-	 * 鏌ヨ榛樿瀵嗙爜绛栫暐
+	 * 閫氳繃绉熸埛id浠ュ強鐢ㄦ埛鍚嶆煡璇㈠瘑鐮佺瓥鐣�
+	 * @param tenantId
+	 * @param name
 	 * @return
 	 */
-	Long queryByIsDefault();
+	Strategy queryByNameAndTenantId(String tenantId, String name);
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛id鏌ヨ瀵嗙爜绛栫暐
+	 * @param userId
+	 * @return
+	 */
+	Strategy queryByUserId(Long userId);
 
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java
index 633d270..03e26cf 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPwdstrategyService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.system.entity.UserPwdstrategy;
+import org.springblade.system.vo.UserPwdstrategyVO;
 
 /**
  * 鐢ㄦ埛瀵嗙爜绛栫暐绠$悊琛�(UserPwdstrategy)琛ㄦ湇鍔℃帴鍙�
@@ -12,11 +13,22 @@
 public interface IUserPwdstrategyService extends IService<UserPwdstrategy> {
 
 	/**
-	 * 鏂板鎴栦慨鏀规暟鎹�
+	 * 閫氳繃ID鏌ヨ鍗曟潯鏁版嵁
 	 *
-	 * @param UserPwdstrategy 瀹炰緥瀵硅薄
+	 * @param id 涓婚敭
 	 * @return 瀹炰緥瀵硅薄
 	 */
-	boolean submit(UserPwdstrategy UserPwdstrategy);
+	UserPwdstrategy queryById(Long id);
+
+	/**
+	 * 鏂板鎴栦慨鏀规暟鎹�
+	 *
+	 * @param userPwdstrategyVO 瀹炰緥瀵硅薄
+	 * @return 瀹炰緥瀵硅薄
+	 */
+	Boolean submit(UserPwdstrategyVO userPwdstrategyVO);
+
+
+
 
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java
index adb9581..9dcea9b 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/IValueRangeService.java
@@ -46,4 +46,11 @@
 	 */
 	boolean deleteByIds(List<String> ids);
 
+	/**
+	 * 鑾峰彇鍙栧��
+	 *
+	 * @return 鏄惁鎴愬姛
+	 */
+	List<String> getByAllString(List<String> combinationIds);
+
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java
index 80be3ee..5f27705 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/CombinationServiceImpl.java
@@ -114,4 +114,9 @@
 		return maps;
 	}
 
+	@Override
+	public String getRegex(List<String> combinationIds) {
+		return combinationMapper.queryRegex(combinationIds);
+	}
+
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java
index f76c5aa..8d0c523 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/StrategyServiceImpl.java
@@ -44,6 +44,16 @@
 	}
 
 	/**
+	 * 鏌ヨ榛樿瀵嗙爜绛栫暐
+	 * @return
+	 */
+	@Override
+	public Strategy queryByIsDefault() {
+		return this.getOne(Wrappers.<Strategy>query().lambda()
+			.eq(Strategy::getIsDefault, CommonConstant.DATA_SCOPE_CATEGORY));
+	}
+
+	/**
 	 * 鍒嗛〉鏌ヨ
 	 *
 	 * @param query 鍒嗛〉瀵硅薄
@@ -77,6 +87,18 @@
 				this.update(Wrappers.<Strategy>update().lambda()
 					.set(Strategy::getIsDefault, CommonConstant.NOT_SEALED_ID)
 					.eq(Strategy::getIsDefault, CommonConstant.DATA_SCOPE_CATEGORY));
+			}
+			if(strategy.getRequiredType() > 0){
+				throw new ServiceException("蹇呭~绉嶇被涓嶈兘灏忎簬绛変簬0!");
+			}
+			if(strategy.getRequiredType() > strategy.getCombinationIds().split(",").length){
+				throw new ServiceException("蹇呭~绉嶇被涓嶈兘澶т簬鎵�閫夋嫨鐨勫瘑鐮佺粍鍚堟柟寮忕殑涓暟!");
+			}
+			if(strategy.getMaxPwdLen() > strategy.getMinPwdLen()){
+				throw new ServiceException("瀵嗙爜鏈�澶ч暱搴︿笉鑳藉皬浜庢渶灏忛暱搴�!");
+			}
+			if(strategy.getMinPwdLen() < strategy.getCombinationIds().split(",").length || strategy.getMaxPwdLen() < strategy.getCombinationIds().split(",").length){
+				throw new ServiceException("瀵嗙爜鏈�灏忛暱搴︿笉鑳藉皬浜庣瀵嗙瓥鐣ョ殑鍊�!");
 			}
 			if(Func.isEmpty(strategy.getCreateTime())){
 				strategy.setCreateTime(new Date());
@@ -125,13 +147,32 @@
 	}
 
 	/**
-	 * 鏌ヨ榛樿瀵嗙爜绛栫暐
+	 * 閫氳繃绉熸埛id浠ュ強鐢ㄦ埛鍚嶆煡璇㈠瘑鐮佺瓥鐣�
+	 * @param tenantId
+	 * @param name
 	 * @return
 	 */
 	@Override
-	public Long queryByIsDefault() {
-		return this.getOne(Wrappers.<Strategy>query().lambda()
-			.eq(Strategy::getIsDefault, CommonConstant.DATA_SCOPE_CATEGORY)).getId();
+	public Strategy queryByNameAndTenantId(String tenantId, String name) {
+		Strategy strategy = this.strategyMapper.queryByNameAndTenantId(tenantId,name);
+		if(!Func.isEmpty(strategy)){
+			return strategy;
+		}
+		return queryByIsDefault();
+	}
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛id鏌ヨ瀵嗙爜绛栫暐
+	 * @param userId
+	 * @return
+	 */
+	@Override
+	public Strategy queryByUserId(Long userId) {
+		Strategy strategy = this.strategyMapper.queryByUserId(userId);
+		if(!Func.isEmpty(strategy)){
+			return strategy;
+		}
+		return queryByIsDefault();
 	}
 
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
index 0d440f1..c6c8bde 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java
@@ -21,6 +21,7 @@
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -231,6 +232,7 @@
 		user.setName(role.getRoleAlias());
 		user.setRealName(role.getRoleName());
 		user.setAccount(role.getRoleAlias());
+		user.setStrategyUpdateStatus(CommonConstant.TOP_PARENT_ID);
 		// 鑾峰彇鍙傛暟閰嶇疆鐨勫瘑鐮�
 		String password = Func.toStr(ParamCache.getValue(PASSWORD_KEY), DEFAULT_PASSWORD);
 		user.setPassword(password);
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java
index ad913a8..c277d31 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPwdstrategyServiceImpl.java
@@ -1,16 +1,20 @@
 package org.springblade.system.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.core.cache.utils.CacheUtil;
-import org.springblade.core.tool.utils.Func;
+import lombok.RequiredArgsConstructor;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.system.entity.UserPwdstrategy;
 import org.springblade.system.mapper.UserPwdstrategyMapper;
 import org.springblade.system.service.IUserPwdstrategyService;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springblade.system.vo.UserPwdstrategyVO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-
-import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 鐢ㄦ埛瀵嗙爜绛栫暐绠$悊琛�(UserPwdstrategy)琛ㄦ湇鍔″疄鐜扮被
@@ -19,25 +23,45 @@
  * @since 2023-03-22 15:24:55
  */
 @Service
+@RequiredArgsConstructor
 public class UserPwdstrategyServiceImpl extends ServiceImpl<UserPwdstrategyMapper,UserPwdstrategy> implements IUserPwdstrategyService {
 
 	@Resource
 	private UserPwdstrategyMapper userPwdstrategyMapper;
 
 	/**
-	 * 鏂板鏁版嵁
-	 *
-	 * @param userPwdstrategy 瀹炰緥瀵硅薄
-	 * @return 瀹炰緥瀵硅薄
+	 * user鏈嶅姟璋冪敤绫�
+	 */
+	private final IUserClient userClient;
+
+	@Override
+	public UserPwdstrategy queryById(Long id) {
+		return this.getById(id);
+	}
+
+	/**
+	 * 鏂板鎴栦慨鏀�
+	 * @param userPwdstrategyVO 瀹炰緥瀵硅薄
+	 * @return
 	 */
 	@Override
-	public boolean submit(UserPwdstrategy userPwdstrategy) {
-		if(Func.isEmpty(userPwdstrategy.getId())){
-			return this.saveOrUpdate(userPwdstrategy);
-		}else {
-			CacheUtil.clear(SYS_CACHE,Boolean.FALSE);
-			return this.saveOrUpdate(userPwdstrategy);
-		}
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean submit(UserPwdstrategyVO userPwdstrategyVO) {
+		//鍏堝垹闄�
+		int eft = this.userPwdstrategyMapper.deleteByUserIds(userPwdstrategyVO.getUserIds());
+		//鍦ㄦ柊澧�
+		List<UserPwdstrategy> userPwdstrategyList = new ArrayList<>();
+		userPwdstrategyVO.getUserIds().forEach(id->{
+			boolean temp = userPwdstrategyList.add(new UserPwdstrategy(id, userPwdstrategyVO.getPwdstrategyId()));
+			if(temp){
+				//瀵嗙爜绛栫暐鏀瑰姩鎴愬姛涔嬪悗淇敼鐢ㄦ埛鐘舵��
+				User user = new User();
+				user.setId(id);
+				user.setStrategyUpdateStatus(CommonConstant.TOP_PARENT_ID);
+				userClient.updateUser(user);
+			}
+		});
+		return this.saveBatch(userPwdstrategyList);
 	}
 
 }
diff --git a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java
index 9046e5e..69eaa0b 100644
--- a/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java
+++ b/Source/BladeX/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/ValueRangeServiceImpl.java
@@ -101,4 +101,15 @@
 		return tenantTemp;
 	}
 
+	/**
+	 * 鑾峰彇鍙栧��
+	 *
+	 * @return 鏄惁鎴愬姛
+	 */
+	@Override
+	public List<String> getByAllString(List<String> combinationIds) {
+		List<String> list = valueRangeMapper.queryByCombinationIds(combinationIds);
+		return list;
+	}
+
 }
diff --git a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
index 729c211..a385c0b 100644
--- a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
+++ b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
@@ -33,12 +33,10 @@
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.secure.BladeUser;
-import org.springblade.core.secure.annotation.PreAuth;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
-import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
@@ -317,7 +315,6 @@
 		return R.data(userService.selectUserSearch(user, query));
 	}
 
-
 	/**
 	 * 鐢ㄦ埛瑙i攣
 	 */
@@ -333,4 +330,15 @@
 		return R.success("鎿嶄綔鎴愬姛");
 	}
 
+	/**
+	 * 鐢ㄦ埛瑙i攣
+	 */
+	@PostMapping("/check-renexpr")
+	@ApiOperationSupport(order = 19)
+	@ApiOperation(value = "鏌ヨ鐢ㄦ埛瀵嗙爜绛栫暐鏄惁闇�瑕佹彁閱�", notes = "浼犲叆id")
+	public R<Long> checkRenAndExpr(@RequestParam Long userId) {
+		Long res = userService.checkRenAndExpr(userId);
+		return R.data(res);
+	}
+
 }
diff --git a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
index 37eba38..7081387 100644
--- a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
+++ b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
@@ -93,4 +93,10 @@
 		return R.data(service.remove(Wrappers.<User>query().lambda().in(User::getTenantId, Func.toStrList(tenantIds))));
 	}
 
+	@Override
+	@PostMapping(UPDATE_USER)
+	public R<Boolean> updateUser(@RequestBody User user) {
+		return R.data(service.updateUser(user));
+	}
+
 }
diff --git a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
index 3ac3d12..992cd82 100644
--- a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
+++ b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
@@ -16,7 +16,6 @@
         <result column="user_type" property="userType"/>
         <result column="account" property="account"/>
         <result column="password" property="password"/>
-        <result column="strategy_name" property="pwdStrategy"/>
         <result column="name" property="name"/>
         <result column="real_name" property="realName"/>
         <result column="email" property="email"/>
@@ -26,10 +25,16 @@
         <result column="role_id" property="roleId"/>
         <result column="dept_id" property="deptId"/>
         <result column="post_id" property="postId"/>
+        <result column="strategy_name" property="pwdStrategy"/>
+        <result column="pwd_update_time" property="pwdUpdateTime"/>
+        <result column="secretgrade" property="secretgrade"/>
+        <result column="strategy_update_status" property="strategyUpdateStatus"/>
     </resultMap>
 
+
     <select id="selectUserPage" resultMap="userResultMap">
-        SELECT pou.id, pou.tenant_id, user_type, account, name, real_name, email, phone, birthday,role_id, dept_id, post_id,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
+        SELECT
+            pou.*,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
         FROM pl_org_user pou
             LEFT JOIN PL_SYS_USER_PWDSTRATEGY plup on plup.USER_ID=pou.ID
             LEFT JOIN PL_SYS_STRATEGY pss on pss.ID=plup.PWDSTRATEGY_ID
@@ -66,7 +71,8 @@
     </select>
 
     <select id="getUser" resultMap="userResultMap">
-        SELECT pou.id, tenant_id, user_type, account, name, real_name, email, phone, birthday,role_id, dept_id, post_id,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
+        SELECT
+            pou.*,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
         FROM pl_org_user pou
             LEFT JOIN PL_SYS_USER_PWDSTRATEGY plup on plup.USER_ID=pou.ID
             LEFT JOIN PL_SYS_STRATEGY pss on pss.ID=plup.PWDSTRATEGY_ID
@@ -75,7 +81,8 @@
     </select>
 
     <select id="exportUser" resultType="org.springblade.system.user.excel.UserExcel">
-        SELECT pou.id, tenant_id, user_type, account, name, real_name, email, phone, birthday,role_id, dept_id, post_id,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
+        SELECT
+            pou.*,nvl(pss.STRATEGY_NAME,(SELECT STRATEGY_NAME FROM PL_SYS_STRATEGY WHERE IS_DEFAULT=1)) strategy_name
         FROM pl_org_user pou
             LEFT JOIN PL_SYS_USER_PWDSTRATEGY plup on plup.USER_ID=pou.ID
             LEFT JOIN PL_SYS_STRATEGY pss on pss.ID=plup.PWDSTRATEGY_ID
diff --git a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
index 239a0a2..ef74d82 100644
--- a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
+++ b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
@@ -213,4 +213,11 @@
 	 * @return
 	 */
 	UserVO platformDetail(User user);
+
+	/**
+	 * 妫�鏌ョ敤鎴锋槸鍚﹀埌浜嗘彁閱掔敤鎴蜂慨鏀瑰瘑鐮佹垨鑰呭瘑鐮佽繃鏈熺殑鏃堕棿
+	 *
+	 */
+	Long checkRenAndExpr(Long userId);
+
 }
diff --git a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
index 7465d53..5138b90 100644
--- a/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
+++ b/Source/BladeX/blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
@@ -36,6 +36,7 @@
 import org.springblade.system.cache.DictCache;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.cache.SysCache;
+import org.springblade.system.entity.Strategy;
 import org.springblade.system.entity.Tenant;
 import org.springblade.system.enums.DictEnum;
 import org.springblade.system.feign.ISysClient;
@@ -51,11 +52,9 @@
 import org.springblade.system.user.wrapper.UserWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.DigestUtils;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
 
@@ -294,6 +293,7 @@
 
 	@Override
 	public boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1) {
+		String hex = DigestUtil.hex(DigestUtils.md5DigestAsHex((newPassword1).getBytes()));
 		User user = getById(userId);
 		if (!newPassword.equals(newPassword1)) {
 			throw new ServiceException("璇疯緭鍏ユ纭殑纭瀵嗙爜!");
@@ -301,7 +301,21 @@
 		if (!user.getPassword().equals(DigestUtil.hex(oldPassword))) {
 			throw new ServiceException("鍘熷瘑鐮佷笉姝g‘!");
 		}
-		return this.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(newPassword)).eq(User::getId, userId));
+		//鑾峰彇鐢ㄦ埛閲囩敤鐨勫瘑鐮佺瓥鐣�
+		Strategy strategy = sysClient.getByUserId(userId).getData();
+		String resException = "瀵嗙爜涓繀椤诲惈鏈夈��"+strategy.getCombinationIds()+"銆戜腑鐨勩��"+strategy.getRequiredType()+"銆戠瀵嗙爜缁勫悎鏂瑰紡锛屼笖瀵嗙爜闀垮害蹇呴』鍦ㄣ��"+strategy.getMinPwdLen()+"-"+strategy.getMaxPwdLen()+"銆戣寖鍥村唴";
+		//瀵嗙爜闀垮害鏍¢獙
+		if(newPassword1.length() < strategy.getMinPwdLen() || newPassword1.length() > strategy.getMaxPwdLen()){
+			throw new ServiceException(resException);
+		}
+		//鏌ヨ瀵嗙爜绛栫暐鍙栧��
+		String regex = sysClient.getRegex(Arrays.asList(strategy.getCombinationIds().split(","))).getData();
+		System.out.println("===============regex================"+regex);
+		regex = "^"+regex+"$";
+		String result = RegexUtil.findResult(regex, newPassword);
+		System.out.println(result);
+		return this.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(DigestUtils.md5DigestAsHex((newPassword1).getBytes()))).eq(User::getId, userId));
+		//return true;
 	}
 
 	@Override
@@ -438,4 +452,38 @@
 		return userVO;
 	}
 
+	@Override
+	public Long checkRenAndExpr(Long userId) {
+		//鑾峰彇鍒板瘑鐮佷慨鏀规椂闂�
+		Date pwdUpdateTime = this.getOne(Wrappers.<User>query().eq("ID", userId)).getPwdUpdateTime();
+		Long pwdupdateday = 0L;
+		if(!Func.isEmpty(pwdUpdateTime)){
+			pwdupdateday = dateToDay(pwdUpdateTime);
+		}
+		Strategy strategy = sysClient.getByUserId(userId).getData();
+		System.out.println("褰撳墠鏃堕棿=================="+dateToDay(new Date()));
+		System.out.println("瀵嗙爜淇敼鏃堕棿======================"+pwdupdateday);
+		System.out.println("鎻愰啋鏃堕棿======================"+strategy.getReminderTime());
+		System.out.println("杩囨湡鏃堕棿======================="+strategy.getExpirationTime());
+		//鏄惁鎻愰啋閫氳繃鏈�鍚庝竴娆′慨鏀瑰瘑鐮佺殑鏃堕棿鍔犱笂杩囨湡鏃堕棿鍑忓幓褰撳墠鏃堕棿锛屽鏋滃皬浜庤繃鏈熸彁閱掓椂闂村氨杩涜鎻愰啋锛屽鏋�<=0灏辨彁閱掑繀椤讳慨鏀瑰瘑鐮�
+		long reminder = pwdupdateday+strategy.getExpirationTime()-dateToDay(pwdUpdateTime);
+		//蹇呴』鍘讳慨鏀瑰瘑鐮�
+		if(reminder<=0){
+			return -1L;
+		}
+		//鎻愰啋鐢ㄦ埛杩樻湁澶氫箙杩囨湡
+		if(reminder<=strategy.getReminderTime()){
+			long res = (strategy.getReminderTime()+pwdupdateday)-dateToDay(new Date());
+			return res;
+		}
+		//浠h〃姝e父鐘舵�佽繕鏈埌鎻愰啋涓庤繃鏈熸椂闂达紝鏃笉鎻愰啋涔熶笉瑕佹眰淇敼
+		return 0L;
+	}
+
+	private Long dateToDay(Date date){
+		long time = date.getTime();
+		return time/(1000 * 60 * 60 * 24);
+	}
+
+
 }

--
Gitblit v1.9.3