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 LoginFrame extends JFrame{ private UserService userService; private JTextField emailField; private JPasswordField passwordField; public LoginFrame(UserService userService) { this.userService = userService; initializeUI(); } private void initializeUI() { setTitle("数学学习软件 - 登录"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); 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 formPanel = new JPanel(new GridLayout(3, 2, 10, 10)); JLabel emailLabel = new JLabel("邮箱:"); emailLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); emailField = new JTextField(); JLabel passwordLabel = new JLabel("密码:"); passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); passwordField = new JPasswordField(); formPanel.add(emailLabel); formPanel.add(emailField); formPanel.add(passwordLabel); formPanel.add(passwordField); mainPanel.add(formPanel, BorderLayout.CENTER); // 按钮面板 JPanel buttonPanel = new JPanel(new FlowLayout()); JButton loginButton = new JButton("登录"); loginButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); loginButton.addActionListener(new LoginButtonListener()); JButton registerButton = new JButton("注册"); registerButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); registerButton.addActionListener(e -> openRegisterFrame()); JButton changeCodeButton = new JButton("忘记密码?"); changeCodeButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); changeCodeButton.addActionListener(e -> openChangeCodeFrame()); buttonPanel.add(loginButton); buttonPanel.add(registerButton); buttonPanel.add(changeCodeButton); mainPanel.add(buttonPanel, BorderLayout.SOUTH); add(mainPanel); } private class LoginButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String email = emailField.getText().trim(); String password = new String(passwordField.getPassword()); if (email.isEmpty() || password.isEmpty()) { JOptionPane.showMessageDialog(LoginFrame.this, "请输入邮箱和密码", "错误", JOptionPane.ERROR_MESSAGE); return; } if (userService.login(email, password)) { JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!", "成功", JOptionPane.INFORMATION_MESSAGE); // 这里可以打开主界面 openMainFrame(email); } else { JOptionPane.showMessageDialog(LoginFrame.this, "邮箱或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE); } } } private void openRegisterFrame() { RegisterFrame registerFrame = new RegisterFrame(userService, this); registerFrame.setVisible(true); this.setVisible(false); } private void openChangeCodeFrame() { ChangeCodeFrame changeCodeFrame = new ChangeCodeFrame(userService, this); changeCodeFrame.setVisible(true); this.setVisible(false); } private void openMainFrame(String email) { User user = userService.getUser(email); // 如果用户类型为空,让用户选择类型 if (user.getType() == null || user.getType().isEmpty()) { String[] types = {"小学", "初中", "高中"}; String selectedType = (String) JOptionPane.showInputDialog( this, "欢迎 " + user.getUsername() + "!\n请选择您的教育阶段:", "选择教育阶段", JOptionPane.QUESTION_MESSAGE, null, types, types[0] // 默认选择第一个 ); // 如果用户选择了类型(没有点击取消) if (selectedType != null) { // 更新用户类型 boolean updated = userService.updateUserType(email, selectedType); if (updated) { // 更新本地user对象 user.setType(selectedType); JOptionPane.showMessageDialog(this, "登录成功!\n教育阶段:" + selectedType, "登录成功", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(this, "登录成功!\n但教育阶段设置失败", "登录成功", JOptionPane.WARNING_MESSAGE); } } else { // 如果用户取消选择,可以设置默认类型或者保持为空 userService.updateUserType(email, "小学"); user.setType("小学"); JOptionPane.showMessageDialog(this, "登录成功!\n已为您选择默认教育阶段:小学", "登录成功", JOptionPane.INFORMATION_MESSAGE); } } else { // 如果已经有类型,直接显示欢迎信息 JOptionPane.showMessageDialog(this, "欢迎 " + user.getUsername() + "!\n登录成功。\n教育阶段:" + user.getType(), "登录成功", JOptionPane.INFORMATION_MESSAGE); } openMainApplicationWindow(user, userService); } private void openMainApplicationWindow(User user, UserService userService) { MainFrame mainFrame = new MainFrame(user, userService); mainFrame.setVisible(true); dispose(); } }