Python世界答题详情优化指南 🐍
优化代码提交与展示逻辑,让学习轨迹更加清晰可见
📋 前言
在Python世界的学习之旅中,每道题目的解答都记录着你的成长足迹。最近我们对系统进行了重要优化,让用户的答题体验更加流畅和直观。本文将详细介绍这些改进,以及它们如何帮助你更好地追踪学习进度。
🔧 原系统存在的问题
在优化前,我们的系统存在两个主要限制:
- 只能显示第一次正确提交 - 即使后续有更优雅的解法,也只能看到最初的代码
- 答对后不再记录新提交 - 一旦答对题目,后续提交不会保存到数据库
这些问题限制了用户回顾自己代码演进的能力,也无法展示改进后的解决方案。
🎯 优化一:显示最近一次正确提交
原代码(显示第一次正确提交):
submission = Submission.objects.filter(
user=user,
problem=problem,
result=True
).first() # 获取第一条记录
优化后代码(显示最近一次正确提交):
submission = Submission.objects.filter(
user=user,
problem=problem,
result=True
).order_by('-submit_time').first() # 按时间降序获取第一条
✨ 优化效果:
- 时间线清晰:展示最新的解题思路
- 进步可见:对比不同时期的代码质量提升
- 学习追踪:记录解题能力的演进过程
🎯 优化二:持续记录所有提交
原逻辑限制:
# 一旦答对过,就不再保存新提交
if not user_is_corret:
submission.save() # 只有从未答对时才保存
else:
# 不保存任何记录
新逻辑优化:
# 无论之前是否答对,都保存每次提交
submission = Submission(
user=user,
problem=problem,
code=code,
result=all(test_results)
)
submission.save() # 总是保存记录
# 只在首次答对时加分,避免重复加分
if submission.result and not user_has_ever_correct:
user.score += problem.score
user.save()
🔄 流程对比:
| 阶段 | 原系统 | 优化后系统 |
|---|---|---|
| 第一次提交(错误) | ✅ 保存 | ✅ 保存 |
| 第一次提交(正确) | ✅ 保存 + 加分 | ✅ 保存 + 加分 |
| 第二次提交(正确) | ❌ 不保存 | ✅ 保存(不加分) |
| 第三次提交(更优解法) | ❌ 不保存 | ✅ 保存(不加分) |
📊 数据库设计优化建议
为了支持这些功能,我们建议的Submission模型结构:
class Submission(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
code = models.TextField() # 用户提交的代码
result = models.BooleanField(default=False) # 是否正确
submit_time = models.DateTimeField(auto_now_add=True) # 提交时间
execution_time = models.FloatField(null=True) # 执行时间(可选)
memory_usage = models.IntegerField(null=True) # 内存使用(可选)
class Meta:
ordering = ['-submit_time'] # 默认按时间降序排列
🚀 性能优化技巧
1. 使用annotate避免N+1查询问题
from django.db.models import Count, Q
correct_users = User.objects.filter(
submission__problem=problem,
submission__result=True
).annotate(
correct_count=Count('submission', filter=Q(
submission__problem=problem,
submission__result=True
))
).distinct()
2. 添加数据库索引提升查询速度
class Submission(models.Model):
# ... 字段定义
class Meta:
indexes = [
models.Index(fields=['user', 'problem', 'result', '-submit_time']),
models.Index(fields=['submit_time']),
]
3. 防止频繁提交
from django.core.cache import cache
@csrf_exempt
def submit_code(request):
if request.method == 'POST':
user_id = request.session['user']['id']
problem_id = request.POST.get('id', '')
# 设置5秒内不能重复提交
cache_key = f"submit_lock_{user_id}_{problem_id}"
if cache.get(cache_key):
return JsonResponse({'error': '请稍后再试'}, status=429)
cache.set(cache_key, True, 5)
# ... 其余提交逻辑
🌟 用户体验提升
前端展示建议:
<!-- 显示最近正确提交的时间 -->
<div class="last-correct">
<span class="icon">✅</span>
<span>最近一次正确提交:{{ submission.submit_time|timesince }}前</span>
</div>
<!-- 显示提交历史 -->
<div class="submission-history">
<h4>📊 提交历史</h4>
<ul>
{% for sub in recent_submissions %}
<li class="{% if sub.result %}correct{% else %}wrong{% endif %}">
{{ sub.submit_time|date:"Y-m-d H:i" }} -
{{ sub.result|yesno:"✅正确,❌错误" }}
</li>
{% endfor %}
</ul>
</div>
📈 数据统计功能
优化后,我们可以提供更多有价值的统计数据:
# 统计用户的答题趋势
def get_user_statistics(user):
stats = {
'total_submissions': Submission.objects.filter(user=user).count(),
'correct_submissions': Submission.objects.filter(user=user, result=True).count(),
'recent_improvements': Submission.objects.filter(
user=user,
result=True
).values('problem').annotate(
last_submit=Max('submit_time'),
first_submit=Min('submit_time')
).count(),
}
return stats
💡 最佳实践建议
- 定期清理旧数据 - 对于频繁提交的用户,可考虑只保留最近N次提交
- 代码差异对比 - 实现代码对比功能,展示不同提交间的差异
- 分享优秀解法 - 允许用户将最优解法标记为"可分享"
- 学习路径分析 - 基于提交数据推荐下一道适合的题目
🎉 总结
通过这次优化,Python世界现在能够:
✅ 完整记录每个用户的每次提交
✅ 智能展示最近一次的正确解法
✅ 避免重复加分的同时保留完整历史
✅ 提供丰富的学习数据和分析
这些改进让Python世界不仅仅是一个答题平台,更成为了记录和见证你编程技能成长的数字日记。每一次提交,都是向编程大师之路迈进的一步!
🚀 开始你的优化之旅吧!
在Python世界的每一行代码,都将成为你技能树上的一片叶子。不断提交,不断优化,让我们一起见证你的成长轨迹!
💻 代码有记忆,努力有痕迹。在Python世界,你的每一份付出都被认真记录。
请登录后发表评论
登录后你可以点赞、回复其他评论