NewLife/cube-front

请求拦截Code
Yann authored at 2025-07-01 14:00:58 Yann committed at 2025-07-01 15:20:51
dce83fd
Tree
1 Parent(s) bee7984
Summary: 23 changed files with 640 additions and 756 deletions.
Modified +18 -32
Modified +23 -33
Modified +29 -57
Modified +45 -114
Modified +86 -83
Modified +18 -32
Modified +19 -14
Modified +18 -32
Modified +18 -33
Modified +6 -12
Modified +26 -27
Modified +18 -32
Modified +16 -27
Modified +14 -30
Modified +5 -7
Modified +34 -84
Modified +36 -85
Modified +4 -14
Modified +67 -1
Modified +1 -0
Added +117 -0
Modified +15 -7
Modified +7 -0
Modified +18 -32
diff --git a/apps/cube-admin/src/pages/admin/access-rule/index.vue b/apps/cube-admin/src/pages/admin/access-rule/index.vue
index d35de90..83d83f0 100644
--- a/apps/cube-admin/src/pages/admin/access-rule/index.vue
+++ b/apps/cube-admin/src/pages/admin/access-rule/index.vue
@@ -118,7 +118,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -224,7 +224,7 @@ const getActionKindType = (actionKind: number) => {
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/AccessRule', {
+    const data = await request.get('/Admin/AccessRule', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -232,31 +232,22 @@ const loadData = async () => {
       }
     });
 
-    if (response && response.data && Array.isArray(response.data.data)) {
-      tableData.value = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      tableData.value = response.data;
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      tableData.value = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || tableData.value.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      tableData.value = data;
+      total.value = data.length;
     } else {
       tableData.value = [];
-    }
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
       total.value = 0;
     }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -336,11 +327,9 @@ const handleDelete = (row: AccessRule) => {
         await request.delete('/Admin/AccessRule', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -355,16 +344,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/AccessRule', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/AccessRule', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
Modified +23 -33
diff --git a/apps/cube-admin/src/pages/admin/department/index.vue b/apps/cube-admin/src/pages/admin/department/index.vue
index 74edaeb..707b699 100644
--- a/apps/cube-admin/src/pages/admin/department/index.vue
+++ b/apps/cube-admin/src/pages/admin/department/index.vue
@@ -104,7 +104,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -238,7 +238,7 @@ const buildTreeData = (data: Department[]): Department[] => {
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/Department', {
+    const data = await request.get('/Admin/Department', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -247,10 +247,19 @@ const loadData = async () => {
     });
 
     let dataList: Department[] = [];
-    if (response && response.data && Array.isArray(response.data.data)) {
-      dataList = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      dataList = response.data;
+
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      dataList = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || dataList.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      dataList = data;
+      total.value = data.length;
+    } else {
+      dataList = [];
+      total.value = 0;
     }
 
     // 构建树结构
@@ -258,24 +267,10 @@ const loadData = async () => {
 
     // 同时保存平铺的数据用于部门选项
     departmentOptions.value = dataList.filter(item => item.id !== form.id);
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
-      total.value = 0;
-    }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    departmentOptions.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -367,11 +362,9 @@ const handleDelete = (row: Department) => {
         await request.delete('/Admin/Department', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -386,16 +379,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/Department', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/Department', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
Modified +29 -57
diff --git a/apps/cube-admin/src/pages/admin/file/index.vue b/apps/cube-admin/src/pages/admin/file/index.vue
index a8b027c..2495cbf 100644
--- a/apps/cube-admin/src/pages/admin/file/index.vue
+++ b/apps/cube-admin/src/pages/admin/file/index.vue
@@ -131,7 +131,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
+import { ElMessageBox } from 'element-plus'
 import { Plus, Refresh } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
 
@@ -181,7 +181,7 @@ const getFileList = async () => {
   try {
     loading.list = true
 
-    const response = await request.get('/Admin/File', {
+    const data = await request.get('/Admin/File', {
       params: {
         r: queryForm.r || undefined,
         sort: queryForm.sort || undefined,
@@ -189,12 +189,16 @@ const getFileList = async () => {
       }
     })
 
-    if (response && response.data) {
-      fileList.value = response.data.data || []
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data) {
+      fileList.value = Array.isArray(data.data) ? data.data : []
+    } else if (Array.isArray(data)) {
+      fileList.value = data
+    } else {
+      fileList.value = []
     }
-  } catch (error) {
-    console.error('获取文件列表错误:', error)
-    ElMessage.error('获取文件列表失败')
+  } catch {
+    fileList.value = []
   } finally {
     loading.list = false
   }
@@ -213,13 +217,11 @@ const handleUpload = async () => {
     // 触发上传
     await uploadRef.value.submit()
 
-    ElMessage.success('文件上传成功')
     showUploadDialog.value = false
     uploadForm.r = ''
     refreshFileList()
-  } catch (error) {
-    console.error('文件上传错误:', error)
-    ElMessage.error('文件上传失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.upload = false
   }
@@ -233,11 +235,9 @@ const handleAvatarUpload = async () => {
     // 触发上传
     await avatarUploadRef.value.submit()
 
-    ElMessage.success('头像上传成功')
     showAvatarDialog.value = false
-  } catch (error) {
-    console.error('头像上传错误:', error)
-    ElMessage.error('头像上传失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.avatar = false
   }
@@ -246,8 +246,6 @@ const handleAvatarUpload = async () => {
 // 下载文件
 const handleDownload = async (row: FileInfo) => {
   try {
-    console.log('开始下载文件:', row.path)
-
     // 使用 request 发送下载请求,获取二进制数据
     const blob = await request.post('/Admin/File/Download',
       { r: row.path },
@@ -265,58 +263,38 @@ const handleDownload = async (row: FileInfo) => {
     link.click()
     document.body.removeChild(link)
     window.URL.revokeObjectURL(url)
-
-    ElMessage.success('文件下载成功')
-  } catch (error) {
-    console.error('文件下载错误:', error)
-    ElMessage.error('文件下载失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
 // 压缩文件
 const handleCompress = async (row: FileInfo) => {
   try {
-    console.log('开始压缩文件:', row.path)
-
-    const data = await request.post('/Admin/File/Compress', { r: row.path })
-    console.log('文件压缩响应:', data)
-
-    ElMessage.success('文件压缩成功')
+    await request.post('/Admin/File/Compress', { r: row.path })
     refreshFileList()
-  } catch (error) {
-    console.error('文件压缩错误:', error)
-    ElMessage.error('文件压缩失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
 // 解压文件
 const handleDecompress = async (row: FileInfo) => {
   try {
-    console.log('开始解压文件:', row.path)
-
-    const data = await request.post('/Admin/File/Decompress', { r: row.path })
-    console.log('文件解压响应:', data)
-
-    ElMessage.success('文件解压成功')
+    await request.post('/Admin/File/Decompress', { r: row.path })
     refreshFileList()
-  } catch (error) {
-    console.error('文件解压错误:', error)
-    ElMessage.error('文件解压失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
 // 复制文件
 const handleCopy = async (row: FileInfo) => {
   try {
-    console.log('开始复制文件:', row.path)
-
-    const data = await request.post('/Admin/File/Copy', { r: row.path, f: row.name })
-    console.log('文件复制响应:', data)
-
-    ElMessage.success('文件已复制到剪贴板')
-  } catch (error) {
-    console.error('文件复制错误:', error)
-    ElMessage.error('文件复制失败')
+    await request.post('/Admin/File/Copy', { r: row.path, f: row.name })
+    // 复制操作成功会通过request拦截器自动提示
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
@@ -333,17 +311,11 @@ const handleDelete = async (row: FileInfo) => {
       }
     )
 
-    console.log('开始删除文件:', row.path)
-
-    const data = await request.post('/Admin/File/Delete', { r: row.path })
-    console.log('文件删除响应:', data)
-
-    ElMessage.success('文件删除成功')
+    await request.post('/Admin/File/Delete', { r: row.path })
     refreshFileList()
   } catch (error) {
     if (error !== 'cancel') {
-      console.error('文件删除错误:', error)
-      ElMessage.error('文件删除失败')
+      // 错误提示已经在 request 拦截器中自动处理
     }
   }
 }
Modified +45 -114
diff --git a/apps/cube-admin/src/pages/admin/index/index.vue b/apps/cube-admin/src/pages/admin/index/index.vue
index 97a643c..58c3673 100644
--- a/apps/cube-admin/src/pages/admin/index/index.vue
+++ b/apps/cube-admin/src/pages/admin/index/index.vue
@@ -227,7 +227,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
+import { ElMessageBox } from 'element-plus'
 import { Refresh, Delete, Switch } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
 
@@ -424,62 +424,28 @@ const refreshSystemInfo = async () => {
   loading.system = false
 }
 
-// 获取系统信息(备用接口)
-const getSystemInfo = async () => {
-  try {
-    loading.system = true
-
-    const data = await request.get('/Admin/Index')
-    console.log('系统信息响应(备用接口):', data) // 调试日志
-    console.log('系统信息响应类型(备用接口):', typeof data) // 调试响应类型
-
-    if (data) {
-      // 如果Main接口没有提供完整信息,使用这个接口补充
-      console.log('准备更新系统信息(备用):', data)
-      Object.assign(systemInfo, data || {})
-      console.log('更新后的系统信息(备用接口):', systemInfo)
-    } else {
-      console.log('系统信息响应为空(备用接口)')
-    }
-  } catch (error) {
-    console.error('获取系统信息错误(备用接口):', error)
-    ElMessage.error('获取系统信息失败')
-  } finally {
-    loading.system = false
-  }
-}
-
 // 获取主要信息(系统信息)
 const getMainInfo = async () => {
   try {
-    const response = await request.get('/Admin/Index/Main')
-    console.log('主要信息(系统信息)响应:', response) // 调试日志
-    console.log('主要信息响应类型:', typeof response) // 调试响应类型
-
-    if (response && response.data) {
-      const data = response.data
-      console.log('解析到的系统数据:', data)
-
-      // 直接使用 API 返回的所有字段,不进行固定字段映射
-      // 清空之前的数据
-      Object.keys(systemInfo).forEach(key => {
-        delete systemInfo[key]
-      })
+    const data = await request.get('/Admin/Index/Main')
 
-      // 将所有返回的字段添加到 systemInfo 中
+    // 直接使用 API 返回的所有字段,不进行固定字段映射
+    // 清空之前的数据
+    Object.keys(systemInfo).forEach(key => {
+      delete systemInfo[key]
+    })
+
+    // 将所有返回的字段添加到 systemInfo 中
+    if (data && typeof data === 'object') {
       Object.keys(data).forEach(key => {
         if (data[key] !== null && data[key] !== undefined) {
           systemInfo[key] = data[key]
         }
       })
-
-      console.log('动态设置后的系统信息:', systemInfo)
-    } else {
-      console.log('主要信息响应为空或无data字段')
     }
   } catch (error) {
     console.error('获取主要信息错误:', error)
-    ElMessage.error('获取主要信息失败')
+    // 错误提示已在 request 拦截器中处理
   }
 }
 
@@ -488,21 +454,15 @@ const getServerVarList = async () => {
   try {
     loading.serverVars = true
 
-    const response = await request.get('/Admin/Index/ServerVarList')
-    console.log('服务器变量响应:', response) // 调试日志
-    console.log('服务器变量响应类型:', typeof response) // 调试响应类型
-
-    if (response && response.data) {
-      const data = response.data
-      console.log('解析到的服务器变量数据:', data)
+    const data = await request.get('/Admin/Index/ServerVarList')
 
+    if (data && typeof data === 'object') {
       // 处理服务器Headers数据
       if (data.server && Array.isArray(data.server)) {
         serverHeaders.value = data.server.map((item: { name?: string; value?: string }) => ({
           name: item.name || '',
           value: item.value || ''
         }))
-        console.log('设置服务器Headers:', serverHeaders.value)
       } else {
         serverHeaders.value = []
       }
@@ -513,7 +473,6 @@ const getServerVarList = async () => {
           name: item.name || '',
           value: item.value
         }))
-        console.log('设置请求信息:', requestInfo.value)
       } else {
         requestInfo.value = []
       }
@@ -527,16 +486,15 @@ const getServerVarList = async () => {
         }))
       ]
       serverVars.value = allVars
-      console.log('设置合并后的服务器变量:', serverVars.value)
     } else {
-      console.log('服务器变量响应为空或无data字段')
       serverHeaders.value = []
       requestInfo.value = []
       serverVars.value = []
     }
-  } catch (error) {
-    console.error('获取服务器变量错误:', error)
-    ElMessage.error('获取服务器变量失败')
+  } catch {
+    serverHeaders.value = []
+    requestInfo.value = []
+    serverVars.value = []
   } finally {
     loading.serverVars = false
   }
@@ -547,26 +505,19 @@ const getProcessList = async () => {
   try {
     loading.processes = true
 
-    const response = await request.get('/Admin/Index/ProcessList', {
+    const data = await request.get('/Admin/Index/ProcessList', {
       params: processModel.value ? { model: processModel.value } : {}
     })
-    console.log('进程列表响应:', response) // 调试日志
-    console.log('进程列表响应类型:', typeof response) // 调试响应类型
-
-    if (response && response.data && Array.isArray(response.data)) {
-      processes.value = response.data
-      console.log('设置进程列表数据:', processes.value)
-    } else if (Array.isArray(response)) {
-      // 如果直接返回数组
-      processes.value = response
-      console.log('直接使用数组数据:', processes.value)
+
+    if (Array.isArray(data)) {
+      processes.value = data
+    } else if (data && typeof data === 'object' && Array.isArray(data.data)) {
+      processes.value = data.data
     } else {
-      console.log('进程列表数据格式不正确:', response)
       processes.value = []
     }
-  } catch (error) {
-    console.error('获取加载模块错误:', error)
-    ElMessage.error('获取加载模块列表失败')
+  } catch {
+    processes.value = []
   } finally {
     loading.processes = false
   }
@@ -577,26 +528,19 @@ const getAssemblyList = async () => {
   try {
     loading.assemblies = true
 
-    const response = await request.get('/Admin/Index/AssemblyList', {
+    const data = await request.get('/Admin/Index/AssemblyList', {
       params: assemblyModel.value ? { model: assemblyModel.value } : {}
     })
-    console.log('程序集列表响应:', response) // 调试日志
-    console.log('程序集列表响应类型:', typeof response) // 调试响应类型
-
-    if (response && response.data && Array.isArray(response.data)) {
-      assemblies.value = response.data
-      console.log('设置程序集列表数据:', assemblies.value)
-    } else if (Array.isArray(response)) {
-      // 如果直接返回数组
-      assemblies.value = response
-      console.log('直接使用数组数据:', assemblies.value)
+
+    if (Array.isArray(data)) {
+      assemblies.value = data
+    } else if (data && typeof data === 'object' && Array.isArray(data.data)) {
+      assemblies.value = data.data
     } else {
-      console.log('程序集列表数据格式不正确:', response)
       assemblies.value = []
     }
-  } catch (error) {
-    console.error('获取程序集列表错误:', error)
-    ElMessage.error('获取程序集列表失败')
+  } catch {
+    assemblies.value = []
   } finally {
     loading.assemblies = false
   }
@@ -607,26 +551,19 @@ const getMenuTree = async () => {
   try {
     loading.menu = true
 
-    const response = await request.get('/Admin/Index/GetMenuTree', {
+    const data = await request.get('/Admin/Index/GetMenuTree', {
       params: menuModule.value ? { module: menuModule.value } : {}
     })
-    console.log('菜单树响应:', response) // 调试日志
-    console.log('菜单树响应类型:', typeof response) // 调试响应类型
-
-    if (response && response.data && Array.isArray(response.data)) {
-      menuTree.value = response.data
-      console.log('设置菜单树数据:', menuTree.value)
-    } else if (Array.isArray(response)) {
-      // 如果直接返回数组
-      menuTree.value = response
-      console.log('直接使用数组数据:', menuTree.value)
+
+    if (Array.isArray(data)) {
+      menuTree.value = data
+    } else if (data && typeof data === 'object' && Array.isArray(data.data)) {
+      menuTree.value = data.data
     } else {
-      console.log('菜单树数据格式不正确:', response)
       menuTree.value = []
     }
-  } catch (error) {
-    console.error('获取菜单树错误:', error)
-    ElMessage.error('获取菜单树失败')
+  } catch {
+    menuTree.value = []
   } finally {
     loading.menu = false
   }
@@ -636,13 +573,10 @@ const getMenuTree = async () => {
 const handleMemoryFree = async () => {
   try {
     await request.get('/Admin/Index/MemoryFree')
-
-    ElMessage.success('内存回收成功')
     // 刷新系统信息
-    getSystemInfo()
-  } catch (error) {
-    console.error('内存回收错误:', error)
-    ElMessage.error('内存回收失败')
+    getMainInfo()
+  } catch {
+    // 错误提示已在 request 拦截器中处理
   }
 }
 
@@ -660,12 +594,9 @@ const handleRestart = async () => {
     )
 
     await request.post('/Admin/Index/Restart')
-
-    ElMessage.success('系统重启中...')
   } catch (error) {
     if (error !== 'cancel') {
-      console.error('系统重启错误:', error)
-      ElMessage.error('系统重启失败')
+      // 其他错误已在 request 拦截器中处理
     }
   }
 }
Modified +86 -83
diff --git a/apps/cube-admin/src/pages/admin/menu/index.vue b/apps/cube-admin/src/pages/admin/menu/index.vue
index b090169..8e32358 100644
--- a/apps/cube-admin/src/pages/admin/menu/index.vue
+++ b/apps/cube-admin/src/pages/admin/menu/index.vue
@@ -5,8 +5,12 @@
         <div class="card-header">
           <h3>菜单管理</h3>
           <div>
-            <el-button type="success" @click="handleMoveUp" :disabled="selectedRows.length !== 1">上移</el-button>
-            <el-button type="warning" @click="handleMoveDown" :disabled="selectedRows.length !== 1">下移</el-button>
+            <el-button type="success" @click="handleMoveUp" :disabled="selectedRows.length !== 1">
+              上移 {{ selectedRows.length === 1 ? `(${selectedRows[0].displayName || selectedRows[0].name})` : '' }}
+            </el-button>
+            <el-button type="warning" @click="handleMoveDown" :disabled="selectedRows.length !== 1">
+              下移 {{ selectedRows.length === 1 ? `(${selectedRows[0].displayName || selectedRows[0].name})` : '' }}
+            </el-button>
             <el-button type="primary" @click="handleAdd">新增菜单</el-button>
           </div>
         </div>
@@ -22,6 +26,14 @@
         </el-form-item>
       </el-form>
 
+      <el-alert
+        :title="`共找到 ${total} 个菜单项,其中根菜单 ${tableData.length} 个。请选择一行进行上移/下移操作。`"
+        type="info"
+        :closable="false"
+        show-icon
+        style="margin-bottom: 16px;"
+      />
+
       <el-table :data="tableData" border style="width: 100%" v-loading="loading" row-key="id" default-expand-all
         :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
@@ -65,12 +77,6 @@
           </template>
         </el-table-column>
       </el-table>
-
-      <div class="pagination">
-        <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :page-sizes="[10, 20, 50, 100]"
-          :total="total" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange"
-          @current-change="handleCurrentChange" />
-      </div>
     </el-card>
 
     <!-- 菜单表单对话框 -->
@@ -127,7 +133,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -168,8 +174,6 @@ interface Menu {
 const tableData = ref<Menu[]>([]);
 const loading = ref(false);
 const total = ref(0);
-const currentPage = ref(1);
-const pageSize = ref(10);
 const menuOptions = ref<Menu[]>([]);
 const selectedRows = ref<Menu[]>([]);
 
@@ -222,18 +226,21 @@ const formRules = reactive<FormRules>({
   ]
 });
 
-// 构建树结构
+// 构建树结构并排序
 const buildTreeData = (data: Menu[]): Menu[] => {
   const map = new Map<number, Menu>();
   const roots: Menu[] = [];
 
-  // 先将所有节点加入map
-  data.forEach(item => {
+  // 先按sort字段排序
+  const sortedData = [...data].sort((a, b) => a.sort - b.sort);
+
+  // 将所有节点加入map
+  sortedData.forEach(item => {
     map.set(item.id, { ...item, children: [] });
   });
 
   // 构建树结构
-  data.forEach(item => {
+  sortedData.forEach(item => {
     const node = map.get(item.id)!;
     if (item.parentID === 0) {
       roots.push(node);
@@ -247,6 +254,17 @@ const buildTreeData = (data: Menu[]): Menu[] => {
     }
   });
 
+  // 对每个层级的children再次排序
+  const sortChildren = (nodes: Menu[]) => {
+    nodes.sort((a, b) => a.sort - b.sort);
+    nodes.forEach(node => {
+      if (node.children && node.children.length > 0) {
+        sortChildren(node.children);
+      }
+    });
+  };
+
+  sortChildren(roots);
   return roots;
 };
 
@@ -261,108 +279,82 @@ const loadData = async () => {
   try {
     const response = await request.get('/Admin/Menu', {
       params: {
-        pageIndex: currentPage.value,
-        pageSize: pageSize.value,
+        pageIndex: 1,
+        pageSize: 10000, // 获取全部数据用于构建树
         q: searchForm.q
       }
     });
 
     let dataList: Menu[] = [];
-    if (response && response.data && Array.isArray(response.data.data)) {
-      dataList = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      dataList = response.data;
+
+    // 处理不同的响应格式
+    if (Array.isArray(response)) {
+      // 直接返回数组的响应
+      dataList = response;
+    } else if (response && typeof response === 'object') {
+      // 包含分页信息的响应或标准API响应格式
+      if ('data' in response && Array.isArray(response.data)) {
+        dataList = response.data;
+      } else if (Array.isArray(response)) {
+        dataList = response;
+      }
     }
 
-    // 构建树结构
+    // 构建树结构并排序
     tableData.value = buildTreeData(dataList);
+    total.value = dataList.length;
 
-    // 同时保存平铺的数据用于菜单选项
+    // 同时保存平铺的数据用于菜单选项(排除当前编辑的菜单)
     menuOptions.value = dataList.filter(item => item.id !== form.id);
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
-      total.value = 0;
-    }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    menuOptions.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
 };
 
-// 页码变更处理
-const handleCurrentChange = (page: number) => {
-  currentPage.value = page;
-  loadData();
-};
-
-// 每页显示条数变更处理
-const handleSizeChange = (size: number) => {
-  pageSize.value = size;
-  currentPage.value = 1;
-  loadData();
-};
-
 // 搜索
 const handleSearch = () => {
-  currentPage.value = 1;
   loadData();
 };
 
 // 重置搜索
 const resetSearch = () => {
   searchForm.q = '';
-  currentPage.value = 1;
   loadData();
 };
 
 // 上移
 const handleMoveUp = async () => {
   if (selectedRows.value.length !== 1) {
-    ElMessage.warning('请选择一行数据');
     return;
   }
 
   try {
-    await request.patch('/Admin/Menu/Up', null, {
+    await request.post('/Admin/Menu/Up', null, {
       params: { id: selectedRows.value[0].id }
     });
-    ElMessage.success('上移成功');
     loadData();
-  } catch (error) {
-    ElMessage.error('上移失败');
-    console.error('上移失败:', error);
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 };
 
 // 下移
 const handleMoveDown = async () => {
   if (selectedRows.value.length !== 1) {
-    ElMessage.warning('请选择一行数据');
     return;
   }
 
   try {
-    await request.patch('/Admin/Menu/Down', null, {
+    await request.post('/Admin/Menu/Down', null, {
       params: { id: selectedRows.value[0].id }
     });
-    ElMessage.success('下移成功');
     loadData();
-  } catch (error) {
-    ElMessage.error('下移失败');
-    console.error('下移失败:', error);
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 };
 
@@ -422,11 +414,9 @@ const handleDelete = (row: Menu) => {
         await request.delete('/Admin/Menu', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -441,16 +431,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/Menu', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/Menu', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
@@ -477,15 +464,31 @@ onMounted(() => {
   margin-bottom: 20px;
 }
 
-.pagination {
-  margin-top: 20px;
-  display: flex;
-  justify-content: flex-end;
-}
-
 .form-tip {
   font-size: 12px;
   color: #999;
   margin-left: 10px;
 }
+
+/* 树状表格样式优化 */
+:deep(.el-table .el-table__row) {
+  cursor: pointer;
+}
+
+:deep(.el-table .el-table__row:hover) {
+  background-color: #f5f7fa;
+}
+
+:deep(.el-table__expand-icon) {
+  color: #409eff;
+}
+
+:deep(.el-table__indent) {
+  padding-left: 20px;
+}
+
+/* 选中行样式 */
+:deep(.el-table__row.is-selected) {
+  background-color: #ecf5ff;
+}
 </style>
Modified +18 -32
diff --git a/apps/cube-admin/src/pages/admin/oauth-config/index.vue b/apps/cube-admin/src/pages/admin/oauth-config/index.vue
index 226dc0c..05750f3 100644
--- a/apps/cube-admin/src/pages/admin/oauth-config/index.vue
+++ b/apps/cube-admin/src/pages/admin/oauth-config/index.vue
@@ -167,7 +167,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -274,7 +274,7 @@ const formRules = reactive<FormRules>({
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/OAuthConfig', {
+    const data = await request.get('/Admin/OAuthConfig', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -282,31 +282,22 @@ const loadData = async () => {
       }
     });
 
-    if (response && response.data && Array.isArray(response.data.data)) {
-      tableData.value = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      tableData.value = response.data;
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      tableData.value = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || tableData.value.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      tableData.value = data;
+      total.value = data.length;
     } else {
       tableData.value = [];
-    }
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
       total.value = 0;
     }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -398,11 +389,9 @@ const handleDelete = (row: OAuthConfig) => {
         await request.delete('/Admin/OAuthConfig', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -417,16 +406,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/OAuthConfig', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/OAuthConfig', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
Modified +19 -14
diff --git a/apps/cube-admin/src/pages/admin/oauth-log/index.vue b/apps/cube-admin/src/pages/admin/oauth-log/index.vue
index 7301199..8882e4c 100644
--- a/apps/cube-admin/src/pages/admin/oauth-log/index.vue
+++ b/apps/cube-admin/src/pages/admin/oauth-log/index.vue
@@ -140,7 +140,6 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
 import { Refresh } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
 
@@ -201,7 +200,7 @@ const getOAuthLogList = async () => {
   try {
     loading.list = true
 
-    const response = await request.get('/Admin/OAuthLog', {
+    const data = await request.get('/Admin/OAuthLog', {
       params: {
         page: pagination.page,
         size: pagination.size,
@@ -212,13 +211,20 @@ const getOAuthLogList = async () => {
       }
     })
 
-    if (response && response.data) {
-      tableData.value = response.data.list || []
-      pagination.total = response.data.total || 0
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'list' in data && 'total' in data) {
+      tableData.value = Array.isArray(data.list) ? data.list : [];
+      pagination.total = data.total || 0;
+    } else if (Array.isArray(data)) {
+      tableData.value = data;
+      pagination.total = data.length;
+    } else {
+      tableData.value = [];
+      pagination.total = 0;
     }
-  } catch (error) {
-    console.error('获取OAuth日志列表错误:', error)
-    ElMessage.error('获取OAuth日志列表失败')
+  } catch {
+    tableData.value = [];
+    pagination.total = 0;
   } finally {
     loading.list = false
   }
@@ -229,16 +235,15 @@ const getOAuthLogDetail = async (id: number) => {
   try {
     loading.detail = true
 
-    const response = await request.get('/Admin/OAuthLog/Detail', {
+    const data = await request.get('/Admin/OAuthLog/Detail', {
       params: { id }
     })
 
-    if (response && response.data) {
-      detailData.value = response.data || {}
+    if (data) {
+      detailData.value = data || {}
     }
-  } catch (error) {
-    console.error('获取OAuth日志详情错误:', error)
-    ElMessage.error('获取OAuth日志详情失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.detail = false
   }
Modified +18 -32
diff --git a/apps/cube-admin/src/pages/admin/parameter/index.vue b/apps/cube-admin/src/pages/admin/parameter/index.vue
index a6e72a6..e2254ca 100644
--- a/apps/cube-admin/src/pages/admin/parameter/index.vue
+++ b/apps/cube-admin/src/pages/admin/parameter/index.vue
@@ -93,7 +93,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -210,7 +210,7 @@ const getKindType = (kind: number) => {
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/Parameter', {
+    const data = await request.get('/Admin/Parameter', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -218,31 +218,22 @@ const loadData = async () => {
       }
     });
 
-    if (response && response.data && Array.isArray(response.data.data)) {
-      tableData.value = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      tableData.value = response.data;
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      tableData.value = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || tableData.value.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      tableData.value = data;
+      total.value = data.length;
     } else {
       tableData.value = [];
-    }
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
       total.value = 0;
     }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -329,11 +320,9 @@ const handleDelete = (row: Parameter) => {
         await request.delete('/Admin/Parameter', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -348,16 +337,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/Parameter', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/Parameter', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
Modified +18 -33
diff --git a/apps/cube-admin/src/pages/admin/role/index.vue b/apps/cube-admin/src/pages/admin/role/index.vue
index f6bed40..52d65b0 100644
--- a/apps/cube-admin/src/pages/admin/role/index.vue
+++ b/apps/cube-admin/src/pages/admin/role/index.vue
@@ -89,7 +89,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -173,7 +173,7 @@ const formRules = reactive<FormRules>({
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/Role', {
+    const data = await request.get('/Admin/Role', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -181,31 +181,22 @@ const loadData = async () => {
       }
     });
 
-    if (response && response.data && Array.isArray(response.data.data)) {
-      tableData.value = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      tableData.value = response.data;
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      tableData.value = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || tableData.value.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      tableData.value = data;
+      total.value = data.length;
     } else {
       tableData.value = [];
-    }
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
       total.value = 0;
     }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -278,7 +269,6 @@ const handleEdit = (row: Role) => {
 // 删除
 const handleDelete = (row: Role) => {
   if (row.isSystem) {
-    ElMessage.warning('系统角色不能删除');
     return;
   }
 
@@ -292,11 +282,9 @@ const handleDelete = (row: Role) => {
         await request.delete('/Admin/Role', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -311,16 +299,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/Role', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/Role', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
Modified +6 -12
diff --git a/apps/cube-admin/src/pages/admin/sys/index.vue b/apps/cube-admin/src/pages/admin/sys/index.vue
index 4ada44d..08454f8 100644
--- a/apps/cube-admin/src/pages/admin/sys/index.vue
+++ b/apps/cube-admin/src/pages/admin/sys/index.vue
@@ -63,7 +63,6 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -111,15 +110,12 @@ const formRules = reactive<FormRules>({
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/Sys');
-
-    if (response && response.data) {
-      const data = response.data.data || response.data;
+    const data = await request.get('/Admin/Sys');
+    if (data) {
       Object.assign(form, data);
     }
-  } catch (error) {
-    ElMessage.error('加载配置失败');
-    console.error('加载配置失败:', error);
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.value = false;
   }
@@ -134,10 +130,8 @@ const handleSave = async () => {
       try {
         loading.value = true;
         await request.put('/Admin/Sys', form);
-        ElMessage.success('保存配置成功');
-      } catch (error) {
-        ElMessage.error('保存配置失败');
-        console.error('保存配置失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       } finally {
         loading.value = false;
       }
Modified +26 -27
diff --git a/apps/cube-admin/src/pages/admin/tenant-user/index.vue b/apps/cube-admin/src/pages/admin/tenant-user/index.vue
index a597a91..0927216 100644
--- a/apps/cube-admin/src/pages/admin/tenant-user/index.vue
+++ b/apps/cube-admin/src/pages/admin/tenant-user/index.vue
@@ -192,7 +192,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
+import { ElMessageBox } from 'element-plus'
 import { Plus, Refresh } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
 
@@ -270,7 +270,7 @@ const getTenantUserList = async () => {
   try {
     loading.list = true
 
-    const response = await request.get('/Admin/TenantUser', {
+    const data = await request.get('/Admin/TenantUser', {
       params: {
         page: pagination.page,
         size: pagination.size,
@@ -280,13 +280,20 @@ const getTenantUserList = async () => {
       }
     })
 
-    if (response && response.data) {
-      tableData.value = response.data.list || []
-      pagination.total = response.data.total || 0
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'list' in data && 'total' in data) {
+      tableData.value = Array.isArray(data.list) ? data.list : [];
+      pagination.total = data.total || 0;
+    } else if (Array.isArray(data)) {
+      tableData.value = data;
+      pagination.total = data.length;
+    } else {
+      tableData.value = [];
+      pagination.total = 0;
     }
-  } catch (error) {
-    console.error('获取租户用户列表错误:', error)
-    ElMessage.error('获取租户用户列表失败')
+  } catch {
+    tableData.value = [];
+    pagination.total = 0;
   } finally {
     loading.list = false
   }
@@ -297,16 +304,15 @@ const getTenantUserDetail = async (id: number) => {
   try {
     loading.detail = true
 
-    const response = await request.get('/Admin/TenantUser/Detail', {
+    const data = await request.get('/Admin/TenantUser/Detail', {
       params: { id }
     })
 
-    if (response && response.data) {
-      detailData.value = response.data || {}
+    if (data) {
+      detailData.value = data || {}
     }
-  } catch (error) {
-    console.error('获取租户用户详情错误:', error)
-    ElMessage.error('获取租户用户详情失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.detail = false
   }
@@ -319,12 +325,10 @@ const createTenantUser = async (data: Partial<TenantUser>) => {
 
     await request.post('/Admin/TenantUser', data)
 
-    ElMessage.success('租户用户创建成功')
     showFormDialog.value = false
     refreshList()
-  } catch (error) {
-    console.error('创建租户用户错误:', error)
-    ElMessage.error('创建租户用户失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.submit = false
   }
@@ -337,12 +341,10 @@ const updateTenantUser = async (data: Partial<TenantUser>) => {
 
     await request.put('/Admin/TenantUser', data)
 
-    ElMessage.success('租户用户更新成功')
     showFormDialog.value = false
     refreshList()
-  } catch (error) {
-    console.error('更新租户用户错误:', error)
-    ElMessage.error('更新租户用户失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.submit = false
   }
@@ -354,12 +356,9 @@ const deleteTenantUser = async (id: number) => {
     await request.delete('/Admin/TenantUser', {
       params: { id }
     })
-
-    ElMessage.success('租户用户删除成功')
     refreshList()
-  } catch (error) {
-    console.error('删除租户用户错误:', error)
-    ElMessage.error('删除租户用户失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
Modified +18 -32
diff --git a/apps/cube-admin/src/pages/admin/tenant/index.vue b/apps/cube-admin/src/pages/admin/tenant/index.vue
index 09fd992..72cd5d0 100644
--- a/apps/cube-admin/src/pages/admin/tenant/index.vue
+++ b/apps/cube-admin/src/pages/admin/tenant/index.vue
@@ -88,7 +88,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 
@@ -195,7 +195,7 @@ const getKindType = (kind: number) => {
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/Tenant', {
+    const data = await request.get('/Admin/Tenant', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -203,31 +203,22 @@ const loadData = async () => {
       }
     });
 
-    if (response && response.data && Array.isArray(response.data.data)) {
-      tableData.value = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      tableData.value = response.data;
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      tableData.value = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || tableData.value.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      tableData.value = data;
+      total.value = data.length;
     } else {
       tableData.value = [];
-    }
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
       total.value = 0;
     }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -310,11 +301,9 @@ const handleDelete = (row: Tenant) => {
         await request.delete('/Admin/Tenant', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
@@ -329,16 +318,13 @@ const submitForm = async () => {
       try {
         if (formType.value === 'add') {
           await request.post('/Admin/Tenant', form);
-          ElMessage.success('新增成功');
         } else {
           await request.put('/Admin/Tenant', form);
-          ElMessage.success('编辑成功');
         }
         dialogVisible.value = false;
         loadData();
-      } catch (error) {
-        ElMessage.error(formType.value === 'add' ? '新增失败' : '编辑失败');
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     }
   });
Modified +16 -27
diff --git a/apps/cube-admin/src/pages/admin/user-connect/index.vue b/apps/cube-admin/src/pages/admin/user-connect/index.vue
index db2d1dd..7190106 100644
--- a/apps/cube-admin/src/pages/admin/user-connect/index.vue
+++ b/apps/cube-admin/src/pages/admin/user-connect/index.vue
@@ -57,7 +57,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessageBox } from 'element-plus';
 import { request } from '@core/utils/request';
 
 // 定义用户连接类型接口
@@ -90,7 +90,7 @@ const searchForm = reactive({
 const loadData = async () => {
   loading.value = true;
   try {
-    const response = await request.get('/Admin/UserConnect', {
+    const data = await request.get('/Admin/UserConnect', {
       params: {
         pageIndex: currentPage.value,
         pageSize: pageSize.value,
@@ -98,31 +98,22 @@ const loadData = async () => {
       }
     });
 
-    if (response && response.data && Array.isArray(response.data.data)) {
-      tableData.value = response.data.data;
-    } else if (response && Array.isArray(response.data)) {
-      tableData.value = response.data;
+    // 处理不同的响应格式
+    if (data && typeof data === 'object' && 'data' in data && 'page' in data) {
+      // 包含分页信息的响应
+      tableData.value = Array.isArray(data.data) ? data.data : [];
+      total.value = data.page?.totalCount || tableData.value.length;
+    } else if (Array.isArray(data)) {
+      // 直接返回数组的响应(无分页信息)
+      tableData.value = data;
+      total.value = data.length;
     } else {
       tableData.value = [];
-    }
-
-    let pageInfo = null;
-    if (response && response.page) {
-      pageInfo = response.page;
-    } else if (response && response.data && response.data.page) {
-      pageInfo = response.data.page;
-    }
-
-    if (pageInfo) {
-      const count = pageInfo.longTotalCount || pageInfo.totalCount;
-      total.value = count ? Number(count) : 0;
-      currentPage.value = pageInfo.pageIndex || 1;
-    } else {
       total.value = 0;
     }
-  } catch (error) {
-    ElMessage.error('加载数据失败');
-    console.error('加载数据失败:', error);
+  } catch {
+    tableData.value = [];
+    total.value = 0;
   } finally {
     loading.value = false;
   }
@@ -166,11 +157,9 @@ const handleDelete = (row: UserConnect) => {
         await request.delete('/Admin/UserConnect', {
           params: { id: row.id }
         });
-        ElMessage.success('删除成功');
         loadData();
-      } catch (error) {
-        ElMessage.error('删除失败');
-        console.error('删除失败:', error);
+      } catch {
+        // 错误提示已经在 request 拦截器中自动处理
       }
     })
     .catch(() => { });
Modified +14 -30
diff --git a/apps/cube-admin/src/pages/admin/user-online/index.vue b/apps/cube-admin/src/pages/admin/user-online/index.vue
index fb3c1b2..0bb2e40 100644
--- a/apps/cube-admin/src/pages/admin/user-online/index.vue
+++ b/apps/cube-admin/src/pages/admin/user-online/index.vue
@@ -264,7 +264,7 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
+import { ElMessageBox } from 'element-plus'
 import { Plus, Refresh } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
 
@@ -369,9 +369,9 @@ const getUserOnlineList = async () => {
     } else {
       throw new Error('获取在线用户列表失败')
     }
-  } catch (error) {
-    console.error('获取在线用户列表错误:', error)
-    ElMessage.error('获取在线用户列表失败')
+  } catch {
+    tableData.value = [];
+    pagination.total = 0;
   } finally {
     loading.list = false
   }
@@ -389,9 +389,8 @@ const getUserOnlineDetail = async (id: number) => {
     } else {
       throw new Error('获取在线用户详情失败')
     }
-  } catch (error) {
-    console.error('获取在线用户详情错误:', error)
-    ElMessage.error('获取在线用户详情失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.detail = false
   }
@@ -405,15 +404,11 @@ const createUserOnline = async (data: Partial<UserOnline>) => {
     const result = await request.post('/Admin/UserOnline', data)
 
     if (result?.code === 200 || result?.code === 0) {
-      ElMessage.success('在线用户创建成功')
       showFormDialog.value = false
       refreshList()
-    } else {
-      throw new Error('创建在线用户失败')
     }
-  } catch (error) {
-    console.error('创建在线用户错误:', error)
-    ElMessage.error('创建在线用户失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.submit = false
   }
@@ -427,15 +422,11 @@ const updateUserOnline = async (data: Partial<UserOnline>) => {
     const result = await request.put('/Admin/UserOnline', data)
 
     if (result?.code === 200 || result?.code === 0) {
-      ElMessage.success('在线用户更新成功')
       showFormDialog.value = false
       refreshList()
-    } else {
-      throw new Error('更新在线用户失败')
     }
-  } catch (error) {
-    console.error('更新在线用户错误:', error)
-    ElMessage.error('更新在线用户失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.submit = false
   }
@@ -444,17 +435,10 @@ const updateUserOnline = async (data: Partial<UserOnline>) => {
 // 删除在线用户
 const deleteUserOnline = async (id: number) => {
   try {
-    const result = await request.delete(`/Admin/UserOnline?id=${id}`)
-
-    if (result?.code === 200 || result?.code === 0) {
-      ElMessage.success('在线用户删除成功')
-      refreshList()
-    } else {
-      throw new Error('删除在线用户失败')
-    }
-  } catch (error) {
-    console.error('删除在线用户错误:', error)
-    ElMessage.error('删除在线用户失败')
+    await request.delete(`/Admin/UserOnline?id=${id}`)
+    refreshList()
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
Modified +5 -7
diff --git a/apps/cube-admin/src/pages/admin/user-stat/index.vue b/apps/cube-admin/src/pages/admin/user-stat/index.vue
index c4eb5b9..fa2da4b 100644
--- a/apps/cube-admin/src/pages/admin/user-stat/index.vue
+++ b/apps/cube-admin/src/pages/admin/user-stat/index.vue
@@ -116,7 +116,6 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
 import { Refresh } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
 
@@ -183,9 +182,9 @@ const getUserStatList = async () => {
     } else {
       throw new Error('获取用户统计列表失败')
     }
-  } catch (error) {
-    console.error('获取用户统计列表错误:', error)
-    ElMessage.error('获取用户统计列表失败')
+  } catch {
+    tableData.value = [];
+    pagination.total = 0;
   } finally {
     loading.list = false
   }
@@ -203,9 +202,8 @@ const getUserStatDetail = async (id: number) => {
     } else {
       throw new Error('获取用户统计详情失败')
     }
-  } catch (error) {
-    console.error('获取用户统计详情错误:', error)
-    ElMessage.error('获取用户统计详情失败')
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.detail = false
   }
Modified +34 -84
diff --git a/apps/cube-admin/src/pages/admin/user-token/index.vue b/apps/cube-admin/src/pages/admin/user-token/index.vue
index 9de7410..7c9adda 100644
--- a/apps/cube-admin/src/pages/admin/user-token/index.vue
+++ b/apps/cube-admin/src/pages/admin/user-token/index.vue
@@ -209,9 +209,9 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
 import { Plus, Refresh } from '@element-plus/icons-vue'
 import { request } from '@core/utils/request'
+import { processListResponse, handleDeleteOperation, handleFormSubmit } from '@core/utils/api-helpers'
 
 // 用户令牌接口
 interface UserToken {
@@ -298,15 +298,12 @@ const getUserTokenList = async () => {
 
     const data = await request.get(`/Admin/UserToken?${params}`)
 
-    if (data?.data) {
-      tableData.value = data.data?.list || []
-      pagination.total = data.data?.total || 0
-    } else {
-      throw new Error('获取用户令牌列表失败')
-    }
-  } catch (error) {
-    console.error('获取用户令牌列表错误:', error)
-    ElMessage.error('获取用户令牌列表失败')
+    const { list, total } = processListResponse(data);
+    tableData.value = list;
+    pagination.total = total;
+  } catch {
+    tableData.value = [];
+    pagination.total = 0;
   } finally {
     loading.list = false
   }
@@ -318,15 +315,9 @@ const getUserTokenDetail = async (id: number) => {
     loading.detail = true
 
     const data = await request.get(`/Admin/UserToken/Detail?id=${id}`)
-
-    if (data?.data) {
-      detailData.value = data.data || {}
-    } else {
-      throw new Error('获取用户令牌详情失败')
-    }
-  } catch (error) {
-    console.error('获取用户令牌详情错误:', error)
-    ElMessage.error('获取用户令牌详情失败')
+    detailData.value = data || {}
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.detail = false
   }
@@ -336,19 +327,11 @@ const getUserTokenDetail = async (id: number) => {
 const createUserToken = async (data: Partial<UserToken>) => {
   try {
     loading.submit = true
-
-    const result = await request.post('/Admin/UserToken', data)
-
-    if (result?.code === 200 || result?.code === 0) {
-      ElMessage.success('用户令牌创建成功')
-      showFormDialog.value = false
-      refreshList()
-    } else {
-      throw new Error('创建用户令牌失败')
-    }
-  } catch (error) {
-    console.error('创建用户令牌错误:', error)
-    ElMessage.error('创建用户令牌失败')
+    await request.post('/Admin/UserToken', data)
+    showFormDialog.value = false
+    refreshList()
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.submit = false
   }
@@ -358,19 +341,11 @@ const createUserToken = async (data: Partial<UserToken>) => {
 const updateUserToken = async (data: Partial<UserToken>) => {
   try {
     loading.submit = true
-
-    const result = await request.put('/Admin/UserToken', data)
-
-    if (result?.code === 200 || result?.code === 0) {
-      ElMessage.success('用户令牌更新成功')
-      showFormDialog.value = false
-      refreshList()
-    } else {
-      throw new Error('更新用户令牌失败')
-    }
-  } catch (error) {
-    console.error('更新用户令牌错误:', error)
-    ElMessage.error('更新用户令牌失败')
+    await request.put('/Admin/UserToken', data)
+    showFormDialog.value = false
+    refreshList()
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.submit = false
   }
@@ -379,17 +354,10 @@ const updateUserToken = async (data: Partial<UserToken>) => {
 // 删除用户令牌
 const deleteUserToken = async (id: number) => {
   try {
-    const result = await request.delete(`/Admin/UserToken?id=${id}`)
-
-    if (result?.code === 200 || result?.code === 0) {
-      ElMessage.success('用户令牌删除成功')
-      refreshList()
-    } else {
-      throw new Error('删除用户令牌失败')
-    }
-  } catch (error) {
-    console.error('删除用户令牌错误:', error)
-    ElMessage.error('删除用户令牌失败')
+    await request.delete(`/Admin/UserToken?id=${id}`)
+    refreshList()
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   }
 }
 
@@ -440,38 +408,20 @@ const handleEdit = async (row: UserToken) => {
 
 // 删除
 const handleDelete = async (row: UserToken) => {
-  try {
-    await ElMessageBox.confirm(
-      `确定要删除用户令牌 "${row.tokenType}" 吗?`,
-      '确认删除',
-      {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      }
-    )
-
-    await deleteUserToken(row.id)
-  } catch (error) {
-    if (error !== 'cancel') {
-      console.error('删除用户令牌错误:', error)
-    }
-  }
+  await handleDeleteOperation(
+    () => deleteUserToken(row.id),
+    () => {},
+    `确定要删除用户令牌 "${row.tokenType}" 吗?`
+  )
 }
 
 // 提交表单
 const handleSubmit = async () => {
-  try {
-    await formRef.value.validate()
-
-    if (isEdit.value) {
-      await updateUserToken(formData.value)
-    } else {
-      await createUserToken(formData.value)
-    }
-  } catch (error) {
-    console.error('表单提交错误:', error)
-  }
+  await handleFormSubmit(
+    formRef.value,
+    () => isEdit.value ? updateUserToken(formData.value) : createUserToken(formData.value),
+    () => {}
+  )
 }
 
 // 表格选择变化
Modified +36 -85
diff --git a/apps/cube-admin/src/pages/admin/user/index.vue b/apps/cube-admin/src/pages/admin/user/index.vue
index 9029c29..d03afcc 100644
--- a/apps/cube-admin/src/pages/admin/user/index.vue
+++ b/apps/cube-admin/src/pages/admin/user/index.vue
@@ -84,9 +84,9 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessageBox } from 'element-plus';
 import type { FormInstance, FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
+import { processListResponse, handleDeleteOperation, handleFormSubmit } from '@core/utils/api-helpers';
 
 // 定义用户类型接口
 interface User {
@@ -172,10 +172,6 @@ const userFormRules = reactive<FormRules>({
 const loadUserData = async () => {
   loading.value = true;
   try {
-    console.log('=== 开始加载用户数据 ===');
-
-    // 直接调用 request.get,它会自动处理成功/失败判断和错误提示
-    // 成功时返回 data 部分,失败时抛出异常
     const data = await request.get('/Admin/User', {
       params: {
         q: searchForm.p,
@@ -184,26 +180,10 @@ const loadUserData = async () => {
       }
     });
 
-    console.log('=== 用户数据获取成功 ===');
-    console.log('返回的数据:', data);
-
-    // data 现在直接是用户数组,无需复杂的解析
-    if (Array.isArray(data)) {
-      tableData.value = data;
-      console.log('✅ 表格数据已设置:', tableData.value.length, '条记录');
-    } else {
-      console.warn('⚠️ 返回的数据不是数组格式');
-      tableData.value = [];
-    }
-
-    // 注意:分页信息在当前设计下可能需要单独处理
-    // 可以考虑让后端在data中包含分页信息,或者从response headers获取
-    total.value = 189; // 临时硬编码,实际应该从API获取
-
-    console.log('=== 用户数据加载完成 ===');
-  } catch (error) {
-    console.error('❌ 加载用户数据失败:', error);
-    // 错误提示已经在 request 拦截器中自动处理了
+    const { list, total: totalCount } = processListResponse<User>(data);
+    tableData.value = list;
+    total.value = totalCount;
+  } catch {
     tableData.value = [];
     total.value = 0;
   } finally {
@@ -283,72 +263,43 @@ const handleEdit = (row: User) => {
 
 // 删除用户
 const handleDelete = (row: User) => {
-  ElMessageBox.confirm('确认删除该用户吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  })
-    .then(async () => {
-      try {
-        console.log('删除用户:', row.id);
-
-        // 直接调用 request.delete,会自动处理响应和提示
-        await request.delete(`/Admin/User/${row.id}`);
-
-        // 成功则重新加载数据
-        loadUserData();
-      } catch (error) {
-        console.error('删除失败:', error);
-        // 错误提示已经在 request 拦截器中自动处理了
-      }
-    })
-    .catch(() => { });
+  handleDeleteOperation(
+    () => request.delete('/Admin/User', { params: { id: row.id } }),
+    loadUserData,
+    '确认删除该用户吗?'
+  );
 };
 
 // 提交表单
 const submitForm = async () => {
-  if (!userFormRef.value) return;
-
-  userFormRef.value.validate(async (valid: boolean) => {
-    if (valid) {
-      try {
-        console.log('提交表单数据:', userForm);
-
-        if (formType.value === 'add') {
-          // 创建用户,过滤掉不需要的字段
-          const userData = {
-            name: userForm.name,
-            displayName: userForm.displayName,
-            mail: userForm.mail,
-            mobile: userForm.mobile,
-            password: userForm.password,
-            enable: userForm.enable,
-            sex: userForm.sex,
-            avatar: userForm.avatar,
-            roleID: userForm.roleID,
-            departmentID: userForm.departmentID,
-            remark: userForm.remark,
-          };
+  const apiCall = async () => {
+    if (formType.value === 'add') {
+      // 创建用户,过滤掉不需要的字段
+      const userData = {
+        name: userForm.name,
+        displayName: userForm.displayName,
+        mail: userForm.mail,
+        mobile: userForm.mobile,
+        password: userForm.password,
+        enable: userForm.enable,
+        sex: userForm.sex,
+        avatar: userForm.avatar,
+        roleID: userForm.roleID,
+        departmentID: userForm.departmentID,
+        remark: userForm.remark,
+      };
+      await request.post('/Admin/User', userData);
+    } else {
+      await request.put('/Admin/User', userForm);
+    }
+  };
 
-          // 直接调用 request.post,会自动处理响应和提示
-          await request.post('/Admin/User', userData);
-          console.log('✅ 用户创建成功');
-        } else {
-          // 更新用户
-          // 直接调用 request.put,会自动处理响应和提示
-          await request.put('/Admin/User', userForm);
-          console.log('✅ 用户更新成功');
-        }
+  const onSuccess = () => {
+    dialogVisible.value = false;
+    loadUserData();
+  };
 
-        // 成功后关闭对话框并重新加载数据
-        dialogVisible.value = false;
-        loadUserData();
-      } catch (error) {
-        console.error(formType.value === 'add' ? '新增失败:' : '编辑失败:', error);
-        // 错误提示已经在 request 拦截器中自动处理了
-      }
-    }
-  });
+  await handleFormSubmit(userFormRef.value, apiCall, onSuccess);
 };
 
 // 初始化加载数据
Modified +4 -14
diff --git a/apps/cube-admin/src/pages/admin/xcode/index.vue b/apps/cube-admin/src/pages/admin/xcode/index.vue
index 01dee67..6fde57e 100644
--- a/apps/cube-admin/src/pages/admin/xcode/index.vue
+++ b/apps/cube-admin/src/pages/admin/xcode/index.vue
@@ -82,7 +82,6 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { ElMessage } from 'element-plus';
 import type { FormRules } from 'element-plus';
 import { request } from '@core/utils/request';
 import type { XCodeSetting } from '@/types/admin';
@@ -145,9 +144,8 @@ const loadData = async () => {
     if (response) {
       Object.assign(form, response);
     }
-  } catch (error) {
-    ElMessage.error('加载设置失败');
-    console.error('加载设置失败:', error);
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.value = false;
   }
@@ -164,18 +162,10 @@ const handleSave = async () => {
     const response = await api.updateSettings(form);
 
     if (response) {
-      ElMessage.success('保存成功');
       Object.assign(form, response);
-    } else {
-      ElMessage.error('保存失败');
     }
-  } catch (error) {
-    if (error instanceof Error) {
-      ElMessage.error('保存失败: ' + error.message);
-    } else {
-      ElMessage.error('表单验证失败');
-    }
-    console.error('保存失败:', error);
+  } catch {
+    // 错误提示已经在 request 拦截器中自动处理
   } finally {
     loading.value = false;
   }
Modified +67 -1
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
index 9d24007..03983a3 100644
--- a/auto-imports.d.ts
+++ b/auto-imports.d.ts
@@ -6,5 +6,71 @@
 // biome-ignore lint: disable
 export {}
 declare global {
-
+  const EffectScope: typeof import('vue')['EffectScope']
+  const computed: typeof import('vue')['computed']
+  const createApp: typeof import('vue')['createApp']
+  const customRef: typeof import('vue')['customRef']
+  const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
+  const defineComponent: typeof import('vue')['defineComponent']
+  const effectScope: typeof import('vue')['effectScope']
+  const getCurrentInstance: typeof import('vue')['getCurrentInstance']
+  const getCurrentScope: typeof import('vue')['getCurrentScope']
+  const h: typeof import('vue')['h']
+  const inject: typeof import('vue')['inject']
+  const isProxy: typeof import('vue')['isProxy']
+  const isReactive: typeof import('vue')['isReactive']
+  const isReadonly: typeof import('vue')['isReadonly']
+  const isRef: typeof import('vue')['isRef']
+  const markRaw: typeof import('vue')['markRaw']
+  const nextTick: typeof import('vue')['nextTick']
+  const onActivated: typeof import('vue')['onActivated']
+  const onBeforeMount: typeof import('vue')['onBeforeMount']
+  const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
+  const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
+  const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
+  const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
+  const onDeactivated: typeof import('vue')['onDeactivated']
+  const onErrorCaptured: typeof import('vue')['onErrorCaptured']
+  const onMounted: typeof import('vue')['onMounted']
+  const onRenderTracked: typeof import('vue')['onRenderTracked']
+  const onRenderTriggered: typeof import('vue')['onRenderTriggered']
+  const onScopeDispose: typeof import('vue')['onScopeDispose']
+  const onServerPrefetch: typeof import('vue')['onServerPrefetch']
+  const onUnmounted: typeof import('vue')['onUnmounted']
+  const onUpdated: typeof import('vue')['onUpdated']
+  const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
+  const provide: typeof import('vue')['provide']
+  const reactive: typeof import('vue')['reactive']
+  const readonly: typeof import('vue')['readonly']
+  const ref: typeof import('vue')['ref']
+  const resolveComponent: typeof import('vue')['resolveComponent']
+  const shallowReactive: typeof import('vue')['shallowReactive']
+  const shallowReadonly: typeof import('vue')['shallowReadonly']
+  const shallowRef: typeof import('vue')['shallowRef']
+  const toRaw: typeof import('vue')['toRaw']
+  const toRef: typeof import('vue')['toRef']
+  const toRefs: typeof import('vue')['toRefs']
+  const toValue: typeof import('vue')['toValue']
+  const triggerRef: typeof import('vue')['triggerRef']
+  const unref: typeof import('vue')['unref']
+  const useAttrs: typeof import('vue')['useAttrs']
+  const useCssModule: typeof import('vue')['useCssModule']
+  const useCssVars: typeof import('vue')['useCssVars']
+  const useId: typeof import('vue')['useId']
+  const useLink: typeof import('vue-router')['useLink']
+  const useModel: typeof import('vue')['useModel']
+  const useRoute: typeof import('vue-router')['useRoute']
+  const useRouter: typeof import('vue-router')['useRouter']
+  const useSlots: typeof import('vue')['useSlots']
+  const useTemplateRef: typeof import('vue')['useTemplateRef']
+  const watch: typeof import('vue')['watch']
+  const watchEffect: typeof import('vue')['watchEffect']
+  const watchPostEffect: typeof import('vue')['watchPostEffect']
+  const watchSyncEffect: typeof import('vue')['watchSyncEffect']
+}
+// for type re-export
+declare global {
+  // @ts-ignore
+  export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+  import('vue')
 }
Modified +1 -0
diff --git a/components.d.ts b/components.d.ts
index 34bf62c..62786a9 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -8,6 +8,7 @@ export {}
 /* prettier-ignore */
 declare module 'vue' {
   export interface GlobalComponents {
+    ElAlert: typeof import('element-plus/es')['ElAlert']
     ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCard: typeof import('element-plus/es')['ElCard']
Added +117 -0
diff --git a/core/utils/api-helpers.ts b/core/utils/api-helpers.ts
new file mode 100644
index 0000000..c5e3b22
--- /dev/null
+++ b/core/utils/api-helpers.ts
@@ -0,0 +1,117 @@
+/**
+ * API 响应处理辅助工具
+ * 提供统一的数据处理方法,简化业务代码
+ */
+
+// 定义基础类型
+type ApiResponseData = unknown;
+type PageInfo = {
+  totalCount?: number;
+  [key: string]: unknown;
+};
+
+/**
+ * 处理列表数据响应
+ * @param data API响应数据
+ * @returns 处理后的列表数据和分页信息
+ */
+export function processListResponse<T = Record<string, unknown>>(data: ApiResponseData): {
+  list: T[];
+  total: number;
+  page?: PageInfo;
+} {
+  // 处理不同的响应格式
+  if (data && typeof data === 'object' && data !== null && 'data' in data && 'page' in data) {
+    // 包含分页信息的响应
+    const response = data as { data: unknown; page: PageInfo };
+    const list = Array.isArray(response.data) ? response.data : [];
+    const total = response.page?.totalCount || list.length;
+    return { list, total, page: response.page };
+  } else if (Array.isArray(data)) {
+    // 直接返回数组的响应(无分页信息)
+    return { list: data, total: data.length };
+  } else {
+    // 其他格式,返回空数组
+    return { list: [], total: 0 };
+  }
+}
+
+/**
+ * 标准的删除操作处理
+ * @param apiCall API调用函数
+ * @param onSuccess 成功后的回调函数
+ * @param confirmMessage 确认消息(可选)
+ */
+export async function handleDeleteOperation(
+  apiCall: () => Promise<unknown>,
+  onSuccess: () => void,
+  confirmMessage: string = '确认删除吗?'
+): Promise<void> {
+  const { ElMessageBox } = await import('element-plus');
+
+  try {
+    await ElMessageBox.confirm(confirmMessage, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
+
+    await apiCall();
+    onSuccess();
+  } catch (error) {
+    // 如果是用户取消,则什么都不做
+    if (error === 'cancel') {
+      return;
+    }
+    // 其他错误已经在 request 拦截器中处理
+  }
+}
+
+/**
+ * 标准的表单提交处理
+ * @param formRef 表单引用
+ * @param apiCall API调用函数
+ * @param onSuccess 成功后的回调函数
+ */
+export async function handleFormSubmit(
+  formRef: { validate: () => Promise<boolean> } | null,
+  apiCall: () => Promise<unknown>,
+  onSuccess: () => void
+): Promise<void> {
+  if (!formRef) return;
+
+  try {
+    const valid = await formRef.validate();
+    if (valid) {
+      await apiCall();
+      onSuccess();
+    }
+  } catch {
+    // 验证失败或API调用失败,错误已在相应地方处理
+  }
+}
+
+/**
+ * 标准的分页加载数据方法
+ * @param apiCall 获取数据的API调用
+ * @param setData 设置数据的方法
+ * @param setLoading 设置加载状态的方法
+ * @param params 查询参数
+ */
+export async function loadPageData<T = Record<string, unknown>>(
+  apiCall: (params: Record<string, unknown>) => Promise<ApiResponseData>,
+  setData: (list: T[], total: number) => void,
+  setLoading: (loading: boolean) => void,
+  params: Record<string, unknown>
+): Promise<void> {
+  setLoading(true);
+  try {
+    const data = await apiCall(params);
+    const { list, total } = processListResponse<T>(data);
+    setData(list, total);
+  } catch {
+    setData([], 0);
+  } finally {
+    setLoading(false);
+  }
+}
Modified +15 -7
diff --git a/core/utils/request.ts b/core/utils/request.ts
index 5081fe1..2b5b742 100644
--- a/core/utils/request.ts
+++ b/core/utils/request.ts
@@ -255,6 +255,11 @@ function handleResponseError(error: AxiosError) {
 function handleResponseSuccess(response: AxiosResponse) {
   const { data, config } = response;
 
+  // 处理文件下载等二进制数据响应
+  if (config.responseType === 'blob' || config.responseType === 'arraybuffer') {
+    return data;
+  }
+
   if (config.responseType === 'text' && typeof data !== 'string') {
     return JSON.stringify(data);
   }
@@ -269,9 +274,6 @@ function handleResponseSuccess(response: AxiosResponse) {
   if (data && typeof data === 'object' && 'code' in data) {
     const apiResponse = data as ApiResponse;
 
-    console.log('=== request 响应拦截器处理 ===');
-    console.log('API响应:', apiResponse);
-
     // 输出 traceId 到控制台
     if (apiResponse.traceId) {
       console.log('TraceId:', apiResponse.traceId);
@@ -281,14 +283,20 @@ function handleResponseSuccess(response: AxiosResponse) {
     const isSuccess = apiResponse.code === 0 || apiResponse.code === 200;
 
     if (isSuccess) {
-      // 成功:不显示提示(让业务层决定是否需要成功提示)
-      console.log('✅ API调用成功');
-      // 直接返回data部分,业务代码可以直接使用
+      // 如果有分页信息,返回包含data和page的对象
+      if (apiResponse.page) {
+        return {
+          data: apiResponse.data,
+          page: apiResponse.page,
+          stat: apiResponse.stat
+        };
+      }
+
+      // 无分页信息,直接返回data部分
       return apiResponse.data;
     } else {
       // 失败:自动显示错误提示
       const errorMessage = apiResponse.message || '操作失败';
-      console.log('❌ API调用失败:', errorMessage);
       notification.error({ message: errorMessage });
 
       // 抛出错误,让业务代码能够在catch中处理
Modified +7 -0
diff --git a/vite.config.ts b/vite.config.ts
index ff2a6ac..a58db2b 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -57,6 +57,13 @@ export default defineConfig(({ command, mode }) => {
         cubeFront(), // The plugin is used here in the main app build
         AutoImport({
           resolvers: [ElementPlusResolver()],
+          // Exclude ElMessage from auto-import since we use request interceptor for unified error handling
+          exclude: [/ElMessage/],
+          imports: [
+            'vue',
+            'vue-router',
+            // Add other imports you want to auto-import globally
+          ],
         }),
         Components({
           resolvers: [ElementPlusResolver()],