1. 项目概述
这个基于Python Flask和微信小程序的学生宿舍电费缴纳系统,是我去年为某高校开发的一个实际项目。传统的宿舍电费缴纳需要学生跑到后勤处排队,管理员手工记录,效率低下还容易出错。我们开发的这套系统让学生直接在微信上就能完成缴费,管理员也能实时掌握各宿舍用电情况。
系统上线后,缴费流程从原来的平均15分钟缩短到30秒内完成,错误率降为零,后勤处的工作量减少了70%。更重要的是,疫情期间避免了人员聚集,校方和学生们都非常满意。下面我就把这个项目的完整开发过程分享给大家,包括技术选型、核心实现和踩过的那些坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选择
选择Python Flask作为后端框架主要基于以下考虑:
- 开发效率高:相比Java Spring Boot,Flask更轻量级,适合快速迭代
- 社区支持好:有丰富的扩展库,如Flask-SQLAlchemy、Flask-RESTful等
- 学习曲线平缓:团队成员都有Python基础,可以快速上手
微信小程序作为前端是因为:
- 无需安装:即用即走,符合学生使用习惯
- 支付集成方便:直接调用微信支付API
- 跨平台:同时支持iOS和Android
数据库选用MySQL 8.0,主要看中:
- 事务支持完善:确保缴费过程的ACID特性
- 性能稳定:经测试可支持5000+学生的并发访问
- 与Python生态兼容性好:SQLAlchemy对MySQL支持完善
2.2 架构示意图
code复制[微信小程序] ←HTTPS→ [Nginx] ←WSGI→ [Flask应用]
↑
↓
[MySQL数据库]
这种前后端分离的架构有以下优势:
- 职责清晰:前端专注交互,后端专注业务逻辑
- 扩展性强:可以单独扩展后端服务
- 安全性高:API接口可以统一做权限控制
3. 后端实现详解
3.1 数据库设计
核心表结构设计经过多次优化,最终版本如下:
3.1.1 学生表(students)
python复制class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
student_id = db.Column(db.String(20), unique=True) # 学号
name = db.Column(db.String(50)) # 姓名
dorm_id = db.Column(db.String(10)) # 宿舍号
phone = db.Column(db.String(15)) # 手机号
openid = db.Column(db.String(32)) # 微信openid
created_at = db.Column(db.DateTime, default=datetime.now)
设计要点:
- 学号设置唯一索引,避免重复
- 存储openid用于微信登录关联
- 添加创建时间便于后期统计分析
3.1.2 宿舍表(dorms)
python复制class Dorm(db.Model):
id = db.Column(db.Integer, primary_key=True)
dorm_id = db.Column(db.String(10), unique=True) # 宿舍编号
building = db.Column(db.String(20)) # 楼栋号
floor = db.Column(db.Integer) # 楼层
max_power = db.Column(db.Float) # 最大电量限制
current_power = db.Column(db.Float) # 当前电量
balance = db.Column(db.Float) # 账户余额
last_update = db.Column(db.DateTime) # 最后更新时间
特别说明:
- 将楼栋和楼层分开存储,便于按区域统计
- 设置max_power防止超额用电
- 记录last_update用于监控数据新鲜度
3.1.3 缴费记录表(payments)
python复制class Payment(db.Model):
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(db.String(32), unique=True) # 订单号
student_id = db.Column(db.String(20)) # 学号
dorm_id = db.Column(db.String(10)) # 宿舍号
amount = db.Column(db.Float
