2025年3月20日18:18:38

master
qmstyle 2025-03-20 18:18:45 +08:00
parent 87bd0dca14
commit eeebf4bcb1
5 changed files with 194 additions and 19 deletions

View File

@ -1,11 +1,9 @@
package com.zhangmeng.online.exam.ui.admin;
import com.zhangmeng.online.exam.ui.components.ExamComponent;
import com.zhangmeng.online.exam.ui.components.ShortAnswerComponent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.stage.Window;
@ -104,7 +102,8 @@ public class LoginPage extends AnchorPane {
window.close();
Stage stage = new Stage();
IndexPage shortAnswerComponent = new IndexPage();
// IndexPage shortAnswerComponent = new IndexPage();
ExamComponent shortAnswerComponent = new ExamComponent();
scene = new Scene(shortAnswerComponent, 1280, 720);
stage.setScene(scene);
stage.setTitle("在线考试系统");

View File

@ -114,6 +114,10 @@ public class ApiUtils {
return tableView.getSelectionModel().getSelectedItem();
}
public static void submitAnswer(Map<String, Object> context) {
System.out.println(context);
}
public static class DataView {
private List<String> keys;

View File

@ -0,0 +1,13 @@
package com.zhangmeng.online.exam.ui.api.model;
/**
* @author zm
* @date 2025/3/20 16:31
* @version: 1.0
*/
public class ExamDataLoad {
}

View File

@ -0,0 +1,86 @@
package com.zhangmeng.online.exam.ui.components;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.WritableValue;
import javafx.css.StyleableProperty;
import javafx.scene.AccessibleRole;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.VBox;
import java.util.*;
/**
*
*
*
* @author zm
* @date 2025/3/20 16:29
* @version: 1.0
*/
public class ExamComponent extends ScrollPane {
private VBox vBox;
public ExamComponent() {
this.vBox = new VBox(5);
Map<String, Object> params = new HashMap<>();
params.put("pageNum", ApiUtils.PAGE_NUM);
params.put("pageSize", ApiUtils.PAGE_SIZE);
params.put("id", 1);
String userListData = HttpUtils.GET(ApiUtils.API_URL + "/paper/chooseQuestion/list", params);
JSONObject jsonObject = JSON.parseObject(userListData);
JSONArray data = jsonObject.getJSONArray("data");
int total = jsonObject.getIntValue("total");
int index = 1;
for (Object datum : data) {
JSONObject question = (JSONObject) datum;
String type = question.getString("type");
switch (type) {
case "单选题" -> {
String list = question.getString("options");
List<Map> maps = JSONArray.parseArray(list, Map.class);
String correctAnswer = null;
List<Map<String,Object>> optionList = new ArrayList<>();
for (Map map : maps) {
boolean isAnswer = (boolean) map.get("isAnswer");
Map<String,Object> option = new HashMap<>();
option.put("id", map.get("id"));
option.put("text",map.get("name").toString()+ map.get("content").toString());
option.put("isAnswer",isAnswer);
optionList.add(option);
}
SingleChoiceComponent singleChoiceComponent = new SingleChoiceComponent(index + "." + question.getString("name"), optionList);
singleChoiceComponent.setCorrectAnswer(correctAnswer);
Map<String,Object> context = new HashMap<>();
context.put("question_id", question.getString("id"));
context.put("paper_id",1);
singleChoiceComponent.setContext(context);
this.vBox.getChildren().add(singleChoiceComponent);
index ++;
}
// case "多选题" -> MULTIPLE_CHOICE_SCORE.set(MULTIPLE_CHOICE_SCORE.get() + score);
// case "判断题" -> JUDGMENT_SCORE.set(JUDGMENT_SCORE.get() + score);
// case "计算题" -> NUMERICAL_SCORE.set(NUMERICAL_SCORE.get() + score);
// case "填空题" -> Fill_IN_THE_BLANKS.set(Fill_IN_THE_BLANKS.get() + score);
// case "简答题" -> SHORT_ANSWER_SCORE.set(SHORT_ANSWER_SCORE.get() + score);
// default -> throw new IllegalStateException("Unexpected value: " + type.get());
}
}
this.setContent(vBox);
this.setFitToWidth(true);
this.setFitToHeight(true);
}
}

View File

@ -1,5 +1,7 @@
package com.zhangmeng.online.exam.ui.components;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
@ -7,17 +9,18 @@ import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.VBox;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* .radio-button {
* -fx-font-size: 14px;
* -fx-text-fill: #333;
* -fx-font-size: 14px;
* -fx-text-fill: #333;
* }
* .correct { -fx-text-fill: green; }
* .wrong { -fx-text-fill: red; }
*
* <p>
*
*
* @author zm
@ -26,16 +29,30 @@ import java.util.List;
*/
public class SingleChoiceComponent extends VBox {
private final String correctAnswer = "B"; // 预设正确答案
private Map<String,Object> context = new HashMap<>();
public SingleChoiceComponent(String question, List<String> options) {
public Map<String, Object> getContext() {
return context;
}
public void setContext(Map<String, Object> context) {
this.context = context;
}
private String correctAnswer = null; // 预设正确答案
private int number_of_responses = 0;//作答次数
private final SimpleStringProperty result_answer = new SimpleStringProperty(); // 最终答案
public SingleChoiceComponent(String question, List<Map<String, Object>> options) {
// 创建题目组件
Label questionLabel = new Label(question);
this.getChildren().add(questionLabel);
ToggleGroup answerGroup = new ToggleGroup(); // 单选按钮组‌:ml-citation{ref="1,2" data="citationList"}
// 创建选项按钮
for (String option : options) {
for (Map<String, Object> option : options) {
RadioButton optionBtn = createRadioButton(option, answerGroup);
this.getChildren().add(optionBtn);
}
@ -45,11 +62,59 @@ public class SingleChoiceComponent extends VBox {
Label resultLabel = new Label();
// 设置提交事件
submitBtn.setOnAction(e -> {
RadioButton selected = (RadioButton) answerGroup.getSelectedToggle();
// submitBtn.setOnAction(e -> {
// RadioButton selected = (RadioButton) answerGroup.getSelectedToggle();
// if (number_of_responses == 0){
// if (selected != null) {
// String answer = selected.getText().substring(0,1);
// resultLabel.setText(answer.equals(correctAnswer) ? "✅ 回答正确" : "❌ 正确答案:" + correctAnswer);
//
// if (answer.equals(correctAnswer)){
// resultLabel.setStyle("-fx-text-fill: #2ecc71;");
// }else{
// resultLabel.setStyle("-fx-text-fill: #e74c3c;");
// }
// number_of_responses++;
// } else {
// resultLabel.setText("⚠ 请先选择答案");
// }
// }else {
// resultLabel.setText("⚠ 请勿重复提交");
// }
// });
// answerGroup.selectedToggleProperty().addListener((ov, old_value, new_value) -> {
// RadioButton selected = (RadioButton) new_value;
// if (number_of_responses == 0){
// if (selected != null) {
// String answer = selected.getText().substring(0,1);
// resultLabel.setText(answer.equals(correctAnswer) ? "✅ 回答正确" : "❌ 正确答案:" + correctAnswer);
//
// if (answer.equals(correctAnswer)){
// resultLabel.setStyle("-fx-text-fill: #2ecc71;");
// }else{
// resultLabel.setStyle("-fx-text-fill: #e74c3c;");
// }
// number_of_responses++;
// } else {
// resultLabel.setText("⚠ 请先选择答案");
// }
// }
// });
answerGroup.selectedToggleProperty().addListener((ov, old_value, new_value) -> {
RadioButton selected = (RadioButton) new_value;
if (selected != null) {
String answer = selected.getText().substring(0,1);
resultLabel.setText(answer.equals(correctAnswer) ? "✅ 回答正确" : "❌ 正确答案:" + correctAnswer);
String answer = selected.getText().substring(0, 1);
result_answer.set(answer);
number_of_responses++;
// resultLabel.setText("你的选择:"+ result_answer.get());
// resultLabel.setStyle("-fx-text-fill: #2ecc71;");
String id = (String) selected.getUserData();
context.put("option_id", id);
//提交数据
ApiUtils.submitAnswer(context, result_answer.get());
} else {
resultLabel.setText("⚠ 请先选择答案");
}
@ -58,15 +123,23 @@ public class SingleChoiceComponent extends VBox {
// 布局容器
this.setSpacing(10);
this.setPadding(new Insets(15));
this.getChildren().addAll( submitBtn, resultLabel);
this.getChildren().addAll(resultLabel);
}
// 封装单选按钮创建方法‌:ml-citation{ref="2,3" data="citationList"}
private RadioButton createRadioButton(String text, ToggleGroup group) {
RadioButton rb = new RadioButton(text);
private RadioButton createRadioButton(Map<String, Object> option, ToggleGroup group) {
RadioButton rb = new RadioButton(option.get("text").toString());
rb.setToggleGroup(group);
rb.setPadding(new Insets(5));
rb.setUserData(option.get("id"));
return rb;
}
public String getCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(String correctAnswer) {
this.correctAnswer = correctAnswer;
}
}