去年接手了一个宠物用品电商平台的重构项目,客户要求从零开始搭建一套完整的交易管理系统。经过技术选型,最终确定采用Vue 3作为前端框架,Node.js+Express作为后端服务,ElementUI作为UI组件库。这个技术组合在中小型Web应用中表现出极高的开发效率和稳定性,特别适合快速迭代的互联网产品。下面我将从架构设计到部署上线的完整流程,分享这个项目的实战经验。
选择Vue 3+ElementUI的组合主要基于以下考量:
典型组件化结构示例:
code复制src/
├── components/ // 公共组件
├── views/ // 页面视图
├── stores/ // Pinia状态管理
└── router/ // 路由配置
采用Express而非Nest.js的考虑:
数据库选择MySQL而非MongoDB的原因:
采用JWT+RBAC模型实现权限控制:
javascript复制// 登录接口示例
router.post('/login', async (req, res) => {
const user = await User.findOne({ username: req.body.username })
if (!user) return res.status(401).send('用户不存在')
const validPassword = await bcrypt.compare(req.body.password, user.password)
if (!validPassword) return res.status(401).send('密码错误')
const token = jwt.sign(
{ _id: user._id, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '8h' }
)
res.header('Authorization', token).send(token)
})
关键安全措施:
前端采用ElementUI的表格+分页组件:
vue复制<template>
<el-table :data="filteredPets" style="width: 100%">
<el-table-column prop="name" label="宠物名称" width="180" />
<el-table-column prop="category" label="分类" width="180">
<template #default="{row}">
<el-tag :type="getTagType(row.category)">
{{ row.category }}
</el-tag>
</template>
</el-table-column>
</el-table>
</template>
性能优化技巧:
mermaid复制stateDiagram
[*] --> 待支付
待支付 --> 已取消: 超时未支付
待支付 --> 已支付: 支付成功
已支付 --> 已发货: 商家操作
已发货 --> 已完成: 用户确认
已发货 --> 退款中: 用户申请
退款中 --> 已退款: 审核通过
采用沙箱环境模拟支付流程:
javascript复制// 支付接口伪代码
router.post('/pay', verifyToken, async (req, res) => {
const order = await Order.findById(req.body.orderId)
if (!order) return res.status(404).send('订单不存在')
try {
const paymentResult = await mockPayment(order.totalAmount)
if (paymentResult.success) {
await Order.updateOne(
{ _id: order._id },
{ $set: { status: 'paid', paidAt: new Date() } }
)
return res.send('支付成功')
}
// 失败处理...
} catch (err) {
// 错误处理...
}
})
使用ECharts实现销售数据分析:
javascript复制// 月销售统计图表配置
const option = {
tooltip: { trigger: 'axis' },
xAxis: {
type: 'category',
data: ['1月', '2月', '3月']
},
yAxis: { type: 'value' },
series: [{
data: [820, 932, 901],
type: 'line',
smooth: true
}]
}
利用ElementUI的Table多选功能:
vue复制<el-table
ref="multipleTable"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
</el-table>
<script>
export default {
methods: {
handleBatchDelete() {
this.$confirm('确认删除选中商品?', '提示', {
confirmButtonText: '确定',
callback: action => {
if (action === 'confirm') {
// 调用批量删除API
}
}
})
}
}
}
</script>
| 测试类型 | 工具选择 | 覆盖率目标 | 执行频率 |
|---|---|---|---|
| 单元测试 | Jest | ≥80% | 每次提交 |
| 接口测试 | Postman | 核心接口100% | 每日构建 |
| E2E测试 | Cypress | 主流程覆盖 | 发布前 |
前端部署流程:
npm run build生成dist目录nginx复制server {
listen 80;
server_name petstore.com;
location / {
root /var/www/petstore-frontend;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:3000;
}
}
后端PM2配置:
bash复制# 启动命令
pm2 start ecosystem.config.js --env production
# 配置文件示例
module.exports = {
apps: [{
name: 'petstore-api',
script: 'app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
}
}]
}
数据库优化案例:
sql复制-- 优化前的慢查询
SELECT * FROM pets WHERE category = '猫' ORDER BY price DESC;
-- 优化后:添加复合索引
CREATE INDEX idx_category_price ON pets(category, price);
前端加载优化:
v-lazy指令延迟加载非首屏图片javascript复制// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
echarts: ['echarts'],
element: ['element-plus']
}
}
}
}
})
跨域问题处理:
javascript复制// Express中间件配置
app.use(cors({
origin: ['https://petstore.com'],
methods: ['GET', 'POST', 'PUT'],
allowedHeaders: ['Content-Type', 'Authorization']
}))
接口防抖实现:
javascript复制// 使用lodash的debounce
import { debounce } from 'lodash'
const searchPets = debounce(async (keyword) => {
const res = await axios.get(`/api/pets?q=${keyword}`)
// 更新数据...
}, 500)
随着业务增长,可考虑将系统拆分为:
使用Docker+Kubernetes部署架构:
code复制 +---------------+
| API Gateway |
+-------┬-------+
|
+----------+-------+-------+----------+
| | | | |
| User | Goods | Order | Payment |
| Service | Service|Service| Service |
+----------+-------+-------+----------+
CI/CD流水线设计:
yaml复制# GitHub Actions示例
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm ci && npm test
- run: docker build -t petstore:${{ github.sha }} .
- run: kubectl set image deployment/petstore *=petstore:${{ github.sha }}
这个宠物交易平台项目从技术选型到最终上线历时3个月,期间遇到了各种典型的前后端问题。通过采用Vue+Node.js的技术栈,我们实现了快速迭代和稳定交付。最大的收获是认识到良好的架构设计对后期维护的重要性——前期在状态管理和API设计上多花的时间,在需求变更时获得了十倍回报。