# OnlineLearningSystem **Repository Path**: han_ming_bao/OnlineLearningSystem ## Basic Information - **Project Name**: OnlineLearningSystem - **Description**: 在线学习系统,使用django开发 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2023-01-07 - **Last Updated**: 2025-03-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: Django, Python, Redis ## README # 毕业设计 传统的教学模式在信息共享和互动性等方面存在着诸多的不足之处。网络教学平台不仅轻松地解决了信息资料的共享问题,而且提高了师生之间的互动性,成为教学实践的辅助平台,为此,开发一个《程序设计基础》课程在线学习系统,该系统主要内容及功能包括如下: 1. 用户管理。包括教师用户、管理员用户的信息添加、修改、删除等操作,学生用户的注册管理功能; 2. 资源管理。教师登录系统后,可以发布作业、上传课件等教学资源,以及对资源的修改、删除等操作;学生登录系统,可以下载教学资源,上传作业等操作; 3. 作业批改管理。教师登录系统后,可对学生提交的作业进行评价和评分; 4. 讨论管理。教师登录系统后,可以随着课程进度发布讨论问题,学生对讨论问题可以自由发言发表评论,系统能根据学生参与讨论活动次数给出经验值,教师也可以根据学生评论内容的正确性赋予分值; 5. 查询、统计管理。学生登录系统后,能查询作业成绩和参与讨论分值;教师可以对学生的平时作业成绩和参与问题讨论情况进行分类统计; 6. 系统应有良好的用户界面。 ## 在线教育平台 ### 需求分析 时间2022.12.11 #### app设计 image-20221211214357986 #### 项目结构 ![image-20221211222134120](http://cdn.xinlanteng.com/markDowm/202212112221422.png) settings.py ```python #apps模块注册 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] #数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'xinglanteng', # 数据库名字 'USER': 'root', 'PASSWORD': 'WF6BCSqO', 'HOST': '47.109.58.82', # 那台机器安装了MySQL 'PORT': 3306, } } #静态文件目录 STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) ``` ### 数据库设计 image-20221211203652714 #### 循环引用 models存在相互引用关系 image-20221212204238982 解决循环引用使用分层设计 image-20221212204429525 #### 用户相关 Django默认自带user表字段 ![image-20221211230225869](http://cdn.xinlanteng.com/markDowm/202212112302095.png) 自己生成的user表可以继承上述字段 ##### user.models.py ```python from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. # 复用Django自带的user字段 class UserProfile(AbstractUser): GENDER_CHOICES = ( ("male", "男"), ("female", "女") ) nick_name = models.CharField(max_length=50, verbose_name="昵称", default="") birthday = models.DateField(verbose_name="生日", null=True, blank=True) gender = models.CharField(verbose_name="性别", choices=GENDER_CHOICES, max_length=6) address = models.CharField(max_length=100, verbose_name="地址", default="") mobile = models.CharField(max_length=11, unique=True, verbose_name="手机号码") image = models.ImageField(upload_to="head_image/%Y/%m", default="head_image/default.png") class Meta: verbose_name = "用户信息" verbose_name_plural = verbose_name def __str__(self): return self.username #公用字段设计在最底层不会产生循环引用 class BaseModel(models.Model): add_time = models.DateTimeField(verbose_name="添加时间", default=datetime.now) ``` 使用上述继承需要在settings.py ```python # 指明使用的user表 AUTH_USER_MODEL = "users.UserProfile" ``` 生成的user表 ![image-20221211232431671](http://cdn.xinlanteng.com/markDowm/202212112324813.png) #### 课程相关 对应关系(实体1 <对应关系 > 实体2) | 实体 | 对应关系 | | -------------------------------------------- | -------- | | 课程(Course)与 章节(Lesson) | 1对多 | | 章节(Lesson) 与 视频(Video) | 1对多 | | 课程资源(CoursesResource) 与 课程(Course) | 多对1 | | 课程(Course)与讲师(Teacher) | 1对1 | ##### courses model.py ```python from django.db import models # Create your models here. from apps.users.models import BaseModel degree_chioes = (('cj', '初级'), ('zj', '中级'), ('gj', '高级')) # 课程信息 class Courses(BaseModel): name = models.CharField(verbose_name="课程名", max_length=50) desc = models.CharField(verbose_name="课程描述", max_length=300) degree = models.CharField(verbose_name="难度", choices=degree_chioes, max_length=2) students = models.IntegerField(verbose_name="学习人数", default=0) fav_nums = models.IntegerField(verbose_name="收藏人数", default=0) click_nums = models.IntegerField(verbose_name="点击数", default=0) category = models.CharField(verbose_name="课程类型", max_length=20, default=u"后端开发") tag = models.CharField(verbose_name="课程标签", max_length=10) youneed_know = models.CharField(verbose_name="课程须知", max_length=300, default="") teacher_tell = models.CharField(verbose_name="老师告诉你", max_length=300, default="") detail = models.TextField(verbose_name="课程详情") image = models.ImageField(verbose_name="封面图", upload_to="courses/%Y/%m") class Meta: verbose_name = "课程信息" verbose_name_plural = verbose_name # 课程章节 课程信息 1对多课程章节 class Lesson(BaseModel): course = models.ForeignKey(Courses, on_delete=models.CASCADE,verbose_name="课程") # 级联删除 name = models.CharField(verbose_name=u"章节名", max_length=100) learn_times = models.IntegerField(verbose_name="学习时长", default=0) class Meta: verbose_name = "课程章节" verbose_name_plural = verbose_name # 视频视频 课程信息 1对多 章节视频 class Video(BaseModel): lesson = models.ForeignKey(Lesson, verbose_name="章节", on_delete=models.CASCADE) name = models.CharField(verbose_name="视频名", max_length=100) learn_times = models.IntegerField(default=0, verbose_name="学习时长(分钟数)") url = models.CharField(max_length=200, verbose_name="访问地址") [输入链接说明](http://) class Meta: verbose_name = "视频" verbose_name_plural = verbose_name # 课程资源 课程 1对多 课程资源 class CourseResourse(BaseModel): course = models.ForeignKey(Courses, on_delete=models.CASCADE,verbose_name="课程") # 级联删除 name = models.CharField(verbose_name="名称", max_length=100) file = models.FileField(verbose_name="下载地址", upload_to="courses/resourse/%Y/%m",max_length=200) class Meta: verbose_name = "课程资源" verbose_name_plural = verbose_name ``` #### 机构相关 2022.12.12 23:30 对应关系(实体1 <对应关系 > 实体2) | 实体 | 对应关系 | | ---------------------------------------- | -------- | | 课程机构(CourseOrg)与 所在城市(City) | 多对多 | ##### organization models.py ```python from django.db import models from apps.users.models import BaseModel from datetime import datetime # Create your models here. category_chioes = (('pxjg', "培训机构"), ('gx', '高校'), ('gr', '个人')) # 城市 class City(BaseModel): name = models.CharField(verbose_name="城市", max_length=20) desc = models.CharField(max_length=200, verbose_name="描述") class Meta: verbose_name = "城市" verbose_name_plural = verbose_name # 授课机构 1对多 城市 class CourseOrg(BaseModel): city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name="城市") name = models.CharField(max_length=50, verbose_name="机构名称") desc = models.TextField(verbose_name="描述") tag = models.CharField(verbose_name="机构标签", default="全国知名",max_length=10) category = models.CharField(verbose_name="机构类别", choices=category_chioes, default="pxjg", max_length=4) fav_nums = models.IntegerField(verbose_name="收藏人数", default=0) click_nums = models.IntegerField(verbose_name="点击数", default=0) students = models.IntegerField(verbose_name="学习人数", default=0) courses_num = models.IntegerField(verbose_name="课程数", default=0) address = models.CharField(verbose_name="地址", max_length=150) class Meta: verbose_name = "课程机构" verbose_name_plural = verbose_name # 机构教师 多对1 授课机构 class Teacher(models.Model): org = models.ForeignKey(CourseOrg, on_delete=models.CASCADE,verbose_name=u"所属机构") name = models.CharField(max_length=50, verbose_name=u"教师名") work_years = models.IntegerField(default=0, verbose_name=u"工作年限") work_company = models.CharField(max_length=50, verbose_name=u"就职公司") work_position = models.CharField(max_length=50, verbose_name=u"公司职位") points = models.CharField(max_length=50, verbose_name=u"教学特点") click_nums = models.IntegerField(default=0, verbose_name=u"点击数") fav_nums = models.IntegerField(default=0, verbose_name=u"收藏数") age = models.IntegerField(default=18, verbose_name=u"年龄") image = models.ImageField(default='', upload_to="teacher/%Y/%m", verbose_name=u"头像", max_length=100) add_time = models.DateTimeField(default=datetime.now) class Meta: verbose_name = u"教师" verbose_name_plural = verbose_name ``` #### 用户操作相关 2022.12.16 21:30 ##### operation models.py ```python from datetime import datetime from django.contrib.auth import get_user_model # 通过具体使用哪个model就去调用哪个model from django.db import models # Create your models here. from apps.courses.models import Courses class UserAsk(models.Model): name = models.CharField(max_length=20, verbose_name=u"姓名") mobile = models.CharField(max_length=11, verbose_name=u"手机") course_name = models.CharField(max_length=50, verbose_name=u"课程名") add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") class Meta: verbose_name = u"用户咨询" verbose_name_plural = verbose_name UserProfile = get_user_model() class CourseComments(models.Model): "课程评论" user = models.ForeignKey(UserProfile,on_delete=models.CASCADE, verbose_name=u"用户") course = models.ForeignKey(Courses, on_delete=models.CASCADE,verbose_name=u"课程") comments = models.CharField(max_length=200, verbose_name=u"评论") add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") class Meta: verbose_name = u"课程评论" verbose_name_plural = verbose_name class UserFavorite(models.Model): user = models.ForeignKey(UserProfile, on_delete=models.CASCADE,verbose_name=u"用户") fav_id = models.IntegerField(default=0, verbose_name=u"数据id") fav_type = models.IntegerField(choices=((1, "课程"), (2, "课程机构"), (3, "讲师")), default=1, verbose_name=u"收藏类型") add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") class Meta: verbose_name = u"用户收藏" verbose_name_plural = verbose_name class UserMessage(models.Model): user = models.IntegerField(default=0, verbose_name=u"接收用户") message = models.CharField(max_length=500, verbose_name=u"消息内容") has_read = models.BooleanField(default=False, verbose_name=u"是否已读") add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") class Meta: verbose_name = u"用户消息" verbose_name_plural = verbose_name class UserCourse(models.Model): user = models.ForeignKey(UserProfile, verbose_name=u"用户",on_delete=models.CASCADE) course = models.ForeignKey(Courses, verbose_name=u"课程",on_delete=models.CASCADE) add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") class Meta: verbose_name = u"用户课程" verbose_name_plural = verbose_name ``` ### 系统开发 #### 登录与注册 **粗体**