Explorar o código

改ExamCard.tsx添加房间管理逻辑

yourname hai 6 meses
pai
achega
d854c4aa4c

+ 1 - 0
client/admin/pages_classroom_data.tsx

@@ -426,6 +426,7 @@ export const ClassroomDataPage = () => {
               <Form.Item
                 name="code"
                 label="代码"
+                rules={[{ required: true, message: '请输入代码' }]}
               >
                 <Input placeholder="请输入代码" />
               </Form.Item>

+ 12 - 1
client/mobile/components/Exam/ExamCard.tsx

@@ -19,7 +19,7 @@ export default function ExamCard() {
   const classroom = searchParams.get('classroom');
   const nickname = searchParams.get('nickname');
   const {
-    socketRoom,
+    socketRoom: { joinRoom, leaveRoom },
     answerManagement,
     currentQuestion,
     lastMessage,
@@ -58,6 +58,17 @@ export default function ExamCard() {
     }
   }, [classroom, nickname, classroomData]);
 
+  // 加入/离开房间
+  useEffect(() => {
+    if (!classroom) return;
+    
+    joinRoom(classroom);
+    
+    return () => {
+      leaveRoom(classroom);
+    };
+  }, [classroom, joinRoom, leaveRoom]);
+
   // 处理房间消息
   useEffect(() => {
     if (!lastMessage?.message) return;

+ 2 - 2
client/mobile/components/Exam/hooks/useSocketClient.ts

@@ -153,8 +153,8 @@ export function useSocketClient(roomId: string | null) {
   useEffect(() => {
     if (!client || !roomId) return;
 
-    const handleQuestionUpdate = async () => {
-      const question = await getCurrentQuestion(client, roomId, getAnswers);
+    const handleQuestionUpdate = (question:QuizState ) => {
+      // const question = await getCurrentQuestion(client, roomId, getAnswers);
       setCurrentQuestion(question);
     };
 

+ 3 - 3
server/routes_classroom_data.ts

@@ -82,9 +82,9 @@ export function createClassroomDataRoutes(withAuth: WithAuth) {
       const body = await c.req.json()
       
       // 验证必填字段
-      const { classroom_no, training_date, status } = body
-      if (!classroom_no || !training_date || !status) {
-        return c.json({ error: '教室号、训练日期和状态为必填项' }, 400)
+      const { classroom_no, training_date, status, code } = body
+      if (!classroom_no || !training_date || !status || !code) {
+        return c.json({ error: '教室号、股票代码、训练日期和状态为必填项' }, 400)
       }
 
       // 创建课堂数据

+ 13 - 8
server/routes_io_exam.ts

@@ -1,5 +1,5 @@
 import { Variables } from './router_io.ts';
-import type { QuizContent, Answer } from '../client/mobile/components/Exam/types.ts';
+import type { QuizContent, QuizState, Answer } from '../client/mobile/components/Exam/types.ts';
 
 interface ExamRoomData {
   roomId: string;
@@ -143,13 +143,18 @@ export function setupExamEvents({ socket, apiClient }: Variables) {
       // TODO: 需要Redis服务端配置自动过期或通过其他方式实现TTL
 
       // 广播题目到房间
-      socket.to(roomId).emit('exam:question', {
-        roomId,
-        question: {
-          ...question,
-          timestamp: new Date().toISOString()
-        }
-      });
+      // socket.to(roomId).emit('exam:question', {
+      //   roomId,
+      //   question: {
+      //     ...question,
+      //     timestamp: new Date().toISOString()
+      //   }
+      // });
+      const quizState:QuizState = {
+        date: question.date, 
+        price: question.price
+      }
+      socket.to(roomId).emit('exam:question', quizState);
 
       console.log(`用户 ${user.username} 在房间 ${roomId} 推送题目`);
     } catch (error) {