You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
6.3 KiB
215 lines
6.3 KiB
package ui;
|
|
|
|
import model.Grade;
|
|
import model.UserManager;
|
|
import javax.swing.BorderFactory;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JComboBox;
|
|
import javax.swing.JDialog;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JOptionPane;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JPasswordField;
|
|
import javax.swing.JTextField;
|
|
import java.awt.Dimension;
|
|
import java.awt.Frame;
|
|
import java.awt.Font;
|
|
import java.awt.GridBagConstraints;
|
|
import java.awt.GridBagLayout;
|
|
import java.awt.Insets;
|
|
import java.io.Serial;
|
|
import java.util.regex.Pattern;
|
|
|
|
/**
|
|
* 密码设置对话框
|
|
* 用于新用户注册时设置密码和选择年级
|
|
*/
|
|
public class PasswordSetupDialog extends JDialog {
|
|
@Serial
|
|
private static final long serialVersionUID = 1L;
|
|
private static final Pattern PASSWORD_PATTERN =
|
|
Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z0-9]{6,10}$");
|
|
|
|
private final JTextField usernameField;
|
|
private final JPasswordField password1Field;
|
|
private final JPasswordField password2Field;
|
|
private final JComboBox<String> gradeComboBox;
|
|
private final JButton confirmButton;
|
|
private final UserManager userManager;
|
|
private final String email;
|
|
private boolean registrationComplete;
|
|
|
|
/**
|
|
* 构造密码设置对话框
|
|
*
|
|
* @param parent 父窗口
|
|
* @param userManager 用户管理器
|
|
* @param email 用户邮箱
|
|
*/
|
|
public PasswordSetupDialog(Frame parent, UserManager userManager, String email) {
|
|
super(parent, "设置密码和用户名", true);
|
|
this.userManager = userManager;
|
|
this.email = email;
|
|
this.registrationComplete = false;
|
|
|
|
setSize(600, 420);
|
|
setLocationRelativeTo(parent);
|
|
setResizable(true);
|
|
|
|
JPanel panel = new JPanel(new GridBagLayout());
|
|
panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
|
GridBagConstraints gbc = new GridBagConstraints();
|
|
gbc.insets = new Insets(5, 5, 5, 5);
|
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
|
|
|
JLabel infoLabel = new JLabel("<html>密码要求:<br>" +
|
|
"1. 长度 6-10位<br>" +
|
|
"2. 必须包含大写字母<br>" +
|
|
"3. 必须包含小写字母<br>" +
|
|
"4. 必须包含数字<br>" +
|
|
"5. 不能包含其他特殊字符</html>");
|
|
infoLabel.setFont(new Font("微软雅黑", Font.PLAIN, 11));
|
|
gbc.gridx = 0;
|
|
gbc.gridy = 0;
|
|
gbc.gridwidth = 2;
|
|
panel.add(infoLabel, gbc);
|
|
|
|
gbc.gridwidth = 1;
|
|
gbc.gridy = 1;
|
|
panel.add(new JLabel("输入密码:"), gbc);
|
|
|
|
password1Field = new JPasswordField(20);
|
|
gbc.gridx = 1;
|
|
gbc.weightx = 1.0;
|
|
panel.add(password1Field, gbc);
|
|
gbc.weightx = 0.0;
|
|
|
|
gbc.gridx = 0;
|
|
gbc.gridy = 2;
|
|
panel.add(new JLabel("确认密码:"), gbc);
|
|
|
|
password2Field = new JPasswordField(20);
|
|
gbc.gridx = 1;
|
|
gbc.weightx = 1.0;
|
|
panel.add(password2Field, gbc);
|
|
gbc.weightx = 0.0;
|
|
|
|
gbc.gridx = 0;
|
|
gbc.gridy = 3;
|
|
panel.add(new JLabel("设置用户名:"), gbc);
|
|
|
|
usernameField = new JTextField(20);
|
|
gbc.gridx = 1;
|
|
gbc.weightx = 1.0;
|
|
panel.add(usernameField, gbc);
|
|
gbc.weightx = 0.0;
|
|
|
|
gbc.gridx = 0;
|
|
gbc.gridy = 4;
|
|
panel.add(new JLabel("选择年级:"), gbc);
|
|
|
|
String[] grades = {"小学", "初中", "高中"};
|
|
gradeComboBox = new JComboBox<>(grades);
|
|
gbc.gridx = 1;
|
|
gbc.weightx = 1.0;
|
|
panel.add(gradeComboBox, gbc);
|
|
gbc.weightx = 0.0;
|
|
|
|
confirmButton = new JButton("确认注册");
|
|
confirmButton.setPreferredSize(new Dimension(120, 30));
|
|
gbc.gridx = 0;
|
|
gbc.gridy = 5;
|
|
gbc.gridwidth = 2;
|
|
gbc.anchor = GridBagConstraints.CENTER;
|
|
panel.add(confirmButton, gbc);
|
|
|
|
add(panel);
|
|
|
|
confirmButton.addActionListener(e -> handleConfirm());
|
|
getRootPane().setDefaultButton(confirmButton);
|
|
}
|
|
|
|
/**
|
|
* 处理确认注册
|
|
*/
|
|
private void handleConfirm() {
|
|
String password1 = new String(password1Field.getPassword());
|
|
String password2 = new String(password2Field.getPassword());
|
|
String username = usernameField.getText().trim();
|
|
|
|
if (username.isEmpty() || password1.isEmpty() || password2.isEmpty()) {
|
|
showError("用户名和密码不能为空");
|
|
return;
|
|
}
|
|
|
|
if (userManager.usernameExists(username)) {
|
|
showError("该用户名已被使用,请更换一个");
|
|
return;
|
|
}
|
|
|
|
if (!password1.equals(password2)) {
|
|
showError("两次输入的密码不一致");
|
|
return;
|
|
}
|
|
|
|
if (!PASSWORD_PATTERN.matcher(password1).matches()) {
|
|
showError("密码不符合要求:\n" +
|
|
"长度6-10位, 必须包含大小写字母和数字, 且不能包含特殊字符");
|
|
return;
|
|
}
|
|
|
|
Grade gradeType = getSelectedGradeType();
|
|
boolean success = userManager.register(email, password1, gradeType, username);
|
|
|
|
if (success) {
|
|
JOptionPane.showMessageDialog(this,
|
|
"注册成功!请返回登录。",
|
|
"成功",
|
|
JOptionPane.INFORMATION_MESSAGE);
|
|
registrationComplete = true;
|
|
dispose();
|
|
} else {
|
|
showError("注册失败,该邮箱可能已被注册");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取选择的年级类型
|
|
*
|
|
* @return 年级类型
|
|
*/
|
|
private Grade getSelectedGradeType() {
|
|
String selected = (String) gradeComboBox.getSelectedItem();
|
|
switch (selected) {
|
|
case "小学":
|
|
return Grade.primary;
|
|
case "初中":
|
|
return Grade.middle;
|
|
case "高中":
|
|
return Grade.high;
|
|
default:
|
|
return Grade.primary;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 显示错误信息
|
|
*
|
|
* @param message 错误消息
|
|
*/
|
|
private void showError(String message) {
|
|
JOptionPane.showMessageDialog(this,
|
|
message,
|
|
"错误",
|
|
JOptionPane.ERROR_MESSAGE);
|
|
}
|
|
|
|
/**
|
|
* 检查注册是否完成
|
|
*
|
|
* @return 注册是否完成
|
|
*/
|
|
public boolean isRegistrationComplete() {
|
|
return registrationComplete;
|
|
}
|
|
} |