mcfxkh-Web/src/views/Login/index.js

151 lines
4.0 KiB
JavaScript
Raw Normal View History

2025-05-19 14:26:18 +08:00
import React, { useEffect, lazy } from 'react';
import { useForm, Controller } from 'react-hook-form';
import { Button, TextField } from '@material-ui/core';
import PermIdentity from '@material-ui/icons/PermIdentity';
import LockOpen from '@material-ui/icons/LockOpen';
import './index.less';
import Snackbar from '@material-ui/core/Snackbar';
import MuiAlert from '@material-ui/lab/Alert';
import { useHistory } from 'react-router';
import loginService from '../../models/_/login';
import { useDispatch, useSelector } from 'react-redux';
import config from '../../config';
const ReactLazyPreload = importStatement => {
const Component = React.lazy(importStatement);
Component.preload = importStatement;
return Component;
};
const Home = ReactLazyPreload(() =>
import("../Home")
);
function Alert(props) {
return <MuiAlert elevation={6} variant="filled" {...props} />;
}
function Login() {
const [open, setOpen] = React.useState(false);
const { handleSubmit, control, formState: { errors } } = useForm({
mode: 'onSubmit'
});
const history = useHistory();
const logoDisplaying = useSelector(s => s.runtime.logoDisplaying);
const dispatch = useDispatch();
useEffect(() => {
Home.preload();
}, []);
useEffect(() => {
if (logoDisplaying) {
setTimeout(() => {
dispatch.runtime.setLogoDisplaying(false);
}, 10000);
}
}, [logoDisplaying]);
const logoEnd = () => {
dispatch.runtime.setLogoDisplaying(false);
}
const onSubmit = async (data) => {
const user = await loginService.auth(data);
if (user) {
history.push('/v/home');
} else {
// 提示错误信息
setOpen(true);
}
}
const handleClose = (event, reason) => {
if (reason === 'clickaway') {
return;
}
setOpen(false);
};
return (
logoDisplaying ? (
<div className="logo-container">
<video
style={{ objectFit: 'cover' }}
src="/assets/logo.mp4"
objectfit="true"
autoPlay
muted
width="100%"
height="100%"
onEnded={logoEnd}
>
您的浏览器不支持 video 标签
</video>
</div>
) : (
<div className="loginDiv">
<div className="loginTxt">
<p>{config.title}</p>
</div>
<Snackbar open={open} autoHideDuration={1500} onClose={handleClose} anchorOrigin={{ vertical: 'top', horizontal: 'center' }}>
<Alert onClose={handleClose} severity="error">
用户名或密码错误
</Alert>
</Snackbar>
<form onSubmit={handleSubmit(onSubmit)} className="myForm1">
<div className="formitem">
<PermIdentity />
<Controller
name="user"
control={control}
render={({ field }) => (
<TextField
{...field}
error={!!errors.user}
variant="outlined"
label="登录名"
fullWidth
helperText={errors.user?.message || ' '}
/>
)}
defaultValue=""
rules={{ required: '必填' }}
/>
</div>
<div className="formitem">
<LockOpen />
<Controller
name="pw"
control={control}
render={({ field }) => (
<TextField
{...field}
error={!!errors.pw}
type="password"
variant="outlined"
label="密码"
fullWidth
helperText={errors.pw?.message || ' '}
/>
)}
defaultValue=""
rules={{
required: '必填'
}}
/>
</div>
<Button type="submit" color="primary" fullWidth size="large" variant="outlined" className="myBtn">登陆</Button>
</form>
</div>
)
)
}
export default Login