fix: #16 sortOption 接入后端排序 API

- KnowledgeItemService.list 加 sortBy/order 参数
- loadItems/refresh/loadMore 加 sortBy/order 参数
- sortOption onChange 触发重新加载
- sortParams 映射函数: 0→默认, 1→fileSize, 2→createdAt, 3→updatedAt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
wangdl 2026-06-06 19:07:33 +08:00
parent 99dc2807be
commit 695518b276
3 changed files with 24 additions and 10 deletions

View File

@ -149,10 +149,11 @@ class KnowledgeItemService {
static let shared = KnowledgeItemService() static let shared = KnowledgeItemService()
private let client = APIClient.shared private let client = APIClient.shared
func list(knowledgeBaseId: String) async throws -> [KnowledgeItem] { func list(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async throws -> [KnowledgeItem] {
return try await client.request("/knowledge-items", queryItems: [ var items = [URLQueryItem(name: "knowledgeBaseId", value: knowledgeBaseId)]
URLQueryItem(name: "knowledgeBaseId", value: knowledgeBaseId), if let s = sortBy { items.append(URLQueryItem(name: "sortBy", value: s)) }
]) if let o = order { items.append(URLQueryItem(name: "order", value: o)) }
return try await client.request("/knowledge-items", queryItems: items)
} }
func detail(id: String) async throws -> KnowledgeItem { func detail(id: String) async throws -> KnowledgeItem {

View File

@ -392,6 +392,10 @@ struct LibraryDetailPage: View {
Text("确定要删除选中的 \(selectedIds.count) 个知识点吗?此操作不可恢复。") Text("确定要删除选中的 \(selectedIds.count) 个知识点吗?此操作不可恢复。")
} }
.task { await viewModel.loadItems(knowledgeBaseId: knowledgeBaseId) } .task { await viewModel.loadItems(knowledgeBaseId: knowledgeBaseId) }
.onChange(of: sortOption) { _ in
let (sb, od) = sortParams(sortOption)
Task { await viewModel.loadItems(knowledgeBaseId: knowledgeBaseId, sortBy: sb, order: od) }
}
.safeAreaInset(edge: .bottom) { .safeAreaInset(edge: .bottom) {
NavigationLink(value: Route.aiChat(context: ChatEntryContext(scopeType: .knowledgeBase, scopeId: knowledgeBaseId, scopeName: "知识库", parentKnowledgeBaseId: knowledgeBaseId, createdFrom: "knowledge_base_detail"))) { NavigationLink(value: Route.aiChat(context: ChatEntryContext(scopeType: .knowledgeBase, scopeId: knowledgeBaseId, scopeName: "知识库", parentKnowledgeBaseId: knowledgeBaseId, createdFrom: "knowledge_base_detail"))) {
HStack(spacing: 8) { HStack(spacing: 8) {
@ -496,6 +500,15 @@ struct LibraryDetailPage: View {
return URL(string: "https://longde.cloud\(urlString)") return URL(string: "https://longde.cloud\(urlString)")
} }
private func sortParams(_ option: Int) -> (String?, String?) {
switch option {
case 1: return ("fileSize", "desc")
case 2: return ("createdAt", "desc")
case 3: return ("updatedAt", "desc")
default: return (nil, nil)
}
}
private func fileTypeText(for item: KnowledgeItem) -> String { private func fileTypeText(for item: KnowledgeItem) -> String {
if let t = item.sourceType?.trimmingCharacters(in: .whitespaces), !t.isEmpty { if let t = item.sourceType?.trimmingCharacters(in: .whitespaces), !t.isEmpty {
return t.uppercased() return t.uppercased()

View File

@ -92,13 +92,13 @@ class LibraryDetailViewModel: ObservableObject {
private var currentPage = 1 private var currentPage = 1
private let pageSize = 20 private let pageSize = 20
func loadItems(knowledgeBaseId: String) async { func loadItems(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
isLoading = true isLoading = true
errorMessage = nil errorMessage = nil
currentPage = 1 currentPage = 1
do { do {
async let kb = try? KnowledgeBaseService.shared.detail(id: knowledgeBaseId) async let kb = try? KnowledgeBaseService.shared.detail(id: knowledgeBaseId)
async let list = try? KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId) async let list = try? KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId, sortBy: sortBy, order: order)
let (kbResult, listResult) = await (kb, list) let (kbResult, listResult) = await (kb, list)
knowledgeBase = kbResult knowledgeBase = kbResult
items = listResult ?? [] items = listResult ?? []
@ -109,22 +109,22 @@ class LibraryDetailViewModel: ObservableObject {
isLoading = false isLoading = false
} }
func refresh(knowledgeBaseId: String) async { func refresh(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
isRefreshing = true isRefreshing = true
currentPage = 1 currentPage = 1
do { do {
items = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId) items = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId, sortBy: sortBy, order: order)
hasMore = items.count >= pageSize hasMore = items.count >= pageSize
} catch {} } catch {}
isRefreshing = false isRefreshing = false
} }
func loadMore(knowledgeBaseId: String) async { func loadMore(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
guard !isLoadingMore, hasMore else { return } guard !isLoadingMore, hasMore else { return }
isLoadingMore = true isLoadingMore = true
currentPage += 1 currentPage += 1
do { do {
let more = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId) let more = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId, sortBy: sortBy, order: order)
items.append(contentsOf: more) items.append(contentsOf: more)
hasMore = more.count >= pageSize hasMore = more.count >= pageSize
} catch { } catch {