|
|
@@ -0,0 +1,94 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import { reactive, ref } from 'vue'
|
|
|
+import type { FormInstance, FormRules } from 'element-plus'
|
|
|
+import {
|
|
|
+ ElButton,
|
|
|
+ ElDialog,
|
|
|
+ ElForm,
|
|
|
+ ElFormItem,
|
|
|
+ ElInput,
|
|
|
+ ElMessage
|
|
|
+} from 'element-plus'
|
|
|
+import { changePasswordApi } from '@/api/login'
|
|
|
+import { useUserStore } from '@/store/modules/user'
|
|
|
+
|
|
|
+const model = defineModel<boolean>({ required: true })
|
|
|
+const userStore = useUserStore()
|
|
|
+const formRef = ref<FormInstance>()
|
|
|
+const submitting = ref(false)
|
|
|
+const form = reactive({ oldPassword: '', newPassword: '', confirmPassword: '' })
|
|
|
+
|
|
|
+const validateConfirm = (_rule: unknown, value: string, callback: (error?: Error) => void) => {
|
|
|
+ value === form.newPassword ? callback() : callback(new Error('两次输入的新密码不一致'))
|
|
|
+}
|
|
|
+
|
|
|
+const rules: FormRules = {
|
|
|
+ oldPassword: [{ required: true, message: '请输入原密码', trigger: 'blur' }],
|
|
|
+ newPassword: [
|
|
|
+ { required: true, message: '请输入新密码', trigger: 'blur' },
|
|
|
+ { min: 6, message: '新密码不能少于 6 位', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ confirmPassword: [
|
|
|
+ { required: true, message: '请再次输入新密码', trigger: 'blur' },
|
|
|
+ { validator: validateConfirm, trigger: 'blur' }
|
|
|
+ ]
|
|
|
+}
|
|
|
+
|
|
|
+const close = () => {
|
|
|
+ model.value = false
|
|
|
+ formRef.value?.resetFields()
|
|
|
+}
|
|
|
+
|
|
|
+const submit = async () => {
|
|
|
+ const valid = await formRef.value?.validate().catch(() => false)
|
|
|
+ if (!valid) return
|
|
|
+ submitting.value = true
|
|
|
+ try {
|
|
|
+ const res = await changePasswordApi({
|
|
|
+ oldPassword: form.oldPassword,
|
|
|
+ newPassword: form.newPassword
|
|
|
+ })
|
|
|
+ if (res) {
|
|
|
+ ElMessage.success('密码修改成功,请重新登录')
|
|
|
+ close()
|
|
|
+ userStore.reset()
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ submitting.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <ElDialog v-model="model" title="修改密码" width="440px" :close-on-click-modal="false">
|
|
|
+ <div class="password-tip">为保障账户安全,修改后需要使用新密码重新登录。</div>
|
|
|
+ <ElForm ref="formRef" :model="form" :rules="rules" label-position="top">
|
|
|
+ <ElFormItem label="原密码" prop="oldPassword">
|
|
|
+ <ElInput v-model="form.oldPassword" type="password" show-password />
|
|
|
+ </ElFormItem>
|
|
|
+ <ElFormItem label="新密码" prop="newPassword">
|
|
|
+ <ElInput v-model="form.newPassword" type="password" show-password />
|
|
|
+ </ElFormItem>
|
|
|
+ <ElFormItem label="确认新密码" prop="confirmPassword">
|
|
|
+ <ElInput v-model="form.confirmPassword" type="password" show-password />
|
|
|
+ </ElFormItem>
|
|
|
+ </ElForm>
|
|
|
+ <template #footer>
|
|
|
+ <ElButton @click="close">取消</ElButton>
|
|
|
+ <ElButton type="primary" :loading="submitting" @click="submit">确认修改</ElButton>
|
|
|
+ </template>
|
|
|
+ </ElDialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.password-tip {
|
|
|
+ margin: -4px 0 20px;
|
|
|
+ padding: 12px 14px;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 1.6;
|
|
|
+ background: var(--el-fill-color-light);
|
|
|
+ border-left: 3px solid var(--el-color-primary);
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+</style>
|