此指令用于在修改移动端答题卡组件前提供完整的上下文信息,包括组件结构、关键功能、依赖关系和潜在风险点。
src/client/mobile/components/Exam/
├── ExamCard.tsx # 答题卡主组件
├── ExamAdmin.tsx # 答题卡管理组件
├── ExamIndex.tsx # 答题卡入口页面
├── types.ts # 类型定义
└── hooks/
└── useSocketClient.ts # Socket连接Hook
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<AnswerRecord[]>([]); // 答题记录
const [totalProfitRate, setTotalProfitRate] = useState(0); // 累计收益率
exam:question - 新问题推送exam:cleaned - 训练重置exam:settle - 结算处理answerManagement.storeAnswer() 提交答案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';
classroomDataClient - 教室数据查询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]);
// 计算累计收益率(单日涨幅相加)
const totalRate = answers.reduce((sum, answer) => sum + (answer.profitPercent || 0), 0);
setTotalProfitRate(totalRate);
max-w-2xl, grid grid-cols-6