You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
7.2 KiB
236 lines
7.2 KiB
<script setup lang="ts"> |
|
import { reactive, ref, shallowRef } from 'vue' |
|
import { FormInstance, FormRules } from 'element-plus' |
|
import { useUserStore } from '@/stores/user' |
|
import feedback from '~/utils/feedback' |
|
import { bindingPhoneCodeApi, updateBindingApi, userEditApi, userPhoneCodeApi } from '~/server/userApi' |
|
import { CaptchaVerification, ItemObject } from '~/types/global' |
|
|
|
const props = defineProps({ |
|
//列表数据 |
|
phone: { |
|
type: String, |
|
default: '', |
|
}, |
|
}) |
|
const { phone } = toRefs(props) |
|
|
|
//表单相关定义 |
|
const userEditFormRef = ref<FormInstance>() |
|
const loading = ref<boolean>(false) |
|
const userEditForm = reactive<ItemObject>({ |
|
oldPhone: '', |
|
phone: '', |
|
captcha: '', |
|
checkCaptcha: '', |
|
}) |
|
|
|
//步骤条选中的值 |
|
const active = ref<number>(1) |
|
|
|
//手机号赋值 |
|
const userStore = useUserStore() |
|
userEditForm.oldPhone = ref<string>(phone?.value) |
|
|
|
//校验 |
|
// 手机号码验证 |
|
const checkPhone = (rule: any, value: any, callback: any) => { |
|
if (!value) { |
|
return callback(new Error('请输入手机号码')) |
|
} |
|
setTimeout(() => { |
|
if (PhoneReg.test(value)) { |
|
callback() |
|
} else { |
|
callback(new Error('请输入有效的电话号码')) |
|
} |
|
}, 150) |
|
} |
|
const rules: FormRules = { |
|
captcha: [{ required: true, message: '请填写验证码', trigger: 'blur' }], |
|
checkCaptcha: [{ required: true, message: '请填写验证码', trigger: 'blur' }], |
|
phone: [{ required: true, validator: checkPhone, trigger: 'blur' }], |
|
} |
|
|
|
//验证码 |
|
const { disabled, text, handleCodeSend, stopCountdown } = useSmsCode() |
|
|
|
// 获取验证码 |
|
const verifyRef = shallowRef() |
|
const handleSendCheckcode = () => { |
|
if (!userEditForm.phone && active.value ===2) return feedback.msgWarning('请填写手机号') |
|
verifyRef.value.show() |
|
} |
|
|
|
/** |
|
* 图形验证成功后的回调 |
|
*/ |
|
const handlerOnVerSuccess = async (e: CaptchaVerification) => { |
|
if (active.value === 1) { |
|
await userPhoneCodeApi() |
|
feedback.msgSuccess('发送成功') |
|
handleCodeSend() |
|
} else { |
|
await bindingPhoneCodeApi({ phone: userEditForm.phone, captcha: userEditForm.checkCaptcha }) |
|
feedback.msgSuccess('发送成功') |
|
handleCodeSend() |
|
} |
|
|
|
} |
|
/** |
|
* 确定 |
|
* @param formEl |
|
*/ |
|
const btnloading = ref<boolean>(false) |
|
//首次校验 |
|
const submitFormCheck = (formEl: FormInstance | undefined) => { |
|
if (!formEl) return |
|
formEl.validate(async (valid, fields) => { |
|
if (valid) { |
|
active.value = 2 |
|
text.value = '获取验证码' |
|
stopCountdown() |
|
} else { |
|
console.log('error submit!', fields) |
|
} |
|
}) |
|
} |
|
//提交 |
|
const emit = defineEmits(['handleSubmitClose']) |
|
const submitForm = (formEl: FormInstance | undefined) => { |
|
if (!formEl) return |
|
formEl.validate(async (valid, fields) => { |
|
if (valid) { |
|
try { |
|
btnloading.value = true |
|
await updateBindingApi({ phone: userEditForm.phone, captcha: userEditForm.captcha }) |
|
feedback.msgSuccess('修改成功') |
|
active.value = 3 |
|
emit('handleSubmitClose', active.value) |
|
btnloading.value = false |
|
} catch (err) { |
|
btnloading.value = false |
|
} |
|
} else { |
|
console.log('error submit!', fields) |
|
} |
|
}) |
|
} |
|
</script> |
|
|
|
<template> |
|
<div class="editUserInfoFrom" v-loading="btnloading"> |
|
<el-steps :active="active" align-center class="mb-50px"> |
|
<el-step title="验证身份"/> |
|
<el-step title="修改手机号"/> |
|
<el-step title="完成修改"/> |
|
</el-steps> |
|
<div v-if="active <3"> |
|
<div class="text-16px text-#666 text-center mb-30px lh-22px"> |
|
账号 <span class="font-color">{{ userStore.userInfo.nikeName }}</span> 为确认是你本人操作,请完成以下验证 |
|
</div> |
|
<el-form |
|
ref="userEditFormRef" |
|
:model="userEditForm" |
|
label-width="100px" |
|
class="demo-ruleForm" |
|
size="large" |
|
status-icon |
|
:rules="rules" |
|
v-loading="loading" |
|
> |
|
<div v-if="active === 1"> |
|
<el-form-item label="手机号"> |
|
<el-input v-model="userEditForm.oldPhone" placeholder="请输入手机号" disabled class="w-500px" /> |
|
</el-form-item> |
|
<el-form-item label="验证码" prop="checkCaptcha"> |
|
<div class="w-100% acea-row row-between-wrapper"> |
|
<el-input type="text" auto-complete="on" placeholder="请输入验证码" v-model="userEditForm.checkCaptcha"> |
|
<template #suffix> |
|
<el-button |
|
text |
|
class="code font-color" |
|
:disabled="disabled" |
|
:class="disabled === true ? 'on' : ''" |
|
@click="handleSendCheckcode" |
|
> |
|
{{ text }} |
|
</el-button> |
|
</template> |
|
</el-input> |
|
</div> |
|
</el-form-item> |
|
<el-form-item class="submit"> |
|
<div class="handleBtn w-120px lh-44px m-auto cursors" style="font-size: 16px" @click="submitFormCheck(userEditFormRef)">确定</div> |
|
</el-form-item> |
|
</div> |
|
<div v-else> |
|
<el-form-item label="手机号" prop="phone"> |
|
<el-input v-model="userEditForm.phone" placeholder="请输入手机号" class="w-500px" /> |
|
</el-form-item> |
|
<el-form-item label="验证码" prop="checkCaptcha"> |
|
<div class="w-100% acea-row row-between-wrapper"> |
|
<el-input type="text" auto-complete="on" placeholder="请输入验证码" v-model="userEditForm.captcha"> |
|
<template #suffix> |
|
<el-button |
|
text |
|
class="code font-color" |
|
:disabled="disabled" |
|
:class="disabled === true ? 'on' : ''" |
|
@click="handleSendCheckcode" |
|
> |
|
{{ text }} |
|
</el-button> |
|
</template> |
|
</el-input> |
|
</div> |
|
</el-form-item> |
|
<el-form-item class="submit"> |
|
<div class="handleBtn w-120px lh-44px m-auto cursors" style="font-size: 16px" @click="submitForm(userEditFormRef)">确定</div> |
|
</el-form-item> |
|
</div> |
|
|
|
<!-- <el-form-item label="登录密码">--> |
|
<!-- <el-input v-model="password" disabled class="w-500px" />--> |
|
<!-- </el-form-item>--> |
|
</el-form> |
|
</div> |
|
<div v-if="active ===3" class="flex-x-center mb-30px"> |
|
<img src="~/assets/images/xiucheng.png" alt="" class="w-140px h-140px" /> |
|
</div> |
|
<div v-if="active ===3" class="text-16px text-#666 text-center">手机号修改成功,下次登录请使用新手机号!</div> |
|
<VerifitionVerify ref="verifyRef" :phone="userEditForm.phone" @success="handlerOnVerSuccess"></VerifitionVerify> |
|
</div> |
|
</template> |
|
|
|
<style scoped lang="scss"> |
|
:deep(.el-step__head.is-finish){ |
|
--el-color-primary: #E93323; |
|
} |
|
:deep(.el-step__title.is-finish){ |
|
--el-color-primary: #E93323; |
|
} |
|
.submit { |
|
:deep(.el-form-item__content) { |
|
margin-left: 0 !important; |
|
} |
|
} |
|
:deep(.--el-color-primary) { |
|
color: #e93323 !important; |
|
} |
|
.code { |
|
height: 96%; |
|
border: 0; |
|
background-color: #fff; |
|
color: #e93323 !important; |
|
|
|
img { |
|
width: 100%; |
|
height: 100%; |
|
} |
|
|
|
&.on { |
|
color: #ccc !important; |
|
} |
|
} |
|
</style>
|
|
|