瀏覽代碼

点击解盘室时,当前用户是 admin 的 ,跳到 /mobile/classroom?role=admin
否则跳到 /mobile/classroom?role=student

yourname 6 月之前
父節點
當前提交
7596e76fa8
共有 4 個文件被更改,包括 29 次插入16 次删除
  1. 1 0
      client/mobile/hooks.tsx
  2. 4 4
      client/mobile/pages_login.tsx
  3. 23 11
      client/mobile/pages_stock_home.tsx
  4. 1 1
      client/share/types.ts

+ 1 - 0
client/mobile/hooks.tsx

@@ -77,6 +77,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
       // 设置请求头
       axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
       
+      return user;
     } catch (error) {
       console.error('登录失败:', error);
       throw error;

+ 4 - 4
client/mobile/pages_login.tsx

@@ -40,16 +40,16 @@ const LoginPage: React.FC = () => {
       });
       
       const { latitude, longitude } = position.coords;
-      await login(username, password, latitude, longitude);
-      navigate('/');
+      const user = await login(username, password, latitude, longitude);
+      navigate(user.role === 'admin' ? '/' : '/mobile/classroom');
     } catch (err) {
       // 如果获取位置失败,仍然允许登录但不带位置信息
       const error = err instanceof Error ? err : new Error(String(err));
       if (error.message.includes('获取位置失败')) {
         console.warn('获取位置失败:', err);
         try {
-          await login(username, password);
-          navigate('/');
+          const user = await login(username, password);
+          navigate(user.role === 'admin' ? '/' : '/mobile/classroom');
         } catch (loginErr) {
           setError(handleApiError(loginErr));
         }

+ 23 - 11
client/mobile/pages_stock_home.tsx

@@ -1,31 +1,43 @@
 import React from "react";
-import { Link } from "react-router";
+import { useNavigate } from "react-router";
+import { useAuth } from "./hooks.tsx";
 
 export default function StockHomePage() {
+  const { user } = useAuth();
+  const navigate = useNavigate();
+
+  const handleClassroomClick = () => {
+    if (user?.role === 'admin') {
+      navigate('/mobile/classroom?role=admin');
+    } else {
+      navigate('/mobile/classroom?role=student');
+    }
+  };
+
   return (
     <div className="min-h-screen bg-gray-50 p-4 md:p-8">
       <h1 className="text-3xl font-bold text-center text-gray-800 mb-8 md:mb-12">
         股票训练系统
       </h1>
       <div className="flex flex-col gap-4 max-w-md mx-auto">
-        <Link
-          to="/mobile/classroom"
+        <button
+          onClick={handleClassroomClick}
           className="bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-6 rounded-lg shadow-md transition-colors duration-200 text-center"
         >
-          课堂训练
-        </Link>
-        <Link
-          to="/mobile/exam"
+          解盘室
+        </button>
+        <button
+          onClick={() => navigate('/mobile/exam')}
           className="bg-green-600 hover:bg-green-700 text-white font-medium py-3 px-6 rounded-lg shadow-md transition-colors duration-200 text-center"
         >
           考试模式
-        </Link>
-        <Link
-          to="/mobile/xunlian"
+        </button>
+        <button
+          onClick={() => navigate('/mobile/xunlian')}
           className="bg-purple-600 hover:bg-purple-700 text-white font-medium py-3 px-6 rounded-lg shadow-md transition-colors duration-200 text-center"
         >
           训练模式
-        </Link>
+        </button>
       </div>
     </div>
   );

+ 1 - 1
client/share/types.ts

@@ -52,7 +52,7 @@ export interface MenuItem {
 export interface AuthContextType {
   user: User | null;
   token: string | null;
-  login: (username: string, password: string, latitude?: number, longitude?: number) => Promise<void>;
+  login: (username: string, password: string, latitude?: number, longitude?: number) => Promise<User>;
   logout: () => Promise<void>;
   isAuthenticated: boolean;
   isLoading: boolean;