1. 项目背景与需求分析
包头师范学院内部订餐系统是一个面向校园师生的数字化餐饮服务平台。随着高校信息化建设的推进,传统食堂窗口排队就餐模式已经无法满足师生多样化的用餐需求。这个系统主要解决以下几个痛点:
- 就餐高峰期排队时间长
- 餐品选择信息不透明
- 支付方式单一
- 食堂运营数据统计困难
系统采用Python作为后端开发语言,主要基于以下考虑:
- Django/Flask等Python框架开发效率高
- 丰富的第三方库支持(如支付对接、数据处理)
- 易于与校园其他信息系统集成
- 开发团队对Python技术栈熟悉
2. 系统架构设计
2.1 技术选型
前端技术栈:
- Vue3 + Element Plus:构建现代化响应式界面
- Axios:处理HTTP请求
- Vue Router:实现前端路由管理
- Pinia:状态管理
后端技术栈:
- Django REST framework:构建RESTful API
- MySQL:数据存储
- Redis:缓存和消息队列
- Celery:异步任务处理
支付模块:
- 沙箱支付环境:模拟真实支付流程
- 支付宝/微信支付接口:实现多种支付方式
2.2 系统模块划分
-
用户模块
- 学生/教职工注册登录
- 权限管理
- 个人信息管理
-
餐厅模块
- 餐厅信息管理
- 餐品分类管理
- 菜单管理
-
订单模块
- 购物车功能
- 订单创建与支付
- 订单状态跟踪
-
配送模块
- 配送区域管理
- 配送员管理
- 配送状态更新
-
评价模块
- 餐品评价
- 餐厅评价
- 评价统计
3. 核心功能实现
3.1 用户认证与权限管理
python复制# Django中的用户模型扩展
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
USER_TYPE_CHOICES = (
(1, 'student'),
(2, 'teacher'),
(3, 'canteen_staff'),
(4, 'admin'),
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
student_id = models.CharField(max_length=20, blank=True, null=True)
phone = models.CharField(max_length=15)
def is_student(self):
return self.user_type == 1
# 其他用户类型判断方法...
3.2 餐品展示与搜索
前端使用Vue3实现餐品展示组件:
vue复制<template>
<div class="food-list">
<el-card v-for="food in filteredFoods" :key="food.id">
<img :src="food.image" class="food-image"/>
<div class="food-info">
<h3>{{ food.name }}</h3>
<p>{{ food.description }}</p>
<div class="price">¥{{ food.price }}</div>
<el-button @click="addToCart(food)">加入购物车</el-button>
</div>
</el-card>
</div>
</template>
<script setup>
import { computed } from 'vue'
import { useStore } from 'vuex'
const props = defineProps({
foods: Array,
searchQuery: String
})
const store = useStore()
const filteredFoods = computed(() => {
return props.foods.filter(food =>
food.name.includes(props.searchQuery) ||
food.description.includes(props.searchQuery)
)
})
const addToCart = (food) => {
store.dispatch('cart/addItem', food)
}
</script>
3.3 购物车与订单系统
后端订单模型设计:
python复制from django.db import models
class Order(models.Model):
ORDER_STATUS = (
(0, '待支付'),
(1, '已支付'),
(2, '制作中'),
(3, '配送中'),
(4, '已完成'),
(5, '已取消'),
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
order_number = models.CharField(max_length=64, unique=True)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
status = models.SmallIntegerField(choices=ORDER_STATUS, default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-created_at']
def generate_order_number(self):
# 生成订单号逻辑
pass
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
food = models.ForeignKey('Food', on_delete=models.PROTECT)
quantity = models.PositiveIntegerField()
price = models.DecimalField(max_digits=8, decimal_places=2)
@property
def total_price(self):
return self.quantity * self.price
3.4 沙箱支付集成
支付接口实现:
python复制import hashlib
import requests
from datetime import datetime
class PaymentService:
def __init__(self, app_id, merchant_private_key, alipay_public_key):
self.app_id = app_id
self.merchant_private_key = merchant_private_key
self.alipay_public_key = alipay_public_key
self.gateway = "https://openapi.alipaydev.com/gateway.do" # 沙箱环境
def create_payment(self, order_number, amount, subject):
params = {
"app_id": self.app_id,
"method": "alipay.trade.page.pay",
"charset": "utf-8",
"sign_type": "RSA2",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"version": "1.0",
"biz_content": {
"out_trade_no": order_number,
"product_code": "FAST_INSTANT_TRADE_PAY",
"total_amount": str(amount),
"subject": subject,
"timeout_express": "30m"
}
}
# 签名逻辑
signed_params = self._sign_params(params)
return f"{self.gateway}?{signed_params}"
def _sign_params(self, params):
# 实现签名逻辑
pass
def verify_notification(self, params):
# 验证支付通知
pass
4. 系统部署与优化
4.1 部署架构
code复制前端服务器(Nginx) → 后端服务器(Django) → 数据库(MySQL)
↓
Celery Worker
↓
Redis缓存/消息队列
4.2 性能优化措施
-
数据库优化:
- 添加适当的索引
- 使用select_related/prefetch_related减少查询次数
- 分页查询大数据集
-
缓存策略:
- 高频访问数据(如菜单、餐厅信息)使用Redis缓存
- 设置合理的缓存过期时间
-
异步处理:
- 使用Celery处理耗时操作(如发送通知、生成报表)
- 订单状态更新使用WebSocket实时推送
-
前端优化:
- 组件懒加载
- 图片懒加载
- API请求节流
5. 安全考虑
-
数据安全:
- 敏感信息加密存储
- 使用HTTPS传输数据
- 定期备份数据库
-
支付安全:
- 严格验证支付通知
- 支付参数签名验证
- 敏感操作日志记录
-
接口安全:
- JWT认证
- 接口限流
- 参数校验
6. 测试策略
-
单元测试:
- 测试核心业务逻辑
- 测试模型方法
-
集成测试:
- 测试API接口
- 测试前后端交互
-
支付测试:
- 沙箱环境全面测试支付流程
- 测试各种支付异常情况
-
性能测试:
- 模拟高并发订餐场景
- 测试系统响应时间
7. 项目总结与展望
在开发过程中,我们遇到并解决了几个关键问题:
-
支付流程的稳定性:通过引入支付状态轮询机制,解决了偶尔出现的支付状态不同步问题。
-
高并发下的订单处理:使用Celery异步处理订单,配合数据库事务,确保订单处理的原子性。
-
移动端适配:采用响应式设计,确保在各种设备上都能良好显示。
未来可能的改进方向:
-
引入智能推荐算法,根据用户历史订单推荐餐品。
-
增加食堂人流量预测功能,帮助师生避开就餐高峰。
-
扩展配送范围,支持校园周边合作商家接入。
-
开发小程序版本,提供更便捷的访问方式。
这个系统的开发实践让我们深刻体会到:
- 良好的系统设计是项目成功的基础
- 自动化测试能显著提高代码质量
- 性能优化需要从开发初期就考虑
- 用户反馈是改进系统的重要依据