1. 项目背景与核心功能
高校宿舍管理一直是校园后勤工作的重点难点,传统纸质报修单模式存在流转效率低、进度不透明、统计困难等问题。这套基于Python Flask框架开发的宿舍报修管理系统,正是为解决这些痛点而生。
系统采用B/S架构,主要包含三大角色模块:
- 学生端:在线提交报修申请、上传现场照片、查看处理进度、对服务进行评价
- 维修工端:接收工单推送、接单处理、上传维修结果照片
- 宿管端(核心管理模块):工单分配、进度监控、数据统计、楼栋管理等
技术栈选择上,前端采用Bootstrap+JQuery实现响应式布局,后端使用Flask轻量级框架,数据库选用MySQL关系型数据库,通过Flask-SQLAlchemy进行ORM操作。特别值得注意的是系统采用了基于角色的访问控制(RBAC)模型,不同权限的用户看到的功能界面完全不同。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与技术实现
2.1 Flask框架选型考量
相比Django的全家桶式框架,Flask的微框架特性更适合这个中型管理系统:
- 轻量级核心:仅提供路由、模板等基础功能
- 扩展机制:通过Flask扩展按需添加功能
- 开发灵活:可以自由选择数据库、认证等组件
- 学习曲线平缓:适合高校信息化部门自主维护
实际项目中我们使用了以下关键扩展:
python复制from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_wtf import CSRFProtect
from flask_migrate import Migrate
2.2 数据库模型设计
核心实体关系包括:
- 用户表(User):存储三类用户基础信息
- 报修单表(RepairOrder):状态字段包含"待处理/已分配/维修中/已完成/已评价"
- 楼栋表(Building):与宿管人员的管辖关系
- 评价表(Feedback):关联维修单的打分和评论
python复制class RepairOrder(db.Model):
__tablename__ = 'repair_orders'
id = db.Column(db.Integer, primary_key=True)
student_id = db.Column(db.Integer, db.ForeignKey('users.id'))
title = db.Column(db.String(100))
description = db.Column(db.Text)
status = db.Column(db.String(20), default='pending')
created_at = db.Column(db.DateTime, default=datetime.utcnow)
images = db.Column(db.String(500)) # 存储图片路径,多个用逗号分隔
2.3 核心业务流程实现
报修流程的状态机转换是关键逻辑:
- 学生提交报修单(pending)
- 宿管分配维修工(assigned)
- 维修工接单开始处理(in_progress)
- 维修完成上传结果(completed)
- 学生评价关闭工单(closed)
python复制@app.route('/order/<int:order_id>/assign', methods=['POST'])
@login_required
@role_required('dorm_admin')
def assign_order(order_id):
order = RepairOrder.query.get_or_404(order_id)
if order.status != 'pending':
abort(400, description="只能分配待处理工单")
worker_id = request.form.get('worker_id')
# ...验证worker_id有效性...
order.status = 'assigned'
order.worker_id = worker_id
db.session.commit()
# 发送微信/短信通知
return redirect(url_for('dorm_admin.dashboard'))
3. 特色功能深度解析
3.1 多维度数据统计看板
宿管后台的统计模块包含:
- 实时工单状态分布(饼图)
- 各楼栋报修量排行(柱状图)
- 维修工接单效率分析(折线图)
- 学生满意度评分统计(雷达图)
使用Chart.js实现前端可视化,后端提供聚合查询接口:
python复制@app.route('/api/stats/worker_performance')
@login_required
@role_required('dorm_admin')
def worker_performance_stats():
last_month = datetime.now() - timedelta(days=30)
data = db.session.query(
User.username,
func.count(RepairOrder.id).label('total_orders'),
func.avg(Feedback.rating).label('avg_rating')
).join(RepairOrder, User.id == RepairOrder.worker_id
).join(Feedback, Feedback.order_id == RepairOrder.id
).filter(RepairOrder.created_at >= last_month
).group_by(User.id).all()
return jsonify([dict(row) for row in data])
3.2 微信消息推送集成
通过企业微信API实现关键节点通知:
- 学生:报修单被接单、维修完成提醒
- 维修工:新工单分配提醒
- 宿管:紧急报修提醒、逾期未处理告警
python复制def send_wechat_msg(user, template, **kwargs):
corp_id = current_app.config['WECHAT_CORP_ID']
corp_secret = current_app.config['WECHAT_CORP_SECRET']
agent_id = current_app.config['WECHAT_AGENT_ID']
# 获取access_token
token_url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corp_id}&corpsecret={corp_secret}"
response = requests.get(token_url).json()
access_token = response['access_token']
# 构造消息体
msg = {
"touser": user.wechat_id,
"msgtype": "text",
"agentid": agent_id,
"text": {"content": template.format(**kwargs)},
"safe": 0
}
# 发送消息
send_url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}"
return requests.post(send_url, json=msg).json()
3.3 智能工单分配算法
基于历史数据分析实现智能派单:
- 优先分配同楼栋的维修工
- 考虑维修工当前负载(未完成工单数)
- 参考历史专业领域匹配(水电/木工/网络等)
- 结合用户评价分数权重
python复制def intelligent_dispatch(building_id, repair_type):
workers = User.query.filter_by(
role='worker',
building_id=building_id
).all()
scores = []
for worker in workers:
# 计算当前负载得分(0-40分)
load_score = 40 - min(worker.current_orders.count(), 40)
# 计算专业匹配得分(0-30分)
specialty_score = 30 if repair_type in worker.skills else 10
# 计算历史评价得分(0-30分)
avg_rating = worker.feedbacks.with_entities(
func.avg(Feedback.rating)
).scalar() or 3.0
rating_score = avg_rating * 6 # 3*6=18分起
total = load_score + specialty_score + rating_score
scores.append((worker.id, total))
# 按总分降序排序
scores.sort(key=lambda x: x[1], reverse=True)
return scores[0][0] if scores else None
4. 部署与运维实践
4.1 生产环境部署方案
推荐采用Nginx+Gunicorn+Supervisor组合:
code复制project/
├── venv/ # 虚拟环境
├── app/ # 应用代码
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── __init__.py # Flask应用工厂
├── migrations/ # 数据库迁移脚本
├── config.py # 配置文件
├── requirements.txt # 依赖列表
└── wsgi.py # WSGI入口
Gunicorn启动配置示例:
bash复制gunicorn -w 4 -b 127.0.0.1:8000 --access-logfile - --error-logfile - "wsgi:create_app()"
Nginx关键配置:
nginx复制location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/to/project/app/static/;
expires 30d;
}
4.2 性能优化技巧
- 数据库连接池配置:
python复制app.config['SQLALCHEMY_POOL_SIZE'] = 20
app.config['SQLALCHEMY_POOL_RECYCLE'] = 300
- 缓存策略:
- 使用Flask-Caching扩展
- 高频访问的楼栋列表、维修工列表设置5分钟缓存
- 学生个人中心的未完成工单不缓存
- 前端资源优化:
- 静态文件版本化(防止缓存过期)
- 使用Bootstrap内置的优化组件
- 异步加载图表数据
4.3 安全防护措施
- 输入验证:
python复制from wtforms import StringField, validators
class RepairForm(FlaskForm):
title = StringField('故障标题', [
validators.Length(min=5, max=100),
validators.Regexp(r'^[\w\s\u4e00-\u9fa5]+$')
])
description = TextAreaField('详细描述', [
validators.Length(max=500)
])
- 防护机制:
- CSRF保护(Flask-WTF)
- XSS过滤(bleach库)
- 密码哈希(Flask-Bcrypt)
- 敏感操作日志审计
- API安全:
- 速率限制(Flask-Limiter)
- 敏感接口JWT认证
- 严格的CORS策略
5. 项目演进与扩展方向
5.1 移动端适配方案
- 微信小程序版本:
- 复用现有API接口
- 增加扫码报修功能(宿舍设备粘贴二维码)
- 集成微信支付(押金/材料费场景)
- 混合开发方案:
- 使用Flutter框架开发跨平台App
- 通过RESTful API与后端交互
- 离线工单草稿功能
5.2 智能分析扩展
- 故障预测模型:
- 基于历史数据训练时序预测模型
- 提前发现高发故障设备
- 使用Python的Prophet库实现
python复制from prophet import Prophet
def predict_repairs(building_id):
df = get_historical_data(building_id) # 获取过去两年的月报修量
model = Prophet(seasonality_mode='multiplicative')
model.fit(df)
future = model.make_future_dataframe(periods=6, freq='M')
forecast = model.predict(future)
return forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
- 图像识别辅助:
- 学生上传的故障照片自动分类
- 使用预训练的ResNet模型微调
- 识别常见故障类型(水管漏水、电路故障等)
5.3 运维监控体系
- Prometheus监控指标:
- 接口响应时间
- 数据库查询性能
- 活跃用户数
- 日志分析架构:
- ELK Stack收集分析日志
- 关键操作审计追踪
- 异常请求告警
- 自动化测试:
- API接口测试(pytest)
- UI自动化(Selenium)
- 负载测试(Locust)
这套系统在实际部署中已经服务了超过5000名学生,日均处理工单量约80-120件,相比传统模式效率提升显著。特别是在寒暑假前后的集中报修期,系统有效解决了以往电话占线、纸质工单丢失的问题。
