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.
partner_program/src/main/java/com/example/myapp/controller/RegisterController.java

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秒后才能重新发送
);
}
}