for merge #4
Merged
hnu202326010319
merged 1 commits from LiangJunYaoBranch into develop 4 months ago
@ -1,52 +0,0 @@
|
||||
package com.mathquiz.model;
|
||||
|
||||
/**
|
||||
* 用户类
|
||||
*/
|
||||
|
||||
public class User {
|
||||
private String name;
|
||||
private String email;
|
||||
private String encryptedPwd;
|
||||
private Grade grade;
|
||||
|
||||
public User() {}
|
||||
|
||||
public User(String email, String encryptedPwd) {
|
||||
this.email = email;
|
||||
this.encryptedPwd = encryptedPwd;
|
||||
}
|
||||
|
||||
// Getter & Setter
|
||||
public java.lang.String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(java.lang.String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public java.lang.String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(java.lang.String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public java.lang.String getEncryptedPwd() {
|
||||
return encryptedPwd;
|
||||
}
|
||||
|
||||
public void setEncryptedPwd(java.lang.String encryptedPwd) {
|
||||
this.encryptedPwd = encryptedPwd;
|
||||
}
|
||||
|
||||
public Grade getGrade() {
|
||||
return grade;
|
||||
}
|
||||
|
||||
public void setGrade(Grade grade) {
|
||||
this.grade = grade;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
package com.mathquiz.ui;
|
||||
|
||||
import com.mathquiz.model.User;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.VBox;
|
||||
|
||||
public class LoginPanel extends VBox {
|
||||
|
||||
private final TextField emailField = new TextField();
|
||||
private final PasswordField pwdField = new PasswordField();
|
||||
|
||||
public LoginPanel(MainWindow mainWindow) {
|
||||
setPadding(new Insets(20));
|
||||
setSpacing(10);
|
||||
|
||||
getChildren().addAll(
|
||||
new Label("登录"),
|
||||
new Label("邮箱:"),
|
||||
emailField,
|
||||
new Label("密码:"),
|
||||
pwdField,
|
||||
new Button("登录") {{
|
||||
setOnAction(e -> loginAction(mainWindow));
|
||||
}},
|
||||
new Hyperlink("没有账号?去注册") {{
|
||||
setOnAction(e -> mainWindow.showRegisterPanel());
|
||||
}}
|
||||
);
|
||||
}
|
||||
|
||||
private void loginAction(MainWindow mainWindow) {
|
||||
String email = emailField.getText().trim();
|
||||
String password = pwdField.getText();
|
||||
|
||||
User user = mainWindow.getUserService().login(email, password);
|
||||
if (user != null) {
|
||||
mainWindow.setCurrentUser(user);
|
||||
mainWindow.showGradeSelectPanel();
|
||||
} else {
|
||||
new Alert(Alert.AlertType.ERROR, "邮箱或密码错误").showAndWait();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
package com.mathquiz.ui;
|
||||
|
||||
import com.mathquiz.model.ChoiceQuestion;
|
||||
import com.mathquiz.service.QuizService;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.VBox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class QuizPanel extends VBox {
|
||||
|
||||
private final List<ChoiceQuestion> questions;
|
||||
private final List<String> userAnswers = new ArrayList<>();
|
||||
private final QuizService quizService;
|
||||
private final MainWindow mainWindow;
|
||||
private int currentIndex = 0;
|
||||
|
||||
public QuizPanel(MainWindow mainWindow, List<ChoiceQuestion> questions, QuizService quizService) {
|
||||
this.mainWindow = mainWindow;
|
||||
this.questions = questions;
|
||||
this.quizService = quizService;
|
||||
setPadding(new Insets(20));
|
||||
showQuestion(currentIndex);
|
||||
}
|
||||
|
||||
private void showQuestion(int index) {
|
||||
getChildren().clear();
|
||||
ChoiceQuestion q = questions.get(index);
|
||||
|
||||
getChildren().add(new Label("第 " + (index + 1) + " 题 / " + questions.size()));
|
||||
getChildren().add(new Label(q.getQuestionContent()));
|
||||
|
||||
ToggleGroup group = new ToggleGroup();
|
||||
for (int i = 0; i < 4; i++) {
|
||||
RadioButton rb = new RadioButton(
|
||||
(char)('A' + i) + ". " + q.getOptions().get(i)
|
||||
);
|
||||
rb.setToggleGroup(group);
|
||||
getChildren().add(rb);
|
||||
}
|
||||
|
||||
Button submitBtn = new Button("提交");
|
||||
submitBtn.setOnAction(e -> {
|
||||
RadioButton selected = (RadioButton) group.getSelectedToggle();
|
||||
if (selected != null) {
|
||||
String answer = selected.getText().substring(0, 1); // "A"
|
||||
userAnswers.add(answer);
|
||||
|
||||
if (index + 1 < questions.size()) {
|
||||
showQuestion(index + 1);
|
||||
} else {
|
||||
int score = quizService.calculateScore(questions, userAnswers);
|
||||
Runnable onContinue = () -> {
|
||||
quizService.savePaper(mainWindow.getCurrentUser().getEmail(), questions);
|
||||
};
|
||||
mainWindow.showResultPanel(score, onContinue);
|
||||
}
|
||||
} else {
|
||||
new Alert(Alert.AlertType.WARNING, "请选择一个选项").showAndWait();
|
||||
}
|
||||
});
|
||||
|
||||
getChildren().add(submitBtn);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package com.mathquiz.ui;
|
||||
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.VBox;
|
||||
|
||||
public class ResultPanel extends VBox {
|
||||
|
||||
public ResultPanel(MainWindow mainWindow, int score, Runnable onContinue) {
|
||||
setPadding(new Insets(20));
|
||||
setSpacing(20);
|
||||
|
||||
getChildren().addAll(
|
||||
new Label("答题结束!"),
|
||||
new Label("您的得分: " + score + " 分"),
|
||||
new Button("继续做题") {{
|
||||
setOnAction(e -> {
|
||||
onContinue.run(); // 保存试卷
|
||||
mainWindow.showGradeSelectPanel();
|
||||
});
|
||||
}},
|
||||
new Button("退出") {{
|
||||
setOnAction(e -> {
|
||||
mainWindow.setCurrentUser(null);
|
||||
mainWindow.showLoginPanel();
|
||||
});
|
||||
}}
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue