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()
private let client = APIClient.shared
func list(knowledgeBaseId: String) async throws -> [KnowledgeItem] {
return try await client.request("/knowledge-items", queryItems: [
URLQueryItem(name: "knowledgeBaseId", value: knowledgeBaseId),
])
func list(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async throws -> [KnowledgeItem] {
var items = [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 {

View File

@ -392,6 +392,10 @@ struct LibraryDetailPage: View {
Text("确定要删除选中的 \(selectedIds.count) 个知识点吗?此操作不可恢复。")
}
.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) {
NavigationLink(value: Route.aiChat(context: ChatEntryContext(scopeType: .knowledgeBase, scopeId: knowledgeBaseId, scopeName: "知识库", parentKnowledgeBaseId: knowledgeBaseId, createdFrom: "knowledge_base_detail"))) {
HStack(spacing: 8) {
@ -496,6 +500,15 @@ struct LibraryDetailPage: View {
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 {
if let t = item.sourceType?.trimmingCharacters(in: .whitespaces), !t.isEmpty {
return t.uppercased()

View File

@ -92,13 +92,13 @@ class LibraryDetailViewModel: ObservableObject {
private var currentPage = 1
private let pageSize = 20
func loadItems(knowledgeBaseId: String) async {
func loadItems(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
isLoading = true
errorMessage = nil
currentPage = 1
do {
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)
knowledgeBase = kbResult
items = listResult ?? []
@ -109,22 +109,22 @@ class LibraryDetailViewModel: ObservableObject {
isLoading = false
}
func refresh(knowledgeBaseId: String) async {
func refresh(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
isRefreshing = true
currentPage = 1
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
} catch {}
isRefreshing = false
}
func loadMore(knowledgeBaseId: String) async {
func loadMore(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
guard !isLoadingMore, hasMore else { return }
isLoadingMore = true
currentPage += 1
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)
hasMore = more.count >= pageSize
} catch {