ExamIndex.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React, { useState, useCallback } from 'react';
  2. import { useNavigate } from "react-router";
  3. import type { ClassroomData } from '../../../share/types_stock.ts';
  4. import dayjs from 'dayjs';
  5. import { message } from 'antd';
  6. import { ClassroomDataAPI } from '../../api/classroom_data.ts';
  7. import { ClassroomStatus } from '../../../share/types_stock.ts';
  8. // 教室号输入页面
  9. function ExamIndex() {
  10. const [classroom, setClassroom] = useState('');
  11. const navigate = useNavigate();
  12. const [classroomData, setClassroomData] = useState<ClassroomData | null>(null);
  13. const [isLoading, setIsLoading] = useState(false);
  14. const handleJoinTraining = useCallback(async () => {
  15. if (!classroom) {
  16. message.error('教室号不能为空');
  17. return;
  18. }
  19. try {
  20. setIsLoading(true);
  21. const response = await ClassroomDataAPI.getClassroomDatas({ classroom_no: classroom });
  22. if (!response.data?.length) {
  23. message.error('教室不存在');
  24. setClassroomData(null);
  25. return;
  26. }
  27. const data = response.data[0];
  28. setClassroomData(data);
  29. if (data.status !== ClassroomStatus.OPEN) {
  30. message.error('该教室已关闭');
  31. return;
  32. }
  33. // 将教室号作为参数传递到答题页
  34. navigate(`/mobile/exam/card?classroom=${classroom}`);
  35. } catch (error) {
  36. message.error('获取教室数据失败');
  37. setClassroomData(null);
  38. } finally {
  39. setIsLoading(false);
  40. }
  41. }, [navigate, classroom]);
  42. if (isLoading) {
  43. return <div className="flex items-center justify-center min-h-screen">加载中...</div>;
  44. }
  45. return (
  46. <div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
  47. <div className="w-full max-w-md space-y-8">
  48. <div className="text-center">
  49. <h2 className="text-3xl font-bold text-gray-900">股票训练答题卡系统</h2>
  50. <p className="mt-2 text-gray-600">
  51. {classroom ? `教室号: ${classroom}` : '请输入教室号开始答题'}
  52. </p>
  53. {classroomData && (
  54. <div className="mt-2 text-sm text-gray-500">
  55. <p>训练日期: {dayjs(classroomData.training_date).format('YYYY-MM-DD')}</p>
  56. <p>代码: {classroomData.code}</p>
  57. </div>
  58. )}
  59. </div>
  60. <div className="mt-8 space-y-4">
  61. <input
  62. type="text"
  63. value={classroom}
  64. onChange={(e) => setClassroom(e.target.value)}
  65. placeholder="请输入教室号"
  66. className="w-full px-4 py-3 text-lg border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
  67. />
  68. </div>
  69. <button
  70. onClick={handleJoinTraining}
  71. className="w-full px-8 py-3 text-lg font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors"
  72. >
  73. 开始答题
  74. </button>
  75. </div>
  76. </div>
  77. );
  78. }
  79. export default ExamIndex;