一、前言
版本:
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