index.jsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import { LockTwoTone, UserOutlined } from '@ant-design/icons'
  2. import { Alert, Tabs } from 'antd'
  3. import React, { useState } from 'react'
  4. import ProForm, { ProFormCheckbox, ProFormText } from '@ant-design/pro-form'
  5. import { connect, useIntl, FormattedMessage } from 'umi'
  6. // import { getFakeCaptcha } from '@/services/login'
  7. import styles from './index.less'
  8. import consts from '@/consts'
  9. const LoginMessage = ({ content }) => (
  10. <Alert
  11. style={{
  12. marginBottom: 24
  13. }}
  14. message={content}
  15. type="error"
  16. showIcon
  17. />
  18. )
  19. const Login = props => {
  20. const { userLogin = {}, submitting } = props
  21. const { status } = userLogin
  22. const [type, setType] = useState('account')
  23. const intl = useIntl()
  24. const handleSubmit = values => {
  25. const { dispatch } = props
  26. dispatch({
  27. type: 'login/login',
  28. payload: { ...values, type }
  29. })
  30. }
  31. return (
  32. <div className={styles.main}>
  33. <ProForm
  34. initialValues={{
  35. autoLogin: true,
  36. username: '蔡频',
  37. password: '123456'
  38. }}
  39. submitter={{
  40. render: (_, dom) => dom.pop(),
  41. submitButtonProps: {
  42. loading: submitting,
  43. size: 'large',
  44. style: {
  45. width: '100%'
  46. }
  47. }
  48. }}
  49. onFinish={async values => {
  50. handleSubmit(values)
  51. return Promise.resolve()
  52. }}>
  53. <Tabs activeKey={type} onChange={setType} className={styles.tabMargin}>
  54. <Tabs.TabPane
  55. key="account"
  56. tab={intl.formatMessage({
  57. id: 'pages.login.accountLogin.tab',
  58. defaultMessage: '账户密码登录'
  59. })}
  60. />
  61. {/* <Tabs.TabPane
  62. key="mobile"
  63. tab={intl.formatMessage({
  64. id: 'pages.login.phoneLogin.tab',
  65. defaultMessage: '手机号登录',
  66. })}
  67. /> */}
  68. </Tabs>
  69. {status && status !== consts.RET_CODE.SUCCESS && !submitting && (
  70. <LoginMessage
  71. content={intl.formatMessage({
  72. id: 'pages.login.accountLogin.errorMessage',
  73. defaultMessage: '账户或密码错误'
  74. })}
  75. />
  76. )}
  77. {type === 'account' && (
  78. <>
  79. <ProFormText
  80. name="username"
  81. fieldProps={{
  82. size: 'large',
  83. prefix: <UserOutlined className={styles.prefixIcon} />
  84. }}
  85. placeholder={intl.formatMessage({
  86. id: 'pages.login.username.placeholder',
  87. defaultMessage: '用户名: admin or user'
  88. })}
  89. rules={[
  90. {
  91. required: true,
  92. message: (
  93. <FormattedMessage
  94. id="pages.login.username.required"
  95. defaultMessage="请输入用户名!"
  96. />
  97. )
  98. }
  99. ]}
  100. />
  101. <ProFormText.Password
  102. name="password"
  103. fieldProps={{
  104. size: 'large',
  105. prefix: <LockTwoTone className={styles.prefixIcon} />
  106. }}
  107. placeholder={intl.formatMessage({
  108. id: 'pages.login.password.placeholder',
  109. defaultMessage: '密码: ant.design'
  110. })}
  111. className="pi-bg-gray"
  112. rules={[
  113. {
  114. required: true,
  115. message: (
  116. <FormattedMessage
  117. id="pages.login.password.required"
  118. defaultMessage="请输入密码!"
  119. />
  120. )
  121. }
  122. ]}
  123. />
  124. </>
  125. )}
  126. {/* {status === 'error' && loginType === 'mobile' && !submitting && (
  127. <LoginMessage content="验证码错误" />
  128. )}
  129. {type === 'mobile' && (
  130. <>
  131. <ProFormText
  132. fieldProps={{
  133. size: 'large',
  134. prefix: <MobileTwoTone className={styles.prefixIcon} />
  135. }}
  136. name="mobile"
  137. placeholder={intl.formatMessage({
  138. id: 'pages.login.phoneNumber.placeholder',
  139. defaultMessage: '手机号'
  140. })}
  141. rules={[
  142. {
  143. required: true,
  144. message: (
  145. <FormattedMessage
  146. id="pages.login.phoneNumber.required"
  147. defaultMessage="请输入手机号!"
  148. />
  149. )
  150. },
  151. {
  152. pattern: /^1\d{10}$/,
  153. message: (
  154. <FormattedMessage
  155. id="pages.login.phoneNumber.invalid"
  156. defaultMessage="手机号格式错误!"
  157. />
  158. )
  159. }
  160. ]}
  161. />
  162. <ProFormCaptcha
  163. fieldProps={{
  164. size: 'large',
  165. prefix: <MailTwoTone className={styles.prefixIcon} />
  166. }}
  167. captchaProps={{
  168. size: 'large'
  169. }}
  170. placeholder={intl.formatMessage({
  171. id: 'pages.login.captcha.placeholder',
  172. defaultMessage: '请输入验证码'
  173. })}
  174. captchaTextRender={(timing, count) =>
  175. timing
  176. ? `${count} ${intl.formatMessage({
  177. id: 'pages.getCaptchaSecondText',
  178. defaultMessage: '获取验证码'
  179. })}`
  180. : intl.formatMessage({
  181. id: 'pages.login.phoneLogin.getVerificationCode',
  182. defaultMessage: '获取验证码'
  183. })
  184. }
  185. name="captcha"
  186. rules={[
  187. {
  188. required: true,
  189. message: (
  190. <FormattedMessage
  191. id="pages.login.captcha.required"
  192. defaultMessage="请输入验证码!"
  193. />
  194. )
  195. }
  196. ]}
  197. onGetCaptcha={async (mobile) => {
  198. const result = await getFakeCaptcha(mobile)
  199. if (result === false) {
  200. return
  201. }
  202. message.success('获取验证码成功!验证码为:1234')
  203. }}
  204. />
  205. </>
  206. )} */}
  207. <div
  208. style={{
  209. marginBottom: 24
  210. }}>
  211. <ProFormCheckbox noStyle name="autoLogin">
  212. <FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" />
  213. </ProFormCheckbox>
  214. <a
  215. style={{
  216. float: 'right'
  217. }}>
  218. <FormattedMessage id="pages.login.forgotPassword" defaultMessage="忘记密码" />
  219. </a>
  220. </div>
  221. </ProForm>
  222. {/* <Space className={styles.other}>
  223. <FormattedMessage id="pages.login.loginWith" defaultMessage="其他登录方式" />
  224. <AlipayCircleOutlined className={styles.icon} />
  225. <TaobaoCircleOutlined className={styles.icon} />
  226. <WeiboCircleOutlined className={styles.icon} />
  227. </Space> */}
  228. </div>
  229. )
  230. }
  231. export default connect(({ login, loading }) => ({
  232. userLogin: login,
  233. submitting: loading.effects['login/login']
  234. }))(Login)