zoukankan      html  css  js  c++  java
  • (项目)在线教育平台(一)

    一、项目介绍

      该项目使用Django+xadmin打造在线教育平台整站,通过该项目的学习可以对Django框架有一个整体的了解,学会使用Django的MVC设计模式,学会使用Django的模板技术来实现前端页面的显示。学习如何就一个项目去合理的进行数据库的设计,以及就前端页面去设计后端接口。学会通过xadmin快速搭建网站的后台管理系统。

      项目整体分为四个模块:用户信息相关模块、机构相关模块、课程相关模块、用户操作相关模块。

      项目功能概括:

        1、首先具有完整的用户登录,邮箱注册以及找回密码功能。

        2、拥有完整的个人中心,个人中心可以修改头像、密码、邮箱,可以看到我的课程、我的收藏及我的消息。

        3、首页导航栏有公开课、授课讲师、授课机构,顶部还有全局搜索。

        4、导航栏点击公开课显示课程的列表、可以对课程进行排序、搜索,还有热门课程的推荐,课程较多可以进行分页。

        5、点击具体的课程可以显示课程的详情页面,该页中可以对课程进行收藏、学习,通过富文本展示课程的详细描述信息。

        6、点击开始学习,进入课程的学习页面,该页有课程的章节信息、评论信息,可以对课程进行评论,可以将课程资源进行下载。

        7、导航栏点击授课讲师,显示所有讲师列表,可以对讲师进行人气排序,讲师过多会进行分页显示,右边有讲师排行榜。

        8、点击某一个讲师,进入讲师详情页面,显示讲师的全部课程,可以对该讲师进行收藏和分享。

        9、导航栏点击授课机构,进入机构的列表页,可以对机构进行排序和筛选。

        10、点击某一个机构,进入机构首页,左侧有导航栏,有机构首页、机构课程、机构介绍、机构讲师。

      项目的开发流程:

        开发环境的搭建--->model数据库的设计--->xadmin搭建后台管理系统并录入数据--->url设计--->form以及modelform表单设计--->template模板设计--->view实现各功能模块--->常见的网络攻击与防护--->项目上线

      开发环境:python3.6.4+django2.0.2

    二、项目环境搭建

      pycharm新建一个项目,创建django项目,指定项目的虚拟环境,点击确定即可创建好一个django框架项目。

      创建好之后,项目的目录结构如下:

      现在django项目已经搭建好了,下面就可以开始开发了。

    三、model数据库设计

    1、创建模块

      项目的开发都是从数据库model设计开始的,model设计的好坏对整个项目的开发起着非常重要的因素。

      在设计model之前需要先创建好项目的四个app(模块),首先在pycharm的工具栏中找到Tools,点击Run manage.py Task这个选项,启动manage.py文件,用这个文件来创建项目的模块,还可以通过这个文件来迁移数据库,还可以创建后台的管理人员账号。

      依次创建四个app:

        startapp users(用户相关模块)

        startapp course(课程相关模块)

        startapp organization(机构相关模块)

        startapp operation(用户操作相关模块)

      创建完成之后,就可以设计每个app的数据库model了

    2、数据库设计

    2.1 users用户设计

      用户app中需要设计三张表:

        UserProfile  用户信息

        EmailVerifyRecord  邮箱验证码

        Banner  轮播图

      通过个人中心页面,可以设计出用户信息相关的model:

      我们可以继承Django已经有的一个类AbstractUser,这个类中有用户相关的一些字段信息,继承这个类后可以自定义我们需要的一些字段,如个人中心中的昵称,生日,性别,地址,手机号,头像,确定好之后就可以编写用户信息的model了,在users/models.py编写数据库设计的代码:

     1 from django.db import models
     2 from django.contrib.auth.models import AbstractUser
     3 
     4 # Create your models here.
     5 
     6 class UserProfile(AbstractUser):
     7     GENDER_CHOICES = (
     8         ('male', ''),
     9         ('female', '')
    10     )
    11 
    12     nick_name = models.CharField('昵称', max_length=50, default='')
    13     birthday = models.DateField('生日', null=True, blank=True)
    14     gender = models.CharField('性别', max_length=10, choices=GENDER_CHOICES, default='male')
    15     address = models.CharField('地址', max_length=100, default='')
    16     mobile = models.CharField('手机号', max_length=11, null=True, blank=True)
    17     image = models.ImageField('头像', upload_to='image/%Y%m', default='image/default.png', max_length=100)
    18 
    19     class Meta:
    20         verbose_name = '用户信息'
    21         verbose_name_plural = verbose_name
    22 
    23     def __str__(self):
    24         return self.username

      因为image字段需要用到pillow库,所以需要先安装pillow库:pip install pillow

      然后将这个app注册到setting.py文件中的INSTALLED_APPS中,然后重载AUTH_USER_MODEL:

    1 INSTALLED_APPS = [
    2     'django.contrib.auth',
    3     'django.contrib.contenttypes',
    4     'django.contrib.sessions',
    5     'django.contrib.messages',
    6     'django.contrib.staticfiles',
    7     'users'
    8 ]
    9 AUTH_USER_MODEL = 'users.UserProfile'

      然后在setting.py文件中配置数据库:

     1 DATABASES = {
     2     'default': {
     3         'ENGINE': 'django.db.backends.mysql',
     4         'NAME': 'mxonline',
     5         'USER': 'root',
     6         'PASSWORD': 'python',
     7         'HOST': '127.0.0.1',
     8         'PORT': '3306'
     9     }
    10 }

      现在就可以迁移数据库了,首先在pycharm的工具栏中找到Tools,点击Run manage.py Task这个选项,启动manage.py文件,用这个文件来执行迁移数据库的命令:

        makemigrations

        migrate

      数据库生成完成。

      然后开始设计EmailVerifyRecord表,这个表的字段有验证码、邮箱、发送的类型、发送的时间:

     1 class EmailVerifyRecord(models.Model):
     2     """邮箱验证码"""
     3     SEND_CHOICES = (
     4         ('register', '注册'),
     5         ('forget', '找回密码')
     6     )
     7 
     8     code = models.CharField('验证码', max_length=20)
     9     email = models.EmailField('邮箱', max_length=50)
    10     send_type = models.CharField('发送类型', max_length=10, choices=SEND_CHOICES)
    11     send_time = models.DateTimeField('发送时间', default=datetime.now)
    12 
    13     class Meta:
    14         verbose_name = '邮箱验证码'
    15         verbose_name_plural = verbose_name

      然后开始设计Banner表,这个表的字段有标题、轮播图片、访问地址、播放顺序、添加时间:

     1 class Banner(models.Model):
     2     """轮播图"""
     3     title = models.CharField('标题', max_length=100)
     4     image = models.ImageField('轮播图', upload_to='banner/%Y%m', max_length=100)
     5     url = models.URLField('访问地址', max_length=200)
     6     index = models.IntegerField('轮播顺序', default=100)
     7     add_time = models.DateTimeField('添加时间', default=datetime.now)
     8 
     9     class Meta:
    10         verbose_name = '轮播图'
    11         verbose_name_plural = verbose_name

      至此,users这个模块的数据库设计完毕,执行迁移数据库的命令生成数据库中的表。

     2.2 course课程设计

      课程app中需要四张表:

        Course  课程信息

        Lesson  章节信息

        Video  视频信息

        CourseResource  课程资源

      在course/models.py文件中编写Course课程相关代码:

     1 from datetime import datetime
     2 
     3 from django.db import models
     4 
     5 # Create your models here.
     6 
     7 class Course(models.Model):
     8     """课程"""
     9     DEGREE_CHOICES = (
    10         ('cj', '初级'),
    11         ('zj', '中级'),
    12         ('gj', '高级')
    13     )
    14 
    15     name = models.CharField('课程名', max_length=50)
    16     desc = models.CharField('课程描述', max_length=300)
    17     detail = models.TextField('课程详情')
    18     degree = models.CharField('课程难度', choices=DEGREE_CHOICES, max_length=2)
    19     learn_times = models.IntegerField('学习时长(分钟数)', default=0)
    20     students = models.IntegerField('学习人数', default=0)
    21     fav_nums = models.IntegerField('收藏人数', default=0)
    22     click_nums = models.IntegerField('点击数', default=0)
    23     image = models.ImageField('封面图', upload_to='courses/%Y/%m', max_length=100)
    24     add_time = models.DateTimeField('添加时间', default=datetime.now)
    25 
    26     class Meta:
    27         verbose_name = '课程'
    28         verbose_name_plural = verbose_name
    29 
    30     def __str__(self):
    31         return self.name
    32 
    33 
    34 class Lesson(models.Model):
    35     """章节"""
    36     course = models.ForeignKey(Course, verbose_name='课程', on_delete=models.CASCADE)
    37     name = models.CharField('章节名', max_length=100)
    38     add_time = models.DateTimeField('添加时间', default=datetime.now)
    39 
    40     class Meta:
    41         verbose_name = '章节'
    42         verbose_name_plural = verbose_name
    43 
    44     def __str__(self):
    45         return '《{}》课程的章节:{}'.format(self.course.name, self.name)
    46 
    47 
    48 class Video(models.Model):
    49     """视频"""
    50     lesson = models.ForeignKey(Lesson, verbose_name='章节', on_delete=models.CASCADE)
    51     name = models.CharField('视频名', max_length=100)
    52     add_time = models.DateTimeField('添加时间', default=datetime.now)
    53 
    54     class Meta:
    55         verbose_name = '视频'
    56         verbose_name_plural = verbose_name
    57 
    58 
    59 class CourseResourse(models.Model):
    60     """课程资源"""
    61     course = models.ForeignKey(Course, verbose_name='课程', on_delete=models.CASCADE)
    62     name = models.CharField('资源名称', max_length=100)
    63     download = models.FileField('资源文件', upload_to='course/resource/%Y/%m', max_length=100)
    64     add_time = models.DateTimeField('添加时间', default=datetime.now)
    65 
    66     class Meta:
    67         verbose_name = '课程资源'
    68         verbose_name_plural = verbose_name
    View Code

      完成之后需要将course这个app注册进settings.py文件中的INSTALLED_APPS,注册进入之后,就可以迁移数据库生成数据库中的表了。

    2.3 organization机构设计

      机构app中需要三张表:

        CourseOrg  课程机构基本信息

        Teacher  教师基本信息

        CityDict  城市信息

      在organization/models.py文件中编写organization机构相关代码:

     1 from datetime import datetime
     2 
     3 from django.db import models
     4 
     5 # Create your models here.
     6 
     7 class CityDict(models.Model):
     8     """城市"""
     9     name = models.CharField('名称', max_length=20)
    10     desc = models.CharField('描述', max_length=200)
    11     add_time = models.DateTimeField('添加时间', default=datetime.now)
    12 
    13     class Meta:
    14         verbose_name = '城市'
    15         verbose_name_plural = verbose_name
    16 
    17 
    18 class CourseOrg(models.Model):
    19     """课程机构"""
    20     name = models.CharField('机构名称', max_length=50)
    21     desc = models.TextField('机构描述')
    22     click_nums = models.IntegerField('点击数', default=0)
    23     fav_nums = models.IntegerField('收藏数', default=0)
    24     image = models.ImageField('封面图', upload_to='org/%Y/%m', max_length=100)
    25     address = models.CharField('地址', max_length=150)
    26     city = models.ForeignKey(CityDict, verbose_name='所在城市', on_delete=models.CASCADE)
    27     add_time = models.DateTimeField('添加时间', default=datetime.now)
    28 
    29     class Meta:
    30         verbose_name = '课程机构'
    31         verbose_name_plural = verbose_name
    32 
    33 
    34 class Teacher(models.Model):
    35     """机构老师"""
    36     org = models.ForeignKey(CourseOrg, verbose_name='所属机构', on_delete=models.CASCADE)
    37     name = models.CharField('老师名', max_length=50)
    38     work_years =models.IntegerField('工作年限', default=0)
    39     work_company = models.CharField('就职公司', max_length=50)
    40     work_position = models.CharField('工作职位', max_length=50)
    41     points = models.CharField('教学特点', max_length=50)
    42     click_nums = models.IntegerField('点击数', default=0)
    43     fav_nums = models.IntegerField('收藏数', default=0)
    44     add_time = models.DateTimeField('添加时间', default=datetime.now)
    45 
    46     class Meta:
    47         verbose_name = '教师'
    48         verbose_name_plural = verbose_name
    49 
    50     def __str__(self):
    51         return '[{}]机构的教师:{}'.format(self.org.name, self.name)
    View Code

      完成之后需要将organization这个app注册进settings.py文件中的INSTALLED_APPS,注册进入之后,就可以迁移数据库生成数据库中的表了。

    2.4 operation用户操作设计

      用户操作app中需要五张表:

        UseAsk  用户咨询相关

        UserMessage  用户消息相关

        CourseComments  用户评论相关

        UserCourse  用户学习的课程相关

        UserFavorite  用户收藏相关

      在operation/models.py文件中编写operation用户操作相关代码:

     1 from datetime import datetime
     2 
     3 from django.db import models
     4 
     5 from users.models import UserProfile
     6 from course.models import Course
     7 
     8 # Create your models here.
     9 
    10 class UserAsk(models.Model):
    11     """用户咨询"""
    12     name = models.CharField('姓名', max_length=20)
    13     mobile = models.CharField('手机', max_length=11)
    14     course_name = models.CharField('课程名', max_length=50)
    15     add_time = models.DateTimeField('添加时间', default=datetime.now)
    16 
    17     class Meta:
    18         verbose_name = '用户咨询'
    19         verbose_name_plural = verbose_name
    20 
    21     def __str__(self):
    22         return self.name
    23 
    24 
    25 class UserMessage(models.Model):
    26     """用户消息"""
    27     user = models.IntegerField('接收用户', default=0)  # 默认0代表发送给所有用户,可以通过user.id发送给指定用户
    28     message = models.CharField('消息内容', max_length=500)
    29     has_read = models.BooleanField('是否已读', default=False)
    30     add_time = models.DateTimeField('添加时间', default=datetime.now)
    31 
    32     class Meta:
    33         verbose_name = '用户消息'
    34         verbose_name_plural = verbose_name
    35 
    36 
    37 class CourseComments(models.Model):
    38     """课程评论"""
    39     user = models.ForeignKey(UserProfile, verbose_name='用户', on_delete=models.CASCADE)
    40     course = models.ForeignKey(Course, verbose_name='课程', on_delete=models.CASCADE)
    41     comments = models.CharField('评论内容', max_length=200)
    42     add_time = models.DateTimeField('添加时间', default=datetime.now)
    43 
    44     class Meta:
    45         verbose_name = '课程评论'
    46         verbose_name_plural = verbose_name
    47 
    48 
    49 class UserCourse(models.Model):
    50     """用户课程"""
    51     user = models.ForeignKey(UserProfile, verbose_name='用户', on_delete=models.CASCADE)
    52     course = models.ForeignKey(Course, verbose_name='课程', on_delete=models.CASCADE)
    53     add_time = models.DateTimeField('添加时间', default=datetime.now)
    54 
    55     class Meta:
    56         verbose_name = '用户课程'
    57         verbose_name_plural = verbose_name
    58 
    59 
    60 class UserFavorite(models.Model):
    61     """用户收藏"""
    62     FAV_CHOICES = (
    63         (1, '课程'),
    64         (2, '课程机构'),
    65         (3, '讲师'),
    66     )
    67     user = models.ForeignKey(UserProfile, verbose_name='用户', on_delete=models.CASCADE)
    68     fav_id = models.IntegerField('数据id', default=0)
    69     fav_type = models.IntegerField(verbose_name='收藏类型', choices=FAV_CHOICES, default=1)
    70     add_time = models.DateTimeField('添加时间', default=datetime.now)
    71 
    72     class Meta:
    73         verbose_name = '用户收藏'
    74         verbose_name_plural = verbose_name
    View Code

      完成之后需要将operation这个app注册进settings.py文件中的INSTALLED_APPS,注册进入之后,就可以迁移数据库生成数据库中的表了。

    2.5 模块规范化

      为了方便管理,将四个模块放到同一个文件夹中,在项目根目录下新建包apps,把这四个模块全部放进这个包中,注意在拖动的时候不要选择Search for references。

      然后将apps这个包右键Mark Directory as,选择Sources Root,让pycharm可以找到这些模块。

      但是如果在其他环境部署的时候会报错,需要在settings.py中进行设置。

    1 import os
    2 import sys
    3 
    4 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    6 sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

      此刻项目的目录结构如下:

  • 相关阅读:
    PHP面向对象之接口 (interface)
    防止继承和覆盖(PHP类)
    对PHP中类、继承、抽象的理解(个人总结)
    AngularJS directive 分页,待续...
    facade(外观)模式
    command (命令)模式
    javascript设计模式 富有表现力的javascript
    AngulatJS $directive compile
    directive talks to controller
    testing
  • 原文地址:https://www.cnblogs.com/Sweltering/p/9949928.html
Copyright © 2011-2022 走看看