|
|
package com.wsf.mathapp.view;
|
|
|
|
|
|
import com.wsf.mathapp.controller.SceneManager;
|
|
|
import com.ybw.mathapp.util.EmailService;
|
|
|
import com.ybw.mathapp.util.Register;
|
|
|
import java.util.regex.Pattern;
|
|
|
import javafx.geometry.Insets;
|
|
|
import javafx.geometry.Pos;
|
|
|
import javafx.scene.Scene;
|
|
|
import javafx.scene.control.*;
|
|
|
import javafx.scene.layout.VBox;
|
|
|
import javafx.scene.text.Font;
|
|
|
import com.ybw.mathapp.util.LoginFileUtils;
|
|
|
|
|
|
public class RegisterView {
|
|
|
private Scene scene;
|
|
|
private final SceneManager sceneManager;
|
|
|
|
|
|
public RegisterView(SceneManager sceneManager) {
|
|
|
this.sceneManager = sceneManager;
|
|
|
createScene();
|
|
|
}
|
|
|
|
|
|
private void createScene() {
|
|
|
VBox root = new VBox(15);
|
|
|
root.setPadding(new Insets(30));
|
|
|
root.setAlignment(Pos.CENTER);
|
|
|
|
|
|
Label titleLabel = new Label("用户注册");
|
|
|
titleLabel.setFont(Font.font(20));
|
|
|
|
|
|
// 添加用户名输入框
|
|
|
TextField usernameField = new TextField();
|
|
|
usernameField.setPromptText("请输入用户名(3-20位字母、数字、下划线)");
|
|
|
usernameField.setMaxWidth(300);
|
|
|
usernameField.setPrefHeight(35);
|
|
|
|
|
|
TextField emailField = new TextField();
|
|
|
emailField.setPromptText("请输入邮箱");
|
|
|
emailField.setMaxWidth(300);
|
|
|
emailField.setPrefHeight(35);
|
|
|
|
|
|
Button sendCodeButton = new Button("发送验证码");
|
|
|
sendCodeButton.setStyle("-fx-background-color: #FF9800; -fx-text-fill: white;");
|
|
|
sendCodeButton.setPrefSize(120, 35);
|
|
|
|
|
|
TextField codeField = new TextField();
|
|
|
codeField.setPromptText("请输入验证码");
|
|
|
codeField.setMaxWidth(300);
|
|
|
codeField.setPrefHeight(35);
|
|
|
|
|
|
PasswordField passwordField = new PasswordField();
|
|
|
passwordField.setPromptText("请输入密码(6-10位,含大小写字母和数字)");
|
|
|
passwordField.setMaxWidth(300);
|
|
|
passwordField.setPrefHeight(35);
|
|
|
|
|
|
PasswordField confirmPasswordField = new PasswordField();
|
|
|
confirmPasswordField.setPromptText("请再次输入密码");
|
|
|
confirmPasswordField.setMaxWidth(300);
|
|
|
confirmPasswordField.setPrefHeight(35);
|
|
|
|
|
|
Button registerButton = new Button("注册");
|
|
|
registerButton.setStyle("-fx-background-color: #4CAF50; -fx-text-fill: white; -fx-font-size: 14px;");
|
|
|
registerButton.setPrefSize(300, 40);
|
|
|
|
|
|
Button backButton = new Button("返回登录");
|
|
|
backButton.setStyle("-fx-background-color: #757575; -fx-text-fill: white;");
|
|
|
backButton.setPrefSize(300, 35);
|
|
|
|
|
|
Label statusLabel = new Label();
|
|
|
|
|
|
sendCodeButton.setOnAction(e -> {
|
|
|
String username = usernameField.getText().trim();
|
|
|
String email = emailField.getText().trim();
|
|
|
|
|
|
// 验证用户名
|
|
|
if (!isValidUsername(username)) {
|
|
|
showError(statusLabel, "用户名只包含英文字母和数字)");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 检查用户名是否已存在
|
|
|
if (LoginFileUtils.isNameRegistered(username)) {
|
|
|
showError(statusLabel, "用户名已存在,请选择其他用户名!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!EmailService.isValidEmail(email)) {
|
|
|
showError(statusLabel, "请输入有效的邮箱地址!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (LoginFileUtils.isEmailRegistered(email)){
|
|
|
showError(statusLabel, "该邮箱已注册,请直接登录!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 生成并发送验证码
|
|
|
boolean sent = EmailService.sendCode(email);
|
|
|
if (sent) {
|
|
|
showSuccess(statusLabel, "验证码已发送到您的邮箱!");
|
|
|
// 禁用发送按钮60秒
|
|
|
sendCodeButton.setDisable(true);
|
|
|
startCountdown(sendCodeButton);
|
|
|
} else {
|
|
|
showError(statusLabel, "发送验证码失败,请稍后重试!");
|
|
|
}
|
|
|
});
|
|
|
|
|
|
registerButton.setOnAction(e -> {
|
|
|
String username = usernameField.getText().trim();
|
|
|
String email = emailField.getText().trim();
|
|
|
String code = codeField.getText().trim();
|
|
|
String password = passwordField.getText();
|
|
|
String confirmPassword = confirmPasswordField.getText();
|
|
|
|
|
|
// 验证用户名
|
|
|
if (!isValidUsername(username)) {
|
|
|
showError(statusLabel, "用户名只包含英文字母和数字");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 检查用户名是否已存在
|
|
|
if (LoginFileUtils.isNameRegistered((username))){
|
|
|
showError(statusLabel, "用户名已存在,请选择其他用户名!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!EmailService.isValidEmail(email)) {
|
|
|
showError(statusLabel, "请输入有效的邮箱地址!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (LoginFileUtils.isEmailRegistered(email)){
|
|
|
showError(statusLabel, "该邮箱已注册,请直接登录!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (username.isEmpty() || email.isEmpty() || code.isEmpty() || password.isEmpty()) {
|
|
|
showError(statusLabel, "请填写所有字段!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 验证验证码
|
|
|
if (!EmailService.verifyCode(email, code)) {
|
|
|
showError(statusLabel, "验证码错误或已过期!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!Register.isVaildPassword(password)) {
|
|
|
showError(statusLabel, "密码要6-10位,包含大,小写字母和数字");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!Register.isEqualPassword(password,confirmPassword)){
|
|
|
showError(statusLabel, "两次密码不一致");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (Register.register(username, email, password)) {
|
|
|
showSuccess(statusLabel, "注册成功!用户名: " + username);
|
|
|
sceneManager.showLoginView();
|
|
|
} else {
|
|
|
showError(statusLabel, "注册失败,请检查信息!");
|
|
|
}
|
|
|
});
|
|
|
|
|
|
backButton.setOnAction(e -> {
|
|
|
sceneManager.showLoginView();
|
|
|
});
|
|
|
|
|
|
root.getChildren().addAll(
|
|
|
titleLabel,
|
|
|
usernameField, // 添加用户名输入框
|
|
|
emailField,
|
|
|
sendCodeButton,
|
|
|
codeField,
|
|
|
passwordField,
|
|
|
confirmPasswordField,
|
|
|
registerButton,
|
|
|
backButton,
|
|
|
statusLabel
|
|
|
);
|
|
|
|
|
|
scene = new Scene(root, 400, 550); // 增加高度以适应新字段
|
|
|
}
|
|
|
|
|
|
private void startCountdown(Button button) {
|
|
|
new Thread(() -> {
|
|
|
try {
|
|
|
for (int i = 60; i > 0; i--) {
|
|
|
int finalI = i;
|
|
|
javafx.application.Platform.runLater(() -> {
|
|
|
button.setText(finalI + "秒后重发");
|
|
|
});
|
|
|
Thread.sleep(1000);
|
|
|
}
|
|
|
javafx.application.Platform.runLater(() -> {
|
|
|
button.setText("发送验证码");
|
|
|
button.setDisable(false);
|
|
|
});
|
|
|
} catch (InterruptedException ex) {
|
|
|
ex.printStackTrace();
|
|
|
}
|
|
|
}).start();
|
|
|
}
|
|
|
|
|
|
private void showError(Label label, String message) {
|
|
|
label.setText(message);
|
|
|
label.setStyle("-fx-text-fill: red;");
|
|
|
}
|
|
|
|
|
|
private void showSuccess(Label label, String message) {
|
|
|
label.setText(message);
|
|
|
label.setStyle("-fx-text-fill: green;");
|
|
|
}
|
|
|
|
|
|
public Scene getScene() {
|
|
|
return scene;
|
|
|
}
|
|
|
public static boolean isValidUsername(String username) {
|
|
|
if (username == null || username.trim().isEmpty()) {
|
|
|
return false;
|
|
|
}
|
|
|
// 用户名规则:只能包含英文字母和数字
|
|
|
String usernameRegex = "^[a-zA-Z0-9]{3,100}$";
|
|
|
return Pattern.matches(usernameRegex, username.trim());
|
|
|
}
|
|
|
}
|