github地址:https://github.com/tianmingbo/icourse

一、需求分析和表结构设计

1.1、需求分析

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

1.2开发环境:

six==1.12.0
PyMySQL==0.9.3
Django==1.11.10
django_pure_pagination==0.3.0
xlwt==1.3.0
requests==2.21.0
XlsxWriter==1.1.5
future==0.17.1
django_recaptcha==2.0.4
django_crispy_forms==1.7.2
django_formtools==2.1
django_reversion==3.0.4
South==1.0.2

1.3用到的技术

Django 中ORM,auth、forms、ModelForm、反向查询,命名空间

前端技术

xadmin、验证码、富文本插件。

1.4创建四个app

users:用户管理

course:课程管理

organization:机构和教师管理

operation:用户操作管理

需注册app

1.5、创建表

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

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐