From 4847b30452bba99cf885cb7191b866ca27e4d40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=A0=E6=B1=9F?= <15547749+cyj-050209@user.noreply.gitee.com> Date: Fri, 10 Oct 2025 23:46:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=BB=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E9=99=A4=E8=87=AA=E6=B5=8B=E5=8A=9F=E8=83=BD=E6=89=80=E6=9C=89?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/users.json | 4 +- .../mathlearning/service/UserService.java | 14 +- .../mathlearning/ui/ChangePasswordFrame.java | 120 ++++++++++++++++++ .../java/mathlearning/ui/ProfileFrame.java | 8 +- 4 files changed, 136 insertions(+), 10 deletions(-) create mode 100644 src/main/java/mathlearning/ui/ChangePasswordFrame.java diff --git a/data/users.json b/data/users.json index c9e9c1c..a60e027 100644 --- a/data/users.json +++ b/data/users.json @@ -1,9 +1,9 @@ [ { "username" : "小鱼", "email" : "1280556515@qq.com", - "passwordHash" : "$2a$12$CsCIbkduy54ow1QwQDN0M.lJTf8jteN9n/Z3FrMklm.I5b/JmcUwG", + "passwordHash" : "$2a$12$T4LMhwE2r/WJyLjK/gg9MuwEZDPHd/BEmKqd7Y1rfdww261wvGSx.", "registrationDate" : [ 2025, 10, 10, 11, 7, 5, 853200500 ], - "verificationCode" : "737858", + "verificationCode" : "863928", "verified" : true, "type" : "高中" } ] \ No newline at end of file diff --git a/src/main/java/mathlearning/service/UserService.java b/src/main/java/mathlearning/service/UserService.java index 45d8fce..930e3b1 100644 --- a/src/main/java/mathlearning/service/UserService.java +++ b/src/main/java/mathlearning/service/UserService.java @@ -123,28 +123,32 @@ public class UserService { return result.verified; } - public boolean changePassword(String email, String oldPassword, String newPassword) { + public int changePassword(String email, String oldPassword, String newPassword) { User user = users.get(email); if (user == null) { - return false; + return 1; } // 验证旧密码 BCrypt.Result result = BCrypt.verifyer().verify(oldPassword.toCharArray(), user.getPasswordHash()); if (!result.verified) { - return false; + return 2; } // 验证新密码格式 if (!validatePassword(newPassword)) { - return false; + return 3; + } + + if (oldPassword.equals(newPassword)) { + return 4; } // 更新密码 String newPasswordHash = BCrypt.withDefaults().hashToString(12, newPassword.toCharArray()); user.setPasswordHash(newPasswordHash); saveUsers(); - return true; + return 5; } public boolean setPasswordResetCode(String email, String verificationCode) { diff --git a/src/main/java/mathlearning/ui/ChangePasswordFrame.java b/src/main/java/mathlearning/ui/ChangePasswordFrame.java new file mode 100644 index 0000000..96848fe --- /dev/null +++ b/src/main/java/mathlearning/ui/ChangePasswordFrame.java @@ -0,0 +1,120 @@ +package mathlearning.ui; + +import mathlearning.model.User; +import mathlearning.service.UserService; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ChangePasswordFrame extends JFrame { + private User user; + private UserService userService; + private ProfileFrame profileFrame; + private JPasswordField oldPasswordField; + private JPasswordField newPasswordField; + private JPasswordField confirmPasswordField; + + public ChangePasswordFrame(User user, UserService userService, ProfileFrame profileFrame) { + this.user = user; + this.userService = userService; + this.profileFrame = profileFrame; + addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent windowEvent) { + profileFrame.setVisible(true); + } + }); + InitUI(); + } + + private void InitUI() { + setTitle("修改密码"); + setSize(400, 300); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setLocationRelativeTo(null); + setResizable(false); + + // 创建主面板 + JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); + mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + + // 标题 + JLabel titleLabel = new JLabel("修改密码", JLabel.CENTER); + titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 24)); + mainPanel.add(titleLabel, BorderLayout.NORTH); + + //表单 + JPanel infoPanel = new JPanel(new GridLayout(4, 2, 10, 10)); + JLabel oldPasswordLabel = new JLabel("请输入旧密码:"); + oldPasswordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + oldPasswordField = new JPasswordField(); + infoPanel.add(oldPasswordLabel); + infoPanel.add(oldPasswordField); + JLabel newPasswordLabel = new JLabel("请输入新密码:"); + newPasswordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + newPasswordField = new JPasswordField(); + infoPanel.add(newPasswordLabel); + infoPanel.add(newPasswordField); + JLabel confirmPasswordLabel = new JLabel("请再次输入新密码:"); + confirmPasswordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + confirmPasswordField = new JPasswordField(); + infoPanel.add(confirmPasswordLabel); + infoPanel.add(confirmPasswordField); + mainPanel.add(infoPanel, BorderLayout.CENTER); + + //按钮 + JPanel buttonPanel = new JPanel(new FlowLayout()); + JButton changeButton = new JButton("修改"); + changeButton.addActionListener(new ChangeButtonListener()); + JButton cancelButton = new JButton("取消并返回"); + cancelButton.addActionListener(e -> returnToProfileFrame()); + + buttonPanel.add(changeButton); + buttonPanel.add(cancelButton); + + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + + add(mainPanel); + } + + private void returnToProfileFrame() { + profileFrame.setVisible(true); + dispose(); + } + + private class ChangeButtonListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + String oldPassword = new String(oldPasswordField.getPassword()); + String newPassword = new String(newPasswordField.getPassword()); + String confirmPassword = new String(confirmPasswordField.getPassword()); + + if (!newPassword.equals(confirmPassword)) { + JOptionPane.showMessageDialog(ChangePasswordFrame.this, "两次输入的密码不相同!", "错误", JOptionPane.ERROR_MESSAGE ); + return; + } + + int changed = userService.changePassword(user.getEmail(), oldPassword, newPassword); + + if (changed == 1) { + JOptionPane.showMessageDialog(ChangePasswordFrame.this, "修改失败!用户账户异常!", "错误", JOptionPane.ERROR_MESSAGE); + return; + } + else if (changed == 2) { + JOptionPane.showMessageDialog(ChangePasswordFrame.this, "修改失败!旧密码输入有误!", "错误", JOptionPane.ERROR_MESSAGE); + return; + } else if (changed == 3) { + JOptionPane.showMessageDialog(ChangePasswordFrame.this, "修改失败!新密码的格式有误!密码必须为6-10位,且包含大小写字母和数字", "错误", JOptionPane.ERROR_MESSAGE); + return; + } else if (changed == 4) { + JOptionPane.showMessageDialog(ChangePasswordFrame.this, "修改失败!旧密码与新密码一致!", "错误", JOptionPane.ERROR_MESSAGE); + return; + } else { + JOptionPane.showMessageDialog(ChangePasswordFrame.this, "修改成功!", "成功", JOptionPane.INFORMATION_MESSAGE); + } + returnToProfileFrame(); + } + } +} diff --git a/src/main/java/mathlearning/ui/ProfileFrame.java b/src/main/java/mathlearning/ui/ProfileFrame.java index 2e59ad6..17982f7 100644 --- a/src/main/java/mathlearning/ui/ProfileFrame.java +++ b/src/main/java/mathlearning/ui/ProfileFrame.java @@ -57,7 +57,7 @@ public class ProfileFrame extends JFrame { returnToMainButton.addActionListener(new returnToMainButtonListener()); JButton changePasswordButton = new JButton("修改密码"); - changePasswordButton.addActionListener(e -> openChangePasswordFrame()); + changePasswordButton.addActionListener(e -> oppenChangePasswordFrame()); JButton changeUsernameButton = new JButton("更改用户名"); changeUsernameButton.addActionListener(new ChangeUsernameButtonListener()); @@ -80,8 +80,10 @@ public class ProfileFrame extends JFrame { } } - private void openChangePasswordFrame() { - + private void oppenChangePasswordFrame() { + ChangePasswordFrame changePasswordFrame = new ChangePasswordFrame(user, userService, this); + changePasswordFrame.setVisible(true); + this.setVisible(false); } private class ChangeUsernameButtonListener implements ActionListener {