| | |
| | | } |
| | | |
| | | /** |
| | | * 下载导入模板 |
| | | * @returns |
| | | */ |
| | | export function getVehicleImportTemplate() { |
| | | const method = request.Post<Service.ResponseResult<any>>('/vehicleConvoy/api/v1/vehicle/importTemplate', { responseType: 'blob' }) |
| | | method.meta = { ...method.meta, isBlob: true } |
| | | return method |
| | | } |
| | | |
| | | /** |
| | | * 删除车辆 |
| | | * @param id |
| | | * @returns |
| | |
| | | // 重置当前存储库 |
| | | this.$reset() |
| | | // 重定向到登录页 |
| | | if (route.meta.requiresAuth) { |
| | | router.push({ |
| | | name: 'login', |
| | | query: { |
| | | redirect: route.fullPath, |
| | | }, |
| | | }) |
| | | } |
| | | const redirect = route.meta.requiresAuth && route.name !== 'not-found' ? route.fullPath : undefined |
| | | router.push({ |
| | | name: 'login', |
| | | query: { |
| | | redirect, |
| | | }, |
| | | }) |
| | | }, |
| | | clearAuthStorage() { |
| | | local.remove('accessToken') |
| | |
| | | |
| | | // Route permission filtering |
| | | resultRouter = resultRouter.filter(i => { |
| | | if (i.meta?.requiresAuth === false) |
| | | return true |
| | | if (i.id) { |
| | | return hasPermission(i.id) |
| | | } |
| | |
| | | |
| | | // Route permission filtering |
| | | resultRouter = resultRouter.filter(i => { |
| | | if (i.meta?.requiresAuth === false) |
| | | return true |
| | | // 优先检查路由 ID 是否在权限列表中 |
| | | if (i.id) { |
| | | return hasPermission(i.id) |
| | |
| | | if (import.meta.env.VITE_ROUTE_LOAD_MODE === 'dynamic') { |
| | | try { |
| | | // Get user's route |
| | | const authStore = useAuthStore() |
| | | const result = await fetchUserRoutes({ |
| | | id: 1, |
| | | id: authStore.userInfo?.id || 1, |
| | | }) |
| | | |
| | | if (!result.isSuccess || !result.data) { |
| | | throw new Error('Failed to fetch user routes') |
| | | } |
| | | |
| | | return result.data |
| | | const publicRoutes = staticRoutes.filter(route => route.requiresAuth === false) |
| | | const userRoutes = result.data |
| | | const mergedRoutes = [...publicRoutes.filter(p => !userRoutes.some(u => u.name === p.name)), ...userRoutes] |
| | | |
| | | return mergedRoutes |
| | | } |
| | | catch (error) { |
| | | console.error('Failed to initialize route info:', error) |
| | |
| | | import dayjs from 'dayjs' |
| | | import { useBoolean } from '@/hooks' |
| | | import { downloadFile } from '@/utils' |
| | | import { batchOperation, batchSetElectronic, deleteVehicle, exportVehicleExcel, getVehiclePageList, importVehicleExcel } from '@/service/api/vehicle' |
| | | import { batchOperation, batchSetElectronic, deleteVehicle, exportVehicleExcel, getVehicleImportTemplate, getVehiclePageList, importVehicleExcel } from '@/service/api/vehicle' |
| | | import { fetchElectronicFenceAreaList } from '@/service/api/point' |
| | | import SearchPanel from '@/components/custom/SearchPanel.vue' |
| | | import CompleteVehicleInfoModal from './components/CompleteVehicleInfoModal.vue' |
| | |
| | | } |
| | | } |
| | | |
| | | // 下载模板 |
| | | async function handleDownloadTemplate() { |
| | | try { |
| | | const response = await getVehicleImportTemplate() |
| | | if (response instanceof Blob) { |
| | | downloadFile(response, `车辆导入模板_${new Date().getTime()}.xlsx`) |
| | | window.$message.success('下载成功') |
| | | } |
| | | else { |
| | | window.$message.error('下载失败:接口未返回正确的文件模板') |
| | | } |
| | | } |
| | | catch (error) { |
| | | console.error('下载模板失败:', error) |
| | | } |
| | | } |
| | | |
| | | function handleImport() { |
| | | fileInputRef.value?.click() |
| | | } |
| | |
| | | </NButton> |
| | | </NSpace> |
| | | <NSpace> |
| | | <NButton v-permission="50114" @click="handleDownloadTemplate"> |
| | | 下载导入模板 |
| | | </NButton> |
| | | <NButton v-permission="50114" @click="handleImport"> |
| | | 导入 |
| | | </NButton> |
| | |
| | | deleteFeedbackType, |
| | | } from "@/service/api/serviceCenter"; |
| | | |
| | | interface FeedbackTypeItem { |
| | | id: number; |
| | | feedbackType: string; |
| | | createTime?: string; |
| | | } |
| | | |
| | | const { bool: loading, setTrue: startLoading, setFalse: endLoading } = |
| | | useBoolean(false); |
| | | |
| | |
| | | async function getFeedbackTypeList() { |
| | | startLoading(); |
| | | try { |
| | | const res = await fetchFeedbackTypeList(); |
| | | const res = await fetchFeedbackTypeList({ |
| | | pageNum: 1, |
| | | pageSize: 9999, |
| | | }); |
| | | if (res.code === 200 && res.data) { |
| | | const list = Array.isArray(res.data) |
| | | ? res.data |