feat(ASA): 添加导航菜单入口,将系统配置整合为下拉菜单
- 将知识库导航指向新的多知识库管理页面 - 将嵌入模型、LLM 配置、Prompt 模板、意图规则、话术流程、输出护栏整合到「系统配置」下拉菜单 - 添加下拉菜单样式和交互效果
This commit is contained in:
parent
932d4d15ab
commit
c1f5d3229f
|
|
@ -17,7 +17,7 @@
|
||||||
<el-icon><Odometer /></el-icon>
|
<el-icon><Odometer /></el-icon>
|
||||||
<span>控制台</span>
|
<span>控制台</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
<router-link to="/kb" class="nav-item" :class="{ active: isActive('/kb') }">
|
<router-link to="/admin/knowledge-bases" class="nav-item" :class="{ active: isActive('/admin/knowledge-bases') }">
|
||||||
<el-icon><FolderOpened /></el-icon>
|
<el-icon><FolderOpened /></el-icon>
|
||||||
<span>知识库</span>
|
<span>知识库</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
@ -30,14 +30,53 @@
|
||||||
<span>会话监控</span>
|
<span>会话监控</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
<div class="nav-divider"></div>
|
<div class="nav-divider"></div>
|
||||||
<router-link to="/admin/embedding" class="nav-item" :class="{ active: isActive('/admin/embedding') }">
|
<el-dropdown trigger="hover" placement="bottom-start">
|
||||||
<el-icon><Connection /></el-icon>
|
<div class="nav-item dropdown-trigger" :class="{ active: isAdminActive }">
|
||||||
<span>嵌入模型</span>
|
<el-icon><Setting /></el-icon>
|
||||||
</router-link>
|
<span>系统配置</span>
|
||||||
<router-link to="/admin/llm" class="nav-item" :class="{ active: isActive('/admin/llm') }">
|
<el-icon class="dropdown-arrow"><ArrowDown /></el-icon>
|
||||||
<el-icon><ChatDotSquare /></el-icon>
|
</div>
|
||||||
<span>LLM 配置</span>
|
<template #dropdown>
|
||||||
</router-link>
|
<el-dropdown-menu class="admin-dropdown-menu">
|
||||||
|
<el-dropdown-item>
|
||||||
|
<router-link to="/admin/embedding" class="dropdown-link">
|
||||||
|
<el-icon><Connection /></el-icon>
|
||||||
|
嵌入模型
|
||||||
|
</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item>
|
||||||
|
<router-link to="/admin/llm" class="dropdown-link">
|
||||||
|
<el-icon><ChatDotSquare /></el-icon>
|
||||||
|
LLM 配置
|
||||||
|
</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item divided>
|
||||||
|
<router-link to="/admin/prompt-templates" class="dropdown-link">
|
||||||
|
<el-icon><Document /></el-icon>
|
||||||
|
Prompt 模板
|
||||||
|
</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item>
|
||||||
|
<router-link to="/admin/intent-rules" class="dropdown-link">
|
||||||
|
<el-icon><Aim /></el-icon>
|
||||||
|
意图规则
|
||||||
|
</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item>
|
||||||
|
<router-link to="/admin/script-flows" class="dropdown-link">
|
||||||
|
<el-icon><Share /></el-icon>
|
||||||
|
话术流程
|
||||||
|
</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item>
|
||||||
|
<router-link to="/admin/guardrails" class="dropdown-link">
|
||||||
|
<el-icon><Shield /></el-icon>
|
||||||
|
输出护栏
|
||||||
|
</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
|
|
@ -70,7 +109,7 @@ import { ref, computed, onMounted } from 'vue'
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import { useTenantStore } from '@/stores/tenant'
|
import { useTenantStore } from '@/stores/tenant'
|
||||||
import { getTenantList, type Tenant } from '@/api/tenant'
|
import { getTenantList, type Tenant } from '@/api/tenant'
|
||||||
import { Odometer, FolderOpened, Cpu, Monitor, Connection, ChatDotSquare } from '@element-plus/icons-vue'
|
import { Odometer, FolderOpened, Cpu, Monitor, Connection, ChatDotSquare, Setting, ArrowDown, Document, Aim, Share, Shield } from '@element-plus/icons-vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
@ -84,6 +123,10 @@ const isActive = (path: string) => {
|
||||||
return route.path === path || route.path.startsWith(path + '/')
|
return route.path === path || route.path.startsWith(path + '/')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isAdminActive = computed(() => {
|
||||||
|
return route.path.startsWith('/admin')
|
||||||
|
})
|
||||||
|
|
||||||
const handleTenantChange = (val: string) => {
|
const handleTenantChange = (val: string) => {
|
||||||
tenantStore.setTenant(val)
|
tenantStore.setTenant(val)
|
||||||
// 刷新页面以加载新租户的数据
|
// 刷新页面以加载新租户的数据
|
||||||
|
|
@ -212,6 +255,21 @@ onMounted(() => {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-trigger {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-arrow {
|
||||||
|
font-size: 12px;
|
||||||
|
margin-left: 4px;
|
||||||
|
transition: transform 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-trigger:hover .dropdown-arrow,
|
||||||
|
.dropdown-trigger.active .dropdown-arrow {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
.nav-divider {
|
.nav-divider {
|
||||||
width: 1px;
|
width: 1px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
|
@ -274,3 +332,32 @@ onMounted(() => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.admin-dropdown-menu {
|
||||||
|
min-width: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-dropdown-menu .el-dropdown-menu__item {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-link {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
width: 100%;
|
||||||
|
color: var(--text-primary, #1E293B);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-link:hover {
|
||||||
|
color: var(--primary-color, #4F7CFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-link .el-icon {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue