This commit is contained in:
anlicheng 2026-02-26 16:33:05 +08:00
parent fd22574db1
commit 176d3ebe45
3 changed files with 114 additions and 78 deletions

View File

@ -34,7 +34,6 @@ struct SDLAPIClient {
NSLog("response is: \(String(bytes: data, encoding: .utf8))") NSLog("response is: \(String(bytes: data, encoding: .utf8))")
let apiResponse = try JSONDecoder().decode(SDLAPIResponse<T>.self, from: data) let apiResponse = try JSONDecoder().decode(SDLAPIResponse<T>.self, from: data)
if apiResponse.code == 0, let data = apiResponse.data { if apiResponse.code == 0, let data = apiResponse.data {
return data return data
} else if let message = apiResponse.message { } else if let message = apiResponse.message {

View File

@ -8,18 +8,8 @@
import Foundation import Foundation
import Observation import Observation
@Observable //
class NetworkModel { struct Resource: Codable {
//
enum ConnectState {
case waitAuth
case connected
case disconnected
}
//
struct Resource: Codable {
var id: Int var id: Int
var name: String var name: String
var url: String var url: String
@ -31,15 +21,15 @@ class NetworkModel {
case url case url
case connectionStatus = "connection_status" case connectionStatus = "connection_status"
} }
} }
// //
struct Node: Codable { struct Node: Codable {
var id: Int var id: Int
var name: String var name: String
var ip: String var ip: String
var system: String var system: String?
var connectStatus: Int var connectionStatus: String
func hash(into hasher: inout Hasher) { func hash(into hasher: inout Hasher) {
hasher.combine(id) hasher.combine(id)
@ -50,15 +40,15 @@ class NetworkModel {
case name case name
case ip case ip
case system case system
case connectStatus = "connect_status" case connectionStatus = "connection_status"
} }
static func == (lhs: Self, rhs: Self) -> Bool { static func == (lhs: Self, rhs: Self) -> Bool {
return lhs.id == rhs.id return lhs.id == rhs.id
} }
} }
struct NetworkContext: Codable { struct NetworkContext: Codable {
let ip: String let ip: String
let resourceList: [Resource] let resourceList: [Resource]
let nodeList: [Node] let nodeList: [Node]
@ -68,7 +58,35 @@ class NetworkModel {
case resourceList = "resource_list" case resourceList = "resource_list"
case nodeList = "node_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 {
//
enum ConnectState {
case waitAuth
case connected
case disconnected
} }
// //
@ -104,7 +122,6 @@ class NetworkModel {
} }
} }
@MainActor
func connect(networkSession: UserContext.NetworkSession) async throws { func connect(networkSession: UserContext.NetworkSession) async throws {
let params: [String: Any] = [ let params: [String: Any] = [
"client_id": SystemConfig.getClientId(), "client_id": SystemConfig.getClientId(),

View File

@ -159,13 +159,15 @@ struct NetworkDisconnctedView: View {
// //
private func startVpn() async throws { private func startVpn() async throws {
let clientId = SystemConfig.getClientId() guard let networkSession = userContext.networkSession else {
return
}
let options = SystemConfig.getOptions(networkId: 8, let options = SystemConfig.getOptions(networkId: UInt32(networkSession.networkId),
networkDomain: "punchnet.com", networkDomain: networkSession.networkDomain,
ip: "10.211.179.1", ip: "",
maskLen: 24, maskLen: 24,
accessToken: "accessToken1234", accessToken: networkSession.accessToken,
identityId: 1234, identityId: 1234,
hostname: "mysql", hostname: "mysql",
noticePort: 1234) noticePort: 1234)
@ -191,7 +193,7 @@ struct NetworkResourceGroupView: View {
} }
struct NetworkResourceView: View { struct NetworkResourceView: View {
var resource: NetworkModel.Resource var resource: Resource
var body: some View { var body: some View {
VStack { VStack {
@ -237,12 +239,12 @@ struct NetworkDeviceGroupView: View {
} }
struct NetworkNodeHeadView: View { struct NetworkNodeHeadView: View {
var node: NetworkModel.Node var node: Node
var body: some View { var body: some View {
VStack { VStack {
HStack { HStack {
Text(node.connectStatus == 1 ? "yes" : "no") Text(node.connectionStatus)
Text(node.name) Text(node.name)
.font(.system(size: 14, weight: .regular)) .font(.system(size: 14, weight: .regular))
@ -256,7 +258,9 @@ struct NetworkNodeHeadView: View {
} }
struct NetworkNodeDetailView: 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 { var body: some View {
Group { Group {
@ -265,40 +269,56 @@ struct NetworkNodeDetailView: View {
Section { Section {
HStack { HStack {
Text("连接状态") Text("连接状态")
Text("\(node.connectionStatus)")
Text("\(node.connectStatus)")
Spacer() Spacer()
} }
HStack { HStack {
Text("虚拟IPv4") Text("虚拟IPv4")
Text("\(node.ip)") Text("\(node.ip)")
Spacer() Spacer()
} }
HStack { HStack {
Text("操作系统") Text("操作系统")
Text("\(node.system)") Text(node.system ?? "未知")
Spacer() Spacer()
} }
} }
// Section("") { Section("服务列表") {
// ForEach(device.resources, id: \.id) { resource in ForEach(resources, id: \.id) { resource in
// HStack { HStack {
// Text("\(resource.name)") Text("\(resource.name)")
// Text("\(resource.schema)") Text("\(resource.url)")
// } }
// } }
// } }
}
.task {
await self.loadNodeResources()
} }
} else { } else {
EmptyView() 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 { struct NetworkWaitAuthView: View {