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