这个项目是一个典型的电子商务平台,采用前后端分离架构设计。前端使用Vue.js框架配合Element UI组件库,后端则结合了Node.js和ThinkPHP两种技术栈。这种架构选择在当前的Web开发中非常流行,因为它能充分发挥前后端各自的优势。
我选择这个技术组合主要基于以下几个考虑:
前端采用Vue 2.x版本(考虑到项目启动时的技术成熟度),配合以下关键技术:
javascript复制// 典型的Vue组件结构示例
<template>
<div class="product-detail">
<el-card>
<div slot="header">
<h2>{{ product.name }}</h2>
</div>
<div class="content">
<el-image :src="product.image"></el-image>
<div class="info">
<p class="price">¥{{ product.price }}</p>
<el-button type="primary" @click="addToCart">加入购物车</el-button>
</div>
</div>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
product: {}
}
},
async created() {
const { data } = await this.$http.get(`/products/${this.$route.params.id}`)
this.product = data
},
methods: {
addToCart() {
this.$store.dispatch('cart/addItem', this.product)
}
}
}
</script>
后端采用混合架构模式,主要分为两部分:
Node.js服务(Express框架)
ThinkPHP服务
javascript复制// Node.js的典型路由处理
const express = require('express')
const router = express.Router()
const Product = require('../models/product')
router.get('/products', async (req, res) => {
try {
const { category, keyword, page = 1, limit = 10 } = req.query
const query = {}
if (category) query.category = category
if (keyword) query.name = { $regex: keyword, $options: 'i' }
const products = await Product.find(query)
.skip((page - 1) * limit)
.limit(limit)
res.json({
code: 200,
data: products
})
} catch (err) {
res.status(500).json({
code: 500,
message: err.message
})
}
})
采用JWT(JSON Web Token)实现无状态认证:
重要提示:Token中不要存储敏感信息,且一定要设置合理的过期时间。我们项目中设置为2小时过期,并通过refresh token机制实现无感刷新。
购物车实现考虑了多种场景:
javascript复制// 购物车Vuex模块示例
const cart = {
state: {
items: []
},
mutations: {
SET_ITEMS(state, items) {
state.items = items
},
ADD_ITEM(state, product) {
const existing = state.items.find(item => item.id === product.id)
if (existing) {
existing.quantity++
} else {
state.items.push({ ...product, quantity: 1 })
}
}
},
actions: {
async fetchCart({ commit }) {
const { data } = await axios.get('/cart')
commit('SET_ITEMS', data)
},
async addItem({ commit }, product) {
await axios.post('/cart', product)
commit('ADD_ITEM', product)
}
}
}
支付模块接入了两种主流支付方式:
支付宝支付:
微信支付:
支付安全注意事项:
- 所有支付相关操作必须使用HTTPS
- 支付结果以异步通知为准,不能依赖前端回调
- 金额等敏感参数必须从服务器获取,不能信任前端传递
数据库优化:
缓存策略:
负载均衡:
输入验证:
防注入攻击:
CSRF防护:
XSS防护:
敏感数据保护:
系统采用Docker容器化部署,主要包含以下服务:
bash复制# 典型的Docker Compose配置示例
version: '3'
services:
frontend:
image: nginx
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html
node-app:
build: ./node-service
ports:
- "3000:3000"
environment:
- NODE_ENV=production
php-app:
image: php:7.4-fpm
volumes:
- ./php:/var/www/html
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=shop
redis:
image: redis:alpine
状态管理:初期没有规划好Vuex的模块结构,导致后期难以维护。建议从一开始就按功能划分模块。
API设计:早期版本API设计不够RESTful,后期重构花费了大量时间。应该遵循成熟的API设计规范。
错误处理:开始时没有统一的错误处理机制,导致前端需要处理各种不同的错误格式。后来我们制定了统一的错误响应规范。
测试覆盖:项目中期才引入自动化测试,导致很多回归问题。建议在项目初期就搭建好测试框架。
性能监控:上线后才发现某些页面加载缓慢。应该在上线前就实施性能监控和预警机制。
这个项目从技术选型到最终上线历时6个月,期间遇到了各种挑战,但也积累了宝贵的全栈开发经验。特别是混合使用Node.js和ThinkPHP的架构,既发挥了Node.js的高并发优势,又利用了ThinkPHP丰富的后台功能,这种组合在类似的电商项目中值得借鉴。