feat(知识库管理): 添加知识库列表排序功能并优化表格交互 (#88)
* feat(知识库管理): 添加知识库列表排序功能并优化表格交互
This commit is contained in:
parent
c17f8b844d
commit
e9efc51179
|
@ -1,5 +1,5 @@
|
||||||
import traceback
|
import traceback
|
||||||
from flask import Blueprint, request
|
from flask import request
|
||||||
from services.knowledgebases.service import KnowledgebaseService
|
from services.knowledgebases.service import KnowledgebaseService
|
||||||
from utils import success_response, error_response
|
from utils import success_response, error_response
|
||||||
from .. import knowledgebase_bp
|
from .. import knowledgebase_bp
|
||||||
|
@ -11,11 +11,13 @@ def get_knowledgebase_list():
|
||||||
params = {
|
params = {
|
||||||
'page': int(request.args.get('currentPage', 1)),
|
'page': int(request.args.get('currentPage', 1)),
|
||||||
'size': int(request.args.get('size', 10)),
|
'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_list(**params)
|
result = KnowledgebaseService.get_knowledgebase_list(**params)
|
||||||
return success_response(result)
|
return success_response(result)
|
||||||
except ValueError as e:
|
except ValueError:
|
||||||
return error_response("参数类型错误", code=400)
|
return error_response("参数类型错误", code=400)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return error_response(str(e))
|
return error_response(str(e))
|
||||||
|
@ -102,7 +104,7 @@ def get_knowledgebase_documents(kb_id):
|
||||||
}
|
}
|
||||||
result = KnowledgebaseService.get_knowledgebase_documents(**params)
|
result = KnowledgebaseService.get_knowledgebase_documents(**params)
|
||||||
return success_response(result)
|
return success_response(result)
|
||||||
except ValueError as e:
|
except ValueError:
|
||||||
return error_response("参数类型错误", code=400)
|
return error_response("参数类型错误", code=400)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return error_response(str(e))
|
return error_response(str(e))
|
||||||
|
|
|
@ -22,11 +22,19 @@ class KnowledgebaseService:
|
||||||
return mysql.connector.connect(**DB_CONFIG)
|
return mysql.connector.connect(**DB_CONFIG)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_knowledgebase_list(cls, page=1, size=10, name=''):
|
def get_knowledgebase_list(cls, page=1, size=10, name='', sort_by="create_time", sort_order="desc"):
|
||||||
"""获取知识库列表"""
|
"""获取知识库列表"""
|
||||||
conn = cls._get_db_connection()
|
conn = cls._get_db_connection()
|
||||||
cursor = conn.cursor(dictionary=True)
|
cursor = conn.cursor(dictionary=True)
|
||||||
|
|
||||||
|
# 验证排序字段
|
||||||
|
valid_sort_fields = ["name", "create_time", "create_date"]
|
||||||
|
if sort_by not in valid_sort_fields:
|
||||||
|
sort_by = "create_time"
|
||||||
|
|
||||||
|
# 构建排序子句
|
||||||
|
sort_clause = f"ORDER BY k.{sort_by} {sort_order.upper()}"
|
||||||
|
|
||||||
query = """
|
query = """
|
||||||
SELECT
|
SELECT
|
||||||
k.id,
|
k.id,
|
||||||
|
@ -45,6 +53,9 @@ class KnowledgebaseService:
|
||||||
query += " WHERE k.name LIKE %s"
|
query += " WHERE k.name LIKE %s"
|
||||||
params.append(f"%{name}%")
|
params.append(f"%{name}%")
|
||||||
|
|
||||||
|
# 添加查询排序条件
|
||||||
|
query += f" {sort_clause}"
|
||||||
|
|
||||||
query += " LIMIT %s OFFSET %s"
|
query += " LIMIT %s OFFSET %s"
|
||||||
params.extend([size, (page-1)*size])
|
params.extend([size, (page-1)*size])
|
||||||
|
|
||||||
|
@ -66,7 +77,7 @@ class KnowledgebaseService:
|
||||||
datetime.strptime(result['create_date'], '%Y-%m-%d %H:%M:%S')
|
datetime.strptime(result['create_date'], '%Y-%m-%d %H:%M:%S')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
result['create_date'] = ""
|
result['create_date'] = ""
|
||||||
|
|
||||||
# 获取总数
|
# 获取总数
|
||||||
count_query = "SELECT COUNT(*) as total FROM knowledgebase"
|
count_query = "SELECT COUNT(*) as total FROM knowledgebase"
|
||||||
if name:
|
if name:
|
||||||
|
|
|
@ -5,6 +5,8 @@ export function getKnowledgeBaseListApi(params: {
|
||||||
currentPage: number
|
currentPage: number
|
||||||
size: number
|
size: number
|
||||||
name?: string
|
name?: string
|
||||||
|
sort_by: string
|
||||||
|
sort_order: string
|
||||||
}) {
|
}) {
|
||||||
return request({
|
return request({
|
||||||
url: "/api/v1/knowledgebases",
|
url: "/api/v1/knowledgebases",
|
||||||
|
|
|
@ -128,6 +128,12 @@ const searchData = reactive({
|
||||||
name: ""
|
name: ""
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 排序状态
|
||||||
|
const sortData = reactive({
|
||||||
|
sortBy: "create_date",
|
||||||
|
sortOrder: "desc" // 默认排序顺序 (最新创建的在前)
|
||||||
|
})
|
||||||
|
|
||||||
// 存储多选的表格数据
|
// 存储多选的表格数据
|
||||||
const multipleSelection = ref<KnowledgeBaseData[]>([])
|
const multipleSelection = ref<KnowledgeBaseData[]>([])
|
||||||
|
|
||||||
|
@ -138,7 +144,9 @@ function getTableData() {
|
||||||
getKnowledgeBaseListApi({
|
getKnowledgeBaseListApi({
|
||||||
currentPage: paginationData.currentPage,
|
currentPage: paginationData.currentPage,
|
||||||
size: paginationData.pageSize,
|
size: paginationData.pageSize,
|
||||||
name: searchData.name
|
name: searchData.name,
|
||||||
|
sort_by: sortData.sortBy,
|
||||||
|
sort_order: sortData.sortOrder
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
const result = response as ApiResponse<ListResponse>
|
const result = response as ApiResponse<ListResponse>
|
||||||
paginationData.total = result.data.total
|
paginationData.total = result.data.total
|
||||||
|
@ -455,7 +463,7 @@ async function fetchBatchProgress() {
|
||||||
function handleParseComplete() {
|
function handleParseComplete() {
|
||||||
ElMessage.success("文档解析完成")
|
ElMessage.success("文档解析完成")
|
||||||
getDocumentList() // 刷新文档列表
|
getDocumentList() // 刷新文档列表
|
||||||
getTableData() // 刷新知识库列表(因为文档数量可能变化)
|
getTableData() // 刷新知识库列表
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleParseFailed(error: string) {
|
function handleParseFailed(error: string) {
|
||||||
|
@ -480,7 +488,7 @@ function handleRemoveDocument(row: any) {
|
||||||
ElMessage.success("文档已从知识库移除")
|
ElMessage.success("文档已从知识库移除")
|
||||||
// 刷新文档列表
|
// 刷新文档列表
|
||||||
getDocumentList()
|
getDocumentList()
|
||||||
// 刷新知识库列表(因为文档数量会变化)
|
// 刷新知识库列表
|
||||||
getTableData()
|
getTableData()
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
@ -757,6 +765,25 @@ function handleSelectionChange(selection: KnowledgeBaseData[]) {
|
||||||
multipleSelection.value = selection
|
multipleSelection.value = selection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 处理表格排序变化事件(只允许正序和倒序切换)
|
||||||
|
* @param {object} sortInfo 排序信息对象,包含 prop 和 order
|
||||||
|
* @param {string} sortInfo.prop 排序的字段名
|
||||||
|
* @param {string | null} sortInfo.order 排序的顺序 ('ascending', 'descending', null)
|
||||||
|
*/
|
||||||
|
function handleSortChange({ prop }: { prop: string, order: string | null }) {
|
||||||
|
// 如果点击的是同一个字段,则切换排序顺序
|
||||||
|
if (sortData.sortBy === prop) {
|
||||||
|
// 当前为正序则切换为倒序,否则切换为正序
|
||||||
|
sortData.sortOrder = sortData.sortOrder === "asc" ? "desc" : "asc"
|
||||||
|
} else {
|
||||||
|
// 切换字段时,默认正序
|
||||||
|
sortData.sortBy = prop
|
||||||
|
sortData.sortOrder = "asc"
|
||||||
|
}
|
||||||
|
getTableData()
|
||||||
|
}
|
||||||
|
|
||||||
// 监听分页参数的变化
|
// 监听分页参数的变化
|
||||||
watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
|
watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
|
||||||
|
|
||||||
|
@ -949,17 +976,16 @@ function shouldShowProgressCount(status: string) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="table-wrapper">
|
<div class="table-wrapper">
|
||||||
<el-table :data="tableData" @selection-change="handleSelectionChange">
|
<el-table :data="tableData" @selection-change="handleSelectionChange" @sort-change="handleSortChange">
|
||||||
<el-table-column type="selection" width="50" align="center" />
|
<el-table-column type="selection" width="50" align="center" />
|
||||||
<el-table-column label="序号" align="center" width="80">
|
<el-table-column label="序号" align="center" width="80">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ (paginationData.currentPage - 1) * paginationData.pageSize + scope.$index + 1 }}
|
{{ (paginationData.currentPage - 1) * paginationData.pageSize + scope.$index + 1 }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="name" label="知识库名称" align="center" min-width="120" />
|
<el-table-column prop="name" label="知识库名称" align="center" min-width="120" sortable="custom"/>
|
||||||
<el-table-column prop="description" label="描述" align="center" min-width="180" show-overflow-tooltip />
|
<el-table-column prop="description" label="描述" align="center" min-width="180" show-overflow-tooltip />
|
||||||
<el-table-column prop="doc_num" label="文档数量" align="center" width="100" />
|
<el-table-column prop="doc_num" label="文档数量" align="center" width="120" />
|
||||||
<!-- 添加语言列 -->
|
|
||||||
<el-table-column label="语言" align="center" width="100">
|
<el-table-column label="语言" align="center" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag type="info" size="small">
|
<el-tag type="info" size="small">
|
||||||
|
@ -975,7 +1001,7 @@ function shouldShowProgressCount(status: string) {
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="创建时间" align="center" width="180">
|
<el-table-column label="创建时间" align="center" width="180" sortable="custom">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.create_date }}
|
{{ scope.row.create_date }}
|
||||||
</template>
|
</template>
|
||||||
|
|
Loading…
Reference in New Issue