diff --git a/frontend/src/views/McpServerManager.vue b/frontend/src/views/McpServerManager.vue
index 28008fd..06f63e2 100644
--- a/frontend/src/views/McpServerManager.vue
+++ b/frontend/src/views/McpServerManager.vue
@@ -9,7 +9,7 @@
共 {{ total }} 条配置
-
{{ row.transport_type==='sse'?'SSE':'Stdio' }}
{{ getDisplayUrl(row)||'-' }}
@@ -21,7 +21,7 @@
删除
-
+
@@ -68,7 +68,7 @@ import { useConfirm } from '@/composables/useConfirm'
const { confirm } = useConfirm()
-const servers = ref
([]); const currentPage=ref(1); const pageSize=ref(10); const total=ref(0)
+const servers = ref([]); const currentPage=ref(1); const pageSize=ref(10); const total=ref(0); const loading=ref(false)
const showModal=ref(false); const modalMode=ref('add'); const editId=ref(null); const saving=ref(false)
const form=ref({name:'',transportType:'sse',url:'',command:'',argsText:'',envText:'',headersText:'',description:''})
const testLoading=ref>({}); const testResult=ref({visible:false,success:false,message:'' as any}); let testTimer:any=null
@@ -80,8 +80,8 @@ const sortInfo = ref<{ sortBy: string; descending: boolean } | null>(null)
onMounted(()=>load())
onUnmounted(()=>{if(testTimer)clearTimeout(testTimer)})
-async function load(p=1){currentPage.value=p
- try{const r=await api.listMcpServers(p,pageSize.value,sortInfo.value?.sortBy||undefined,sortInfo.value?(sortInfo.value.descending?'desc':'asc'):undefined);if(r.success){servers.value=(r.data||[]).map((s:any)=>({...s,_active:s.is_active}));total.value=r.total||0}else toast(r.message||'查询失败','error')}catch(e:any){toast('加载失败:'+e.message,'error')}}
+async function load(p=1){currentPage.value=p;loading.value=true
+ try{const r=await api.listMcpServers(p,pageSize.value,sortInfo.value?.sortBy||undefined,sortInfo.value?(sortInfo.value.descending?'desc':'asc'):undefined);if(r.success){servers.value=(r.data||[]).map((s:any)=>({...s,_active:s.is_active}));total.value=r.total||0}else toast(r.message||'查询失败','error')}catch(e:any){toast('加载失败:'+e.message,'error')}finally{loading.value=false}}
function onPageChange(i:{current:number;pageSize:number}){pageSize.value=i.pageSize;load(i.current)}
function onSortChange(s:any){sortInfo.value=s&&s.sortBy?{sortBy:s.sortBy,descending:!!s.descending}:null;load(1)}
diff --git a/frontend/src/views/ModelConfigManager.vue b/frontend/src/views/ModelConfigManager.vue
index d001af9..c744835 100644
--- a/frontend/src/views/ModelConfigManager.vue
+++ b/frontend/src/views/ModelConfigManager.vue
@@ -67,8 +67,7 @@
-
-
@@ -104,8 +103,7 @@
🗑️
-
-
+
{{ statSummary.avgLatency }}平均耗时(ms)
{{ statSummary.faqRate }}FAQ 命中率
-
+
@@ -32,7 +32,7 @@
-
@@ -59,7 +59,7 @@
详情
时间线
-
+
@@ -97,7 +97,7 @@
检索模式:{{ detail.searchMode || '-' }} · 命中:{{ detail.hitCount ?? '-' }} 条
-
+
注入的 RAG 上下文
{{ detail.ragContext || '(无 RAG 资料)' }}
@@ -111,18 +111,18 @@
-
+
{{ row.latencyMs ?? '-' }}ms
失败
-
-
+
历史轮数:{{ detail.historyTurns }}
-
+
diff --git a/frontend/src/views/SensitiveWordManager.vue b/frontend/src/views/SensitiveWordManager.vue
index 14d665a..15e9f2a 100644
--- a/frontend/src/views/SensitiveWordManager.vue
+++ b/frontend/src/views/SensitiveWordManager.vue
@@ -12,7 +12,7 @@
共 {{ total }} 个
-
{{ catLabel(row.category) }}
@@ -29,7 +29,7 @@
删除
-
+
diff --git a/frontend/src/views/UserManager.vue b/frontend/src/views/UserManager.vue
index efb92d6..bd6f907 100644
--- a/frontend/src/views/UserManager.vue
+++ b/frontend/src/views/UserManager.vue
@@ -9,7 +9,7 @@
+ 新建用户
-
{{ r }}
@@ -26,7 +26,7 @@
{{ row.enabled?'禁用':'启用' }}
-
+
@@ -75,7 +75,7 @@ import { useConfirm } from '@/composables/useConfirm'
const { confirm } = useConfirm()
const users = ref([]); const total=ref(0); const page=ref(1); const pageSize=ref(20)
-const keyword=ref(''); const filterEnabled=ref(null); const allRoles=ref([]); const saving=ref(false)
+const keyword=ref(''); const filterEnabled=ref(null); const allRoles=ref([]); const saving=ref(false); const loading=ref(false)
const statusOpts=[{label:'全部状态',value:null},{label:'已启用',value:true},{label:'已禁用',value:false}]
const columns = [
@@ -91,7 +91,8 @@ const pwdModal = reactive({visible:false,userId:null as any,username:'',newPassw
onMounted(()=>{loadData();loadRoles()})
-async function loadData(){try{const r=await listSysUsers(page.value,pageSize.value,keyword.value,filterEnabled.value as any,sortInfo.value?.sortBy||undefined,sortInfo.value?(sortInfo.value.descending?'desc':'asc'):undefined);if(r.success){users.value=r.data.records||[];total.value=r.data.total||0}}catch(e){console.error(e)}}
+async function loadData(){loading.value=true
+ try{const r=await listSysUsers(page.value,pageSize.value,keyword.value,filterEnabled.value as any,sortInfo.value?.sortBy||undefined,sortInfo.value?(sortInfo.value.descending?'desc':'asc'):undefined);if(r.success){users.value=r.data.records||[];total.value=r.data.total||0}}catch(e){console.error(e)}finally{loading.value=false}}
async function loadRoles(){try{const r=await getAllSysRoles();if(r.success)allRoles.value=r.data||[]}catch(e){console.error(e)}}
function onPageChange(i:{current:number;pageSize:number}){page.value=i.current;pageSize.value=i.pageSize;loadData()}
function onSortChange(s:any){sortInfo.value=s&&s.sortBy?{sortBy:s.sortBy,descending:!!s.descending}:null;loadData()}
diff --git a/frontend/src/views/WebhookManager.vue b/frontend/src/views/WebhookManager.vue
index 7c90295..a4b45a1 100644
--- a/frontend/src/views/WebhookManager.vue
+++ b/frontend/src/views/WebhookManager.vue
@@ -5,7 +5,7 @@
共 {{ total }} 个
-
{{ ev }}
@@ -18,7 +18,7 @@
删除
-
+