feat: implement Login and Register views
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
<!-- src/views/Login.vue -->
|
||||
<template>
|
||||
<div class="min-h-screen flex items-center justify-center bg-gray-100">
|
||||
<n-card class="w-96" title="登录">
|
||||
<n-form ref="formRef" :model="form" :rules="rules">
|
||||
<n-form-item path="username" label="用户名">
|
||||
<n-input v-model:value="form.username" placeholder="输入用户名" />
|
||||
</n-form-item>
|
||||
<n-form-item path="password" label="密码">
|
||||
<n-input v-model:value="form.password" type="password" placeholder="输入密码" />
|
||||
</n-form-item>
|
||||
<n-button type="primary" block :loading="loading" @click="handleLogin">
|
||||
登录
|
||||
</n-button>
|
||||
</n-form>
|
||||
<div class="mt-4 text-center">
|
||||
还没有账号?<router-link to="/register" class="text-blue-500">注册</router-link>
|
||||
</div>
|
||||
</n-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { NCard, NForm, NFormItem, NInput, NButton, useMessage } from 'naive-ui'
|
||||
import { useAuthStore } from '../stores/auth'
|
||||
|
||||
const router = useRouter()
|
||||
const message = useMessage()
|
||||
const authStore = useAuthStore()
|
||||
|
||||
const form = ref({ username: '', password: '' })
|
||||
const loading = ref(false)
|
||||
|
||||
const rules = {
|
||||
username: [{ required: true, message: '请输入用户名' }],
|
||||
password: [{ required: true, message: '请输入密码' }],
|
||||
}
|
||||
|
||||
const handleLogin = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
await authStore.login(form.value.username, form.value.password)
|
||||
message.success('登录成功')
|
||||
router.push('/')
|
||||
} catch (error: any) {
|
||||
message.error(error.response?.data?.detail || '登录失败')
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,63 @@
|
||||
<!-- src/views/Register.vue -->
|
||||
<template>
|
||||
<div class="min-h-screen flex items-center justify-center bg-gray-100">
|
||||
<n-card class="w-96" title="注册">
|
||||
<n-form ref="formRef" :model="form" :rules="rules">
|
||||
<n-form-item path="username" label="用户名">
|
||||
<n-input v-model:value="form.username" placeholder="输入用户名" />
|
||||
</n-form-item>
|
||||
<n-form-item path="email" label="邮箱">
|
||||
<n-input v-model:value="form.email" placeholder="输入邮箱" />
|
||||
</n-form-item>
|
||||
<n-form-item path="password" label="密码">
|
||||
<n-input v-model:value="form.password" type="password" placeholder="输入密码" />
|
||||
</n-form-item>
|
||||
<n-button type="primary" block :loading="loading" @click="handleRegister">
|
||||
注册
|
||||
</n-button>
|
||||
</n-form>
|
||||
<div class="mt-4 text-center">
|
||||
已有账号?<router-link to="/login" class="text-blue-500">登录</router-link>
|
||||
</div>
|
||||
</n-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { NCard, NForm, NFormItem, NInput, NButton, useMessage } from 'naive-ui'
|
||||
import { useAuthStore } from '../stores/auth'
|
||||
|
||||
const router = useRouter()
|
||||
const message = useMessage()
|
||||
const authStore = useAuthStore()
|
||||
|
||||
const form = ref({ username: '', email: '', password: '' })
|
||||
const loading = ref(false)
|
||||
|
||||
const rules = {
|
||||
username: [{ required: true, message: '请输入用户名' }],
|
||||
email: [
|
||||
{ required: true, message: '请输入邮箱' },
|
||||
{ type: 'email', message: '请输入有效邮箱' }
|
||||
],
|
||||
password: [
|
||||
{ required: true, message: '请输入密码' },
|
||||
{ min: 6, message: '密码至少6位' }
|
||||
],
|
||||
}
|
||||
|
||||
const handleRegister = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
await authStore.register(form.value.username, form.value.email, form.value.password)
|
||||
message.success('注册成功,请登录')
|
||||
router.push('/login')
|
||||
} catch (error: any) {
|
||||
message.error(error.response?.data?.detail || '注册失败')
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user