/** * MineNASAI WebUI 主应用 */ const { createApp, ref, reactive, computed, onMounted, watch } = Vue; // API 基础路径 const API_BASE = '/api'; // 全局 app 变量,供组件注册使用 var app = null; // 获取 Element Plus 中文语言包(兼容不同变量名) const zhCnLocale = (function() { if (typeof ElementPlusLocaleZhCn !== 'undefined') return ElementPlusLocaleZhCn; if (typeof ELEMENT_PLUS_LOCALE_ZH_CN !== 'undefined') return ELEMENT_PLUS_LOCALE_ZH_CN; // 如果都没有,返回 undefined,Element Plus 会使用默认英文 console.warn('Element Plus 中文语言包未加载'); return undefined; })(); // API 请求封装 const api = { async get(url) { const res = await fetch(API_BASE + url); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); }, async post(url, data) { const res = await fetch(API_BASE + url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); }, async put(url, data) { const res = await fetch(API_BASE + url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); }, async delete(url) { const res = await fetch(API_BASE + url, { method: 'DELETE' }); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); } }; // 创建 Vue 应用 app = createApp({ setup() { // 状态 const isCollapsed = ref(false); const activeMenu = ref('dashboard'); const systemStatus = ref('running'); const systemStats = reactive({ connections: 0, agents: 0, tasks: 0, uptime: '0h' }); // 配置数据 const config = reactive({ llm: { default_provider: 'anthropic', default_model: 'claude-sonnet-4-20250514', anthropic_api_key: '', openai_api_key: '', deepseek_api_key: '', zhipu_api_key: '', minimax_api_key: '', minimax_group_id: '', moonshot_api_key: '', gemini_api_key: '' }, channels: { wework: { enabled: false, corp_id: '', agent_id: '', secret: '', token: '', encoding_aes_key: '' }, feishu: { enabled: false, app_id: '', app_secret: '', verification_token: '', encrypt_key: '' } }, proxy: { enabled: false, http: '', https: '', no_proxy: [], auto_detect: true } }); // Agent 列表 const agents = ref([]); // 定时任务列表 const cronJobs = ref([]); // 当前页面标题 const currentPageTitle = computed(() => { const titles = { 'dashboard': '仪表盘', 'llm': 'LLM 接口配置', 'channels': '通讯渠道配置', 'proxy': '代理设置', 'agents': 'Agent 管理', 'scheduler': '定时任务', 'terminal': '终端', 'logs': '系统日志' }; return titles[activeMenu.value] || 'MineNASAI'; }); // 加载配置 async function loadConfig() { try { const data = await api.get('/config'); Object.assign(config.llm, data.llm || {}); Object.assign(config.channels, data.channels || {}); Object.assign(config.proxy, data.proxy || {}); } catch (e) { console.error('加载配置失败:', e); } } // 加载系统状态 async function loadStats() { try { const data = await api.get('/stats'); Object.assign(systemStats, data); systemStatus.value = data.status || 'running'; } catch (e) { console.error('加载状态失败:', e); systemStatus.value = 'error'; } } // 加载 Agent 列表 async function loadAgents() { try { const data = await api.get('/agents'); agents.value = data.agents || []; } catch (e) { console.error('加载 Agent 失败:', e); } } // 加载定时任务 async function loadCronJobs() { try { const data = await api.get('/cron-jobs'); cronJobs.value = data.jobs || []; } catch (e) { console.error('加载定时任务失败:', e); } } // 保存 LLM 配置 async function saveLLMConfig(data) { try { await api.put('/config/llm', data); Object.assign(config.llm, data); ElementPlus.ElMessage.success('LLM 配置保存成功'); } catch (e) { ElementPlus.ElMessage.error('保存失败: ' + e.message); } } // 保存通讯渠道配置 async function saveChannelsConfig(data) { try { await api.put('/config/channels', data); Object.assign(config.channels, data); ElementPlus.ElMessage.success('通讯渠道配置保存成功'); } catch (e) { ElementPlus.ElMessage.error('保存失败: ' + e.message); } } // 保存代理配置 async function saveProxyConfig(data) { try { await api.put('/config/proxy', data); Object.assign(config.proxy, data); ElementPlus.ElMessage.success('代理配置保存成功'); } catch (e) { ElementPlus.ElMessage.error('保存失败: ' + e.message); } } // 菜单选择 function handleMenuSelect(index) { activeMenu.value = index; } // 退出登录 function handleLogout() { if (confirm('确定要退出登录吗?')) { window.location.href = '/'; } } // 初始化 onMounted(() => { loadConfig(); loadStats(); loadAgents(); loadCronJobs(); // 定时刷新状态 setInterval(loadStats, 30000); }); return { isCollapsed, activeMenu, systemStatus, systemStats, config, agents, cronJobs, currentPageTitle, handleMenuSelect, handleLogout, loadAgents, loadCronJobs, saveLLMConfig, saveChannelsConfig, saveProxyConfig, zhCn: zhCnLocale }; } }); // 注册 Element Plus 图标 for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component); } // 使用 Element Plus app.use(ElementPlus); // 注意:挂载操作在 main.js 中进行,确保组件先注册