From 8a50eea4cee101dc0e91383be214ea35bd6ac371 Mon Sep 17 00:00:00 2001 From: zhuoqinglian <1035449612@qq.com> Date: Wed, 3 Jun 2026 16:49:08 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E7=9F=A5=E8=AF=86=E5=BA=93=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E9=A1=B5=E9=9D=A2=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/KnowledgeBaseItem.vue | 597 ++++++ .../src/views/KnowledgeBaseManagement.vue | 1709 ++++++++++------- 2 files changed, 1661 insertions(+), 645 deletions(-) create mode 100644 main/manager-web/src/views/KnowledgeBaseItem.vue diff --git a/main/manager-web/src/views/KnowledgeBaseItem.vue b/main/manager-web/src/views/KnowledgeBaseItem.vue new file mode 100644 index 00000000..f0a6a6a1 --- /dev/null +++ b/main/manager-web/src/views/KnowledgeBaseItem.vue @@ -0,0 +1,597 @@ + + + + + {{`当前知识库文档资产(${kb?.name})`}} + 共 {{ documents.length }} 个文档 + + + + 查询 + 新增 + 召回测试 + + + + + + + + + + {{ doc.name }} + 上传时间 {{ formatDate(doc.createdAt) }} + + + + + + + + + + {{ getProgressText(doc) }} + + {{ getDocStatusText(doc) }} + 切片 {{ doc.sliceCount }} + + + + 查看切片 + + + 解析 + + + 删除 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/manager-web/src/views/KnowledgeBaseManagement.vue b/main/manager-web/src/views/KnowledgeBaseManagement.vue index e04fc785..6353e2a8 100644 --- a/main/manager-web/src/views/KnowledgeBaseManagement.vue +++ b/main/manager-web/src/views/KnowledgeBaseManagement.vue @@ -1,116 +1,236 @@ - - {{ $t('knowledgeBaseManagement.title') }} + 知识库中心 - - {{ $t('knowledgeBaseManagement.search') }} + + + + 查询 + + + + 新建知识库 + - - - - - - - - {{ scope.row.name }} - - - - - {{ scope.row.description || '-' }} - - - - - {{ scope.row.documentCount || 0 }} - - - - - - - - - - {{ formatDate(scope.row.createdAt) }} - - - - - - {{ $t('knowledgeBaseManagement.view') }} - - - {{ $t('knowledgeBaseManagement.edit') }} - - - {{ $t('knowledgeBaseManagement.delete') }} - - - - + + + + + 知识库切换 + + + + + + + + + + + + + + + + + + + + {{ kb.name }} + + + {{`文档 ${kb.documentCount || 0}` }} + + {{ formatDate(kb.createdAt) }} + + + + + + + {{ kb.description || '-' }} + + + + 暂无知识库 + + + + + + + - - - - {{ isAllSelected ? $t('knowledgeBaseManagement.cancelSelectAll') : $t('knowledgeBaseManagement.selectAll') }} - - - {{ $t('knowledgeBaseManagement.add') }} - - - {{ $t('knowledgeBaseManagement.delete') }} - - - - - - - - - {{ $t('knowledgeBaseManagement.firstPage') }} - - - {{ $t('knowledgeBaseManagement.prevPage') }} - - - {{ page }} - - - {{ $t('knowledgeBaseManagement.nextPage') }} - - {{ $t('knowledgeBaseManagement.totalRecords', { total }) }} - - - + + + + + - - + + + + + + + + + + + 切片 {{ (sliceCurrentPage - 1) * slicePageSize + index + 1 }} + + + {{ slice.content }} + + + + + + + + + + + + 首页 + 上一页 + {{ page }} + 下一页 + 共 {{ sliceTotal }} 条 + + + + + + + + + 将文件拖到此处,或点击上传 + 支持的文档类型:PDF、DOC、DOCX、TXT、MD、CSV、XLS、XLSX、PPT、PPTX,单次批量上传文件数不超过 32 个 + + + + 已选择文件 ({{ selectedFilesList.length }}) + + + + + {{ file.name }} + {{ formatFileSize(file.size) }} + + + + + + + + + 取消 + + 确认上传 ({{ selectedFilesList.length }}) + + + + + + + + + + + + + + 执行测试 + 取消 + + + 测试结果 + + + 切片 {{ index + 1 }} + 相似度: {{ (chunk.similarity || 0).toFixed(4) }} + {{ chunk.content }} + + + + + @@ -123,703 +243,1002 @@ import Api from "@/apis/api"; import HeaderBar from "@/components/HeaderBar.vue"; import VersionFooter from "@/components/VersionFooter.vue"; import KnowledgeBaseDialog from "@/components/KnowledgeBaseDialog.vue"; +import KnowledgeBaseItem from "./KnowledgeBaseItem.vue"; export default { - components: { HeaderBar, VersionFooter, KnowledgeBaseDialog }, + components: { HeaderBar, VersionFooter, KnowledgeBaseDialog, KnowledgeBaseItem }, data() { return { - searchName: "", - knowledgeBaseList: [], - currentPage: 1, + knowledgeBases: [], + selectedKb: null, + searchKbName: '', loading: false, - pageSize: 10, - pageSizeOptions: [10, 20, 50, 100], - total: 0, dialogVisible: false, - dialogTitle: "", - selectedKnowledgeBase: [], - isAllSelected: false, + dialogTitle: '', knowledgeBaseForm: { id: null, datasetId: null, - name: "", - description: "", + name: '', + description: '', status: 1 - } + }, + uploadDialogVisible: false, + sliceDialogVisible: false, + retrievalTestDialogVisible: false, + retrievalTestForm: { + question: '' + }, + retrievalTestResult: null, + retrievalTestLoading: false, + selectedFilesList: [], + uploading: false, + currentDocumentId: '', + currentDocumentName: '', + sliceList: [], + sliceLoading: false, + sliceCurrentPage: 1, + slicePageSize: 10, + sliceTotal: 0, }; }, - created() { - this.fetchKnowledgeBaseList(); - }, computed: { - pageCount() { - return Math.ceil(this.total / this.pageSize); + filteredKnowledgeBases() { + if (!this.searchKbName) return this.knowledgeBases; + const keyword = this.searchKbName.toLowerCase(); + return this.knowledgeBases.filter(kb => + kb.name.toLowerCase().includes(keyword) + ); }, - visiblePages() { + slicePageCount() { + return Math.ceil(this.sliceTotal / this.slicePageSize); + }, + sliceVisiblePages() { const pages = []; const maxVisible = 3; - let start = Math.max(1, this.currentPage - 1); - let end = Math.min(this.pageCount, start + maxVisible - 1); - + let start = Math.max(1, this.sliceCurrentPage - 1); + let end = Math.min(this.slicePageCount, start + maxVisible - 1); if (end - start + 1 < maxVisible) { start = Math.max(1, end - maxVisible + 1); } - for (let i = start; i <= end; i++) { pages.push(i); } return pages; }, }, + created() { + this.fetchKnowledgeBases(); + }, methods: { - handlePageSizeChange: function(val) { - this.pageSize = val; - this.currentPage = 1; - this.fetchKnowledgeBaseList(); - }, - fetchKnowledgeBaseList: function() { + fetchKnowledgeBases() { this.loading = true; Api.knowledgeBase.getKnowledgeBaseList( - { - page: this.currentPage, - page_size: this.pageSize, - name: this.searchName, - }, + { page: 1, page_size: 100, name: this.searchKbName }, (res) => { this.loading = false; - console.log('getKnowledgeBaseList response:', res); // 添加调试日志 - - // 修复:从 res.data 获取分页数据,而不是 res.data.data - // 因为 knowledgeBase.js 直接传递了整个响应对象 if (res.data && res.data.code === 0) { const pageData = res.data.data || {}; - this.knowledgeBaseList = pageData.list || []; - this.total = pageData.total || 0; - console.log('Updated knowledgeBaseList:', this.knowledgeBaseList); // 添加调试日志 + this.knowledgeBases = pageData.list || []; + if (this.knowledgeBases.length > 0 && !this.selectedKb) { + this.selectKnowledgeBase(this.knowledgeBases[0]); + } else if (this.selectedKb) { + const updated = this.knowledgeBases.find(kb => kb.datasetId === this.selectedKb.datasetId); + if (updated) this.selectedKb = updated; + } } else { - this.$message.error({ - message: res.data?.msg || this.$t('knowledgeBaseManagement.getKnowledgeBaseListFailed'), - showClose: true - }); + this.$message.error(res.data?.msg || '获取知识库列表失败'); } }, () => { this.loading = false; - this.$message.error(this.$t('knowledgeBaseManagement.getKnowledgeBaseListFailed')); + this.$message.error('获取知识库列表失败'); } ); }, - handleSearch: function() { - this.currentPage = 1; - this.fetchKnowledgeBaseList(); + + selectKnowledgeBase(kb) { + this.selectedKb = kb; }, - handleSelectionChange: function(val) { - this.selectedKnowledgeBase = val; + + refreshDocuments() { + this.$refs.knowledgeBaseItem?.fetchDocuments(); }, - toggleSelectAll: function() { - if (this.isAllSelected) { - // 取消全选 - this.$refs.paramsTable.clearSelection(); - this.isAllSelected = false; - } else { - // 全选 - this.knowledgeBaseList.forEach(row => { - this.$refs.paramsTable.toggleRowSelection(row, true); - }); - this.isAllSelected = true; + + handleSearchKb() { + this.fetchKnowledgeBases(); + }, + + scrollCards(direction) { + const container = this.$refs.kbCards; + if (container) { + container.scrollBy({ left: direction * 364, behavior: 'smooth' }); } }, - headerCellClassName: function({ row, column, rowIndex, columnIndex }) { - if (columnIndex === 0) { - return 'header-cell-first'; - } - return 'header-cell'; - }, - showAddDialog: function() { - console.log('showAddDialog called'); - this.dialogTitle = this.$t('knowledgeBaseManagement.addKnowledgeBase'); + + showAddDialog() { + this.dialogTitle = '新增知识库'; this.knowledgeBaseForm = { id: null, datasetId: null, - name: "", - description: "", + name: '', + description: '', status: 1 }; this.dialogVisible = true; - console.log('dialogVisible set to:', this.dialogVisible); }, - showViewDialog: function(row) { - // 跳转到上传文件页面,传递知识库ID和名称 - this.$router.push({ - path: '/knowledge-file-upload', - query: { - datasetId: row.datasetId, - knowledgeBaseName: row.name - } - }); - }, - showEditDialog: function(row) { - this.dialogTitle = this.$t('knowledgeBaseManagement.editKnowledgeBase'); + + editKnowledgeBase(kb) { + this.dialogTitle = '编辑知识库'; this.knowledgeBaseForm = { - id: row.id, - datasetId: row.datasetId, - name: row.name, - description: row.description || "", - status: row.status, - ragModelId: row.ragModelId || null + id: kb.id, + datasetId: kb.datasetId, + name: kb.name, + description: kb.description || '', + status: kb.status, + ragModelId: kb.ragModelId }; this.dialogVisible = true; }, - handleSubmit: function(form) { - console.log('handleSubmit called with form:', form); - if (form.id) { - console.log('Editing knowledge base:', form.datasetId); - Api.knowledgeBase.updateKnowledgeBase(form.datasetId, form, (res) => { - console.log('Update response:', res); + + handleStatusChange(kb) { + const updateForm = { + id: kb.id, + datasetId: kb.datasetId, + name: kb.name, + description: kb.description, + status: kb.status + }; + Api.knowledgeBase.updateKnowledgeBase(kb.datasetId, updateForm, (res) => { + if (res.data && res.data.code !== 0) { + this.fetchKnowledgeBases(); + this.$message.error(res.data?.msg || '更新失败'); + } else { + this.$message.success(kb.status === 1 ? '已启用' : '已停用'); + if (this.selectedKb && this.selectedKb.datasetId === kb.datasetId) { + this.selectedKb = { ...kb }; + } + } + }, () => { + this.fetchKnowledgeBases(); + this.$message.error('更新失败'); + }); + }, + + deleteKnowledgeBase(kb) { + this.$confirm( + `确定要删除知识库「${kb.name}」吗?删除后不可恢复。`, + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + } + ).then(() => { + Api.knowledgeBase.deleteKnowledgeBase(kb.datasetId, (res) => { if (res.data && res.data.code === 0) { - this.dialogVisible = false; - this.fetchKnowledgeBaseList(); - this.$message.success(this.$t('knowledgeBaseManagement.updateSuccess')); + this.$message.success('删除成功'); + if (this.selectedKb && this.selectedKb.datasetId === kb.datasetId) { + this.selectedKb = null; + } + this.fetchKnowledgeBases(); } else { - this.$message.error(res.data?.msg || this.$t('knowledgeBaseManagement.updateFailed')); + this.$message.error(res.data?.msg || '删除失败'); } }, (err) => { - console.log('Error callback received:', err); - // 错误回调处理后端返回的错误信息 - if (err && err.data) { - console.log('后端返回错误消息:', err.data.msg || err.msg); - this.$message.error(err.data.msg || err.msg || this.$t('knowledgeBaseManagement.updateFailed')); + this.$message.error(err?.data?.msg || '删除失败'); + }); + }).catch(() => {}); + }, + + showUploadDialog() { + if (!this.selectedKb) { + this.$message.warning('请先选择知识库'); + return; + } + this.uploadDialogVisible = true; + }, + + handleSubmit(form) { + if (form.id) { + Api.knowledgeBase.updateKnowledgeBase(form.datasetId, form, (res) => { + if (res.data && res.data.code === 0) { + this.dialogVisible = false; + this.fetchKnowledgeBases(); + this.$message.success('修改成功'); } else { - this.$message.error(this.$t('knowledgeBaseManagement.updateFailed')); + this.$message.error(res.data?.msg || '更新失败'); } + }, (err) => { + this.$message.error(err?.data?.msg || '更新失败'); }); } else { - // 新增 - 只传递必要的字段,不传递id const createData = { name: form.name, description: form.description, status: form.status, ragModelId: form.ragModelId }; - console.log('Creating knowledge base with data:', createData); Api.knowledgeBase.createKnowledgeBase(createData, (res) => { - console.log('Create response:', res); if (res.data && res.data.code === 0) { this.dialogVisible = false; - this.fetchKnowledgeBaseList(); - this.$message.success(this.$t('knowledgeBaseManagement.addSuccess')); + this.fetchKnowledgeBases(); + this.$message.success('新增成功'); } else { - this.$message.error(res.data?.msg || this.$t('knowledgeBaseManagement.addFailed')); + this.$message.error(res.data?.msg || '新增失败'); } }, (err) => { - console.log('Error callback received:', err); - // 错误回调处理后端返回的错误信息 - if (err && err.data) { - console.log('后端返回错误消息:', err.data.msg || err.msg); - this.$message.error(err.data.msg || err.msg || this.$t('knowledgeBaseManagement.addFailed')); - } else { - this.$message.error(this.$t('knowledgeBaseManagement.addFailed')); - } + this.$message.error(err?.data?.msg || '新增失败'); }); } }, - deleteSelectedKnowledgeBase: function() { - if (this.selectedKnowledgeBase.length === 0) { - this.$message.warning(this.$t('knowledgeBaseManagement.selectKnowledgeBaseFirst')); + + handleUploadDialogClose() { + if (this.$refs.uploadRef) { + this.$refs.uploadRef.clearFiles(); + } + this.selectedFilesList = []; + }, + + handleFileChange(file, fileList) { + if (!file || !file.raw) return; + const isLt10M = file.size / 1024 / 1024 < 10; + if (!isLt10M) { + this.$message.error('文件大小不能超过10MB!'); + return; + } + this.selectedFilesList.push({ + name: file.name, + size: file.size, + raw: file.raw + }); + }, + + removeSelectedFile(index) { + this.selectedFilesList.splice(index, 1); + }, + + formatFileSize(bytes) { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + }, + + handleBatchUploadSubmit() { + if (this.selectedFilesList.length === 0) { + this.$message.error('请选择要上传的文件'); return; } - this.$confirm( - this.$t('knowledgeBaseManagement.confirmBatchDelete', { count: this.selectedKnowledgeBase.length }), - this.$t('common.warning'), - { - confirmButtonText: this.$t('common.confirm'), - cancelButtonText: this.$t('common.cancel'), - type: 'warning' - }).then(() => { - const ids = this.selectedKnowledgeBase.map(item => item.datasetId).join(','); - Api.knowledgeBase.deleteKnowledgeBases(ids, (res) => { - if (res.data && res.data.code === 0) { - this.fetchKnowledgeBaseList(); - this.$message.success(this.$t('knowledgeBaseManagement.batchDeleteSuccess', { count: this.selectedKnowledgeBase.length })); - } else { - this.$message.error(res.data?.msg || this.$t('knowledgeBaseManagement.deleteFailed')); - } - }, (err) => { - console.log('Error callback received:', err); - // 错误回调处理后端返回的错误信息 - if (err && err.data) { - console.log('后端返回错误消息:', err.data.msg || err.msg); - this.$message.error(err.data.msg || err.msg || this.$t('knowledgeBaseManagement.deleteFailed')); - } else { - this.$message.error(this.$t('knowledgeBaseManagement.deleteFailed')); - } - }); - }).catch(() => { - this.$message({ - type: 'info', - message: this.$t('knowledgeBaseManagement.operationCancelled'), - duration: 1000 + this.uploading = true; + + const uploadPromises = this.selectedFilesList.map(file => { + return new Promise((resolve, reject) => { + const formData = new FormData(); + formData.append('file', file.raw); + + Api.knowledgeBase.uploadDocument(this.selectedKb.datasetId, formData, + ({ data }) => { + if (data && data.code === 0) { + resolve({ success: true, fileName: file.name }); + } else { + reject({ success: false, fileName: file.name, error: data?.msg || '上传失败' }); + } + }, + (err) => { + if (err && err.data) { + reject({ success: false, fileName: file.name, error: err.data.msg || err.msg || '上传失败' }); + } else { + reject({ success: false, fileName: file.name, error: '上传失败' }); + } + console.error('上传文档失败:', err); + } + ); }); }); - }, - deleteSingleKnowledgeBase: function(row) { - this.$confirm( - this.$t('knowledgeBaseManagement.confirmBatchDelete', { count: 1 }), - this.$t('common.warning'), - { - confirmButtonText: this.$t('common.confirm'), - cancelButtonText: this.$t('common.cancel'), - type: 'warning' - }).then(() => { - Api.knowledgeBase.deleteKnowledgeBase(row.datasetId, (res) => { - if (res.data && res.data.code === 0) { - this.fetchKnowledgeBaseList(); - this.$message.success(this.$t('knowledgeBaseManagement.batchDeleteSuccess', { count: 1 })); - } else { - this.$message.error(res.data?.msg || this.$t('knowledgeBaseManagement.deleteFailed')); + + Promise.all(uploadPromises.map(p => p.catch(e => e))) + .then(results => { + this.uploading = false; + + const successCount = results.filter(r => r.success).length; + const failedCount = results.filter(r => !r.success).length; + + if (successCount > 0) { + this.$message.success(`成功上传 ${successCount} 个文件`); } - }, (err) => { - console.log('Error callback received:', err); - // 错误回调处理后端返回的错误信息 - if (err && err.data) { - console.log('后端返回错误消息:', err.data.msg || err.msg); - this.$message.error(err.data.msg || err.msg || this.$t('knowledgeBaseManagement.deleteFailed')); - } else { - this.$message.error(this.$t('knowledgeBaseManagement.deleteFailed')); + + if (failedCount > 0) { + const failedFiles = results.filter(r => !r.success).map(r => r.fileName); + this.$message.error(`上传失败 ${failedCount} 个文件: ${failedFiles.join(', ')}`); } + + if (successCount > 0) { + this.uploadDialogVisible = false; + this.refreshDocuments(); + } + }) + .catch(error => { + this.uploading = false; + this.$message.error('批量上传失败'); + console.error('批量上传失败:', error); }); - }).catch(() => { - this.$message({ - type: 'info', - message: this.$t('knowledgeBaseManagement.operationCancelled'), - duration: 1000 - }); - }); }, - handleStatusChange: function(row) { - // 只传递需要更新的字段,确保包含id字段 - const updateForm = { - id: row.id, // 添加id字段,后端需要此字段来定位记录 - datasetId: row.datasetId, - name: row.name, - description: row.description, - status: row.status - }; - console.log('Updating knowledge base status:', updateForm); // 添加调试日志 - Api.knowledgeBase.updateKnowledgeBase(row.datasetId, updateForm, (res) => { - console.log('Status update response:', res); // 添加调试日志 - if (res.data && res.data.code !== 0) { - // 恢复原来的状态 - this.fetchKnowledgeBaseList(); - this.$message.error(res.data?.msg || this.$t('knowledgeBaseManagement.updateFailed')); - } else { - // 更新成功,显示成功消息 - this.$message.success(this.$t('knowledgeBaseManagement.updateSuccess')); + + showRetrievalTestDialog() { + if (!this.selectedKb) { + this.$message.warning('请先选择知识库'); + return; + } + this.retrievalTestForm.question = ''; + this.retrievalTestResult = null; + this.retrievalTestDialogVisible = true; + }, + + runRetrievalTest() { + if (!this.retrievalTestForm.question.trim()) { + this.$message.error('请输入测试问题'); + return; + } + this.retrievalTestLoading = true; + Api.knowledgeBase.retrievalTest( + this.selectedKb.datasetId, + { question: this.retrievalTestForm.question.trim() }, + ({ data }) => { + this.retrievalTestLoading = false; + if (data && data.code === 0) { + this.retrievalTestResult = data.data || data; + } else { + this.$message.error(data?.msg || '召回测试失败'); + } + }, + (err) => { + this.retrievalTestLoading = false; + this.$message.error(err?.data?.msg || '召回测试失败'); } - }, () => { - // 恢复原来的状态 - this.fetchKnowledgeBaseList(); - this.$message.error(this.$t('knowledgeBaseManagement.updateFailed')); - }); + ); }, - goToPage: function(page) { - if (page !== this.currentPage) { - this.currentPage = page; - this.fetchKnowledgeBaseList(); - } + + handleViewSlices(doc) { + this.currentDocumentId = doc.id; + this.currentDocumentName = doc.name; + this.sliceDialogVisible = true; + this.sliceCurrentPage = 1; + this.fetchSlices(); }, - goFirst: function() { - if (this.currentPage !== 1) { - this.currentPage = 1; - this.fetchKnowledgeBaseList(); - } + + fetchSlices() { + if (!this.selectedKb || !this.currentDocumentId) return; + this.sliceLoading = true; + const params = { + page: this.sliceCurrentPage, + page_size: this.slicePageSize + }; + Api.knowledgeBase.listChunks( + this.selectedKb.datasetId, + this.currentDocumentId, + params, + ({ data }) => { + this.sliceLoading = false; + if (data && data.code === 0) { + const responseData = data.data; + if (responseData && responseData.list) { + this.sliceList = responseData.list; + this.sliceTotal = responseData.total || responseData.list.length; + } else if (responseData && responseData.chunks && Array.isArray(responseData.chunks)) { + this.sliceList = responseData.chunks; + this.sliceTotal = responseData.total || responseData.chunks.length; + } else if (Array.isArray(responseData)) { + this.sliceList = responseData; + this.sliceTotal = responseData.length; + } else { + this.sliceList = []; + this.sliceTotal = 0; + } + } else { + this.$message.error(data?.msg || '获取切片列表失败'); + this.sliceList = []; + this.sliceTotal = 0; + } + }, + (err) => { + this.sliceLoading = false; + if (err && err.data) { + this.$message.error(err.data.msg || err.msg || '获取切片列表失败'); + } else { + this.$message.error('获取切片列表失败'); + } + this.sliceList = []; + this.sliceTotal = 0; + } + ); }, - goPrev: function() { - if (this.currentPage > 1) { - this.currentPage--; - this.fetchKnowledgeBaseList(); - } + + handleSliceSizeChange(val) { + this.slicePageSize = val; + this.sliceCurrentPage = 1; + this.fetchSlices(); }, - goNext: function() { - if (this.currentPage < this.pageCount) { - this.currentPage++; - this.fetchKnowledgeBaseList(); - } + + getCardColorClass(index) { + const colors = ['blue', 'purple', 'green', 'orange']; + return colors[index % colors.length]; }, - formatDate: function(dateString) { + + getStatusClass(kb) { + return kb.status === 1 ? 'active' : 'inactive'; + }, + + getStatusText(kb) { + return kb.status === 1 ? '已启用' : '未启用'; + }, + + formatDate(dateString) { if (!dateString) return ''; const date = new Date(dateString); - return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`; - } + return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; + }, + + formatFileSize(bytes) { + if (!bytes) return '0 B'; + const units = ['B', 'KB', 'MB', 'GB']; + let i = 0; + let size = bytes; + while (size >= 1024 && i < units.length - 1) { + size /= 1024; + i++; + } + return size.toFixed(1) + ' ' + units[i]; + }, } };
暂无知识库
切片 {{ (sliceCurrentPage - 1) * slicePageSize + index + 1 }}
切片 {{ index + 1 }}