Login_20250812102619.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // entrypoints/popup/pages/Login.tsx
  2. import React, { useState } from 'react';
  3. import { useNavigate } from 'react-router-dom';
  4. import { Button, Input, Message, Form } 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 [loading, setLoading] = useState(false);
  9. const [errors, setErrors] = useState<{ username?: string, password?: string }>({});
  10. const navigate = useNavigate();
  11. const validateForm = () => {
  12. const newErrors: { username?: string, password?: string } = {};
  13. if (!username.trim()) {
  14. newErrors.username = '请输入用户名';
  15. }
  16. if (!password) {
  17. newErrors.password = '请输入密码';
  18. } else if (password.length < 6) {
  19. newErrors.password = '密码长度至少为6位';
  20. }
  21. setErrors(newErrors);
  22. return Object.keys(newErrors).length === 0;
  23. };
  24. const evVerify = () => {
  25. console.log('username')
  26. fetch('//user.landwu.com/api/user/verify', {
  27. method: 'POST',
  28. headers: {
  29. 'Content-Type': 'application/json',
  30. },
  31. // body: JSON.stringify({
  32. // username,
  33. // password,
  34. // code
  35. // }),
  36. }).then(resjson => {
  37. if (!resjson.ok) {
  38. throw new Error('登录失败');
  39. }
  40. return resjson.json(); // 正确解析 Response 为 JSON 数据
  41. }).then(res => {
  42. console.log(res,"yyyyyyyy");
  43. const { data = {} } = res;
  44. const { data: info = {} } = data;
  45. const { key = "", img = "" } = info;
  46. })
  47. }
  48. const handleLogin = async (e: React.FormEvent) => {
  49. e.preventDefault();
  50. if (!validateForm()) {
  51. return;
  52. }
  53. setLoading(true);
  54. try {
  55. // 发送登录请求
  56. const response = await fetch('/api/login', {
  57. method: 'POST',
  58. headers: {
  59. 'Content-Type': 'application/json',
  60. },
  61. body: JSON.stringify({
  62. username,
  63. password,
  64. code
  65. }),
  66. });
  67. const data = await response.json();
  68. if (response.ok && data.success) {
  69. // 登录成功
  70. localStorage.setItem('isLoggedIn', 'true');
  71. // 如果后端返回token,也可以存储token
  72. // localStorage.setItem('token', data.token);
  73. setIsLoggedIn(true);
  74. navigate('/');
  75. Message.success('登录成功');
  76. } else {
  77. // 登录失败
  78. Message.error(data.message || '登录失败,请检查用户名和密码');
  79. }
  80. } catch (error) {
  81. console.error('登录请求失败:', error);
  82. Message.error('网络错误,请稍后重试');
  83. } finally {
  84. setLoading(false);
  85. }
  86. // 模拟登录请求
  87. // setTimeout(() => {
  88. // // 这里添加实际的登录逻辑
  89. // if (username && password) {
  90. // // 模拟登录成功
  91. // localStorage.setItem('isLoggedIn', 'true');
  92. // setIsLoggedIn(true);
  93. // // 跳转到首页
  94. // navigate('/');
  95. // Message.success('登录成功');
  96. // } else {
  97. // Message.error('登录失败,请检查用户名和密码');
  98. // }
  99. // setLoading(false);
  100. // }, 1000);
  101. };
  102. return (
  103. <div className="bg-gray-50 p-4">
  104. <div className="text-center mb-6">
  105. <h1 className="text-2xl font-bold text-gray-800">登录</h1>
  106. </div>
  107. <Form onSubmit={handleLogin}>
  108. <Form.Item
  109. label="用户名"
  110. required
  111. help={errors.username}
  112. validateState={errors.username ? 'error' : undefined}
  113. >
  114. <Input
  115. placeholder="请输入用户名"
  116. value={username}
  117. onChange={(value) => {
  118. setUsername(value);
  119. if (errors.username) {
  120. setErrors({ ...errors, username: undefined });
  121. }
  122. }}
  123. disabled={loading}
  124. />
  125. </Form.Item>
  126. <Form.Item
  127. label="密码"
  128. required
  129. help={errors.password}
  130. validateState={errors.password ? 'error' : undefined}
  131. >
  132. <Input
  133. htmlType="password"
  134. placeholder="请输入密码"
  135. value={password}
  136. onChange={(value) => {
  137. setPassword(value);
  138. if (errors.password) {
  139. setErrors({ ...errors, password: undefined });
  140. }
  141. }}
  142. disabled={loading}
  143. />
  144. </Form.Item>
  145. <Form.Item
  146. label="验证码"
  147. name="code"
  148. required
  149. >
  150. <Input
  151. size="large"
  152. addonAfter={
  153. <img
  154. src={""}
  155. style={{ width: 70, height: 38 }}
  156. onClick={evVerify}
  157. />
  158. }
  159. autoComplete="off"
  160. />
  161. </Form.Item>
  162. <Form.Item>
  163. <Button
  164. type="primary"
  165. htmlType="submit"
  166. loading={loading}
  167. className="w-full"
  168. >
  169. {loading ? '登录中...' : '登录'}
  170. </Button>
  171. </Form.Item>
  172. </Form>
  173. <div className="mt-4 text-center text-sm text-gray-500">
  174. <p>忘记密码?请联系管理员</p>
  175. </div>
  176. </div>
  177. );
  178. }