From 9cea5ed493d1e54df0d339b0d8ca92381ba6faaa Mon Sep 17 00:00:00 2001 From: SerinaNya <34389622+SerinaNya@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:36:24 +0800 Subject: [PATCH] feat(gui): add enable-Web-API toggle and web port settings - new "Web API settings" section after security settings in the Swing options panel: checkbox bound to webUI plus a port text field bound to webPort (empty -> default 4665; non-numeric or out of 0-65535 shows an invalid-port warning and aborts the save) - load handler fills both controls from the current config item - add i18n keys to klalb_zh_CN / klalb_en_US bundles - include previously missing webUI/webPort fields in KLALBControllerConfigItem equals/hashCode --- src/klalb_en_US.properties | 6 ++- src/klalb_zh_CN.properties | 6 ++- .../klalb/KLALBControllerConfigItem.java | 4 +- .../network/klalb/ui/KLALBStateGUI3.java | 43 ++++++++++++++++++- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/klalb_en_US.properties b/src/klalb_en_US.properties index 97ed089..fa87769 100644 --- a/src/klalb_en_US.properties +++ b/src/klalb_en_US.properties @@ -111,4 +111,8 @@ performancesettings=Performance settings performancestrategy=Performance strategy singlecore=Single-Core - Cache Affinity First (Best energy/performance ratio, for low-power & cloud) multifill=Multi-Core - Fill Cores Sequentially (Recommended for general-purpose physical servers) -multiscatter=Multi-Core - Spread Load Evenly (Optimized for multi-socket NUMA architectures) \ No newline at end of file +multiscatter=Multi-Core - Spread Load Evenly (Optimized for multi-socket NUMA architectures) +webapisettings=Web API settings +enablewebapi=Enable Web API +webport=Web port +invaildwebport=Invalid web port number diff --git a/src/klalb_zh_CN.properties b/src/klalb_zh_CN.properties index c1257cd..96e4c40 100644 --- a/src/klalb_zh_CN.properties +++ b/src/klalb_zh_CN.properties @@ -111,4 +111,8 @@ performancesettings=性能设置 performancestrategy=性能策略 singlecore=单核-缓存命中率优先(高能耗比,适合低功耗设备、云机) multifill=多核-负载按顺序填充(适合大多数物理服务器、电脑) -multiscatter=多核-负载均匀打散分配(适合特殊的多路NUMA服务器) \ No newline at end of file +multiscatter=多核-负载均匀打散分配(适合特殊的多路NUMA服务器) +webapisettings=Web API \u8bbe\u7f6e +enablewebapi=\u542f\u7528 Web API +webport=Web \u7aef\u53e3 +invaildwebport=\u65e0\u6548\u7684 Web \u7aef\u53e3\u53f7 diff --git a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java index 1272d12..4e4ba31 100644 --- a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java +++ b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java @@ -408,11 +408,11 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; KLALBControllerConfigItem that = (KLALBControllerConfigItem) o; - return nogui == that.nogui && enableTUN == that.enableTUN && denyExternalEndpointQuery == that.denyExternalEndpointQuery && denyExternalEndpointBroadcast == that.denyExternalEndpointBroadcast && Double.compare(burstLimit, that.burstLimit) == 0 && Double.compare(delayUpperBound, that.delayUpperBound) == 0 && Double.compare(delayLowerBound, that.delayLowerBound) == 0 && nagleDelayTime == that.nagleDelayTime && linkNagleDelayTime == that.linkNagleDelayTime && linkConnectionsCount == that.linkConnectionsCount && Objects.equals(language, that.language) && Objects.equals(VirtualAddress, that.VirtualAddress) && Objects.equals(VirtualASN, that.VirtualASN) && Objects.equals(DNS, that.DNS) && Objects.equals(TCPListen, that.TCPListen) && Objects.equals(UDPListen, that.UDPListen) && Objects.equals(VirtualSocketName, that.VirtualSocketName) && Objects.equals(externalEndpoints, that.externalEndpoints) && Objects.equals(autoConnections, that.autoConnections) && Objects.equals(ntpServers, that.ntpServers) && Objects.equals(ExtraRoutes, that.ExtraRoutes) && Objects.equals(congestionAlgorithm, that.congestionAlgorithm) && Objects.equals(TUNName, that.TUNName) && Objects.equals(performanceStrategy, that.performanceStrategy) && Objects.equals(DeviceName, that.DeviceName) && Objects.equals(DeviceDescription, that.DeviceDescription) && Objects.equals(NetworkInterfaceExcepts, that.NetworkInterfaceExcepts); + return nogui == that.nogui && enableTUN == that.enableTUN && webUI == that.webUI && denyExternalEndpointQuery == that.denyExternalEndpointQuery && denyExternalEndpointBroadcast == that.denyExternalEndpointBroadcast && Double.compare(burstLimit, that.burstLimit) == 0 && Double.compare(delayUpperBound, that.delayUpperBound) == 0 && Double.compare(delayLowerBound, that.delayLowerBound) == 0 && nagleDelayTime == that.nagleDelayTime && linkNagleDelayTime == that.linkNagleDelayTime && linkConnectionsCount == that.linkConnectionsCount && webPort == that.webPort && Objects.equals(language, that.language) && Objects.equals(VirtualAddress, that.VirtualAddress) && Objects.equals(VirtualASN, that.VirtualASN) && Objects.equals(DNS, that.DNS) && Objects.equals(TCPListen, that.TCPListen) && Objects.equals(UDPListen, that.UDPListen) && Objects.equals(VirtualSocketName, that.VirtualSocketName) && Objects.equals(externalEndpoints, that.externalEndpoints) && Objects.equals(autoConnections, that.autoConnections) && Objects.equals(ntpServers, that.ntpServers) && Objects.equals(ExtraRoutes, that.ExtraRoutes) && Objects.equals(congestionAlgorithm, that.congestionAlgorithm) && Objects.equals(TUNName, that.TUNName) && Objects.equals(performanceStrategy, that.performanceStrategy) && Objects.equals(DeviceName, that.DeviceName) && Objects.equals(DeviceDescription, that.DeviceDescription) && Objects.equals(NetworkInterfaceExcepts, that.NetworkInterfaceExcepts); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), language, nogui, VirtualAddress, VirtualASN, DNS, TCPListen, UDPListen, VirtualSocketName, externalEndpoints, autoConnections, ntpServers, ExtraRoutes, denyExternalEndpointQuery, denyExternalEndpointBroadcast, congestionAlgorithm, burstLimit, delayUpperBound, delayLowerBound, nagleDelayTime, linkNagleDelayTime, linkConnectionsCount, enableTUN, TUNName, performanceStrategy, DeviceName, DeviceDescription, NetworkInterfaceExcepts); + return Objects.hash(super.hashCode(), language, nogui, VirtualAddress, VirtualASN, DNS, TCPListen, UDPListen, VirtualSocketName, externalEndpoints, autoConnections, ntpServers, ExtraRoutes, denyExternalEndpointQuery, denyExternalEndpointBroadcast, congestionAlgorithm, burstLimit, delayUpperBound, delayLowerBound, nagleDelayTime, linkNagleDelayTime, linkConnectionsCount, enableTUN, TUNName, performanceStrategy, DeviceName, DeviceDescription, NetworkInterfaceExcepts, webUI, webPort); } } diff --git a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java index e08c68a..51295bb 100644 --- a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java +++ b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java @@ -76,6 +76,7 @@ public class KLALBStateGUI3 extends XFrame { private JTextField addressFieldSet; // 地址设置框 private JTextField asnFieldSet; // ASN设置框 private JTextField tunDeviceName; // 虚拟网卡名称设置框 + private JTextField webPortSet; // Web API 端口设置框 private NetworkGraphPanel graph; // 网络图面板 private JTextField textFieldLocate; // 定位地址输入框 private JTextField asnField2; // ASN显示框 @@ -96,6 +97,7 @@ public class KLALBStateGUI3 extends XFrame { private JTextArea ntpServerSet; // NTP服务器设置区域 private JCheckBox denyBroadcast; private JCheckBox denyQuery; + private JCheckBox webApiEnabled; // 启用 Web API 开关 private ClosableTabbedPane tabbedPane; // 可关闭的标签页面板 private JCheckBox nogui; @@ -904,7 +906,22 @@ public class KLALBStateGUI3 extends XFrame { CONST.itemwidth, CONST.settingheight); denyBroadcast=denyBroadcastc.getCheckBox(); settings.getView().add(denyBroadcastc); - + + // Web服务设置标题 + SettingItem wsi = new SettingItem(UIEnv.getRsb().getString("webapisettings"), + UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), CONST.itemwidth, CONST.settingheight); + settings.getView().add(wsi); + + CheckBoxSettingItem webApic = new CheckBoxSettingItem(UIEnv.getRsb().getString("enablewebapi"), + CONST.itemwidth, CONST.settingheight); + webApiEnabled=webApic.getCheckBox(); + settings.getView().add(webApic); + + TextSettingItem webPort = new TextSettingItem(UIEnv.getRsb().getString("webport"), + CONST.itemwidth, CONST.settingheight); + webPortSet = webPort.getTextField(); + settings.getView().add(webPort); + //性能设置标题 SettingItem pshi = new SettingItem(UIEnv.getRsb().getString("performancesettings"), @@ -1140,6 +1157,26 @@ public class KLALBStateGUI3 extends XFrame { }else { kck.setTUNName(tunNameText); } + + // 保存Web API设置 + kck.setWebUI(webApiEnabled.isSelected()); + String webPortText = webPortSet.getText().trim(); + if (webPortText.equals("")) { + kck.setWebPort(4665); + } else { + try { + int wp = Integer.parseInt(webPortText); + if (wp < 0 || wp > 65535) { + throw new NumberFormatException("out of range"); + } + kck.setWebPort(wp); + } catch (NumberFormatException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(this, UIEnv.getRsb().getString("invaildwebport"), + UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; + } + } // 保存TCP监听设置 String tcptext = tcpListeningSet.getText(); @@ -1540,6 +1577,10 @@ public class KLALBStateGUI3 extends XFrame { String tunname=kck.getTUNName(); tunDeviceName.setText(tunname!=null?tunname:""); + + // 加载Web API设置 + webApiEnabled.setSelected(kck.isWebUI()); + webPortSet.setText(Integer.toString(kck.getWebPort())); // 加载TCP监听 MultiProtocolSocketAddress mpat = kck.getTCPListen();