255 lines
8.5 KiB
Java
255 lines
8.5 KiB
Java
|
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<StackPane> 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<String>() {
|
||
|
@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<String>(
|
||
|
"/?page=panel&module=addproxy",
|
||
|
HttpConstant.Method.GET
|
||
|
))
|
||
|
.request(new OnHttpListener<String>() {
|
||
|
@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();
|
||
|
}
|
||
|
}
|