1. 项目背景与核心需求
这个项目源于我在教育科技公司工作时遇到的实际需求。当时我们团队需要为小学生设计一款古诗词学习软件,既要符合新课标要求,又要兼顾趣味性和互动性。市面上大多数古诗词APP要么过于游戏化失去学习价值,要么太过严肃让孩子失去兴趣。
经过对30多所小学的调研,我们发现几个关键痛点:
- 82%的教师反映现有软件无法记录学生的个性化学习轨迹
- 76%的学生认为背诵功能枯燥乏味
- 65%的家长希望有错题本功能但现有产品都不完善
基于这些发现,我们决定采用Django+Vue的技术栈开发这套系统。Django强大的后台管理能力可以完美处理教学数据,而Vue的响应式特性则能打造流畅的前端体验。特别值得一提的是,我们放弃了Flask而选择Django,主要是因为其内置的Admin后台和ORM系统能节省大量开发时间——这在教育类应用中尤为重要,因为教师端需要频繁调整教学内容和查看学习数据。
2. 技术架构设计
2.1 整体架构方案
最终确定的系统架构分为三个主要部分:
code复制前端(Vue.js) ←→ 后端API(Django REST Framework) ←→ 数据库(MySQL)
这个架构有几个关键优势:
- 前后端完全分离,便于团队协作和后期维护
- Django REST Framework提供了完善的API文档支持
- Vue的组件化开发模式非常适合教育类应用的UI需求
2.2 数据库设计要点
针对古诗词学习的特点,我们设计了以下核心表结构:
python复制class Poem(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
dynasty = models.CharField(max_length=20)
content = models.TextField()
translation = models.TextField()
annotation = models.TextField()
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
grade = models.CharField(max_length=10)
school = models.CharField(max_length=100)
class LearningRecord(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
poem = models.ForeignKey(Poem, on_delete=models.CASCADE)
last_review = models.DateTimeField()
mastery_level = models.IntegerField() # 1-5级掌握程度
wrong_answers = models.JSONField() # 存储错题数据
特别说明几个设计决策:
- 使用JSONField存储错题数据,可以灵活记录各种题型错误
- 将诗词原文、译文和注释分开存储,便于前端按需调用
- 掌握程度采用5级评分而非简单的"已学/未学"二元状态
3. 核心功能实现
3.1 智能背诵功能
这是项目的核心难点之一。传统做法是简单的填空测验,我们创新性地实现了语音识别+语义分析的智能背诵:
python复制# 后端处理逻辑示例
def evaluate_recitation(request):
audio_file = request.FILES['audio']
poem_id = request.POST['poem_id']
# 语音转文字
text = speech_to_text(audio_file)
# 获取原诗内容
poem = Poem.objects.get(id=poem_id)
# 使用相似度算法评估
score = calculate_similarity(text, poem.content)
# 记录学习数据
record, created = LearningRecord.objects.update_or_create(
student=request.user.student,
poem=poem,
defaults={'mastery_level': score}
)
return JsonResponse({'score': score})
前端配合使用Vue的Web Audio API实现实时录音和波形显示,大幅提升了用户体验。
3.2 错题本系统
错题本是家长最关注的功能,我们实现了:
- 自动归类错题(字词错误、语序错误、理解错误等)
- 错题重做功能
- 错题统计图表
关键实现代码:
javascript复制// Vue组件中的错题处理方法
handleWrongAnswer(questionId, errorType) {
this.$axios.patch('/api/wrong-answers/', {
question_id: questionId,
error_type: errorType
}).then(response => {
this.updateProgressChart()
})
}
4. 关键技术难点与解决方案
4.1 诗词数据标准化处理
我们收集了2000+首古诗词,面临的主要问题有:
- 不同来源的格式不一致(标点、分段等)
- 异体字和通假字处理
- 作者朝代信息不统一
解决方案:
- 开发Python清洗脚本统一处理标点和格式
- 建立异体字映射表
- 使用正则表达式提取和规范朝代信息
python复制# 诗词清洗示例
def clean_poem_content(text):
# 统一标点
text = text.replace(',', ',').replace('。', '.')
# 处理异体字
for old, new in VARIANT_CHARS.items():
text = text.replace(old, new)
# 标准化空行
return re.sub(r'\n{3,}', '\n\n', text)
4.2 前后端数据交互优化
古诗词数据往往包含大量文本,直接传输会影响性能。我们采用以下优化措施:
- 分页加载:Django REST Framework的PageNumberPagination
- 字段过滤:使用drf-dynamic-fields库
- 数据压缩:配置Django的gzip中间件
python复制# settings.py配置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20,
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
)
}
5. 部署与性能调优
5.1 生产环境部署
我们选择Nginx+Gunicorn的方案部署Django后端:
bash复制# Gunicorn启动命令
gunicorn --workers 4 --threads 2 --bind 0.0.0.0:8000 core.wsgi
Nginx关键配置:
nginx复制location /static/ {
alias /var/www/static/;
expires 30d;
}
location /media/ {
alias /var/www/media/;
expires 30d;
}
location /api/ {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
}
5.2 缓存策略优化
针对诗词数据的特性,我们设计了三级缓存:
- 内存缓存(高频访问的诗词)
- 数据库缓存(完整诗词数据)
- CDN缓存(静态资源)
Django缓存配置示例:
python复制CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
},
'poem_cache': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'poem_cache_table',
}
}
6. 实际开发中的经验教训
- Django Admin的深度定制:默认的Admin界面不能满足教师端需求,我们通过以下方式增强:
- 自定义ModelAdmin的list_display和search_fields
- 添加批量操作功能
- 集成SimpleUI主题提升用户体验
python复制@admin.register(Poem)
class PoemAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'dynasty')
search_fields = ('title', 'author')
list_filter = ('dynasty',)
actions = ['export_as_csv']
-
Vue组件设计原则:针对教育类应用的特点,我们总结出:
- 保持组件功能单一(如独立的朗读组件、注释组件)
- 使用Vuex管理学习状态
- 合理使用mixin复用公共逻辑
-
MySQL优化技巧:
- 为诗词表的title和author字段添加联合索引
- 使用explain分析慢查询
- 定期优化表结构
sql复制CREATE INDEX idx_poem_search ON poem(title, author);
这个项目最终在上线后获得了很好的反馈,3个月内被50多所小学采用。最大的收获是认识到教育类软件需要特别注重数据的结构化设计和学习过程的可视化呈现。
