zhangchen
2023-10-23 61b8b562f74691ae4dfe11008339450d0bc91ea1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<template>
    <div class="forget_password_container">
        <el-form :model="forgetpasswordFormData" label-position="right" label-width="100px">
            <el-form-item :label="$t('login.forgetPwd.form.account')">
                <el-input v-model="forgetpasswordFormData.userPhone" :placeholder="$t('login.forgetPwd.placeholder.account')" />
            </el-form-item>
            <el-form-item :label="$t('login.forgetPwd.form.code')">
                <el-input v-model="forgetpasswordFormData.validateCode" :placeholder="$t('login.forgetPwd.placeholder.code')">
                    <template #suffix>
                        <el-button type="primary" link @click="getCode" :disabled="codeBtnDisabled" :loading="isLoading">{{ codeBtnText }}</el-button>
                    </template>
                </el-input>
            </el-form-item>
            <el-form-item :label="$t('login.forgetPwd.form.pwd')">
                <el-input v-model="forgetpasswordFormData.pass" :placeholder="$t('login.forgetPwd.placeholder.pwd')" show-password type="password"></el-input>
            </el-form-item>
            <el-form-item :label="$t('login.forgetPwd.form.newPwd')">
                <el-input
                    v-model="forgetpasswordFormData.newPassword"
                    :placeholder="$t('login.forgetPwd.placeholder.newPwd')"
                    show-password
                    type="password"
                ></el-input>
            </el-form-item>
            <div class="btn_box">
                <el-button type="" @click="close">{{ $t("login.forgetPwd.btn.cancel") }}</el-button>
                <el-button type="primary" :loading="isSubmitLoading" @click="submit">{{ $t("login.forgetPwd.btn.submit") }}</el-button>
            </div>
        </el-form>
    </div>
</template>
 
<script lang="ts" setup name="Forgetpassword" >
import { ref, reactive, computed, defineEmits } from "vue";
import { ElMessage } from "element-plus";
import { useI18n } from "vue-i18n";
import { validatePhoneNumber, validatePassword } from "/@/utils/verification";
import { api_sned_sms_code, api_forget_pwd } from "/@/api/login";
 
const i18n = useI18n();
const emit = defineEmits(["close"]);
 
const forgetpasswordFormData: IForgetpasswordForm = reactive({
    userPhone: "",
    validateCode: "",
    pass: "",
    newPassword: "",
});
 
const isLoading = ref<boolean>(false);
const isSubmitLoading = ref<boolean>(false);
const codeNum = ref<number>(60);
const interval = ref<null | any>(null);
const codeBtnDisabled = ref<boolean>(false);
 
const codeBtnText = computed(() => {
    return codeNum.value === 60 ? i18n.t("login.forgetPwd.btn.codeDefault") : `${codeNum.value}${i18n.t("login.forgetPwd.btn.codeSend")}`;
});
 
const getCode = async () => {
    if (!forgetpasswordFormData.userPhone) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.account"));
    if (!validatePhoneNumber(forgetpasswordFormData.userPhone)) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.account1"));
 
    if (codeNum.value < 60) return false;
 
    isLoading.value = true;
 
    try {
        await api_sned_sms_code(forgetpasswordFormData.userPhone);
        ElMessage.success(i18n.t("login.forgetPwd.msg.success.code"));
        isLoading.value = false;
        interval.value = setInterval(() => {
            if (codeNum.value <= 0) {
                codeNum.value = 60;
                codeBtnDisabled.value = false;
                clearInterval(interval.value);
                return false;
            } else {
                codeNum.value--;
                codeBtnDisabled.value = true;
            }
        }, 1000);
    } catch (error) {
        isLoading.value = false;
    }
};
 
const submit = async () => {
    if (!forgetpasswordFormData.userPhone) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.account"));
    if (!validatePhoneNumber(forgetpasswordFormData.userPhone)) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.account1"));
    if (!forgetpasswordFormData.validateCode) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.code"));
    if (!forgetpasswordFormData.pass) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.pwd"));
    if (!validatePassword(forgetpasswordFormData.pass)) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.pwd1"));
    if (!forgetpasswordFormData.newPassword) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.pwd2"));
    if (forgetpasswordFormData.pass !== forgetpasswordFormData.newPassword) return ElMessage.error(i18n.t("login.forgetPwd.msg.err.pwd3"));
    isSubmitLoading.value = true;
    try {
        await api_forget_pwd(forgetpasswordFormData);
        isSubmitLoading.value = false;
        // 请求成功后关闭弹出层
        close();
        ElMessage.success(i18n.t("login.forgetPwd.msg.success.submit"));
    } catch (error) {
        isSubmitLoading.value = false;
    }
};
 
const close = () => {
    forgetpasswordFormData.userPhone = "";
    forgetpasswordFormData.validateCode = "";
    forgetpasswordFormData.pass = "";
    forgetpasswordFormData.newPassword = "";
    emit("close");
};
 
defineExpose({
    close,
});
</script>
 
<style lang="scss" scoped>
.forget_password_container {
    .btn_box {
        display: flex;
        align-items: center;
        justify-content: center;
    }
}
</style>