自适应学习系统功能介绍

这个系统是一个基于Django框架的Python在线考试和学习平台。vue+django在线学习系统,在线考试系统。数据库使用dbsqlite,分为教师和用户角色,教师可以设置课程章节内容,设置考试题库,设置试卷难度供学生学习。可根据学生错题进行题目推荐。

计算机毕设项目(二)基于django+vue+sqlite实现自适应学习系统,在线考试系统-LMLPHP

分权分域

  • 角色定义: 系统内定义了多种用户角色,如学生、教师、管理员等,每种角色都有其特定的权限和操作范围。
  • 权限管理: 不同角色的用户被授予不同的权限,例如,教师可以创建和管理考试,而学生只能参加考试和查看自己的成绩。
  • 域限制: 用户的操作权限被限制在其特定的域内。例如,一个班级的教师只能管理属于该班级的学生和考试。

用户管理

  • 用户注册(/api/register): 允许新用户在系统中注册。
  • 学生管理(/api/students): 提供学生用户的相关操作。
  • 修改密码(/api/update-pwd): 用户可以通过此接口修改自己的密码。

考试与练习管理

  • 考试管理(/api/exams): 管理在线考试,包括考试的创建、配置和记录。
  • 成绩管理(/api/grades): 提供查看和管理考试成绩的功能。
  • 题目管理:
    • 选择题(/api/choices)
    • 填空题(/api/fills)
    • 判断题(/api/judges)
    • 编程题(/api/programs)
      计算机毕设项目(二)基于django+vue+sqlite实现自适应学习系统,在线考试系统-LMLPHP

练习记录管理

  • 练习记录:
    • 选择题记录(/api/records/choices)
    • 填空题记录(/api/records/fills)
    • 判断题记录(/api/records/judges)
    • 编程题记录(/api/records/programs)
    • 学习记录(/api/records/study)
      计算机毕设项目(二)基于django+vue+sqlite实现自适应学习系统,在线考试系统-LMLPHP

学习内容管理

  • 学习内容目录(/api/content/): 提供学习内容的目录查看。
  • 章节学习内容(/api/learn/): 查看指定章节的学习内容。

其他功能

  • API文档(/api/docs/): 查看系统API的文档。
  • JSON Web Token认证(/api/jwt-auth/): 提供基于JWT的用户认证。
  • 编程题检查(/api/check-program/): 用于编程题答案的自动检查。

管理界面

  • Xadmin(/api/xadmin/): 提供一个基于Django的管理界面,用于管理系统的各种资源。

计算机毕设项目(二)基于django+vue+sqlite实现自适应学习系统,在线考试系统-LMLPHP

部分源码展示

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)

完整代码

需要获取源码的可以关注公众号"一颗程序树",点击菜单栏的免费源码-源码集合的页面中输入关键词考试系统即可

01-13 19:02