goofish / web-ui /src /views /LoginView.vue
host1syan's picture
Upload 212 files
5378afe verified
<script setup lang="ts">
import { ref } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { useAuth } from '@/composables/useAuth'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
const username = ref('')
const password = ref('')
const isLoading = ref(false)
const error = ref('')
const { login } = useAuth()
const router = useRouter()
const route = useRoute()
async function handleLogin() {
if (!username.value || !password.value) {
error.value = '请输入用户名和密码'
return
}
isLoading.value = true
error.value = ''
try {
const success = await login(username.value, password.value)
if (success) {
const redirectPath = (route.query.redirect as string) || '/'
router.push(redirectPath)
} else {
error.value = '登录失败:用户名或密码错误'
}
} catch (e) {
error.value = '登录过程中发生错误'
} finally {
isLoading.value = false
}
}
</script>
<template>
<div class="flex items-center justify-center min-h-screen bg-gray-100">
<Card class="w-full max-w-md">
<CardHeader>
<CardTitle class="text-2xl text-center">系统登录</CardTitle>
<CardDescription class="text-center">
请输入您的管理员凭证以继续
</CardDescription>
</CardHeader>
<form @submit.prevent="handleLogin">
<CardContent class="grid gap-4">
<div class="grid gap-2">
<Label for="username">用户名</Label>
<Input id="username" type="text" v-model="username" placeholder="admin" required />
</div>
<div class="grid gap-2">
<Label for="password">密码</Label>
<Input id="password" type="password" v-model="password" required />
</div>
<div v-if="error" class="text-sm text-red-500 font-medium">
{{ error }}
</div>
</CardContent>
<CardFooter>
<Button class="w-full" type="submit" :disabled="isLoading">
{{ isLoading ? '登录中...' : '登录' }}
</Button>
</CardFooter>
</form>
</Card>
</div>
</template>