feat(知识库管理): 添加文档和文件列表排序功能并优化表格交互 (#90)

This commit is contained in:
zstar 2025-05-14 15:36:22 +08:00 committed by GitHub
parent e9efc51179
commit c787ae7eac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 104 additions and 16 deletions

View File

@ -100,7 +100,9 @@ def get_knowledgebase_documents(kb_id):
'kb_id': kb_id,
'page': int(request.args.get('currentPage', 1)),
'size': int(request.args.get('size', 10)),
'name': request.args.get('name', '')
'name': request.args.get('name', ''),
'sort_by': request.args.get("sort_by", "create_time"),
'sort_order': request.args.get("sort_order", "desc")
}
result = KnowledgebaseService.get_knowledgebase_documents(**params)
return success_response(result)

View File

@ -406,7 +406,7 @@ class KnowledgebaseService:
raise Exception(f"批量删除知识库失败: {str(e)}")
@classmethod
def get_knowledgebase_documents(cls, kb_id, page=1, size=10, name=''):
def get_knowledgebase_documents(cls, kb_id, page=1, size=10, name='', sort_by="create_time", sort_order="desc"):
"""获取知识库下的文档列表"""
try:
conn = cls._get_db_connection()
@ -418,6 +418,14 @@ class KnowledgebaseService:
if not cursor.fetchone():
raise Exception("知识库不存在")
# 验证排序字段
valid_sort_fields = ["name", "size", "create_time", "create_date"]
if sort_by not in valid_sort_fields:
sort_by = "create_time"
# 构建排序子句
sort_clause = f"ORDER BY d.{sort_by} {sort_order.upper()}"
# 查询文档列表
query = """
SELECT
@ -439,8 +447,11 @@ class KnowledgebaseService:
if name:
query += " AND d.name LIKE %s"
params.append(f"%{name}%")
query += " ORDER BY d.create_date DESC LIMIT %s OFFSET %s"
# 添加查询排序条件
query += f" {sort_clause}"
query += " LIMIT %s OFFSET %s"
params.extend([size, (page-1)*size])
cursor.execute(query, params)

View File

@ -12,6 +12,8 @@ export function getDocumentListApi(params: {
currentPage: number
size: number
name?: string
sort_by: string
sort_order: string
}) {
return request({
url: `/api/v1/knowledgebases/${params.kb_id}/documents`,
@ -19,7 +21,9 @@ export function getDocumentListApi(params: {
params: {
currentPage: params.currentPage,
size: params.size,
name: params.name
name: params.name,
sort_by: params.sort_by,
sort_order: params.sort_order
}
})
}
@ -114,10 +118,22 @@ export function getDocumentChunksApi(params: {
}
// 获取文件列表
/**
* API
* @param params
* @param params.currentPage
* @param params.size
* @param params.name
* @param params.sort_by
* @param params.sort_order /
* @returns Promise
*/
export function getFileListApi(params: {
currentPage: number
size: number
name?: string
sort_by: string
sort_order: string
}) {
return request({
url: "/api/v1/files",

View File

@ -131,7 +131,19 @@ const searchData = reactive({
//
const sortData = reactive({
sortBy: "create_date",
sortOrder: "desc" // ()
sortOrder: "desc" //
})
//
const docSortData = reactive({
sortBy: "create_date",
sortOrder: "desc" //
})
//
const fileSortData = reactive({
sortBy: "create_date",
sortOrder: "desc" //
})
//
@ -253,7 +265,9 @@ function getDocumentList() {
kb_id: currentKnowledgeBase.value.id,
currentPage: docPaginationData.currentPage,
size: docPaginationData.pageSize,
name: ""
name: "",
sort_by: docSortData.sortBy,
sort_order: docSortData.sortOrder
}).then((response) => {
const result = response as ApiResponse<ListResponse>
documentList.value = result.data.list
@ -266,6 +280,25 @@ function getDocumentList() {
})
}
/**
* @description 处理文档表格排序变化事件
* @param {object} sortInfo 排序信息对象包含 prop order
* @param {string} sortInfo.prop 排序的字段名
* @param {string | null} sortInfo.order 排序的顺序 ('ascending', 'descending', null)
*/
function handleDocSortChange({ prop }: { prop: string, order: string | null }) {
//
if (docSortData.sortBy === prop) {
//
docSortData.sortOrder = docSortData.sortOrder === "asc" ? "desc" : "asc"
} else {
//
docSortData.sortBy = prop
docSortData.sortOrder = "asc"
}
getDocumentList()
}
// handleView
function handleView(row: KnowledgeBaseData) {
currentKnowledgeBase.value = row
@ -528,7 +561,9 @@ function getFileList() {
getFileListApi({
currentPage: filePaginationData.currentPage,
size: filePaginationData.pageSize,
name: ""
name: "",
sort_by: fileSortData.sortBy,
sort_order: fileSortData.sortOrder
}).then((response) => {
const typedResponse = response as ApiResponse<FileListResponse>
fileList.value = typedResponse.data.list
@ -541,6 +576,25 @@ function getFileList() {
})
}
/**
* @description 处理文件表格排序变化事件
* @param {object} sortInfo 排序信息对象包含 prop order
* @param {string} sortInfo.prop 排序的字段名
* @param {string | null} sortInfo.order 排序的顺序 ('ascending', 'descending', null)
*/
function handleFileSortChange({ prop }: { prop: string, order: string | null }) {
//
if (fileSortData.sortBy === prop) {
//
fileSortData.sortOrder = fileSortData.sortOrder === "asc" ? "desc" : "asc"
} else {
//
fileSortData.sortBy = prop
fileSortData.sortOrder = "asc"
}
getFileList()
}
//
function handleFileSelectionChange(selection: any[]) {
// 使Array.fromJSON
@ -1132,10 +1186,10 @@ function shouldShowProgressCount(status: string) {
<!-- === 结束进度显示 === -->
<div class="document-table-wrapper" v-loading="documentLoading || (isBatchPolling && !batchProgress)">
<el-table :data="documentList" style="width: 100%">
<el-table-column prop="name" label="名称" min-width="180" show-overflow-tooltip />
<el-table :data="documentList" style="width: 100%" @sort-change="handleDocSortChange">
<el-table-column prop="name" label="名称" min-width="180" show-overflow-tooltip sortable="custom" />
<el-table-column prop="chunk_num" label="分块数" width="100" align="center" />
<el-table-column label="上传日期" width="180" align="center">
<el-table-column prop="create_date" label="上传日期" width="180" align="center" sortable="custom">
<template #default="scope">
{{ scope.row.create_date }}
</template>
@ -1235,7 +1289,7 @@ function shouldShowProgressCount(status: string) {
</template>
</el-dialog>
<!-- 添加文档对话框 -->
<!-- 文档对话框 -->
<el-dialog
v-model="addDocumentDialogVisible"
title="添加文档到知识库"
@ -1246,10 +1300,11 @@ function shouldShowProgressCount(status: string) {
:data="fileList"
style="width: 100%"
@selection-change="handleFileSelectionChange"
@sort-change="handleFileSortChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="name" label="文件名" min-width="180" show-overflow-tooltip />
<el-table-column prop="size" label="大小" width="100" align="center">
<el-table-column prop="name" label="文件名" min-width="180" show-overflow-tooltip sortable="custom" />
<el-table-column prop="size" label="大小" width="100" align="center" sortable="custom">
<template #default="scope">
{{ formatFileSize(scope.row.size) }}
</template>
@ -1259,7 +1314,11 @@ function shouldShowProgressCount(status: string) {
{{ formatFileType(scope.row.type) }}
</template>
</el-table-column>
<!-- 移除上传日期列 -->
<el-table-column prop="create_date" label="创建时间" align="center" width="180" sortable="custom">
<template #default="scope">
{{ scope.row.create_date }}
</template>
</el-table-column>
</el-table>
<!-- 分页控件 -->
@ -1495,4 +1554,4 @@ function shouldShowProgressCount(status: string) {
vertical-align: middle;
animation: rotating 2s linear infinite;
}
</style>
</style>