Login_20250812100637.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // entrypoints/popup/pages/Login.tsx
  2. import React, { useState } from 'react';
  3. import { useNavigate } from 'react-router-dom';
  4. import { Button, Input, Message } from '@alifd/next';
  5. export default function Login({ setIsLoggedIn }: { setIsLoggedIn: (loggedIn: boolean) => void }) {
  6. const [username, setUsername] = useState('');
  7. const [password, setPassword] = useState('');
  8. const [code, setCode] = useState('');
  9. const [loading, setLoading] = useState(false);
  10. const [errors, setErrors] = useState<{ username?: string, password?: string, code?: string }>({});
  11. const navigate = useNavigate();
  12. const validateForm = () => {
  13. const newErrors: { username?: string, password?: string, code?: string } = {};
  14. if (!username.trim()) {
  15. newErrors.username = '请输入用户名';
  16. }
  17. if (!password) {
  18. newErrors.password = '请输入密码';
  19. } else if (password.length < 6) {
  20. newErrors.password = '密码长度至少为6位';
  21. }
  22. if (!code) {
  23. newErrors.code = '请输入验证码';
  24. }
  25. setErrors(newErrors);
  26. return Object.keys(newErrors).length === 0;
  27. };
  28. const evVerify = () => {
  29. // 验证码刷新逻辑
  30. console.log('刷新验证码');
  31. };
  32. const handleLogin = (e: React.FormEvent) => {
  33. e.preventDefault();
  34. if (!validateForm()) {
  35. return;
  36. }
  37. setLoading(true);
  38. // 模拟登录请求
  39. setTimeout(() => {
  40. // 这里添加实际的登录逻辑
  41. if (username && password && code) {
  42. // 模拟登录成功
  43. localStorage.setItem('isLoggedIn', 'true');
  44. setIsLoggedIn(true);
  45. // 跳转到首页
  46. navigate('/');
  47. Message.success('登录成功');
  48. } else {
  49. Message.error('登录失败,请检查输入信息');
  50. }
  51. setLoading(false);
  52. }, 1000);
  53. };
  54. return (
  55. <div className="bg-gray-50 p-4">
  56. <div className="text-center mb-6">
  57. <h1 className="text-2xl font-bold text-gray-800">系统登录</h1>
  58. <p className="text-gray-500 mt-2">请输入您的账号和密码</p>
  59. </div>
  60. <form onSubmit={handleLogin}>
  61. <div className="mb-4">
  62. <label className="block text-gray-700 text-sm font-bold mb-2">用户名 *</label>
  63. <Input
  64. placeholder="请输入用户名"
  65. value={username}
  66. onChange={(value) => {
  67. setUsername(value);
  68. if (errors.username) {
  69. setErrors({ ...errors, username: undefined });
  70. }
  71. }}
  72. disabled={loading}
  73. state={errors.username ? 'error' : undefined}
  74. />
  75. {errors.username && <div className="text-red-500 text-xs mt-1">{errors.username}</div>}
  76. </div>
  77. <div className="mb-4">
  78. <label className="block text-gray-700 text-sm font-bold mb-2">密码 *</label>
  79. <Input
  80. htmlType="password"
  81. placeholder="请输入密码"
  82. value={password}
  83. onChange={(value) => {
  84. setPassword(value);
  85. if (errors.password) {
  86. setErrors({ ...errors, password: undefined });
  87. }
  88. }}
  89. disabled={loading}
  90. state={errors.password ? 'error' : undefined}
  91. />
  92. {errors.password && <div className="text-red-500 text-xs mt-1">{errors.password}</div>}
  93. </div>
  94. <div className="mb-6">
  95. <label className="block text-gray-700 text-sm font-bold mb-2">验证码 *</label>
  96. <Input
  97. placeholder="请输入验证码"
  98. value={code}
  99. onChange={(value) => {
  100. setCode(value);
  101. if (errors.code) {
  102. setErrors({ ...errors, code: undefined });
  103. }
  104. }}
  105. disabled={loading}
  106. state={errors.code ? 'error' : undefined}
  107. addonTextAfter={
  108. <img
  109. src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzAiIGhlaWdodD0iMzgiIHZpZXdCb3g9IjAgMCA3MCAzOCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjcwIiBoZWlnaHQ9IjM4IiBmaWxsPSIjRjBGMEYwIi8+Cjx0ZXh0IHg9IjM1IiB5PSIyMyIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDAwIj5DNERMOEw8L3RleHQ+Cjwvc3ZnPgo="
  110. style={{ width: 70, height: 38, cursor: 'pointer' }}
  111. onClick={evVerify}
  112. alt="验证码"
  113. />
  114. }
  115. />
  116. {errors.code && <div className="text-red-500 text-xs mt-1">{errors.code}</div>}
  117. </div>
  118. <div className="mb-4">
  119. <Button
  120. type="primary"
  121. htmlType="submit"
  122. loading={loading}
  123. className="w-full"
  124. >
  125. {loading ? '登录中...' : '登录'}
  126. </Button>
  127. </div>
  128. </form>
  129. <div className="mt-4 text-center text-sm text-gray-500">
  130. <p>忘记密码?请联系管理员</p>
  131. </div>
  132. </div>
  133. );
  134. }