feat: 代理测试

todo: 关于页
This commit is contained in:
2024-09-09 20:15:49 +08:00
parent 88a2f705ba
commit a9dd63b251
23 changed files with 432 additions and 148 deletions

View File

@ -2,6 +2,7 @@ package cn.octopusyan.alistgui.base;
import cn.octopusyan.alistgui.Application;
import cn.octopusyan.alistgui.config.Context;
import cn.octopusyan.alistgui.manager.WindowsUtil;
import cn.octopusyan.alistgui.util.FxmlUtil;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
@ -20,7 +21,6 @@ import java.util.ResourceBundle;
*/
public abstract class BaseController<P extends Pane> implements Initializable {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
private double xOffSet = 0, yOffSet = 0;
public BaseController() {
//初始化时保存当前Controller实例
@ -33,14 +33,7 @@ public abstract class BaseController<P extends Pane> implements Initializable {
// 全局窗口拖拽
if (dragWindow()) {
// 窗口拖拽
getRootPanel().setOnMousePressed(event -> {
xOffSet = event.getSceneX();
yOffSet = event.getSceneY();
});
getRootPanel().setOnMouseDragged(event -> {
getWindow().setX(event.getScreenX() - xOffSet);
getWindow().setY(event.getScreenY() - yOffSet);
});
WindowsUtil.bindDragged(getRootPanel());
}
// 初始化数据

View File

@ -1,6 +1,7 @@
package cn.octopusyan.alistgui.config;
import cn.octopusyan.alistgui.base.BaseController;
import cn.octopusyan.alistgui.controller.AboutController;
import cn.octopusyan.alistgui.controller.MainController;
import cn.octopusyan.alistgui.controller.RootController;
import cn.octopusyan.alistgui.controller.SetupController;
@ -34,7 +35,7 @@ public class Context {
private static final Logger log = LoggerFactory.getLogger(Context.class);
private static Scene scene;
private static final IntegerProperty currentViewIndexProperty = new SimpleIntegerProperty(0);
// 获取控制器集合
/**
* 控制器集合
*/
@ -51,7 +52,7 @@ public class Context {
/**
* 支持的语言集合,应与语言资源文件同步手动更新
*/
public static final List<Locale> SUPPORT_LANGUAGE_LIST = Arrays.asList(Locale.CHINESE, Locale.ENGLISH);
public static final List<Locale> SUPPORT_LANGUAGE_LIST = Arrays.asList(Locale.SIMPLIFIED_CHINESE, Locale.ENGLISH);
/**
* 记录当前所选时区
*/
@ -70,6 +71,7 @@ public class Context {
case RootController root -> root;
case MainController main -> main;
case SetupController setup -> setup;
case AboutController about -> about;
default -> throw new IllegalStateException(STR."Unexpected value: \{type}");
};
} catch (Exception e) {
@ -107,6 +109,7 @@ public class Context {
// 更新界面语言
public static void setLanguage(Locale locale) {
setCurrentLocale(locale);
Locale.setDefault(locale);
ConfigManager.language(locale);
LANGUAGE_RESOURCE_FACTORY.setResourceBundle(ResourceBundle.getBundle(LANGUAGE_RESOURCE_NAME, locale));
}
@ -133,7 +136,7 @@ public class Context {
* 初始化 语言
*/
private static void initI18n() {
currentLocaleProperty().addListener((_, _, _) -> Platform.runLater(() -> {
currentLocaleProperty().addListener((_, _, locale) -> Platform.runLater(() -> {
try {
loadScene();
} catch (IOException e) {

View File

@ -0,0 +1,54 @@
package cn.octopusyan.alistgui.controller;
import cn.octopusyan.alistgui.base.BaseController;
import cn.octopusyan.alistgui.viewModel.AboutViewModule;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 关于
*
* @author octopus_yan
*/
public class AboutController extends BaseController<VBox> {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@FXML
public VBox aboutView;
@FXML
public Label aListVersion;
@FXML
public Button checkAppVersion;
private final AboutViewModule viewModule = new AboutViewModule();
@Override
public VBox getRootPanel() {
return aboutView;
}
@Override
public void initData() {
}
@Override
public void initViewStyle() {
}
@Override
public void initViewAction() {
aListVersion.textProperty().bindBidirectional(viewModule.aListVersionProperty());
}
@FXML
public void checkAListUpdate() {
viewModule.checkAListUpdate();
}
}

View File

@ -8,25 +8,29 @@ import cn.octopusyan.alistgui.viewModel.SetupViewModel;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
/**
* 设置页面控制器
*
* @author octopus_yan
*/
public class SetupController extends BaseController<AnchorPane> implements Initializable {
public class SetupController extends BaseController<VBox> implements Initializable {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@FXML
public AnchorPane setupView;
public VBox setupView;
@FXML
public CheckBox autoStartCheckBox;
@FXML
@ -43,15 +47,11 @@ public class SetupController extends BaseController<AnchorPane> implements Initi
public TextField proxyHost;
@FXML
public TextField proxyPort;
@FXML
public Label aListVersion;
@FXML
public Button checkAppVersion;
private final SetupViewModel setupViewModel = new SetupViewModel();
private final SetupViewModel viewModule = new SetupViewModel();
@Override
public AnchorPane getRootPanel() {
public VBox getRootPanel() {
return setupView;
}
@ -75,21 +75,19 @@ public class SetupController extends BaseController<AnchorPane> implements Initi
@Override
public void initViewAction() {
autoStartCheckBox.selectedProperty().bindBidirectional(setupViewModel.autoStartProperty());
silentStartupCheckBox.selectedProperty().bindBidirectional(setupViewModel.silentStartupProperty());
proxySetupComboBox.getSelectionModel().selectedItemProperty()
.addListener((_, _, newValue) -> setupViewModel.proxySetupProperty().set(newValue));
proxyHost.textProperty().bindBidirectional(setupViewModel.proxyHostProperty());
proxyPort.textProperty().bindBidirectional(setupViewModel.proxyPortProperty());
languageComboBox.getSelectionModel().selectedItemProperty().addListener((_, _, newValue) -> {
setupViewModel.languageProperty().set(newValue);
logger.info("language changed to {}", newValue);
autoStartCheckBox.selectedProperty().bindBidirectional(viewModule.autoStartProperty());
silentStartupCheckBox.selectedProperty().bindBidirectional(viewModule.silentStartupProperty());
proxySetupComboBox.getSelectionModel().selectedItemProperty().addListener((_, _, newValue) -> viewModule.proxySetupProperty().set(newValue));
proxyHost.textProperty().bindBidirectional(viewModule.proxyHostProperty());
proxyPort.textProperty().bindBidirectional(viewModule.proxyPortProperty());
languageComboBox.getSelectionModel().selectedItemProperty().subscribe(locale -> {
viewModule.languageProperty().set(locale);
logger.info("language changed to {}", locale);
});
aListVersion.textProperty().bindBidirectional(setupViewModel.aListVersionProperty());
}
@FXML
public void checkAListUpdate() {
setupViewModel.checkAListUpdate();
public void proxyTest() {
viewModule.proxyTest();
}
}

View File

@ -32,7 +32,7 @@ import java.util.regex.Matcher;
public class ConfigManager {
private static final Logger logger = LoggerFactory.getLogger(ConfigManager.class);
public static ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
public static final Locale DEFAULT_LANGUAGE = Locale.CHINESE;
public static final Locale DEFAULT_LANGUAGE = Locale.SIMPLIFIED_CHINESE;
private static GuiConfig guiConfig;
private static UpgradeConfig upgradeConfig;
@ -69,7 +69,7 @@ public class ConfigManager {
&& Integer.parseInt(proxyInfo.getPort()) > 0;
}
private static ProxyInfo getProxyInfo() {
public static ProxyInfo getProxyInfo() {
return guiConfig.getProxyInfo();
}
@ -129,6 +129,14 @@ public class ConfigManager {
return ProxySetup.valueOf(StringUtils.upperCase(guiConfig.getProxySetup()));
}
public static void proxyTestUrl(String url) {
guiConfig.setProxyTestUrl(url);
}
public static String proxyTestUrl() {
return guiConfig.getProxyTestUrl();
}
public static void proxySetup(ProxySetup setup) {
guiConfig.setProxySetup(setup.getName());

View File

@ -0,0 +1,31 @@
package cn.octopusyan.alistgui.manager;
import javafx.scene.layout.Pane;
import javafx.stage.Window;
import java.util.HashMap;
import java.util.Map;
/**
* @author octopus_yan
*/
public class WindowsUtil {
public static final Map<Pane, Double> paneXOffset = new HashMap<>();
public static final Map<Pane, Double> paneYOffset = new HashMap<>();
public static void bindDragged(Pane pane) {
Window stage = getStage(pane);
pane.setOnMousePressed(event -> {
paneXOffset.put(pane, stage.getX() - event.getScreenX());
paneYOffset.put(pane, stage.getY() - event.getScreenY());
});
pane.setOnMouseDragged(event -> {
stage.setX(event.getScreenX() + paneXOffset.get(pane));
stage.setY(event.getScreenY() + paneYOffset.get(pane));
});
}
public static Window getStage(Pane pane) {
return pane.getScene().getWindow();
}
}

View File

@ -20,4 +20,5 @@ public class GuiConfig {
private ProxyInfo proxyInfo;
private String proxySetup = ProxySetup.NO_PROXY.getName();
private String language = ConfigManager.DEFAULT_LANGUAGE.toString();
private String proxyTestUrl = "http://";
}

View File

@ -0,0 +1,26 @@
package cn.octopusyan.alistgui.task;
import cn.octopusyan.alistgui.base.BaseTask;
import cn.octopusyan.alistgui.manager.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 代理检测任务
*
* @author octopus_yan
*/
@Slf4j
public class ProxyCheckTask extends BaseTask {
private final String checkUrl;
public ProxyCheckTask(String checkUrl) {
this.checkUrl = checkUrl;
this.updateProgress(0d, 1d);
}
@Override
protected void task() throws Exception {
String response = HttpUtil.getInstance().get(checkUrl, null, null);
log.debug(STR."Proxy check response result => \n\{response}");
}
}

View File

@ -6,7 +6,7 @@ import cn.octopusyan.alistgui.manager.http.HttpUtil;
import cn.octopusyan.alistgui.model.UpgradeConfig;
import cn.octopusyan.alistgui.model.upgrade.UpgradeApp;
import cn.octopusyan.alistgui.util.JsonUtil;
import cn.octopusyan.alistgui.viewModel.SetupViewModel;
import cn.octopusyan.alistgui.viewModel.AboutViewModule;
import com.fasterxml.jackson.databind.JsonNode;
import org.apache.commons.lang3.StringUtils;
@ -16,10 +16,10 @@ import org.apache.commons.lang3.StringUtils;
* @author octopus_yan
*/
public class UpgradeTask extends BaseTask {
private final SetupViewModel vm;
private final AboutViewModule vm;
private final UpgradeApp app;
public UpgradeTask(SetupViewModel viewModel, UpgradeApp app) {
public UpgradeTask(AboutViewModule viewModel, UpgradeApp app) {
this.vm = viewModel;
this.app = app;
}

View File

@ -0,0 +1,73 @@
package cn.octopusyan.alistgui.viewModel;
import cn.octopusyan.alistgui.base.BaseTask;
import cn.octopusyan.alistgui.config.Context;
import cn.octopusyan.alistgui.manager.ConfigManager;
import cn.octopusyan.alistgui.task.UpgradeTask;
import cn.octopusyan.alistgui.util.alert.AlertUtil;
import javafx.beans.property.*;
import javafx.scene.control.ButtonType;
import lombok.extern.slf4j.Slf4j;
/**
* 关于
*
* @author octopus_yan
*/
@Slf4j
public class AboutViewModule {
private final StringProperty aListVersion = new SimpleStringProperty(ConfigManager.aListVersion());
private final StringProperty aListNewVersion = new SimpleStringProperty("");
private final BooleanProperty aListUpgrade = new SimpleBooleanProperty(false);
public AboutViewModule() {
aListVersion.addListener((_, _, newValue) -> ConfigManager.aListVersion(newValue));
}
public Property<String> aListVersionProperty() {
return aListVersion;
}
public BooleanProperty aListUpgradeProperty() {
return aListUpgrade;
}
public StringProperty aListNewVersionProperty() {
return aListNewVersion;
}
/**
* 检查alist更新
*/
public void checkAListUpdate() {
var task = new UpgradeTask(this, ConfigManager.aList());
task.onListen(new BaseTask.Listener() {
@Override
public void onSucceeded() {
AlertUtil.confirm()
.content(STR."""
当前版本 : \{aListVersion.get()}
最新版本 : \{aListNewVersion.get()}
""")
.title(Context.getLanguageBinding("about.alist.update").getValue())
.show(new AlertUtil.OnChoseListener() {
@Override
public void confirm() {
log.info("========confirm==========");
}
@Override
public void cancelOrClose(ButtonType buttonType) {
log.info("========cancelOrClose==========");
}
});
}
@Override
public void onFailed(Throwable throwable) {
AlertUtil.exception(new Exception(throwable)).show();
}
});
task.execute();
}
}

View File

@ -1,13 +1,19 @@
package cn.octopusyan.alistgui.viewModel;
import cn.hutool.core.net.NetUtil;
import cn.octopusyan.alistgui.base.BaseTask;
import cn.octopusyan.alistgui.config.Context;
import cn.octopusyan.alistgui.enums.ProxySetup;
import cn.octopusyan.alistgui.manager.ConfigManager;
import cn.octopusyan.alistgui.task.UpgradeTask;
import cn.octopusyan.alistgui.manager.http.HttpUtil;
import cn.octopusyan.alistgui.task.ProxyCheckTask;
import cn.octopusyan.alistgui.util.alert.AlertUtil;
import javafx.application.Platform;
import javafx.beans.property.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.net.InetSocketAddress;
import java.util.Locale;
/**
@ -15,6 +21,7 @@ import java.util.Locale;
*
* @author octopus_yan
*/
@Slf4j
public class SetupViewModel {
private final BooleanProperty autoStart = new SimpleBooleanProperty(ConfigManager.autoStart());
private final BooleanProperty silentStartup = new SimpleBooleanProperty(ConfigManager.silentStartup());
@ -22,18 +29,22 @@ public class SetupViewModel {
private final StringProperty proxyPort = new SimpleStringProperty(ConfigManager.proxyPort());
private final ObjectProperty<Locale> language = new SimpleObjectProperty<>(ConfigManager.language());
private final ObjectProperty<ProxySetup> proxySetup = new SimpleObjectProperty<>(ConfigManager.proxySetup());
private final StringProperty aListVersion = new SimpleStringProperty(ConfigManager.aListVersion());
private final StringProperty aListNewVersion = new SimpleStringProperty("");
private final BooleanProperty aListUpgrade = new SimpleBooleanProperty(false);
private final StringProperty proxyTestUrl = new SimpleStringProperty(ConfigManager.proxyTestUrl());
public SetupViewModel() {
aListVersion.addListener((_, _, newValue) -> ConfigManager.aListVersion(newValue));
autoStart.addListener((_, _, newValue) -> ConfigManager.autoStart(newValue));
silentStartup.addListener((_, _, newValue) -> ConfigManager.silentStartup(newValue));
proxySetup.addListener((_, _, newValue) -> ConfigManager.proxySetup(newValue));
proxyHost.addListener((_, _, newValue) -> ConfigManager.proxyHost(newValue));
proxyPort.addListener((_, _, newValue) -> ConfigManager.proxyPort(newValue));
proxyTestUrl.addListener((_, _, newValue) -> ConfigManager.proxyTestUrl(newValue));
proxyHost.addListener((_, _, newValue) -> {
ConfigManager.proxyHost(newValue);
checkProxy();
});
proxyPort.addListener((_, _, newValue) -> {
ConfigManager.proxyPort(newValue);
checkProxy();
});
language.addListener((_, _, newValue) -> Context.setLanguage(newValue));
}
@ -61,39 +72,54 @@ public class SetupViewModel {
return proxyPort;
}
public Property<String> aListVersionProperty() {
return aListVersion;
public void proxyTest() {
var checkUrl = AlertUtil.input("URL :", proxyTestUrl.getValue())
.title(Context.getLanguageBinding("proxy.test.title").getValue())
.header(Context.getLanguageBinding("proxy.test.header").getValue())
.getInput();
if (StringUtils.isEmpty(checkUrl)) return;
proxyTestUrl.setValue(checkUrl);
getProxyCheckTask(checkUrl).execute();
}
public BooleanProperty aListUpgradeProperty() {
return aListUpgrade;
private void checkProxy() {
try {
InetSocketAddress address = NetUtil.createAddress(proxyHost.get(), Integer.parseInt(proxyPort.getValue()));
if (NetUtil.isOpen(address, 2000)) {
HttpUtil.getInstance().proxy(proxySetup.get(), ConfigManager.getProxyInfo());
}
} catch (Exception e) {
log.debug(STR."host=\{proxyHost.get()},port=\{proxyPort.get()}");
}
}
public StringProperty aListNewVersionProperty() {
return aListNewVersion;
}
/**
* 检查alist更新
*/
public void checkAListUpdate() {
var task = new UpgradeTask(this, ConfigManager.aList());
private static ProxyCheckTask getProxyCheckTask(String checkUrl) {
var task = new ProxyCheckTask(checkUrl);
final var progress = AlertUtil.progress();
progress.title(Context.getLanguageBinding("proxy.test.title").get());
task.onListen(new BaseTask.Listener() {
@Override
public void onRunning() {
progress.onCancel(task::cancel).show();
}
@Override
public void onSucceeded() {
AlertUtil.info(STR."""
当前版本 : \{aListVersion.get()}
最新版本 : \{aListNewVersion.get()}
""")
.title("AList 更新提示")
.show();
Platform.runLater(progress::close);
AlertUtil.info(Context.getLanguageBinding("proxy.test.result.success").getValue()).show();
}
@Override
public void onFailed(Throwable throwable) {
AlertUtil.exception(new Exception(throwable)).show();
Platform.runLater(progress::close);
final var tmp = Context.getLanguageBinding("proxy.test.result.failed").getValue();
AlertUtil.error(tmp + throwable.getMessage()).show();
}
});
task.execute();
return task;
}
}