diff --git a/dimensionhub.xcodeproj/project.pbxproj b/dimensionhub.xcodeproj/project.pbxproj index 32c704c..5bf7910 100644 --- a/dimensionhub.xcodeproj/project.pbxproj +++ b/dimensionhub.xcodeproj/project.pbxproj @@ -195,6 +195,8 @@ ); mainGroup = C85F58B72D64D10F00D761E9; minimizedProjectReferenceProxies = 1; + packageReferences = ( + ); preferredProjectObjectVersion = 77; productRefGroup = C85F58C12D64D10F00D761E9 /* Products */; projectDirPath = ""; diff --git a/dimensionhub/Core/API.swift b/dimensionhub/Core/API.swift new file mode 100644 index 0000000..2a66622 --- /dev/null +++ b/dimensionhub/Core/API.swift @@ -0,0 +1,64 @@ +// +// Api.swift +// dimensionhub +// +// Created by 安礼成 on 2025/2/19. +// +import Foundation + +struct API { + + // 失败时候的返回 + struct APIErrorResponse: Codable { + struct APIError: Codable { + let code: Int32 + let message: String + } + let error: APIError + } + + // 成功时候的结构体 + struct APISuccessResponse: Codable { + let result: T + } + + enum APIResponse { + case result(T) + case error(Int32, String) + } + + static let url = "http://localhost:18085/api/dimensionhub/" + + static func getIndexData(as: T.Type) async -> APIResponse { + let request = URLRequest(url: URL(string: url + "index")!) + + return await doRequest(request: request, as: T.self) + } + + static func loadMoreUpdateDramas(as: T.Type) async -> APIResponse { + let request = URLRequest(url: URL(string: url + "load_more_dramas")!) + + return await doRequest(request: request, as: T.self) + } + + // 执行http请求 + private static func doRequest(request: URLRequest, as: T.Type) async -> APIResponse { + do { + let (data, response) = try await URLSession.shared.data(for: request) + guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { + return .error(-1, "http status error") + } + + do { + let result = try JSONDecoder().decode(APISuccessResponse.self, from: data) + return .result(result.result) + } catch { + let apiError = try JSONDecoder().decode(APIErrorResponse.self, from: data) + return .error(apiError.error.code, apiError.error.message) + } + } catch let err { + return .error(-1, err.localizedDescription) + } + } + +} diff --git a/dimensionhub/IndexView.swift b/dimensionhub/Views/IndexView.swift similarity index 64% rename from dimensionhub/IndexView.swift rename to dimensionhub/Views/IndexView.swift index 987d289..06894dd 100644 --- a/dimensionhub/IndexView.swift +++ b/dimensionhub/Views/IndexView.swift @@ -8,8 +8,6 @@ import SwiftUI import SwiftData -let url: String = "https://n.sinaimg.cn/sinacn10113/332/w1024h1708/20190806/73d1-iatixpm8624905.jpg" - struct IndexView: View { @Environment(\.modelContext) private var modelContext @Query private var items: [Item] @@ -20,6 +18,13 @@ struct IndexView: View { 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" + } } let title: String @@ -33,48 +38,19 @@ struct IndexView: View { let datetime: String } - @State var dramas: [DramaItem] = [ - .init(title: "夏目友人帐 陆", episodes: [ - .init(id: 1, name: "西村与北本", thumb: url, numName: "第6话"), - .init(id: 2, name: "西村与北本", thumb: url, numName: "第5话"), - .init(id: 3, name: "西村与北本", thumb: url, numName: "第4话"), - .init(id: 4, name: "西村与北本", thumb: url, numName: "第4话"), - .init(id: 5, name: "西村与北本", thumb: url, numName: "第4话"), - ]), - - .init(title: "吹响吧! 上低音号", episodes: [ - .init(id: 1, name: "欢迎进入高中", thumb: url, numName: "第6话"), - .init(id: 2, name: "拜托了上低音...", thumb: url, numName: "第5话"), - .init(id: 3, name: "吹奏乐部活动...", thumb: url, numName: "第4话"), - .init(id: 4, name: "吹奏乐部活动...", thumb: url, numName: "第4话"), - .init(id: 5, name: "吹奏乐部活动...", thumb: url, numName: "第4话"), - ]) - ] - - let updateDramas: [UpdateDramaItem] = [ - .init(name: "拜托了上", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上1", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上2", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上3", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上4", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上5", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"), - .init(name: "拜托了上6", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"), - ] - enum UpdateDramaShowItem { case lable(String) case item(UpdateDramaItem) } - @State var showUpdateDramas: [UpdateDramaShowItem] = Self.yes(updateDramas: [ - .init(name: "拜托了上", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上1", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上2", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上3", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上4", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), - .init(name: "拜托了上5", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"), - .init(name: "拜托了上6", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"), - ]) + struct IndexResponse: Codable { + let updateDramas: [UpdateDramaItem] + let dramas: [DramaItem] + } + + @State var dramas: [DramaItem] = [] + @State var showUpdateDramas: [UpdateDramaShowItem] = [] + @State var isLoading: Bool = false var body: some View { VStack(alignment: .center) { @@ -119,20 +95,32 @@ struct IndexView: View { } } .task { - let groups = Dictionary(grouping: self.updateDramas) {$0.datetime} - var updateItems: [UpdateDramaShowItem] = [] - groups.forEach { (key, items) in - updateItems.append(.lable(key)) - items.forEach { item in - updateItems.append(.item(item)) - } + let response = await API.getIndexData(as: IndexResponse.self) + switch response { + case .error(let code, let message): + print(code) + print(message) + case .result(let result): + print(result) + self.dramas = result.dramas + self.showUpdateDramas = Self.yes(updateDramas: result.updateDramas) } - - self.showUpdateDramas = updateItems - NSLog("call me heere 11") } } + + private func loadMoreUpdateDramas() async { +// guard !self.isLoading else { +// return +// } +// +// self.isLoading = true +// +// if let data = await API.loadMoreUpdateDramas() { +// try! JSONDecoder().decode([UpdateDramaItem].self, from: data) +// } + + } private func addItem() { withAnimation {