xadmin塑造在线教育平台

目录

Django+xadmin营造在线教育平台(一),djangoxadmin

在线教育平台(大器晚成) 
 
  在线教育平台(二)

 一、前言

 开拓条件:

    python:  3.6.4

    Django: 2.0.2

后台管理:xadmin

在线教育平台(三) 
 
  在线教育平台(四)

1.1.类型介绍

系统包罗:

  • 系统有着完全的客户登入注册以致找回密码作用,具有完全个人基本。
  • 民用大旨:
    改进头像,修改密码,纠正邮箱,能够看来本身的课程甚至本身的收藏。能够去除收藏,小编的音讯。
  • 导航栏: 公开课,授课教师,授课机构,全局找寻。
  • 点击公开课–> 课程列表,排序-搜索。抢手课程推荐,课程的分页。
  • 点击课程–>
    课程详细情况页中对学科实行收藏,废除收藏。富文本浮现课程内容。
  • 点击开始学习–>
    课程的章节消息,课程的评说新闻。课程资源的下载链接。
  • 点击授课讲师–>授课教授列表页,对教师举行人气排序以致分页,侧边有教授排名榜。
  • 点击讲师的详情页面–> 对助教进行收藏和享受,以致教师的满贯学科。
  • 导航栏: 授课机构有分页,排序筛选成效。
  • 机关列表页左侧有快捷提交自身要学习的表单。
  • 点击机构–> 右边:机构首页,机构课程,机构介绍,机构教师。
  • 后台管理种类能够切换主题。右侧每三个效应都有列表突显,
    增加和删除改查,筛选成效。
  • 学科列表页能够对分歧字段进行排序。接纳多条记下举行删减操作。
  • 学科列表页:过滤器->选取字段范围等,寻觅,导出csv,xml,json。
  • 课程新添页面上传图片,富文本的编辑撰写。时直接纳,加多章节,增加课程能源。
  • 日记记录:记录后台人士的操作

图片 1

图片 2

在线教育平台(五) 
 
  在线教育平台(六)

1.2.创制工程

始建工程

python manage.py startproject MxOnline

下一场开头项指标开荒

在线教育平台(七) 
 
  在线教育平台(八)

二、models设计

 项指标开销都以从models设计起始,后台的拘禁和前端的渲染无非便是对数据库的增加和删除改查,所以models设计的优劣对整个项目标付出起着举足轻重的成分。

上边是自身画的图,能够很直观的看出来大家必要的models。

图片 3

放大展现:

 图片 4

图片 5

 

创设三个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表如下:

图片 6

  • id: 主键, password 密码, last_login
    Django自动记录客商最终登入时间,。
  • is_superuser 申明客户是还是不是是拔尖客商(后台管理会用到卡塔尔(英语:State of Qatar)。
  • username 客户名字段不要随意修改, email 邮箱,
  • is_staff 表示是或不是是职员和工人(后台管理会用到卡塔尔国。
  • is_active 客户是不是是激活状态, date_joined 注册时间。

咱俩要强大user表,增添须求的字段

村办核心页面音讯:

图片 7

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中还亟需丰裕的表(这一个成效相比较独立卡塔尔(英语:State of Qatar):

  • 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标准

图片 8

各个class之间要空两格

图片 9

代码

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

github下载

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的完好代码如下:

图片 10#
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(‘昵称’,max_length=50,default=”) birthday =
models.DateField(‘生日’,null=True,blank=True) gender =
models.CharField(‘性别’,max_length=10,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 class
EmailVerifyRecord(models.Model): send_choices = ( (‘register’,’注册’卡塔尔(英语:State of Qatar),
(‘forget’,’找回密码’卡塔尔国 卡塔尔 code = models.Char菲尔德(‘验证码’,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 class
Banner(models.Model): title = models.CharField(‘标题’,max_length=100)
image =
models.ImageField(‘轮播图’,upload_to=’banner/%Y%m’,max_length=100卡塔尔国 url
= models.ULX570L菲尔德(‘访谈地址’,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/models.py
图片 11#
course/models.py 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卡塔尔(英语:State of Qatar) 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 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卡塔尔(英语:State of Qatar): 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(“视频名”,max_length=100) add_time =
models.DateTimeField(“增添时间”, 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(“名称”,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
course/models.py
图片 12#
operation/models.py from datetime import datetime from django.db import
models from course.models import Course from users.models import
UserProfile 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.DateTime菲尔德(‘增添时间’,default=datetime.now卡塔尔 class Meta:
verbose_name = ‘客户咨询’ verbose_name_plural = verbose_name def
__str__(self): return self.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(‘评论’,max_length=200) add_time =
models.DateTimeField(‘增加时间’, default=datetime.now卡塔尔国 class Meta:
verbose_name = ‘课程争辨’ verbose_name_plural = verbose_name class
UserFavorite(models.Model): FAV_TYPE = ( (1,’课程’卡塔尔国, (2,’课程机构’卡塔尔(英语:State of Qatar),
(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.Date提姆eField(‘增添时间’, default=datetime.now卡塔尔(英语:State of Qatar) class
Meta: verbose_name = ‘客商收藏’ verbose_name_plural = verbose_name
class UserMessage(models.Model卡塔尔(قطر‎: user =
models.IntegerField(‘选择顾客’,default=0卡塔尔(英语:State of Qatar) message =
models.CharField(‘音讯内容’,max_length=500) has_read =
models.BooleanField(‘是或不是已读’,default=False卡塔尔(英语:State of Qatar) add_time =
models.DateTime菲尔德(‘增加时间’, 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.DateTime菲尔德(‘加多时间’, default=datetime.now卡塔尔 class
Meta: verbose_name = ‘客商课程’ verbose_name_plural = verbose_name
operations/models.py
图片 13#
organization/models.py from datetime import datetime from django.db
import models 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 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卡塔尔(英语:State of Qatar)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 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) 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

 一、前言

付出碰着:

    python:  3.6.4

    Django: 2.0.2

后台处理:xadmin

2.5.把五个app放到二个文本夹

创建package: apps

把后边的多少个app全体私分到apps包里面

 不要选“Search for references”

 图片 14

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

图片 15

 

再运营就足以成功运营了

图片 16

 那个时候的目录

图片 17

大器晚成、前言 开荒情况: python: 3.6.4 Django: 2.0.2 后台管理:xadmin
1.1.品种介绍 系统包蕴: 系统具…

1.1.种类介绍

系统包含:

  • 系统拥有完整的顾客登陆注册以至找回密码功效,具备完全个人基本。
  • 个体大旨:
    改革头像,校正密码,校订邮箱,能够观望小编的学科以致笔者的馆内藏品。能够去除收藏,小编的音讯。
  • 导航栏: 公开学,授课教师,授课机构,全局搜索。
  • 点击公开课–> 课程列表,排序-寻觅。火热课程推荐,课程的分页。
  • 点击课程–>
    课程详细情况页中对学科举办收藏,撤消收藏。富文本显示课程内容。
  • 点击开始学习–>
    课程的章节音讯,课程的数短论长音讯。课程财富的下载链接。
  • 点击授课讲师–>授课教师列表页,对助教举办人气排序以致分页,右侧有教师名次榜。
  • 点击讲师的详情页面–> 对教授进行收藏和享受,甚至助教的百分百科目。
  • 导航栏: 授课机构有分页,排序筛选功能。
  • 机关列表页侧面有长足提交本身要读书的表单。
  • 点击机构–> 左边:机构首页,机构课程,机构介绍,机构教授。
  • 后台管理种类能够切换主题。左边每一个效果与利益都有列表呈现,
    增删改查,筛选成效。
  • 课程列表页能够对两样字段进行排序。选用多条记下举办删除操作。
  • 课程列表页:过滤器->选拔字段范围等,寻觅,导出csv,xml,json。
  • 课程新增添页面上传图片,富文本的编写制定。时间接选举拔,增多章节,加多课程能源。
  • 日记记录:记录后台职员的操作

图片 1

图片 2

1.2.开立工程

制造工程

django-admin startproject MxOnline

接下来伊始项目标付出

二、models设计

 项目标花费都以从models设计初步,后台的治本和前端的渲染无非就是对数据库的增加和删除改查,所以models设计的三等九般对全体项指标付出起着至关心重视要的因素。

上边是笔者画的图,能够很直观的看出来我们需求的models。

图片 3

加大展现:

 图片 4

图片 5

 

创办多个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表如下:

图片 6

  • id: 主键, password 密码, last_login
    Django自动记录客商最终登入时间,。
  • is_superuser 申明客商是不是是一级顾客(后台管理会用到卡塔尔国。
  • username 客商名字段不要随意校订, email 邮箱,
  • is_staff 表示是不是是工作者(后台管理会用到卡塔尔。
  • is_active 顾客是或不是是激活状态, date_joined 注册时间。

咱俩要推而广之user表,加多需求的字段

私家基本页面消息:

图片 7

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=10,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

说明:

  image上传到何地

      url是图片的门路

      index调整轮播图的播放顺序

 

如此users的三张表就制造完了

 写代码要基于PEP8标准

图片 8

每一种class之间要空两格

图片 9

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的完整代码如下:

图片 27图片 28

# 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('昵称',max_length=50,default='')
    birthday = models.DateField('生日',null=True,blank=True)
    gender = models.CharField('性别',max_length=10,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


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


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/models.py

图片 29图片 30

# course/models.py

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

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)

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


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

course/models.py

图片 31图片 32

# operation/models.py

from datetime import datetime

from django.db import models

from course.models import Course
from users.models import UserProfile


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


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


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


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


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

operations/models.py

图片 33图片 34

# organization/models.py

from datetime import datetime

from django.db import models


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


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


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)

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”

 图片 14

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

图片 15

 

再运转就足以成功运维了

图片 16

 这时的目录

图片 17  

 

                                                                       
                                     下一篇**:Django+xadmin塑造在线教育平台(二)**

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website