From e525e06d7a7366df53468826d05fbdb0b0a51b31 Mon Sep 17 00:00:00 2001 From: lifangliang Date: Fri, 11 Jul 2025 17:47:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/config/PrintServerConfig.java | 15 ++++ .../main/gui/PrintSettingsPanel.java | 78 ++++++++++++++++++- .../printserver/main/sse/PrinterClient.java | 36 +++++++-- src/main/resources/messages.properties | 3 + src/main/resources/messages_en.properties | 4 + src/main/resources/messages_zh_CN.properties | 4 + 6 files changed, 129 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java b/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java index 75da53d..8f77ad2 100644 --- a/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java +++ b/src/main/java/com/goeing/printserver/main/config/PrintServerConfig.java @@ -28,6 +28,9 @@ public class PrintServerConfig { private static final boolean DEFAULT_ENABLE_NOTIFICATIONS = true; private static final boolean DEFAULT_START_MINIMIZED = false; private static final boolean DEFAULT_AUTO_START = false; + private static final String DEFAULT_WEBSOCKET_URL = "ws://127.0.0.1:8080/print-websocket"; + private static final String DEFAULT_PRINTER_ID = "123456"; + private static final String DEFAULT_API_KEY = "519883ab-3677-ce4b-59ba-7263870d0a26"; // 配置属性 private String defaultPrinter = DEFAULT_PRINTER; @@ -35,6 +38,9 @@ public class PrintServerConfig { private boolean enableNotifications = DEFAULT_ENABLE_NOTIFICATIONS; private boolean startMinimized = DEFAULT_START_MINIMIZED; private boolean autoStart = DEFAULT_AUTO_START; + private String websocketUrl = DEFAULT_WEBSOCKET_URL; + private String printerId = DEFAULT_PRINTER_ID; + private String apiKey = DEFAULT_API_KEY; private Properties properties = new Properties(); private File configFile; @@ -68,6 +74,9 @@ public class PrintServerConfig { enableNotifications = Boolean.parseBoolean(properties.getProperty("enableNotifications", String.valueOf(DEFAULT_ENABLE_NOTIFICATIONS))); startMinimized = Boolean.parseBoolean(properties.getProperty("startMinimized", String.valueOf(DEFAULT_START_MINIMIZED))); autoStart = Boolean.parseBoolean(properties.getProperty("autoStart", String.valueOf(DEFAULT_AUTO_START))); + websocketUrl = properties.getProperty("websocketUrl", DEFAULT_WEBSOCKET_URL); + printerId = properties.getProperty("printerId", DEFAULT_PRINTER_ID); + apiKey = properties.getProperty("apiKey", DEFAULT_API_KEY); log.info("配置已加载: {}", configFile.getAbsolutePath()); } catch (IOException e) { @@ -98,6 +107,9 @@ public class PrintServerConfig { properties.setProperty("enableNotifications", String.valueOf(enableNotifications)); properties.setProperty("startMinimized", String.valueOf(startMinimized)); properties.setProperty("autoStart", String.valueOf(autoStart)); + properties.setProperty("websocketUrl", websocketUrl); + properties.setProperty("printerId", printerId); + properties.setProperty("apiKey", apiKey); // 保存到文件 try (FileOutputStream fos = new FileOutputStream(configFile)) { @@ -118,5 +130,8 @@ public class PrintServerConfig { enableNotifications = DEFAULT_ENABLE_NOTIFICATIONS; startMinimized = DEFAULT_START_MINIMIZED; autoStart = DEFAULT_AUTO_START; + websocketUrl = DEFAULT_WEBSOCKET_URL; + printerId = DEFAULT_PRINTER_ID; + apiKey = DEFAULT_API_KEY; } } \ No newline at end of file diff --git a/src/main/java/com/goeing/printserver/main/gui/PrintSettingsPanel.java b/src/main/java/com/goeing/printserver/main/gui/PrintSettingsPanel.java index d018376..37d3824 100644 --- a/src/main/java/com/goeing/printserver/main/gui/PrintSettingsPanel.java +++ b/src/main/java/com/goeing/printserver/main/gui/PrintSettingsPanel.java @@ -2,6 +2,7 @@ package com.goeing.printserver.main.gui; import com.goeing.printserver.main.PrintController; import com.goeing.printserver.main.config.PrintServerConfig; +import com.goeing.printserver.main.sse.PrinterClient; import com.goeing.printserver.main.utils.LocaleChangeListener; import com.goeing.printserver.main.utils.LocaleManager; import com.goeing.printserver.main.utils.MessageUtils; @@ -28,6 +29,7 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { private final PrintQueueService printQueueService; private final PrintServerConfig config; private final PrintController printController; + private final PrinterClient printerClient; // UI组件 private JComboBox defaultPrinterComboBox; @@ -35,19 +37,26 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { private JCheckBox enableNotificationsCheckBox; private JCheckBox startMinimizedCheckBox; private JCheckBox autoStartCheckBox; + private JTextField websocketUrlField; + private JTextField printerIdField; + private JTextField apiKeyField; // 标签和按钮 private JLabel titleLabel; private JLabel defaultPrinterLabel; private JLabel maxQueueSizeLabel; + private JLabel websocketUrlLabel; + private JLabel printerIdLabel; + private JLabel apiKeyLabel; private JButton saveButton; private JButton resetButton; @Autowired - public PrintSettingsPanel(PrintQueueService printQueueService, PrintServerConfig config, PrintController printController) { + public PrintSettingsPanel(PrintQueueService printQueueService, PrintServerConfig config, PrintController printController, PrinterClient printerClient) { this.printQueueService = printQueueService; this.config = config; this.printController = printController; + this.printerClient = printerClient; initializeUI(); loadSettings(); @@ -121,9 +130,47 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { autoStartCheckBox = new JCheckBox(MessageUtils.getMessage("settings.autoStart")); settingsPanel.add(autoStartCheckBox, gbc); - // 添加一个弹性空间 + // WebSocket URL设置 gbc.gridx = 0; gbc.gridy = 5; + gbc.gridwidth = 1; + gbc.weightx = 0.0; + websocketUrlLabel = new JLabel(MessageUtils.getMessage("settings.websocketUrl")); + settingsPanel.add(websocketUrlLabel, gbc); + + gbc.gridx = 1; + gbc.weightx = 1.0; + websocketUrlField = new JTextField(); + settingsPanel.add(websocketUrlField, gbc); + + // 打印机ID设置 + gbc.gridx = 0; + gbc.gridy = 6; + gbc.weightx = 0.0; + printerIdLabel = new JLabel(MessageUtils.getMessage("settings.printerId")); + settingsPanel.add(printerIdLabel, gbc); + + gbc.gridx = 1; + gbc.weightx = 1.0; + printerIdField = new JTextField(); + settingsPanel.add(printerIdField, gbc); + + // API Key设置 + gbc.gridx = 0; + gbc.gridy = 7; + gbc.weightx = 0.0; + apiKeyLabel = new JLabel(MessageUtils.getMessage("settings.apiKey")); + settingsPanel.add(apiKeyLabel, gbc); + + gbc.gridx = 1; + gbc.weightx = 1.0; + apiKeyField = new JTextField(); + settingsPanel.add(apiKeyField, gbc); + + // 添加一个弹性空间 + gbc.gridx = 0; + gbc.gridy = 8; + gbc.gridwidth = 2; gbc.weighty = 1.0; settingsPanel.add(Box.createVerticalGlue(), gbc); @@ -158,6 +205,9 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { enableNotificationsCheckBox.setSelected(config.isEnableNotifications()); startMinimizedCheckBox.setSelected(config.isStartMinimized()); autoStartCheckBox.setSelected(config.isAutoStart()); + websocketUrlField.setText(config.getWebsocketUrl()); + printerIdField.setText(config.getPrinterId()); + apiKeyField.setText(config.getApiKey()); } /** @@ -171,6 +221,14 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { boolean enableNotifications = enableNotificationsCheckBox.isSelected(); boolean startMinimized = startMinimizedCheckBox.isSelected(); boolean autoStart = autoStartCheckBox.isSelected(); + String websocketUrl = websocketUrlField.getText().trim(); + String printerId = printerIdField.getText().trim(); + String apiKey = apiKeyField.getText().trim(); + + // 检查WebSocket相关配置是否发生变化 + boolean websocketConfigChanged = !websocketUrl.equals(config.getWebsocketUrl()) || + !printerId.equals(config.getPrinterId()) || + !apiKey.equals(config.getApiKey()); // 更新配置对象 config.setDefaultPrinter(defaultPrinter); @@ -178,6 +236,9 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { config.setEnableNotifications(enableNotifications); config.setStartMinimized(startMinimized); config.setAutoStart(autoStart); + config.setWebsocketUrl(websocketUrl); + config.setPrinterId(printerId); + config.setApiKey(apiKey); // 保存配置 config.saveConfig(); @@ -185,7 +246,15 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { // 应用设置到服务 applySettings(); - JOptionPane.showMessageDialog(this, MessageUtils.getMessage("settings.saved"), MessageUtils.getMessage("dialog.success"), JOptionPane.INFORMATION_MESSAGE); + // 如果WebSocket配置发生变化,重新连接WebSocket + if (websocketConfigChanged) { + printerClient.reconnect(); + String message = MessageUtils.getMessage("settings.saved") + "\n\n" + + MessageUtils.getMessage("settings.websocket.reconnected"); + JOptionPane.showMessageDialog(this, message, MessageUtils.getMessage("dialog.success"), JOptionPane.INFORMATION_MESSAGE); + } else { + JOptionPane.showMessageDialog(this, MessageUtils.getMessage("settings.saved"), MessageUtils.getMessage("dialog.success"), JOptionPane.INFORMATION_MESSAGE); + } } catch (Exception e) { log.error(MessageUtils.getMessage("log.settings.save.error"), e); JOptionPane.showMessageDialog(this, MessageUtils.getMessage("settings.save.error", new Object[]{e.getMessage()}), MessageUtils.getMessage("dialog.error"), JOptionPane.ERROR_MESSAGE); @@ -346,6 +415,9 @@ public class PrintSettingsPanel extends JPanel implements LocaleChangeListener { titleLabel.setText(MessageUtils.getMessage("settings.title")); defaultPrinterLabel.setText(MessageUtils.getMessage("settings.defaultPrinter")); maxQueueSizeLabel.setText(MessageUtils.getMessage("settings.maxQueueSize")); + websocketUrlLabel.setText(MessageUtils.getMessage("settings.websocketUrl")); + printerIdLabel.setText(MessageUtils.getMessage("settings.printerId")); + apiKeyLabel.setText(MessageUtils.getMessage("settings.apiKey")); // 更新复选框 enableNotificationsCheckBox.setText(MessageUtils.getMessage("settings.notifications")); diff --git a/src/main/java/com/goeing/printserver/main/sse/PrinterClient.java b/src/main/java/com/goeing/printserver/main/sse/PrinterClient.java index f51a665..ea44158 100644 --- a/src/main/java/com/goeing/printserver/main/sse/PrinterClient.java +++ b/src/main/java/com/goeing/printserver/main/sse/PrinterClient.java @@ -4,6 +4,7 @@ import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.goeing.printserver.main.PrintController; +import com.goeing.printserver.main.config.PrintServerConfig; import com.goeing.printserver.main.domain.dto.WebSocketMessageDTO; import com.goeing.printserver.main.domain.request.PrintRequest; import com.goeing.printserver.main.service.PrintQueueService; @@ -30,21 +31,17 @@ import java.util.stream.Collectors; @Slf4j public class PrinterClient implements ApplicationRunner { private final PrintQueueService printQueueService; + private final PrintServerConfig config; private Session session; - @Value("${print.printer.id}") - private String printerId; - @Value("${print.websocket.url}") - private String serverUri; - @Value("${print.websocket.apiKey}") - private String apiKey; private final ScheduledExecutorService reconnectExecutor = Executors.newSingleThreadScheduledExecutor(); private final ScheduledExecutorService heartbeatExecutor = Executors.newSingleThreadScheduledExecutor(); private boolean isConnecting = false; - // 构造函数,注入PrintQueueService - public PrinterClient(PrintQueueService printQueueService) { + // 构造函数,注入PrintQueueService和PrintServerConfig + public PrinterClient(PrintQueueService printQueueService, PrintServerConfig config) { this.printQueueService = printQueueService; + this.config = config; // 构造函数不做连接操作,在run方法中进行连接 } @@ -150,6 +147,12 @@ public class PrinterClient implements ApplicationRunner { if (isConnecting || (session != null && session.isOpen())) { return; // 已经连接或正在连接中 } + + // 从配置对象中获取最新的连接参数 + String serverUri = config.getWebsocketUrl(); + String printerId = config.getPrinterId(); + String apiKey = config.getApiKey(); + String tempUrl = serverUri+"?printerId="+printerId+"&apiKey="+apiKey; isConnecting = true; @@ -212,6 +215,23 @@ public class PrinterClient implements ApplicationRunner { log.info("WebSocket客户端已关闭"); } + /** + * 重新连接WebSocket服务器(用于配置更改后) + */ + public void reconnect() { + log.info("配置已更改,重新连接WebSocket服务器..."); + if (session != null && session.isOpen()) { + try { + session.close(); + } catch (Exception e) { + log.error("关闭现有连接失败", e); + } + } + session = null; + isConnecting = false; + connect(); + } + @Override public void run(ApplicationArguments args) { // 应用启动后连接到WebSocket服务器 diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index a499ea3..020ec84 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -103,6 +103,9 @@ settings.maxQueueSize=Max Queue Size: settings.notifications=Enable System Notifications settings.startMinimized=Start Minimized to System Tray settings.autoStart=Start Automatically at Login +settings.websocketUrl=WebSocket URL: +settings.printerId=Printer ID: +settings.apiKey=API Key: settings.save=Save Settings settings.reset=Reset to Defaults settings.saved=Settings have been saved diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 02fcdcf..b271995 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -103,9 +103,13 @@ settings.maxQueueSize=Max Queue Size: settings.notifications=Enable System Notifications settings.startMinimized=Start Minimized to System Tray settings.autoStart=Start Automatically at Login +settings.websocketUrl=WebSocket URL: +settings.printerId=Printer ID: +settings.apiKey=API Key: settings.save=Save Settings settings.reset=Reset to Defaults settings.saved=Settings have been saved +settings.websocket.reconnected=WebSocket configuration has been changed and the connection has been automatically reconnected. settings.reset.confirm=Are you sure you want to reset all settings to default values? settings.reset.success=Settings have been reset to default values settings.save.error=Failed to save settings: {0} diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 48901d1..9ef82e8 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -101,9 +101,13 @@ settings.maxQueueSize=最大队列大小: settings.notifications=启用系统通知 settings.startMinimized=启动时最小化到系统托盘 settings.autoStart=开机自动启动 +settings.websocketUrl=WebSocket地址: +settings.printerId=打印机ID: +settings.apiKey=API密钥: settings.save=保存设置 settings.reset=重置默认 settings.saved=设置已保存 +settings.websocket.reconnected=WebSocket配置已更改,连接已自动重新建立。 settings.reset.confirm=确定要重置所有设置为默认值吗? settings.reset.success=设置已重置为默认值 settings.save.error=保存设置失败: {0}