请求拦截CodeYann authored at 2025-07-01 14:00:58 Yann committed at 2025-07-01 15:20:51
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 拦截器中自动处理
}
}
});
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 拦截器中自动处理
}
}
});
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 拦截器中自动处理
}
}
}
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 拦截器中处理
}
}
}
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>
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 拦截器中自动处理
}
}
});
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
}
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 拦截器中自动处理
}
}
});
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 拦截器中自动处理
}
}
});
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;
}
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 拦截器中自动处理
}
}
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 拦截器中自动处理
}
}
});
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(() => { });
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 拦截器中自动处理
}
}
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
}
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),
+ () => {}
+ )
}
// 表格选择变化
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);
};
// 初始化加载数据
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;
}
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')
}
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']
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);
+ }
+}
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中处理
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()],