Compare commits
No commits in common. "a18d07924f0f0878b69705f244fdd4ca41f56261" and "27d0d115087a97ed0c13f45ed8a31162fb86f0d4" have entirely different histories.
a18d07924f
...
27d0d11508
154
punchnet/Views/Network/NetworkConnctedView.swift
Normal file
154
punchnet/Views/Network/NetworkConnctedView.swift
Normal file
@ -0,0 +1,154 @@
|
||||
//
|
||||
// NetworkConnctedView.swift
|
||||
// punchnet
|
||||
//
|
||||
// Created by 安礼成 on 2026/1/16.
|
||||
//
|
||||
import SwiftUI
|
||||
|
||||
struct NetworkConnctedView: View {
|
||||
@Bindable var state: NetworkState
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
switch state.showModel {
|
||||
case .resource:
|
||||
NetworkResourceGroupView(state: self.state)
|
||||
case .device:
|
||||
NetworkDeviceGroupView(state: self.state)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 显示资源信息
|
||||
struct NetworkResourceGroupView: View {
|
||||
@Bindable var state: NetworkState
|
||||
|
||||
var body: some View {
|
||||
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) {
|
||||
ForEach(self.state.resources, id: \.id) { resource in
|
||||
NetworkResourceView(resource: resource)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct NetworkResourceView: View {
|
||||
var resource: NetworkState.Resource
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
HStack {
|
||||
Text(resource.status == 1 ? "yes" : "no")
|
||||
|
||||
Text(resource.name)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
}
|
||||
|
||||
Text(resource.schema)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.padding(.leading, 30)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 显示设备信息
|
||||
struct NetworkDeviceGroupView: View {
|
||||
@Bindable var state: NetworkState
|
||||
@State private var selectedId: Int?
|
||||
|
||||
var body: some View {
|
||||
NavigationSplitView {
|
||||
List(self.state.devices, id: \.id, selection: $selectedId) { device in
|
||||
NetworkDeviceHeadView(device: device)
|
||||
}
|
||||
.listStyle(.sidebar)
|
||||
.onChange(of: selectedId) {
|
||||
self.state.changeSelectedDevice(deviceId: selectedId)
|
||||
}
|
||||
.onAppear {
|
||||
if selectedId == nil {
|
||||
selectedId = self.state.devices.first?.id
|
||||
}
|
||||
}
|
||||
} detail: {
|
||||
NetworkDeviceDetailView(device: $state.selectedDevice)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct NetworkDeviceHeadView: View {
|
||||
var device: NetworkState.Device
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
HStack {
|
||||
Text(device.status == 1 ? "yes" : "no")
|
||||
|
||||
Text(device.name)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
}
|
||||
|
||||
Text(device.ipv4)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.padding(.leading, 30)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct NetworkDeviceDetailView: View {
|
||||
@Binding var device: NetworkState.Device?
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if let device {
|
||||
List {
|
||||
Section {
|
||||
HStack {
|
||||
Text("连接状态")
|
||||
|
||||
Text("\(device.status)")
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Text("虚拟IPv4")
|
||||
|
||||
Text("\(device.ipv4)")
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Text("虚拟IPv6")
|
||||
|
||||
Text("\(device.ipv6)")
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Text("操作系统")
|
||||
|
||||
Text("\(device.system)")
|
||||
Spacer()
|
||||
}
|
||||
}
|
||||
|
||||
Section("服务列表") {
|
||||
ForEach(device.resources, id: \.id) { resource in
|
||||
HStack {
|
||||
Text("\(resource.name)")
|
||||
Text("\(resource.schema)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
EmptyView()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
75
punchnet/Views/Network/NetworkDisconnctedView.swift
Normal file
75
punchnet/Views/Network/NetworkDisconnctedView.swift
Normal file
@ -0,0 +1,75 @@
|
||||
//
|
||||
// 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()
|
||||
//}
|
||||
@ -9,7 +9,7 @@ import Foundation
|
||||
import Observation
|
||||
|
||||
@Observable
|
||||
class NetworkModel {
|
||||
class NetworkState {
|
||||
|
||||
// 连接状态
|
||||
enum ConnectState {
|
||||
@ -24,7 +24,6 @@ class NetworkModel {
|
||||
case device
|
||||
}
|
||||
|
||||
// 资源列表
|
||||
struct Resource {
|
||||
var id: Int
|
||||
var status: Int
|
||||
@ -32,7 +31,6 @@ class NetworkModel {
|
||||
var schema: String
|
||||
}
|
||||
|
||||
// 设备列表
|
||||
struct Device {
|
||||
var id: Int
|
||||
var status: Int
|
||||
@ -52,8 +50,13 @@ class NetworkModel {
|
||||
}
|
||||
}
|
||||
|
||||
struct NetworkModel {
|
||||
var name: String
|
||||
}
|
||||
|
||||
// 状态管理
|
||||
var connectState: ConnectState = .disconnected
|
||||
var model: NetworkModel = .init(name: "123@abc.com的网络")
|
||||
var showModel: ShowMode = .device
|
||||
|
||||
// 网络连接开关
|
||||
@ -105,14 +108,4 @@ class NetworkModel {
|
||||
}
|
||||
}
|
||||
|
||||
// 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#>)
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
@ -8,8 +8,7 @@
|
||||
import SwiftUI
|
||||
|
||||
struct NetworkView: View {
|
||||
@Environment(UserContext.self) var userContext: UserContext
|
||||
@State private var networkModel = NetworkModel()
|
||||
@State private var state = NetworkState()
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
@ -17,13 +16,13 @@ struct NetworkView: View {
|
||||
|
||||
VStack {
|
||||
HStack(alignment: .center) {
|
||||
Text(userContext.networkSession?.networkName ?? "未知")
|
||||
Text(state.model.name)
|
||||
Text(">")
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Toggle("", isOn: $networkModel.isOn)
|
||||
Toggle("", isOn: $state.isOn)
|
||||
.toggleStyle(SwitchToggleStyle(tint: .green))
|
||||
|
||||
Text("已连接")
|
||||
@ -36,13 +35,13 @@ struct NetworkView: View {
|
||||
// 显示设备和资源选项
|
||||
HStack {
|
||||
Button {
|
||||
self.networkModel.showModel = .resource
|
||||
self.state.showModel = .resource
|
||||
} label: {
|
||||
Text("资源")
|
||||
}
|
||||
|
||||
Button {
|
||||
self.networkModel.showModel = .device
|
||||
self.state.showModel = .device
|
||||
} label: {
|
||||
Text("设备")
|
||||
}
|
||||
@ -51,13 +50,13 @@ struct NetworkView: View {
|
||||
}
|
||||
|
||||
Group {
|
||||
switch self.networkModel.connectState {
|
||||
switch state.connectState {
|
||||
case .waitAuth:
|
||||
NetworkWaitAuthView(networkModel: self.networkModel)
|
||||
NetworkWaitAuthView(state: self.state)
|
||||
case .connected:
|
||||
NetworkConnctedView(networkModel: self.networkModel)
|
||||
NetworkConnctedView(state: self.state)
|
||||
case .disconnected:
|
||||
NetworkDisconnctedView(networkModel: self.networkModel)
|
||||
NetworkDisconnctedView(state: self.state)
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,232 +76,6 @@ 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!)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 网络处于连接状态
|
||||
|
||||
struct NetworkConnctedView: View {
|
||||
@Bindable var networkModel: NetworkModel
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
switch networkModel.showModel {
|
||||
case .resource:
|
||||
NetworkResourceGroupView(networkModel: self.networkModel)
|
||||
case .device:
|
||||
NetworkDeviceGroupView(networkModel: self.networkModel)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension NetworkConnctedView {
|
||||
|
||||
// 显示资源信息
|
||||
struct NetworkResourceGroupView: View {
|
||||
@Bindable var networkModel: NetworkModel
|
||||
|
||||
var body: some View {
|
||||
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) {
|
||||
ForEach(self.networkModel.resources, id: \.id) { resource in
|
||||
NetworkResourceView(resource: resource)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct NetworkResourceView: View {
|
||||
var resource: NetworkModel.Resource
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
HStack {
|
||||
Text(resource.status == 1 ? "yes" : "no")
|
||||
|
||||
Text(resource.name)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
}
|
||||
|
||||
Text(resource.schema)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.padding(.leading, 30)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 显示设备信息
|
||||
struct NetworkDeviceGroupView: View {
|
||||
@Bindable var networkModel: NetworkModel
|
||||
@State private var selectedId: Int?
|
||||
|
||||
var body: some View {
|
||||
NavigationSplitView {
|
||||
List(self.networkModel.devices, id: \.id, selection: $selectedId) { device in
|
||||
NetworkDeviceHeadView(device: device)
|
||||
}
|
||||
.listStyle(.sidebar)
|
||||
.onChange(of: selectedId) {
|
||||
self.networkModel.changeSelectedDevice(deviceId: selectedId)
|
||||
}
|
||||
.onAppear {
|
||||
if selectedId == nil {
|
||||
selectedId = self.networkModel.devices.first?.id
|
||||
}
|
||||
}
|
||||
} detail: {
|
||||
NetworkDeviceDetailView(device: $networkModel.selectedDevice)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct NetworkDeviceHeadView: View {
|
||||
var device: NetworkModel.Device
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
HStack {
|
||||
Text(device.status == 1 ? "yes" : "no")
|
||||
|
||||
Text(device.name)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
}
|
||||
|
||||
Text(device.ipv4)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.padding(.leading, 30)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct NetworkDeviceDetailView: View {
|
||||
@Binding var device: NetworkModel.Device?
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if let device {
|
||||
List {
|
||||
Section {
|
||||
HStack {
|
||||
Text("连接状态")
|
||||
|
||||
Text("\(device.status)")
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Text("虚拟IPv4")
|
||||
|
||||
Text("\(device.ipv4)")
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Text("虚拟IPv6")
|
||||
|
||||
Text("\(device.ipv6)")
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
Text("操作系统")
|
||||
|
||||
Text("\(device.system)")
|
||||
Spacer()
|
||||
}
|
||||
}
|
||||
|
||||
Section("服务列表") {
|
||||
ForEach(device.resources, id: \.id) { resource in
|
||||
HStack {
|
||||
Text("\(resource.name)")
|
||||
Text("\(resource.schema)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
EmptyView()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct NetworkWaitAuthView: View {
|
||||
@Bindable var networkModel: NetworkModel
|
||||
|
||||
var body: some View {
|
||||
Color.clear
|
||||
.overlay {
|
||||
Text("等待确认中")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#Preview {
|
||||
NetworkView()
|
||||
|
||||
18
punchnet/Views/Network/NetworkWaitAuthView.swift
Normal file
18
punchnet/Views/Network/NetworkWaitAuthView.swift
Normal file
@ -0,0 +1,18 @@
|
||||
//
|
||||
// NetworkWaitAuthView.swift
|
||||
// punchnet
|
||||
//
|
||||
// Created by 安礼成 on 2026/1/16.
|
||||
//
|
||||
import SwiftUI
|
||||
|
||||
struct NetworkWaitAuthView: View {
|
||||
@Bindable var state: NetworkState
|
||||
|
||||
var body: some View {
|
||||
Color.clear
|
||||
.overlay {
|
||||
Text("等待确认中")
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user