From 58aa779a60ea7e12f0c1a56463b196e36ff16de8 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 27 Feb 2026 11:12:19 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=90=AF=E5=8A=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- punchnet/Views/AppContext.swift | 18 +++++++++++++++++ punchnet/Views/Network/NetworkModel.swift | 24 ++++++++++++++--------- punchnet/Views/Network/NetworkView.swift | 18 +++++++++-------- punchnet/Views/RootView.swift | 2 +- punchnet/punchnetApp.swift | 4 ++++ 5 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 punchnet/Views/AppContext.swift diff --git a/punchnet/Views/AppContext.swift b/punchnet/Views/AppContext.swift new file mode 100644 index 0000000..22b7715 --- /dev/null +++ b/punchnet/Views/AppContext.swift @@ -0,0 +1,18 @@ +// +// LoginState.swift +// punchnet +// +// Created by 安礼成 on 2026/1/16. +// + +import Foundation +import Observation + +@Observable +class AppContext { + var noticePort: Int + + init(noticePort: Int) { + self.noticePort = noticePort + } +} diff --git a/punchnet/Views/Network/NetworkModel.swift b/punchnet/Views/Network/NetworkModel.swift index e797d50..bb84f34 100644 --- a/punchnet/Views/Network/NetworkModel.swift +++ b/punchnet/Views/Network/NetworkModel.swift @@ -48,16 +48,28 @@ struct Node: Codable { } } +// 用来做临时的数据解析 struct NetworkContext: Codable { let ip: String + let maskLen: UInt8 + let hostname: String + let identityId: UInt32 let resourceList: [Resource] let nodeList: [Node] enum CodingKeys: String, CodingKey { case ip + case maskLen = "mask_len" + case hostname + case identityId = "identity_id" case resourceList = "resource_list" case nodeList = "node_list" } + + static func `default`() -> Self { + return .init(ip: "", maskLen: 24, hostname: "", identityId: 0, resourceList: [], nodeList: []) + } + } // 节点详情 @@ -105,10 +117,7 @@ class NetworkModel { // 当前选中的设备 var selectedNode: Node? - - var ip: String = "" - var resourceList: [Resource] = [] - var nodeList: [Node] = [] + var networkContext: NetworkContext = .default() init() { @@ -116,7 +125,7 @@ class NetworkModel { func changeSelectedNode(nodeId: Int?) { if let nodeId { - if let node = self.nodeList.first(where: { $0.id == nodeId}) { + if let node = self.networkContext.nodeList.first(where: { $0.id == nodeId}) { self.selectedNode = node } } @@ -128,10 +137,7 @@ class NetworkModel { "access_token": networkSession.accessToken ] - let networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self) - self.ip = networkContext.ip - self.resourceList = networkContext.resourceList - self.nodeList = networkContext.nodeList + self.networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self) self.connectState = .connected self.isOn = true } diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index 284eaf9..9888dec 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -95,6 +95,7 @@ struct NetworkView: View { // 网络处于未连接状态 struct NetworkDisconnctedView: View { @Bindable var networkModel: NetworkModel + @Environment(AppContext.self) var appContext: AppContext @Environment(UserContext.self) var userContext: UserContext @State private var showAlert = false @@ -163,14 +164,15 @@ struct NetworkDisconnctedView: View { return } + let networkContext = networkModel.networkContext let options = SystemConfig.getOptions(networkId: UInt32(networkSession.networkId), networkDomain: networkSession.networkDomain, - ip: "", - maskLen: 24, + ip: networkContext.ip, + maskLen: networkContext.maskLen, accessToken: networkSession.accessToken, - identityId: 1234, - hostname: "mysql", - noticePort: 1234) + identityId: networkContext.identityId, + hostname: networkContext.hostname, + noticePort: self.appContext.noticePort) // token存在则优先使用token try await VPNManager.shared.enableVpn(options: options!) } @@ -185,7 +187,7 @@ struct NetworkResourceGroupView: View { var body: some View { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) { - ForEach(self.networkModel.resourceList, id: \.id) { resource in + ForEach(self.networkModel.networkContext.resourceList, id: \.id) { resource in NetworkResourceView(resource: resource) } } @@ -219,7 +221,7 @@ struct NetworkDeviceGroupView: View { var body: some View { NavigationSplitView { - List(self.networkModel.nodeList, id: \.id, selection: $selectedId) { node in + List(self.networkModel.networkContext.nodeList, id: \.id, selection: $selectedId) { node in NetworkNodeHeadView(node: node) } .listStyle(.sidebar) @@ -228,7 +230,7 @@ struct NetworkDeviceGroupView: View { } .onAppear { if selectedId == nil { - selectedId = self.networkModel.nodeList.first?.id + selectedId = self.networkModel.networkContext.nodeList.first?.id } } } detail: { diff --git a/punchnet/Views/RootView.swift b/punchnet/Views/RootView.swift index 8336cf0..fb2020e 100644 --- a/punchnet/Views/RootView.swift +++ b/punchnet/Views/RootView.swift @@ -9,7 +9,7 @@ import SwiftUI struct RootView: View { @State private var userContext = UserContext() - + var body: some View { Group { if userContext.isLogined { diff --git a/punchnet/punchnetApp.swift b/punchnet/punchnetApp.swift index 6727af6..40245b1 100644 --- a/punchnet/punchnetApp.swift +++ b/punchnet/punchnetApp.swift @@ -36,10 +36,13 @@ struct punchnetApp: App { @ObservedObject var vpnManager = VPNManager.shared private var noticeServer: UDPNoticeCenterServer + @State private var appContext: AppContext init() { self.noticeServer = UDPNoticeCenterServer() self.noticeServer.start() + + self.appContext = AppContext(noticePort: self.noticeServer.port) } var body: some Scene { @@ -64,6 +67,7 @@ struct punchnetApp: App { } //.toolbar(.hidden) .navigationTitle("") + .environment(self.appContext) } .commands { CommandGroup(replacing: .appInfo) {