// AI助手 - 后台管理前端 const API_BASE = ''; let currentPage = 'stats'; let llmConfigs = []; let agents = []; let searchConfigs = []; let systemConfigs = {}; // ==================== 登录 ==================== document.getElementById('loginBtn').addEventListener('click', async () => { const username = document.getElementById('loginUsername').value.trim(); const password = document.getElementById('loginPassword').value; if (!username || !password) { showToast('请输入用户名和密码'); return; } try { const res = await fetch(`${API_BASE}/api/admin/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }) }); const data = await res.json(); if (data.success) { localStorage.setItem('adminLoggedIn', 'true'); localStorage.setItem('adminUsername', username); document.getElementById('loginPage').style.display = 'none'; document.getElementById('adminPage').style.display = 'block'; document.getElementById('adminName').textContent = username; loadPage('stats'); } else { showToast(data.error || '登录失败'); } } catch (e) { showToast('登录失败,请检查网络'); } }); // 检查登录状态 if (localStorage.getItem('adminLoggedIn') === 'true') { document.getElementById('loginPage').style.display = 'none'; document.getElementById('adminPage').style.display = 'block'; document.getElementById('adminName').textContent = localStorage.getItem('adminUsername'); loadPage('stats'); } // 退出登录 document.getElementById('logoutBtn').addEventListener('click', () => { localStorage.removeItem('adminLoggedIn'); localStorage.removeItem('adminUsername'); document.getElementById('adminPage').style.display = 'none'; document.getElementById('loginPage').style.display = 'flex'; }); // ==================== 侧边栏导航 ==================== document.querySelectorAll('.sidebar-item').forEach(item => { item.addEventListener('click', () => { const page = item.getAttribute('data-page'); document.querySelectorAll('.sidebar-item').forEach(i => i.classList.remove('active')); item.classList.add('active'); loadPage(page); }); }); // ==================== 页面加载 ==================== async function loadPage(page) { currentPage = page; const content = document.getElementById('mainContent'); switch (page) { case 'stats': await loadStatsPage(content); break; case 'llm': await loadLLMPage(content); break; case 'agents': await loadAgentsPage(content); break; case 'search': await loadSearchPage(content); break; case 'system': await loadSystemPage(content); break; } } // ==================== 统计页面 ==================== async function loadStatsPage(content) { const stats = await fetchAPI('/api/admin/stats'); content.innerHTML = `

统计信息

🧠
${stats.llm_total_calls || 0}
LLM 总调用
📊
${stats.llm_today_calls || 0}
今日 LLM 调用
🔍
${stats.search_total_calls || 0}
搜索总调用
📈
${stats.search_today_calls || 0}
今日搜索
🤖
${stats.agent_count || 0}
智能体数量
🧠
${stats.llm_count || 0}
LLM 配置数量
👥
${stats.total_users || 0}
注册用户数
📅
${new Date().toLocaleDateString()}
统计日期

热门智能体使用排行

${stats.agent_usage?.map(a => ` `).join('') || ''}
智能体 使用次数
${a.log_key} ${a.count}
暂无数据
`; } // ==================== 大模型配置页面 ==================== async function loadLLMPage(content) { llmConfigs = await fetchAPI('/api/admin/llm'); content.innerHTML = `

大模型配置

${llmConfigs.map(c => ` `).join('')}
名称 提供商 模型 API URL 状态 操作
${c.name} ${c.is_default ? '默认' : ''} ${c.provider} ${c.model} ${c.api_url} ${c.is_active ? '✅ 启用' : '❌ 禁用'}
${!c.is_default ? `` : ''}
`; } function showAddLLMModal() { showModal('添加大模型配置', `
`); } function showEditLLMModal(id) { const config = llmConfigs.find(c => c.id === id); if (!config) return; showModal('编辑大模型配置', `
`); } async function saveLLM() { const data = { name: document.getElementById('llmName').value, provider: document.getElementById('llmProvider').value, api_url: document.getElementById('llmApiUrl').value, api_key: document.getElementById('llmApiKey').value, model: document.getElementById('llmModel').value, max_tokens: parseInt(document.getElementById('llmMaxTokens').value), temperature: parseFloat(document.getElementById('llmTemperature').value) }; if (!data.name || !data.api_url || !data.api_key || !data.model) { showToast('请填写完整信息'); return; } await fetchAPI('/api/admin/llm', 'POST', data); closeModal(); showToast('添加成功'); loadPage('llm'); } async function updateLLM(id) { const data = { name: document.getElementById('llmName').value, provider: document.getElementById('llmProvider').value, api_url: document.getElementById('llmApiUrl').value, api_key: document.getElementById('llmApiKey').value, model: document.getElementById('llmModel').value, max_tokens: parseInt(document.getElementById('llmMaxTokens').value), temperature: parseFloat(document.getElementById('llmTemperature').value) }; await fetchAPI(`/api/admin/llm/${id}`, 'PUT', data); closeModal(); showToast('更新成功'); loadPage('llm'); } async function setDefaultLLM(id) { await fetchAPI(`/api/admin/llm/${id}/default`, 'POST'); showToast('已设为默认'); loadPage('llm'); } async function deleteLLM(id) { if (!confirm('确定删除此配置?')) return; await fetchAPI(`/api/admin/llm/${id}`, 'DELETE'); showToast('删除成功'); loadPage('llm'); } // ==================== 智能体管理页面 ==================== async function loadAgentsPage(content) { agents = await fetchAPI('/api/admin/agents'); llmConfigs = await fetchAPI('/api/admin/llm'); const categories = { hot: '热门', work: '工作', study: '学习', life: '生活' }; content.innerHTML = `

智能体管理

${agents.map(a => ` `).join('')}
头像 名称 类别 描述 热度 状态 操作
${a.avatar} ${a.name} ${categories[a.category] || a.category} ${a.description || '-'} ${a.heat || 0} ${a.is_active ? '✅ 启用' : '❌ 禁用'}
`; } function showAddAgentModal() { showModal('添加智能体', `
`); } function showEditAgentModal(agentId) { const agent = agents.find(a => a.agent_id === agentId); if (!agent) return; showModal('编辑智能体', `
`); } async function saveAgent() { const data = { agent_id: document.getElementById('agentId').value, name: document.getElementById('agentName').value, avatar: document.getElementById('agentAvatar').value, category: document.getElementById('agentCategory').value, description: document.getElementById('agentDescription').value, system_prompt: document.getElementById('agentPrompt').value, llm_config_id: document.getElementById('agentLLM').value || null, heat: parseInt(document.getElementById('agentHeat').value), tags: document.getElementById('agentTags').value, enable_search: document.getElementById('agentEnableSearch').checked ? 1 : 0 }; if (!data.agent_id || !data.name || !data.system_prompt) { showToast('请填写完整信息'); return; } await fetchAPI('/api/admin/agents', 'POST', data); closeModal(); showToast('添加成功'); loadPage('agents'); } async function updateAgent(agentId) { const data = { name: document.getElementById('agentName').value, avatar: document.getElementById('agentAvatar').value, category: document.getElementById('agentCategory').value, description: document.getElementById('agentDescription').value, system_prompt: document.getElementById('agentPrompt').value, llm_config_id: document.getElementById('agentLLM').value || null, heat: parseInt(document.getElementById('agentHeat').value), tags: document.getElementById('agentTags').value, enable_search: document.getElementById('agentEnableSearch').checked ? 1 : 0 }; await fetchAPI(`/api/admin/agents/${agentId}`, 'PUT', data); closeModal(); showToast('更新成功'); loadPage('agents'); } async function deleteAgent(agentId) { if (!confirm('确定删除此智能体?')) return; await fetchAPI(`/api/admin/agents/${agentId}`, 'DELETE'); showToast('删除成功'); loadPage('agents'); } // ==================== 搜索配置页面 ==================== async function loadSearchPage(content) { searchConfigs = await fetchAPI('/api/admin/search'); content.innerHTML = `

搜索配置

${searchConfigs.map(c => ` `).join('')}
名称 提供商 API URL 最大结果数 状态 操作
${c.name} ${c.is_default ? '默认' : ''} ${c.provider} ${c.api_url} ${c.max_results} ${c.is_active ? '✅ 启用' : '❌ 禁用'}
${!c.is_default ? `` : ''}
`; } function showAddSearchModal() { showModal('添加搜索配置', `
`); } function showEditSearchModal(id) { const config = searchConfigs.find(c => c.id === id); if (!config) return; showModal('编辑搜索配置', `
`); } async function saveSearch() { const data = { name: document.getElementById('searchName').value, provider: document.getElementById('searchProvider').value, api_url: document.getElementById('searchApiUrl').value, api_key: document.getElementById('searchApiKey').value, max_results: parseInt(document.getElementById('searchMaxResults').value) }; if (!data.name || !data.api_url || !data.api_key) { showToast('请填写完整信息'); return; } await fetchAPI('/api/admin/search', 'POST', data); closeModal(); showToast('添加成功'); loadPage('search'); } async function updateSearch(id) { const data = { name: document.getElementById('searchName').value, provider: document.getElementById('searchProvider').value, api_url: document.getElementById('searchApiUrl').value, api_key: document.getElementById('searchApiKey').value, max_results: parseInt(document.getElementById('searchMaxResults').value) }; await fetchAPI(`/api/admin/search/${id}`, 'PUT', data); closeModal(); showToast('更新成功'); loadPage('search'); } async function setDefaultSearch(id) { await fetchAPI(`/api/admin/search/${id}/default`, 'POST'); showToast('已设为默认'); loadPage('search'); } async function deleteSearch(id) { if (!confirm('确定删除此配置?')) return; await fetchAPI(`/api/admin/search/${id}`, 'DELETE'); showToast('删除成功'); loadPage('search'); } // ==================== 系统设置页面 ==================== async function loadSystemPage(content) { systemConfigs = await fetchAPI('/api/admin/system'); content.innerHTML = `

系统设置

${systemConfigs.app_name?.description || ''}

游客使用限制

管理员设置

`; } async function saveSystemConfig() { const data = { app_name: document.getElementById('appName').value, app_version: document.getElementById('appVersion').value, enable_search: document.getElementById('enableSearch').checked ? 'true' : 'false', guest_chat_sessions: document.getElementById('guestChatSessions').value, guest_chat_messages: document.getElementById('guestChatMessages').value, guest_agent_messages: document.getElementById('guestAgentMessages').value, admin_password: document.getElementById('adminPassword').value }; await fetchAPI('/api/admin/system', 'POST', data); showToast('保存成功'); loadPage('system'); } // ==================== 工具函数 ==================== async function fetchAPI(url, method = 'GET', data = null) { const options = { method, headers: { 'Content-Type': 'application/json' } }; if (data) { options.body = JSON.stringify(data); } const res = await fetch(`${API_BASE}${url}`, options); return res.json(); } function showModal(title, content) { const modal = document.getElementById('modal'); const modalContent = document.getElementById('modalContent'); modalContent.innerHTML = ` ${content} `; modal.classList.add('show'); } function closeModal() { document.getElementById('modal').classList.remove('show'); } function showToast(message) { const toast = document.getElementById('toast'); toast.textContent = message; toast.classList.add('show'); setTimeout(() => { toast.classList.remove('show'); }, 2000); } // 点击模态框背景关闭 document.getElementById('modal').addEventListener('click', (e) => { if (e.target.id === 'modal') { closeModal(); } });