refactor: 将Desktop功能重构到DesktopUtils类中

重构Desktop类的浏览器和文件资源管理器功能到新的DesktopUtils工具类,提高代码可维护性
修改多处调用点使用新的工具类方法
更新数据库连接默认主机地址
为CurrentEmployee类添加@ToString注解
This commit is contained in:
danyz
2025-08-23 10:33:35 +08:00
parent 2b013feaf1
commit c6b3b35997
24 changed files with 152 additions and 127 deletions

View File

@@ -25,7 +25,7 @@ public class AppV2 {
System.out.println("AppV2.done"); System.out.println("AppV2.done");
} }
public static final String DEFAULT_DB_HOST = "10.84.209.145"; // "db-server1.ecctrl.com" public static final String DEFAULT_DB_HOST = "10.84.209.154"; // "db-server1.ecctrl.com"
public static final String DEFAULT_DB_PORT = "3306"; public static final String DEFAULT_DB_PORT = "3306";
public static final String DEFAULT_DB_USERNAME = "supplier_ms"; public static final String DEFAULT_DB_USERNAME = "supplier_ms";
public static final String DEFAULT_DB_PASSWORD = "[TPdseO!JKMmlrpf"; public static final String DEFAULT_DB_PASSWORD = "[TPdseO!JKMmlrpf";

View File

@@ -1,25 +1,29 @@
package com.ecep.contract.manager; package com.ecep.contract.manager;
import com.ecep.contract.manager.ds.other.model.Employee;
import com.ecep.contract.manager.ds.other.model.EmployeeRole;
import com.ecep.contract.manager.ds.other.service.EmployeeService;
import com.ecep.contract.manager.ds.other.vo.EmployeeViewModel;
import javafx.application.Platform;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ecep.contract.manager.ds.other.model.Employee;
import com.ecep.contract.manager.ds.other.model.EmployeeRole;
import com.ecep.contract.manager.ds.other.service.EmployeeService;
import com.ecep.contract.manager.ds.other.vo.EmployeeViewModel;
import javafx.application.Platform;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import lombok.ToString;
/** /**
* 当前登录用户 * 当前登录用户
*/ */
@ToString(of = {"id", "name", "email", "phone", "roles"})
public class CurrentEmployee extends EmployeeViewModel { public class CurrentEmployee extends EmployeeViewModel {
private static final Logger logger = LoggerFactory.getLogger(CurrentEmployee.class); private static final Logger logger = LoggerFactory.getLogger(CurrentEmployee.class);
/** /**

View File

@@ -22,7 +22,6 @@ import lombok.Getter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.util.StringUtils;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -31,7 +30,6 @@ import java.net.URL;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
/** /**
@@ -41,74 +39,9 @@ import java.util.logging.Level;
* Created by ecep on 2017/05/08. * Created by ecep on 2017/05/08.
*/ */
public class Desktop extends Application { public class Desktop extends Application {
private static final Logger logger = LoggerFactory.getLogger(Desktop.class); public static final Logger logger = LoggerFactory.getLogger(Desktop.class);
public static Desktop instance; public static Desktop instance;
/**
* 在默认浏览器中打开指定的URL。
* <p>
* 该函数使用JavaFX的HostServices类来调用系统默认的浏览器并打开传入的URL。
*
* @param url 要在浏览器中打开的URL字符串。该参数不能为空且应为有效的URL格式。
*/
public static void showInBrowse(String url) {
instance.getHostServices().showDocument(url);
}
/**
* 在系统的文件资源管理器中打开指定的文件夹。
* <p>
* 该方法首先尝试使用 java.awt.Desktop API 打开文件夹。如果该 API 不支持,
* 则在 Windows 系统中使用 explorer.exe 打开文件夹。
*
* @param dir 要打开的文件夹对象。如果为 null 或无效路径,可能会抛出异常。
* @throws RuntimeException 如果使用 java.awt.Desktop 打开文件夹时发生 IOException
* 则将其包装为 RuntimeException 抛出。
*/
public static void showInExplorer(File dir) {
if (java.awt.Desktop.isDesktopSupported()) {
try {
java.awt.Desktop.getDesktop().open(dir);
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
try {
// 在Windows中使用explorer.exe打开文件夹路径用双引号括起来
Process process = Runtime.getRuntime().exec(
new String[] { "explorer.exe", "\"" + dir.getAbsolutePath() + "\"" }, null, new File("."));
// process.waitFor();
} catch (IOException e) {
if (logger.isDebugEnabled()) {
logger.debug("Unable open {}", dir.getAbsolutePath(), e);
}
}
}
}
public static void checkAndShowInExplorer(String path, Consumer<String> consumer) {
if (!StringUtils.hasText(path)) {
consumer.accept("文件/目录为空,无法打开");
return;
}
File file = new File(path);
if (!file.exists()) {
if (file.isFile()) {
consumer.accept("文件 " + file.getAbsolutePath() + " 不存在,请确认");
} else {
consumer.accept("目录 " + file.getAbsolutePath() + " 不存在,请确认");
}
return;
}
try {
Desktop.showInExplorer(file);
consumer.accept("打开文件/目录 " + path);
} catch (Exception e) {
consumer.accept("打开文件错误:" + e.getMessage());
}
}
public static void shutdown() { public static void shutdown() {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("shutdown"); logger.debug("shutdown");
@@ -249,7 +182,6 @@ public class Desktop extends Application {
beanFactory.registerSingleton("scheduledExecutorService", getExecutorService()); beanFactory.registerSingleton("scheduledExecutorService", getExecutorService());
beanFactory.registerSingleton("taskMonitorCenter", taskMonitorCenter); beanFactory.registerSingleton("taskMonitorCenter", taskMonitorCenter);
}); });
try { try {

View File

@@ -1,17 +1,26 @@
package com.ecep.contract.manager; package com.ecep.contract.manager;
import com.fasterxml.jackson.core.type.TypeReference; import java.io.BufferedReader;
import com.fasterxml.jackson.databind.JsonNode; import java.io.BufferedWriter;
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File;
import com.fasterxml.jackson.databind.node.ArrayNode; import java.io.FileReader;
import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.FileWriter;
import java.io.IOException;
import java.io.*;
import java.net.CookieStore; import java.net.CookieStore;
import java.net.HttpCookie; import java.net.HttpCookie;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.*; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class MyPersistentCookieStore implements CookieStore { public class MyPersistentCookieStore implements CookieStore {

View File

@@ -156,7 +156,7 @@ public class CloudTycService implements ViewModelService<CloudTyc, CloudTycInfoV
String url = baseUrl + cloudId; String url = baseUrl + cloudId;
com.ecep.contract.manager.Desktop.showInBrowse(url); com.ecep.contract.manager.util.DesktopUtils.showInBrowse(url);
// UITools.showExceptionAndWait("使用浏览器打开网址出现异常", e); // UITools.showExceptionAndWait("使用浏览器打开网址出现异常", e);

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.company.controller; package com.ecep.contract.manager.ds.company.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.cloud.u8.YongYouU8Service; import com.ecep.contract.manager.cloud.u8.YongYouU8Service;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
import com.ecep.contract.manager.ds.contract.controller.ContractGroupTableCell; import com.ecep.contract.manager.ds.contract.controller.ContractGroupTableCell;
@@ -21,6 +20,7 @@ import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.ui.util.ContractGroupStringConverter; import com.ecep.contract.manager.ui.util.ContractGroupStringConverter;
import com.ecep.contract.manager.ui.util.LocalDateTimeTableCell; import com.ecep.contract.manager.ui.util.LocalDateTimeTableCell;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.SpecificationUtils; import com.ecep.contract.manager.util.SpecificationUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
@@ -236,7 +236,7 @@ public class CompanyTabSkinContract
} }
try { try {
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
setStatus("打开文件/目录 " + path); setStatus("打开文件/目录 " + path);
} catch (Exception e) { } catch (Exception e) {
setStatus("打开文件错误:" + e.getMessage()); setStatus("打开文件错误:" + e.getMessage());

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.company.controller; package com.ecep.contract.manager.ds.company.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.MyProperties; import com.ecep.contract.manager.MyProperties;
import com.ecep.contract.manager.cloud.tyc.CloudTycService; import com.ecep.contract.manager.cloud.tyc.CloudTycService;
import com.ecep.contract.manager.ds.company.CompanyFileType; import com.ecep.contract.manager.ds.company.CompanyFileType;
@@ -12,6 +11,7 @@ import com.ecep.contract.manager.ds.company.vo.CompanyFileViewModel;
import com.ecep.contract.manager.ui.EditableEntityTableTabSkin; import com.ecep.contract.manager.ui.EditableEntityTableTabSkin;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -343,7 +343,7 @@ public class CompanyTabSkinFile
setStatus("文件不存在 " + file.getName()); setStatus("文件不存在 " + file.getName());
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
} }

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.company.controller; package com.ecep.contract.manager.ds.company.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.cloud.rk.CloudRk; import com.ecep.contract.manager.cloud.rk.CloudRk;
import com.ecep.contract.manager.cloud.rk.CloudRkInfoViewModel; import com.ecep.contract.manager.cloud.rk.CloudRkInfoViewModel;
import com.ecep.contract.manager.cloud.rk.CloudRkService; import com.ecep.contract.manager.cloud.rk.CloudRkService;
@@ -19,6 +18,7 @@ import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.MessageHolder; import com.ecep.contract.manager.ui.MessageHolder;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.ui.util.DelayOnceExecutor; import com.ecep.contract.manager.ui.util.DelayOnceExecutor;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -376,7 +376,7 @@ public class CompanyTabSkinOther
Company company = getEntity(); Company company = getEntity();
url = String.format(CloudTycService.URL_COMPANY_SEARCH, company.getName()); url = String.format(CloudTycService.URL_COMPANY_SEARCH, company.getName());
} }
Desktop.showInBrowse(url); DesktopUtils.showInBrowse(url);
} }
public void onTycCloudPaneHyperLinkInnerViewClickedAction(ActionEvent event) { public void onTycCloudPaneHyperLinkInnerViewClickedAction(ActionEvent event) {

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.company.controller; package com.ecep.contract.manager.ds.company.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.SpringApp;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
import com.ecep.contract.manager.ds.company.service.CompanyFileService; import com.ecep.contract.manager.ds.company.service.CompanyFileService;
@@ -18,6 +17,7 @@ import com.ecep.contract.manager.ds.vendor.service.CompanyVendorService;
import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin; import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin;
import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.AbstEntityController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
@@ -307,7 +307,7 @@ public class CompanyWindowController
return; return;
} }
} }
Desktop.checkAndShowInExplorer(company.getPath(), this::setStatus); DesktopUtils.checkAndShowInExplorer(company.getPath(), this::setStatus);
}); });
} }

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.company.controller.old_name; package com.ecep.contract.manager.ds.company.controller.old_name;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.MyProperties; import com.ecep.contract.manager.MyProperties;
import com.ecep.contract.manager.ds.company.CompanyFileType; import com.ecep.contract.manager.ds.company.CompanyFileType;
import com.ecep.contract.manager.ds.company.model.CompanyFile; import com.ecep.contract.manager.ds.company.model.CompanyFile;
@@ -11,6 +10,7 @@ import com.ecep.contract.manager.ds.company.vo.CompanyFileViewModel;
import com.ecep.contract.manager.ds.company.vo.CompanyOldNameViewModel; import com.ecep.contract.manager.ds.company.vo.CompanyOldNameViewModel;
import com.ecep.contract.manager.ui.AbstEntityTableTabSkin; import com.ecep.contract.manager.ui.AbstEntityTableTabSkin;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.SpecificationUtils; import com.ecep.contract.manager.util.SpecificationUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -318,7 +318,7 @@ public class CompanyOldNameTabSkinFile
setStatus("文件不存在 " + file.getName()); setStatus("文件不存在 " + file.getName());
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
} }

View File

@@ -8,6 +8,7 @@ import com.ecep.contract.manager.ds.company.vo.CompanyOldNameViewModel;
import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.AbstEntityController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.ViewModelService; import com.ecep.contract.manager.ui.ViewModelService;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.scene.control.*; import javafx.scene.control.*;
@@ -25,8 +26,6 @@ import org.springframework.util.StringUtils;
import java.io.File; import java.io.File;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import static com.ecep.contract.manager.Desktop.showInExplorer;
@Lazy @Lazy
@Scope("prototype") @Scope("prototype")
@Component @Component
@@ -125,7 +124,7 @@ public class CompanyOldNameWindowController extends AbstEntityController<Company
} }
} }
File file = new File(companyOldName.getPath()); File file = new File(companyOldName.getPath());
showInExplorer(file); DesktopUtils.showInExplorer(file);
}); });
} }
} }

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.contract.controller; package com.ecep.contract.manager.ds.contract.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.SpringApp;
import com.ecep.contract.manager.cloud.u8.ctx.ContractCtx; import com.ecep.contract.manager.cloud.u8.ctx.ContractCtx;
import com.ecep.contract.manager.ds.company.CompanyFileUtils; import com.ecep.contract.manager.ds.company.CompanyFileUtils;
@@ -18,6 +17,7 @@ import com.ecep.contract.manager.ui.EditableEntityTableTabSkin;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.ui.util.LocalDateFieldTableCell; import com.ecep.contract.manager.ui.util.LocalDateFieldTableCell;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
@@ -573,7 +573,7 @@ public class ContractTabSkinFiles
setStatus("文件不存在 " + file.getName()); setStatus("文件不存在 " + file.getName());
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
public void onFileTableContextMenuShowing(WindowEvent windowEvent) { public void onFileTableContextMenuShowing(WindowEvent windowEvent) {

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.contract.controller; package com.ecep.contract.manager.ds.contract.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.company.controller.CompanyWindowController; import com.ecep.contract.manager.ds.company.controller.CompanyWindowController;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
import com.ecep.contract.manager.ds.company.service.CompanyService; import com.ecep.contract.manager.ds.company.service.CompanyService;
@@ -12,6 +11,7 @@ import com.ecep.contract.manager.ds.contract.vo.ContractViewModel;
import com.ecep.contract.manager.ds.project.service.ProjectService; import com.ecep.contract.manager.ds.project.service.ProjectService;
import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.AbstEntityController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
@@ -184,7 +184,7 @@ public class ContractWindowController
setStatus("目录错误,不存在"); setStatus("目录错误,不存在");
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
public void onContractOpenRelativeCompanyAction(ActionEvent event) { public void onContractOpenRelativeCompanyAction(ActionEvent event) {

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.customer.controller; package com.ecep.contract.manager.ds.customer.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.company.service.CompanyContactService; import com.ecep.contract.manager.ds.company.service.CompanyContactService;
import com.ecep.contract.manager.ds.company.service.CompanyService; import com.ecep.contract.manager.ds.company.service.CompanyService;
import com.ecep.contract.manager.ds.customer.model.CompanyCustomer; import com.ecep.contract.manager.ds.customer.model.CompanyCustomer;
@@ -9,6 +8,8 @@ import com.ecep.contract.manager.ds.customer.vo.CompanyCustomerViewModel;
import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.AbstEntityController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.ViewModelService; import com.ecep.contract.manager.ui.ViewModelService;
import com.ecep.contract.manager.util.DesktopUtils;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.BorderPane; import javafx.scene.layout.BorderPane;
@@ -115,7 +116,7 @@ public class CompanyCustomerWindowController extends AbstEntityController<Compan
setStatus("目录错误,不存在"); setStatus("目录错误,不存在");
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.customer.controller; package com.ecep.contract.manager.ds.customer.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.SpringApp;
import com.ecep.contract.manager.ds.company.CompanyFileUtils; import com.ecep.contract.manager.ds.company.CompanyFileUtils;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
@@ -16,6 +15,7 @@ import com.ecep.contract.manager.ds.other.model.BaseEnumEntity;
import com.ecep.contract.manager.ui.EditableEntityTableTabSkin; import com.ecep.contract.manager.ui.EditableEntityTableTabSkin;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.Message; import com.ecep.contract.manager.ui.Message;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.SpecificationUtils; import com.ecep.contract.manager.util.SpecificationUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
@@ -160,7 +160,7 @@ public class CustomerTabSkinFile
setStatus("文件不存在 " + file.getName()); setStatus("文件不存在 " + file.getName());
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
private void moveFileToCustomer(List<File> files) { private void moveFileToCustomer(List<File> files) {

View File

@@ -38,6 +38,7 @@ import com.ecep.contract.manager.ds.vendor.controller.CompanyVendorManagerWindow
import com.ecep.contract.manager.ui.BaseController; import com.ecep.contract.manager.ui.BaseController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.task.TaskMonitorViewController; import com.ecep.contract.manager.ui.task.TaskMonitorViewController;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.FxmlUtils; import com.ecep.contract.manager.util.FxmlUtils;
import javafx.concurrent.Task; import javafx.concurrent.Task;
@@ -173,7 +174,7 @@ public class HomeWindowController extends BaseController {
public void openInBrowse(ActionEvent event) { public void openInBrowse(ActionEvent event) {
MenuItem source = (MenuItem) event.getSource(); MenuItem source = (MenuItem) event.getSource();
String url = (String) source.getUserData(); String url = (String) source.getUserData();
Desktop.showInBrowse(url); DesktopUtils.showInBrowse(url);
} }
public void openGroupRKResourceWindow(ActionEvent event) { public void openGroupRKResourceWindow(ActionEvent event) {

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.project.controller.bid; package com.ecep.contract.manager.ds.project.controller.bid;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.company.CompanyStringConverter; import com.ecep.contract.manager.ds.company.CompanyStringConverter;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
import com.ecep.contract.manager.ds.company.service.CompanyService; import com.ecep.contract.manager.ds.company.service.CompanyService;
@@ -29,6 +28,7 @@ import com.ecep.contract.manager.ds.project.service.ProjectService;
import com.ecep.contract.manager.ds.project.vo.ProjectBidViewModel; import com.ecep.contract.manager.ds.project.vo.ProjectBidViewModel;
import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin; import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -204,7 +204,7 @@ public class ProjectBidTabSkinBase
controller.authorizationFileField.textProperty().bind(viewModel.getAuthorizationFile().map(File::getName)); controller.authorizationFileField.textProperty().bind(viewModel.getAuthorizationFile().map(File::getName));
controller.openAuthorizationFileBtn.setOnAction(event -> { controller.openAuthorizationFileBtn.setOnAction(event -> {
Desktop.showInExplorer(viewModel.getAuthorizationFile().get()); DesktopUtils.showInExplorer(viewModel.getAuthorizationFile().get());
}); });
controller.openAuthorizationFileBtn.disableProperty().bind(viewModel.getAuthorizationFile().isNull()); controller.openAuthorizationFileBtn.disableProperty().bind(viewModel.getAuthorizationFile().isNull());
controller.changeAuthorizationFileBtn.setOnAction(this::onChangeAuthorizationFileAction); controller.changeAuthorizationFileBtn.setOnAction(this::onChangeAuthorizationFileAction);
@@ -212,7 +212,7 @@ public class ProjectBidTabSkinBase
controller.bidAcceptanceLetterFileField.textProperty() controller.bidAcceptanceLetterFileField.textProperty()
.bind(viewModel.getBidAcceptanceLetterFile().map(File::getName)); .bind(viewModel.getBidAcceptanceLetterFile().map(File::getName));
controller.openBidAcceptanceLetterFileBtn.setOnAction(event -> { controller.openBidAcceptanceLetterFileBtn.setOnAction(event -> {
Desktop.showInExplorer(viewModel.getBidAcceptanceLetterFile().get()); DesktopUtils.showInExplorer(viewModel.getBidAcceptanceLetterFile().get());
}); });
controller.openBidAcceptanceLetterFileBtn.disableProperty() controller.openBidAcceptanceLetterFileBtn.disableProperty()
.bind(viewModel.getBidAcceptanceLetterFile().isNull()); .bind(viewModel.getBidAcceptanceLetterFile().isNull());

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.project.controller.cost; package com.ecep.contract.manager.ds.project.controller.cost;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.contract.ContractFileType; import com.ecep.contract.manager.ds.contract.ContractFileType;
import com.ecep.contract.manager.ds.contract.model.Contract; import com.ecep.contract.manager.ds.contract.model.Contract;
import com.ecep.contract.manager.ds.contract.model.ContractFile; import com.ecep.contract.manager.ds.contract.model.ContractFile;
@@ -13,6 +12,7 @@ import com.ecep.contract.manager.ds.project.service.ProjectService;
import com.ecep.contract.manager.ds.project.vo.ProjectCostViewModel; import com.ecep.contract.manager.ds.project.vo.ProjectCostViewModel;
import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin; import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -68,7 +68,7 @@ public class ProjectCostTabSkinBase
@Override @Override
public void initializeTab() { public void initializeTab() {
controller.openFileBtn.setOnAction(event -> { controller.openFileBtn.setOnAction(event -> {
Desktop.showInExplorer(viewModel.getAuthorizationFile().get()); DesktopUtils.showInExplorer(viewModel.getAuthorizationFile().get());
}); });
controller.openFileBtn.disableProperty().bind(viewModel.getAuthorizationFile().isNull()); controller.openFileBtn.disableProperty().bind(viewModel.getAuthorizationFile().isNull());
controller.changeFileBtn.setOnAction(this::onChangeAuthorizationFileAction); controller.changeFileBtn.setOnAction(this::onChangeAuthorizationFileAction);

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.project.controller.quotation; package com.ecep.contract.manager.ds.project.controller.quotation;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.company.CompanyStringConverter; import com.ecep.contract.manager.ds.company.CompanyStringConverter;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
import com.ecep.contract.manager.ds.company.service.CompanyService; import com.ecep.contract.manager.ds.company.service.CompanyService;
@@ -26,6 +25,7 @@ import com.ecep.contract.manager.ds.project.service.ProjectService;
import com.ecep.contract.manager.ds.project.vo.ProjectQuotationViewModel; import com.ecep.contract.manager.ds.project.vo.ProjectQuotationViewModel;
import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin; import com.ecep.contract.manager.ui.AbstEntityBasedTabSkin;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -101,7 +101,7 @@ public class ProjectQuotationTabSkinBase
@Override @Override
public void initializeTab() { public void initializeTab() {
controller.openFileBtn.setOnAction(event -> { controller.openFileBtn.setOnAction(event -> {
Desktop.showInExplorer(viewModel.getAuthorizationFile().get()); DesktopUtils.showInExplorer(viewModel.getAuthorizationFile().get());
}); });
controller.openFileBtn.disableProperty().bind(viewModel.getAuthorizationFile().isNull()); controller.openFileBtn.disableProperty().bind(viewModel.getAuthorizationFile().isNull());
controller.changeFileBtn.setOnAction(this::onChangeAuthorizationFileAction); controller.changeFileBtn.setOnAction(this::onChangeAuthorizationFileAction);

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.vendor.controller; package com.ecep.contract.manager.ds.vendor.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.company.service.CompanyContactService; import com.ecep.contract.manager.ds.company.service.CompanyContactService;
import com.ecep.contract.manager.ds.company.service.CompanyService; import com.ecep.contract.manager.ds.company.service.CompanyService;
import com.ecep.contract.manager.ds.vendor.model.CompanyVendor; import com.ecep.contract.manager.ds.vendor.model.CompanyVendor;
@@ -9,6 +8,8 @@ import com.ecep.contract.manager.ds.vendor.service.CompanyVendorService;
import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorViewModel; import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorViewModel;
import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.AbstEntityController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.util.DesktopUtils;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.BorderPane; import javafx.scene.layout.BorderPane;
@@ -106,7 +107,7 @@ public class CompanyVendorWindowController extends AbstEntityController<CompanyV
setStatus("目录错误,不存在"); setStatus("目录错误,不存在");
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
} }

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.vendor.controller; package com.ecep.contract.manager.ds.vendor.controller;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.SpringApp;
import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.model.Company;
import com.ecep.contract.manager.ds.other.model.BaseEnumEntity; import com.ecep.contract.manager.ds.other.model.BaseEnumEntity;
@@ -15,6 +14,7 @@ import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorFileViewModel;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.ui.ViewModelService; import com.ecep.contract.manager.ui.ViewModelService;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.MyDateTimeUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.application.Platform; import javafx.application.Platform;
@@ -117,7 +117,7 @@ public class VendorTabSkinFile
setStatus("文件不存在 " + file.getName()); setStatus("文件不存在 " + file.getName());
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
private void moveFileToCustomer(List<File> files) { private void moveFileToCustomer(List<File> files) {

View File

@@ -1,6 +1,5 @@
package com.ecep.contract.manager.ds.vendor.controller.approved_list; package com.ecep.contract.manager.ds.vendor.controller.approved_list;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.company.CompanyFileUtils; import com.ecep.contract.manager.ds.company.CompanyFileUtils;
import com.ecep.contract.manager.ds.vendor.model.CompanyVendorApprovedFile; import com.ecep.contract.manager.ds.vendor.model.CompanyVendorApprovedFile;
import com.ecep.contract.manager.ds.vendor.model.CompanyVendorApprovedList; import com.ecep.contract.manager.ds.vendor.model.CompanyVendorApprovedList;
@@ -10,6 +9,7 @@ import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorApprovedListViewModel
import com.ecep.contract.manager.ui.AbstEntityTableTabSkin; import com.ecep.contract.manager.ui.AbstEntityTableTabSkin;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.ui.TabSkin; import com.ecep.contract.manager.ui.TabSkin;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.SpecificationUtils; import com.ecep.contract.manager.util.SpecificationUtils;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.scene.control.Tab; import javafx.scene.control.Tab;
@@ -101,7 +101,7 @@ public class CompanyVendorApprovedListTabSkinFiles
setStatus("文件不存在 " + file.getName()); setStatus("文件不存在 " + file.getName());
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
} }

View File

@@ -1,11 +1,11 @@
package com.ecep.contract.manager.ds.vendor.controller.approved_list; package com.ecep.contract.manager.ds.vendor.controller.approved_list;
import com.ecep.contract.manager.Desktop;
import com.ecep.contract.manager.ds.vendor.model.CompanyVendorApprovedList; import com.ecep.contract.manager.ds.vendor.model.CompanyVendorApprovedList;
import com.ecep.contract.manager.ds.vendor.service.CompanyVendorApprovedListService; import com.ecep.contract.manager.ds.vendor.service.CompanyVendorApprovedListService;
import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorApprovedListViewModel; import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorApprovedListViewModel;
import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.AbstEntityController;
import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.ui.FxmlPath;
import com.ecep.contract.manager.util.DesktopUtils;
import com.ecep.contract.manager.util.UITools; import com.ecep.contract.manager.util.UITools;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.scene.control.*; import javafx.scene.control.*;
@@ -86,7 +86,7 @@ public class CompanyVendorApprovedListWindowController
setStatus("目录错误,不存在"); setStatus("目录错误,不存在");
return; return;
} }
Desktop.showInExplorer(file); DesktopUtils.showInExplorer(file);
} }
public void onVendorApprovedListVerifyAction(ActionEvent event) { public void onVendorApprovedListVerifyAction(ActionEvent event) {

View File

@@ -0,0 +1,78 @@
package com.ecep.contract.manager.util;
import java.io.File;
import java.io.IOException;
import java.util.function.Consumer;
import org.springframework.util.StringUtils;
import com.ecep.contract.manager.Desktop;
public class DesktopUtils {
/**
* 在默认浏览器中打开指定的URL。
* <p>
* 该函数使用JavaFX的HostServices类来调用系统默认的浏览器并打开传入的URL。
*
* @param url 要在浏览器中打开的URL字符串。该参数不能为空且应为有效的URL格式。
*/
public static void showInBrowse(String url) {
Desktop.instance.getHostServices().showDocument(url);
}
/**
* 在系统的文件资源管理器中打开指定的文件夹。
* <p>
* 该方法首先尝试使用 java.awt.Desktop API 打开文件夹。如果该 API 不支持,
* 则在 Windows 系统中使用 explorer.exe 打开文件夹。
*
* @param dir 要打开的文件夹对象。如果为 null 或无效路径,可能会抛出异常。
* @throws RuntimeException 如果使用 java.awt.Desktop 打开文件夹时发生 IOException
* 则将其包装为 RuntimeException 抛出。
*/
public static void showInExplorer(File dir) {
if (java.awt.Desktop.isDesktopSupported()) {
try {
java.awt.Desktop.getDesktop().open(dir);
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
try {
// 在Windows中使用explorer.exe打开文件夹路径用双引号括起来
Process process = Runtime.getRuntime().exec(
new String[] { "explorer.exe", "\"" + dir.getAbsolutePath() + "\"" }, null, new File("."));
// process.waitFor();
} catch (IOException e) {
if (Desktop.logger.isDebugEnabled()) {
Desktop.logger.debug("Unable open {}", dir.getAbsolutePath(), e);
}
}
}
}
public static void checkAndShowInExplorer(String path, Consumer<String> consumer) {
if (!StringUtils.hasText(path)) {
consumer.accept("文件/目录为空,无法打开");
return;
}
File file = new File(path);
if (!file.exists()) {
if (file.isFile()) {
consumer.accept("文件 " + file.getAbsolutePath() + " 不存在,请确认");
} else {
consumer.accept("目录 " + file.getAbsolutePath() + " 不存在,请确认");
}
return;
}
try {
showInExplorer(file);
consumer.accept("打开文件/目录 " + path);
} catch (Exception e) {
consumer.accept("打开文件错误:" + e.getMessage());
}
}
}