From e5f155dfcee6612130a57919d0fa4c46457bc12d Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 21 Feb 2025 22:43:19 +0800 Subject: [PATCH] add DetailView --- dimensionhub/Core/API.swift | 6 ++ dimensionhub/Views/DetailView.swift | 94 +++++++++++++++++++++++++++++ dimensionhub/dimensionhubApp.swift | 3 +- 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 dimensionhub/Views/DetailView.swift diff --git a/dimensionhub/Core/API.swift b/dimensionhub/Core/API.swift index 9de5fa3..3ce2730 100644 --- a/dimensionhub/Core/API.swift +++ b/dimensionhub/Core/API.swift @@ -47,6 +47,12 @@ struct API { return await doRequest(request: request, as: T.self) } + static func getDramaDetail(as: T.Type) async -> APIResponse { + let request = URLRequest(url: URL(string: url + "detail")!) + + return await doRequest(request: request, as: T.self) + } + // 执行http请求 private static func doRequest(request: URLRequest, as: T.Type) async -> APIResponse { do { diff --git a/dimensionhub/Views/DetailView.swift b/dimensionhub/Views/DetailView.swift new file mode 100644 index 0000000..1eb4108 --- /dev/null +++ b/dimensionhub/Views/DetailView.swift @@ -0,0 +1,94 @@ +// +// ListView.swift +// dimensionhub +// +// Created by 安礼成 on 2025/2/21. +// +import SwiftUI +import Observation + +@Observable +final class DetailModel { + + struct VoiceActor: Codable { + let actor_id: Int + let name: String + } + + struct Episode: Codable { + let id: Int32 + let name: String + let thumb: String + let numName: String + + enum CodingKeys: String, CodingKey { + case id = "id" + case name = "name" + case thumb = "thumb" + case numName = "num_name" + } + } + + // 渠道 + struct Channel: Codable { + let name: String + let episodes: [Episode] + } + + struct DramaDetailResponse: Codable { + let name: String + let voice_actors: [VoiceActor] + let status: Int + let channels: [Channel] + } + + var name: String = "" + var voiceActors: [VoiceActor] = [] + var status: Int = 0 + var channels: [Channel] = [] + + @MainActor + func loadData(dramaId: Int) async { + let response = await API.getDramaDetail(as: DramaDetailResponse.self) + switch response { + case .error(let code, let message): + print(code) + print(message) + case .result(let detail): + self.name = detail.name + self.voiceActors = detail.voice_actors + self.status = detail.status + self.channels = detail.channels + } + } +} + +struct DetailView: View { + @State var detailModel = DetailModel() + + var body: some View { + VStack { + VStack(alignment: .leading, spacing: 15) { + Text(detailModel.name) + .font(.system(size: 20)) + .fontWeight(.bold) + HStack(alignment: .center, spacing: 0) { + ForEach(detailModel.voiceActors, id: \.actor_id) { actor in + Text(actor.name) + .font(.system(size: 16)) + } + Text("等") + } + } + + } + .task { + await detailModel.loadData(dramaId: 124) + } + } + +} + +#Preview { + DetailView() +} diff --git a/dimensionhub/dimensionhubApp.swift b/dimensionhub/dimensionhubApp.swift index 0d1f91a..d88c81c 100644 --- a/dimensionhub/dimensionhubApp.swift +++ b/dimensionhub/dimensionhubApp.swift @@ -25,7 +25,8 @@ struct dimensionhubApp: App { var body: some Scene { WindowGroup { - IndexView() + //IndexView() + DetailView() } .modelContainer(sharedModelContainer) }