1. 项目背景与需求分析
包头师范学院内部订餐系统是一个典型的校园信息化建设项目,旨在解决师生日常用餐的数字化管理问题。传统校园餐饮服务存在几个痛点:用餐高峰期排队拥挤、人工结算效率低下、无法提前预定导致部分菜品售罄、餐费结算方式单一等。这个系统需要整合前端订餐、后台管理和支付功能,实现从选餐到结算的全流程数字化。
系统核心需求包括:
- 师生用户端:菜品浏览、在线订餐、支付结算、订单查询
- 餐厅管理端:菜品管理、订单处理、数据统计
- 支付模块:校园卡/第三方支付对接
- 管理功能:用户权限控制、数据报表生成
2. 技术选型与架构设计
2.1 前端技术栈:Vue3组合式API
选择Vue3作为前端框架主要基于几个考虑:
- 组合式API更适合复杂业务逻辑的组织
- 更好的TypeScript支持
- 更小的打包体积和更高的性能
实际开发中我们采用了以下技术组合:
- Vue3 + Vite构建工具(相比webpack启动更快)
- Pinia状态管理(替代Vuex的轻量方案)
- Element Plus组件库(丰富的UI组件)
- Axios HTTP客户端(处理API请求)
javascript复制// 典型组件结构示例
<script setup>
import { ref, computed } from 'vue'
import { useCartStore } from '@/stores/cart'
const cart = useCartStore()
const itemCount = computed(() => cart.totalItems)
</script>
2.2 后端技术栈:Python框架选型
经过对比Flask、Django和FastAPI后,我们选择了Django REST framework,主要因为:
- 内置的Admin后台适合快速开发管理系统
- ORM完善,数据库操作便捷
- 丰富的第三方插件生态
- 完善的权限认证机制
关键后端模块设计:
- 用户认证:JWT + Django内置权限系统
- 数据模型:Django ORM定义餐厅、菜品、订单等核心模型
- API设计:RESTful风格接口
- 定时任务:Celery处理订单超时等异步任务
python复制# 示例模型定义
from django.db import models
class Meal(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=6, decimal_places=2)
restaurant = models.ForeignKey('Restaurant', on_delete=models.CASCADE)
is_available = models.BooleanField(default=True)
2.3 沙箱支付实现方案
支付模块需要满足:
- 校园卡一卡通对接
- 第三方支付(微信/支付宝)沙箱环境
- 支付结果异步通知
- 交易流水记录
技术实现要点:
- 使用支付宝/微信官方SDK
- 支付状态机设计(待支付->支付中->已支付/已取消)
- 定时任务检查未支付订单
- 敏感数据加密存储
python复制# 支付回调处理示例
@csrf_exempt
def alipay_callback(request):
data = request.POST.dict()
try:
result = verify_alipay_signature(data)
if result and data['trade_status'] == 'TRADE_SUCCESS':
order = Order.objects.get(order_no=data['out_trade_no'])
order.pay_success()
return HttpResponse('success')
except Exception as e:
logger.error(f'Alipay callback error: {str(e)}')
return HttpResponse('fail')
3. 核心功能实现细节
3.1 订餐业务流程设计
完整订餐流程包括:
- 用户认证(学工号+密码)
- 餐厅及菜品展示
- 购物车管理
- 订单生成
- 支付处理
- 订单状态更新
关键业务规则:
- 每日订餐截止时间(如上午10点)
- 特殊时段限制(如考试周延长订餐时间)
- 菜品库存实时更新
- 退款规则(15分钟内可取消)
3.2 数据库设计优化
主要数据表及关系:
- 用户表(Students/Teachers)
- 餐厅表(Restaurants)
- 菜品表(Meals)
- 订单表(Orders)
- 订单明细表(OrderItems)
- 支付记录表(Payments)
优化措施:
- 高频查询字段添加索引
- 合理使用select_related/prefetch_related减少查询
- 读写分离配置
- 定期归档历史订单
python复制# 查询优化示例
def get_user_orders(user_id):
return Order.objects.filter(user_id=user_id)\
.select_related('restaurant')\
.prefetch_related('items__meal')\
.order_by('-create_time')
3.3 高并发场景应对
针对用餐高峰期的并发问题,我们采取了以下措施:
-
缓存策略:
- Redis缓存热门菜品数据
- 订单提交分布式锁
- 页面静态化
-
数据库优化:
- 连接池配置
- 慢查询监控
- 批量操作替代循环操作
-
前端优化:
- 防抖节流控制提交频率
- 本地缓存已浏览菜品
- 骨架屏提升用户体验
4. 系统安全与稳定性保障
4.1 安全防护措施
-
认证安全:
- JWT过期时间设置(30分钟)
- 敏感操作二次验证
- 登录失败次数限制
-
数据安全:
- 密码加盐哈希存储
- 支付信息加密
- SQL注入防护
-
API安全:
- CSRF Token
- 请求频率限制
- 参数校验
4.2 异常处理与监控
建立的监控体系包括:
- Sentry错误监控
- 自定义业务日志
- 关键指标监控(订单量、支付成功率)
- 定时健康检查
典型异常处理模式:
python复制try:
order = create_order(params)
payment = create_payment(order)
return render_payment_page(payment)
except OutOfStockError as e:
logger.warning(f"Out of stock: {str(e)}")
return JsonResponse({'code': 4001, 'msg': '部分菜品已售罄'})
except Exception as e:
logger.error(f"Order create failed: {str(e)}")
return JsonResponse({'code': 500, 'msg': '系统繁忙,请稍后再试'})
5. 部署与运维实践
5.1 系统部署架构
采用Docker容器化部署方案:
- Nginx作为反向代理和负载均衡
- Django应用Gunicorn运行
- Vue项目单独部署
- Redis缓存服务
- MySQL主从配置
dockerfile复制# Django服务Dockerfile示例
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]
5.2 CI/CD流程
GitLab CI配置示例:
yaml复制stages:
- test
- build
- deploy
test_backend:
stage: test
script:
- python manage.py test
build_frontend:
stage: build
script:
- cd frontend
- npm install
- npm run build
deploy_prod:
stage: deploy
script:
- ansible-playbook deploy.yml
only:
- master
6. 项目总结与优化方向
经过三个月的开发和测试,系统已稳定运行半年,日均处理订单2000+,主要成效包括:
- 食堂排队时间减少60%
- 错峰用餐效果明显
- 支付效率提升
- 减少食物浪费约30%
后续优化方向:
- 智能推荐算法(基于历史订单)
- 预订取餐时间窗口细化
- 移动端小程序开发
- 大数据分析菜品受欢迎程度
实际开发中的几点经验:
- 支付模块一定要做好对账机制
- 高并发场景下Redis的使用非常关键
- 前端组件化可以大幅提升开发效率
- 完善的日志系统有助于快速定位问题