From b0a1eceeaa4ecafda5e43d7828db0a18c3e7a9f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E6=99=A8=E6=97=AD?= <15550449+ruantang231@user.noreply.gitee.com> Date: Sat, 11 Oct 2025 21:19:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChangePasswordController.java | 149 ++++++++++++++++++ .../mathsystemtogether/ExamController.java | 53 ++++++- .../change-password-view.fxml | 70 ++++++++ .../example/mathsystemtogether/exam-view.fxml | 10 +- user_data.txt | 4 +- 5 files changed, 275 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/mathsystemtogether/ChangePasswordController.java create mode 100644 src/main/resources/com/example/mathsystemtogether/change-password-view.fxml diff --git a/src/main/java/com/example/mathsystemtogether/ChangePasswordController.java b/src/main/java/com/example/mathsystemtogether/ChangePasswordController.java new file mode 100644 index 0000000..f8f9269 --- /dev/null +++ b/src/main/java/com/example/mathsystemtogether/ChangePasswordController.java @@ -0,0 +1,149 @@ +package com.example.mathsystemtogether; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.stage.Stage; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.List; + +public class ChangePasswordController { + + @FXML + private TextField usernameField; + + @FXML + private PasswordField oldPasswordField; + + @FXML + private PasswordField newPasswordField; + + @FXML + private PasswordField confirmNewPasswordField; + + @FXML + private Button changePasswordButton; + + @FXML + private Button cancelButton; + + @FXML + private Label statusLabel; + + private String currentUser; + private ExamController examController; + private static final String USER_DATA_FILE = "user_data.txt"; + + public void setCurrentUser(String username) { + this.currentUser = username; + usernameField.setText(username); + } + + public void setExamController(ExamController examController) { + this.examController = examController; + } + + @FXML + private void handleChangePassword() { + String oldPassword = oldPasswordField.getText(); + String newPassword = newPasswordField.getText(); + String confirmNewPassword = confirmNewPasswordField.getText(); + + if (oldPassword.isEmpty() || newPassword.isEmpty() || confirmNewPassword.isEmpty()) { + showStatus("请填写所有字段", true); + return; + } + + if (!examController.checkUserPassword(currentUser, oldPassword)) { + showStatus("原密码错误", true); + return; + } + + if (newPassword.length() < 6) { + showStatus("新密码至少需要6个字符", true); + return; + } + + if (!newPassword.equals(confirmNewPassword)) { + showStatus("两次输入的新密码不一致", true); + return; + } + + if (oldPassword.equals(newPassword)) { + showStatus("新密码不能与原密码相同", true); + return; + } + + if (updatePassword(currentUser, newPassword)) { + showStatus("密码修改成功!", false); + + // 延迟关闭窗口 + new java.util.Timer().schedule( + new java.util.TimerTask() { + @Override + public void run() { + javafx.application.Platform.runLater(() -> { + handleClose(); + }); + } + }, + 1500 + ); + } else { + showStatus("密码修改失败,请重试", true); + } + } + + @FXML + private void handleCancel() { + handleClose(); + } + + private void handleClose() { + Stage stage = (Stage) cancelButton.getScene().getWindow(); + stage.close(); + } + + private boolean updatePassword(String username, String newPassword) { + try { + // 读取所有用户数据 + List lines = Files.readAllLines(Paths.get(USER_DATA_FILE)); + boolean userFound = false; + + for (int i = 0; i < lines.size(); i++) { + String[] parts = lines.get(i).split("\\|"); + if (parts.length >= 2 && parts[0].equals(username)) { + // 更新密码 + parts[1] = newPassword; + lines.set(i, String.join("|", parts)); + userFound = true; + break; + } + } + + if (userFound) { + // 写回文件 + Files.write(Paths.get(USER_DATA_FILE), lines); + // 更新内存中的用户数据 + examController.updateUserPassword(username, newPassword); + return true; + } + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + private void showStatus(String message, boolean isError) { + statusLabel.setText(message); + if (isError) { + statusLabel.setStyle("-fx-text-fill: #DC143C; -fx-font-weight: bold; -fx-font-size: 14;"); + } else { + statusLabel.setStyle("-fx-text-fill: #228B22; -fx-font-weight: bold; -fx-font-size: 14;"); + } + } +} diff --git a/src/main/java/com/example/mathsystemtogether/ExamController.java b/src/main/java/com/example/mathsystemtogether/ExamController.java index cb60676..1f390ba 100644 --- a/src/main/java/com/example/mathsystemtogether/ExamController.java +++ b/src/main/java/com/example/mathsystemtogether/ExamController.java @@ -33,6 +33,7 @@ public class ExamController { @FXML private Button startExamButton; @FXML private Button logoutButton; @FXML private Label statusLabel; + @FXML private Button changePasswordButton; // 数据成员 private Account currentAccount; @@ -80,7 +81,7 @@ public class ExamController { if (!Files.exists(Paths.get(USER_DATA_FILE))) { return; } - + List lines = Files.readAllLines(Paths.get(USER_DATA_FILE)); for (String line : lines) { String[] parts = line.split("\\|"); @@ -88,14 +89,14 @@ public class ExamController { String username = parts[0]; String password = parts[1]; String levelStr = parts[3]; - + Level level; try { level = Level.valueOf(levelStr); } catch (IllegalArgumentException e) { level = Level.小学; // 默认级别 } - + userMap.put(username, new Account(username, password, level)); } } @@ -140,7 +141,7 @@ public class ExamController { registerStage.setScene(scene); registerStage.setResizable(false); registerStage.show(); - + } catch (Exception e) { loginStatusLabel.setText("打开注册界面失败:" + e.getMessage()); loginStatusLabel.setStyle("-fx-text-fill: red;"); @@ -197,6 +198,48 @@ public class ExamController { } } +@FXML +private void handleChangePassword() { + if (currentAccount == null) { + statusLabel.setText("请先登录"); + statusLabel.setStyle("-fx-text-fill: red;"); + return; + } + + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("change-password-view.fxml")); + Scene scene = new Scene(loader.load(), 600, 500); + Stage changePasswordStage = new Stage(); + changePasswordStage.setTitle("修改密码"); + changePasswordStage.setScene(scene); + changePasswordStage.setResizable(false); + + // 传递当前用户信息给密码修改控制器 + ChangePasswordController controller = loader.getController(); + controller.setCurrentUser(currentAccount.username); + controller.setExamController(this); + + changePasswordStage.show(); + } catch (Exception e) { + statusLabel.setText("打开修改密码界面失败:" + e.getMessage()); + statusLabel.setStyle("-fx-text-fill: red;"); + } +} + +// 供 ChangePasswordController 调用的方法 +public boolean checkUserPassword(String username, String password) { + Account account = userMap.get(username); + return account != null && account.password.equals(password); +} + +// 更新用户密码 +public void updateUserPassword(String username, String newPassword) { + Account account = userMap.get(username); + if (account != null) { + account.password = newPassword; + } +} + private void startExam() { try { // 打开专门的考试界面 @@ -240,4 +283,4 @@ public class ExamController { enum Level { 小学, 初中, 高中 } -} \ No newline at end of file +} diff --git a/src/main/resources/com/example/mathsystemtogether/change-password-view.fxml b/src/main/resources/com/example/mathsystemtogether/change-password-view.fxml new file mode 100644 index 0000000..7b7970b --- /dev/null +++ b/src/main/resources/com/example/mathsystemtogether/change-password-view.fxml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +