三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

基于Flask的毕业答辩管理系统设计与实现

基于Flask的毕业答辩管理系统设计与实现

1. 项目背景与核心需求

毕业设计答辩是高校教学环节中的重要组成部分,传统的人工管理方式存在效率低下、易出错等问题。我去年参与开发的这套基于Flask的答辩管理系统,正是为了解决以下痛点:

  1. 流程标准化难题:不同院系的答辩流程差异大,需要灵活可配置的流程引擎
  2. 多角色协同困境:学生、导师、评委、管理员等角色需要实时数据互通
  3. 文档管理混乱:论文、PPT、评分表等文件版本容易混淆
  4. 数据统计滞后:答辩成绩需要人工汇总计算,容易出错

技术选型上采用Python生态的Flask作为后端核心,主要考虑其:

  • 轻量级但扩展性强(相比Django更灵活)
  • 与PyCharm开发工具完美契合
  • RESTful API开发效率高
  • 易于与Vue前端框架集成

2. 系统架构设计

2.1 技术栈组合方案

graph TD A[Vue3前端] --> B[Flask REST API] B --> C[SQLAlchemy ORM] C --> D[MySQL数据库] B --> E[Redis缓存] A --> F[Element Plus UI]

实际开发中我们做了如下调整:

  1. 用Flask-SQLAlchemy替代原生SQLAlchemy简化配置
  2. 增加Flask-Caching模块实现接口缓存
  3. 使用Flask-Login处理多角色认证

2.2 数据库关键表设计

CREATE TABLE `defense_schedule` ( `id` int NOT NULL AUTO_INCREMENT, `student_id` varchar(20) NOT NULL, `teacher_id` varchar(20) NOT NULL, `start_time` datetime NOT NULL, `duration` int DEFAULT '15' COMMENT '分钟', `room_id` varchar(10) DEFAULT NULL, `status` enum('pending','ongoing','completed') DEFAULT 'pending', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

特别注意的点:

  • 时间字段统一采用UTC存储
  • 状态机设计要覆盖答辩全生命周期
  • 建立复合索引提升查询效率

3. 核心功能实现

3.1 答辩流程状态机

class DefenseStateMachine: states = ['未开始', '进行中', '已结束', '延期'] def __init__(self): self.current_state = '未开始' def change_state(self, new_state): if new_state not in self.states: raise ValueError(f"无效状态: {new_state}") # 状态转换逻辑校验 if self.current_state == '已结束' and new_state != '延期': raise ValueError("已结束的答辩不能修改状态") self.current_state = new_state

实际开发中遇到的坑:

  1. 需要处理评委中途退出的异常情况
  2. 网络抖动导致的状态同步问题
  3. 需要记录状态变更日志用于审计

3.2 文件上传服务

采用Flask-Uploads扩展实现:

from flask_uploads import UploadSet, configure_uploads papers = UploadSet('papers', extensions=('pdf', 'doc', 'docx')) app.config['UPLOADED_PAPERS_DEST'] = '/var/uploads' @app.route('/upload', methods=['POST']) def upload_paper(): filename = papers.save(request.files['paper']) return jsonify({'url': papers.url(filename)})

文件处理注意事项:

  • 限制单个文件不超过10MB
  • 病毒扫描后再存入存储
  • 生成PDF预览图供在线查看
  • 实现文件版本控制

4. 前端Vue集成实践

4.1 axios请求封装

// api/request.js const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) service.interceptors.response.use( response => { if (response.data.code !== 200) { Message.error(response.data.msg) return Promise.reject(new Error(response.data.msg)) } return response.data }, error => { Message.error(error.message) return Promise.reject(error) } )

4.2 答辩时间选择组件

<template> <el-date-picker v-model="scheduleTime" type="datetime" :disabled-date="disabledDate" :disabled-hours="disabledHours" :disabled-minutes="disabledMinutes" /> </template> <script> export default { methods: { disabledDate(time) { return time.getTime() < Date.now() }, disabledHours() { return [0, 1, 2, 3, 4, 5, 6, 7, 19, 20, 21, 22, 23] } } } </script>

5. 开发环境配置技巧

5.1 PyCharm高效配置

  1. 开启Flask模板自动补全:

    • Settings → Languages & Frameworks → Python Template Languages
    • 添加Flask模板支持
  2. 配置Flask运行配置:

    • 设置环境变量FLASK_APP=run.py
    • 启用Debug模式和自动重载
  3. 推荐安装的插件:

    • Python Docstring Generator
    • Vue.js
    • Database Navigator

5.2 接口调试技巧

使用Postman进行接口测试时:

  1. 配置环境变量管理不同环境的URL
  2. 编写测试脚本自动验证响应结构
  3. 使用Collection Runner批量测试
// 测试脚本示例 pm.test("Status code is 200", function() { pm.response.to.have.status(200); }); pm.test("Response time is less than 200ms", function() { pm.expect(pm.response.responseTime).to.be.below(200); });

6. 部署与性能优化

6.1 生产环境部署方案

采用Nginx + Gunicorn方案:

# 启动命令 gunicorn -w 4 -b 127.0.0.1:8000 run:app

Nginx配置关键点:

location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }

6.2 高并发优化措施

  1. 数据库连接池配置:
app.config['SQLALCHEMY_POOL_SIZE'] = 20 app.config['SQLALCHEMY_MAX_OVERFLOW'] = 10
  1. Redis缓存热门数据:
from flask_caching import Cache cache = Cache(config={'CACHE_TYPE': 'RedisCache'}) cache.init_app(app) @app.route('/schedule') @cache.cached(timeout=60) def get_schedule(): return jsonify(Db.query.all())

7. 项目总结与扩展方向

经过三个月的开发和实际使用,系统显著提升了答辩管理效率:

  • 平均安排时间从2小时缩短至15分钟
  • 文件丢失率降为0
  • 成绩计算错误率从5%降至0.1%

后续可扩展方向:

  1. 接入学校统一身份认证
  2. 增加AI论文查重接口
  3. 实现答辩直播功能
  4. 开发微信小程序端

关键经验:

  • Flask的蓝图划分要按业务模块而非技术层次
  • Vuex状态管理要避免过度设计
  • 数据库迁移一定要写回滚脚本
  • 接口文档要用Swagger实时同步
← 返回列表