Login.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import React, { useState } from 'react';
  2. import {
  3. Form,
  4. Input,
  5. Button,
  6. Card,
  7. App,
  8. } from 'antd';
  9. import {
  10. UserOutlined,
  11. } from '@ant-design/icons';
  12. import { useNavigate } from 'react-router';
  13. import {
  14. useAuth,
  15. } from '../hooks/AuthProvider';
  16. // 登录页面
  17. export const LoginPage = () => {
  18. const { message } = App.useApp();
  19. const { login } = useAuth();
  20. const [form] = Form.useForm();
  21. const [loading, setLoading] = useState(false);
  22. const navigate = useNavigate();
  23. const handleSubmit = async (values: { username: string; password: string }) => {
  24. try {
  25. setLoading(true);
  26. // 获取地理位置
  27. let latitude: number | undefined;
  28. let longitude: number | undefined;
  29. try {
  30. if (navigator.geolocation) {
  31. const position = await new Promise<GeolocationPosition>((resolve, reject) => {
  32. navigator.geolocation.getCurrentPosition(resolve, reject);
  33. });
  34. latitude = position.coords.latitude;
  35. longitude = position.coords.longitude;
  36. }
  37. } catch (geoError) {
  38. console.warn('获取地理位置失败:', geoError);
  39. }
  40. await login(values.username, values.password, latitude, longitude);
  41. // 登录成功后跳转到管理后台首页
  42. navigate('/member/dashboard');
  43. } catch (error: any) {
  44. message.error(error instanceof Error ? error.message : '登录失败');
  45. } finally {
  46. setLoading(false);
  47. }
  48. };
  49. return (
  50. <div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
  51. <div className="max-w-md w-full space-y-8">
  52. <div>
  53. <h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900">
  54. 登录管理后台
  55. </h2>
  56. </div>
  57. <Card>
  58. <Form
  59. form={form}
  60. name="login"
  61. onFinish={handleSubmit}
  62. autoComplete="off"
  63. layout="vertical"
  64. >
  65. <Form.Item
  66. name="username"
  67. rules={[{ required: true, message: '请输入用户名' }]}
  68. >
  69. <Input
  70. prefix={<UserOutlined />}
  71. placeholder="用户名"
  72. size="large"
  73. />
  74. </Form.Item>
  75. <Form.Item
  76. name="password"
  77. rules={[{ required: true, message: '请输入密码' }]}
  78. >
  79. <Input.Password
  80. placeholder="密码"
  81. size="large"
  82. />
  83. </Form.Item>
  84. <Form.Item>
  85. <Button
  86. type="primary"
  87. htmlType="submit"
  88. size="large"
  89. block
  90. loading={loading}
  91. >
  92. 登录
  93. </Button>
  94. </Form.Item>
  95. </Form>
  96. <div className="mt-4 text-center text-gray-500">
  97. <p>测试账号: admin / admin123</p>
  98. {/* <p>普通账号: user1 / 123456</p> */}
  99. </div>
  100. </Card>
  101. </div>
  102. </div>
  103. );
  104. };