You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							182 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							182 lines
						
					
					
						
							6.8 KiB
						
					
					
				| 'use strict'; | |
| import React, { useState, useEffect, useRef } from 'react'; | |
| import { connect } from 'react-redux'; | |
| import { push } from 'react-router-redux'; | |
| import { ApiTable } from '$utils' | |
| import { Request } from '@peace/utils' | |
| import { Button, Input, Form, Row, Col, message, Tabs, Tooltip } from 'antd'; | |
| import { login, LOGIN_ERROR } from '../actions/auth'; | |
| import { ExclamationCircleOutlined } from '@ant-design/icons'; | |
| import { Uploads } from '$components' | |
| import { LockOutlined, UserOutlined } from '@ant-design/icons'; | |
| import './login.less'; | |
| 
 | |
| const FormItem = Form.Item; | |
| 
 | |
| let codCountDownInterval = null | |
| const Login = props => { | |
|    const { dispatch, user, error, isRequesting } = props | |
|    const [username, setUserName] = useState('') | |
|    const [password, setPassword] = useState('') | |
|    const [phone, setPhone] = useState('') | |
|    const [code, setCode] = useState('') | |
|    const [inputChanged, setInputChanged] = useState(false) | |
|    const [curTabKey, setCurTabKey] = useState(1) | |
|    const [codSending, setCodSending] = useState(false) | |
|    const [codCountDown, setCodeCountDown] = useState(60) | |
|    const codCountDownRef = useRef(0) | |
|    const [form] = Form.useForm(); | |
| 
 | |
|    useEffect(() => { | |
|       // 水环境跳转自动登录 | |
|       const structId = getUrlParams(window.location.search)?.structId; | |
|       if (structId) { | |
|          sessionStorage.setItem('structId', structId); | |
|          dispatch(login({ username: 'SuperAdmin', password: '123456' })); | |
|       } | |
|    }, []) | |
| 
 | |
|    useEffect(() => { | |
|       if (user && user.authorized) { | |
|          dispatch(push('/systemManagement')); | |
|       } | |
|    }, [user]) | |
| 
 | |
|    useEffect(() => { | |
|       if (codSending) { | |
|          setCodeCountDown(59) | |
|          codCountDownRef.current = 59 | |
|          codCountDownInterval = setInterval(() => { | |
|             codCountDownRef.current -= 1 | |
|             if (codCountDownRef.current == 0) { | |
|                setCodSending(false) | |
|                setCodeCountDown(60) | |
|                clearInterval(codCountDownInterval) | |
|                codCountDownInterval = null | |
|             } else { | |
|                setCodeCountDown(codCountDownRef.current) | |
|             } | |
|          }, 1000); | |
|       } else { | |
|          if (codCountDownInterval) { | |
|             clearInterval(codCountDownInterval) | |
|             codCountDownInterval = null | |
|             setCodeCountDown(60) | |
|          } | |
|       } | |
|    }, [codSending]) | |
| 
 | |
| 
 | |
| 
 | |
|    return ( | |
|       <div | |
|          id='loginContainer' | |
|          style={{ | |
|             height: '100vh', | |
|             display: 'flex', | |
|             alignItems: 'center', | |
|             justifyContent: 'center', | |
|             color: 'aliceblue', | |
|             backgroundImage: 'url(/assets/images/login/login-b.gif)', | |
|             backgroundSize: 'cover', | |
|             position: 'relative', | |
|          }} | |
|       > | |
|          {/* <img src='/assets/images/logo.png' style={{ height: 42, borderRadius: 4, position: 'fixed', top: 32, left: 32 }} /> */} | |
| 
 | |
|          <div style={{ | |
|             width: 556, height: 554, display: 'flex', flexDirection: 'column', justifyContent: 'space-between', | |
|             borderRadius: '2px 2px 0 0', position: 'absolute', right: 150, top: 'calc(50% - 217px)' | |
|          }}> | |
|             <img src={'/assets/images/login/word.png'} style={{ width: '100%', height: 80, dispatch: 'inline-block' }} /> | |
| 
 | |
|             <div className='login' style={{ width: 556, height: 434, background: 'url(/assets/images/login/register-bg.png)', backgroundSize: '100% 100%', backgroundPosition: 'center', }}> | |
|                <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', margin: '22px 10px' }}> | |
|                   <img src={'/assets/images/login/icon_z.png'} style={{ width: 26, height: 14 }} /> | |
|                   <div style={{ color: '#C5E0FF', fontSize: 24 }}>系统登录</div> | |
|                   <img src={'/assets/images/login/icon_y.png'} style={{ width: 26, height: 14 }} /> | |
| 
 | |
|                </div> | |
|                <div style={{ | |
|                   // width: 410, | |
|                   // height: 322, | |
|  | |
|                }}> | |
| 
 | |
|                   <Form | |
|                      form={form} | |
|                      onFinish={r => { | |
|                         form.validateFields().then(r => { | |
|                            dispatch(login({ username: r.username, password: r.password })); | |
|                         }) | |
|                            .catch(err => { | |
|                               dispatch({ | |
|                                  type: LOGIN_ERROR, | |
|                                  payload: { error: '请输入账号名和密码' } | |
|                               }) | |
|                            }) | |
| 
 | |
|                      }} | |
|                      style={{ width: '100%', height: 400, display: 'flex', alignItems: 'center', flexDirection: 'column' }} | |
|                   > | |
|                      <Form.Item label='' name="username" rules={[{ required: true, message: '请输入账户' },]} style={{ marginTop: 50 }}> | |
|                         <Input prefix={<> | |
|                            <UserOutlined style={{ marginLeft: 20, color: 'white', fontSize: 18 }} /> | |
|                            <span style={{ color: 'white' }}>账户</span> | |
|                            <span style={{ color: 'white', marginRight: 10, height: 18, borderRight: '1px solid white' }}></span> | |
|                         </>} style={{ width: 380, margin: '6px 0px 6px 0' }} placeholder="" /> | |
|                      </Form.Item> | |
| 
 | |
|                      <Form.Item label='' name="password" rules={[{ required: true, message: '请输入密码' },]}> | |
|                         <Input.Password prefix={<> | |
|                            <LockOutlined style={{ marginLeft: 20, color: 'white', fontSize: 18 }} /> | |
|                            <span style={{ color: 'white' }}>密码</span> | |
|                            <span style={{ color: 'white', marginRight: 10, height: 18, borderRight: '1px solid white' }}></span> | |
|                         </>} style={{ width: 380, margin: '6px 0' }} placeholder="" /> | |
|                      </Form.Item> | |
| 
 | |
| 
 | |
|                      <Form.Item | |
|                      > | |
|                         <Button type="primary" htmlType="submit" style={{ width: 300, height: 50, marginRight: 6, fontSize: 18, border: 0, background: 'url(/assets/images/login/button-b.png)', backgroundSize: '100% 100%', backgroundPosition: 'center', }}> | |
|                            立即登录 | |
|                         </Button> | |
|                      </Form.Item> | |
|                   </Form> | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|                </div> | |
| 
 | |
|             </div> | |
| 
 | |
| 
 | |
| 
 | |
|          </div> | |
|       </div > | |
|    ); | |
| } | |
| 
 | |
| function mapStateToProps(state) { | |
|    const { auth, global } = state; | |
|    return { | |
|       user: auth.user, | |
|       error: auth.error, | |
|       isRequesting: auth.isRequesting, | |
|    } | |
| } | |
| 
 | |
| export default connect(mapStateToProps)(Login); | |
| 
 | |
| function getUrlParams(url) { | |
|    if (!url) return; | |
|    let arr = url.split('?'); | |
|    let params = arr[1].split('&'); | |
|    let obj = {}; | |
|    for (let i = 0; i < params.length; i++) { | |
|       let param = params[i].split('='); | |
|       obj[param[0]] = param[1]; | |
|    } | |
|    return obj; | |
| } |