1. 项目背景与核心价值
这个选题系统本质上是一个用Python后端+Vue3前端构建的Web应用,主要解决高校毕业设计选题环节的三大痛点:学生选题扎堆、教师人工统计费时、选题过程不透明。我在实际开发中发现,市面上很多类似系统要么功能单一,要么操作复杂,而我们的方案通过合理的架构设计,在易用性和功能性之间找到了平衡点。
从技术选型来看,Python+Django提供了稳定的后端支持,Vue3的Composition API让前端状态管理更清晰。特别值得一提的是,我们创新性地采用了WebSocket实现选题过程的实时更新,学生提交选题后,所有相关师生能立即看到最新数据,避免了传统轮询方式带来的延迟和服务器压力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计解析
2.1 技术栈选型依据
后端选择Django框架主要基于三点考虑:
- Django Admin能快速搭建管理后台,满足教师端的需求
- Django REST framework对API开发支持完善
- Python生态有丰富的教育领域库支持(如PyPDF2用于论文格式检查)
前端选用Vue3而不是React的原因:
- 高校实验室电脑配置普遍一般,Vue3的运行时性能更优
- 学校IT部门技术人员更熟悉Vue技术栈
- Composition API更适合处理复杂的选题状态逻辑
2.2 数据库设计要点
核心的选题关系采用三张表实现:
python复制class Teacher(models.Model):
name = models.CharField(max_length=50)
research_field = models.CharField(max_length=100)
class Topic(models.Model):
title = models.CharField(max_length=200)
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
capacity = models.IntegerField() # 可选人数上限
class Selection(models.Model):
student = models.ForeignKey(User, on_delete=models.CASCADE)
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
priority = models.IntegerField() # 志愿优先级
status = models.CharField(max_length=20) # 待审核/已通过/已拒绝
特别注意的点:
- 为topic表添加了capacity字段控制选题人数上限
- selection表的priority字段实现多志愿机制
- 使用status字段而非布尔值,便于扩展其他状态
3. 核心功能实现细节
3.1 选题流程的状态管理
前端使用Pinia管理复杂的选题状态:
javascript复制// stores/selection.js
export const useSelectionStore = defineStore('selection', {
state: () => ({
topics: [],
mySelections: [],
deadline: null
}),
actions: {
async fetchTopics() {
// 获取所有可选课题
},
async submitSelection(prior
