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

news/2024/5/19 22:15:33 标签: 课程设计, django, vue.js, sqlite, python, 推荐算法

文章目录

  • 自适应学习系统功能介绍
    • 分权分域
    • 用户管理
    • 考试与练习管理
    • 练习记录管理
    • 学习内容管理
    • 其他功能
    • 管理界面
    • 部分源码展示
    • 完整代码

自适应学习系统功能介绍

这个系统是一个基于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的管理界面,用于管理系统的各种资源。

在这里插入图片描述

部分源码展示

python">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)

完整代码

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


http://www.niftyadmin.cn/n/5321645.html

相关文章

Javaweb的网络投票系统的设计与实现

目的与意义 原始的投票管理基本上是人工操作,效率低下,缺乏方便性,网上投票管理系统运用计算机和其他附加设备,不再需要手工操作,基本上是全自动化,能够节省人力,大大的提高了效率。使投票变得…

函数的秘密

1. 函数的概念 在数学中我们学习过函数,而在C语言中其有着与数学不同的概念: 在C语言中,函数是指一组执行特定任务的语句,这些语句可以重复使用,并且可以在程序的不同部分调用。通过使用函数,程序员可以将…

[Vulnhub靶机] DriftingBlues: 7

[Vulnhub靶机] DriftingBlues: 7靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues7_vh.ova 靶机地址:192.168.67.27 攻击机地址:192.168.67.3 一、信息收集 …

通过区域相减获取缺口

******************************************第一步 初始化************************************************** *读取一张图像 read_image (Hull, hull)*获取图像大小 get_image_size (Hull, Width, Height)*关闭已经打开的窗口 dev_close_window ()*打开一个新的窗口 dev_o…

不同光照下HUD抬头显示器光干扰试验用太阳光模拟器

HUD干扰太阳光模拟器是机载光电系统测试中常见的问题之一。在机载光电系统测试中,太阳光模拟器是一种重要的测试设备,它可以模拟不同光照条件下的机载光电系统性能,为系统优化和调试提供数据支持。然而,当太阳光模拟器与HUD交叉作…

【Python机器学习】分类器的不确定估计——决策函数

scikit-learn接口的分类器能够给出预测的不确定度估计,一般来说,分类器会预测一个测试点属于哪个类别,还包括它对这个预测的置信程度。 scikit-learn中有两个函数可以用于获取分类器的不确定度估计:decidion_function和predict_pr…

NIO核心依赖多路复用小记

NIO允许一个线程同时处理多个连接,而不会因为一个连接的阻塞而导致其他连接被阻塞。核心是依赖操作系统的多路复用机制。 操作系统的多路复用机制 多路复用是一种操作系统的 I/O 处理机制,允许单个进程(或线程)同时监视多个输入…

DNS 域名解析 后续(二)-----主从复制、分离解析

(软件名 bind , 服务名 named) bind主包 yum install bind bind-utils -y 主软件 和 配置包管理软件(工具包) rpm -q bind #检查是否安装dns服务 yum install bind bind-utils -y #安装dns服务,安装bind软件包 &#xff0…