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. 你将学到
- 8 大模块完整实现(项目初始化 / 登录鉴权 / 仪表盘 / 商品 / 订单 / 用户 / 营销 / 部署)
- Vue 3 + Vite + Pinia + Vue Router + Element Plus + ECharts 全栈集成
- 性能优化(10,000 项表格虚拟滚动)
- 5 角色权限系统(RBAC)
- ECharts 5 张图表(仪表盘)
- 生产部署(Vercel / Netlify / CDN)
- 完整 TypeScript
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:
- 完整项目经验: 简历加分
- 企业级技能: Router + Pinia + Element Plus 全集成
- 可部署: 实际可上线的 SaaS 后台
- 30 课完整闭环: 教学 + 实战 + 部署
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 可以。代码全部开源,可直接用作为企业项目起点。
📖 小节
- Vue 3 综合项目:8 模块电商 SaaS 后台(10-12h)
- 技术栈:Vue 3 + Vite + Pinia + Vue Router + Element Plus + ECharts + TypeScript
- 8 模块:项目初始化 / 登录鉴权 / 仪表盘 / 商品 / 订单 / 用户 / 营销 / 部署
- 5 角色权限系统(admin / manager / editor / viewer / guest)
- ECharts 5 张图表(折线 / 柱状 / 饼图 / 漏斗 / 排行榜)
- Vercel 部署(1 行命令 + SPA rewrites)
- 完整 TypeScript + 性能优化(虚拟滚动 / 手动 chunks / Sentry)
13. 🎉 30 课毕业!
恭喜完成 Vue 3 完整 30 课! 从入门到企业级项目,你已经具备:
- ✅ Vue 3 Composition API 完全掌握
- ✅ Pinia + Vue Router + Element Plus 全栈集成
- ✅ TypeScript + Vite 工程化
- ✅ 性能优化 + 错误处理 + 测试
- ✅ 部署上线(Vercel + Sentry)
- ✅ 可独立开发企业级 Vue 应用
下一步建议:
- 🔥 启动 5 语种翻译(中文 → 英 → 日/葡/阿)
- 🔥 启动 React 教程(35-40h)
- 🔥 启动 Nuxt 3 教程(30h)
- 🔥 实战项目升级(加上 AI 能力)
📝 作业
-
基础题(难度⭐) 完成模块 1(项目初始化)+ 模块 2(登录鉴权):
- Vite + Vue 3 + Pinia + Element Plus
- 登录页 + 仪表盘(占位)
- 5 角色权限基础
-
进阶题(难度⭐⭐) 完成 4 大模块:初始化 / 登录 / 仪表盘 / 商品:
- 完整 Vite + TypeScript 配置
- 5 张 ECharts 图表
- 商品 CRUD(10 个字段)
-
挑战题(难度⭐⭐⭐) 完成完整的 8 大模块 + 部署:
- 所有 8 模块(10-12h)
- TypeScript 强类型
- 性能优化(虚拟滚动 / 手动 chunks)
- 测试覆盖(5 个组件 + 3 个 E2E)
- Vercel 部署 + Sentry 集成
- 完成 30 课 Vue 教程毕业! 🎉