Selaa lähdekoodia

docs: 统一网络地址校验提示文案为网段地址

yangkaixiang 1 kuukausi sitten
vanhempi
commit
a48c3f8d8c

+ 1 - 1
docs/03-通信与HTTP_API.md

@@ -327,7 +327,7 @@ X-Admin-Password: hvAC2026#%
 3. `addresses[].prefix` 必填
 4. `dns` 选填
 5. `interface` 必填,必须是有效的真实接口名
-6. `routes[].to` 必须为 `default` 或 IPv4 CIDR,且 CIDR 地址必须是该前缀下的网络地址,例如 `192.168.50.0/24` 合法,`192.168.50.0/16` 应写为 `192.168.0.0/16`
+6. `routes[].to` 必须为 `default` 或 IPv4 CIDR,且 CIDR 地址必须填写目标网段地址(网络号),例如 `192.168.50.0/24` 合法,`192.168.50.0/16` 应写为 `192.168.0.0/16`
 7. `routes[].via` 必须为 IPv4 地址,且必须与任一 `addresses` 在同一子网
 8. 若任一 `addresses[].ip` 为 `169.254.x.x`,返回中文警告,不直接报错
 9. 单个接口最多只能配置 1 条 `default` 路由

+ 1 - 1
docs/05-Server模块设计.md

@@ -174,7 +174,7 @@
 1. 校验目标接口是否存在
 2. 校验 IP 格式
 3. 校验前缀长度
-4. 校验静态 IP 不能是所在网段的网络地址或广播地址
+4. 校验静态接口 IP 不能填写所在网段的网段地址或广播地址
 5. 校验网关格式和同网段关系
 6. 校验 DNS 格式
 7. 返回警告信息和错误信息

+ 2 - 2
docs/09-使用说明与故障处理.md

@@ -181,11 +181,11 @@ hvAC2026#%
 1. 静态模式下至少需要一个 IP 地址。
 2. IP、网关、DNS 必须是合法 IPv4。
 3. 子网掩码必须合法。
-4. 静态 IP 不能是所在网段的网络地址或广播地址。
+4. 静态接口 IP 不能填写所在网段的网段地址或广播地址。
 5. 默认网关必须与对应网口 IP 在同一网段。
 6. 单个接口最多只能有一条默认路由。
 7. 所有网口中最多只能配置一个默认网关。
-8. 自定义路由目标必须是网络地址,例如 `192.168.50.0/24` 合法,`192.168.50.0/16` 应写为 `192.168.0.0/16`。
+8. 自定义路由目标必须填写目标网段地址(网络号),例如 `192.168.50.0/24` 合法,`192.168.50.0/16` 应写为 `192.168.0.0/16`。
 
 ### 3.8 保存配置
 

+ 1 - 1
server/internal/config/config.go

@@ -6,7 +6,7 @@ import (
 	"net"
 )
 
-const ServerVersion = "2026.05.15.1730"
+const ServerVersion = "2026.05.15.1732"
 
 type Config struct {
 	HTTPHost         string

+ 2 - 2
server/internal/network/validator/validator.go

@@ -49,7 +49,7 @@ func (s *Service) Validate(input model.InterfaceConfig) model.ValidateResponse {
 			continue
 		}
 		if isNetworkOrBroadcastAddress(ip, address.Prefix) {
-			resp.Errors = append(resp.Errors, fmt.Sprintf("IP 地址不能是网络地址或广播地址:%s/%d", address.IP, address.Prefix))
+			resp.Errors = append(resp.Errors, fmt.Sprintf("接口 IP 不能填写网段地址或广播地址:%s/%d", address.IP, address.Prefix))
 			continue
 		}
 		key := fmt.Sprintf("%s/%d", ip.String(), address.Prefix)
@@ -88,7 +88,7 @@ func (s *Service) Validate(input model.InterfaceConfig) model.ValidateResponse {
 				networkIP := ipv4.Mask(ipNet.Mask)
 				prefix, _ := ipNet.Mask.Size()
 				if !ipv4.Equal(networkIP) {
-					resp.Errors = append(resp.Errors, fmt.Sprintf("路由目标必须是网络地址:当前为 %s,应为 %s/%d", to, networkIP.String(), prefix))
+					resp.Errors = append(resp.Errors, fmt.Sprintf("路由目标必须填写目标网段地址(网络号):当前为 %s,应为 %s/%d", to, networkIP.String(), prefix))
 				}
 			}
 		}

+ 5 - 5
windows/NetTool.Client/DeviceDetailsWindow.xaml.cs

@@ -595,7 +595,7 @@ public partial class DeviceDetailsWindow : Window
                 if (IsNetworkOrBroadcastAddress(parts[0], cidrPrefix))
                 {
                     addresses = [];
-                    error = $"IP 地址不能是网络地址或广播地址:{parts[0]}/{cidrPrefix}";
+                    error = $"接口 IP 不能填写网段地址或广播地址:{parts[0]}/{cidrPrefix}";
                     return false;
                 }
                 row.IP = parts[0];
@@ -618,7 +618,7 @@ public partial class DeviceDetailsWindow : Window
             if (IsNetworkOrBroadcastAddress(ip, prefix))
             {
                 addresses = [];
-                error = $"IP 地址不能是网络地址或广播地址:{ip}/{prefix}";
+                error = $"接口 IP 不能填写网段地址或广播地址:{ip}/{prefix}";
                 return false;
             }
             row.Mask = PrefixToMask(prefix);
@@ -699,7 +699,7 @@ public partial class DeviceDetailsWindow : Window
                 if (!string.Equals(to, networkAddress, StringComparison.Ordinal))
                 {
                     routes = [];
-                    error = $"自定义路由目标必须是网络地址:当前为 {to}/{prefix},应为 {networkAddress}/{prefix}";
+                    error = $"自定义路由目标必须填写目标网段地址(网络号):当前为 {to}/{prefix},应为 {networkAddress}/{prefix}";
                     return false;
                 }
                 row.Mask = PrefixToMask(prefix);
@@ -751,7 +751,7 @@ public partial class DeviceDetailsWindow : Window
                 if (IsNetworkOrBroadcastAddress(cidrParts[0], prefix))
                 {
                     addresses = [];
-                    error = $"IP 地址不能是网络地址或广播地址:{cidrParts[0]}/{prefix}";
+                    error = $"接口 IP 不能填写网段地址或广播地址:{cidrParts[0]}/{prefix}";
                     return false;
                 }
                 result.Add(new RemoteInterfaceAddressConfig { IP = cidrParts[0], Prefix = prefix });
@@ -773,7 +773,7 @@ public partial class DeviceDetailsWindow : Window
             if (IsNetworkOrBroadcastAddress(parts[0], parsedPrefix))
             {
                 addresses = [];
-                error = $"IP 地址不能是网络地址或广播地址:{parts[0]}/{parsedPrefix}";
+                error = $"接口 IP 不能填写网段地址或广播地址:{parts[0]}/{parsedPrefix}";
                 return false;
             }
             result.Add(new RemoteInterfaceAddressConfig { IP = parts[0], Prefix = parsedPrefix });

+ 1 - 1
windows/NetTool.Client/NetTool.Client.csproj

@@ -8,7 +8,7 @@
     <UseWPF>true</UseWPF>
     <AssemblyName>NetTool.Client</AssemblyName>
     <RootNamespace>NetTool.Client</RootNamespace>
-    <InformationalVersion>2026.05.15.1730</InformationalVersion>
+    <InformationalVersion>2026.05.15.1732</InformationalVersion>
   </PropertyGroup>
 
 </Project>