2022-03-10 14:24:13 +08:00
|
|
|
|
import { Alert, Col, Form, Input, Row, Image, message } from 'antd';
|
|
|
|
|
import React, { useEffect, useState } from 'react';
|
|
|
|
|
import { connect, Dispatch, history } from 'umi';
|
|
|
|
|
import { refreshTokenApi, ZjfakeAccountLogin, getPassword } from '@/services/login';
|
|
|
|
|
import LoginForm from './components/Login';
|
|
|
|
|
import styles from './style.less';
|
|
|
|
|
import { ConnectState } from '@/models/connect';
|
|
|
|
|
import logo from '../../../assets/logo.svg';
|
|
|
|
|
import cookie from 'react-cookies';
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
|
|
|
|
|
const { Tab, UserName, Password, Submit } = LoginForm;
|
|
|
|
|
|
|
|
|
|
interface LoginProps {
|
|
|
|
|
dispatch: Dispatch;
|
|
|
|
|
submitting?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const LoginMessage: React.FC<{
|
|
|
|
|
content: string;
|
|
|
|
|
}> = ({ content }) => (
|
|
|
|
|
<Alert
|
|
|
|
|
style={{
|
|
|
|
|
marginBottom: 24,
|
|
|
|
|
}}
|
|
|
|
|
message={content}
|
|
|
|
|
type="error"
|
|
|
|
|
showIcon
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const Login: React.FC<LoginProps> = (props) => {
|
|
|
|
|
const { userLogin = {}, submitting } = props;
|
|
|
|
|
const { status, type: loginType } = userLogin;
|
|
|
|
|
const [type, setType] = useState<string>('account');
|
|
|
|
|
const [dis, disSet] = useState<boolean>(false);
|
|
|
|
|
const [imgUrl, setImgUrl] = useState<any>('');
|
|
|
|
|
const [tmpToken, setTmpToken] = useState<any>('');
|
|
|
|
|
const remainingTime = 3 //刷新token的剩余时间,单位小时
|
|
|
|
|
|
|
|
|
|
const genRandomString = (len: number) => {
|
|
|
|
|
const text = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
|
|
|
const rdmIndex = (text: string | any[]) => (Math.random() * text.length) | 0;
|
|
|
|
|
let rdmString = '';
|
|
|
|
|
for (; rdmString.length < len; rdmString += text.charAt(rdmIndex(text)));
|
|
|
|
|
return rdmString;
|
|
|
|
|
};
|
|
|
|
|
const changeCaptcha = () => {
|
|
|
|
|
let tmpToken = genRandomString(16);
|
|
|
|
|
let url = '/api/auth/captcha?token=' + tmpToken;
|
|
|
|
|
setTmpToken(tmpToken);
|
|
|
|
|
setImgUrl(url);
|
|
|
|
|
};
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
cookie.remove('mall3_token');
|
|
|
|
|
sessionStorage.clear();
|
|
|
|
|
changeCaptcha();
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
//登录刷新Token方法
|
|
|
|
|
const refreshToken = async (data: any) => {
|
|
|
|
|
const params = {
|
|
|
|
|
grant_type: "refresh_token",
|
|
|
|
|
refresh_token: data?.refreshToken?.value,
|
|
|
|
|
client_id: REACT_APP_CLIENT_KEY,
|
|
|
|
|
client_secret: REACT_APP_CLIENT_SECRET,
|
|
|
|
|
}
|
|
|
|
|
const header = {
|
|
|
|
|
clientId: REACT_APP_CLIENT_KEY,
|
|
|
|
|
}
|
2022-08-15 09:14:14 +08:00
|
|
|
|
await refreshTokenApi(params, header).then(res => {
|
|
|
|
|
if (res?.success == true) {
|
2022-03-10 14:24:13 +08:00
|
|
|
|
sessionStorage.setItem('Authorization', res?.data?.value);
|
2022-08-15 09:14:14 +08:00
|
|
|
|
// sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value);
|
2022-03-10 14:24:13 +08:00
|
|
|
|
sessionStorage.setItem('scope', res?.data?.scope);
|
|
|
|
|
history.push('/redirect');
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleSubmit = async (values: any) => {
|
2022-08-15 09:14:14 +08:00
|
|
|
|
if (START_ENV == 'sim' || START_ENV == 'PROD') {
|
2022-03-10 14:24:13 +08:00
|
|
|
|
let code = {
|
|
|
|
|
code: values.userCode
|
|
|
|
|
}
|
2022-08-15 09:14:14 +08:00
|
|
|
|
await getPassword({ ...code }).then((res) => {
|
2022-03-10 14:24:13 +08:00
|
|
|
|
if (res?.data) {
|
2022-08-15 09:14:14 +08:00
|
|
|
|
|
2022-03-10 14:24:13 +08:00
|
|
|
|
disSet(true);
|
|
|
|
|
ZjfakeAccountLogin({ ...values, tmpToken }).then((res) => {
|
|
|
|
|
if (res?.success) {
|
2022-08-15 09:14:14 +08:00
|
|
|
|
if (moment(res?.data?.expiration).diff(moment(), 'hours') < remainingTime) {
|
2022-03-10 14:24:13 +08:00
|
|
|
|
refreshToken(res?.data)
|
|
|
|
|
} else {
|
|
|
|
|
sessionStorage.setItem('Authorization', res?.data?.value);
|
2022-08-15 09:14:14 +08:00
|
|
|
|
// sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value);
|
2022-03-10 14:24:13 +08:00
|
|
|
|
sessionStorage.setItem('scope', res?.data?.scope);
|
|
|
|
|
history.push('/redirect');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
changeCaptcha();
|
|
|
|
|
disSet(false);
|
|
|
|
|
});
|
2022-08-15 09:14:14 +08:00
|
|
|
|
|
2022-03-10 14:24:13 +08:00
|
|
|
|
} else {
|
|
|
|
|
message.error('口令不正确,请重新输入')
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
disSet(true);
|
|
|
|
|
await ZjfakeAccountLogin({ ...values, tmpToken }).then((res) => {
|
|
|
|
|
if (res?.success) {
|
2022-08-15 09:14:14 +08:00
|
|
|
|
if (moment(res?.data?.expiration).diff(moment(), 'hours') < remainingTime) {
|
2022-03-10 14:24:13 +08:00
|
|
|
|
refreshToken(res?.data)
|
|
|
|
|
} else {
|
|
|
|
|
sessionStorage.setItem('Authorization', res?.data?.value);
|
2022-08-15 09:14:14 +08:00
|
|
|
|
// sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value);
|
2022-03-10 14:24:13 +08:00
|
|
|
|
sessionStorage.setItem('scope', res?.data?.scope);
|
|
|
|
|
history.push('/redirect');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
changeCaptcha();
|
|
|
|
|
disSet(false);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className={styles.main}>
|
|
|
|
|
<div style={{ textAlign: 'center', fontSize: '18px', fontWeight: 700 }}>
|
|
|
|
|
<img
|
|
|
|
|
src={logo}
|
|
|
|
|
alt=""
|
|
|
|
|
style={{ width: '60px', height: '60px', marginRight: '10px', color: '#b30000' }}
|
|
|
|
|
/>
|
|
|
|
|
专家库登录
|
|
|
|
|
</div>
|
|
|
|
|
<LoginForm activeKey={type} onTabChange={setType} onSubmit={handleSubmit}>
|
|
|
|
|
<Tab key="account" tab="账号密码登录">
|
|
|
|
|
{status === 'error' && loginType === 'account' && !submitting && (
|
|
|
|
|
<LoginMessage content="账号或密码错误" />
|
|
|
|
|
)}
|
|
|
|
|
{
|
2022-08-15 09:14:14 +08:00
|
|
|
|
START_ENV == 'sim' || START_ENV == 'PROD' ?
|
|
|
|
|
<Row>
|
|
|
|
|
<Col span={24}>
|
|
|
|
|
<Form.Item name="userCode" rules={[{ required: true, message: '请输入口令' }]}>
|
|
|
|
|
<Input size='large' placeholder="请输入口令" />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
|
|
|
|
</Row> : null
|
2022-03-10 14:24:13 +08:00
|
|
|
|
}
|
|
|
|
|
<UserName
|
|
|
|
|
name="userName"
|
|
|
|
|
placeholder="请输入账号"
|
|
|
|
|
rules={[
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请输入账号',
|
|
|
|
|
},
|
|
|
|
|
]}
|
|
|
|
|
/>
|
|
|
|
|
<Password
|
|
|
|
|
name="password"
|
|
|
|
|
placeholder="请输入密码"
|
|
|
|
|
rules={[
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请输入密码',
|
|
|
|
|
},
|
|
|
|
|
]}
|
|
|
|
|
/>
|
|
|
|
|
</Tab>
|
|
|
|
|
<Row>
|
|
|
|
|
<Col span={12}>
|
|
|
|
|
<Form.Item name="captcha" rules={[{ required: true, message: '请输入验证码' }]}>
|
|
|
|
|
<Input size='large' placeholder="验证码" />
|
|
|
|
|
</Form.Item>
|
|
|
|
|
</Col>
|
2022-08-15 09:14:14 +08:00
|
|
|
|
<Col span={12} style={{ lineHeight: '33.11px' }}>
|
|
|
|
|
<Image src={imgUrl} preview={false} onClick={() => changeCaptcha()} />
|
2022-03-10 14:24:13 +08:00
|
|
|
|
</Col>
|
|
|
|
|
</Row>
|
|
|
|
|
<Submit loading={submitting} disabled={dis}>
|
|
|
|
|
登录
|
|
|
|
|
</Submit>
|
|
|
|
|
</LoginForm>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default connect(({ login, loading }: ConnectState) => ({
|
|
|
|
|
userLogin: login,
|
|
|
|
|
submitting: loading.effects['login/login'],
|
|
|
|
|
}))(Login);
|