diff --git a/xiaoqu-agent-service/front/src/App.vue b/xiaoqu-agent-service/front/src/App.vue index 9217cc1..f1ee644 100644 --- a/xiaoqu-agent-service/front/src/App.vue +++ b/xiaoqu-agent-service/front/src/App.vue @@ -13,6 +13,7 @@ const menus = [ const loggedIn = ref(false) const busy = ref(false) const current = ref('tokens') +const openTabs = ref(['tokens']) const session = reactive({ name: '', csrfToken: '' }) const loginForm = reactive({ account: '', password: '' }) const users = ref([]) @@ -45,6 +46,9 @@ const scopeToolsKeyword = ref('') const scopeToolsOnlySelected = ref(false) const title = computed(() => menus.find(item => item.id === current.value)?.label || '') +const openedTabItems = computed(() => openTabs.value + .map(id => menus.find(item => item.id === id)) + .filter(Boolean)) const categories = computed(() => [...new Set(allTools.value.map(tool => tool.category))]) const groupedTools = computed(() => allTools.value.reduce((groups, tool) => { const category = tool.category || '其他' @@ -109,6 +113,7 @@ async function login() { const data = await api('/auth/login', { method: 'POST', body: JSON.stringify(loginForm) }) Object.assign(session, data); setCsrf(data.csrfToken); loggedIn.value = true loginForm.password = '' + openTabs.value = ['tokens']; current.value = 'tokens' await loadUsers() }).catch(() => {}) } @@ -116,9 +121,11 @@ async function login() { async function logout() { await run(() => api('/auth/logout', { method: 'POST' })).catch(() => {}) loggedIn.value = false; setCsrf('') + openTabs.value = ['tokens']; current.value = 'tokens' } async function switchMenu(id) { + if (!openTabs.value.includes(id)) openTabs.value = [...openTabs.value, id] current.value = id if (id === 'tokens') await loadUsers() if (id === 'clients') await loadOpenClients() @@ -127,6 +134,16 @@ async function switchMenu(id) { if (id === 'audit') await Promise.all([loadAudit(), loadAllTools()]) } +async function closeTab(id) { + const index = openTabs.value.indexOf(id) + if (index === -1) return + openTabs.value = openTabs.value.filter(tab => tab !== id) + if (current.value !== id) return + const next = openTabs.value[Math.min(index, openTabs.value.length - 1)] + current.value = next || '' + if (next) await switchMenu(next) +} + async function loadUsers(resetPage = false) { if (resetPage) userPage.page = 1 const data = await api(`/users${qs({ keyword: userKeyword.value, page: userPage.page, pageSize: userPage.pageSize })}`) @@ -376,8 +393,20 @@ onMounted(async () => { 退出 +
-