package top.octopusyan.controller; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXCheckBox; import com.jfoenix.controls.JFXPasswordField; import com.jfoenix.controls.JFXTextField; import javafx.application.Platform; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import org.kordamp.ikonli.javafx.FontIcon; import top.octopusyan.base.BaseController; import top.octopusyan.common.http.EasyHttp; import top.octopusyan.common.http.api.NotParamApi; import top.octopusyan.common.http.config.HttpConstant; import top.octopusyan.common.http.listener.OnHttpListener; import top.octopusyan.http.Api; import top.octopusyan.http.request.LoginParam; import top.octopusyan.http.request.ProxySetup; import top.octopusyan.utils.AlertUtil; import top.octopusyan.utils.ApplicatonStore; import top.octopusyan.utils.ProxyUtil; import top.octopusyan.utils.TextValidate; import java.net.URL; import java.util.List; import java.util.ResourceBundle; import java.util.stream.Collectors; /** * @author : octopus yan * @email : octopus_yan@foxmail.com * @description : Login 控制器 * @create : 2022-3-30 16:06 */ public class LoginController extends BaseController implements Initializable { @FXML public StackPane root; @FXML public JFXButton closeBtn, minimizeBtn, loginBtn; @FXML public AnchorPane loginBottomPane; @FXML public ImageView loginBkgPane; @FXML public JFXButton registerBtn; @FXML public JFXTextField accountTextField; @FXML public JFXPasswordField passwordTextField; @FXML public JFXTextField seePwdTextField; @FXML public JFXButton accountIconBtn; @FXML public FontIcon accountIcon; @FXML public JFXButton pwdIconBtn; @FXML public FontIcon pwdIcon; @FXML public JFXButton seePwdIconBtn; @FXML public FontIcon seePwdIcon; @FXML public JFXCheckBox autoLoginCBox; @FXML public JFXCheckBox rememberCBox; private boolean autoLogin; @Override public boolean dragWindow() { return true; } @Override public StackPane getRootPanel() { return root; } @NotNull @Override public String getRootFxmlPath() { return "/fxml/login.fxml"; } @Override public Button getClooseBtn() { return closeBtn; } @Override public Button getMinimizeBtn() { return minimizeBtn; } @Override public JFXButton getFirstBtn() { return minimizeBtn; } @Override public void initData() { String account = ApplicatonStore.getAccount(); String password = ApplicatonStore.getPassword(); if(!StringUtils.isEmpty(account)) accountTextField.setText(account); if(!StringUtils.isEmpty(password)) { passwordTextField.setText(password); seePwdTextField.setText(password); } } // 隐藏展示密码框 private AnchorPane pwdParent; @Override public void initViewStyle() { // 文本框焦点状态监听 accountTextField.focusedProperty().addListener((observable, oldValue, newValue) -> { if (newValue) accountTextField.resetValidation(); }); passwordTextField.focusedProperty().addListener((observable, oldValue, newValue) -> { if (newValue) passwordTextField.resetValidation(); }); seePwdTextField.focusedProperty().addListener((observable, oldValue, newValue) -> { if (newValue) seePwdTextField.resetValidation(); }); // 隐藏展示密码框 pwdParent = (AnchorPane) passwordTextField.getParent(); pwdParent.getChildren().remove(seePwdTextField); // 同步用户数据 accountTextField.textProperty().addListener((observable, oldValue, newValue) -> ApplicatonStore.setAccount(newValue)); passwordTextField.textProperty().addListener((observable, oldValue, newValue) -> ApplicatonStore.setPassword(newValue)); seePwdTextField.textProperty().addListener((observable, oldValue, newValue) -> ApplicatonStore.setPassword(newValue)); // 添加文本校验 accountTextField.getValidators().add(TextValidate.AccoountRequired); accountTextField.getValidators().add(TextValidate.AccoountValidator); accountTextField.getValidators().add(TextValidate.getLengthValidator(6, 18, "账号")); passwordTextField.getValidators().add(TextValidate.PasswordRequired); seePwdTextField.getValidators().add(TextValidate.PasswordRequired); // 记住密码 rememberCBox.selectedProperty().addListener((observable, oldValue, newValue) -> ApplicatonStore.setRememberMe(newValue)); // 自动登录 autoLoginCBox.selectedProperty().addListener((observable, oldValue, newValue) -> { ApplicatonStore.setAutoLogin(newValue); if (newValue && !ApplicatonStore.isRememberMe()) rememberCBox.selectedProperty().set(true); }); } @Override public void initViewAction() { // 注册 registerBtn.setOnMouseClicked(event -> jumpTo(new RegisterController())); // 查看密码 seePwdIconBtn.setOnMouseClicked(event -> { boolean isHide = pwdParent.getChildren().contains(passwordTextField); pwdParent.getChildren().remove(isHide ? passwordTextField : seePwdTextField); pwdParent.getChildren().add(1, isHide ? seePwdTextField : passwordTextField); (isHide ? seePwdTextField : passwordTextField).setText(ApplicatonStore.getPassword()); seePwdIcon.setIconColor(isHide ? Color.BLUE : Color.BLACK); }); // 登录 loginBtn.setOnMouseClicked(event -> login()); accountTextField.setOnKeyPressed(event -> { if(event.getCode() == KeyCode.ENTER) login(); }); passwordTextField.setOnKeyPressed(event -> { if(event.getCode() == KeyCode.ENTER) login(); }); // 自动登录 if((ApplicatonStore.isAutoLogin() || ApplicatonStore.isRegisterSuccess()) && !StringUtils.isEmpty(ApplicatonStore.getAccount()) && !StringUtils.isEmpty(ApplicatonStore.getPassword()) ){ login(); } } private void login(){ // 获取文本校验结果 boolean pwdValidate = pwdParent.getChildren().contains(passwordTextField) ? passwordTextField.validate() : seePwdTextField.validate(); boolean accountValidate = accountTextField.validate(); if (pwdValidate && accountValidate) EasyHttp.builder() .api(Api.Login) .param(new LoginParam(accountTextField.getText(), ApplicatonStore.getPassword())) .request(new OnHttpListener() { @Override public void onSucceed(String result) { Document html = Jsoup.parse(result); // 登录出错 if (result.contains("alert-danger")) { Platform.runLater(() -> AlertUtil.error(getHtmlErrorMessage(html)).show()); return; } // TODO 登录成功 setCsrf(); jumpTo(new MainController()); } }); } private void setCsrf() { EasyHttp.builder() .api(new NotParamApi( "/?page=panel&module=addproxy", HttpConstant.Method.GET )) .request(new OnHttpListener() { @Override public void onSucceed(String result) { ProxyUtil.setCsrf(result); } }); } private String getHtmlErrorMessage(Document html) { return html.body().getElementsByClass("alert alert-danger alert-dismissable").text().substring(1); } @Override public void onDestroy() { EasyHttp.cancel(); super.onDestroy(); } }