django+xadmin在线教育平台慕学网(一)

一、前言

版本:

  Python  3.5

  Django  1.11

台管理:

  xadmin

1.1 项目介绍

  系统概括: 

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

1.2整站模块划分

1.2.1前台功能模块

 

1.3创建django项目

django-admin startproject mxonline

 

二、关于model设计

  users

    -UserProfile(用户信息) :昵称、生日、性别、地址、手机号码、头像

    -EmailVerifyRecord(邮箱验证码):验证码、邮箱、类型(是找回密码还是注册)、时间

    -Banner(轮播图):标题、轮播图、url、顺序、添加时间

  course

    -Course(课程):课程名、描述、详情、课程难度、学习时长

    -Lesson(章节):课程名、章节名、添加时间

    -Video(视频):课程名、视频名、添加时间

    -CourseResource(课程资源):课程名、名称、资源文件、添加时间

  organization

    -CoureseOrg(课程机构):名称、描述、点击数、收藏数、封面图

    -CityDict(城市):名字、描述、添加时间

    -Teacher(教师):所属机构、教师姓名、工作时间、就职公司

  operation

    -UserAsk(用户咨询):名字、手机号、课程名、添加时间

    -CourseComments(课程评论):用户、课程、评论、添加时间

    -UserFavorite(用户收藏):用户、数据id、收藏类型、添加时间

    -UserMessage(用户信息):接受用户、消息内容、是否已读、添加时间

    -Usercourse(用户课程):用户、课程、添加时间

    

  创建上面四个app  

python manage.py startapp users
python manage.py startapp organization
python manage.py startapp course
python manage.py startapp opetation

  创建package:apps -->把四个app拖到apps包里面,不要勾选Search for references

  在apps中右键mark为sourceRoot。在根目录下找不到,回去apps下搜索,然后在settings设置

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'))

   必须安装pymysql 和pillow (因为Image字段需要用到pillow所以需要安装该库)

pip install pymysql
pip install pillow

  

  在settings中修改数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'POST': '3306',
        'USER': 'root',
        'PASSWORD': '123456',
        'NAME': 'mxonline',
    }
}

  在mxonline文件夹下的__init.py__添加mysql,作为数据库

import pymysql
pymysql.install_as_MySQLdb()

  将四个app注册到settings中:  

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users',
    'course',
    'organization',
    'operation',
]

2.1、users表

   django会为我们默认生成数据表,默认生成的数据表有以下字段:

id: 主键、password 密码、 last_login记录用户最后登录时间、
is_superuser 表明用户是否是超级用户、username 用户名字段不要随便改动、
email 邮箱、is_staff 表示是否是员工、
is_active 用户是否是激活状态, date_joined 注册时间

   当我django默认生成的数据表不够我们使用时候,我们需要扩展数据库表

  • apps/users/models.py代码

  

from datetime import datetime

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


class UserProfile(AbstractUser):
  '''用户个人中心''' gender_choices = (('male', '男'), ('female','女')) nick_name = models.CharField(verbose_name='昵称', max_length=50, default='') birthday = models.DateField(verbose_name='生日', null=True, blank=True) gender = models.CharField(verbose_name='性别', max_length=10, choices=gender_choices, default='female') address = models.CharField(verbose_name='地址', max_length=100, default='') mobile = models.CharField(verbose_name='手机号', 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 class EmailVerifyRecord(models.Model):
  '''验证码''' send_choices =(('register', '注册'), ('forget', '找回密码')) code = models.CharField(verbose_name='验证码', max_length=20) email = models.EmailField(verbose_name='邮箱', 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 class Bnner(models.Model): '''image上传文件,url保存图片路径,index控制轮播图的播放顺序''' title = models.CharField(verbose_name="标题", max_length=100) image = models.ImageField(verbose_name='轮播图', upload_to='banner/%Y%m', max_length=100) url = models.URLField(verbose_name='访问地址', max_length=200) index = models.IntegerField(verbose_name='顺序', default=100) add_time = models.DateTimeField(verbose_name='添加时间', default=datetime.now) class Meta: verbose_name = '轮播图' verbose_name_plural = verbose_name

  在setttings中,重载AUTH_USER_MODEL

AUTH_USER_MODEL = 'users.UserProfile'

 2.2、course 表

  

  • apps/course/models.py代码

  

from datetime import datetime

from django.db import models

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

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

    def __str__(self):
        return self.name


class Lesson(models.Model):
    '''章节信息表'''
    course = models.ForeignKey(Course)
    name = models.CharField(verbose_name="章节名", max_length=100)
    add_time = models.DateTimeField(verbose_name="添加时间", default=datetime.now)

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

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


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

    class Meta:
        verbose_name = "视频"
        verbose_name_plural = verbose_name


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

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

  

2.3、organization

  • apps/organization/models.py代码
from datetime import datetime

from django.db import models

class CityDict(models.Model):
    '''城市信息'''
    name = models.CharField(verbose_name='城市',max_length=20)
    desc = models.CharField(verbose_name='描述',max_length=200)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = '城市'
        verbose_name_plural= verbose_name


class CourseOrg(models.Model):
    '''课程机构基本信息'''
    name = models.CharField(verbose_name='机构名称',max_length=50)
    desc = models.TextField(verbose_name='机构描述')
    click_nums = models.IntegerField(verbose_name='点击数',default=0)
    fav_nums = models.IntegerField(verbose_name='收藏数',default=0)
    image = models.ImageField(verbose_name='封面图',upload_to='org/%Y%m',max_length=100)
    address = models.CharField(verbose_name='机构地址',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


class Teacher(models.Model):
    '''教师基本信息'''
    org = models.ForeignKey(CourseOrg,verbose_name='所属机构',on_delete=models.CASCADE)
    name = models.CharField(verbose_name='教师名',max_length=50)
    work_years = models.IntegerField(verbose_name='工作年限',default=0)
    work_company = models.CharField(verbose_name='就职公司',max_length=50)
    work_position = models.CharField(verbose_name='公司职位',max_length=50)
    points = models.CharField(verbose_name='教学特点',max_length=50)
    click_nums = models.IntegerField(verbose_name='点击数',default=0)
    fav_nums = models.IntegerField(verbose_name='收藏数',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 

  • apps/operation/models.py代码
from django.db import models
from users.models import UserProfile
from course.models import Course

from datetime import datetime


class UserAsk(models.Model):
    '''用户咨询'''
    name = models.CharField(verbose_name='姓名',max_length=20)
    mobile = models.CharField(verbose_name='手机',max_length=11)
    course_name = models.CharField(verbose_name='课程名',max_length=50)
    add_time = models.DateTimeField(verbose_name='添加时间',default=datetime.now)

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

    def __str__(self):
        return self.name


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

    class Meta:
        verbose_name = '用户消息'
        verbose_name_plural = verbose_name


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(verbose_name='评论',max_length=200)
    add_time = models.DateTimeField(verbose_name='添加时间', default=datetime.now)

    class Meta:
        verbose_name = '课程评论'
        verbose_name_plural = verbose_name


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


class UserFavorite(models.Model):
    '''用户收藏'''
    FAV_TYPE = ((1,'课程'),(2,'课程机构'),(3,'讲师'))
    user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
    fav_id = models.IntegerField(verbose_name='数据id',default=0)
    fav_type = models.IntegerField(verbose_name='收藏类型',choices=FAV_TYPE,default=1)
    add_time = models.DateTimeField(verbose_name='添加时间', default=datetime.now)

    class Meta:
        verbose_name = '用户收藏'
        verbose_name_plural = verbose_name

  

   对模型进行迁移:

python manage.py makemigrations
python manage.py migrate

  

  

 

 

 

 

 

 

posted @ 2018-05-30 14:25  今晚打老虎i2016  阅读(884)  评论(0编辑  收藏  举报