From 44dd9c4eb8a2489c63a5eb53fd4254bbb3510e95 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Thu, 18 Jun 2026 09:14:57 +0800
Subject: [PATCH] Merge branch 'feature/v9.0/9.0.4'

---
 src/subPackages/userDetail/password/index.vue |  189 ++++++++++++++++++++++++++++++++++------------
 1 files changed, 139 insertions(+), 50 deletions(-)

diff --git a/src/subPackages/userDetail/password/index.vue b/src/subPackages/userDetail/password/index.vue
index 7d4123b..9de5039 100644
--- a/src/subPackages/userDetail/password/index.vue
+++ b/src/subPackages/userDetail/password/index.vue
@@ -2,26 +2,36 @@
 <template>
 	<view class="container">
 		<view class="detailBox">
-			<div class="orderRow">
-				<div class="rowTitle">原始密码</div>
-				<u-input input-align="right" v-model="passwordForm.oldPassword" type="password" placeholder="请输入"
-					class="input-item" />
-			</div>
-			<div class="orderRow">
-				<div class="rowTitle">新密码</div>
-				<u-input input-align="right" v-model="passwordForm.newPassword" type="password" placeholder="请输入"
-					class="input-item" />
+			<div class="detailCon">
+				<div class="orderRow">
+					<!-- type="password" :password-icon="passwordIcon" -->
+					<div class="rowTitle">原始密码</div>
+					<input type="password" v-model="passwordForm.oldPassword" placeholder="请输入" class="input-item" />
+				</div>
+				<div class="orderRow">
+					<div class="rowTitle">新密码</div>
+					<input type="password" v-model="passwordForm.newPassword" placeholder="请输入" class="input-item" />
 
-			</div>
-			<div class="orderRow">
-				<div class="rowTitle">确认密码</div>
-				<u-input input-align="right" v-model="passwordForm.newPassword1" type="password" placeholder="请输入"
-					class="input-item" />
+				</div>
+				<div class="orderRow">
+					<div class="rowTitle">确认密码</div>
+					<input type="password" v-model="passwordForm.newPassword1" placeholder="请输入" class="input-item" />
+				</div>
 			</div>
 		</view>
 		<view class="btngroup">
 			<u-button color="#AEAEAE" class="custom-style" shape="circle" @click="reset">重置</u-button>
-			<u-button color="#1D6FE9" class="custom-style" shape="circle" @click="submit">提交</u-button>
+			<u-button
+				:color="submitLoading ? '#AEAEAE' : '#1D6FE9'"
+				class="custom-style"
+				shape="circle"
+				text="提交"
+				:loading="submitLoading"
+				loading-text="提交中"
+				loading-mode="circle"
+				:loading-size="13"
+				@click="submit"
+			/>
 		</view>
 	</view>
 </template>
@@ -36,13 +46,44 @@
 		updateInfo,
 		updatePassword
 	} from '@/api/user/index.js';
-
+	const passwordIcon = {
+		show: 'fas fa-eye', // 显示密码时的图标
+		hide: 'fas fa-eye-slash' // 隐藏密码时的图标
+	}
 	const userStore = useUserStore();
 	const passwordForm = ref({
 		oldPassword: '',
 		newPassword: '',
 		newPassword1: '',
 	});
+	const submitLoading = ref(false);
+	// 校验密码不能包含中文
+	const validatePasswordNoChinese = (password) => {
+		const chineseRegex = /[\u4e00-\u9fa5]/;
+		if (chineseRegex.test(password)) {
+
+			uni.showToast({
+				title: '密码不能包含中文字符',
+				icon: 'none',
+				duration: 2000
+			});
+			return false;
+		}
+		return true;
+	};
+	// 校验密码复杂度(长度≥6位,包含字母和数字)
+	const validatePasswordStrength = (password) => {
+		if (password.length < 6) {
+
+			uni.showToast({
+				title: '密码长度不能少于6位',
+				icon: 'none',
+				duration: 2000
+			});
+			return false;
+		}
+		return true;
+	};
 	const clearForm = () => {
 		passwordForm.value = {
 			oldPassword: '',
@@ -54,7 +95,43 @@
 		clearForm();
 	};
 	const submit = () => {
+		if (submitLoading.value) return;
+		// 原始密码校验
+		if (!passwordForm.value.oldPassword) {
 
+			uni.showToast({
+				title: '请输入原始密码',
+				icon: 'none',
+				duration: 2000
+			});
+			return;
+		}
+		// 中文校验
+		if (!validatePasswordNoChinese(passwordForm.value.newPassword)) return;
+		// 新密码校验
+		if (!passwordForm.value.newPassword) {
+
+			uni.showToast({
+				title: '请输入新密码',
+				icon: 'none',
+				duration: 2000
+			});
+			return;
+		}
+		// 确认密码校验
+		if (passwordForm.value.newPassword !== passwordForm.value.newPassword1) {
+
+			uni.showToast({
+				title: '两次输入的新密码不一致',
+				icon: 'none',
+				duration: 2000
+			});
+			return;
+		}
+
+		// 复杂度校验
+		if (!validatePasswordStrength(passwordForm.value.newPassword)) return;
+		submitLoading.value = true;
 		updatePassword(md5(passwordForm.value.oldPassword),
 			md5(passwordForm.value.newPassword),
 			md5(passwordForm.value.newPassword1)).then(res => {
@@ -62,13 +139,17 @@
 				uni.showToast({
 					title: '修改信息成功',
 					icon: 'none',
-					duration: 2000
+					duration: 1500
 				});
 				clearForm();
 				userStore.setUserInfo(null)
-				uni.redirectTo({
-					url: '/pages/login/index'
-				})
+				uni.removeStorageSync('rememberedUser');
+				setTimeout(() => {
+					uni.reLaunch({
+						url: '/pages/login/index'
+					})
+				}, 1500);
+				return
 
 			} else {
 				uni.showToast({
@@ -77,7 +158,10 @@
 					duration: 2000
 				});
 			}
+			submitLoading.value = false;
 
+		}).catch(() => {
+			submitLoading.value = false;
 		});
 
 	};
@@ -88,61 +172,62 @@
 
 <style lang="scss" scoped>
 	.container {
-
 		width: 100%;
-
 		height: 100%;
 		display: flex;
 		flex-direction: column;
 		align-items: center;
-
-		background: url('/src/static/images/user/allBg.svg') no-repeat center center;
-		background-size: cover;
-
-		background-attachment: fixed;
-
-
 	}
 
 	.detailBox {
-		margin-top: 20px;
-		width: 351px;
+		margin-top: 40rpx;
+		width: 702rpx;
 
-		min-height: 163px;
+		min-height: 326rpx;
 		background: #FFFFFF;
-		border-radius: 6px;
+		border-radius: 12rpx;
+		box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
 
-		box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+		.detailCon {
+			padding: 0 24rpx;
+		}
 
 		.orderRow {
 			display: flex;
 			justify-content: space-between;
 			align-items: center;
-			height: 48px;
-			border-bottom: 1px solid #f5f5f5;
+			height: 96rpx;
+			border-bottom: 2rpx solid #f5f5f5;
 			color: #7b7b7b;
-			padding: 0 12px;
+
 
 			.rowTitle {
 				font-family: Source Han Sans CN, Source Han Sans CN;
 				font-weight: 400;
-				font-size: 15px;
+				font-size: 30rpx;
 				color: #222324;
 				white-space: nowrap;
 			}
 
-			::v-deep .u-input {
+			input.input-item {
+				text-align: right;
 				border: none !important;
 				background: transparent !important;
-			}
-
-			::v-deep .u-input__input {
-				border: none !important;
 				box-shadow: none !important;
-				background: transparent !important;
 				padding: 0 !important;
 				margin: 0 !important;
 				height: auto !important;
+
+				outline: none;
+				font-size: 30rpx;
+				color: #222324;
+				font-family: Source Han Sans CN, Source Han Sans CN;
+			}
+      :deep(.uni-input-placeholder) {
+        color: #D5D5D5;
+      }
+			input.input-item::placeholder {
+				font-size: 30rpx;
 			}
 		}
 	}
@@ -150,15 +235,19 @@
 	.btngroup {
 		display: flex;
 		position: absolute;
-		bottom:75px;
+		bottom: 150rpx;
 	}
 
-	.u-button:first-child {
-		margin-right: 15px;
+	:deep(.u-button:first-child) {
+		margin-right: 30rpx !important;
 	}
 
 	.custom-style {
-		width: 138px;
-		height: 38px;
+		width: 276rpx;
+		height: 76rpx;
 	}
-</style>
\ No newline at end of file
+	:deep(.u-button){
+		width: 276rpx !important;
+		height: 76rpx !important;
+	}
+</style>

--
Gitblit v1.9.3