Files
xsh-assistant-next/app/pages/user/register.vue

174 lines
4.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script lang="ts" setup>
import type { FormSubmitEvent } from '#ui/types'
import { object, string, type InferType } from 'yup'
definePageMeta({
layout: 'authenticate',
})
useSeoMeta({
title: '注册',
})
const router = useRouter()
const toast = useToast()
const loginState = useLoginState()
const final_loading = ref(false)
const registerState = reactive({
username: '',
password: '',
mobile: '',
company: '',
})
const registerSchema = object({
username: string().required('请输入用户名'),
password: string().required('请输入新密码').min(6, '密码长度至少为6位'),
mobile: string()
.required('请输入手机号')
.matches(/^1[3-9]\d{9}$/, '手机号格式不正确'),
company: string().required('请输入公司/单位名称'),
})
type RegisterSchema = InferType<typeof registerSchema>
const onSubmit = (form: RegisterSchema) => {
final_loading.value = true
useFetchWrapped<Partial<UserSchema>, BaseResponse<{ user_id: number }>>(
'App.User_User.Register',
{
...registerState,
}
).then(
(res) => {
final_loading.value = false
if (res) {
toast.add({
title: '注册成功',
description: '请联系客服激活账号后登录',
color: 'green',
icon: 'i-tabler-check',
})
router.push('/user/authenticate')
}
},
(err) => {
final_loading.value = false
toast.add({
title: '注册失败',
description: err.message || '注册失败,请稍后再试',
color: 'red',
icon: 'i-tabler-alert-triangle',
})
}
)
}
</script>
<template>
<div class="w-full min-h-screen flex flex-col justify-center items-center">
<div class="flex flex-col items-center py-12 gap-2">
<h1 class="text-3xl font-bold text-gray-900 dark:text-white">
AIGC 微课视频研创平台
</h1>
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400">账号注册</p>
</div>
<div class="flex flex-col items-center">
<UCard
@submit.prevent="() => onSubmit(registerState)"
class="w-full sm:w-[400px]"
>
<!-- <template #header>
<p
class="text-base font-semibold leading-6 text-gray-900 dark:text-white"
>
{{ item.label }}
</p>
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400">
{{ item.description }}
</p>
</template> -->
<div class="space-y-3">
<UFormGroup
label="姓名"
name="username"
help="请使用姓名作为用户名,将用于登录"
required
>
<UInput
v-model="registerState.username"
:disabled="final_loading"
required
/>
</UFormGroup>
<UFormGroup
label="密码"
name="password"
required
>
<UInput
v-model="registerState.password"
:disabled="final_loading"
type="password"
required
/>
</UFormGroup>
<UFormGroup
label="手机号"
name="mobile"
required
>
<UInput
v-model="registerState.mobile"
:disabled="final_loading"
required
/>
</UFormGroup>
<UFormGroup
label="公司/单位"
name="company"
required
>
<UInput
v-model="registerState.company"
:disabled="final_loading"
required
/>
</UFormGroup>
</div>
<template #footer>
<div class="flex items-center justify-between">
<UButton
type="submit"
color="black"
:loading="final_loading"
>
注册
</UButton>
</div>
</template>
</UCard>
</div>
<div class="pt-4">
<UButton
color="gray"
variant="ghost"
class="text-gray-500!"
@click="
() => {
router.push('/user/authenticate')
}
"
>
已有账号前往登录
</UButton>
</div>
</div>
</template>
<style scoped></style>