--- description: "移动端答题卡组件检查指令" --- 此指令用于在修改移动端答题卡组件前提供完整的上下文信息,包括组件结构、关键功能、依赖关系和潜在风险点。 ## 组件概述 ### 1. 核心文件结构 ``` src/client/mobile/components/Exam/ ├── ExamCard.tsx # 答题卡主组件 ├── ExamAdmin.tsx # 答题卡管理组件 ├── ExamIndex.tsx # 答题卡入口页面 ├── types.ts # 类型定义 └── hooks/ └── useSocketClient.ts # Socket连接Hook ``` ### 2. 主要功能特性 #### ExamCard.tsx 核心功能: - **用户答题界面**:A/B选项选择(持股/持币) - **实时数据同步**:通过Socket.io连接服务器 - **收益计算**:自动计算累计收益率 - **历史记录显示**:展示用户答题历史 - **状态管理**:训练开始/结束状态控制 #### 关键状态变量: ```typescript const [currentDate, setCurrentDate] = useState(''); // 当前训练日期 const [currentPrice, setCurrentPrice] = useState('0'); // 当前价格 const [holdingStock, setHoldingStock] = useState('0'); // 持股状态 const [holdingCash, setHoldingCash] = useState('0'); // 持币状态 const [isStarted, setIsStarted] = useState(false); // 训练开始状态 const [answerRecords, setAnswerRecords] = useState([]); // 答题记录 const [totalProfitRate, setTotalProfitRate] = useState(0); // 累计收益率 ``` ### 3. Socket事件处理 #### 监听的事件: - `exam:question` - 新问题推送 - `exam:cleaned` - 训练重置 - `exam:settle` - 结算处理 #### 发送的事件: - 通过 `answerManagement.storeAnswer()` 提交答案 - 通过 Socket 连接状态管理 ### 4. 依赖关系检查 #### 前端依赖: ```typescript import React, { useState, useCallback, useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { useSearchParams, useNavigate } from "react-router"; import dayjs from 'dayjs'; import { useSocketClient } from './hooks/useSocketClient'; import { classroomDataClient } from '@/client/api'; import { useAuth } from '@/client/mobile/hooks/AuthProvider'; import { ClassroomStatus } from '@/server/modules/classroom/classroom-data.schema'; import { toast } from 'react-toastify'; ``` #### API客户端: - `classroomDataClient` - 教室数据查询 - Socket客户端 - 实时通信 ### 5. 关键业务逻辑 #### 答案提交逻辑: ```typescript const handleChooseA = useCallback(async () => { setHoldingStock('1'); setHoldingCash('0'); if (classroom && user?.username && currentDate) { const answer = { date: currentDate, holdingStock: '1', holdingCash: '0', userId: user.id, username: user.username, price: currentPrice }; await answerManagement.storeAnswer(...); } }, [classroom, user, currentDate, currentPrice, answerManagement]); ``` #### 收益计算: ```typescript // 计算累计收益率(单日涨幅相加) const totalRate = answers.reduce((sum, answer) => sum + (answer.profitPercent || 0), 0); setTotalProfitRate(totalRate); ``` ### 6. UI组件结构 #### 主要UI区块: 1. **连接状态提示** - Socket连接状态显示 2. **选择按钮区域** - A/B选项按钮 3. **信息显示区域** - 用户信息和累计收益 4. **历史记录表格** - 答题历史记录展示 #### 样式类名: - 使用Tailwind CSS类名 - 响应式设计:`max-w-2xl`, `grid grid-cols-6` - 状态颜色:红色(持股)、绿色(持币) ### 7. 潜在修改风险点 #### 高风险区域: 1. **Socket事件处理** - 修改可能影响实时通信 2. **状态管理** - 多个useState需要保持同步 3. **收益计算逻辑** - 影响用户收益显示 #### 中等风险区域: 1. **UI布局** - 修改可能影响移动端显示 2. **API调用** - 教室数据获取逻辑 #### 低风险区域: 1. **样式调整** - 颜色、间距等视觉修改 2. **文本内容** - 提示信息修改