高校毕业设计选题环节长期存在信息不对称、流程繁琐等问题。传统纸质化选题方式下,学生难以全面了解导师课题信息,导师也无法高效筛选合适的学生。我在参与某高校教务系统升级时,亲眼目睹了系办公室堆积如山的纸质申请表和老师们手工匹配的混乱场景。
这个基于Django的双选系统正是为解决这些痛点而生。系统需要实现三个核心目标:
选择Django框架主要基于以下考量:
前端选用Bootstrap+vue.js的组合方案:
MySQL表结构设计特别注意了以下方面:
python复制class Topic(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
# 使用Decimal而非Float保证精度
difficulty = models.DecimalField(max_digits=2, decimal_places=1)
capacity = models.PositiveSmallIntegerField()
# 使用外键而非字符串存储导师信息
teacher = models.ForeignKey('Teacher', on_delete=models.CASCADE)
tags = models.ManyToManyField('Tag')
class Meta:
# 复合索引提升查询效率
indexes = [
models.Index(fields=['teacher', 'difficulty']),
]
采用改进的协同过滤算法:
python复制def calculate_similarity(student, topic):
# 特征权重调节参数
WEIGHTS = {
'major': 0.4,
'skills': 0.3,
'history': 0.3
}
major_sim = cosine_similarity(
student.major_vector,
topic.required_majors
)
skill_sim = jaccard_similarity(
set(student.skills),
set(topic.required_skills)
)
history_sim = 1 - normalized_distance(
student.history_preferences,
topic.category
)
return (
WEIGHTS['major'] * major_sim +
WEIGHTS['skills'] * skill_sim +
WEIGHTS['history'] * history_sim
)
采用WebSocket+轮询的混合方案:
python复制# 错误做法:导致N+1查询
topics = Topic.objects.all()
for t in topics:
print(t.teacher.name)
# 正确做法:使用select_related
topics = Topic.objects.select_related('teacher').all()
采用三级缓存架构:
python复制@permission_required('topic.add_topic', raise_exception=True)
def publish_topic(request):
# 仅允许具有发布权限的导师访问
推荐的生产环境配置:
python复制TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
python复制def validate_file_extension(value):
ext = os.path.splitext(value.name)[1]
valid_extensions = ['.pdf', '.doc', '.docx']
if not ext.lower() in valid_extensions:
raise ValidationError('不支持的文件类型')
这个系统在实际部署后,选题周期从原来的3周缩短到5天,师生匹配满意度提升40%。有个细节让我印象深刻:有位导师通过系统自动匹配,找到了具有区块链开发经验的学生,而这在传统手工匹配中几乎不可能实现。