import { LockKeyhole, ShieldCheck } from 'lucide-react' import { useState } from 'react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' export function LoginPage({ submitting, localLoginEnabled, proxyAuthEnabled, onLogin, }: { submitting: boolean localLoginEnabled: boolean proxyAuthEnabled: boolean onLogin: (payload: { username: string; password: string }) => Promise }) { const [username, setUsername] = useState('admin') const [password, setPassword] = useState('admin123') return (
Termi 后台
将后台从前台中拆分出来,同时保持迭代节奏不掉线。 当前管理工作统一在这个独立后台中完成,后端专注提供 API、认证与业务规则。
{[ ['React 应用', '独立后台界面'], ['shadcn/ui', '统一的组件基础'], ['Loco API', '后端继续专注数据与规则'], ].map(([title, description]) => (
{title}

{description}

))}
登录管理后台 {localLoginEnabled ? '当前登录复用后端管理员账号;如果前面接了 TinyAuth / Pocket ID,也可以直接由反向代理完成 SSO。' : proxyAuthEnabled ? '当前后台已切到代理侧 SSO 模式,请从受保护的后台域名入口进入。' : '当前后台未开放本地账号密码登录,请检查部署配置。'} {localLoginEnabled ? (
{ event.preventDefault() void onLogin({ username, password }) }} >
setUsername(event.target.value)} autoComplete="username" required />
setPassword(event.target.value)} autoComplete="current-password" required />
) : (

推荐通过 Caddy + TinyAuth + Pocket ID 保护整个后台入口。

如果你已经从受保护的后台域名进入,刷新页面后会自动识别当前 SSO 会话。

)}
) }