1. 项目背景与需求分析
最近在帮本地一所高校设计水站配送管理系统时,发现传统的人工记录方式存在诸多痛点。每次送水工需要手动记录寝室号、数量,再回到办公室用Excel登记,经常出现漏单、错单的情况。特别是开学季高峰期,送水需求激增,人工调度效率低下,学生投诉不断。
这个系统需要解决三个核心问题:
- 实时订单管理:学生能随时下单,送水工能即时接收任务
- 配送路线优化:根据订单位置自动规划最优配送路径
- 库存预警机制:当水站库存低于阈值时自动提醒补货
选择Vue3+Node.js技术栈主要基于以下考虑:
- 高校信息化部门现有技术人员对JavaScript生态更熟悉
- Vue3的Composition API更适合复杂业务逻辑管理
- Node.js高并发特性适合处理瞬时爆发的订水需求
- 前后端统一语言降低协作成本
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 前端技术选型
采用Vue3全家桶构建管理后台和微信小程序双端:
- Vite构建工具:比Webpack快10倍的热更新速度
- Pinia状态管理:比Vuex更简洁的API设计
- Element Plus组件库:丰富的表单和表格组件
- ECharts可视化:用水量统计图表展示
javascript复制// 典型订单组件结构
<script setup>
import { useOrderStore } from '@/stores/order'
const store = useOrderStore()
const handleSubmit = async () => {
await store.createOrder({
room: '3-205',
quantity: 2,
waterType: '矿泉水'
})
}
</script>
2.2 后端服务设计
Node.js采用分层架构:
code复制├── controllers
├── services
├── models
├── routes
└── middlewares
关键模块实现:
- 订单服务:使用Kue实现优先级队列
- 配送算法:基于Google OR-Tools的VRP解决方案
- 微信支付:集成官方SDK处理回调
- 定时任务:Node-scheduler每日23点生成统计报表
javascript复制// 配送路线优化算法核心
const solveVRP = (locations) => {
const routing = new ortools.RoutingModel(locations.length)
// 添加距离约束
routing.AddDimension(
(from, to) => calculateDistance(from, to),
0, // 无容量限制
30000, // 最大行驶距离(米)
true,
'Distance'
)
return routing.solve()
}
3. 核心功能实现
3.1 实时订单推送
采用WebSocket实现双向通信:
- 学生下单后触发Socket.io事件
- 服务端根据送水工位置广播新订单
- 前端使用Pinia管理订单状态
javascript复制// WebSocket服务端
io.on('connection', (socket) => {
socket.on('newOrder', (order) => {
const drivers = getAvailableDrivers()
io.to(drivers).emit('orderAlert', order)
})
})
3.2 动态库存管理
实现库存变化的响应式更新:
- 使用MongoDB Change Stream监听库存变化
- 前端通过Vue3的watchEffect自动更新UI
- 低库存时触发企业微信机器人通知
javascript复制// 库存监控逻辑
Inventory.watch([{
$match: {
operationType: 'update',
'updateDescription.updatedFields.quantity': { $lt: 10 }
}
}], (change) => {
wechatBot.send(`
预警!${change.documentKey._id}库存仅剩${change.updateDescription.updatedFields.quantity}桶
`)
})
4. 开发中的典型问题
4.1 微信支付证书路径问题
在Linux服务器部署时遇到:
code复制Error: ENOENT: no such file or directory, open '/etc/apiclient_cert.p12'
解决方案:
- 使用环境变量动态加载证书路径
- 将证书存入AWS S3通过预签名URL获取
- 开发环境使用mock支付服务
javascript复制// 动态证书加载
const certPath = process.env.NODE_ENV === 'production'
? '/secure/certs/apiclient_cert.p12'
: './local_cert.p12'
4.2 Vue3组件性能优化
大数据量订单列表渲染卡顿:
- 使用vue-virtual-scroller虚拟滚动
- 表格列采用v-memo缓存
- 复杂计算移入Web Worker
javascript复制// 虚拟滚动配置
<RecycleScroller
:items="orders"
:item-size="56"
key-field="id"
>
<template #default="{ item }">
<OrderItem :data="item" />
</template>
</RecycleScroller>
5. 部署与运维方案
5.1 CI/CD流程
GitLab Runner自动化部署:
yaml复制stages:
- test
- build
- deploy
test_job:
image: node:16
script:
- npm ci
- npm run test:unit
deploy_prod:
only:
- master
script:
- scp -r dist/* user@server:/var/www/water
5.2 监控告警配置
使用PM2+Prometheus监控:
- pm2-web显示实时状态
- 自定义指标采集QPS和错误率
- Grafana配置看板监控:
- API响应时间 < 500ms
- 500错误率 < 0.1%
- 内存使用 < 80%
6. 项目演进方向
目前系统已在3个水站试运行,下一步计划:
- 接入校园一卡通支付
- 增加智能水柜对接
- 开发配送员KPI考核模块
- 使用TensorFlow预测用水高峰
在开发过程中有个深刻体会:学校场景的特殊性在于寒暑假的流量波动极大,我们在架构设计时预留了3倍峰值的扩容能力,通过K8s的HPA实现自动扩缩容。另外学生用户对UI交互极其敏感,一个小按钮的位置改动就可能影响30%的下单率,需要持续做A/B测试优化体验。
