新增服务器连接配置

This commit is contained in:
lifangliang 2025-07-11 17:47:22 +08:00
parent 1486e1f6ec
commit e525e06d7a
6 changed files with 129 additions and 11 deletions

View File

@ -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;
}
}

View File

@ -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<String> 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"));

View File

@ -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服务器

View File

@ -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

View File

@ -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}

View File

@ -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}