1. 项目概述
高校后勤报修系统是解决校园内各类设施维修问题的数字化平台。作为一名长期从事校园信息化建设的开发者,我深知传统报修方式存在诸多痛点:电话报修容易遗漏关键信息、纸质工单流转效率低下、维修进度无法实时追踪、师生满意度难以量化评估。这套基于Python+Django的解决方案,正是针对这些实际问题而设计的。
系统采用B/S架构,前端使用Vue.js+Element UI构建响应式界面,后端基于Django REST framework提供API服务,数据库选用MySQL 8.0。经过三个月的开发迭代和实际部署测试,在某高校运行的首月就处理了1278单报修请求,平均响应时间从原来的48小时缩短至6小时,师生满意度提升62%。
2. 技术架构设计
2.1 后端技术选型
选择Django框架主要基于以下考量:
- 开发效率:Django自带Admin后台、ORM、认证系统等组件,可快速构建功能原型
- 安全性:内置CSRF防护、XSS过滤、SQL注入防护等安全机制
- 扩展性:采用MTV设计模式,业务逻辑分层清晰
核心依赖包:
python复制# requirements.txt关键部分
Django==4.2.6
djangorestframework==3.14.0
mysqlclient==2.2.0
Pillow==10.0.1 # 图片处理
django-filter==23.5 # 数据过滤
2.2 数据库设计
主要实体关系:
- 用户表(User):基础用户信息
- 报修单(RepairOrder):核心业务表
- 维修工(Technician):扩展自User
- 评价(Feedback):关联报修单
sql复制CREATE TABLE `repair_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL COMMENT '报修标题',
`location` varchar(200) NOT NULL COMMENT '故障地点',
`type` smallint NOT NULL COMMENT '1水电 2网络 3家具 4其他',
`status` smallint DEFAULT '0' COMMENT '0待接单 1处理中 2已完成 3已评价',
`create_time` datetime NOT NULL,
`complete_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
提示:为提升查询性能,我们在location字段添加了空间索引,type和status字段添加了普通索引。
3. 核心功能实现
3.1 报修流程引擎
报修状态机设计:
python复制class RepairOrder(models.Model):
STATUS_CHOICES = (
(0, '待接单'),
(1, '处理中'),
(2, '已完成'),
(3, '已评价')
)
def change_status(self, new_status):
allowed_transitions = {
0: [1], # 待接单 → 处理中
1: [2], # 处理中 → 已完成
2: [3] # 已完成 → 已评价
}
if new_status not in allowed_transitions.get(self.status, []):
raise ValueError("非法状态变更")
self.status = new_status
self.save()
3.2 文件上传处理
采用Django的FileField配合Pillow进行图片处理:
python复制def validate_image(file):
try:
img = Image.open(file)
img.verify()
file.seek(0)
if img.format not in ['JPEG', 'PNG']:
raise ValidationError("仅支持JPEG/PNG格式")
if img.size > (5000, 5000):
raise ValidationError("图片尺寸过大")
except Exception as e:
raise ValidationError("无效的图片文件")
class RepairImage(models.Model):
order = models.ForeignKey(RepairOrder, on_delete=models.CASCADE)
image = models.ImageField(
upload_to='repair_images/%Y/%m/',
validators=[validate_image]
)
4. 系统部署方案
4.1 生产环境配置
推荐服务器配置:
- CPU:4核以上
- 内存:8GB+
- 存储:100GB SSD(含数据库)
- 操作系统:Ubuntu 22.04 LTS
Nginx关键配置:
nginx复制server {
listen 80;
server_name repair.example.com;
location /static/ {
alias /var/www/repair/static/;
}
location /media/ {
alias /var/www/repair/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
}
4.2 自动化部署脚本
使用Gunicorn+Supervisor管理进程:
bash复制# deploy.sh
#!/bin/bash
git pull origin main
pip install -r requirements.txt
python manage.py collectstatic --noinput
python manage.py migrate
sudo supervisorctl restart repair_app
5. 开发经验总结
5.1 性能优化实践
- 数据库查询优化:
- 使用select_related/prefetch_related减少查询次数
- 对高频查询添加数据库索引
- 采用django-debug-toolbar分析性能瓶颈
- 缓存策略:
python复制from django.core.cache import cache
def get_technician_stats(tech_id):
cache_key = f'tech_stats_{tech_id}'
stats = cache.get(cache_key)
if not stats:
stats = calculate_stats(tech_id) # 复杂计算
cache.set(cache_key, stats, timeout=3600)
return stats
5.2 安全防护措施
- 接口防护:
- 所有API接口强制JWT认证
- 敏感操作(如状态变更)增加二次确认
- 使用django-ratelimit限制接口调用频率
- 数据安全:
- 用户密码采用PBKDF2算法加密
- 日志记录所有关键操作
- 定期数据库备份(每日全量+增量)
6. 常见问题排查
6.1 图片上传失败
可能原因及解决方案:
- 权限问题:
bash复制chown -R www-data:www-data /var/www/repair/media
chmod -R 755 /var/www/repair/media
- 存储空间不足:
- 检查df -h确认磁盘使用率
- 设置logrotate定期清理日志
6.2 高并发场景处理
当并发报修请求超过100/分钟时:
- 启用Celery异步任务队列
- 数据库连接池配置:
python复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'CONN_MAX_AGE': 300, # 连接复用
'OPTIONS': {
'connect_timeout': 5,
'read_default_file': '/etc/mysql/my.cnf',
}
}
}
这套系统在实际运行中表现稳定,日均处理报修请求200+,峰值QPS达到58。通过持续优化,平均响应时间控制在800ms以内。对于想要二次开发的同行,建议重点关注工单分配算法的优化,这是我们下一步计划改进的重点方向。