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.
142 lines
4.1 KiB
142 lines
4.1 KiB
package com.example.myapp.controller;
|
|
|
|
import com.example.myapp.Main;
|
|
import com.example.myapp.service.EmailService;
|
|
import com.example.myapp.service.UserService;
|
|
import javafx.fxml.FXML;
|
|
import javafx.scene.control.*;
|
|
|
|
import java.util.Random;
|
|
|
|
public class RegisterController {
|
|
@FXML private TextField emailField;
|
|
@FXML private Button sendCodeBtn;
|
|
@FXML private TextField codeField;
|
|
@FXML private Button verifyBtn;
|
|
@FXML private Label statusLabel;
|
|
|
|
private final UserService userService = UserService.getInstance();
|
|
private EmailService emailService;
|
|
|
|
public RegisterController(){
|
|
try {
|
|
emailService = new EmailService();
|
|
} catch(Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
@FXML
|
|
public void onSendCode(){
|
|
String email = emailField.getText().trim();
|
|
|
|
// 验证邮箱格式
|
|
if(email.isEmpty()){
|
|
statusLabel.setText("请输入邮箱地址");
|
|
statusLabel.setStyle("-fx-text-fill: red;");
|
|
return;
|
|
}
|
|
|
|
if(!isValidEmail(email)){
|
|
statusLabel.setText("请输入有效的邮箱地址");
|
|
statusLabel.setStyle("-fx-text-fill: red;");
|
|
return;
|
|
}
|
|
|
|
// 检查邮箱是否已被注册
|
|
if(userService.emailExists(email)){
|
|
// 检查用户是否已完成注册(设置了密码)
|
|
if(userService.isUserRegistered(email)){
|
|
statusLabel.setText("该邮箱已被注册,请直接登录");
|
|
statusLabel.setStyle("-fx-text-fill: red;");
|
|
return;
|
|
} else {
|
|
// 用户已存在但未完成注册,可以重新发送验证码
|
|
statusLabel.setText("该邮箱正在注册流程中,重新发送验证码");
|
|
statusLabel.setStyle("-fx-text-fill: orange;");
|
|
}
|
|
}
|
|
|
|
String code = generateCode();
|
|
userService.createPendingUser(email, code);
|
|
try{
|
|
emailService.sendRegistrationCode(email, code);
|
|
statusLabel.setText("注册码已发送到您的邮箱,请查收");
|
|
statusLabel.setStyle("-fx-text-fill: green;");
|
|
|
|
// 禁用发送按钮一段时间,防止重复发送
|
|
disableSendButtonTemporarily();
|
|
|
|
}catch(Exception e){
|
|
e.printStackTrace();
|
|
statusLabel.setText("发送失败: " + e.getMessage());
|
|
statusLabel.setStyle("-fx-text-fill: red;");
|
|
}
|
|
}
|
|
|
|
private String generateCode(){
|
|
Random r = new Random();
|
|
int v = 100000 + r.nextInt(900000);
|
|
return String.valueOf(v);
|
|
}
|
|
|
|
@FXML
|
|
public void onVerify(){
|
|
String email = emailField.getText().trim();
|
|
String code = codeField.getText().trim();
|
|
|
|
if(email.isEmpty() || code.isEmpty()){
|
|
statusLabel.setText("请输入邮箱和验证码");
|
|
statusLabel.setStyle("-fx-text-fill: red;");
|
|
return;
|
|
}
|
|
|
|
if(userService.verifyCode(email, code)){
|
|
statusLabel.setText("验证通过,请设置密码");
|
|
statusLabel.setStyle("-fx-text-fill: green;");
|
|
try {
|
|
Main.showSetPassword(email);
|
|
} catch(Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
} else {
|
|
statusLabel.setText("注册码错误或已过期");
|
|
statusLabel.setStyle("-fx-text-fill: red;");
|
|
}
|
|
}
|
|
@FXML
|
|
public void onClear() {
|
|
emailField.clear();
|
|
codeField.clear();
|
|
statusLabel.setText("");
|
|
sendCodeBtn.setDisable(false);
|
|
}
|
|
@FXML
|
|
public void onBackToLogin() {
|
|
try {
|
|
Main.showLogin();
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private boolean isValidEmail(String email) {
|
|
String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
|
|
return email.matches(emailRegex);
|
|
}
|
|
|
|
private void disableSendButtonTemporarily() {
|
|
sendCodeBtn.setDisable(true);
|
|
new java.util.Timer().schedule(
|
|
new java.util.TimerTask() {
|
|
@Override
|
|
public void run() {
|
|
javafx.application.Platform.runLater(() -> {
|
|
sendCodeBtn.setDisable(false);
|
|
});
|
|
}
|
|
},
|
|
60000 // 60秒后才能重新发送
|
|
);
|
|
}
|
|
} |