You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
5.6 KiB

1 month ago
// API基础URL
const API_BASE_URL = 'http://localhost:8000';
// 初始化页面
document.addEventListener('DOMContentLoaded', function() {
loadKbList();
setupEventListeners();
});
// 设置事件监听器
function setupEventListeners() {
// 添加知识库按钮
document.getElementById('add-kb-btn').addEventListener('click', showKbModal);
// 上传文件按钮
document.getElementById('upload-file-btn').addEventListener('click', showFileModal);
// 知识库选择器变化
document.getElementById('kb-selector').addEventListener('change', function() {
loadFileList(this.value);
});
}
// 加载知识库列表
async function loadKbList() {
try {
const response = await axios.get(`${API_BASE_URL}/kb`);
const kbList = response.data;
const tbody = document.getElementById('kb-table-body');
tbody.innerHTML = '';
const kbSelector = document.getElementById('kb-selector');
kbSelector.innerHTML = '<option value="">-- 选择知识库 --</option>';
kbList.forEach(kb => {
// 填充知识库表格
const row = document.createElement('tr');
row.innerHTML = `
<td>${kb.id}</td>
<td>${kb.name}</td>
<td>${kb.description || '-'}</td>
<td>${new Date(kb.create_time).toLocaleString()}</td>
<td>
<button class="btn btn-sm btn-outline-primary edit-kb" data-id="${kb.id}">编辑</button>
<button class="btn btn-sm btn-outline-danger delete-kb" data-id="${kb.id}">删除</button>
</td>
`;
tbody.appendChild(row);
// 填充知识库选择器
const option = document.createElement('option');
option.value = kb.id;
option.textContent = kb.name;
kbSelector.appendChild(option);
});
// 添加编辑和删除按钮的事件
document.querySelectorAll('.edit-kb').forEach(btn => {
btn.addEventListener('click', function() {
showKbModal(this.getAttribute('data-id'));
});
});
document.querySelectorAll('.delete-kb').forEach(btn => {
btn.addEventListener('click', function() {
deleteKb(this.getAttribute('data-id'));
});
});
} catch (error) {
console.error('加载知识库列表失败:', error);
alert('加载知识库列表失败');
}
}
// 加载文件列表
async function loadFileList(kbId) {
if (!kbId) return;
try {
const response = await axios.get(`${API_BASE_URL}/kb_files?kb_id=${kbId}`);
const fileList = response.data;
const tbody = document.getElementById('file-table-body');
tbody.innerHTML = '';
fileList.forEach(file => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${file.id}</td>
<td>${file.file_name}</td>
<td>${formatFileSize(file.file_size)}</td>
<td>${file.file_type}</td>
<td>${getFileStatusText(file.state)}</td>
<td>${new Date(file.create_time).toLocaleString()}</td>
<td>
<button class="btn btn-sm btn-outline-danger delete-file" data-id="${file.id}">删除</button>
</td>
`;
tbody.appendChild(row);
});
// 添加删除按钮的事件
document.querySelectorAll('.delete-file').forEach(btn => {
btn.addEventListener('click', function() {
deleteFile(this.getAttribute('data-id'));
});
});
} catch (error) {
console.error('加载文件列表失败:', error);
alert('加载文件列表失败');
}
}
// 辅助函数:格式化文件大小
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
// 辅助函数:获取文件状态文本
function getFileStatusText(state) {
switch (state) {
case 0: return '待处理';
case 1: return '已处理';
case 2: return '处理失败';
default: return '未知状态';
}
}
// 显示知识库模态框
function showKbModal(kbId = null) {
// 实现知识库添加/编辑模态框逻辑
}
// 显示文件上传模态框
function showFileModal() {
// 实现文件上传模态框逻辑
}
// 删除知识库
async function deleteKb(kbId) {
if (!confirm('确定要删除这个知识库吗?')) return;
try {
await axios.delete(`${API_BASE_URL}/kb/${kbId}`);
alert('删除成功');
loadKbList();
} catch (error) {
console.error('删除知识库失败:', error);
alert('删除知识库失败');
}
}
// 删除文件
async function deleteFile(fileId) {
if (!confirm('确定要删除这个文件吗?')) return;
try {
await axios.delete(`${API_BASE_URL}/kb_files/${fileId}`);
alert('删除成功');
const kbId = document.getElementById('kb-selector').value;
if (kbId) loadFileList(kbId);
} catch (error) {
console.error('删除文件失败:', error);
alert('删除文件失败');
}
}