generated from kevisual/vite-react-template
feat: 添加登录页面配置和背景装饰,优化登录组件展示
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { Home, User, LogIn, LogOut } from 'lucide-react';
|
import { Home, User, LogIn, LogOut } from 'lucide-react';
|
||||||
import { Link } from '@tanstack/react-router'
|
import { Link, useNavigate } from '@tanstack/react-router'
|
||||||
import { useLayoutStore } from '../store';
|
import { useLayoutStore } from '../store';
|
||||||
import { useShallow } from 'zustand/shallow';
|
import { useShallow } from 'zustand/shallow';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
@@ -9,12 +9,12 @@ export const BaseHeader = (props: { main?: React.ComponentType | null }) => {
|
|||||||
me: state.me,
|
me: state.me,
|
||||||
clearMe: state.clearMe,
|
clearMe: state.clearMe,
|
||||||
})));
|
})));
|
||||||
|
const navigate = useNavigate();
|
||||||
const meInfo = useMemo(() => {
|
const meInfo = useMemo(() => {
|
||||||
if (!store.me) {
|
if (!store.me) {
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
onClick={() => window.open('/root/login/?redirect=' + encodeURIComponent(window.location.href), '_self')}
|
onClick={() => navigate({ to: '/login' })}
|
||||||
className="flex items-center gap-2 px-3 py-1.5 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded-lg transition-colors cursor-pointer"
|
className="flex items-center gap-2 px-3 py-1.5 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded-lg transition-colors cursor-pointer"
|
||||||
>
|
>
|
||||||
<LogIn className="w-4 h-4" />
|
<LogIn className="w-4 h-4" />
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ export const LoginComponent = ({ onLoginSuccess }: { onLoginSuccess: () => void
|
|||||||
}
|
}
|
||||||
export const App = () => {
|
export const App = () => {
|
||||||
const store = useLayoutStore(useShallow((state) => ({
|
const store = useLayoutStore(useShallow((state) => ({
|
||||||
init: state.init
|
init: state.init,
|
||||||
|
loginPageConfig: state.loginPageConfig,
|
||||||
})));
|
})));
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
checkPluginLogin();
|
checkPluginLogin();
|
||||||
@@ -39,11 +40,42 @@ export const App = () => {
|
|||||||
await store.init()
|
await store.init()
|
||||||
navigate({ to: '/' })
|
navigate({ to: '/' })
|
||||||
};
|
};
|
||||||
return <div className='w-full h-full'>
|
const { title, subtitle, footer } = store.loginPageConfig;
|
||||||
<div className='w-md mx-auto flex mt-20'>
|
return (
|
||||||
<LoginComponent onLoginSuccess={handleLoginSuccess} />
|
<div className='w-full h-full relative overflow-hidden bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900'>
|
||||||
|
{/* 背景装饰 - 圆形光晕 */}
|
||||||
|
<div className='absolute top-1/4 -left-32 w-96 h-96 bg-purple-500/30 rounded-full blur-3xl'></div>
|
||||||
|
<div className='absolute bottom-1/4 -right-32 w-96 h-96 bg-blue-500/30 rounded-full blur-3xl'></div>
|
||||||
|
<div className='absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-indigo-500/20 rounded-full blur-3xl'></div>
|
||||||
|
|
||||||
|
{/* 背景装饰 - 网格图案 */}
|
||||||
|
<div className='absolute inset-0 opacity-[0.03] bg-[linear-gradient(rgba(255,255,255,0.1)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,0.1)_1px,transparent_1px)] bg-[size:50px_50px]'></div>
|
||||||
|
|
||||||
|
{/* 顶部装饰文字 */}
|
||||||
|
<div className='absolute top-10 left-0 right-0 text-center'>
|
||||||
|
<h1 className='text-4xl font-bold text-white/90 tracking-wider'>{title}</h1>
|
||||||
|
<p className='mt-2 text-white/50 text-sm tracking-widest'>{subtitle}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 登录卡片容器 */}
|
||||||
|
<div className='w-full h-full flex items-center justify-center p-8'>
|
||||||
|
<div className='relative'>
|
||||||
|
{/* 卡片外圈光效 */}
|
||||||
|
<div className='absolute -inset-1 bg-gradient-to-r from-purple-500 via-blue-500 to-indigo-500 rounded-2xl blur opacity-30'></div>
|
||||||
|
|
||||||
|
{/* 登录组件容器 */}
|
||||||
|
<div className='relative bg-slate-900/80 backdrop-blur-xl rounded-2xl border border-white/10 shadow-2xl overflow-hidden'>
|
||||||
|
<LoginComponent onLoginSuccess={handleLoginSuccess} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 底部装饰 */}
|
||||||
|
<div className='absolute bottom-6 left-0 right-0 text-center'>
|
||||||
|
<p className='text-white/30 text-xs'>{footer}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
@@ -27,6 +27,12 @@ export type LayoutStore = {
|
|||||||
init: () => Promise<void>;
|
init: () => Promise<void>;
|
||||||
openLinkList: string[];
|
openLinkList: string[];
|
||||||
setOpenLinkList: (openLinkList: string[]) => void;
|
setOpenLinkList: (openLinkList: string[]) => void;
|
||||||
|
loginPageConfig: {
|
||||||
|
title: string;
|
||||||
|
subtitle: string;
|
||||||
|
footer: string;
|
||||||
|
};
|
||||||
|
setLoginPageConfig: (config: Partial<LayoutStore['loginPageConfig']>) => void;
|
||||||
};
|
};
|
||||||
export const useLayoutStore = create<LayoutStore>((set, get) => ({
|
export const useLayoutStore = create<LayoutStore>((set, get) => ({
|
||||||
open: false,
|
open: false,
|
||||||
@@ -76,4 +82,12 @@ export const useLayoutStore = create<LayoutStore>((set, get) => ({
|
|||||||
},
|
},
|
||||||
openLinkList: ['/login'],
|
openLinkList: ['/login'],
|
||||||
setOpenLinkList: (openLinkList) => set({ openLinkList }),
|
setOpenLinkList: (openLinkList) => set({ openLinkList }),
|
||||||
|
loginPageConfig: {
|
||||||
|
title: '可视化管理平台',
|
||||||
|
subtitle: '让工具和智能化触手可及',
|
||||||
|
footer: '欢迎使用可视化管理平台 · 连接您的工具',
|
||||||
|
},
|
||||||
|
setLoginPageConfig: (config) => set((state) => ({
|
||||||
|
loginPageConfig: { ...state.loginPageConfig, ...config },
|
||||||
|
})),
|
||||||
}));
|
}));
|
||||||
Reference in New Issue
Block a user