import { Button, Checkbox, Dropdown, Form, Input, Menu, MenuProps } from 'antd'; import { CodeOutlined, DownOutlined, LockOutlined, UserOutlined } from '@ant-design/icons'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useForm } from 'antd/lib/form/Form'; import { AdminServices, StringUtil } from 'matrix-ui-service'; import { commonRules, useServiceStore } from '../../../utils'; export interface LoginFormProps { adminServices: AdminServices; demoUsers?: { name: string; username: string }[]; } /** * 通过kaptchaFree方法检查当前用户名、客户端IP是否需要验证码 * 如果需要,客户端要展示验证码,输入后传给后台 */ export function LoginForm(props: LoginFormProps) { const { adminServices, demoUsers } = props; const { loginService, paramService } = adminServices; const [kaptchaId, setKaptchaId] = useState('none'); const [kaptchaFree, setKaptchaFree] = useState(true); const [form] = useForm(); const loginStore = useServiceStore(loginService); const paramStore = useServiceStore(paramService); //依赖paramStore const isDev = useMemo(() => paramService.getMatrixConfig()?.devLogin, [paramStore]); const { loginInfo } = loginStore; /*检查当前状态是否需要验证码*/ const checkKaptchaFree = useCallback((e: any, noUser?: boolean) => { loginService .kaptchaFree(noUser ? null : form.getFieldValue('username')) .then((res) => !loginInfo.success && setKaptchaFree(res.success)); }, []); //初始进入检查验证码 useEffect(() => { checkKaptchaFree(null, true); }, []); const refreshKaptchaId = useCallback(() => { //生成一个随机码,作为验证码id,从后台获取新的验证码(不是直接作为验证码) setKaptchaId(StringUtil.randomString()); }, []); /** * 升级antd4之后代码调整,之前再提交前再次调用form.validateFields进行验证 */ const handleSubmit = useCallback( (values) => { loginService.login({ ...values, isDev }).then((loginInfo) => { if (!loginInfo.success) { setKaptchaFree(!!loginInfo.kaptchaFree); refreshKaptchaId(); } }); }, [setKaptchaFree, refreshKaptchaId, isDev], ); const demoUserClick = useCallback( ({ key }) => { const item = demoUsers!.find((user) => user.username === key); loginService.loginHash({ ...item, isDev, password: 'none' }); }, [demoUsers, isDev], ); if (loginInfo?.success) return null; const css = { color: 'rgba(0,0,0,.25)' }; return (
} size="large" autoComplete="username" onBlur={checkKaptchaFree} /> } type="password" size="large" autoComplete="password" /> {!kaptchaFree && (
} maxLength={4} size="large" />
)}
自动登录 {isDev && demoUsers && }
); } interface DemoUserDropdownProps { demoUsers: any[]; demoUserClick: MenuProps['onClick']; } const DemoUserDropdown = (props: DemoUserDropdownProps) => { const { demoUsers, demoUserClick } = props; return ( ({ key: user.username, label: `${user.name}(${user.username})` })), }} > ); };