高校机房管理系统是教育信息化建设中的重要一环。我去年为某职业技术学院开发的这套系统,解决了传统机房管理中的三大痛点:手工登记效率低下、设备状态无法实时监控、预约排课混乱无序。
这个系统采用前后端分离架构,前端用Vue.js实现响应式界面,后端基于Flask轻量级框架,数据库选用MySQL,开发工具是PyCharm。整个系统包含6个核心模块:设备管理、预约管理、课表管理、故障报修、数据统计和权限管理。
虽然项目标题提到了Django,但我们最终选择了Flask,主要基于三点考虑:
核心依赖库:
python复制# requirements.txt
flask==2.0.1
flask-sqlalchemy==2.5.1
flask-login==0.5.0
flask-cors==3.0.10
flask-jwt-extended==4.3.1
Vue 2.x版本满足所有功能需求,主要组件包括:
javascript复制// main.js 典型配置
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
通过WebSocket实现设备状态实时更新:
python复制# websocket.py
from flask_socketio import SocketIO, emit
socketio = SocketIO(app, cors_allowed_origins="*")
@socketio.on('status_update')
def handle_status_update(json):
room = json['room']
emit('status_change', json, room=room)
前端对应处理逻辑:
javascript复制this.socket = io.connect(API_URL)
this.socket.on('status_change', (data) => {
this.devices = data.devices
})
核心冲突检测逻辑:
python复制def check_conflict(new_booking):
existing = Booking.query.filter(
Booking.room_id == new_booking.room_id,
Booking.date == new_booking.date,
or_(
and_(
Booking.start_time < new_booking.end_time,
Booking.end_time > new_booking.start_time
),
# 处理跨时段预约情况
[...]
)
).first()
return existing is not None
python复制class Device(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
status = db.Column(db.String(20)) # 空闲/使用中/维修中
ip_address = db.Column(db.String(15))
last_check = db.Column(db.DateTime)
class Booking(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
device_ids = db.Column(db.String(255)) # 逗号分隔的设备ID
date = db.Column(db.Date)
start_time = db.Column(db.Time)
end_time = db.Column(db.Time)
purpose = db.Column(db.String(200))
python复制db.Index('idx_device_status', Device.status)
db.Index('idx_booking_date', Booking.date)
基于角色的访问控制(RBAC)模型:
python复制@bp.route('/admin/devices', methods=['POST'])
@jwt_required()
@role_required('admin')
def add_device():
# 只有admin角色可以访问
[...]
使用SQLAlchemy ORM或参数化查询:
python复制# 安全做法
Device.query.filter_by(name=request.form['name']).first()
# 绝对避免
query = f"SELECT * FROM device WHERE name = '{request.form['name']}'"
推荐使用Nginx + Gunicorn方案:
bash复制# gunicorn启动命令
gunicorn -w 4 -b 0.0.0.0:5000 wsgi:app
Nginx配置示例:
nginx复制location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
配置结构化日志记录:
python复制import logging
from flask.logging import default_handler
app.logger.removeHandler(default_handler)
handler = logging.FileHandler('app.log')
handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
app.logger.addHandler(handler)
WebSocket连接不稳定问题:
批量设备状态更新优化:
前端性能瓶颈:
这个项目从需求分析到上线部署共耗时3个月,目前稳定运行在6个机房,管理着近500台设备。最大的收获是理解了教育场景下的特殊需求,比如需要处理大量的课程预约冲突,以及应对学期初的高并发预约请求。