index.jsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import { LockOutlined, UserOutlined } from '@ant-design/icons'
  2. import { Alert, message, notification, 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 } from 'umi'
  6. import styles from './index.less'
  7. import { apiLogin } from '@/services/login'
  8. import { setAuthCache } from '@/utils/auth'
  9. import { TOKEN_KEY } from '@/utils/cache/cacheEnum'
  10. import { DEFAULT_CACHE_TIME } from '@/settings/encryptionSetting'
  11. const LoginMessage = ({ content }) => (
  12. <Alert
  13. style={{
  14. marginBottom: 24
  15. }}
  16. message={content}
  17. type="error"
  18. showIcon
  19. />
  20. )
  21. const Login = () => {
  22. const [submitting, setSubmitting] = useState(false)
  23. const [userLoginState, setUserLoginState] = useState({})
  24. const [type, setType] = useState('account')
  25. const { initialState, setInitialState } = useModel('@@initialState')
  26. const intl = useIntl()
  27. const fetchUserInfo = async () => {
  28. const userInfo = await initialState?.fetchUserInfo?.()
  29. const permData = await initialState?.fetchPermData?.()
  30. if (userInfo) {
  31. setInitialState({ ...initialState, ...userInfo, permData })
  32. // const { username, staffId: id, wsToken: token } = userInfo?.currentUser
  33. // ws.init(`ws://cld2qa.com/summon/v1/chat/link?username=${username}&id=${id}&token=${token}`, {
  34. // onMessage
  35. // })
  36. }
  37. return userInfo
  38. }
  39. /** 此方法会跳转到 redirect 参数所在的位置 */
  40. const goto = username => {
  41. if (!history) return
  42. setTimeout(() => {
  43. const { query } = history.location
  44. const { redirect } = query
  45. history.push(redirect || '/')
  46. return notification.success({
  47. message: intl.formatMessage({ id: 'pages.login.success.title' }),
  48. description: redirect && `${intl.formatMessage({ id: 'pages.login.success.desc' })}: ${username}`,
  49. duration: 3
  50. })
  51. }, 10)
  52. }
  53. const handleSubmit = async values => {
  54. setSubmitting(true)
  55. try {
  56. // 登录
  57. const res = await apiLogin({ ...values })
  58. if (res.code === 0) {
  59. setAuthCache(TOKEN_KEY, res.data.token, DEFAULT_CACHE_TIME)
  60. // const defaultLoginSuccessMessage = intl.formatMessage({
  61. // id: 'pages.login.success',
  62. // defaultMessage: '登录成功!'
  63. // })
  64. // message.success(defaultLoginSuccessMessage)
  65. const userinfo = await fetchUserInfo()
  66. /** 此方法会跳转到 redirect 参数所在的位置 */
  67. return goto(userinfo?.currentUser?.username)
  68. }
  69. // 如果失败去设置用户错误信息
  70. setUserLoginState(res.msg)
  71. } catch (error) {
  72. const defaultLoginFailureMessage = intl.formatMessage({
  73. id: 'pages.login.failure',
  74. defaultMessage: '登录失败,请重试!'
  75. })
  76. return message.error(defaultLoginFailureMessage)
  77. }
  78. return setSubmitting(false)
  79. }
  80. const { status, type: loginType } = userLoginState
  81. return (
  82. <div className={styles.container}>
  83. <div className={styles.lang} data-lang>
  84. {SelectLang && <SelectLang />}
  85. </div>
  86. <div className={styles.content}>
  87. <div className={styles.top}>
  88. <div className={styles.header}>
  89. <img alt="logo" className={styles.logo} src="/logo.svg" />
  90. <span className={styles.title}>CLD.V2</span>
  91. </div>
  92. <div className={styles.desc}>{intl.formatMessage({ id: 'pages.layouts.userLayout.title' })}</div>
  93. </div>
  94. <div className={styles.main}>
  95. <ProForm
  96. initialValues={{
  97. autoLogin: true
  98. }}
  99. isKeyPressSubmit
  100. submitter={{
  101. searchConfig: {
  102. submitText: intl.formatMessage({
  103. id: 'pages.login.submit',
  104. defaultMessage: '登录'
  105. })
  106. },
  107. render: (_, dom) => dom.pop(),
  108. submitButtonProps: {
  109. loading: submitting,
  110. size: 'large',
  111. style: {
  112. width: '100%'
  113. }
  114. }
  115. }}
  116. onFinish={async values => {
  117. handleSubmit(values)
  118. }}
  119. >
  120. <Tabs activeKey={type} onChange={setType}>
  121. <Tabs.TabPane
  122. key="account"
  123. tab={intl.formatMessage({
  124. id: 'pages.login.accountLogin.tab',
  125. defaultMessage: '账户密码登录'
  126. })}
  127. />
  128. {/* <Tabs.TabPane
  129. key="mobile"
  130. tab={intl.formatMessage({
  131. id: 'pages.login.phoneLogin.tab',
  132. defaultMessage: '手机号登录',
  133. })}
  134. /> */}
  135. </Tabs>
  136. {status === 'error' && loginType === 'account' && (
  137. <LoginMessage
  138. content={intl.formatMessage({
  139. id: 'pages.login.accountLogin.errorMessage',
  140. defaultMessage: '账户或密码错误'
  141. })}
  142. />
  143. )}
  144. {type === 'account' && (
  145. <>
  146. <ProFormText
  147. name="username"
  148. fieldProps={{
  149. size: 'large',
  150. prefix: <UserOutlined className={styles.prefixIcon} />
  151. }}
  152. placeholder="用户名"
  153. rules={[
  154. {
  155. required: true,
  156. message: (
  157. <FormattedMessage id="pages.login.username.required" defaultMessage="请输入用户名!" />
  158. )
  159. }
  160. ]}
  161. />
  162. <ProFormText.Password
  163. name="password"
  164. fieldProps={{
  165. size: 'large',
  166. prefix: <LockOutlined className={styles.prefixIcon} />
  167. }}
  168. placeholder="密码"
  169. rules={[
  170. {
  171. required: true,
  172. message: (
  173. <FormattedMessage id="pages.login.password.required" defaultMessage="请输入密码!" />
  174. )
  175. }
  176. ]}
  177. />
  178. </>
  179. )}
  180. <div
  181. style={{
  182. marginBottom: 24
  183. }}
  184. >
  185. <ProFormCheckbox noStyle name="autoLogin">
  186. <FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" />
  187. </ProFormCheckbox>
  188. <a
  189. style={{
  190. float: 'right'
  191. }}
  192. >
  193. <FormattedMessage id="pages.login.forgotPassword" defaultMessage="忘记密码" />
  194. </a>
  195. </div>
  196. </ProForm>
  197. </div>
  198. </div>
  199. </div>
  200. )
  201. }
  202. export default Login