一、技术选型与项目定位
在全栈开发领域,Vue.js 3.x凭借其组合式API和响应式系统革新,成为构建现代化单页应用的首选框架;Express框架则以轻量级和高度可扩展性,成为服务端开发的行业标准。本书以电商系统为载体,通过”用户端-服务端-管理端”三端协同开发模式,系统讲解如何整合这两项技术实现全栈能力。
项目架构采用分层设计理念:前端基于Vue 3的Composition API构建组件化界面,通过Pinia实现状态集中管理;后端使用Express框架搭建RESTful API服务,集成MySQL数据库与JWT认证机制;通信层采用Axios实现前后端数据交互,配合CORS中间件解决跨域问题。这种架构既保证了开发效率,又具备良好的可维护性。
二、前端开发核心模块
1. 组件化开发实践
项目采用”原子设计”理念构建UI组件库,将通用按钮、表单控件等拆分为基础组件,通过Props和插槽实现灵活复用。例如商品卡片组件:
<template><div class="product-card"><img :src="product.image" :alt="product.name"><h3>{{ product.name }}</h3><div class="price">¥{{ product.price }}</div><button @click="addToCart">加入购物车</button></div></template><script setup>defineProps({product: Object});const emit = defineEmits(['add-to-cart']);const addToCart = () => emit('add-to-cart');</script>
通过组合式API的setup()语法糖,将业务逻辑与模板解耦,提升代码可测试性。
2. 路由与状态管理
使用Vue Router 4.x实现动态路由配置,结合路由守卫实现权限控制:
const routes = [{path: '/dashboard',component: Dashboard,meta: { requiresAuth: true },children: [{ path: 'products', component: ProductList },{ path: 'orders', component: OrderManagement }]}];router.beforeEach((to, from, next) => {const isAuthenticated = checkAuth();if (to.meta.requiresAuth && !isAuthenticated) next('/login');else next();});
Pinia状态管理通过defineStore创建全局状态仓库,实现购物车数据的跨组件共享:
export const useCartStore = defineStore('cart', {state: () => ({ items: [] }),actions: {addItem(product) {this.items.push(product);},removeItem(id) {this.items = this.items.filter(item => item.id !== id);}}});
3. 网络请求封装
基于Axios创建请求拦截器,统一处理JWT认证和错误响应:
const apiClient = axios.create({baseURL: '/api',timeout: 5000});apiClient.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) config.headers.Authorization = `Bearer ${token}`;return config;});apiClient.interceptors.response.use(response => response.data,error => {if (error.response.status === 401) {router.push('/login');}return Promise.reject(error);});
三、后端服务实现
1. Express中间件架构
项目采用”洋葱模型”中间件架构,通过app.use()注册中间件链:
// 日志中间件app.use((req, res, next) => {console.log(`${req.method} ${req.url}`);next();});// JWT验证中间件const authenticate = (req, res, next) => {const token = req.headers.authorization?.split(' ')[1];if (!token) return res.sendStatus(401);jwt.verify(token, SECRET_KEY, (err, user) => {if (err) return res.sendStatus(403);req.user = user;next();});};// 路由分组app.use('/api/auth', authRoutes);app.use('/api/products', authenticate, productRoutes);
2. MySQL数据库集成
使用Sequelize ORM实现数据模型定义和CRUD操作:
const { DataTypes } = require('sequelize');const sequelize = new Sequelize('mysql://user:pass@localhost:3306/ecommerce');const Product = sequelize.define('Product', {id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true },name: { type: DataTypes.STRING, allowNull: false },price: { type: DataTypes.DECIMAL(10,2), allowNull: false }});// 关联查询示例const getProductsWithCategories = async () => {return await Product.findAll({include: [{model: Category,as: 'categories'}]});};
3. 订单处理逻辑
实现完整的订单生命周期管理,包括状态机设计和事务处理:
router.post('/orders', authenticate, async (req, res) => {const transaction = await sequelize.transaction();try {const cartItems = await CartItem.findAll({where: { userId: req.user.id },transaction});const order = await Order.create({userId: req.user.id,total: calculateTotal(cartItems),status: 'PROCESSING'}, { transaction });await Promise.all(cartItems.map(item =>OrderItem.create({orderId: order.id,productId: item.productId,quantity: item.quantity}, { transaction })));await CartItem.destroy({ where: { userId: req.user.id }, transaction });await transaction.commit();res.status(201).json(order);} catch (error) {await transaction.rollback();res.status(500).json({ error: 'Order creation failed' });}});
四、部署与运维方案
1. 容器化部署
使用Docker Compose实现开发环境快速搭建:
version: '3.8'services:frontend:build: ./frontendports:- "8080:80"depends_on:- backendbackend:build: ./backendenvironment:- DB_HOST=db- DB_PORT=3306depends_on:- dbdb:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: rootpassMYSQL_DATABASE: ecommercevolumes:- db-data:/var/lib/mysqlvolumes:db-data:
2. 监控告警体系
集成主流日志服务实现请求监控:
// 自定义日志中间件app.use((req, res, next) => {const start = Date.now();res.on('finish', () => {const duration = Date.now() - start;logService.info({method: req.method,url: req.url,status: res.statusCode,duration: `${duration}ms`});});next();});
五、学习资源配套
本书提供完整项目源码仓库,包含:
- 分阶段代码提交历史,便于对照学习
- 30小时配套教学视频,覆盖关键技术点
- 自动化测试用例集,包含单元测试与E2E测试
- 部署脚本与运维文档,支持一键部署到主流云平台
通过系统学习本书内容,开发者可掌握从组件开发到服务部署的全栈技能,具备独立开发商业级电商系统的能力。配套资源特别设计的”错误处理实验室”模块,通过模拟20种常见开发陷阱,帮助读者提升问题排查能力。