当前位置: 首页 > news >正文

Vue3全家桶实战:从零搭建一个后台管理系统(含Router+Axios完整配置)

Vue3全家桶实战:从零构建企业级后台管理系统

1. 项目架构设计与环境搭建

在开始构建后台管理系统前,我们需要规划合理的项目结构。现代前端工程通常采用模块化设计,以下是我的推荐目录结构:

/src ├── api # 接口封装层 ├── assets # 静态资源 ├── components # 公共组件 ├── composables # 组合式函数 ├── router # 路由配置 ├── stores # 状态管理 ├── styles # 全局样式 ├── utils # 工具函数 └── views # 页面组件

1.1 初始化Vue3项目

使用Vite可以快速创建现代化的Vue3项目:

npm create vite@latest admin-system --template vue-ts cd admin-system npm install

关键依赖安装:

npm install vue-router@4 pinia axios sass

1.2 配置基础路由

router/index.ts中配置基本路由结构:

import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/login', component: () => import('@/views/Login.vue'), meta: { requiresAuth: false } }, { path: '/', component: () => import('@/layouts/MainLayout.vue'), children: [ { path: '/dashboard', component: () => import('@/views/Dashboard.vue'), meta: { title: '控制台', icon: 'dashboard' } } ] } ] }) export default router

2. 核心功能模块实现

2.1 智能路由权限系统

后台管理系统的路由权限通常需要动态生成,我们可以通过路由守卫实现:

router.beforeEach(async (to) => { const authStore = useAuthStore() // 需要登录但未登录 if (to.meta.requiresAuth !== false && !authStore.token) { return '/login?redirect=' + encodeURIComponent(to.fullPath) } // 已登录但访问登录页 if (to.path === '/login' && authStore.token) { return '/dashboard' } // 动态添加路由 if (authStore.userInfo?.permissions && !authStore.routesAdded) { authStore.permissions.forEach(permission => { router.addRoute('main', { path: permission.path, component: () => import(`@/views/${permission.component}.vue`), meta: permission.meta }) }) authStore.setRoutesAdded(true) return to.fullPath } })

2.2 高效API服务封装

api/request.ts中创建axios实例:

import axios from 'axios' const service = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 10000 }) // 请求拦截 service.interceptors.request.use(config => { const authStore = useAuthStore() if (authStore.token) { config.headers.Authorization = `Bearer ${authStore.token}` } return config }) // 响应拦截 service.interceptors.response.use( response => { if (response.data.code !== 200) { return Promise.reject(response.data) } return response.data }, error => { if (error.response?.status === 401) { // 处理token过期 } return Promise.reject(error) } ) export default service

2.3 模块化状态管理

使用Pinia创建用户认证store:

// stores/auth.ts import { defineStore } from 'pinia' export const useAuthStore = defineStore('auth', { state: () => ({ token: localStorage.getItem('token') || '', userInfo: null as UserInfo | null, permissions: [] as Permission[], routesAdded: false }), actions: { async login(credentials: LoginForm) { const { data } = await api.login(credentials) this.token = data.token this.userInfo = data.user localStorage.setItem('token', data.token) }, async fetchPermissions() { const { data } = await api.getPermissions() this.permissions = data } } })

3. 高级功能实现技巧

3.1 动态菜单生成

基于权限数据自动生成侧边栏菜单:

<template> <el-menu :default-active="$route.path" router > <template v-for="route in permittedRoutes" :key="route.path"> <el-sub-menu v-if="route.children" :index="route.path"> <template #title> <el-icon><component :is="route.meta.icon" /></el-icon> <span>{{ route.meta.title }}</span> </template> <el-menu-item v-for="child in route.children" :key="child.path" :index="child.path" > {{ child.meta.title }} </el-menu-item> </el-sub-menu> <el-menu-item v-else :index="route.path"> <el-icon><component :is="route.meta.icon" /></el-icon> <span>{{ route.meta.title }}</span> </el-menu-item> </template> </el-menu> </template> <script setup> import { computed } from 'vue' import { useRouter } from 'vue-router' const router = useRouter() const permittedRoutes = computed(() => router.options.routes.filter(route => route.meta?.requiresAuth !== false ) ) </script>

3.2 表格数据渲染优化

使用组合式API封装可复用的表格逻辑:

// composables/useTable.ts import { ref, onMounted } from 'vue' export function useTable(apiFn: Function) { const loading = ref(false) const data = ref([]) const pagination = reactive({ page: 1, pageSize: 10, total: 0 }) const fetchData = async () => { try { loading.value = true const res = await apiFn({ page: pagination.page, pageSize: pagination.pageSize }) data.value = res.list pagination.total = res.total } finally { loading.value = false } } onMounted(fetchData) return { loading, data, pagination, fetchData } }

4. 性能优化与工程化

4.1 路由懒加载优化

通过webpack魔法注释实现更好的代码分割:

const routes = [ { path: '/user', component: () => import(/* webpackChunkName: "user" */ '@/views/User.vue') } ]

4.2 构建配置优化

vite.config.ts中添加以下配置:

export default defineConfig({ build: { chunkSizeWarningLimit: 1500, rollupOptions: { output: { manualChunks(id) { if (id.includes('node_modules')) { return id.toString().split('node_modules/')[1].split('/')[0] } } } } } })

4.3 自动化部署方案

推荐使用GitHub Actions实现CI/CD:

# .github/workflows/deploy.yml name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: '16' - run: npm install - run: npm run build - uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist
http://www.jsqmd.com/news/529187/

相关文章:

  • 漫画下载工具Comics Downloader:高效获取全平台漫画资源的解决方案
  • 腾讯混元OCR网页版安全优化:Nginx配置教程,轻松实现加密访问
  • YOLO12实际作品分享:智能相册自动生成标签的100张图检测统计
  • AI系统-1AI的应用和历史
  • 在Linux服务器环境下如何用pywpsrpc实现WPS Office自动化处理
  • G-Helper深度指南:如何用开源工具替代Armoury Crate实现华硕笔记本精准性能调控
  • DAMO-YOLO与MySQL集成:检测结果存储与分析系统
  • 嵌入式NTP客户端:轻量级时间同步库设计与实战
  • LeetCode之有效的括号
  • OpenClaw高级技巧:nanobot多任务并行控制
  • FLUX 2 Klein加持!BFS换脸:高保真头脸替换新体验
  • Portal-Vue:突破组件树限制的跨DOM渲染技术全解析
  • OpenClaw 飞书机器人配置教程|一键对接飞书,实现聊天下达 AI 指令
  • 如何在浏览器中免费体验完整的三国杀游戏:无名杀终极指南
  • 直破 Android 17 大屏困局:Navigation 3 架构深度解析
  • Windows 11 23H2 搜狗输入法卸载后任务栏严重卡顿问题分析
  • MaaYuan:代号鸢与如鸢游戏自动化助手完整使用指南
  • Wan2.1-umt5快速开始:使用CSDN星图平台镜像一键启动
  • RePKG:3步解锁Wallpaper Engine壁纸资源的实用工具
  • Windows安装Pytorch3D(conda环境)
  • 如何快速获取抖音无水印视频:面向初学者的完整指南
  • 避坑指南:Cadence Allegro多逻辑器件设计中最容易忽略的5个细节(附箭头引脚处理技巧)
  • Video2X视频增强技术全解析:从像素修复到视觉革命
  • 告别手动对账!SAP F110自动付款后,如何用ABAP开发客户应收款的智能清账程序?
  • Jmeter压力测试指标详解
  • 黑丝空姐-造相Z-Turbo系统重装后恢复指南:快速重建Python与模型环境
  • 陕西保安怎么选?国盾(西安)保安以“复员军人”筑牢安全防线 - 深度智识库
  • 学术专著不用愁!AI专著生成工具,从构思到完稿全程护航
  • 2026年广州英国留学中介咨询推荐:五家优选深度解析 - 科技焦点
  • TCS3472 I²C驱动库:嵌入式高精度色彩传感实现指南