添加测试配置及登陆部分的测试

Change-Id: I6fa1fe23ad8773548927fdc921dceab841f2368a
diff --git a/src/views/login/login.tsx b/src/views/login/login.tsx
new file mode 100644
index 0000000..26b7842
--- /dev/null
+++ b/src/views/login/login.tsx
@@ -0,0 +1,61 @@
+import React, { useEffect } from 'react';
+import { useApi } from '@/hooks/request';
+import request from '@/utils/request';
+import { postUserLogin} from '@/api/auth';
+import { useAppDispatch } from '@/hooks/store';
+import { RootState } from '@/store';
+import style from './login.module.css';
+import { useState } from 'react';
+import { useSelector } from 'react-redux';
+import { useNavigate } from 'react-router';
+import logo from '&/asserts/logo.png';
+import { getUserInfo } from '@/api/user';
+
+
+const Login: React.FC = () => {
+    const [email, setEmail] = useState('');
+    const [password, setPassword] = useState('');
+    const dispatch = useAppDispatch();
+    const { refresh: postUserLoginRefresh } = useApi(() => request.post(postUserLogin, {}), false);
+    const { refresh: getUserInfoRefresh } = useApi(async () => await request.get(getUserInfo), false);
+
+    const nav = useNavigate();
+    const handleLogin = async () => {
+        try {
+            const res = await postUserLoginRefresh();
+            if (res==null ||(res as any).error) {
+                alert('Login failed. Please check your credentials.');
+                return;
+            }
+            dispatch({ type: "user/login", payload: res });
+            
+            const userInfo = await getUserInfoRefresh();
+            if (userInfo==null || (userInfo as any).error) {
+                alert('Failed to fetch user information.');
+                return;
+            }
+            dispatch({ type: "user/getUserInfo", payload: userInfo });
+            nav('/');
+        } catch (error) {
+            alert('An unexpected error occurred. Please try again later.');
+            if (error instanceof Error) {
+              console.error(error.message); // 明确访问 message 属性
+            } else {
+              console.error('Unknown error occurred');
+            }
+        }
+    };
+
+    return (
+        <div className={style.form}>
+            <img className={style.logo} src={logo} alt="logo"></img>
+            <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} className={style.email} placeholder="Enter your email" />
+            <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} className={style.password} placeholder="Enter your password" />
+            <button className={style.submit} onClick={handleLogin}>登录</button>
+            <button className={style.register}>注册</button>
+            <button className={style.forget}> 忘记密码</button>
+        </div>
+    );
+};
+
+export default Login;
\ No newline at end of file