123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- import {
- LockOutlined,
- MobileOutlined,
- UserOutlined,
- } from '@ant-design/icons';
- import {
- LoginForm,
- ProFormCaptcha,
- ProFormText,
- } from '@ant-design/pro-components';
- import { FormattedMessage, history, useIntl, useModel, Helmet } from '@umijs/max';
- import { Alert, message, Tabs } from 'antd';
- import Settings from '../../../../config/defaultSettings';
- import React, { useState } from 'react';
- import { flushSync } from 'react-dom';
- import { createStyles } from 'antd-style';
- import { useAjax } from '@/Hook/useAjax';
- import { getPCode, loginByPCode, loginByPwd } from '@/services/login';
- const useStyles = createStyles(({ token }) => {
- return {
- action: {
- marginLeft: '8px',
- color: 'rgba(0, 0, 0, 0.2)',
- fontSize: '24px',
- verticalAlign: 'middle',
- cursor: 'pointer',
- transition: 'color 0.3s',
- '&:hover': {
- color: token.colorPrimaryActive,
- },
- },
- lang: {
- width: 42,
- height: 42,
- lineHeight: '42px',
- position: 'fixed',
- right: 16,
- borderRadius: token.borderRadius,
- ':hover': {
- backgroundColor: token.colorBgTextHover,
- },
- },
- container: {
- display: 'flex',
- flexDirection: 'column',
- height: '100vh',
- overflow: 'auto',
- backgroundImage:
- "url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr')",
- backgroundSize: '100% 100%',
- },
- };
- });
- const LoginMessage: React.FC<{
- content: string;
- }> = ({ content }) => {
- return (
- <Alert
- style={{
- marginBottom: 24,
- }}
- message={content}
- type="error"
- showIcon
- />
- );
- };
- const Login: React.FC = () => {
- const [userLoginState, setUserLoginState] = useState<any>({});
- const [type, setType] = useState<string>('account');
- const { initialState, setInitialState } = useModel('@@initialState');
- const { styles } = useStyles();
- const intl = useIntl();
- const loginByPwdFn = useAjax((data) => loginByPwd(data))//账号密码登录
- const loginByPCodeFn = useAjax((data) => loginByPCode(data))//手机登录
- const fetchUserInfo = async (data: any) => {
- // const userInfo = await initialState?.fetchUserInfo?.();
- if (data) {
- flushSync(() => {
- setInitialState((s) => ({
- ...s,
- currentUser: data.userInfo,
- token: data.token,
- menuType: 'distributor'
- }));
- });
- }
- };
- const handleSubmit = async (values: any) => {
- try {
- // 登录
- console.log(type, values)
- const urlParams = new URL(window.location.href).searchParams;
- let api = type === 'account' ? loginByPwdFn : loginByPCodeFn;
- let newValues = type === 'account' ? values : { phoneNum: values.mobile, code: values.captcha }
- api.run(newValues).then(async res => {
- if (res.data) {
- console.log(res.data.userInfo)
- await fetchUserInfo({ userInfo: res.data.userInfo, token: res.data.token });
- console.log(res.data.token)
- localStorage.setItem("Token", res.data.token)
- localStorage.setItem("manageAccount",res.data.userInfo.manageAccount)
- // 管理员跳转
- if(res.data.userInfo?.manageAccount){
- history.push(urlParams.get('redirect') || '/');
- }else{//非管理员跳转
- history.push('/distributor/appList')
- }
- }
- })
- return
- } catch (error) {
- const defaultLoginFailureMessage = intl.formatMessage({
- id: 'pages.login.failure',
- defaultMessage: '登录失败,请重试!',
- });
- console.log(error);
- message.error(defaultLoginFailureMessage);
- }
- };
- const { status, type: loginType } = userLoginState;
- return (
- <div className={styles.container}>
- <Helmet>
- <title>
- {intl.formatMessage({
- id: 'menu.login',
- defaultMessage: '登录页',
- })}
- - {Settings.title}
- </title>
- </Helmet>
- <div
- style={{
- flex: '1',
- padding: '32px 0',
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center'
- }}
- >
- <div style={{ height: 'auto', overflow: 'hidden', marginTop: '-10%' }}>
- <LoginForm
- contentStyle={{
- minWidth: 280,
- maxWidth: '75vw',
- }}
- // logo={<img alt="logo" src="/logo.svg" />}
- title="分销商平台"
- // subTitle={intl.formatMessage({ id: 'pages.layouts.userLayout.title' })}
- // actions={[
- // <FormattedMessage
- // key="loginWith"
- // id="pages.login.loginWith"
- // defaultMessage="其他登录方式"
- // />,
- // <ActionIcons key="icons" />,
- // ]}
- loading={loginByPwdFn?.loading || loginByPCodeFn?.loading}
- onFinish={async (values) => {
- await handleSubmit(values as any);
- }}
- >
- <Tabs
- activeKey={type}
- onChange={setType}
- centered
- items={[
- {
- key: 'account',
- label: intl.formatMessage({
- id: 'pages.login.accountLogin.tab',
- defaultMessage: '账户密码登录',
- }),
- },
- {
- key: 'mobile',
- label: intl.formatMessage({
- id: 'pages.login.phoneLogin.tab',
- defaultMessage: '手机号登录',
- }),
- },
- ]}
- />
- {status === 'error' && loginType === 'account' && (
- <LoginMessage
- content={intl.formatMessage({
- id: 'pages.login.accountLogin.errorMessage',
- defaultMessage: '账户或密码错误(admin/ant.design)',
- })}
- />
- )}
- {type === 'account' && (
- <>
- <ProFormText
- name="username"
- fieldProps={{
- size: 'large',
- prefix: <UserOutlined />,
- }}
- placeholder={intl.formatMessage({
- id: 'pages.login.username.placeholder',
- defaultMessage: '用户名: admin or user',
- })}
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.login.username.required"
- defaultMessage="请输入用户名!"
- />
- ),
- },
- ]}
- />
- <ProFormText.Password
- name="password"
- fieldProps={{
- size: 'large',
- prefix: <LockOutlined />,
- }}
- placeholder={intl.formatMessage({
- id: 'pages.login.password.placeholder',
- defaultMessage: '密码: ant.design',
- })}
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.login.password.required"
- defaultMessage="请输入密码!"
- />
- ),
- },
- ]}
- />
- </>
- )}
- {status === 'error' && loginType === 'mobile' && <LoginMessage content="验证码错误" />}
- {type === 'mobile' && (
- <>
- <ProFormText
- fieldProps={{
- size: 'large',
- prefix: <MobileOutlined />,
- }}
- name="mobile"
- placeholder={intl.formatMessage({
- id: 'pages.login.phoneNumber.placeholder',
- defaultMessage: '手机号',
- })}
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.login.phoneNumber.required"
- defaultMessage="请输入手机号!"
- />
- ),
- },
- {
- pattern: /^1\d{10}$/,
- message: (
- <FormattedMessage
- id="pages.login.phoneNumber.invalid"
- defaultMessage="手机号格式错误!"
- />
- ),
- },
- ]}
- />
- <ProFormCaptcha
- fieldProps={{
- size: 'large',
- prefix: <LockOutlined />,
- }}
- phoneName='mobile'
- captchaProps={{
- size: 'large',
- }}
- placeholder={intl.formatMessage({
- id: 'pages.login.captcha.placeholder',
- defaultMessage: '请输入验证码',
- })}
- captchaTextRender={(timing, count) => {
- if (timing) {
- return `${count} ${intl.formatMessage({
- id: 'pages.getCaptchaSecondText',
- defaultMessage: '获取验证码',
- })}`;
- }
- return intl.formatMessage({
- id: 'pages.login.phoneLogin.getVerificationCode',
- defaultMessage: '获取验证码',
- });
- }}
- name="captcha"
- rules={[
- {
- required: true,
- message: (
- <FormattedMessage
- id="pages.login.captcha.required"
- defaultMessage="请输入验证码!"
- />
- ),
- },
- ]}
- onGetCaptcha={async (mobile) => {
- const result = await getPCode(mobile);
- if (!result) {
- return;
- }
- message.success('获取验证码成功!请查看手机短信!');
- }}
- />
- </>
- )}
- </LoginForm>
- </div>
- </div>
- </div>
- );
- };
- export default Login;
|