From 9b8d7c78f6966c3b7e7e8a27656c3241bc0f5f0f Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 26 Feb 2026 11:49:36 +0800 Subject: [PATCH] fix view --- .../Views/Network/NetworkConnctedView.swift | 28 +++--- .../Network/NetworkDisconnctedView.swift | 75 ---------------- ...{NetworkState.swift => NetworkModel.swift} | 26 ++++-- punchnet/Views/Network/NetworkView.swift | 87 +++++++++++++++++-- .../Views/Network/NetworkWaitAuthView.swift | 2 +- .../LoginState.swift => UserContext.swift} | 0 6 files changed, 112 insertions(+), 106 deletions(-) delete mode 100644 punchnet/Views/Network/NetworkDisconnctedView.swift rename punchnet/Views/Network/{NetworkState.swift => NetworkModel.swift} (86%) rename punchnet/Views/{Login/LoginState.swift => UserContext.swift} (100%) diff --git a/punchnet/Views/Network/NetworkConnctedView.swift b/punchnet/Views/Network/NetworkConnctedView.swift index a890220..fd12a03 100644 --- a/punchnet/Views/Network/NetworkConnctedView.swift +++ b/punchnet/Views/Network/NetworkConnctedView.swift @@ -7,15 +7,15 @@ import SwiftUI struct NetworkConnctedView: View { - @Bindable var state: NetworkState + @Bindable var networkModel: NetworkModel var body: some View { Group { - switch state.showModel { + switch networkModel.showModel { case .resource: - NetworkResourceGroupView(state: self.state) + NetworkResourceGroupView(networkModel: self.networkModel) case .device: - NetworkDeviceGroupView(state: self.state) + NetworkDeviceGroupView(networkModel: self.networkModel) } } } @@ -23,11 +23,11 @@ struct NetworkConnctedView: View { // 显示资源信息 struct NetworkResourceGroupView: View { - @Bindable var state: NetworkState + @Bindable var networkModel: NetworkModel var body: some View { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) { - ForEach(self.state.resources, id: \.id) { resource in + ForEach(self.networkModel.resources, id: \.id) { resource in NetworkResourceView(resource: resource) } } @@ -35,7 +35,7 @@ struct NetworkResourceGroupView: View { } struct NetworkResourceView: View { - var resource: NetworkState.Resource + var resource: NetworkModel.Resource var body: some View { VStack { @@ -56,32 +56,32 @@ struct NetworkResourceView: View { // 显示设备信息 struct NetworkDeviceGroupView: View { - @Bindable var state: NetworkState + @Bindable var networkModel: NetworkModel @State private var selectedId: Int? var body: some View { NavigationSplitView { - List(self.state.devices, id: \.id, selection: $selectedId) { device in + List(self.networkModel.devices, id: \.id, selection: $selectedId) { device in NetworkDeviceHeadView(device: device) } .listStyle(.sidebar) .onChange(of: selectedId) { - self.state.changeSelectedDevice(deviceId: selectedId) + self.networkModel.changeSelectedDevice(deviceId: selectedId) } .onAppear { if selectedId == nil { - selectedId = self.state.devices.first?.id + selectedId = self.networkModel.devices.first?.id } } } detail: { - NetworkDeviceDetailView(device: $state.selectedDevice) + NetworkDeviceDetailView(device: $networkModel.selectedDevice) } } } struct NetworkDeviceHeadView: View { - var device: NetworkState.Device + var device: NetworkModel.Device var body: some View { VStack { @@ -100,7 +100,7 @@ struct NetworkDeviceHeadView: View { } struct NetworkDeviceDetailView: View { - @Binding var device: NetworkState.Device? + @Binding var device: NetworkModel.Device? var body: some View { Group { diff --git a/punchnet/Views/Network/NetworkDisconnctedView.swift b/punchnet/Views/Network/NetworkDisconnctedView.swift deleted file mode 100644 index bb9db6b..0000000 --- a/punchnet/Views/Network/NetworkDisconnctedView.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// NetworkDisconnctedView.swift -// punchnet -// -// Created by 安礼成 on 2026/1/16. -// - -import SwiftUI - -struct NetworkDisconnctedView: View { - @Bindable var state: NetworkState - - var body: some View { - ZStack { - Color.clear - - VStack { - - Button { - Task { - try await startVpn() - } - } label: { - Text("连接") - .font(.system(size: 14, weight: .regular)) - .padding([.top, .bottom], 8) - .padding([.leading, .trailing], 30) - .foregroundColor(.white) - - } - .background(Color(red: 74/255, green: 207/255, blue: 154/255)) - .cornerRadius(5) - .frame(width: 120, height: 35) - - Button { - Task { - try await VPNManager.shared.disableVpn() - } - } label: { - Text("关闭") - .font(.system(size: 14, weight: .regular)) - .padding([.top, .bottom], 8) - .padding([.leading, .trailing], 30) - .foregroundColor(.white) - - } - .background(Color(red: 74/255, green: 207/255, blue: 154/255)) - .cornerRadius(5) - .frame(width: 120, height: 35) - } - } - - } - - // 执行登陆操作 - private func startVpn() async throws { - let clientId = SystemConfig.getClientId() - - let options = SystemConfig.getOptions(networkId: 8, - networkDomain: "punchnet.com", - ip: "10.211.179.1", - maskLen: 24, - accessToken: "accessToken1234", - identityId: 1234, - hostname: "mysql", - noticePort: 1234) - // token存在则优先使用token - try await VPNManager.shared.enableVpn(options: options!) - } - -} - -//#Preview { -// NetworkDisconnctedView() -//} diff --git a/punchnet/Views/Network/NetworkState.swift b/punchnet/Views/Network/NetworkModel.swift similarity index 86% rename from punchnet/Views/Network/NetworkState.swift rename to punchnet/Views/Network/NetworkModel.swift index 021e929..39d0879 100644 --- a/punchnet/Views/Network/NetworkState.swift +++ b/punchnet/Views/Network/NetworkModel.swift @@ -9,7 +9,7 @@ import Foundation import Observation @Observable -class NetworkState { +class NetworkModel { // 连接状态 enum ConnectState { @@ -24,6 +24,7 @@ class NetworkState { case device } + // 资源列表 struct Resource { var id: Int var status: Int @@ -31,6 +32,7 @@ class NetworkState { var schema: String } + // 设备列表 struct Device { var id: Int var status: Int @@ -50,15 +52,13 @@ class NetworkState { } } - struct NetworkModel { - var name: String - } - // 状态管理 var connectState: ConnectState = .disconnected - var model: NetworkModel = .init(name: "123@abc.com的网络") var showModel: ShowMode = .device + // 登陆后的网络会话 + let networkSession: UserContext.NetworkSession + // 网络连接开关 var isOn: Bool = false { didSet { @@ -85,7 +85,9 @@ class NetworkState { var devices: [Device] = [ ] - init() { + init(networkSession: UserContext.NetworkSession) { + self.networkSession = networkSession + self.devices = [ .init(id: 1, status: 1, name: "test1", ipv4: "192.168.1.1", ipv6: "fa9d.fa9d.fa9d.fa9d", system: "MacOS 12", resources: self.resources), .init(id: 2, status: 1, name: "test2", ipv4: "192.168.1.2", ipv6: "fa9d.fa9d.fa9d.fa9d", system: "MacOS 12", resources: self.resources), @@ -108,4 +110,14 @@ class NetworkState { } } +// func connect() async throws { +// let params: [String: Any] = [ +// "client_id": SystemConfig.getClientId(), +// "access_token": networkSession.accessToken +// ] +// +// try await SDLAPIClient.doPost(path: "/connect", params: params, as: <#T##Decodable.Type#>) +// } + + } diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index 2b6cdd1..8b39ad0 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -8,7 +8,12 @@ import SwiftUI struct NetworkView: View { - @State private var state = NetworkState() + @Environment(UserContext.self) var userContext: UserContext + @State private var networkModel: NetworkModel + + init() { + self.networkModel = NetworkModel(networkSession: self.userContext.networkSession!) + } var body: some View { VStack { @@ -16,13 +21,13 @@ struct NetworkView: View { VStack { HStack(alignment: .center) { - Text(state.model.name) + Text(networkModel.networkSession.networkName) Text(">") Spacer() } HStack { - Toggle("", isOn: $state.isOn) + Toggle("", isOn: $networkModel.isOn) .toggleStyle(SwitchToggleStyle(tint: .green)) Text("已连接") @@ -35,13 +40,13 @@ struct NetworkView: View { // 显示设备和资源选项 HStack { Button { - self.state.showModel = .resource + self.networkModel.showModel = .resource } label: { Text("资源") } Button { - self.state.showModel = .device + self.networkModel.showModel = .device } label: { Text("设备") } @@ -50,13 +55,13 @@ struct NetworkView: View { } Group { - switch state.connectState { + switch self.networkModel.connectState { case .waitAuth: - NetworkWaitAuthView(state: self.state) + NetworkWaitAuthView(networkModel: self.networkModel) case .connected: - NetworkConnctedView(state: self.state) + NetworkConnctedView(networkModel: self.networkModel) case .disconnected: - NetworkDisconnctedView(state: self.state) + NetworkDisconnctedView(networkModel: self.networkModel) } } @@ -76,6 +81,70 @@ struct NetworkView: View { } } +// 网络处于未连接状态 +struct NetworkDisconnctedView: View { + @Bindable var networkModel: NetworkModel + + var body: some View { + ZStack { + Color.clear + + VStack { + + Button { + Task { + try await startVpn() + } + } label: { + Text("连接") + .font(.system(size: 14, weight: .regular)) + .padding([.top, .bottom], 8) + .padding([.leading, .trailing], 30) + .foregroundColor(.white) + + } + .background(Color(red: 74/255, green: 207/255, blue: 154/255)) + .cornerRadius(5) + .frame(width: 120, height: 35) + + Button { + Task { + try await VPNManager.shared.disableVpn() + } + } label: { + Text("关闭") + .font(.system(size: 14, weight: .regular)) + .padding([.top, .bottom], 8) + .padding([.leading, .trailing], 30) + .foregroundColor(.white) + + } + .background(Color(red: 74/255, green: 207/255, blue: 154/255)) + .cornerRadius(5) + .frame(width: 120, height: 35) + } + } + + } + + // 执行登陆操作 + private func startVpn() async throws { + let clientId = SystemConfig.getClientId() + + let options = SystemConfig.getOptions(networkId: 8, + networkDomain: "punchnet.com", + ip: "10.211.179.1", + maskLen: 24, + accessToken: "accessToken1234", + identityId: 1234, + hostname: "mysql", + noticePort: 1234) + // token存在则优先使用token + try await VPNManager.shared.enableVpn(options: options!) + } + +} + #Preview { NetworkView() diff --git a/punchnet/Views/Network/NetworkWaitAuthView.swift b/punchnet/Views/Network/NetworkWaitAuthView.swift index e8b78f2..f108187 100644 --- a/punchnet/Views/Network/NetworkWaitAuthView.swift +++ b/punchnet/Views/Network/NetworkWaitAuthView.swift @@ -7,7 +7,7 @@ import SwiftUI struct NetworkWaitAuthView: View { - @Bindable var state: NetworkState + @Bindable var networkModel: NetworkModel var body: some View { Color.clear diff --git a/punchnet/Views/Login/LoginState.swift b/punchnet/Views/UserContext.swift similarity index 100% rename from punchnet/Views/Login/LoginState.swift rename to punchnet/Views/UserContext.swift