index.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import { LockOutlined, UserOutlined } from '@ant-design/icons'
  2. import { Alert, message, Tabs } from 'antd'
  3. import React, { useState } from 'react'
  4. import ProForm, { ProFormCheckbox, ProFormText } from '@ant-design/pro-form'
  5. import { useIntl, Link, history, FormattedMessage, SelectLang, useModel, useRequest } from 'umi'
  6. import { login } from '@/services/api/login'
  7. import { currentAccount as querycurrentAccount } from '@/services/api/login'
  8. import consts from '@/utils/consts'
  9. import styles from './index.less'
  10. const LoginMessage: React.FC<{
  11. content: string
  12. }> = ({ content }) => (
  13. <Alert
  14. style={{
  15. marginBottom: 24
  16. }}
  17. message={content}
  18. type="error"
  19. showIcon
  20. />
  21. )
  22. /** 此方法会跳转到 redirect 参数所在的位置 */
  23. const goto = () => {
  24. if (!history) return
  25. setTimeout(() => {
  26. const { query } = history.location
  27. const { redirect } = query as { redirect: string }
  28. history.push(redirect || '/')
  29. }, 10)
  30. }
  31. const Login: React.FC = () => {
  32. const { setAuthToken } = useModel('user')
  33. const [userLoginState, setUserLoginState] = useState<API.LoginResult>({})
  34. const [type, setType] = useState<string>('account')
  35. const { initialState, setInitialState } = useModel('@@initialState')
  36. const { run, loading } = useRequest(querycurrentAccount, {
  37. manual: true,
  38. onSuccess: async result => {
  39. setInitialState({
  40. ...initialState,
  41. currentUser: result.currentAccount
  42. })
  43. goto()
  44. }
  45. })
  46. const intl = useIntl()
  47. // const fetchUserInfo = async () => {
  48. // const userInfo = await initialState?.fetchUserInfo?.()
  49. // if (userInfo) {
  50. // await setInitialState(s => ({
  51. // ...s,
  52. // currentUser: userInfo
  53. // }))
  54. // }
  55. // }
  56. const { run: tryLogin } = useRequest((values: API.LoginParams) => login(values), {
  57. manual: true,
  58. onSuccess: async result => {
  59. setAuthToken(result?.token)
  60. message.success('登录成功')
  61. await run()
  62. // await fetchUserInfo()
  63. },
  64. onError: () => {
  65. setUserLoginState({ ...userLoginState, code: -1 })
  66. }
  67. })
  68. const handleSubmit = async (values: API.LoginParams) => {
  69. try {
  70. await tryLogin(values)
  71. } catch (error) {
  72. message.error('登录失败,请重试')
  73. }
  74. // try {
  75. // // 登录
  76. // const msg = await login({ ...values, type })
  77. // if (msg.status === 'ok') {
  78. // const defaultLoginSuccessMessage = intl.formatMessage({
  79. // id: 'pages.login.success',
  80. // defaultMessage: '登录成功!'
  81. // })
  82. // message.success(defaultLoginSuccessMessage)
  83. // await fetchUserInfo()
  84. // /** 此方法会跳转到 redirect 参数所在的位置 */
  85. // if (!history) return
  86. // const { query } = history.location
  87. // const { redirect } = query as { redirect: string }
  88. // history.push(redirect || '/')
  89. // return
  90. // }
  91. // console.log(msg)
  92. // // 如果失败去设置用户错误信息
  93. // setUserLoginState(msg)
  94. // } catch (error) {
  95. // const defaultLoginFailureMessage = intl.formatMessage({
  96. // id: 'pages.login.failure',
  97. // defaultMessage: '登录失败,请重试!'
  98. // })
  99. // message.error(defaultLoginFailureMessage)
  100. // }
  101. }
  102. const { code } = userLoginState
  103. return (
  104. <div className={styles.container}>
  105. <div className={styles.lang} data-lang>
  106. {SelectLang && <SelectLang />}
  107. </div>
  108. <div className={styles.content}>
  109. <div className={styles.top}>
  110. <div className={styles.header}>
  111. <Link to="/" className="flex justify-center">
  112. <img alt="logo" className={styles.logo} src="/logo.svg" />
  113. <span className={styles.title}>投资项目云平台</span>
  114. </Link>
  115. </div>
  116. <div className={styles.desc}>
  117. {intl.formatMessage({ id: 'pages.layouts.userLayout.title' })}
  118. </div>
  119. </div>
  120. <div className={styles.main}>
  121. <ProForm
  122. initialValues={{
  123. autoLogin: true
  124. }}
  125. submitter={{
  126. searchConfig: {
  127. submitText: intl.formatMessage({
  128. id: 'pages.login.submit',
  129. defaultMessage: '登录'
  130. })
  131. },
  132. render: (_, dom) => dom.pop(),
  133. submitButtonProps: {
  134. loading,
  135. size: 'large',
  136. style: {
  137. width: '100%'
  138. }
  139. }
  140. }}
  141. onFinish={async values => {
  142. handleSubmit(values as API.LoginParams)
  143. }}>
  144. <Tabs activeKey={type} onChange={setType}>
  145. <Tabs.TabPane
  146. key="account"
  147. tab={intl.formatMessage({
  148. id: 'pages.login.accountLogin.tab',
  149. defaultMessage: '账户密码登录'
  150. })}
  151. />
  152. </Tabs>
  153. {code === consts.RET_CODE.ERROR && <LoginMessage content={'账户或密码错误'} />}
  154. {type === 'account' && (
  155. <>
  156. <ProFormText
  157. name="account"
  158. fieldProps={{
  159. size: 'large',
  160. prefix: <UserOutlined className={styles.prefixIcon} />
  161. }}
  162. placeholder={intl.formatMessage({
  163. id: 'pages.login.username.placeholder',
  164. defaultMessage: '请输入用户名'
  165. })}
  166. rules={[
  167. {
  168. required: true,
  169. message: (
  170. <FormattedMessage
  171. id="pages.login.username.required"
  172. defaultMessage="请输入用户名!"
  173. />
  174. )
  175. }
  176. ]}
  177. />
  178. <ProFormText.Password
  179. name="password"
  180. fieldProps={{
  181. size: 'large',
  182. prefix: <LockOutlined className={styles.prefixIcon} />
  183. }}
  184. placeholder={intl.formatMessage({
  185. id: 'pages.login.password.placeholder',
  186. defaultMessage: '请输入密码!'
  187. })}
  188. rules={[
  189. {
  190. required: true,
  191. message: (
  192. <FormattedMessage
  193. id="pages.login.password.required"
  194. defaultMessage="请输入密码!"
  195. />
  196. )
  197. }
  198. ]}
  199. />
  200. </>
  201. )}
  202. {/* {status === 'error' && loginType === 'mobile' && <LoginMessage content="验证码错误" />} */}
  203. <div
  204. style={{
  205. marginBottom: 24
  206. }}>
  207. <ProFormCheckbox noStyle name="autoLogin">
  208. <FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" />
  209. </ProFormCheckbox>
  210. <a
  211. style={{
  212. float: 'right'
  213. }}>
  214. <FormattedMessage id="pages.login.forgotPassword" defaultMessage="忘记密码" />
  215. </a>
  216. </div>
  217. </ProForm>
  218. </div>
  219. </div>
  220. </div>
  221. )
  222. }
  223. export default Login