自适应学习系统功能介绍
这个系统是一个基于Django框架的Python在线考试和学习平台。vue+django在线学习系统,在线考试系统。数据库使用dbsqlite,分为教师和用户角色,教师可以设置课程章节内容,设置考试题库,设置试卷难度供学生学习。可根据学生错题进行题目推荐。
分权分域
- 角色定义: 系统内定义了多种用户角色,如学生、教师、管理员等,每种角色都有其特定的权限和操作范围。
- 权限管理: 不同角色的用户被授予不同的权限,例如,教师可以创建和管理考试,而学生只能参加考试和查看自己的成绩。
- 域限制: 用户的操作权限被限制在其特定的域内。例如,一个班级的教师只能管理属于该班级的学生和考试。
用户管理
- 用户注册(/api/register): 允许新用户在系统中注册。
- 学生管理(/api/students): 提供学生用户的相关操作。
- 修改密码(/api/update-pwd): 用户可以通过此接口修改自己的密码。
考试与练习管理
- 考试管理(/api/exams): 管理在线考试,包括考试的创建、配置和记录。
- 成绩管理(/api/grades): 提供查看和管理考试成绩的功能。
- 题目管理:
- 选择题(/api/choices)
- 填空题(/api/fills)
- 判断题(/api/judges)
- 编程题(/api/programs)
练习记录管理
- 练习记录:
- 选择题记录(/api/records/choices)
- 填空题记录(/api/records/fills)
- 判断题记录(/api/records/judges)
- 编程题记录(/api/records/programs)
- 学习记录(/api/records/study)
学习内容管理
- 学习内容目录(/api/content/): 提供学习内容的目录查看。
- 章节学习内容(/api/learn/): 查看指定章节的学习内容。
其他功能
- API文档(/api/docs/): 查看系统API的文档。
- JSON Web Token认证(/api/jwt-auth/): 提供基于JWT的用户认证。
- 编程题检查(/api/check-program/): 用于编程题答案的自动检查。
管理界面
- Xadmin(/api/xadmin/): 提供一个基于Django的管理界面,用于管理系统的各种资源。
部分源码展示
import subprocess
import json
import os
from django.db.models import F
from django.http import JsonResponse
from rest_framework import mixins, viewsets
from rest_framework.response import Response
from rest_framework.views import APIView
from datetime import datetime
from study.models import Study
from study.serializers import StudySerializer
from study.utils import get_list_from_tree, update_tree, write_json_to_file
from record.models import StudyRecord
# Create your views here.
class StudyListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""选择题列表页"""
# 这里要定义一个默认的排序,否则会报错
queryset = Study.objects.all().order_by('id')[:0]
# 序列化
serializer_class = StudySerializer
# 重写queryset
def get_queryset(self):
# 题目数量
choice_number = int(self.request.query_params.get("choice_number", 0))
level = int(self.request.query_params.get("level", 1))
content = self.request.query_params.get("content", 0)
if choice_number:
self.queryset = Study.objects.all().filter(level=level).order_by('?')[:choice_number]
return self.queryset
class ContentView(APIView):
def get(self, request):
with open("./study/content.json","r", encoding="utf-8") as f:
content = json.load(f)
# 获取数据库中的最大id
max_id = Study.objects.all().order_by("-id")[0].id
# 获取树形结构拆解后的列表
wrap_content = get_list_from_tree(content)
# 将数据库中的数据更新到树形结构中
student_id = request.query_params.get("student_id")
# 在studyRecord中查询学生的学习记录
study_record = StudyRecord.objects.filter(student_id=student_id)
for item in wrap_content:
item["is_study"] = False
item["study_times"] = 0
item["study_time"] = "--"
for record in study_record:
if item.get("id") == record.study_id_id:
item["is_study"] = True
item["study_times"] = record.study_times
item["study_time"] = record.study_time
# 将wrap_content根据study_time和study_times排序
wrap_content = sorted(wrap_content, key=lambda x: (x["study_times"], x["id"]), reverse=True)
res = {
"code": 200,
"msg": "success",
"data": {
"tree":content,
"table": wrap_content,
},
"max_id": max_id
}
return JsonResponse(res)
def post(self, request):
new_content = request.data.get("content")
desc = request.data.get("desc")
name = request.data.get("name")
_id = request.data.get("_id")
# 遍历树修改值
new_content = update_tree(new_content, int(_id), "label", name)
# 有新的内容则更新本地json
if new_content:
write_json_to_file(new_content, "./study/content.json")
new_content = get_list_from_tree(new_content)
# 有新的内容则更新数据库
for item in new_content:
# update the database use django orm
Study.objects.update_or_create(
id=item.get("id"),
defaults={
"name": item.get("label"),
}
)
if desc:
Study.objects.filter(id=_id).update(desc=desc)
if name:
Study.objects.filter(id=_id).update(name=name)
res = {
"code": 200,
"msg": "success",
"data": new_content
}
return JsonResponse(res)
class LearnView(APIView):
# 根据目录获取章节内容以及学习次数
def get(self, request):
_id = request.query_params.get("id")
student_id = request.query_params.get("student_id")
desc = Study.objects.filter(id=_id).first()
student_info = StudyRecord.objects.filter(student_id=int(student_id), study_id_id=int(_id)).first()
if student_info:
study_times = student_info.study_times
study_time = student_info.study_time
else:
study_times = 0
study_time = "--"
res = {
"code": 200,
"msg": "success",
"data": {
"desc": desc.desc,
"points": desc.relate_points,
"study_times": study_times,
"study_time": study_time
}
}
return JsonResponse(res)
# post请求将更新数据库中的学习次数以及学习记录
def post(self, request):
res = {
"code": 200,
"msg": "success"
}
try:
study_id = request.data.get("study_id")
student_id = request.data.get("student_id")
record= StudyRecord.objects.filter(study_id_id=study_id, student_id=student_id).first()
if record:
record.study_times = F("study_times") + 1
record.study_time = datetime.now()
record.save()
else:
StudyRecord.objects.create(study_id_id=study_id, student_id=student_id)
except Exception as e:
res["code"] = 500
res["msg"] = str(e)
return JsonResponse(res)
完整代码
需要获取源码的可以关注公众号"一颗程序树",点击菜单栏的免费源码-源码集合的页面中输入关键词考试系统即可