diff --git a/punchnet/Core/SDLAPIClient.swift b/punchnet/Core/SDLAPIClient.swift index df736bc..468099a 100644 --- a/punchnet/Core/SDLAPIClient.swift +++ b/punchnet/Core/SDLAPIClient.swift @@ -34,7 +34,6 @@ struct SDLAPIClient { NSLog("response is: \(String(bytes: data, encoding: .utf8))") let apiResponse = try JSONDecoder().decode(SDLAPIResponse.self, from: data) - if apiResponse.code == 0, let data = apiResponse.data { return data } else if let message = apiResponse.message { diff --git a/punchnet/Views/Network/NetworkModel.swift b/punchnet/Views/Network/NetworkModel.swift index b5075bc..e797d50 100644 --- a/punchnet/Views/Network/NetworkModel.swift +++ b/punchnet/Views/Network/NetworkModel.swift @@ -8,6 +8,77 @@ import Foundation import Observation +// 资源列表 +struct Resource: Codable { + var id: Int + var name: String + var url: String + var connectionStatus: String + + enum CodingKeys: String, CodingKey { + case id + case name + case url + case connectionStatus = "connection_status" + } +} + +// 设备列表 +struct Node: Codable { + var id: Int + var name: String + var ip: String + var system: String? + var connectionStatus: String + + func hash(into hasher: inout Hasher) { + hasher.combine(id) + } + + enum CodingKeys: String, CodingKey { + case id + case name + case ip + case system + case connectionStatus = "connection_status" + } + + static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id + } +} + +struct NetworkContext: Codable { + let ip: String + let resourceList: [Resource] + let nodeList: [Node] + + enum CodingKeys: String, CodingKey { + case ip + case resourceList = "resource_list" + case nodeList = "node_list" + } +} + +// 节点详情 +struct NodeDetail: Codable { + let id: Int + let name: String + let ip: String + let system: String? + let connectionStatus: String + let resourceList: [Resource] + + enum CodingKeys: String, CodingKey { + case id + case name + case ip + case system + case connectionStatus = "connection_status" + case resourceList = "resource_list" + } +} + @Observable class NetworkModel { @@ -18,59 +89,6 @@ class NetworkModel { case disconnected } - // 资源列表 - struct Resource: Codable { - var id: Int - var name: String - var url: String - var connectionStatus: String - - enum CodingKeys: String, CodingKey { - case id - case name - case url - case connectionStatus = "connection_status" - } - } - - // 设备列表 - struct Node: Codable { - var id: Int - var name: String - var ip: String - var system: String - var connectStatus: Int - - func hash(into hasher: inout Hasher) { - hasher.combine(id) - } - - enum CodingKeys: String, CodingKey { - case id - case name - case ip - case system - case connectStatus = "connect_status" - } - - static func == (lhs: Self, rhs: Self) -> Bool { - return lhs.id == rhs.id - } - } - - struct NetworkContext: Codable { - let ip: String - let resourceList: [Resource] - let nodeList: [Node] - - enum CodingKeys: String, CodingKey { - case ip - case resourceList = "resource_list" - case nodeList = "node_list" - } - - } - // 状态管理 var connectState: ConnectState = .disconnected @@ -104,7 +122,6 @@ class NetworkModel { } } - @MainActor func connect(networkSession: UserContext.NetworkSession) async throws { let params: [String: Any] = [ "client_id": SystemConfig.getClientId(), diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index f96738a..1a6a6c6 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -159,13 +159,15 @@ struct NetworkDisconnctedView: View { // 执行登陆操作 private func startVpn() async throws { - let clientId = SystemConfig.getClientId() + guard let networkSession = userContext.networkSession else { + return + } - let options = SystemConfig.getOptions(networkId: 8, - networkDomain: "punchnet.com", - ip: "10.211.179.1", + let options = SystemConfig.getOptions(networkId: UInt32(networkSession.networkId), + networkDomain: networkSession.networkDomain, + ip: "", maskLen: 24, - accessToken: "accessToken1234", + accessToken: networkSession.accessToken, identityId: 1234, hostname: "mysql", noticePort: 1234) @@ -191,7 +193,7 @@ struct NetworkResourceGroupView: View { } struct NetworkResourceView: View { - var resource: NetworkModel.Resource + var resource: Resource var body: some View { VStack { @@ -237,12 +239,12 @@ struct NetworkDeviceGroupView: View { } struct NetworkNodeHeadView: View { - var node: NetworkModel.Node + var node: Node var body: some View { VStack { HStack { - Text(node.connectStatus == 1 ? "yes" : "no") + Text(node.connectionStatus) Text(node.name) .font(.system(size: 14, weight: .regular)) @@ -256,8 +258,10 @@ struct NetworkNodeHeadView: View { } struct NetworkNodeDetailView: View { - @Binding var node: NetworkModel.Node? - + @Environment(UserContext.self) var userContext: UserContext + @Binding var node: Node? + @State private var resources: [Resource] = [] + var body: some View { Group { if let node { @@ -265,40 +269,56 @@ struct NetworkNodeDetailView: View { Section { HStack { Text("连接状态") - - Text("\(node.connectStatus)") - + Text("\(node.connectionStatus)") Spacer() } HStack { Text("虚拟IPv4") - Text("\(node.ip)") Spacer() } HStack { Text("操作系统") - Text("\(node.system)") + Text(node.system ?? "未知") Spacer() } } - // Section("服务列表") { - // ForEach(device.resources, id: \.id) { resource in - // HStack { - // Text("\(resource.name)") - // Text("\(resource.schema)") - // } - // } - // } + Section("服务列表") { + ForEach(resources, id: \.id) { resource in + HStack { + Text("\(resource.name)") + Text("\(resource.url)") + } + } + } + } + .task { + await self.loadNodeResources() } } else { EmptyView() } } } + + private func loadNodeResources() async { + guard let networkSession = userContext.networkSession, let id = self.node?.id else { + return + } + + let params: [String: Any] = [ + "client_id": SystemConfig.getClientId(), + "access_token": networkSession.accessToken, + "id": id + ] + + if let nodeDetail = try? await SDLAPIClient.doPost(path: "/get_node_resources", params: params, as: NodeDetail.self) { + self.resources = nodeDetail.resourceList + } + } } struct NetworkWaitAuthView: View {