Compare commits
3 Commits
4dc13bb8f1
...
08b4ad98ed
Author | SHA1 | Date | |
---|---|---|---|
08b4ad98ed | |||
3414f0f421 | |||
9bbc3f488f |
2
.github/workflows/release.yml
vendored
@ -118,7 +118,7 @@ jobs:
|
|||||||
- name: Build with Maven
|
- name: Build with Maven
|
||||||
run: |
|
run: |
|
||||||
mvn clean package -f pom.xml
|
mvn clean package -f pom.xml
|
||||||
mkdir zipball && cp target/*.zip zipball
|
mkdir zipball && cp ../target/*.zip zipball
|
||||||
|
|
||||||
- name: Upload AListGUI to Github
|
- name: Upload AListGUI to Github
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
1
.gitignore
vendored
@ -8,6 +8,7 @@ target/
|
|||||||
!**/src/test/**/target/
|
!**/src/test/**/target/
|
||||||
/bin/
|
/bin/
|
||||||
gui.yaml
|
gui.yaml
|
||||||
|
upgrade.exe
|
||||||
|
|
||||||
### IntelliJ IDEA ###
|
### IntelliJ IDEA ###
|
||||||
.idea/
|
.idea/
|
||||||
|
296
gui/pom.xml
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>cn.octopusyan</groupId>
|
||||||
|
<artifactId>alist-gui</artifactId>
|
||||||
|
<version>1.0.1</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>gui</artifactId>
|
||||||
|
<version>${parent.version}</version>
|
||||||
|
<name>alist-gui</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>21</maven.compiler.source>
|
||||||
|
<maven.compiler.target>21</maven.compiler.target>
|
||||||
|
<java.version>21</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
|
<exec.mainClass>cn.octopusyan.alistgui.AppLauncher</exec.mainClass>
|
||||||
|
<cssSrcPath>${project.basedir}/src/main/resources/css</cssSrcPath>
|
||||||
|
<cssTargetPath>${project.basedir}/target/classes/css</cssTargetPath>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- javafx -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-controls</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-fxml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mkpaz.github.io/atlantafx/ -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.mkpaz</groupId>
|
||||||
|
<artifactId>atlantafx-base</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- slf4j -->
|
||||||
|
<!-- https://slf4j.org/manual.html -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- common -->
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-exec -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-exec</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- hutool -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- lombok -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- jackson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-yaml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://kordamp.org/ikonli/ -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.kordamp.ikonli</groupId>
|
||||||
|
<artifactId>ikonli-javafx</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.kordamp.ikonli</groupId>
|
||||||
|
<artifactId>ikonli-fontawesome-pack</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.gluonhq</groupId>
|
||||||
|
<artifactId>emoji</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
<excludes>
|
||||||
|
<exclude>css/*.scss</exclude>
|
||||||
|
</excludes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>21</source>
|
||||||
|
<target>21</target>
|
||||||
|
<compilerArgs>--enable-preview</compilerArgs>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- https://github.com/HebiRobotics/sass-cli-maven-plugin -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>us.hebi.sass</groupId>
|
||||||
|
<artifactId>sass-cli-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<sassVersion>1.78.0</sassVersion>
|
||||||
|
<args> <!-- Any argument that should be forwarded to the sass cli -->
|
||||||
|
<arg>${cssSrcPath}/root.scss:${cssTargetPath}/root.css</arg>
|
||||||
|
<arg>${cssSrcPath}/root-view.scss:${cssTargetPath}/root-view.css</arg>
|
||||||
|
<arg>${cssSrcPath}/main-view.scss:${cssTargetPath}/main-view.css</arg>
|
||||||
|
<arg>${cssSrcPath}/setup-view.scss:${cssTargetPath}/setup-view.css</arg>
|
||||||
|
<arg>${cssSrcPath}/about-view.scss:${cssTargetPath}/about-view.css</arg>
|
||||||
|
<arg>${cssSrcPath}/admin-panel.scss:${cssTargetPath}/admin-panel.css</arg>
|
||||||
|
<arg>--no-source-map</arg>
|
||||||
|
</args>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sass-exec</id>
|
||||||
|
<phase>generate-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<stripDebug>true</stripDebug>
|
||||||
|
<compress>2</compress>
|
||||||
|
<noHeaderFiles>true</noHeaderFiles>
|
||||||
|
<noManPages>true</noManPages>
|
||||||
|
<launcher>alistgui</launcher>
|
||||||
|
<jlinkImageName>app</jlinkImageName>
|
||||||
|
<jlinkZipName>app</jlinkZipName>
|
||||||
|
<mainClass>cn.octopusyan.alistgui/${exec.mainClass}</mainClass>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<!-- Default configuration for running with: mvn clean javafx:run -->
|
||||||
|
<id>default-cli</id>
|
||||||
|
<configuration>
|
||||||
|
<stripDebug>true</stripDebug>
|
||||||
|
<compress>2</compress>
|
||||||
|
<noHeaderFiles>true</noHeaderFiles>
|
||||||
|
<noManPages>true</noManPages>
|
||||||
|
<launcher>alist-gui</launcher>
|
||||||
|
<jlinkImageName>app</jlinkImageName>
|
||||||
|
<jlinkZipName>app</jlinkZipName>
|
||||||
|
<mainClass>cn.octopusyan.alistgui/${exec.mainClass}</mainClass>
|
||||||
|
<options>
|
||||||
|
<option>--enable-preview</option>
|
||||||
|
<!-- <option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005</option>-->
|
||||||
|
</options>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- https://github.com/fvarrui/JavaPackager -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.github.fvarrui</groupId>
|
||||||
|
<artifactId>javapackager</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>${exec.mainClass}</mainClass>
|
||||||
|
<bundleJre>true</bundleJre>
|
||||||
|
<generateInstaller>false</generateInstaller>
|
||||||
|
<copyDependencies>true</copyDependencies>
|
||||||
|
<assetsDir>${project.basedir}/src/main/resources/assets</assetsDir>
|
||||||
|
<vmArgs>
|
||||||
|
<arg>--enable-preview</arg>
|
||||||
|
<arg>-Xmx100m</arg>
|
||||||
|
</vmArgs>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>windows</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>package</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<platform>windows</platform>
|
||||||
|
<zipballName>${project.name}-windows</zipballName>
|
||||||
|
<createZipball>true</createZipball>
|
||||||
|
<winConfig>
|
||||||
|
<headerType>gui</headerType>
|
||||||
|
<generateMsi>false</generateMsi>
|
||||||
|
</winConfig>
|
||||||
|
<additionalResources>
|
||||||
|
<additionalResource>${project.basedir}/src/main/resources/static/upgrade.exe
|
||||||
|
</additionalResource>
|
||||||
|
</additionalResources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>windows-nojre</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>package</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<zipballName>${project.name}-windows-nojre</zipballName>
|
||||||
|
<platform>windows</platform>
|
||||||
|
<createZipball>true</createZipball>
|
||||||
|
<bundleJre>false</bundleJre>
|
||||||
|
<winConfig>
|
||||||
|
<headerType>gui</headerType>
|
||||||
|
<generateMsi>false</generateMsi>
|
||||||
|
</winConfig>
|
||||||
|
<additionalResources>
|
||||||
|
<additionalResource>${project.basedir}/src/main/resources/static/upgrade.exe
|
||||||
|
</additionalResource>
|
||||||
|
</additionalResources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>3.3.1</version>
|
||||||
|
<configuration>
|
||||||
|
<nonFilteredFileExtensions>
|
||||||
|
<nonFilteredFileExtension>exe</nonFilteredFileExtension>
|
||||||
|
</nonFilteredFileExtensions>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-resources</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<!--打成jar包后复制到的路径-->
|
||||||
|
<outputDirectory>../target</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<!--项目中需要复制的文件路径-->
|
||||||
|
<directory>${project.basedir}/target</directory>
|
||||||
|
<includes>
|
||||||
|
<include>*.zip</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
@ -1,5 +1,6 @@
|
|||||||
package cn.octopusyan.alistgui;
|
package cn.octopusyan.alistgui;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.octopusyan.alistgui.config.Constants;
|
import cn.octopusyan.alistgui.config.Constants;
|
||||||
import cn.octopusyan.alistgui.config.Context;
|
import cn.octopusyan.alistgui.config.Context;
|
||||||
import cn.octopusyan.alistgui.manager.ConfigManager;
|
import cn.octopusyan.alistgui.manager.ConfigManager;
|
||||||
@ -7,6 +8,7 @@ import cn.octopusyan.alistgui.manager.SystemTrayManager;
|
|||||||
import cn.octopusyan.alistgui.manager.http.HttpConfig;
|
import cn.octopusyan.alistgui.manager.http.HttpConfig;
|
||||||
import cn.octopusyan.alistgui.manager.http.HttpUtil;
|
import cn.octopusyan.alistgui.manager.http.HttpUtil;
|
||||||
import cn.octopusyan.alistgui.manager.thread.ThreadPoolManager;
|
import cn.octopusyan.alistgui.manager.thread.ThreadPoolManager;
|
||||||
|
import cn.octopusyan.alistgui.model.upgrade.Gui;
|
||||||
import cn.octopusyan.alistgui.util.ProcessesUtil;
|
import cn.octopusyan.alistgui.util.ProcessesUtil;
|
||||||
import cn.octopusyan.alistgui.view.alert.AlertUtil;
|
import cn.octopusyan.alistgui.view.alert.AlertUtil;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
@ -22,6 +24,8 @@ import java.io.*;
|
|||||||
import java.net.*;
|
import java.net.*;
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
|
||||||
@ -31,11 +35,25 @@ public class Application extends javafx.application.Application {
|
|||||||
private static Stage primaryStage;
|
private static Stage primaryStage;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init() {
|
public void init() throws Exception {
|
||||||
logger.info("application init ...");
|
logger.info("application init ...");
|
||||||
|
|
||||||
// 单例模式检查
|
long delay = 0L;
|
||||||
makeSingle();
|
// 更新重启检查
|
||||||
|
File upgradeFile = new File(Constants.DATA_DIR_PATH + File.separator + new Gui().getReleaseFile());
|
||||||
|
logger.error("{}{}{}", Constants.DATA_DIR_PATH, File.separator, new Gui().getReleaseFile());
|
||||||
|
if (upgradeFile.exists()) {
|
||||||
|
logger.error("upgradeFile.exists");
|
||||||
|
FileUtil.del(upgradeFile);
|
||||||
|
delay = 1000;
|
||||||
|
}
|
||||||
|
new Timer().schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// 单例模式检查
|
||||||
|
makeSingle();
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
|
|
||||||
// 初始化客户端配置
|
// 初始化客户端配置
|
||||||
ConfigManager.load();
|
ConfigManager.load();
|
||||||
@ -85,7 +103,7 @@ public class Application extends javafx.application.Application {
|
|||||||
// 启动主界面
|
// 启动主界面
|
||||||
primaryStage.getIcons().add(new Image(Objects.requireNonNull(this.getClass().getResourceAsStream("/assets/logo.png"))));
|
primaryStage.getIcons().add(new Image(Objects.requireNonNull(this.getClass().getResourceAsStream("/assets/logo.png"))));
|
||||||
primaryStage.initStyle(StageStyle.TRANSPARENT);
|
primaryStage.initStyle(StageStyle.TRANSPARENT);
|
||||||
primaryStage.setTitle(String.format("%s v%s", Constants.APP_TITLE, Constants.APP_VERSION));
|
primaryStage.setTitle(String.format("%s %s", Constants.APP_TITLE, Constants.APP_VERSION));
|
||||||
Scene scene = Context.initScene();
|
Scene scene = Context.initScene();
|
||||||
primaryStage.setScene(scene);
|
primaryStage.setScene(scene);
|
||||||
|
|
||||||
@ -147,6 +165,7 @@ public class Application extends javafx.application.Application {
|
|||||||
instanceCheckLatch.countDown();
|
instanceCheckLatch.countDown();
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
logger.error(STR."====\{instanceId}====");
|
||||||
try (
|
try (
|
||||||
Socket clientSocket = serverSocket.accept();
|
Socket clientSocket = serverSocket.accept();
|
||||||
BufferedReader in = new BufferedReader(
|
BufferedReader in = new BufferedReader(
|
@ -68,7 +68,8 @@ public abstract class BaseController<VM extends BaseViewModel> implements Initia
|
|||||||
case Labeled labeled -> labeled.textProperty().bind(Context.getLanguageBinding(i18n.key()));
|
case Labeled labeled -> labeled.textProperty().bind(Context.getLanguageBinding(i18n.key()));
|
||||||
case Tab tab -> tab.textProperty().bind(Context.getLanguageBinding(i18n.key()));
|
case Tab tab -> tab.textProperty().bind(Context.getLanguageBinding(i18n.key()));
|
||||||
case MenuItem mi -> mi.textProperty().bind(Context.getLanguageBinding(i18n.key()));
|
case MenuItem mi -> mi.textProperty().bind(Context.getLanguageBinding(i18n.key()));
|
||||||
default -> {}
|
default -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,7 +15,7 @@ public class Constants {
|
|||||||
public static final String APP_NAME = PropertiesUtils.getInstance().getProperty("app.name");
|
public static final String APP_NAME = PropertiesUtils.getInstance().getProperty("app.name");
|
||||||
public static final String APP_VERSION = PropertiesUtils.getInstance().getProperty("app.version");
|
public static final String APP_VERSION = PropertiesUtils.getInstance().getProperty("app.version");
|
||||||
|
|
||||||
public static final String DATA_DIR_PATH = Paths.get(".").toFile().getAbsolutePath();
|
public static final String DATA_DIR_PATH = Paths.get("").toFile().getAbsolutePath();
|
||||||
public static final String BIN_DIR_PATH = STR."\{DATA_DIR_PATH}\{File.separator}bin";
|
public static final String BIN_DIR_PATH = STR."\{DATA_DIR_PATH}\{File.separator}bin";
|
||||||
public static final String TMP_DIR_PATH = System.getProperty("java.io.tmpdir") + APP_NAME;
|
public static final String TMP_DIR_PATH = System.getProperty("java.io.tmpdir") + APP_NAME;
|
||||||
|
|
@ -1,7 +1,6 @@
|
|||||||
package cn.octopusyan.alistgui.controller;
|
package cn.octopusyan.alistgui.controller;
|
||||||
|
|
||||||
import cn.octopusyan.alistgui.base.BaseController;
|
import cn.octopusyan.alistgui.base.BaseController;
|
||||||
import cn.octopusyan.alistgui.config.I18n;
|
|
||||||
import cn.octopusyan.alistgui.manager.ConfigManager;
|
import cn.octopusyan.alistgui.manager.ConfigManager;
|
||||||
import cn.octopusyan.alistgui.viewModel.AboutViewModule;
|
import cn.octopusyan.alistgui.viewModel.AboutViewModule;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
@ -22,16 +21,12 @@ public class AboutController extends BaseController<AboutViewModule> {
|
|||||||
|
|
||||||
public Label aListVersion;
|
public Label aListVersion;
|
||||||
|
|
||||||
@I18n(key = "about.alist.version")
|
|
||||||
public Label aListVersionLabel;
|
public Label aListVersionLabel;
|
||||||
|
|
||||||
@I18n(key = "about.app.version")
|
|
||||||
public Label appVersionLabel;
|
public Label appVersionLabel;
|
||||||
|
|
||||||
@I18n(key = "about.app.update")
|
|
||||||
public Button checkAppVersion;
|
public Button checkAppVersion;
|
||||||
|
|
||||||
@I18n(key = "about.alist.update")
|
|
||||||
public Button checkAListVersion;
|
public Button checkAListVersion;
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -2,7 +2,6 @@ package cn.octopusyan.alistgui.controller;
|
|||||||
|
|
||||||
import cn.octopusyan.alistgui.base.BaseController;
|
import cn.octopusyan.alistgui.base.BaseController;
|
||||||
import cn.octopusyan.alistgui.config.Context;
|
import cn.octopusyan.alistgui.config.Context;
|
||||||
import cn.octopusyan.alistgui.config.I18n;
|
|
||||||
import cn.octopusyan.alistgui.manager.AListManager;
|
import cn.octopusyan.alistgui.manager.AListManager;
|
||||||
import cn.octopusyan.alistgui.manager.ConsoleLog;
|
import cn.octopusyan.alistgui.manager.ConsoleLog;
|
||||||
import cn.octopusyan.alistgui.util.FxmlUtil;
|
import cn.octopusyan.alistgui.util.FxmlUtil;
|
||||||
@ -32,28 +31,20 @@ public class MainController extends BaseController<MainViewModel> {
|
|||||||
public VBox logArea;
|
public VBox logArea;
|
||||||
public ScrollPane logAreaSp;
|
public ScrollPane logAreaSp;
|
||||||
|
|
||||||
@I18n(key = "main.status.label-stop")
|
|
||||||
public Button statusLabel;
|
public Button statusLabel;
|
||||||
|
|
||||||
@I18n(key = "main.control.start")
|
|
||||||
public Button startButton;
|
public Button startButton;
|
||||||
|
|
||||||
@I18n(key = "main.control.password")
|
|
||||||
public Button passwordButton;
|
public Button passwordButton;
|
||||||
|
|
||||||
@I18n(key = "main.control.restart")
|
|
||||||
public Button restartButton;
|
public Button restartButton;
|
||||||
|
|
||||||
@I18n(key = "main.control.more")
|
|
||||||
public MenuButton moreButton;
|
public MenuButton moreButton;
|
||||||
|
|
||||||
@I18n(key = "main.more.browser")
|
|
||||||
public MenuItem browserButton;
|
public MenuItem browserButton;
|
||||||
|
|
||||||
@I18n(key = "main.more.open-config")
|
|
||||||
public MenuItem configButton;
|
public MenuItem configButton;
|
||||||
|
|
||||||
@I18n(key = "main.more.open-log")
|
|
||||||
public MenuItem logButton;
|
public MenuItem logButton;
|
||||||
|
|
||||||
private PasswordController controller;
|
private PasswordController controller;
|
@ -4,7 +4,6 @@ import atlantafx.base.controls.Popover;
|
|||||||
import cn.hutool.core.swing.clipboard.ClipboardUtil;
|
import cn.hutool.core.swing.clipboard.ClipboardUtil;
|
||||||
import cn.octopusyan.alistgui.base.BaseController;
|
import cn.octopusyan.alistgui.base.BaseController;
|
||||||
import cn.octopusyan.alistgui.config.Context;
|
import cn.octopusyan.alistgui.config.Context;
|
||||||
import cn.octopusyan.alistgui.config.I18n;
|
|
||||||
import cn.octopusyan.alistgui.manager.AListManager;
|
import cn.octopusyan.alistgui.manager.AListManager;
|
||||||
import cn.octopusyan.alistgui.viewModel.AdminPanelViewModel;
|
import cn.octopusyan.alistgui.viewModel.AdminPanelViewModel;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
@ -27,14 +26,11 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
public class PasswordController extends BaseController<AdminPanelViewModel> {
|
public class PasswordController extends BaseController<AdminPanelViewModel> {
|
||||||
public AnchorPane adminPanel;
|
public AnchorPane adminPanel;
|
||||||
|
|
||||||
@I18n(key = "admin.pwd.toptip")
|
|
||||||
public Label toptip;
|
public Label toptip;
|
||||||
@I18n(key = "admin.pwd.user-field")
|
|
||||||
public Label usernameLabel;
|
public Label usernameLabel;
|
||||||
public TextField usernameField;
|
public TextField usernameField;
|
||||||
@FXML
|
@FXML
|
||||||
public Button copyUsername;
|
public Button copyUsername;
|
||||||
@I18n(key = "admin.pwd.pwd-field")
|
|
||||||
public Label passwordLabel;
|
public Label passwordLabel;
|
||||||
public PasswordField passwordField;
|
public PasswordField passwordField;
|
||||||
public Button refreshPassword;
|
public Button refreshPassword;
|
@ -3,7 +3,6 @@ package cn.octopusyan.alistgui.controller;
|
|||||||
import atlantafx.base.controls.ModalPane;
|
import atlantafx.base.controls.ModalPane;
|
||||||
import cn.octopusyan.alistgui.base.BaseController;
|
import cn.octopusyan.alistgui.base.BaseController;
|
||||||
import cn.octopusyan.alistgui.config.Context;
|
import cn.octopusyan.alistgui.config.Context;
|
||||||
import cn.octopusyan.alistgui.config.I18n;
|
|
||||||
import cn.octopusyan.alistgui.manager.ConfigManager;
|
import cn.octopusyan.alistgui.manager.ConfigManager;
|
||||||
import cn.octopusyan.alistgui.manager.SystemTrayManager;
|
import cn.octopusyan.alistgui.manager.SystemTrayManager;
|
||||||
import cn.octopusyan.alistgui.util.ViewUtil;
|
import cn.octopusyan.alistgui.util.ViewUtil;
|
||||||
@ -41,19 +40,13 @@ public class RootController extends BaseController<RootViewModel> {
|
|||||||
// 界面
|
// 界面
|
||||||
public TabPane tabPane;
|
public TabPane tabPane;
|
||||||
|
|
||||||
@I18n(key = "root.tab.main")
|
|
||||||
public Tab mainTab;
|
public Tab mainTab;
|
||||||
@I18n(key = "root.tab.setup")
|
|
||||||
public Tab setupTab;
|
public Tab setupTab;
|
||||||
@I18n(key = "root.tab.about")
|
|
||||||
public Tab aboutTab;
|
public Tab aboutTab;
|
||||||
|
|
||||||
// footer
|
// footer
|
||||||
@I18n(key = "root.foot.doc")
|
|
||||||
public Button document;
|
public Button document;
|
||||||
@I18n(key = "root.foot.github")
|
|
||||||
public Button github;
|
public Button github;
|
||||||
@I18n(key = "root.foot.sponsor")
|
|
||||||
public Button sponsor;
|
public Button sponsor;
|
||||||
|
|
||||||
private final ModalPane modalPane = new ModalPane();
|
private final ModalPane modalPane = new ModalPane();
|
@ -3,7 +3,6 @@ package cn.octopusyan.alistgui.controller;
|
|||||||
import atlantafx.base.theme.Theme;
|
import atlantafx.base.theme.Theme;
|
||||||
import cn.octopusyan.alistgui.base.BaseController;
|
import cn.octopusyan.alistgui.base.BaseController;
|
||||||
import cn.octopusyan.alistgui.config.Context;
|
import cn.octopusyan.alistgui.config.Context;
|
||||||
import cn.octopusyan.alistgui.config.I18n;
|
|
||||||
import cn.octopusyan.alistgui.enums.ProxySetup;
|
import cn.octopusyan.alistgui.enums.ProxySetup;
|
||||||
import cn.octopusyan.alistgui.manager.ConfigManager;
|
import cn.octopusyan.alistgui.manager.ConfigManager;
|
||||||
import cn.octopusyan.alistgui.view.ProxySetupCell;
|
import cn.octopusyan.alistgui.view.ProxySetupCell;
|
||||||
@ -31,29 +30,20 @@ public class SetupController extends BaseController<SetupViewModel> implements I
|
|||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
public VBox setupView;
|
public VBox setupView;
|
||||||
@I18n(key = "setup.auto-start.label")
|
|
||||||
public CheckBox autoStartCheckBox;
|
public CheckBox autoStartCheckBox;
|
||||||
@I18n(key = "setup.silent-startup.label")
|
|
||||||
public CheckBox silentStartupCheckBox;
|
public CheckBox silentStartupCheckBox;
|
||||||
@I18n(key = "setup.close-to-tray.label")
|
|
||||||
public CheckBox closeToTrayCheckBox;
|
public CheckBox closeToTrayCheckBox;
|
||||||
@I18n(key = "setup.theme")
|
|
||||||
public Label themeLabel;
|
public Label themeLabel;
|
||||||
public ComboBox<Theme> themeComboBox;
|
public ComboBox<Theme> themeComboBox;
|
||||||
@I18n(key = "setup.language")
|
|
||||||
public Label languageLabel;
|
public Label languageLabel;
|
||||||
public ComboBox<Locale> languageComboBox;
|
public ComboBox<Locale> languageComboBox;
|
||||||
@I18n(key = "setup.proxy")
|
|
||||||
public Label proxySetupLabel;
|
public Label proxySetupLabel;
|
||||||
public ComboBox<ProxySetup> proxySetupComboBox;
|
public ComboBox<ProxySetup> proxySetupComboBox;
|
||||||
public Pane proxySetupPane;
|
public Pane proxySetupPane;
|
||||||
@I18n(key = "setup.proxy.test")
|
|
||||||
public Button proxyCheck;
|
public Button proxyCheck;
|
||||||
public TextField proxyHost;
|
public TextField proxyHost;
|
||||||
public TextField proxyPort;
|
public TextField proxyPort;
|
||||||
@I18n(key = "setup.proxy.host")
|
|
||||||
public Label hostLabel;
|
public Label hostLabel;
|
||||||
@I18n(key = "setup.proxy.port")
|
|
||||||
public Label portLabel;
|
public Label portLabel;
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -62,6 +62,10 @@ public class DownloadUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void unzip(UpgradeApp app) {
|
public static void unzip(UpgradeApp app) {
|
||||||
|
unzip(app, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unzip(UpgradeApp app, boolean del) {
|
||||||
String parentPath = app instanceof AList ? Constants.BIN_DIR_PATH : Constants.DATA_DIR_PATH;
|
String parentPath = app instanceof AList ? Constants.BIN_DIR_PATH : Constants.DATA_DIR_PATH;
|
||||||
|
|
||||||
File file = new File(parentPath + File.separator + app.getReleaseFile());
|
File file = new File(parentPath + File.separator + app.getReleaseFile());
|
||||||
@ -93,6 +97,6 @@ public class DownloadUtil {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 解压完成后删除
|
// 解压完成后删除
|
||||||
FileUtil.del(file);
|
if (del) FileUtil.del(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -53,7 +53,7 @@ public class ProcessesUtil {
|
|||||||
commandLine = CommandLine.parse(command);
|
commandLine = CommandLine.parse(command);
|
||||||
int execute = 0;
|
int execute = 0;
|
||||||
try {
|
try {
|
||||||
execute = executor.execute(commandLine);
|
executor.execute(commandLine, new DefaultExecuteResultHandler());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("exec", e);
|
log.error("exec", e);
|
||||||
}
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package cn.octopusyan.alistgui.util;
|
package cn.octopusyan.alistgui.util;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册表编辑
|
* 注册表编辑
|
||||||
*
|
*
|
||||||
@ -45,6 +47,7 @@ public class Registry {
|
|||||||
UNLOAD,
|
UNLOAD,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
public enum Root {
|
public enum Root {
|
||||||
HKCR("HKEY_CLASSES_ROOT"),
|
HKCR("HKEY_CLASSES_ROOT"),
|
||||||
HKCU("HKEY_CURRENT_USER"),
|
HKCU("HKEY_CURRENT_USER"),
|
||||||
@ -59,9 +62,6 @@ public class Registry {
|
|||||||
this.path = path;
|
this.path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPath() {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum DataType {
|
public enum DataType {
|
@ -1,6 +1,5 @@
|
|||||||
package cn.octopusyan.alistgui.viewModel;
|
package cn.octopusyan.alistgui.viewModel;
|
||||||
|
|
||||||
import cn.octopusyan.alistgui.Application;
|
|
||||||
import cn.octopusyan.alistgui.base.BaseViewModel;
|
import cn.octopusyan.alistgui.base.BaseViewModel;
|
||||||
import cn.octopusyan.alistgui.config.Constants;
|
import cn.octopusyan.alistgui.config.Constants;
|
||||||
import cn.octopusyan.alistgui.config.Context;
|
import cn.octopusyan.alistgui.config.Context;
|
||||||
@ -142,24 +141,20 @@ public class AboutViewModule extends BaseViewModel {
|
|||||||
if (upgrade)
|
if (upgrade)
|
||||||
DownloadUtil.startDownload(app, newVersion, () -> {
|
DownloadUtil.startDownload(app, newVersion, () -> {
|
||||||
|
|
||||||
// 下载完成后,解压并删除文件
|
|
||||||
DownloadUtil.unzip(app);
|
|
||||||
|
|
||||||
// 解压后
|
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
switch (app) {
|
switch (app) {
|
||||||
case AList _ -> {
|
case AList _ -> {
|
||||||
|
// 下载完成后,解压并删除文件
|
||||||
|
DownloadUtil.unzip(app);
|
||||||
// 设置应用版本
|
// 设置应用版本
|
||||||
aListVersion.setValue(aListNewVersion.getValue());
|
aListVersion.setValue(aListNewVersion.getValue());
|
||||||
AListManager.restart();
|
AListManager.restart();
|
||||||
}
|
}
|
||||||
case Gui _ -> {
|
case Gui _ -> {
|
||||||
log.info(STR."guiNewVersion => \{guiNewVersion.get()}");
|
log.info(STR."guiNewVersion => \{guiNewVersion.get()}");
|
||||||
// 重启
|
// 启动升级程序
|
||||||
Platform.setImplicitExit(true);
|
ProcessesUtil.init(Constants.DATA_DIR_PATH).exec("upgrade.exe");
|
||||||
Application.getPrimaryStage().close();
|
Platform.exit();
|
||||||
|
|
||||||
ProcessesUtil.init(Constants.DATA_DIR_PATH).exec(STR."\{Constants.APP_NAME}.exe");
|
|
||||||
}
|
}
|
||||||
default -> throw new IllegalStateException(STR."Unexpected value: \{app}");
|
default -> throw new IllegalStateException(STR."Unexpected value: \{app}");
|
||||||
}
|
}
|
@ -24,4 +24,5 @@ module cn.octopusyan.alistgui {
|
|||||||
opens cn.octopusyan.alistgui.controller to javafx.fxml;
|
opens cn.octopusyan.alistgui.controller to javafx.fxml;
|
||||||
opens cn.octopusyan.alistgui.base to com.fasterxml.jackson.databind;
|
opens cn.octopusyan.alistgui.base to com.fasterxml.jackson.databind;
|
||||||
opens cn.octopusyan.alistgui.model.upgrade to com.fasterxml.jackson.databind;
|
opens cn.octopusyan.alistgui.model.upgrade to com.fasterxml.jackson.databind;
|
||||||
|
exports cn.octopusyan.alistgui.model.upgrade;
|
||||||
}
|
}
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 960 B After Width: | Height: | Size: 960 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
352
pom.xml
@ -6,8 +6,9 @@
|
|||||||
|
|
||||||
<groupId>cn.octopusyan</groupId>
|
<groupId>cn.octopusyan</groupId>
|
||||||
<artifactId>alist-gui</artifactId>
|
<artifactId>alist-gui</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.0.1</version>
|
||||||
<name>alist-gui</name>
|
<name>alist-gui</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<organization>
|
<organization>
|
||||||
<name>octopus_yan</name>
|
<name>octopus_yan</name>
|
||||||
@ -17,6 +18,11 @@
|
|||||||
<inceptionYear>2024</inceptionYear>
|
<inceptionYear>2024</inceptionYear>
|
||||||
<description>AList GUI</description>
|
<description>AList GUI</description>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>upgrade</module>
|
||||||
|
<module>gui</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>21</maven.compiler.source>
|
<maven.compiler.source>21</maven.compiler.source>
|
||||||
<maven.compiler.target>21</maven.compiler.target>
|
<maven.compiler.target>21</maven.compiler.target>
|
||||||
@ -24,9 +30,7 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
<exec.mainClass>cn.octopusyan.alistgui.AppLauncher</exec.mainClass>
|
<project.version>1.0.1</project.version>
|
||||||
<cssSrcPath>${project.basedir}/src/main/resources/css</cssSrcPath>
|
|
||||||
<cssTargetPath>${project.basedir}/target/classes/css</cssTargetPath>
|
|
||||||
|
|
||||||
<junit.version>5.10.0</junit.version>
|
<junit.version>5.10.0</junit.version>
|
||||||
<javafx.version>21.0.4</javafx.version>
|
<javafx.version>21.0.4</javafx.version>
|
||||||
@ -42,97 +46,101 @@
|
|||||||
<gluonhq-emoji.version>1.0.1</gluonhq-emoji.version>
|
<gluonhq-emoji.version>1.0.1</gluonhq-emoji.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencyManagement>
|
||||||
<!-- javafx -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.openjfx</groupId>
|
|
||||||
<artifactId>javafx-controls</artifactId>
|
|
||||||
<version>${javafx.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.openjfx</groupId>
|
|
||||||
<artifactId>javafx-fxml</artifactId>
|
|
||||||
<version>${javafx.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- https://mkpaz.github.io/atlantafx/ -->
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>io.github.mkpaz</groupId>
|
|
||||||
<artifactId>atlantafx-base</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- slf4j -->
|
<!-- javafx -->
|
||||||
<!-- https://slf4j.org/manual.html -->
|
<dependency>
|
||||||
<dependency>
|
<groupId>org.openjfx</groupId>
|
||||||
<groupId>org.slf4j</groupId>
|
<artifactId>javafx-controls</artifactId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<version>${javafx.version}</version>
|
||||||
<version>${slf4j.version}</version>
|
</dependency>
|
||||||
</dependency>
|
<dependency>
|
||||||
<dependency>
|
<groupId>org.openjfx</groupId>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<artifactId>javafx-fxml</artifactId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<version>${javafx.version}</version>
|
||||||
<version>${logback.version}</version>
|
</dependency>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>ch.qos.logback</groupId>
|
|
||||||
<artifactId>logback-core</artifactId>
|
|
||||||
<version>${logback.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- common -->
|
<!-- https://mkpaz.github.io/atlantafx/ -->
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
|
<dependency>
|
||||||
<dependency>
|
<groupId>io.github.mkpaz</groupId>
|
||||||
<groupId>org.apache.commons</groupId>
|
<artifactId>atlantafx-base</artifactId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<version>2.0.1</version>
|
||||||
<version>${common-lang3.version}</version>
|
</dependency>
|
||||||
</dependency>
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-exec -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
<artifactId>commons-exec</artifactId>
|
|
||||||
<version>${common-exec.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- hutool -->
|
<!-- slf4j -->
|
||||||
<dependency>
|
<!-- https://slf4j.org/manual.html -->
|
||||||
<groupId>cn.hutool</groupId>
|
<dependency>
|
||||||
<artifactId>hutool-core</artifactId>
|
<groupId>org.slf4j</groupId>
|
||||||
<version>${hutool.version}</version>
|
<artifactId>slf4j-api</artifactId>
|
||||||
</dependency>
|
<version>${slf4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<version>${logback.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-core</artifactId>
|
||||||
|
<version>${logback.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- lombok -->
|
<!-- common -->
|
||||||
<dependency>
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
|
||||||
<groupId>org.projectlombok</groupId>
|
<dependency>
|
||||||
<artifactId>lombok</artifactId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<version>${lombok.version}</version>
|
<artifactId>commons-lang3</artifactId>
|
||||||
</dependency>
|
<version>${common-lang3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-exec -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-exec</artifactId>
|
||||||
|
<version>${common-exec.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- jackson -->
|
<!-- hutool -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
<groupId>cn.hutool</groupId>
|
||||||
<artifactId>jackson-dataformat-yaml</artifactId>
|
<artifactId>hutool-core</artifactId>
|
||||||
<version>${jackson.version}</version>
|
<version>${hutool.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://kordamp.org/ikonli/ -->
|
<!-- lombok -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.kordamp.ikonli</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>ikonli-javafx</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>${ikonli.version}</version>
|
<version>${lombok.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.kordamp.ikonli</groupId>
|
|
||||||
<artifactId>ikonli-fontawesome-pack</artifactId>
|
|
||||||
<version>${ikonli.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.gluonhq</groupId>
|
|
||||||
<artifactId>emoji</artifactId>
|
|
||||||
<version>${gluonhq-emoji.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
<!-- jackson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-yaml</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://kordamp.org/ikonli/ -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.kordamp.ikonli</groupId>
|
||||||
|
<artifactId>ikonli-javafx</artifactId>
|
||||||
|
<version>${ikonli.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.kordamp.ikonli</groupId>
|
||||||
|
<artifactId>ikonli-fontawesome-pack</artifactId>
|
||||||
|
<version>${ikonli.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.gluonhq</groupId>
|
||||||
|
<artifactId>emoji</artifactId>
|
||||||
|
<version>${gluonhq-emoji.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
<pluginRepositories>
|
<pluginRepositories>
|
||||||
<pluginRepository>
|
<pluginRepository>
|
||||||
@ -150,153 +158,35 @@
|
|||||||
</pluginRepositories>
|
</pluginRepositories>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<resources>
|
<pluginManagement>
|
||||||
<resource>
|
<plugins>
|
||||||
<directory>src/main/resources</directory>
|
|
||||||
<filtering>true</filtering>
|
|
||||||
<excludes>
|
|
||||||
<exclude>css/*.scss</exclude>
|
|
||||||
</excludes>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
|
|
||||||
<plugins>
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.13.0</version>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
<plugin>
|
<!-- https://github.com/HebiRobotics/sass-cli-maven-plugin -->
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<groupId>us.hebi.sass</groupId>
|
||||||
<version>3.13.0</version>
|
<artifactId>sass-cli-maven-plugin</artifactId>
|
||||||
<configuration>
|
<version>1.0.3</version>
|
||||||
<source>21</source>
|
</plugin>
|
||||||
<target>21</target>
|
|
||||||
<compilerArgs>--enable-preview</compilerArgs>
|
|
||||||
<encoding>UTF-8</encoding>
|
|
||||||
<annotationProcessorPaths>
|
|
||||||
<path>
|
|
||||||
<groupId>org.projectlombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
<version>${lombok.version}</version>
|
|
||||||
</path>
|
|
||||||
</annotationProcessorPaths>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<!-- https://github.com/HebiRobotics/sass-cli-maven-plugin -->
|
<plugin>
|
||||||
<plugin>
|
<groupId>org.openjfx</groupId>
|
||||||
<groupId>us.hebi.sass</groupId>
|
<artifactId>javafx-maven-plugin</artifactId>
|
||||||
<artifactId>sass-cli-maven-plugin</artifactId>
|
<version>0.0.8</version>
|
||||||
<version>1.0.3</version>
|
</plugin>
|
||||||
<configuration>
|
|
||||||
<sassVersion>1.78.0</sassVersion>
|
|
||||||
<args> <!-- Any argument that should be forwarded to the sass cli -->
|
|
||||||
<arg>${cssSrcPath}/root.scss:${cssTargetPath}/root.css</arg>
|
|
||||||
<arg>${cssSrcPath}/root-view.scss:${cssTargetPath}/root-view.css</arg>
|
|
||||||
<arg>${cssSrcPath}/main-view.scss:${cssTargetPath}/main-view.css</arg>
|
|
||||||
<arg>${cssSrcPath}/setup-view.scss:${cssTargetPath}/setup-view.css</arg>
|
|
||||||
<arg>${cssSrcPath}/about-view.scss:${cssTargetPath}/about-view.css</arg>
|
|
||||||
<arg>${cssSrcPath}/admin-panel.scss:${cssTargetPath}/admin-panel.css</arg>
|
|
||||||
<arg>--no-source-map</arg>
|
|
||||||
</args>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>sass-exec</id>
|
|
||||||
<phase>generate-resources</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>run</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
<!-- https://github.com/fvarrui/JavaPackager -->
|
||||||
<groupId>org.openjfx</groupId>
|
<plugin>
|
||||||
<artifactId>javafx-maven-plugin</artifactId>
|
<groupId>io.github.fvarrui</groupId>
|
||||||
<version>0.0.8</version>
|
<artifactId>javapackager</artifactId>
|
||||||
<configuration>
|
<version>1.7.7-SNAPSHOT</version>
|
||||||
<stripDebug>true</stripDebug>
|
</plugin>
|
||||||
<compress>2</compress>
|
</plugins>
|
||||||
<noHeaderFiles>true</noHeaderFiles>
|
</pluginManagement>
|
||||||
<noManPages>true</noManPages>
|
|
||||||
<launcher>alistgui</launcher>
|
|
||||||
<jlinkImageName>app</jlinkImageName>
|
|
||||||
<jlinkZipName>app</jlinkZipName>
|
|
||||||
<mainClass>cn.octopusyan.alistgui/${exec.mainClass}</mainClass>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<!-- Default configuration for running with: mvn clean javafx:run -->
|
|
||||||
<id>default-cli</id>
|
|
||||||
<configuration>
|
|
||||||
<stripDebug>true</stripDebug>
|
|
||||||
<compress>2</compress>
|
|
||||||
<noHeaderFiles>true</noHeaderFiles>
|
|
||||||
<noManPages>true</noManPages>
|
|
||||||
<launcher>alist-gui</launcher>
|
|
||||||
<jlinkImageName>app</jlinkImageName>
|
|
||||||
<jlinkZipName>app</jlinkZipName>
|
|
||||||
<mainClass>cn.octopusyan.alistgui/${exec.mainClass}</mainClass>
|
|
||||||
<options>
|
|
||||||
<option>--enable-preview</option>
|
|
||||||
<!-- <option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005</option>-->
|
|
||||||
</options>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<!-- https://github.com/fvarrui/JavaPackager -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>io.github.fvarrui</groupId>
|
|
||||||
<artifactId>javapackager</artifactId>
|
|
||||||
<version>1.7.7-SNAPSHOT</version>
|
|
||||||
<configuration>
|
|
||||||
<mainClass>${exec.mainClass}</mainClass>
|
|
||||||
<bundleJre>true</bundleJre>
|
|
||||||
<generateInstaller>false</generateInstaller>
|
|
||||||
<copyDependencies>true</copyDependencies>
|
|
||||||
<assetsDir>${project.basedir}/src/main/resources/assets</assetsDir>
|
|
||||||
<vmArgs>
|
|
||||||
<arg>--enable-preview</arg>
|
|
||||||
<arg>-Xmx100m</arg>
|
|
||||||
</vmArgs>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>windows</id>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>package</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<platform>windows</platform>
|
|
||||||
<zipballName>${project.name}-windows</zipballName>
|
|
||||||
<createZipball>true</createZipball>
|
|
||||||
<winConfig>
|
|
||||||
<headerType>gui</headerType>
|
|
||||||
<generateMsi>false</generateMsi>
|
|
||||||
</winConfig>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>windows-nojre</id>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>package</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<zipballName>${project.name}-windows-nojre</zipballName>
|
|
||||||
<platform>windows</platform>
|
|
||||||
<createZipball>true</createZipball>
|
|
||||||
<bundleJre>false</bundleJre>
|
|
||||||
<winConfig>
|
|
||||||
<headerType>gui</headerType>
|
|
||||||
<generateMsi>false</generateMsi>
|
|
||||||
</winConfig>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
171
upgrade/pom.xml
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>cn.octopusyan</groupId>
|
||||||
|
<artifactId>alist-gui</artifactId>
|
||||||
|
<version>1.0.1</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>upgrade</artifactId>
|
||||||
|
<version>${parent.version}</version>
|
||||||
|
<name>upgrade</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>21</maven.compiler.source>
|
||||||
|
<maven.compiler.target>21</maven.compiler.target>
|
||||||
|
<java.version>21</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
|
<exec.mainClass>cn.octopusyan.upgrade.AppLauncher</exec.mainClass>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- javafx -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-controls</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-fxml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mkpaz.github.io/atlantafx/ -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.mkpaz</groupId>
|
||||||
|
<artifactId>atlantafx-base</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>21</source>
|
||||||
|
<target>21</target>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<stripDebug>true</stripDebug>
|
||||||
|
<compress>2</compress>
|
||||||
|
<noHeaderFiles>true</noHeaderFiles>
|
||||||
|
<noManPages>true</noManPages>
|
||||||
|
<launcher>upgrade</launcher>
|
||||||
|
<jlinkImageName>app</jlinkImageName>
|
||||||
|
<jlinkZipName>app</jlinkZipName>
|
||||||
|
<mainClass>cn.octopusyan.upgrade/${exec.mainClass}</mainClass>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<!-- Default configuration for running with: mvn clean javafx:run -->
|
||||||
|
<id>default-cli</id>
|
||||||
|
<configuration>
|
||||||
|
<stripDebug>true</stripDebug>
|
||||||
|
<compress>2</compress>
|
||||||
|
<noHeaderFiles>true</noHeaderFiles>
|
||||||
|
<noManPages>true</noManPages>
|
||||||
|
<launcher>upgrade</launcher>
|
||||||
|
<jlinkImageName>app</jlinkImageName>
|
||||||
|
<jlinkZipName>app</jlinkZipName>
|
||||||
|
<mainClass>cn.octopusyan.upgrade/${exec.mainClass}</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- https://github.com/fvarrui/JavaPackager -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.github.fvarrui</groupId>
|
||||||
|
<artifactId>javapackager</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>${exec.mainClass}</mainClass>
|
||||||
|
<bundleJre>true</bundleJre>
|
||||||
|
<generateInstaller>false</generateInstaller>
|
||||||
|
<copyDependencies>true</copyDependencies>
|
||||||
|
<vmArgs>
|
||||||
|
<arg>-Xmx100m</arg>
|
||||||
|
</vmArgs>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>windows</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>package</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<platform>windows</platform>
|
||||||
|
<createZipball>false</createZipball>
|
||||||
|
<winConfig>
|
||||||
|
<headerType>gui</headerType>
|
||||||
|
<generateMsi>false</generateMsi>
|
||||||
|
</winConfig>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-resources</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<!--打成jar包后复制到的路径-->
|
||||||
|
<outputDirectory>../gui/src/main/resources/static</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<!--项目中需要复制的文件路径-->
|
||||||
|
<directory>./target/upgrade</directory>
|
||||||
|
<includes>
|
||||||
|
<include>upgrade.exe</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<!--可配置多个提取复制路径只需要 “<id>”名字不一样即可-->
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
13
upgrade/src/main/java/cn/octopusyan/upgrade/AppLauncher.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package cn.octopusyan.upgrade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动类
|
||||||
|
*
|
||||||
|
* @author octopus_yan@foxmail.com
|
||||||
|
*/
|
||||||
|
public class AppLauncher {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Application.launch(Application.class, args);
|
||||||
|
}
|
||||||
|
}
|
35
upgrade/src/main/java/cn/octopusyan/upgrade/Application.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package cn.octopusyan.upgrade;
|
||||||
|
|
||||||
|
import atlantafx.base.theme.PrimerLight;
|
||||||
|
import cn.octopusyan.upgrade.util.FxmlUtil;
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import javafx.scene.Scene;
|
||||||
|
import javafx.scene.layout.Pane;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
public class Application extends javafx.application.Application {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(Stage primaryStage) throws IOException {
|
||||||
|
|
||||||
|
// 主题样式
|
||||||
|
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
|
||||||
|
|
||||||
|
// 启动主界面
|
||||||
|
Pane root = FxmlUtil.init("/fxml/hello-view.fxml").load();
|
||||||
|
Scene scene = new Scene(root, 420, 240);
|
||||||
|
primaryStage.setTitle(ResourceBundle.getBundle("language/language").getString("title"));
|
||||||
|
primaryStage.setScene(scene);
|
||||||
|
primaryStage.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
// 关闭主界面
|
||||||
|
Platform.exit();
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package cn.octopusyan.upgrade.alert;
|
||||||
|
|
||||||
|
import cn.octopusyan.upgrade.alert.builder.*;
|
||||||
|
import javafx.scene.control.Alert;
|
||||||
|
import javafx.scene.control.ButtonType;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
import javafx.stage.Window;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弹窗工具
|
||||||
|
*
|
||||||
|
* @author octopus_yan@foxmail.com
|
||||||
|
*/
|
||||||
|
public class AlertUtil {
|
||||||
|
private static Window mOwner;
|
||||||
|
|
||||||
|
public static void initOwner(Stage stage) {
|
||||||
|
AlertUtil.mOwner = stage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder info(String content) {
|
||||||
|
return info().content(content).header(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder info() {
|
||||||
|
return alert(Alert.AlertType.INFORMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder error(String message) {
|
||||||
|
return alert(Alert.AlertType.ERROR).header(null).content(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder warning() {
|
||||||
|
return alert(Alert.AlertType.WARNING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder exception(Exception ex) {
|
||||||
|
return alert(Alert.AlertType.ERROR).exception(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认对话框
|
||||||
|
*/
|
||||||
|
public static AlertBuilder confirm() {
|
||||||
|
return alert(Alert.AlertType.CONFIRMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义确认对话框 <p>
|
||||||
|
*
|
||||||
|
* @param buttons <code>"Cancel"</code> OR <code>"取消"</code> 为取消按钮
|
||||||
|
*/
|
||||||
|
public static AlertBuilder confirm(String... buttons) {
|
||||||
|
return confirm().buttons(buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder confirm(ButtonType... buttons) {
|
||||||
|
return confirm().buttons(buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AlertBuilder alert(Alert.AlertType type) {
|
||||||
|
return new AlertBuilder(mOwner, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnChoseListener {
|
||||||
|
void confirm();
|
||||||
|
|
||||||
|
default void cancelOrClose(ButtonType buttonType) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnClickListener {
|
||||||
|
void onClicked(String result);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,108 @@
|
|||||||
|
package cn.octopusyan.upgrade.alert.builder;
|
||||||
|
|
||||||
|
import cn.octopusyan.upgrade.alert.AlertUtil;
|
||||||
|
import javafx.scene.control.*;
|
||||||
|
import javafx.scene.layout.GridPane;
|
||||||
|
import javafx.scene.layout.Priority;
|
||||||
|
import javafx.stage.Window;
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author octopus_yan
|
||||||
|
*/
|
||||||
|
public class AlertBuilder extends BaseBuilder<AlertBuilder, Alert> {
|
||||||
|
|
||||||
|
public AlertBuilder(Window owner, Alert.AlertType alertType) {
|
||||||
|
super(new Alert(alertType), owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AlertBuilder buttons(String... buttons) {
|
||||||
|
dialog.getButtonTypes().addAll(getButtonList(buttons));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AlertBuilder buttons(ButtonType... buttons) {
|
||||||
|
dialog.getButtonTypes().addAll(buttons);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AlertBuilder exception(Exception ex) {
|
||||||
|
dialog.setTitle("Exception Dialog");
|
||||||
|
dialog.setHeaderText(ex.getClass().getSimpleName());
|
||||||
|
dialog.setContentText(ex.getMessage());
|
||||||
|
|
||||||
|
// 创建可扩展的异常。
|
||||||
|
var sw = new StringWriter();
|
||||||
|
var pw = new PrintWriter(sw);
|
||||||
|
ex.printStackTrace(pw);
|
||||||
|
var exceptionText = sw.toString();
|
||||||
|
|
||||||
|
var label = new Label("The exception stacktrace was :");
|
||||||
|
|
||||||
|
var textArea = new TextArea(exceptionText);
|
||||||
|
textArea.setEditable(false);
|
||||||
|
textArea.setWrapText(true);
|
||||||
|
|
||||||
|
textArea.setMaxWidth(Double.MAX_VALUE);
|
||||||
|
textArea.setMaxHeight(Double.MAX_VALUE);
|
||||||
|
GridPane.setVgrow(textArea, Priority.ALWAYS);
|
||||||
|
GridPane.setHgrow(textArea, Priority.ALWAYS);
|
||||||
|
|
||||||
|
var expContent = new GridPane();
|
||||||
|
expContent.setMaxWidth(Double.MAX_VALUE);
|
||||||
|
expContent.add(label, 0, 0);
|
||||||
|
expContent.add(textArea, 0, 1);
|
||||||
|
|
||||||
|
// 将可扩展异常设置到对话框窗格中。
|
||||||
|
dialog.getDialogPane().setExpandableContent(expContent);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取按钮列表
|
||||||
|
*
|
||||||
|
* @param buttons "Cancel" / "取消" 为取消按钮
|
||||||
|
*/
|
||||||
|
private List<ButtonType> getButtonList(String[] buttons) {
|
||||||
|
if (ArrayUtils.isEmpty(buttons)) return Collections.emptyList();
|
||||||
|
|
||||||
|
return Arrays.stream(buttons).map((type) -> {
|
||||||
|
ButtonBar.ButtonData buttonData = ButtonBar.ButtonData.OTHER;
|
||||||
|
if ("cancel".equals(StringUtils.lowerCase(type)) || "取消".equals(type)) {
|
||||||
|
return ButtonType.CANCEL;
|
||||||
|
}
|
||||||
|
return new ButtonType(type, buttonData);
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AlertUtil.confirm
|
||||||
|
*/
|
||||||
|
public void show(AlertUtil.OnClickListener listener) {
|
||||||
|
Optional<ButtonType> result = dialog.showAndWait();
|
||||||
|
result.ifPresent(r -> listener.onClicked(r.getText()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AlertUtil.confirm
|
||||||
|
*/
|
||||||
|
public void show(AlertUtil.OnChoseListener listener) {
|
||||||
|
Optional<ButtonType> result = dialog.showAndWait();
|
||||||
|
result.ifPresent(r -> {
|
||||||
|
if (r == ButtonType.OK) {
|
||||||
|
listener.confirm();
|
||||||
|
} else {
|
||||||
|
listener.cancelOrClose(r);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package cn.octopusyan.upgrade.alert.builder;
|
||||||
|
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import javafx.scene.control.Dialog;
|
||||||
|
import javafx.stage.Window;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author octopus_yan
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public abstract class BaseBuilder<T extends BaseBuilder<T, ?>, D extends Dialog<?>> {
|
||||||
|
protected D dialog;
|
||||||
|
|
||||||
|
public BaseBuilder(D dialog, Window mOwner) {
|
||||||
|
this.dialog = dialog;
|
||||||
|
if (mOwner != null)
|
||||||
|
this.dialog.initOwner(mOwner);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T title(String title) {
|
||||||
|
dialog.setTitle(title);
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T header(String header) {
|
||||||
|
dialog.setHeaderText(header);
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T content(String content) {
|
||||||
|
dialog.setContentText(content);
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void show() {
|
||||||
|
Platform.runLater(() -> dialog.showAndWait());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
if (dialog.isShowing())
|
||||||
|
dialog.close();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package cn.octopusyan.upgrade.util;
|
||||||
|
|
||||||
|
import javafx.fxml.FXMLLoader;
|
||||||
|
import javafx.fxml.JavaFXBuilderFactory;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
public class FxmlUtil {
|
||||||
|
public static FXMLLoader init(String path) {
|
||||||
|
return new FXMLLoader(
|
||||||
|
FxmlUtil.class.getResource(path),
|
||||||
|
ResourceBundle.getBundle("language/language"),
|
||||||
|
new JavaFXBuilderFactory(),
|
||||||
|
null,
|
||||||
|
StandardCharsets.UTF_8
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package cn.octopusyan.upgrade.view;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
|
import cn.hutool.core.util.CharsetUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.core.util.ZipUtil;
|
||||||
|
import cn.octopusyan.upgrade.alert.AlertUtil;
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
|
public class HelloController {
|
||||||
|
public static final String APP_NAME = "alist-gui";
|
||||||
|
public static final String PARENT_PATH = Paths.get("").toFile().getAbsolutePath();
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public void onUpdate() {
|
||||||
|
// 更新检查
|
||||||
|
File file = new File(PARENT_PATH + File.separator + APP_NAME + "-windows-nojre.zip");
|
||||||
|
if (!file.exists()) {
|
||||||
|
AlertUtil.error("The upgrade file does not exist!").show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解压
|
||||||
|
unzip();
|
||||||
|
// 启动GUI
|
||||||
|
startGui();
|
||||||
|
// 退出
|
||||||
|
onExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public void onExit() {
|
||||||
|
Platform.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startGui() {
|
||||||
|
Runtime runtime = Runtime.getRuntime(); //获取Runtime实例
|
||||||
|
//执行命令
|
||||||
|
String[] command = {APP_NAME + ".exe"};
|
||||||
|
try {
|
||||||
|
Process process = runtime.exec(command);
|
||||||
|
} catch (IOException ignored) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void unzip() {
|
||||||
|
|
||||||
|
|
||||||
|
File file = new File(PARENT_PATH + File.separator + APP_NAME + "-windows-nojre.zip");
|
||||||
|
ZipFile zipFile = ZipUtil.toZipFile(file, CharsetUtil.defaultCharset());
|
||||||
|
ZipUtil.read(zipFile, zipEntry -> {
|
||||||
|
String path = zipEntry.getName();
|
||||||
|
if (FileUtil.isWindows()) {
|
||||||
|
// Win系统下
|
||||||
|
path = StrUtil.replace(path, "*", "_");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打包后文件都在alist-gui文件夹下,解压时去掉
|
||||||
|
path = path.replaceFirst(APP_NAME, "");
|
||||||
|
|
||||||
|
final File outItemFile = FileUtil.file(PARENT_PATH, path);
|
||||||
|
if (zipEntry.isDirectory()) {
|
||||||
|
// 目录
|
||||||
|
//noinspection ResultOfMethodCallIgnored
|
||||||
|
outItemFile.mkdirs();
|
||||||
|
} else {
|
||||||
|
InputStream in = ZipUtil.getStream(zipFile, zipEntry);
|
||||||
|
// 文件
|
||||||
|
FileUtil.writeFromStream(in, outItemFile, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 解压完成后删除
|
||||||
|
FileUtil.del(file);
|
||||||
|
}
|
||||||
|
}
|
16
upgrade/src/main/java/module-info.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
module cn.octopusyan.upgrade {
|
||||||
|
requires javafx.controls;
|
||||||
|
requires javafx.fxml;
|
||||||
|
requires atlantafx.base;
|
||||||
|
requires cn.hutool.core;
|
||||||
|
requires static lombok;
|
||||||
|
requires org.apache.commons.lang3;
|
||||||
|
|
||||||
|
|
||||||
|
opens cn.octopusyan.upgrade to javafx.fxml;
|
||||||
|
exports cn.octopusyan.upgrade;
|
||||||
|
exports cn.octopusyan.upgrade.util;
|
||||||
|
opens cn.octopusyan.upgrade.util to javafx.fxml;
|
||||||
|
exports cn.octopusyan.upgrade.view;
|
||||||
|
opens cn.octopusyan.upgrade.view to javafx.fxml;
|
||||||
|
}
|
14
upgrade/src/main/resources/fxml/hello-view.fxml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<?import javafx.geometry.Insets?>
|
||||||
|
<?import javafx.scene.control.Button?>
|
||||||
|
<?import javafx.scene.layout.HBox?>
|
||||||
|
<HBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml/1"
|
||||||
|
xmlns="http://javafx.com/javafx/11.0.14-internal"
|
||||||
|
fx:controller="cn.octopusyan.upgrade.view.HelloController">
|
||||||
|
<padding>
|
||||||
|
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
|
||||||
|
</padding>
|
||||||
|
<Button onAction="#onUpdate" styleClass="large" text="%update"/>
|
||||||
|
<Button onAction="#onExit" styleClass="large" text="%exit"/>
|
||||||
|
</HBox>
|
7
upgrade/src/main/resources/language/language.properties
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
exit=\u9000\u51FA
|
||||||
|
title=\u66F4\u65B0
|
||||||
|
update=\u66F4\u65B0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
|||||||
|
exit=Exit
|
||||||
|
title=Upgrade App
|
||||||
|
update=Upgrade
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
|||||||
|
exit=\u9000\u51FA
|
||||||
|
title=\u66F4\u65B0
|
||||||
|
update=\u66F4\u65B0
|
||||||
|
|
||||||
|
|
||||||
|
|