From 7a00868dc7730b83dc1e3d232b9f2e2b43ad237a Mon Sep 17 00:00:00 2001 From: vincentlu <t1341870251@gmail.com> Date: 星期五, 07 二月 2025 14:51:29 +0800 Subject: [PATCH] # --- rsf-admin/src/page/login/index.jsx | 247 ++++++++++++++++--------------------------------- 1 files changed, 80 insertions(+), 167 deletions(-) diff --git a/rsf-admin/src/page/login/index.jsx b/rsf-admin/src/page/login/index.jsx index 634211a..5c56eaf 100644 --- a/rsf-admin/src/page/login/index.jsx +++ b/rsf-admin/src/page/login/index.jsx @@ -1,195 +1,108 @@ -import * as React from 'react'; -import { useState } from 'react'; -import { useLocation } from 'react-router-dom'; +import React, { useState, useRef, useEffect, useMemo } from "react"; import { - Avatar, Box, - Button, + AppBar, Card, - CardActions, + Toolbar, CircularProgress, + Typography, + Tabs, + Tab, } from '@mui/material'; -import LockIcon from '@mui/icons-material/Lock'; import { - Form, - required, - TextInput, useTranslate, useLogin, useNotify, - SelectInput, } from 'react-admin'; import { LOGIN_BACKGROUND } from '@/config/setting'; import { tenants } from '@/api/auth'; +import Login from "./Login"; +import Register from "./Register"; -const Login = () => { - const [loading, setLoading] = useState(false); +const Index = () => { const translate = useTranslate(); - const notify = useNotify(); - const login = useLogin(); - const location = useLocation(); + const [tab, setTab] = useState(0) + const [tenantList, setTenantList] = useState([]); - const [tenantList, setTenantList] = React.useState([]); - const [tenantId, setTenantId] = React.useState(null); - - React.useEffect(() => { + useEffect(() => { tenants().then(data => { setTenantList(data); - if (data.length > 0) { - setTenantId(data[0].id); - } }) }, []); - React.useEffect(() => { - console.log(tenantId); - }, [tenantId]); - - const handleSubmit = (auth) => { - setLoading(true); - // js native confirm && root - login( - auth, - location.state ? (location.state).nextPathname : '/' - ).catch((error) => { - setLoading(false); - notify( - typeof error === 'string' - ? error - : typeof error === 'undefined' || !error.message - ? 'ra.auth.sign_in_error' - : error.message, - { - type: 'error', - messageArgs: { - _: - typeof error === 'string' - ? error - : error && error.message - ? error.message - : undefined, - }, - } - ); - }); - }; - return ( - <Form onSubmit={handleSubmit} noValidate> - {/* https://unsplash.com/ */} - <Box - sx={{ - display: 'flex', - flexDirection: 'column', - minHeight: '100vh', - alignItems: 'center', - justifyContent: 'flex-start', - // justifyContent: 'center', - background: `url(/login_bg.jpg)`, - backgroundRepeat: 'no-repeat', - backgroundSize: 'cover', + <Box + sx={{ + display: 'flex', + flexDirection: 'column', + minHeight: '100vh', + alignItems: 'center', + justifyContent: 'flex-start', + // justifyContent: 'center', + background: `url(/login_bg.jpg)`, // https://unsplash.com/ + backgroundRepeat: 'no-repeat', + backgroundSize: 'cover', + } + } + > + <video + autoPlay + loop + muted + style={{ + position: 'fixed', + top: 0, + left: 0, + width: '100%', + height: '100%', + // objectFit: 'cover', + // objectFit: 'contain', + objectFit: 'fill', + // objectFit: 'scale-down', + zIndex: 0, }} > - <video - autoPlay - loop - muted - style={{ - position: 'fixed', - top: 0, - left: 0, - width: '100%', - height: '100%', - // objectFit: 'cover', - // objectFit: 'contain', - objectFit: 'fill', - // objectFit: 'scale-down', - zIndex: 0, - }} - > - {LOGIN_BACKGROUND === 'media' && ( - <source src="/login_bg.mp4" type="video/mp4" /> - )} - </video> + {LOGIN_BACKGROUND === 'media' && ( + <source src="/login_bg.mp4" type="video/mp4" /> + )} + </video> - <Card sx={{ - minWidth: 300, - marginTop: '6em', - zIndex: 1 - }}> - <Box - sx={{ - margin: '1em', - display: 'flex', - justifyContent: 'center', - }} - > - <Avatar sx={{ bgcolor: 'secondary.main' }}> - <LockIcon /> - </Avatar> - </Box> - <Box - sx={{ - marginTop: '1em', - display: 'flex', - justifyContent: 'center', - color: theme => theme.palette.grey[500], - }} - > - Hint: root / 123456 - </Box> - <Box sx={{ padding: '0 1em 1em 1em' }}> - <Box sx={{ marginTop: '1em' }}> - <SelectInput - label="page.login.tenant" - source="tenantId" - choices={tenantList.map(item => ({ - id: item.id, - name: item.name - }))} - validate={required()} - value={tenantId} - onChange={e => setTenantId(e.target.value)} - /> - </Box> - <Box sx={{ marginTop: '.1em' }}> - <TextInput - autoFocus - source="username" - label={translate('ra.auth.username')} - disabled={loading} - validate={required()} - /> - </Box> - <Box sx={{ marginTop: '.1em' }}> - <TextInput - source="password" - label={translate('ra.auth.password')} - type="password" - disabled={loading} - validate={required()} - /> - </Box> - </Box> - <CardActions sx={{ padding: '0 1em 1em 1em' }}> - <Button - variant="contained" - type="submit" - color="primary" - disabled={loading} - fullWidth - > - {loading && ( - <CircularProgress size={25} thickness={2} /> - )} - {translate('ra.auth.sign_in')} - </Button> - </CardActions> - </Card> - </Box> - </Form> + <Card sx={{ + width: 400, + marginTop: '6em', + zIndex: 1 + }}> + <div> + <AppBar position="static" sx={{ backgroundColor: '#3D4BA7' }}> + <Toolbar> + <Typography variant="h6" color="inherit">Welcome</Typography> + </Toolbar> + </AppBar> + </div> + + <Tabs + value={tab} + onChange={(event, value) => { + setTab(value); + }} + indicatorColor="primary" + textColor="primary" + variant="fullWidth" + > + <Tab label="Login" sx={{ fontSize: '.8em' }} /> + <Tab label="Register" sx={{ fontSize: '.8em' }} /> + </Tabs> + + {tab === 0 && <Login tenantList={tenantList} />} + {tab === 1 && <Register tenantList={tenantList} />} + + <Box mt={1} mb={1} sx={{ textAlign: 'center' }}> + <Typography variant="caption" align="center">rsf - sever</Typography> + </Box> + </Card> + </Box > ); }; -export default Login; +export default Index; -- Gitblit v1.9.1