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 {