diff --git a/App.js b/App.js
new file mode 100644
index 0000000..81e357b
--- /dev/null
+++ b/App.js
@@ -0,0 +1,141 @@
+import React, { useState } from 'react';
+import './App.css'; // 确保你有样式文件
+
+// 学生列表组件
+const StudentList = ({ students }) => (
+
+ {students.map((student, index) => (
+ -
+ {student.name} - 积分: {student.points}
+
+ ))}
+
+);
+
+// 随机选择组件
+const RandomSelector = ({ students, onSelect }) => {
+ const selectRandomStudent = () => {
+ if (students.length === 0) return;
+
+ // 根据积分降低被选中概率
+ const totalPoints = students.reduce((acc, student) => acc + Math.max(student.points, 0), 0);
+ const weightedStudents = students.flatMap(student => Array(Math.max(1, 10 - student.points)).fill(student));
+ const randomIndex = Math.floor(Math.random() * weightedStudents.length);
+ const selectedStudent = weightedStudents[randomIndex];
+
+ if (typeof onSelect === 'function') {
+ onSelect(selectedStudent);
+ }
+ };
+
+ return (
+
+
+
+ );
+};
+
+// 主应用组件
+const App = () => {
+ const [students, setStudents] = useState([]);
+ const [isCalling, setIsCalling] = useState(false);
+ const [selectedStudent, setSelectedStudent] = useState(null);
+ const [question, setQuestion] = useState('');
+ const [answer, setAnswer] = useState('');
+
+ const handleFileUpload = (event) => {
+ const file = event.target.files[0];
+ const reader = new FileReader();
+
+ reader.onload = (e) => {
+ const text = e.target.result;
+ try {
+ const importedStudents = JSON.parse(text);
+ if (Array.isArray(importedStudents) && importedStudents.every(student => student.name)) {
+ const studentsWithPoints = importedStudents.map(student => ({ ...student, points: 0 }));
+ setStudents(studentsWithPoints);
+ } else {
+ alert("导入的文件格式不正确,请提供一个包含学生对象数组的 JSON 文件,每个对象应有 'name' 属性。");
+ }
+ } catch (error) {
+ alert("文件解析出错,请确保它是有效的 JSON 文件。");
+ }
+ };
+
+ reader.readAsText(file);
+ };
+
+ const handleStartCalling = () => {
+ setIsCalling(true);
+ };
+
+ const handleStudentSelect = (student) => {
+ setSelectedStudent(student);
+ const updatedStudents = students.map(s =>
+ s.name === student.name ? { ...s, points: s.points + 1 } : s
+ );
+ setStudents(updatedStudents);
+ };
+
+ const handleAnswerSubmission = () => {
+ if (!selectedStudent) return;
+
+ const correctRepeat = answer.trim() === question.trim();
+ let pointChange = 0;
+
+ if (correctRepeat) {
+ pointChange += 0.5; // 准确重复问题
+ } else {
+ pointChange -= 1; // 未准确重复问题
+ }
+
+ // 假设根据情况准确回答问题,加分 (这里可以扩展逻辑)
+ const correctAnswer = true; // 这里假设答案是正确的
+ if (correctAnswer) {
+ pointChange += 2; // 根据情况加分
+ }
+
+ const updatedStudents = students.map(s =>
+ s.name === selectedStudent.name ? { ...s, points: s.points + pointChange } : s
+ );
+
+ setStudents(updatedStudents);
+ setSelectedStudent(null);
+ setQuestion('');
+ setAnswer('');
+ };
+
+ return (
+
+ );
+};
+
+export default App;