Django+xadmin打造在线教育平台

Posted 老街旧人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django+xadmin打造在线教育平台相关的知识,希望对你有一定的参考价值。

Django+xadmin打造在线教育平台(一)

 

代码

github下载

 一、前言

代码下载: 

开发环境:

    python:  3.6.4

    Django: 2.0.2

后台管理:xadmin

1.1.项目介绍

系统概括:

  • 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心。
  • 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏。可以删除收藏,我的消息。
  • 导航栏: 公开课,授课讲师,授课机构,全局搜索。
  • 点击公开课–> 课程列表,排序-搜索。热门课程推荐,课程的分页。
  • 点击课程–> 课程详情页中对课程进行收藏,取消收藏。富文本展示课程内容。
  • 点击开始学习–> 课程的章节信息,课程的评论信息。课程资源的下载链接。
  • 点击授课讲师–>授课讲师列表页,对讲师进行人气排序以及分页,右边有讲师排行榜。
  • 点击讲师的详情页面–> 对讲师进行收藏和分享,以及讲师的全部课程。
  • 导航栏: 授课机构有分页,排序筛选功能。
  • 机构列表页右侧有快速提交我要学习的表单。
  • 点击机构–> 左侧:机构首页,机构课程,机构介绍,机构讲师。
  • 后台管理系统可以切换主题。左侧每一个功能都有列表显示, 增删改查,筛选功能。
  • 课程列表页可以对不同字段进行排序。选择多条记录进行删除操作。
  • 课程列表页:过滤器->选择字段范围等,搜索,导出csv,xml,json。
  • 课程新增页面上传图片,富文本的编辑。时间选择,添加章节,添加课程资源。
  • 日志记录:记录后台人员的操作

1.2.创建工程

创建工程

python manage.py startproject MxOnline

然后开始项目的开发

二、models设计

 项目的开发都是从models设计开始,后台的管理和前端的渲染无非就是对数据库的增删改查,所以models设计的好坏对整个项目的开发起着至关重要的因素。

下面是我画的图,可以很直观的看出来我们需要的models。

放大显示:

 

 

创建四个app

复制代码
python manage.py startapp users

python manage.py startapp course

python manage.py startapp organization

python manage.py startapp operation
复制代码

然后分别设计每个app的models

2.1.users 用户

自定义userProfile

 系统自动生成的user表如下:

  • id: 主键, password 密码, last_login Django自动记录用户最后登录时间,。
  • is_superuser 表明用户是否是超级用户(后台管理会用到)。
  • username 用户名字段不要随便改动, email 邮箱,
  • is_staff 表示是否是员工(后台管理会用到)。
  • is_active 用户是否是激活状态, date_joined 注册时间。
我们要扩展user表,添加需要的字段

个人中心页面信息:

users/models.py添加代码:

复制代码
# users/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):

    gender_choices = (
        (\'male\',\'男\'),
        (\'female\',\'女\')
    )

    nick_name = models.CharField(\'昵称\',max_length=50,default=\'\')
    birthday = models.DateField(\'生日\',null=True,blank=True)
    gender = models.CharField(\'性别\',max_length=5,choices=gender_choices,default=\'female\')
    adress = models.CharField(\'地址\',max_length=100,default=\'\')
    mobile = models.CharField(\'手机号\',max_length=11,null=True,blank=True)
    image = models.ImageField(upload_to=\'image/%Y%m\',default=\'image/default.png\',max_length=100)

    class Meta:
        verbose_name = \'用户信息\'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username
复制代码

然后做下面的一些设置

因为Image字段需要用到pillow所以需要安装该库

pip install pillow

注册app

复制代码
INSTALLED_APPS = [
    \'django.contrib.admin\',
    \'django.contrib.auth\',
    \'django.contrib.contenttypes\',
    \'django.contrib.sessions\',
    \'django.contrib.messages\',
    \'django.contrib.staticfiles\',
    \'users\'
]
复制代码

重载AUTH_USER_MODEL

AUTH_USER_MODEL = \'users.UserProfile\'

设计数据库为mysql

复制代码
# DATABASES = {
#     \'default\': {
#         \'ENGINE\': \'django.db.backends.sqlite3\',
#         \'NAME\': os.path.join(BASE_DIR, \'db.sqlite3\'),
#     }
# }

DATABASES = {
    \'default\': {
        \'ENGINE\': \'django.db.backends.mysql\',
        \'NAME\': \'mxonline\',        #数据库名字
        \'USER\': \'root\',          #账号
        \'PASSWORD\': \'123456\',      #密码
        \'HOST\': \'127.0.0.1\',    #IP
        \'PORT\': \'3306\',                   #端口
    }
}
复制代码

init.py里面导入pymysql模块

# user/__init__.py

import pymysql
pymysql.install_as_MySQLdb()

迁移数据库

python manage.py makemigrations

python manage.py migrate

user中还需要添加的表(这些功能比较独立):

  • EmailVerifyRecord - 邮箱验证码
  • Banner - 轮播图

 

EmailVerifyRecord   验证码

代码如下:

复制代码
class EmailVerifyRecord(models.Model):
    send_choices = (
        (\'register\',\'注册\'),
        (\'forget\',\'找回密码\')
    )

    code = models.CharField(\'验证码\',max_length=20)
    email = models.EmailField(\'邮箱\',max_length=50)
    send_type = models.CharField(choices=send_choices,max_length=10)
    send_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = \'邮箱验证码\'
        verbose_name_plural = verbose_name
复制代码

Banner   轮播图

代码如下:

复制代码
class Banner(models.Model):
    title = models.CharField(\'标题\',max_length=100)
    image = models.ImageField(\'轮播图\',upload_to=\'banner/%Y%m\',max_length=100)
    url = models.URLField(\'访问地址\',max_length=200)
    index = models.IntegerField(\'顺序\',default=100)
    add_time = models.DateTimeField(\'添加时间\',default=datetime.now)

    class Meta:
        verbose_name = \'轮播图\'
        verbose_name_plural = verbose_name
复制代码

这样users的三张表就创建完了

 写代码要根据PEP8规范

每个class之间要空两格

2.2.Course 课程

课程app中需要四张表

  • Course  课程表
  • Lesson  张杰信息
  • Video    视频
  • CourseResource  课程资源

(1)Course  课程表

 代码如下:

复制代码
from datetime import datetime

from django.db import models


class Course(models.Model):
    DEGREE_CHOICES = (
        ("cj", "初级"),
        ("zj", "中级"),
        ("gj", "高级")
    )
    name = models.CharField("课程名",max_length=50)
    desc = models.CharField("课程描述",max_length=300)
    detail = models.TextField("课程详情")
    degree = models.CharField(\'难度\',choices=DEGREE_CHOICES, max_length=2)
    learn_times = models.IntegerField("学习时长(分钟数)",default=0)
    students = models.IntegerField("学习人数",default=0)
    fav_nums = models.IntegerField("收藏人数",default=0)
    image = models.ImageField("封面图",upload_to="courses/%Y/%m",max_length=100)
    click_nums = models.IntegerField("点击数",default=0)
    add_time = models.DateTimeField("添加时间",default=datetime.now,)

    class Meta:
        verbose_name = "课程"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name
复制代码

(2)Lesson 章节信息表

 代码如下:

复制代码
class Lesson(models.Model):
    course = models.ForeignKey(Course,verbose_name=\'课程\',on_delete=models.CASCADE)
    name = models.CharField("章节名",max_length=100)
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "章节"
        verbose_name_plural = verbose_name

    def __str__(self):
        return \'《{0}》课程的章节 >> {1}\'.format(self.course, self.name)
复制代码

(3)Video 视频

 代码如下:

复制代码
class Video(models.Model):
    lesson = models.ForeignKey(Lesson, verbose_name="章节",on_delete=models.CASCADE)
    name = models.CharField("视频名",max_length=100)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = "视频"
        verbose_name_plural = verbose_name
复制代码

(4)CourseResourse  课程资源

复制代码
class CourseResource(models.Model):
    course = models.ForeignKey(Course, verbose_name="课程",on_delete=models.CASCADE)
    name = models.CharField("名称",max_length=100)
    download = models.FileField("资源文件",upload_to="course/resource/%Y/%m",max_length=100)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = "课程资源"
        verbose_name_plural = verbose_name
复制代码

2.3.organization 机构

总共三张表

  • CourseOrg  课程机构基本信息
  • Teacher       教师基本信息
  • CityDict        城市信息

(1)CourseOrg

 代码如下:

复制代码
class CourseOrg(models.Model):
    name = models.CharField(\'机构名称\',max_length=50)
    desc = models.TextField(\'机构描述\')
    click_nums = models.IntegerField(\'点击数\',default=0)
    fav_nums = models.IntegerField(\'收藏数\',default=0)
    image = models.ImageField(\'封面图\',upload_to=\'org/%Y%m\',max_length=100)
    address = models.CharField(\'机构地址\',max_length=150,)
    city = models.ForeignKey(CityDict,verbose_name=\'所在城市\',on_delete=models.CASCADE)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = \'课程机构\'
        verbose_name_plural = verbose_name
复制代码

(2)CityDict

 代码如下:

复制代码
class CityDict(models.Model):
    name = models.CharField(\'城市\',max_length=20)
    desc = models.CharField(\'描述\',max_length=200)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = \'城市\'
        verbose_name_plural= verbose_name
复制代码

(3)Teacher

 代码如下:

复制代码
class Teacher(models.Model):
    org = models.ForeignKey(CourseOrg,verbose_name=\'所属机构\',on_delete=models.CASCADE)
    name = models.CharField(\'教师名\',max_length=50)
    work_years = models.IntegerField(\'工作年限\',default=0)
    work_company = models.CharField(\'就职公司\',max_length=50)
    work_position = models.CharField(\'公司职位\',max_length=50)
    points = models.CharField(\'教学特点\',max_length=50)
    click_nums = models.IntegerField(\'点击数\',default=0)
    fav_nums = models.IntegerField(\'收藏数\',default=0)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = \'教师\'
        verbose_name_plural = verbose_name

    def __str__(self):
        return "[{0}]的教师: {1}".format(self.org, self.name)
复制代码

2.4.operation

总共五张表

  • UseAsk 用户咨询
  • UserMessage  用户消息表
  • CourseComments 用户评论
  • UserCourse 用户学习的课程
  • UserFavorite 用户收藏

(1)UserAsk

 代码如下:

复制代码
class UserAsk(models.Model):
    name = models.CharField(\'姓名\',max_length=20)
    mobile = models.CharField(\'手机\',max_length=11)
    course_name = models.CharField(\'课程名\',max_length=50)
    add_time = models.DateTimeField(\'添加时间\',default=datetime.now)

    class Meta:
        verbose_name = \'用户咨询\'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name
复制代码

(2)UserMessage

user字段,默认0代表消息是发给所有用户,而不是某个单独的用户;可以通过user.id发给特定用户消息

复制代码
class UserMessage(models.Model):
    user = models.IntegerField(\'接受用户\',default=0)
    message = models.CharField(\'消息内容\',max_length=500)
    has_read = models.BooleanField(\'是否已读\',default=False)
    add_time = models.DateTimeField(\'添加时间\', default=datetime.now)

    class Meta:
        verbose_name = \'用户消息\'
        verbose_name_plural = verbose_name
复制代码

(3)CourseComments

代码如下:

复制代码
class CourseComments(models.Model):
    user = models.ForeignKey(UserProfile,verbose_name=\'用户\',on_delete=models.CASCADE)
    course = models.ForeignKey(Course,verbose_name=\'课程\',on_delete=models.CASCADE)
    comments = models.CharField(\'评论\',max_length=200)
    add_time = models.DateTimeField(\'添加时间\', default=datetime.now)

    class Meta:
        verbose_name = \'课程评论\'
        verbose_name_plural = verbose_name
复制代码

(4)UserCourse

 代码如下:

复制代码
class UserCourse(models.Model):
    user = models.ForeignKey(UserProfile,verbose_name=\'用户\',on_delete=models.CASCADE)
    course = models.ForeignKey(Course,verbose_name=\'课程\',on_delete=models.CASCADE)
    add_time = models.DateTimeField(\'添加时间\', default=datetime.now)

    class Meta:
        verbose_name = \'用户课程\'
        verbose_name_plural = verbose_name
复制代码

(5)UserFavorite

 代码如下:

复制代码
class UserFavorite(models.Model):
    FAV_TYPE = (
        (1,\'课程\'),
        (2,\'课程机构\'),
        (3,\'讲师\')
    )

    user = models.ForeignKey(UserProfile,verbose_name=\'用户\',on_delete=models.CASCADE)
    fav_id = models.IntegerField(\'数据id\',default=0)
    fav_type = models.IntegerField(verbose_name=\'收藏类型\',choices=FAV_TYPE,default=1)
    add_time = models.DateTimeField(\'添加时间\', default=datetime.now)

    class Meta:
        verbose_name = \'用户收藏\'
        verbose_name_plural = verbose_name
复制代码

 上面所有models的完整代码如下:

 users/models.py
 course/models.py
 operations/models.py
 organization/models.py

创建完models后一定要把所有的apps添加到settings的“INSTALLED_APPS”里面

复制代码
INSTALLED_APPS = [
    \'django.contrib.admin\',
    \'django.contrib.auth\',
    \'django.contrib.contenttypes\',
    \'django.contrib.sessions\',
    \'django.contrib.messages\',
    \'django.contrib.staticfiles\',
    \'users\',
    \'course\',
    \'organization\',
    \'operation\',
]
复制代码

迁移到数据库

python manage.py makemigrations

python manage.py migrate

2.5.把四个app放到一个文件夹

创建package: apps

把之前的四个app全部剪切到apps包里面

 不要选“Search for references”

 

去掉searchfor的勾选。拖进去之后会报错,说找不到那些import的模块了。

解决方案:右键MarksourceRoot。根目录下找不到的,会去apps下搜索。

 但是这时候cmd下还是会报错。需要在settings设置

插入第0是希望它先搜索我们app下东西:

import os
import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,os.path.join(BASE_DIR,\'apps\'))

 

再运行就可以成功启动了

 此时的目录

  

以上是关于Django+xadmin打造在线教育平台的主要内容,如果未能解决你的问题,请参考以下文章

Django+xadmin打造在线教育平台

Django+xadmin打造在线教育平台

Django+xadmin打造在线教育平台

Django+xadmin打造在线教育平台

第三百七十九节,Django+Xadmin打造上线标准的在线教育平台—xadmin的安装

Django+xadmin打造在线教育平台