| | |
| | | <view class="detailBox"> |
| | | <div class="detailCon"> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">原始密码</div> |
| | | <input type="password" v-model="passwordForm.oldPassword" placeholder="请输入" class="input-item" /> |
| | | <div class="rowTitle">账号</div> |
| | | <input type="text" v-model="passwordForm.username" placeholder="请输入账号" class="input-item" /> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">新密码</div> |
| | | <input type="password" v-model="passwordForm.newPassword" placeholder="请输入" class="input-item" /> |
| | | <div class="rowTitle">密码</div> |
| | | <input type="password" v-model="passwordForm.password" placeholder="请输入" class="input-item" /> |
| | | |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">确认密码</div> |
| | | <input type="password" v-model="passwordForm.newPassword1" placeholder="请输入" class="input-item" /> |
| | | <input type="password" v-model="passwordForm.password2" placeholder="请输入" class="input-item" /> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">验证码</div> |
| | | <div class="code-container"> |
| | | <input type="text" v-model="passwordForm.code" placeholder="请输入验证码" class="input-item code-input" /> |
| | | <u-button :disabled="countDown > 0" @click="sendVerificationCode" class="send-code-btn"> |
| | | {{ countDown > 0 ? `${countDown}s后重发` : '发送验证码' }} |
| | | </u-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </view> |
| | |
| | | useUserStore |
| | | } from "@/store/index.js"; |
| | | import md5 from "js-md5"; |
| | | import { |
| | | getUserInfo, |
| | | updateInfo, |
| | | updatePassword |
| | | } from '@/api/user/index.js'; |
| | | import { getUserInfo, |
| | | updateInfo, |
| | | updatePassword, |
| | | sendResetCode, |
| | | resetPassword |
| | | } 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 passwordForm = ref({ |
| | | username: '', |
| | | password: '', |
| | | password2: '', |
| | | code: '' |
| | | }); |
| | | const countDown = ref(0); |
| | | let timer = null; |
| | | // 校验密码不能包含中文 |
| | | const validatePasswordNoChinese = (password) => { |
| | | const chineseRegex = /[\u4e00-\u9fa5]/; |
| | |
| | | }; |
| | | const clearForm = () => { |
| | | passwordForm.value = { |
| | | oldPassword: '', |
| | | newPassword: '', |
| | | newPassword1: '', |
| | | username: '', |
| | | password: '', |
| | | password2: '', |
| | | code: '' |
| | | }; |
| | | countDown.value = 0; |
| | | if (timer) { |
| | | clearInterval(timer); |
| | | timer = null; |
| | | } |
| | | }; |
| | | const reset = () => { |
| | | clearForm(); |
| | | }; |
| | | const submit = () => { |
| | | // 原始密码校验 |
| | | if (!passwordForm.value.oldPassword) { |
| | | |
| | | // 发送验证码 |
| | | const sendVerificationCode = () => { |
| | | const { username } = passwordForm.value; |
| | | if (!username) { |
| | | uni.showToast({ |
| | | title: '请输入原始密码', |
| | | title: '请先输入账号', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | return; |
| | | } |
| | | // 中文校验 |
| | | if (!validatePasswordNoChinese(passwordForm.value.newPassword)) return; |
| | | // 新密码校验 |
| | | if (!passwordForm.value.newPassword) { |
| | | |
| | | // 这里假设账号就是手机号,实际项目中可能需要验证格式 |
| | | sendResetCode(username).then(res => { |
| | | if (res.data.code === 200) { |
| | | uni.showToast({ |
| | | title: '验证码发送成功', |
| | | icon: 'success', |
| | | duration: 2000 |
| | | }); |
| | | |
| | | // 开始倒计时 |
| | | countDown.value = 60; |
| | | timer = setInterval(() => { |
| | | countDown.value--; |
| | | if (countDown.value <= 0) { |
| | | clearInterval(timer); |
| | | timer = null; |
| | | } |
| | | }, 1000); |
| | | } else { |
| | | uni.showToast({ |
| | | title: res.data.msg || '验证码发送失败', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | } |
| | | }).catch(err => { |
| | | uni.showToast({ |
| | | title: '网络错误,请稍后重试', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | }); |
| | | }; |
| | | const reset = () => { |
| | | clearForm(); |
| | | }; |
| | | |
| | | const submit = () => { |
| | | const { username, password, password2, code } = passwordForm.value; |
| | | |
| | | // 账号校验 |
| | | if (!username) { |
| | | uni.showToast({ |
| | | title: '请输入账号', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | // 新密码校验 |
| | | if (!password) { |
| | | uni.showToast({ |
| | | title: '请输入新密码', |
| | | icon: 'none', |
| | |
| | | }); |
| | | return; |
| | | } |
| | | // 确认密码校验 |
| | | if (passwordForm.value.newPassword !== passwordForm.value.newPassword1) { |
| | | |
| | | // 中文校验 |
| | | if (!validatePasswordNoChinese(password)) return; |
| | | |
| | | // 确认密码校验 |
| | | if (password !== password2) { |
| | | uni.showToast({ |
| | | title: '两次输入的新密码不一致', |
| | | icon: 'none', |
| | |
| | | return; |
| | | } |
| | | |
| | | // 验证码校验 |
| | | if (!code) { |
| | | uni.showToast({ |
| | | title: '请输入验证码', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | // 复杂度校验 |
| | | if (!validatePasswordStrength(passwordForm.value.newPassword)) return; |
| | | updatePassword(md5(passwordForm.value.oldPassword), |
| | | md5(passwordForm.value.newPassword), |
| | | md5(passwordForm.value.newPassword1)).then(res => { |
| | | if (!validatePasswordStrength(password)) return; |
| | | |
| | | // 调用重置密码接口 |
| | | const resetData = { |
| | | username, |
| | | // password: md5(password), |
| | | // confirmPassword: md5(password2), |
| | | password: password, |
| | | password2: password2, |
| | | code |
| | | }; |
| | | console.log('canshu',resetData) |
| | | resetPassword(resetData).then(res => { |
| | | if (res.data.code === 200) { |
| | | uni.showToast({ |
| | | title: '修改信息成功', |
| | | title: '密码修改成功', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | clearForm(); |
| | | userStore.setUserInfo(null) |
| | | userStore.setUserInfo(null); |
| | | uni.removeStorageSync('rememberedUser'); |
| | | uni.reLaunch({ |
| | | url: '/pages/login/index' |
| | | }) |
| | | |
| | | }); |
| | | } else { |
| | | uni.showToast({ |
| | | title: res.msg, |
| | | title: res.data.msg || '密码修改失败', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | } |
| | | |
| | | }).catch(err => { |
| | | uni.showToast({ |
| | | title: '网络错误,请稍后重试', |
| | | icon: 'none', |
| | | duration: 2000 |
| | | }); |
| | | }); |
| | | |
| | | }; |
| | | onShow(async () => { |
| | | clearForm(); |
| | |
| | | input.input-item::placeholder { |
| | | font-size: 30rpx; |
| | | } |
| | | |
| | | .code-container { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: flex-end; |
| | | width: 100%; |
| | | } |
| | | |
| | | .code-input { |
| | | flex: 1; |
| | | max-width: 400rpx; |
| | | margin-right: 20rpx; |
| | | } |
| | | |
| | | .send-code-btn { |
| | | width: 200rpx; |
| | | height: 70rpx; |
| | | line-height: 70rpx; |
| | | font-size: 26rpx; |
| | | background: #f5f5f5; |
| | | color: #666; |
| | | border-radius: 8rpx; |
| | | text-align: center; |
| | | border: none; |
| | | } |
| | | |
| | | .send-code-btn:disabled { |
| | | background: #e0e0e0; |
| | | color: #999; |
| | | } |
| | | } |
| | | } |
| | | |