diff --git a/src/frontend/README.md b/src/frontend/README.md index 8cf5f11..fa7e5c4 100644 --- a/src/frontend/README.md +++ b/src/frontend/README.md @@ -1,10 +1,20 @@ # Network Admin Web UI -基于 React 和 Chakra UI +### 基于 `React` 和 `Chakra UI` -- 前端框架:React -- UI 组件库:Chakra UI -- 网络图表:Recharts -- 状态管理:React hooks -- 数据通信:Axios -- 页面路由:React Router \ No newline at end of file +#### 架构 +- 前端框架:`React` +- UI 组件库:`Chakra UI` +- 网络图表:`Recharts` +- 状态管理:`React hooks` +- 数据通信:`Axios` +- 页面路由:`React Router` + +#### 部署方法 +- `clone`项目 +- 导航到`/src/frontend/`目录 +- 使用`pnpm`管理软件包:`npm install pnpm -g` +- 安装依赖:`pnpm install` +- 执行`pnpm build`进行`react`服务端构建 +- 运行`pnpm start`启动服务端 +- 服务运行在本地`3000`端口 diff --git a/src/frontend/src/components/pages/welcome/BackgroundBlur.jsx b/src/frontend/src/components/pages/welcome/BackgroundBlur.jsx index 37c35c2..f92455b 100644 --- a/src/frontend/src/components/pages/welcome/BackgroundBlur.jsx +++ b/src/frontend/src/components/pages/welcome/BackgroundBlur.jsx @@ -1,6 +1,11 @@ import { Box, Image } from '@chakra-ui/react'; import image from '@/resources/welcome/image/background.png'; +/** + * 带高斯模糊的背景 + * @returns {JSX.Element} + * @constructor + */ const BackgroundBlur = () => ( { const navigate = useNavigate(); - return navigate('/dashboard')} />; + return ( + + navigate('/dashboard')} /> + + ); }; export default DashboardCard; diff --git a/src/frontend/src/components/pages/welcome/GithubCard.jsx b/src/frontend/src/components/pages/welcome/GithubCard.jsx index 86f4f77..03121ba 100644 --- a/src/frontend/src/components/pages/welcome/GithubCard.jsx +++ b/src/frontend/src/components/pages/welcome/GithubCard.jsx @@ -1,13 +1,21 @@ import githubIcon from '@/resources/welcome/image/github.svg'; import MotionCard from '@/components/ui/MotionCard'; +import FadeInWrapper from '@/components/system/layout/FadeInWrapper'; +/** + * GitHub按钮组件 + * @returns {JSX.Element} + * @constructor + */ const GithubCard = () => { return ( - window.open('https://github.com/Jerryplusy/AI-powered-switches', '_blank')} - /> + + window.open('https://github.com/Jerryplusy/AI-powered-switches', '_blank')} + /> + ); }; diff --git a/src/frontend/src/components/pages/welcome/WelcomeContent.jsx b/src/frontend/src/components/pages/welcome/WelcomeContent.jsx index 48471e5..1400d38 100644 --- a/src/frontend/src/components/pages/welcome/WelcomeContent.jsx +++ b/src/frontend/src/components/pages/welcome/WelcomeContent.jsx @@ -1,19 +1,31 @@ import { Box, Heading, Text, VStack } from '@chakra-ui/react'; import DashboardCard from '@/components/pages/welcome/DashboardCard'; +import FadeInWrapper from '@/components/system/layout/FadeInWrapper'; +/** + * 欢迎文字 + * @returns {JSX.Element} + * @constructor + */ const WelcomeContent = () => { return ( - - - 智能网络交换机 -
- 管理系统 -
- - 助力大型网络交换机配置及网络流量管理,方便的管控网络,让网络配置不再困难 - -
+ + + + 智能网络交换机 +
+ 管理系统 +
+
+
+ + + + 助力大型网络交换机配置及网络流量管理,方便的管控网络,让网络配置不再困难 + + +
); diff --git a/src/frontend/src/components/system/layout/AppShell.jsx b/src/frontend/src/components/system/layout/AppShell.jsx index c33b395..baef4f6 100644 --- a/src/frontend/src/components/system/layout/AppShell.jsx +++ b/src/frontend/src/components/system/layout/AppShell.jsx @@ -3,6 +3,11 @@ import PageTransition from './PageTransition'; import { Box } from '@chakra-ui/react'; import { AnimatePresence } from 'framer-motion'; +/** + * 应用加壳 + * @returns {JSX.Element} + * @constructor + */ const AppShell = () => { const location = useLocation(); diff --git a/src/frontend/src/components/system/layout/FadeInWrapper.jsx b/src/frontend/src/components/system/layout/FadeInWrapper.jsx new file mode 100644 index 0000000..617931e --- /dev/null +++ b/src/frontend/src/components/system/layout/FadeInWrapper.jsx @@ -0,0 +1,29 @@ +import { motion } from 'framer-motion'; + +/** + * 组件载入动画 + * @param children 子组件 + * @param delay 延迟 + * @param yOffset y轴偏移量 + * @param duration 动画时间 + * @param className 类名 + * @returns {JSX.Element} + * @constructor + */ +const FadeInWrapper = ({ children, delay = 0, yOffset = 10, duration = 0.6, className = '' }) => { + return ( + + {children} + + ); +}; +export default FadeInWrapper; diff --git a/src/frontend/src/components/system/layout/GithubNavTransition.jsx b/src/frontend/src/components/system/layout/GithubNavTransition.jsx index 704e275..df77d68 100644 --- a/src/frontend/src/components/system/layout/GithubNavTransition.jsx +++ b/src/frontend/src/components/system/layout/GithubNavTransition.jsx @@ -3,6 +3,11 @@ import { motion, AnimatePresence } from 'framer-motion'; import { Box, Text, Image } from '@chakra-ui/react'; import githubIcon from '@/resources/welcome/image/github.svg'; +/** + * GitHub图标变换=>导航栏 + * @returns {JSX.Element} + * @constructor + */ const GithubNavTransition = () => { const { pathname } = useLocation(); const isDashboard = pathname.startsWith('/dashboard'); diff --git a/src/frontend/src/components/system/layout/PageTransition.jsx b/src/frontend/src/components/system/layout/PageTransition.jsx index e1e84ca..e6eaf0f 100644 --- a/src/frontend/src/components/system/layout/PageTransition.jsx +++ b/src/frontend/src/components/system/layout/PageTransition.jsx @@ -1,13 +1,16 @@ import { motion } from 'framer-motion'; -const PageTransition = ({ children }) => ( - - {children} - -); +/** + * 页面动效 + * @param children + * @returns {JSX.Element} + * @constructor + */ +const PageTransition = ({ children }) => {children}; export default PageTransition; +/** + * initial={{ opacity: 0, y: 0 }} + * animate={{ opacity: 1, y: 0 }} + * transition={{ duration: 0.2 }} + */ diff --git a/src/frontend/src/components/system/layout/StaggeredFadeIn.jsx b/src/frontend/src/components/system/layout/StaggeredFadeIn.jsx new file mode 100644 index 0000000..9462c71 --- /dev/null +++ b/src/frontend/src/components/system/layout/StaggeredFadeIn.jsx @@ -0,0 +1,24 @@ +import FadeInWrapper from './FadeInWrapper'; + +/** + * 递归为组件及子组件添加载入动效 + * @param children 子组件 + * @param baseDelay 延迟 + * @param increment 增值 + * @param className 类名 + * @returns {JSX.Element} + * @constructor + */ +const StaggeredFadeIn = ({ children, baseDelay = 0.2, increment = 0.1, className = '' }) => { + return ( + <> + {React.Children.map(children, (child, index) => ( + + {child} + + ))} + + ); +}; + +export default StaggeredFadeIn; diff --git a/src/frontend/src/components/ui/MotionCard.jsx b/src/frontend/src/components/ui/MotionCard.jsx index 1132a56..ead0386 100644 --- a/src/frontend/src/components/ui/MotionCard.jsx +++ b/src/frontend/src/components/ui/MotionCard.jsx @@ -5,7 +5,10 @@ const MotionBox = motion(Box); const MotionCard = ({ icon, text, onClick }) => ( ( borderRadius={'md'} cursor={'pointer'} onClick={onClick} + transition={{ duration: 0.1 }} > {icon && } {text} diff --git a/src/frontend/src/constants/routes/routes.jsx b/src/frontend/src/constants/routes/routes.jsx index 7170259..c479820 100644 --- a/src/frontend/src/constants/routes/routes.jsx +++ b/src/frontend/src/constants/routes/routes.jsx @@ -2,6 +2,10 @@ import { Route } from 'react-router-dom'; import Welcome from '@/pages/Welcome'; import Dashboard from '@/pages/Dashboard'; +/** + * 路由 + * @type {[{path: string, element: JSX.Element},{path: string, element: JSX.Element}]} + */ const routeList = [ { path: '/', element: }, { path: '/dashboard', element: }, diff --git a/src/frontend/src/pages/Dashboard.jsx b/src/frontend/src/pages/Dashboard.jsx index a0533ba..1a153ed 100644 --- a/src/frontend/src/pages/Dashboard.jsx +++ b/src/frontend/src/pages/Dashboard.jsx @@ -1,11 +1,9 @@ import React from 'react'; import { Box, Text } from '@chakra-ui/react'; -import Header from '../components/system/Header'; const Dashboard = () => { return ( <> -
控制台奇怪的功能+1 diff --git a/src/frontend/src/pages/Welcome.jsx b/src/frontend/src/pages/Welcome.jsx index 9d0b659..5e4e1d9 100644 --- a/src/frontend/src/pages/Welcome.jsx +++ b/src/frontend/src/pages/Welcome.jsx @@ -3,6 +3,11 @@ import BackgroundBlur from '@/components/pages/welcome/BackgroundBlur'; import WelcomeContent from '@/components/pages/welcome/WelcomeContent'; import GithubCard from '@/components/pages/welcome/GithubCard'; +/** + * 欢迎页 + * @returns {JSX.Element} + * @constructor + */ const Welcome = () => { return (