From 97f9befc6dc4b4aebee4c4f75140a1192f508c21 Mon Sep 17 00:00:00 2001 From: wanghanlin <1533525126@qq.com> Date: Thu, 3 Sep 2026 11:02:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor(frontend):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=A1=A8=E6=A0=BC=E4=B8=BA=20BaseTable=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 BaseTable 封装 t-table,统一下发小尺寸/悬浮/占满宽度/固定表头,操作列自动右固定,替换 13 个列表页 t-table,补齐缺失 loading;同步 UI 开发准则与组件声明 --- frontend/UI-DEV-GUIDE.md | 9 ++--- frontend/components.d.ts | 2 ++ frontend/src/components/BaseTable.vue | 40 +++++++++++++++++++++ frontend/src/views/AccountManager.vue | 9 ++--- frontend/src/views/ApiKeyManager.vue | 4 +-- frontend/src/views/AuditLogManager.vue | 4 +-- frontend/src/views/ConversationManager.vue | 10 +++--- frontend/src/views/DashboardPanel.vue | 2 +- frontend/src/views/FaqManager.vue | 4 +-- frontend/src/views/FeedbackOps.vue | 4 +-- frontend/src/views/McpServerManager.vue | 10 +++--- frontend/src/views/ModelConfigManager.vue | 6 ++-- frontend/src/views/PromptTracePanel.vue | 14 ++++---- frontend/src/views/SensitiveWordManager.vue | 4 +-- frontend/src/views/UserManager.vue | 9 ++--- frontend/src/views/WebhookManager.vue | 4 +-- 16 files changed, 89 insertions(+), 46 deletions(-) create mode 100644 frontend/src/components/BaseTable.vue diff --git a/frontend/UI-DEV-GUIDE.md b/frontend/UI-DEV-GUIDE.md index ac4cdab..2d468a7 100644 --- a/frontend/UI-DEV-GUIDE.md +++ b/frontend/UI-DEV-GUIDE.md @@ -133,7 +133,7 @@ import { palette, paletteBg, paletteBorder } from '@/utils/palette' - 删除 - + @@ -229,8 +229,9 @@ const columns = [ | 点 | 规范 | | --- | --- | +| 列表表格组件 | 统一用 `BaseTable` 组件(自动 `size="small"` + 悬浮 `hover` + 占满容器宽度 `table-layout="fixed"` + 固定表头 `max-height`);操作列 `colKey:'op'` 自动右固定 `fixed:'right'`,无需手动设置 | | 表格列定义 | 统一写在 ` + + diff --git a/frontend/src/views/AccountManager.vue b/frontend/src/views/AccountManager.vue index 9146807..45601c3 100644 --- a/frontend/src/views/AccountManager.vue +++ b/frontend/src/views/AccountManager.vue @@ -5,7 +5,7 @@ + 新建账号 🔄 刷新 - + - + @@ -35,7 +35,7 @@ import { useConfirm } from '@/composables/useConfirm' const { confirm } = useConfirm() -const accounts=ref([]) +const accounts=ref([]); const loading=ref(false) const columns=[{colKey:'name',title:'账号名称',width:160,sorter:true},{colKey:'roles',title:'绑定角色',width:240,sorter:true},{colKey:'op',title:'操作',width:120}] @@ -43,7 +43,8 @@ const modal=reactive({visible:false,isEdit:false,id:null as any,name:''}) onMounted(()=>loadList()) -async function loadList(){try{const r=await getAccountList();if(r.success)accounts.value=r.data||[]}catch(e:any){toast('加载失败:'+e.message,'error')}} +async function loadList(){loading.value=true + try{const r=await getAccountList();if(r.success)accounts.value=r.data||[]}catch(e:any){toast('加载失败:'+e.message,'error')}finally{loading.value=false}} function openCreate(){Object.assign(modal,{visible:true,isEdit:false,id:null,name:''})} function openEdit(a:any){Object.assign(modal,{visible:true,isEdit:true,id:a.id,name:a.name||''})} diff --git a/frontend/src/views/ApiKeyManager.vue b/frontend/src/views/ApiKeyManager.vue index bc464d4..dcc1c1e 100644 --- a/frontend/src/views/ApiKeyManager.vue +++ b/frontend/src/views/ApiKeyManager.vue @@ -5,7 +5,7 @@
共 {{ total }} 个 Key
- - + diff --git a/frontend/src/views/AuditLogManager.vue b/frontend/src/views/AuditLogManager.vue index 75bd839..8bb2087 100644 --- a/frontend/src/views/AuditLogManager.vue +++ b/frontend/src/views/AuditLogManager.vue @@ -1,13 +1,13 @@ diff --git a/frontend/src/views/ConversationManager.vue b/frontend/src/views/ConversationManager.vue index 66a48f1..5d48579 100644 --- a/frontend/src/views/ConversationManager.vue +++ b/frontend/src/views/ConversationManager.vue @@ -17,7 +17,7 @@ 刷新 - - + @@ -87,7 +87,7 @@ import { useConfirm } from '@/composables/useConfirm' const { confirm } = useConfirm() -const conversations=ref([]);const page=ref(1);const pageSize=ref(10);const total=ref(0) +const conversations=ref([]);const page=ref(1);const pageSize=ref(10);const total=ref(0);const loading=ref(false) const keyword=ref('');const accountFilter=ref('');const roleFilter=ref('') const roles=ref([]);const stats=ref(null) const msgModal=ref({visible:false,conversationId:'',roleName:'',messages:[] as any[]}) @@ -131,8 +131,8 @@ function reasonLabel(c: string): string { return map[c] || c } -async function load(p=1){page.value=p - try{const r=await listConversations(p,pageSize.value,keyword.value||undefined,accountFilter.value||undefined,roleFilter.value||undefined,sortInfo.value?.sortBy||undefined,sortInfo.value?(sortInfo.value.descending?'desc':'asc'):undefined);if(r.success){conversations.value=r.data||[];total.value=r.total||0}else toast(r.message||'查询失败','error')}catch(e:any){toast('加载失败:'+e.message,'error')}} +async function load(p=1){page.value=p;loading.value=true + try{const r=await listConversations(p,pageSize.value,keyword.value||undefined,accountFilter.value||undefined,roleFilter.value||undefined,sortInfo.value?.sortBy||undefined,sortInfo.value?(sortInfo.value.descending?'desc':'asc'):undefined);if(r.success){conversations.value=r.data||[];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/DashboardPanel.vue b/frontend/src/views/DashboardPanel.vue index 5f6eb31..a9ecde0 100644 --- a/frontend/src/views/DashboardPanel.vue +++ b/frontend/src/views/DashboardPanel.vue @@ -34,7 +34,7 @@ - + diff --git a/frontend/src/views/FaqManager.vue b/frontend/src/views/FaqManager.vue index 4b78a6e..fff1d41 100644 --- a/frontend/src/views/FaqManager.vue +++ b/frontend/src/views/FaqManager.vue @@ -19,7 +19,7 @@ - - + - - + 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 }} 条配置 - @@ -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 @@
-
- - -
+
{{ 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 @@ - + - +
历史轮数:{{ 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 }} 个 - - + 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 @@ + 新建用户 - - + @@ -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 }} 个
- - +