index.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { Button, Form, Input, message } from 'antd';
  2. import { login } from '../../api/user';
  3. import './index.scss';
  4. import { UserOutlined, KeyOutlined } from '@ant-design/icons';
  5. import { useDispatch } from 'react-redux';
  6. import { setUser } from '../../store/slice/user';
  7. import { useNavigate, useSearchParams } from 'react-router-dom';
  8. const onLogin = async (user, { dispatch, navigate }, to = '/') => {
  9. let {
  10. data: { code, msg, data },
  11. } = await login(user);
  12. if (code == 0) {
  13. message.success(msg);
  14. //! 存token
  15. localStorage.setItem('token', data.token);
  16. //! redux存储用户信息
  17. dispatch(setUser(data.user));
  18. //! 跳转页面:如果有查询参数r 就 到r的地址,否则 去主页
  19. navigate(to);
  20. return;
  21. }
  22. message.error(msg);
  23. };
  24. function Login() {
  25. const dispatch = useDispatch();
  26. const navigate = useNavigate();
  27. const [searchParams] = useSearchParams();
  28. const to = searchParams.get('r') ? searchParams.get('r') : undefined;
  29. function onFinish(values) {
  30. onLogin(values, { dispatch, navigate }, to);
  31. }
  32. return (
  33. <div className="login_container">
  34. <div className="login">
  35. <h3>登入系统</h3>
  36. <Form
  37. name="basic"
  38. labelCol={{
  39. span: 6,
  40. }}
  41. wrapperCol={{
  42. span: 16,
  43. }}
  44. style={{
  45. maxWidth: 500,
  46. }}
  47. onFinish={onFinish}
  48. autoComplete="off"
  49. >
  50. <Form.Item
  51. label="账号:"
  52. name="username"
  53. rules={[
  54. {
  55. required: true,
  56. message: '请输入账号...',
  57. },
  58. ]}
  59. >
  60. <Input prefix={<UserOutlined />} placeholder="账号..." allowClear />
  61. </Form.Item>
  62. <Form.Item
  63. label="密码:"
  64. name="password"
  65. rules={[
  66. {
  67. required: true,
  68. message: '请输入密码...',
  69. },
  70. ]}
  71. >
  72. <Input.Password
  73. prefix={<KeyOutlined />}
  74. placeholder="密码..."
  75. allowClear
  76. />
  77. </Form.Item>
  78. <Form.Item
  79. wrapperCol={{
  80. offset: 4,
  81. span: 18,
  82. }}
  83. >
  84. <Button type="primary" htmlType="submit" block>
  85. 登录
  86. </Button>
  87. </Form.Item>
  88. <Form.Item
  89. wrapperCol={{
  90. offset: 4,
  91. span: 18,
  92. }}
  93. >
  94. <Button type="link" block>
  95. 注册
  96. </Button>
  97. </Form.Item>
  98. </Form>
  99. </div>
  100. </div>
  101. );
  102. }
  103. export default Login;