Vue.js: 综合项目:电商后台

最后更新:2026-10-20

这是 Vue 3 教程的毕业项目——把 29 课所学全部应用到真实 SaaS 电商后台。我们仿照 GitHub 88k⭐ 的 PanJiaChen/vue-element-admin 架构,实现 5,000 商户、30,000 SKU 的电商后台。

整个项目 8 大模块,10-12 小时工作量。完成本项目后,你具备独立开发企业级 Vue 应用的能力。

1. 你将学到


2. 一个 SaaS 电商的产品经理"全栈需求"

(1) 痛点:5,000 商户 30,000 SKU 的电商后台怎么做

Alice 被提拔为后台仪表盘项目的负责人:

TEXT
业务场景:
  - 5,000 中小企业商户(每户 30-300 SKU)
  - 30,000 个商品 SKU
  - 每日 10,000 订单
  - 5 角色权限(admin / manager / editor / viewer / guest)
  - 实时数据(仪表盘、订单、通知)
  - 多语言(5 语种)

产品经理 Charlie 写了需求规格:

"Alice,我们的 SaaS 平台需要一个完整的后台。8 个模块:仪表盘、商品、订单、用户、营销、设置、登录、部署。每个模块都关键。用 Vue 3 来做,10-12 小时,把前 29 课学的全用上。"

(2) Vue 3 综合项目 8 模块架构

TEXT
src/
├── api/                   # API 封装
│   ├── auth.ts
│   ├── product.ts
│   ├── order.ts
│   └── user.ts
├── assets/                # 静态资源
├── components/            # 公共组件
│   ├── BaseButton.vue
│   ├── BaseTable.vue       # 二次封装 Element Plus
│   ├── BasePagination.vue
│   ├── BaseDialog.vue
│   └── charts/             # 图表
│       ├── SalesChart.vue
│       ├── UserChart.vue
│       └── OrderChart.vue
├── composables/           # 组合式函数
│   ├── useAuth.ts
│   ├── usePermission.ts
│   ├── useTable.ts
│   └── usePagination.ts
├── layouts/                # 布局
│   ├── DefaultLayout.vue   # 登录后
│   └── AuthLayout.vue      # 登录页
├── router/                # 路由
│   └── index.ts
├── stores/                 # Pinia
│   ├── auth.ts
│   ├── product.ts
│   ├── order.ts
│   └── app.ts              # 全局(主题 / 侧边栏)
├── types/                  # TS 类型
│   ├── user.ts
│   ├── product.ts
│   └── api.ts
├── utils/                  # 工具
│   ├── request.ts          # axios 封装
│   ├── auth.ts
│   └── format.ts
├── views/                  # 页面
│   ├── dashboard/          # 仪表盘
│   ├── login/              # 登录
│   ├── product/            # 商品
│   ├── order/              # 订单
│   ├── user/               # 用户
│   ├── marketing/          # 营销
│   └── error/              # 403 / 404
├── App.vue
└── main.ts

(3) 收益

After building this project:


3. 模块 1:项目初始化(1.5h)

(1) 完整 package.json

▶ 示例:项目初始化完整配置(难度⭐⭐)

⚠️ 完整 8 模块综合项目需 Vite + Element Plus + ECharts + Pinia + Vue Router,必须在 Vite 项目中运行。本课作为毕业项目展示核心代码结构。

JSON
{
  "name": "mercury-admin",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview",
    "test": "vitest",
    "test:e2e": "playwright test",
    "lint": "eslint . --ext .vue,.ts,.tsx"
  },
  "dependencies": {
    "vue": "^3.4.0",
    "vue-router": "^4.3.0",
    "pinia": "^2.1.0",
    "element-plus": "^2.5.0",
    "@element-plus/icons-vue": "^2.3.0",
    "echarts": "^5.4.0",
    "vue-echarts": "^7.0.0",
    "axios": "^1.6.0",
    "dayjs": "^1.11.0",
    "vueuse": "^10.7.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.0.0",
    "vite": "^5.0.0",
    "vue-tsc": "^1.8.0",
    "typescript": "^5.3.0",
    "unplugin-vue-components": "^0.26.0",
    "unplugin-auto-import": "^0.17.0",
    "unplugin-icons": "^0.17.0",
    "@iconify-json/carbon": "^1.1.0",
    "sass": "^1.69.0",
    "vitest": "^1.0.0",
    "@vue/test-utils": "^2.4.0",
    "@playwright/test": "^1.40.0"
  }
}

(2) vite.config.ts

TS
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import'
import Components from 'unplugin-vue-components'
import Icons from 'unplugin-icons/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import path from 'path'

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      imports: ['vue', 'vue-router', 'pinia', 'vueuse'],
      resolvers: [ElementPlusResolver()],
      dts: 'src/auto-imports.d.ts'
    }),
    Components({
      resolvers: [ElementPlusResolver()],
      dts: 'src/components.d.ts'
    }),
    Icons({ autoInstall: true })
  ],
  resolve: {
    alias: { '@': path.resolve(__dirname, 'src') }
  },
  server: {
    port: 5173,
    proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true } }
  },
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          'vue-vendor': ['vue', 'vue-router', 'pinia'],
          'echarts-vendor': ['echarts', 'vue-echarts']
        }
      }
    }
  }
})

输出:

TEXT
npm install 后所有依赖解析成功;
npm run dev 启动 Vite 开发服务器,
Element Plus 与 ECharts 的产物已随依赖打包可用,
控制台输出 Local: http://localhost:5173/

4. 模块 2:登录 + JWT 鉴权 + 权限路由(2h)

(1) Pinia auth store

▶ 示例:JWT 登录 + 5 角色权限 demo(CDN 可运行)

▶ 展开运行示例(124 行)
▶ 试一试

输出:

TEXT
初始显示登录卡片:「🔐 登录 (CDN 模拟)」、用户名/密码输入框(已预填 alice / 123456)、「登录」按钮和 5 个角色快捷按钮,无错误提示。
点「登录」后切换到仪表盘:顶部「📊 仪表盘」、欢迎 Alice 和 admin 标签;显示 4 张 KPI 卡片($12,345、342、1,234、5,678)和 5 个可点击的权限按钮。
点 manager / editor 等快捷按钮再登录,KPI 数量和权限按钮的禁用状态随角色减少;点「登出」回到登录页。

(2) 路由守卫

TS
// router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: '/login', component: () => import('@/views/login/LoginPage.vue') },
    {
      path: '/',
      component: () => import('@/layouts/DefaultLayout.vue'),
      meta: { requiresAuth: true },
      children: [
        { path: '', redirect: '/dashboard' },
        { path: 'dashboard', component: () => import('@/views/dashboard/DashboardPage.vue') },
        { path: 'products', component: () => import('@/views/product/ProductListPage.vue') }
      ]
    }
  ]
})

router.beforeEach((to, from, next) => {
  const auth = useAuthStore()
  
  if (to.meta.requiresAuth && !auth.isLoggedIn) {
    return next({ name: 'login', query: { redirect: to.fullPath } })
  }
  
  next()
})

export default router

(3) 自定义权限指令

TS
// directives/permission.ts
import { useAuthStore } from '@/stores/auth'

export const permission = {
  mounted(el: HTMLElement, binding: { value: string }) {
    const auth = useAuthStore()
    if (!auth.permissions.includes(binding.value)) {
      el.parentNode?.removeChild(el)
    }
  }
}
VUE
<button v-permission="'product.create'">Create Product</button>

5. 模块 3:仪表盘(2h)

(1) 5 张 ECharts 图表

▶ 示例:仪表盘 5 张 ECharts 图表(CDN 可运行)

▶ 展开运行示例(104 行)
▶ 试一试

输出:

TEXT
页面顶部显示「📊 仪表盘 5 张 ECharts 图表」和 4 张 KPI 卡片:今日销售额 $12,345、今日订单 342、活跃用户 5,678、转化率 3.2%(红色 ↓ -2%)。
下方依次渲染 5 张图表:销售趋势折线图、订单数柱状图、商品分类饼图、用户活跃双折线图、销量 Top 5 柱状图。
图表带标题与悬浮提示,窗口缩放时自适应容器宽度。

6. 模块 4:商品管理(1.5h)

(1) 商品列表 + CRUD

▶ 示例:商品 CRUD + 权限控制(CDN 可运行)

▶ 展开运行示例(116 行)
▶ 试一试

输出:

TEXT
页面显示「📦 商品管理(CDN 简化版)」、搜索框和「➕ 新建商品」按钮,下方表格列出 4 件商品(iPhone 15 Pro、MacBook Pro、Cotton T-Shirt、Old Model),含 ID、分类、价格、库存和状态标签。
输入「iPhone」后表格实时过滤只剩 iPhone 15 Pro;清空搜索恢复 4 行。
点「新建商品」弹出表单,填写保存后新增一行(ID 5、状态 active);点「编辑」回填数据,保存后该行更新;点「删除」确认后该行消失。

7. 模块 5:订单管理(1h)

(1) 订单列表 + 详情

▶ 示例:订单列表 + 详情 + 状态流转(CDN 可运行)

▶ 展开运行示例(104 行)
▶ 试一试

输出:

TEXT
页面显示「📋 订单管理」表格 3 行:#1001 Alice $1028(pending,查看/确认)、#1002 Bob $50(paid,查看/发货)、#1003 Carol $2499(shipped,查看),状态用橙/蓝/绿标签区分。
点「查看」弹出订单详情,含用户、金额、状态、商品清单和状态流转时间线;点遮罩或「关闭」收起。
点 #1001 的「确认」后状态变为 paid、时间线追加「已支付」,操作按钮变为「发货」;点「发货」后变为 shipped 并追加「已发货」。

8. 模块 6:用户管理(1h)

(1) 用户列表 + 角色管理

▶ 示例:用户角色管理 + RBAC 编辑(CDN 可运行)

▶ 展开运行示例(87 行)
▶ 试一试

输出:

TEXT
页面显示「👥 用户角色管理(RBAC)」表格 4 行:alice/admin、bob/manager、carol/editor+viewer、eve/guest,角色用不同颜色标签展示。
点「编辑角色」弹出对话框,标题为「编辑 alice 的角色」,5 个角色复选框按当前角色预勾选,并显示角色说明。
增删勾选后点「保存」,表格中该用户的角色标签立即更新;点「取消」关闭对话框且不修改。

(2) 5 角色权限

TS
// utils/roles.ts
export const ROLES = {
  admin: {
    label: 'Admin',
    permissions: ['*']  // 全部权限
  },
  manager: {
    label: 'Manager',
    permissions: ['product.*', 'order.*', 'user.read']
  },
  editor: {
    label: 'Editor',
    permissions: ['product.read', 'product.edit', 'order.read']
  },
  viewer: {
    label: 'Viewer',
    permissions: ['*.read']
  },
  guest: {
    label: 'Guest',
    permissions: ['product.read']
  }
}

9. 模块 7:营销活动(1h)

(1) 优惠券管理

▶ 示例:优惠券列表 + 时间范围 + 状态(CDN 可运行)

▶ 试一试

输出:

TEXT
页面显示「🎟️ 营销活动(优惠券管理)」表格 4 行优惠券。
SUMMER2026 / NEWUSER50 显示绿色「进行中」,BLACKFRIDAY 显示灰色「已过期」,VIPONLY 显示橙色「已暂停」。
类型列把 percentage / fixed 显示为「百分比折扣 / 固定金额」,折扣列显示 20% off、$5 off 等,有效期显示起止日期。

10. 模块 8:部署上线(1h)

(1) 构建优化

▶ 示例:Vite 手动 chunks 拆分优化(难度⭐⭐)

⚠️ 以下为 Vite 配置文件,CDN 全局构建不适用。展示生产环境优化策略:

TS
// vite.config.ts(生产环境优化)
build: {
  outDir: 'dist',
  sourcemap: true,  // 用于 Sentry
  minify: 'esbuild',
  cssMinify: 'lightningcss',
  rollupOptions: {
    output: {
      manualChunks: {
        'vue-vendor': ['vue', 'vue-router', 'pinia'],
        'echarts-vendor': ['echarts', 'vue-echarts'],
        'ui-vendor': ['element-plus'],
        'utils': ['axios', 'dayjs']
      }
    }
  }
}
▶ 试一试

输出:

TEXT
执行 npm run build 后,dist/assets 下按配置生成 vue-vendor、echarts-vendor、ui-vendor、utils 等独立 chunk。
入口 chunk 体积明显减小,浏览器可并行加载并长期缓存第三方依赖;构建同时输出 sourcemap 供 Sentry 使用。

(2) Vercel 部署

BASH
npm install -g vercel
vercel --prod
JSON
// vercel.json
{
  "build": { "command": "npm run build" },
  "outputDirectory": "dist",
  "framework": "vite",
  "rewrites": [
    { "source": "/(.*)", "destination": "/index.html" }
  ]
}

(3) 性能监控

TS
// main.ts
import * as Sentry from '@sentry/vue'

Sentry.init({
  app,
  dsn: 'https://your-dsn@sentry.io/123',
  tracesSampleRate: 0.1
})

11. 完整 8 模块代码量统计

模块 代码行数 关键功能
1 项目初始化 300 Vite + Pinia + Router + Element Plus + ECharts
2 登录鉴权 400 JWT + 路由守卫 + 权限指令 + 5 角色
3 仪表盘 500 5 张 ECharts + 4 个 KPI + 实时数据
4 商品管理 600 CRUD + 列表 + 编辑 + 图片上传 + 权限
5 订单管理 400 列表 + 详情 + 状态流转 + 导出
6 用户管理 300 列表 + 角色管理 + 权限编辑
7 营销活动 300 优惠券 + 时间范围 + 状态机
8 部署上线 200 Vite 构建优化 + Vercel + Sentry
合计 3000 8 模块完整 SaaS 后台

12. 5 大常见错误速查

错误 现象 解决
首屏白屏 路由 / Pinia 加载顺序错 main.ts 先 app.use(router) 再 app.use(pinia)
权限失效 角色不刷新 watch 监听 permissions
10,000 项卡顿 表格性能差 虚拟滚动 el-table-v2
ECharts 不显示 容器高度 0 设置 style="height: 300px"
部署后 404 SPA 路由问题 Vercel rewrites 配置

❓ 常见问题

Q 8 模块要多久?
A 10-12 小时(按教学节奏)。熟练开发 4-6 小时。
Q 怎么 mock 后端 API?
A 用 MSW(Mock Service Worker)或 Express + json-server。教学用前者。
Q Element Plus + TypeScript 完整支持吗?
A 是。Element Plus 2.x 完全 TypeScript 重写,类型推断完整。
Q 10,000 项表格怎么优化?
A 用 el-table-v2(Element Plus 官方虚拟滚动版)或 vue-virtual-scroller。100x 性能提升。
Q 怎么部署到生产?
A Vercel(推荐,免费)+ 自定义域名。vercel --prod 1 行命令。
Q 30 课毕业后学什么?
A (1) Nuxt 3(SSR);(2) React(横向对比);(3) 微前端(qiankun);(4) 移动端(uni-app)。
Q 能直接用这个项目模板吗?
A 可以。代码全部开源,可直接用作为企业项目起点。

📖 小节


13. 🎉 30 课毕业!

恭喜完成 Vue 3 完整 30 课! 从入门到企业级项目,你已经具备:

下一步建议:


📝 作业

  1. 基础题(难度⭐) 完成模块 1(项目初始化)+ 模块 2(登录鉴权):

    1. Vite + Vue 3 + Pinia + Element Plus
    2. 登录页 + 仪表盘(占位)
    3. 5 角色权限基础
  2. 进阶题(难度⭐⭐) 完成 4 大模块:初始化 / 登录 / 仪表盘 / 商品:

    1. 完整 Vite + TypeScript 配置
    2. 5 张 ECharts 图表
    3. 商品 CRUD(10 个字段)
  3. 挑战题(难度⭐⭐⭐) 完成完整的 8 大模块 + 部署:

    1. 所有 8 模块(10-12h)
    2. TypeScript 强类型
    3. 性能优化(虚拟滚动 / 手动 chunks)
    4. 测试覆盖(5 个组件 + 3 个 E2E)
    5. Vercel 部署 + Sentry 集成
    6. 完成 30 课 Vue 教程毕业! 🎉
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏