# 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设计
#### 项目结构

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"),
)
```
### 数据库设计
#### 循环引用
models存在相互引用关系
解决循环引用使用分层设计
#### 用户相关
Django默认自带user表字段

自己生成的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表

#### 课程相关
对应关系(实体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
```
### 系统开发
#### 登录与注册
**粗体**