Files
chinese-family-tree-2/app/auth/signin/page.tsx
T
freedakgmail e92884ae53 0.0.1.0
2025-11-23 03:07:39 +08:00

167 lines
5.7 KiB
TypeScript
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.
"use client"
import { useState } from "react"
import { signIn, signOut } from "next-auth/react"
import { useRouter } from "next/navigation"
import Link from "next/link"
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"
import { Alert, AlertDescription } from "@/components/ui/alert"
import { BookOpen } from "lucide-react"
export default function SignInPage() {
const router = useRouter()
const [email, setEmail] = useState("wang@example.com")
const [password, setPassword] = useState("123456")
const [error, setError] = useState("")
const [loading, setLoading] = useState(false)
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
setError("")
setLoading(true)
try {
// 先退出登录,清除旧的 session
await signOut({ redirect: false })
// 等待一小段时间确保 session 被清除
await new Promise(resolve => setTimeout(resolve, 500))
// 清除所有 localStorage 和 sessionStorage
localStorage.clear()
sessionStorage.clear()
// 然后重新登录
const result = await signIn("credentials", {
email,
password,
redirect: false,
})
if (result?.error) {
setError("邮箱或密码错误")
setLoading(false)
} else {
// 强制完全刷新页面,清除所有缓存
window.location.replace("/")
}
} catch (err) {
setError("登录失败,请稍后重试")
setLoading(false)
}
}
return (
<div className="min-h-screen flex items-center justify-center bg-gradient-to-br from-primary/5 via-background to-secondary/5 p-4">
<Card className="w-full max-w-md">
<CardHeader className="space-y-1 text-center">
<div className="flex justify-center mb-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary text-primary-foreground">
<BookOpen className="h-7 w-7" />
</div>
</div>
<CardTitle className="text-2xl font-serif"></CardTitle>
<CardDescription>
</CardDescription>
</CardHeader>
<form onSubmit={handleSubmit}>
<CardContent className="space-y-4">
{error && (
<Alert variant="destructive">
<AlertDescription>{error}</AlertDescription>
</Alert>
)}
<Alert className="bg-blue-50 border-blue-200 dark:bg-blue-950 dark:border-blue-800">
<AlertDescription className="text-sm text-blue-800 dark:text-blue-200">
<div className="space-y-2">
<div className="font-semibold">💡 </div>
<div className="space-y-1 text-xs">
<div className="flex items-center justify-between">
<span>王先生: wang@example.com / 123456</span>
<Button
type="button"
variant="ghost"
size="sm"
className="h-6 px-2 text-xs"
onClick={() => {
setEmail("wang@example.com")
setPassword("123456")
}}
>
使
</Button>
</div>
<div className="flex items-center justify-between">
<span>虞女士: yu@example.com / 123456</span>
<Button
type="button"
variant="ghost"
size="sm"
className="h-6 px-2 text-xs"
onClick={() => {
setEmail("yu@example.com")
setPassword("123456")
}}
>
使
</Button>
</div>
</div>
</div>
</AlertDescription>
</Alert>
<div className="space-y-2">
<Label htmlFor="email"></Label>
<Input
id="email"
type="email"
placeholder="your@email.com"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
disabled={loading}
/>
</div>
<div className="space-y-2">
<Label htmlFor="password"></Label>
<Input
id="password"
type="password"
placeholder="••••••••"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
disabled={loading}
/>
</div>
</CardContent>
<CardFooter className="flex flex-col space-y-4">
<Button
type="submit"
className="w-full"
disabled={loading}
>
{loading ? "登录中..." : "登录"}
</Button>
<div className="text-sm text-center text-muted-foreground">
{" "}
<Link href="/auth/register" className="text-primary hover:underline">
</Link>
</div>
</CardFooter>
</form>
</Card>
</div>
)
}