| <template> | 
|     <div class="password"> | 
|         <div class="password_tip"> | 
|             <img src="@/assets/icon/password_ic_tip@2x.png" alt="" /> | 
|             <span>密码由6-20个英文字母、数字或符号组成</span> | 
|         </div> | 
|         <div class="password_list"> | 
|             <div class="password_list_item"> | 
|                 <span>原密码</span> | 
|                 <div class="password_list_item_box"> | 
|                     <input type="password" v-model="form.originalPassword" maxlength="20" placeholder="请输入原密码"> | 
|                     <p @click="forgotPassword">忘记密码</p> | 
|                 </div> | 
|             </div> | 
|             <div class="password_list_item"> | 
|                 <span>新密码</span> | 
|                 <div class="password_list_item_box"> | 
|                     <input type="password" v-model="form.newPassword" maxlength="20" placeholder="请输入新密码"> | 
|                 </div> | 
|             </div> | 
|             <div class="password_list_item"> | 
|                 <span>确认密码</span> | 
|                 <div class="password_list_item_box"> | 
|                     <input type="password" v-model="form.confirmPassword" maxlength="20" placeholder="再次输入新密码"> | 
|                 </div> | 
|             </div> | 
|         </div> | 
|         <div class="password_footer"> | 
|             <button v-preventReClick class="password_footer_submit" @click="submit"> | 
|                 <span>完成</span> | 
|             </button> | 
|         </div> | 
|     </div> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
|     import { reactive } from 'vue' | 
|     import { Toast } from 'vant' | 
|     import { useRouter } from "vue-router" | 
|     import { updatePwd } from '@/apis/PersonalAPI' | 
|     import { passwordVerification } from '@/interface' | 
|   | 
|     const router = useRouter() | 
|   | 
|     let form = reactive<passwordVerification>({ | 
|         originalPassword: '', | 
|         newPassword: '', | 
|         confirmPassword: '' | 
|     }) | 
|   | 
|     const forgotPassword = (): void => { | 
|   | 
|     } | 
|   | 
|     const submit = (): void => { | 
|         if (!form.originalPassword) { | 
|             Toast({ message: '原密码不能为空' }) | 
|         } else if (!form.newPassword) { | 
|             Toast({ message: '新密码不能为空' }) | 
|         } else if (!/^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{6,}$/.test(form.newPassword)) { | 
|             Toast({ message: '密码格式不正确' }) | 
|         } else if (!form.confirmPassword) { | 
|             Toast({ message: '确认密码不能为空' }) | 
|         } else if (form.newPassword !== form.confirmPassword) { | 
|             Toast({ message: '两次输入的密码不一致' }) | 
|         } else { | 
|             updatePwd({ | 
|                 newPwd: form.newPassword, | 
|                 oldPwd: form.originalPassword | 
|             }).then(res => { | 
|                 if (res.code === 200) { | 
|                     Toast.success({ message: '修改成功', duration: 2000, forbidClick: true }) | 
|                     setTimeout(() => { | 
|                         router.go(-1) | 
|                     }, 2000) | 
|                 } | 
|             }) | 
|         } | 
|     } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| .password { | 
|     position: absolute; | 
|     width: 100%; | 
|     height: 100%; | 
|     background: white; | 
|     .password_tip { | 
|         height: 72px; | 
|         display: flex; | 
|         align-items: center; | 
|         background: #F7F7F7; | 
|         padding: 0 30px; | 
|         img { | 
|             width: 24px; | 
|             height: 24px; | 
|             margin-right: 10px; | 
|         } | 
|         span { | 
|             font-size: 24px; | 
|             font-weight: 400; | 
|             color: #666666; | 
|         } | 
|     } | 
|     .password_list { | 
|         padding: 0 30px; | 
|         .password_list_item { | 
|             display: flex; | 
|             align-items: center; | 
|             height: 90px; | 
|             border-bottom: 1PX solid #E5E5E5; | 
|             span { | 
|                 width: 150px; | 
|                 flex-shrink: 0; | 
|                 font-size: 30px; | 
|                 font-weight: 400; | 
|                 color: #222222; | 
|             } | 
|             .password_list_item_box { | 
|                 display: flex; | 
|                 justify-content: space-between; | 
|                 flex: 1; | 
|                 input { | 
|                     border: none; | 
|                     font-size: 30px; | 
|                 } | 
|                 input::-webkit-input-placeholder { | 
|                     font-size: 28px; | 
|                     font-weight: 400; | 
|                     color: #B2B2B2; | 
|                 } | 
|                 p { | 
|                     font-size: 26px; | 
|                     font-weight: 400; | 
|                     color: $nav-color; | 
|                 } | 
|             } | 
|         } | 
|     } | 
|     .password_footer { | 
|         margin-top: 80px; | 
|         padding: 0 30px; | 
|         .password_footer_submit { | 
|             width: 100%; | 
|             height: 88px; | 
|             border: none; | 
|             background: #4275FC; | 
|             box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.08); | 
|             border-radius: 8px; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: center; | 
|             span { | 
|                 font-size: 30px; | 
|                 font-weight: 500; | 
|                 color: #FFFFFF; | 
|             } | 
|         } | 
|     } | 
| } | 
| </style> |