一、需求分析和表结构设计
1.1、需求分析
- 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心。
- 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏。可以删除收藏,我的消息。
- 导航栏: 公开课,授课讲师,授课机构,全局搜索。
- 点击公开课–> 课程列表,排序-搜索。热门课程推荐,课程的分页。
- 点击课程–> 课程详情页中对课程进行收藏,取消收藏。富文本展示课程内容。
- 点击开始学习–> 课程的章节信息,课程的评论信息。课程资源的下载链接。
- 点击授课讲师–>授课讲师列表页,对讲师进行人气排序以及分页,右边有讲师排行榜。
- 点击讲师的详情页面–> 对讲师进行收藏和分享,以及讲师的全部课程。
- 导航栏: 授课机构有分页,排序筛选功能。
- 机构列表页右侧有快速提交我要学习的表单。
- 点击机构–> 左侧:机构首页,机构课程,机构介绍,机构讲师。
- 后台管理系统可以切换主题。左侧每一个功能都有列表显示, 增删改查,筛选功能。
- 课程列表页可以对不同字段进行排序。选择多条记录进行删除操作。
- 课程列表页:过滤器->选择字段范围等,搜索,导出csv,xml,json。
- 课程新增页面上传图片,富文本的编辑。时间选择,添加章节,添加课程资源。
- 日志记录:记录后台人员的操作
1.2开发环境:
python:3.7
Django:1.11.10
……
1.3创建四个app
users:用户管理
course:课程管理
organization:机构和教师管理
operation:用户操作管理
需注册app
1.4、创建表
users应用下的表:
class UserProfile(AbstractUser):
'''
扩展用户信息
可以使用auth组件
'''
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')
address = 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', '找回密码'),
('update_email', '修改邮箱')
)
code = models.CharField(max_length=20, verbose_name='验证码')
email = models.CharField(max_length=50, verbose_name='邮箱')
send_type = models.CharField('验证码类型', choices=send_choices, max_length=30)
send_time = models.DateTimeField('发送时间', default=datetime.now)
class Meta:
verbose_name = '邮箱验证码'
verbose_name_plural = verbose_name
def __str__(self):
return '{0}({1})'.format(self.code, self.email)
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
需重载AUTH_USER_MODEL
AUTH_USER_MODEL = 'users.UserProfile'
course下的表:
'''
课程中需要四张表
Course 课程表
Lesson 章节信息
Video 视频资源
CourseResource 课程资源
'''
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('难度', max_length=2, choices=degree_choices)
learn_times = models.IntegerField('学习时长(分钟)', default=0)
students = models.IntegerField('学习人数', default=0)
fav_nums = models.IntegerField('收藏人数', default=0)
image = models.ImageField('封面图', upload_to='course/%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 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
def __str__(self):
return self.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
operation下的表:
'''
UserAsk --用户咨询
CourseComments --用户评论
UserFavorite ==用户收藏
UserMessage --用户消息
UserCourse --用户学习的课程
'''
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='用户')
course = models.ForeignKey(Course, verbose_name='课程')
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) # 默认发所有用户,>0表示用户id
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
organization下的表:
'''
CourseOrg --课程机构基本信息
Teacher --教师基本信息
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
def __str__(self):
return self.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('logo', 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)
teacher_age = models.IntegerField('年龄', default=25)
image = models.ImageField(default='', upload_to="teacher/%Y/%m", verbose_name="头像", max_length=100)
add_time = models.DateTimeField(default=datetime.now)
class Meta:
verbose_name = '教师'
verbose_name_plural = verbose_name
然后执行python manage.py makemigrations,然后执行python manage.py migrate,进行数据库迁移。
1.5、把app放在同一个文件夹下
1、新建apps
2、把所有的APP移入apps下,右击apps,
3、在settings文件中,写入以下代码
import sys
sys.path.insert(0,os.path.join(BASE_DIR,'apps'))