Files
2026-07-13 12:35:57 +08:00

333 lines
12 KiB
JavaScript

// 全局变量
let currentPage = 'dashboard';
// DOM 加载完成后执行
document.addEventListener('DOMContentLoaded', function() {
initializePage();
setupEventListeners();
// 如果是首页,默认显示dashboard内容
if (window.location.pathname === '/web/dashboard') {
loadDashboardContent();
}
});
// 初始化页面
function initializePage() {
// 设置当前页面状态
updateActiveNavigation();
}
// 设置事件监听器
function setupEventListeners() {
// 导航按钮点击事件
const navButtons = document.querySelectorAll('.nav-button[data-page]');
navButtons.forEach(button => {
button.addEventListener('click', function(e) {
e.preventDefault();
const page = this.getAttribute('data-page');
loadPage(page);
});
});
// 窗口大小变化事件(保留用于可能的响应式优化)
window.addEventListener('resize', handleWindowResize);
}
// 处理窗口大小变化(保留但简化)
function handleWindowResize() {
// 可以在这里添加响应式相关的处理逻辑
}
// 加载页面内容
async function loadPage(page) {
const pageContent = document.getElementById('pageContent');
// 显示加载状态
showLoadingState();
try {
// 发送AJAX请求获取页面内容
const response = await fetch(`/web/${page}`, {
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
});
if (response.ok) {
const html = await response.text();
// 解析HTML,提取内容部分
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
const content = doc.querySelector('#pageContent') || doc.querySelector('.container-fluid');
if (content) {
// 添加页面切换动画
pageContent.classList.add('page-enter');
pageContent.innerHTML = content.innerHTML;
setTimeout(() => {
pageContent.classList.remove('page-enter');
pageContent.classList.add('page-enter-active');
}, 10);
setTimeout(() => {
pageContent.classList.remove('page-enter-active');
}, 310);
// 更新当前页面状态
currentPage = page;
updateActiveNavigation();
// 更新浏览器历史记录
history.pushState({page: page}, '', `/web/${page}`);
} else {
throw new Error('无法解析页面内容');
}
} else {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
} catch (error) {
console.error('加载页面失败:', error);
showErrorState(error.message);
}
}
// 显示加载状态
function showLoadingState() {
const pageContent = document.getElementById('pageContent');
pageContent.innerHTML = `
<div class="d-flex justify-content-center align-items-center" style="min-height: 300px;">
<div class="text-center">
<div class="loading mb-3"></div>
<p class="text-muted">加载中...</p>
</div>
</div>
`;
}
// 显示错误状态
function showErrorState(message) {
const pageContent = document.getElementById('pageContent');
pageContent.innerHTML = `
<div class="alert alert-danger" role="alert">
<h4 class="alert-heading">加载失败</h4>
<p>${message}</p>
<hr>
<p class="mb-0">请稍后重试或联系管理员。</p>
</div>
`;
}
// 更新当前激活的导航项
function updateActiveNavigation() {
// 移除所有激活状态
const navButtons = document.querySelectorAll('.nav-button');
navButtons.forEach(button => {
button.classList.remove('active');
});
// 设置当前页面为激活状态
const activeButton = document.querySelector(`[data-page="${currentPage}"]`);
if (activeButton) {
activeButton.classList.add('active');
}
}
// 加载仪表板内容
function loadDashboardContent() {
const pageContent = document.getElementById('pageContent');
pageContent.innerHTML = `
<style>
/* 卡片样式 */
.card {
border: none;
background-color: var(--white);
box-shadow: var(--shadow);
transition: all 0.2s ease;
border-radius: 0.75rem;
}
.card:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.card-header {
background-color: var(--white);
border-bottom: 1px solid var(--gray-200);
padding: 1.25rem 1.5rem;
border-radius: 0.75rem 0.75rem 0 0 !important;
}
.card-header.bg-primary-new {
background: linear-gradient(135deg, var(--primary-gradient-start), var(--primary-gradient-end)) !important;
border-bottom: none;
color: var(--white);
}
.card-header.bg-success-new {
background: linear-gradient(135deg, var(--primary-gradient-start), var(--primary-gradient-end)) !important;
border-bottom: none;
color: var(--white);
}
.card-body {
padding: 1.5rem;
}
.card-title {
color: var(--text-primary);
font-weight: 600;
margin-bottom: 0;
}
.card-header.bg-primary-new .card-title,
.card-header.bg-success-new .card-title {
color: var(--white);
}
/* 主要功能卡片容器 - 设置最大宽度 */
.main-cards-container {
max-width: 900px;
margin: 0 auto;
}
/* 系统状态卡片 - 与主要功能卡片对齐 */
.status-card-container {
max-width: 900px;
margin: 0 auto;
}
/* 状态指示样式 */
.bg-light-new {
background-color: var(--gray-100) !important;
border-radius: 0.75rem;
padding: 1.5rem !important;
transition: all 0.2s ease;
}
.bg-light-new:hover {
background: linear-gradient(135deg, var(--secondary-gradient-start), var(--secondary-gradient-end)) !important;
color: var(--white);
}
</style>
<div class="row">
<div class="col-12">
<h1 class="h2 mb-4 text-center">欢迎使用 Kumi</h1>
<p class="lead text-muted mb-5 text-center">知识库与大模型评测平台</p>
<div class="main-cards-container">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-6 mb-4">
<div class="card h-100">
<div class="card-header bg-primary-new text-white">
<h5 class="card-title mb-0 text-center">
<i class="bi bi-book me-2"></i>知识库管理
</h5>
</div>
<div class="card-body text-center">
<p class="card-text">管理你的知识库,包括连接、设置嵌入模型、上传文件和测试功能。</p>
<a href="#" class="btn btn-primary nav-button" data-page="knowledge">开始使用</a>
</div>
</div>
</div>
<div class="col-lg-6 col-md-6 mb-4">
<div class="card h-100">
<div class="card-header bg-primary-new text-white">
<h5 class="card-title mb-0 text-center">
<i class="bi bi-cpu me-2"></i>大模型评测
</h5>
</div>
<div class="card-body text-center">
<p class="card-text">配置和测试大语言模型,上传测评数据集,执行评测任务。</p>
<a href="#" class="btn btn-primary nav-button" data-page="llm/config">开始使用</a>
</div>
</div>
</div>
</div>
</div>
<div class="status-card-container">
<div class="col-12">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0 text-center">
<i class="bi bi-graph-up me-2"></i>系统状态
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-3 col-sm-6 text-center mb-3">
<div class="bg-light-new rounded p-3">
<i class="bi bi-database text-primary" style="font-size: 2rem;"></i>
<h6 class="mt-2 mb-0">知识库</h6>
<small class="text-muted">运行正常</small>
</div>
</div>
<div class="col-md-3 col-sm-6 text-center mb-3">
<div class="bg-light-new rounded p-3">
<i class="bi bi-cpu text-success" style="font-size: 2rem;"></i>
<h6 class="mt-2 mb-0">大模型</h6>
<small class="text-muted">运行正常</small>
</div>
</div>
<div class="col-md-3 col-sm-6 text-center mb-3">
<div class="bg-light-new rounded p-3">
<i class="bi bi-cloud-upload text-info" style="font-size: 2rem;"></i>
<h6 class="mt-2 mb-0">文件服务</h6>
<small class="text-muted">运行正常</small>
</div>
</div>
<div class="col-md-3 col-sm-6 text-center mb-3">
<div class="bg-light-new rounded p-3">
<i class="bi bi-speedometer2 text-warning" style="font-size: 2rem;"></i>
<h6 class="mt-2 mb-0">评测服务</h6>
<small class="text-muted">运行正常</small>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
`;
// 绑定仪表板中的链接事件
const dashboardLinks = document.querySelectorAll('#pageContent [data-page]');
dashboardLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const page = this.getAttribute('data-page');
loadPage(page);
});
});
}
// 处理浏览器后退/前进按钮
window.addEventListener('popstate', function(event) {
if (event.state && event.state.page) {
loadPage(event.state.page);
}
});
// 在 main.js 中添加或更新
document.addEventListener('DOMContentLoaded', function() {
// 导航按钮点击处理
document.querySelectorAll('.nav-button').forEach(button => {
button.addEventListener('click', function(e) {
e.preventDefault();
const page = this.getAttribute('data-page');
if (page) {
window.location.href = `/web/${page}`;
}
});
});
});