194 lines
5.9 KiB
Vue
194 lines
5.9 KiB
Vue
<template>
|
|
<div>
|
|
<el-form ref="formRef" :model="form" size="large" class="login-content-form">
|
|
<div class="login-title">注册账号</div>
|
|
<el-form-item
|
|
class="login-animation1"
|
|
prop="email"
|
|
:rules="[
|
|
{ required: true, message: '请输入邮箱地址', trigger: ['blur', 'change'] },
|
|
{ validator: testEmail, trigger: ['blur', 'change'] },
|
|
]"
|
|
>
|
|
<el-input ref="emailRef" text :placeholder="$t('message.email.placeholder1')" v-model="form.email" clearable autocomplete="off">
|
|
<template #prefix>
|
|
<el-icon class="el-input__icon"><ele-Promotion /></el-icon>
|
|
</template>
|
|
</el-input>
|
|
</el-form-item>
|
|
<el-form-item class="login-animation2" prop="code" :rules="[{ required: true, message: '请输入邮箱验证码', trigger: ['blur', 'change'] }]">
|
|
<MyInputCode v-model="form.code" :email="form.email" :validate="validatorEmail" @send="onSend" />
|
|
</el-form-item>
|
|
<el-form-item
|
|
v-if="hasPassword"
|
|
class="login-animation3"
|
|
prop="password"
|
|
:rules="[
|
|
{ required: true, message: '请输入密码', trigger: ['blur', 'change'] },
|
|
{ validator: validatorPwd, trigger: ['blur', 'change'] },
|
|
]"
|
|
>
|
|
<el-input v-model="form.password" :placeholder="'输入密码'" show-password autocomplete="off" clearable @input="onInputPassword">
|
|
<template #prefix>
|
|
<el-icon class="el-input__icon"><ele-Unlock /></el-icon>
|
|
</template>
|
|
</el-input>
|
|
</el-form-item>
|
|
<el-form-item
|
|
class="login-animation3 mb10"
|
|
prop="corpName"
|
|
:rules="[{ required: true, message: '请填写完整企业名称', trigger: ['blur', 'change'] }]"
|
|
>
|
|
<el-input ref="emailRef" text :placeholder="$t('请填写完整企业名称')" v-model="form.corpName" clearable autocomplete="off">
|
|
<template #prefix>
|
|
<el-icon class="el-input__icon"><ele-OfficeBuilding /></el-icon>
|
|
</template>
|
|
</el-input>
|
|
</el-form-item>
|
|
<el-form-item class="login-animation4 mb5">
|
|
<el-button round type="primary" v-waves class="login-content-submit" :loading="state.loading" @click="onReg">
|
|
<span>{{ $t('注册') }}</span>
|
|
</el-button>
|
|
</el-form-item>
|
|
<el-form-item class="login-animation5 mb5 login-agree" prop="agree" :rules="[{ validator: validatorAgree, trigger: ['change'] }]">
|
|
<div class="my-flex my-flex-items-center f12">
|
|
<el-checkbox v-model="form.agree">我已阅读并同意</el-checkbox>
|
|
<div class="my-flex my-flex-items-center ml5">
|
|
<el-link underline="never" type="primary" class="f12" target="_blank" href="https://zhontai.net/admin/introduce.html">服务协议</el-link>、
|
|
<el-link underline="never" type="primary" class="f12" target="_blank" href="https://zhontai.net/admin/introduce.html">隐私政策</el-link>
|
|
</div>
|
|
</div>
|
|
</el-form-item>
|
|
</el-form>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup name="admin/reg-email">
|
|
import { reactive, toRefs, ref, defineAsyncComponent } from 'vue'
|
|
import { AuthRegByEmailInput } from '/@/api/admin/data-contracts'
|
|
import { AuthApi } from '/@/api/admin/Auth'
|
|
import { verifyCnAndSpace } from '/@/utils/toolsValidate'
|
|
import { validatorPwd, validatorAgree } from '/@/utils/validators'
|
|
import { testEmail } from '/@/utils/test'
|
|
import { ElMessage } from 'element-plus'
|
|
|
|
const MyInputCode = defineAsyncComponent(() => import('/@/components/my-input-code/index.vue'))
|
|
const isReg = defineModel('isReg', { type: Boolean, default: false })
|
|
const hasPassword = defineModel('hasPassword', { type: Boolean, default: false })
|
|
|
|
const formRef = ref()
|
|
const emailRef = ref()
|
|
const state = reactive({
|
|
showDialog: false,
|
|
loading: false,
|
|
form: {
|
|
agree: false,
|
|
email: '',
|
|
code: '',
|
|
codeId: '',
|
|
password: '',
|
|
corpName: '中台',
|
|
} as AuthRegByEmailInput & { agree: false },
|
|
})
|
|
const { form } = toRefs(state)
|
|
|
|
//验证邮箱
|
|
const validatorEmail = (callback: Function) => {
|
|
formRef.value.validateField('email', (isValid: boolean) => {
|
|
if (!isValid) {
|
|
emailRef.value?.focus()
|
|
return
|
|
}
|
|
callback?.()
|
|
})
|
|
}
|
|
|
|
//发送验证码
|
|
const onSend = (codeId: string) => {
|
|
state.form.codeId = codeId
|
|
}
|
|
|
|
// 输入密码
|
|
const onInputPassword = (val: string) => {
|
|
state.form.password = verifyCnAndSpace(val)
|
|
}
|
|
|
|
// 打开对话框
|
|
const open = async () => {
|
|
state.showDialog = true
|
|
state.form = {} as AuthRegByEmailInput & { agree: false }
|
|
}
|
|
|
|
// 注册
|
|
const onReg = () => {
|
|
formRef.value.validate(async (valid: boolean) => {
|
|
if (!valid) return
|
|
|
|
state.loading = true
|
|
const res = await new AuthApi().regByEmail(state.form, { showSuccessMessage: false }).catch(() => {
|
|
state.loading = false
|
|
})
|
|
state.loading = false
|
|
|
|
if (res?.success) {
|
|
ElMessage.success('注册成功')
|
|
isReg.value = false
|
|
}
|
|
})
|
|
}
|
|
|
|
defineExpose({
|
|
open,
|
|
})
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.login-content-form {
|
|
.login-title {
|
|
margin-bottom: 50px;
|
|
font-size: 27px;
|
|
text-align: center;
|
|
letter-spacing: 3px;
|
|
color: var(--el-text-color-primary);
|
|
position: relative;
|
|
}
|
|
.login-remind {
|
|
color: #7f8792;
|
|
margin-right: 5px;
|
|
}
|
|
@for $i from 1 through 5 {
|
|
.login-animation#{$i} {
|
|
opacity: 0;
|
|
animation-name: error-num;
|
|
animation-duration: 0.5s;
|
|
animation-fill-mode: forwards;
|
|
animation-delay: calc($i/10) + s;
|
|
}
|
|
}
|
|
.login-content-code {
|
|
width: 100%;
|
|
padding: 0;
|
|
}
|
|
.login-content-submit {
|
|
width: 100%;
|
|
letter-spacing: 2px;
|
|
font-weight: 300;
|
|
margin-top: 15px;
|
|
}
|
|
.login-msg {
|
|
color: var(--el-text-color-placeholder);
|
|
}
|
|
.f12 {
|
|
font-size: 12px;
|
|
}
|
|
:deep() {
|
|
.el-checkbox__input.is-checked + .el-checkbox__label {
|
|
color: unset;
|
|
}
|
|
.login-agree.el-form-item--large .el-form-item__content {
|
|
line-height: unset !important;
|
|
}
|
|
}
|
|
}
|
|
</style>
|