课程模块表结构

课程模块

我们要开始写课程模块了~~课程模块都有哪些功能呢~~

我们的课程模块,包括了免费课程以及专题课程两个方向~~

主要是课程的展示,点击课程进入课程详细页面~~

课程详细页面展示,课程的概述,课程的价格策略,课程章节,评价以及常见问题~~

以及一些周边的字段~~~这是主线路~~

根据功能设计表结构

对照着对标路飞网站,我们可以先讨论下表结构~~

我们初步能够确定下来12张表~~

from django.db import models
from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey
from django.contrib.contenttypes.models import ContentType

# Create your models here.
__all__ = ["Category", "Course", "CourseDetail", "Teacher", "DegreeCourse", "CourseChapter",
           "CourseSection", "PricePolicy", "OftenAskedQuestion", "Comment", "Account", "CourseOutline"]

class Category(models.Model):
    """课程分类表"""
    title = models.CharField(max_length=32, unique=True, verbose_name="课程的分类")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "01-课程分类表"
        db_table = verbose_name  # 数据库表名
        verbose_name_plural = verbose_name  # 复数

class Course(models.Model):
    """课程表"""
    title = models.CharField(max_length=128, unique=True, verbose_name="课程的名称")
    course_img = models.ImageField(upload_to="course/%Y-%m", verbose_name=‘课程的图片‘)
    # media/course/2018-11/xxx.png
    category = models.ForeignKey(to="Category", verbose_name="课程的分类")
    COURSE_TYPE_CHOICES = ((0, "付费"), (1, "vip专享"), (2, "学位课程"))
    course_type = models.SmallIntegerField(choices=COURSE_TYPE_CHOICES)
    degree_course = models.ForeignKey(to="DegreeCourse", blank=True, null=True, help_text="如果是学位课程,必须关联学位表")
    # course_type    degree_course_id
    #  0                null
    #  1                null
    #  2                2

    brief = models.CharField(verbose_name="课程简介", max_length=1024)
    level_choices = ((0, ‘初级‘), (1, ‘中级‘), (2, ‘高级‘))
    level = models.SmallIntegerField(choices=level_choices, default=1)
    status_choices = ((0, ‘上线‘), (1, ‘下线‘), (2, ‘预上线‘))
    status = models.SmallIntegerField(choices=status_choices, default=0)
    pub_date = models.DateField(verbose_name="发布日期", blank=True, null=True)
    order = models.IntegerField(verbose_name="课程顺序", help_text="从上一个课程数字往后排, 建议中间空几个数字")
    study_num = models.IntegerField(verbose_name="学习人数", help_text="只要有人买课程,订单表加入数据的同时给这个字段+1")
    is_free = models.BooleanField(default=False)

    # order_details = GenericRelation("OrderDetail", related_query_name="course")
    # coupon = GenericRelation("Coupon")
    # 只用于反向查询不生成字段
    price_policy = GenericRelation("PricePolicy")
    often_ask_questions = GenericRelation("OftenAskedQuestion")
    course_comments = GenericRelation("Comment")

    def save(self, *args, **kwargs):
        if self.course_type == 2:
            if not self.degree_course:
                raise ValueError("学位课必须关联学位课程表")
        super(Course, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "02-课程表"
        db_table = verbose_name
        verbose_name_plural = verbose_name

class CourseDetail(models.Model):
    """课程详细表"""
    course = models.OneToOneField(to="Course")
    hours = models.IntegerField(verbose_name="课时")
    course_slogan = models.CharField(max_length=125, blank=True, null=True, verbose_name="课程口号")
    video_brief_link = models.CharField(max_length=255, blank=True, null=True)
    summary = models.TextField(max_length=2048, verbose_name="课程概述")
    why_study = models.TextField(verbose_name="为什么学习这门课程")
    service = models.TextField(verbose_name="你将获得哪些服务")
    what_to_study_brief = models.TextField(verbose_name="我将学到哪些内容")
    career_improvement = models.TextField(verbose_name="此项目如何有助于我的职业生涯")
    prerequisite = models.TextField(verbose_name="课程先修要求", max_length=1024)
    recommend_courses = models.ManyToManyField("Course", related_name="recommend_by", blank=True)
    teachers = models.ManyToManyField("Teacher", verbose_name="课程讲师")

    def __str__(self):
        return self.course.title

    class Meta:
        verbose_name = "03-课程详细表"
        db_table = verbose_name
        verbose_name_plural = verbose_name

class Teacher(models.Model):
    """讲师表"""
    name = models.CharField(max_length=32, verbose_name="讲师名字")
    brief = models.TextField(max_length=1024, verbose_name="讲师介绍")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "04-教师表"
        db_table = verbose_name
        verbose_name_plural = verbose_name

class DegreeCourse(models.Model):
    """
    字段大体跟课程表相同,哪些不同根据业务逻辑去区分
    """
    title = models.CharField(max_length=32, verbose_name="学位课程名字")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "05-学位课程表"
        db_table = verbose_name
        verbose_name_plural = verbose_name

class CourseChapter(models.Model):
    """课程章节表"""
    course = models.ForeignKey(to="Course", related_name="course_chapters")
    # 排序用的
    chapter = models.SmallIntegerField(default=1, verbose_name="第几章")
    title = models.CharField(max_length=32, verbose_name="课程章节名称")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "06-课程章节表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ("course", "chapter")

class CourseSection(models.Model):
    """课时表"""
    chapter = models.ForeignKey(to="CourseChapter", related_name="course_sections")
    title = models.CharField(max_length=32, verbose_name="课时")
    section_order = models.SmallIntegerField(verbose_name="课时排序", help_text="建议每个课时之间空1至2个值,以备后续插入课时")
    section_type_choices = ((0, ‘文档‘), (1, ‘练习‘), (2, ‘视频‘))
    free_trail = models.BooleanField("是否可试看", default=False)
    section_type = models.SmallIntegerField(default=2, choices=section_type_choices)
    section_link = models.CharField(max_length=255, blank=True, null=True, help_text="若是video,填vid,若是文档,填link")

    def __str__(self):
        return "%s-%s" % (self.chapter, self.title)

    class Meta:
        verbose_name = "07-课程课时表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = (‘chapter‘, ‘section_link‘)

class PricePolicy(models.Model):
    """价格策略表"""
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    # 关联course or degree_course
    content_object = GenericForeignKey(‘content_type‘, ‘object_id‘)

    valid_period_choices = ((1, ‘1天‘), (3, ‘3天‘),
                            (7, ‘1周‘), (14, ‘2周‘),
                            (30, ‘1个月‘),
                            (60, ‘2个月‘),
                            (90, ‘3个月‘),
                            (120, ‘4个月‘),
                            (180, ‘6个月‘), (210, ‘12个月‘),
                            (540, ‘18个月‘), (720, ‘24个月‘)
                            )
    valid_period = models.SmallIntegerField(choices=valid_period_choices)
    price = models.FloatField()

    def __str__(self):
        return "%s(%s)%s" % (self.content_object, self.get_valid_period_display(), self.price)

    class Meta:
        verbose_name = "08-价格策略表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ("content_type", ‘object_id‘, "valid_period")

class OftenAskedQuestion(models.Model):
    """常见问题"""
    content_type = models.ForeignKey(ContentType)  # 关联course or degree_course
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey(‘content_type‘, ‘object_id‘)

    question = models.CharField(max_length=255)
    answer = models.TextField(max_length=1024)

    def __str__(self):
        return "%s-%s" % (self.content_object, self.question)

    class Meta:
        verbose_name = "09-常见问题表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = (‘content_type‘, ‘object_id‘, ‘question‘)

class Comment(models.Model):
    """通用的评论表"""
    # 定位表
    content_type = models.ForeignKey(ContentType, blank=True, null=True)
    # 定位对象的id
    object_id = models.PositiveIntegerField(blank=True, null=True)
    # 定位对象
    content_object = GenericForeignKey(‘content_type‘, ‘object_id‘)

    content = models.TextField(max_length=1024, verbose_name="评论内容")
    account = models.ForeignKey("Account", verbose_name="会员名")
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content

    class Meta:
        verbose_name = "10-评价表"
        db_table = verbose_name
        verbose_name_plural = verbose_name

class Account(models.Model):
    username = models.CharField(max_length=32, verbose_name="用户姓名")

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = "11-用户表"
        db_table = verbose_name
        verbose_name_plural = verbose_name

class CourseOutline(models.Model):
    """课程大纲"""
    course_detail = models.ForeignKey(to="CourseDetail", related_name="course_outline")
    title = models.CharField(max_length=128)
    order = models.PositiveSmallIntegerField(default=1)
    # 前端显示顺序

    content = models.TextField("内容", max_length=2048)

    def __str__(self):
        return "%s" % self.title

    class Meta:
        verbose_name = "12-课程大纲表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = (‘course_detail‘, ‘title‘)

media配置

图片位置需要在settings配置下

# media配置
MEDIA_URL = "media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

media 在settings配置下

from django.conf.urls import url, include
from django.contrib import admin
from app import settings
from django.views.static import serve

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^api/course/‘, include("course.urls")),

    # media路径配置
    url(r‘media/(?P<path>.*)$‘, serve, {‘document_root‘: settings.MEDIA_ROOT})
]

url也要加上

接口的编写

图片位置需要在settings配置下

我们表结构定下来以后,可以根据业务场景看需要哪些接口~~~

对于我们课程这个模块,所有的功能都是展示,基于数据展示的,我们通常称为数据接口~~

这种接口对于我们来说是最简单的~~因为我们只是从数据库拿数据~然后进行展示~~

我们来看下都需要哪些接口~~~

  -- 课程页面  有课程所有分类这个接口

  -- 课程页面  有展示课程的接口

  -- 点击课程进入课程详情页面,详情页面的数据接口~~

  -- 详情页面下的子路由对应子组件的数据接口

    -- 课程章节课时

    -- 课程的评论

    -- 课程的常见问题

这些所有的数据接口~~套路都是读取数据库,序列化数据,返回~~~

那主要就是用DRF的序列化组件~~那我们从路由~然后序列化组件~然后看视图~~

 urls.py

 serializers.py

 views.py

我们的课程的视图还可以重写编写一下~~利用我们之前学的视图的封装的那些类~~

 升级版视图的示例

我们可以根据上面的更改的视图的示例~~来更改我们所有的视图~~小伙伴们~自己动起手来吧~~

我们课程这个模块下的数据接口我们就介绍这些~~

我们这里涉及课程图片~~用我们Django的mediaURL~~

Django的MEDIA配置

# settings.py

STATIC_URL = ‘/static/‘
# Media配置
MEDIA_URL = "media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

这样我们上传的图片~数据库存的是路径地址~~我们前端向后端的media路径发送请求~~

拿到我们想要的图片,视频等资源~~

原文地址:https://www.cnblogs.com/clbao/p/9998141.html

时间: 2024-10-10 17:40:23

课程模块表结构的相关文章

微赞微擎手动增加模块数据库表结构详解

微赞微擎手动增加模块数据库表结构详解 有时候微擎或微赞的模块没有安装模块的xml文件,那我们先想安装到自己的系统上,要怎么处理呢,下面我们详细的介绍下步骤,个人能力有限,如有不正确之处,敬请谅解~ 1.模块的代码复制 这个就不用多说了吧,当然需要把相应的addons文件夹里的模块复制到自己系统的目录里,不然不要做一下的事情了 2.数据库表结构修改 代码复制过来,如果有相应的xml安装包或者install.php文件,可以直接安装,但是我们这里讲的是没有,那只能把原来要复制的表结构记录复制过来,插

关系型数据库表结构设计规范-浅谈(转)

数据库表结构设计规范-浅谈,为啥是浅谈呢,因为主要的观点还是来自原微信公共账号的一篇文章,稍微加了一些自己的看法. 谁来进行数据库的设计? 肯定是具体的开发工程师来进行,开发同学的话,第一业务熟悉度比较高,第二结合OO和ORM的思想,能有比较好的运用关系型数据库的特性.如果是DBA同学的话,虽然对于数据库本身了解比较多,但是对于业务了解较少,很难有比较客观的设计.但是业务上线或者运行期间,需要DBA同学能够重度的加入进来,针对一些性能点和不合理的点进行优化,同事也可以在上线前,针对SQL进行re

数据库设计中常见表结构的设计技巧(转)

一.树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况.当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据.按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构: 类别表_1(Type_table_1) 名称 类型 约束条件 说明 type_id int 无重复 类别标识,主键 t

谈Apache OFbiz 会员模块表结构设计

数据库表的结构设计可谓是ofbiz除技术框架之外,另一个非常值得学习的方向.这篇文章我们来谈谈ofbiz对电子商务会员表的设计. PARTY ofbiz对人.团体进行了抽象,称之为party,翻译为中文称之为"会员"(但我觉得抛开领域,如果你也有相关的设计需求,在其他领域可能称之为团体更合适).会员在ofbiz被设计为一个抽象的概念(对应到面向对象设计中,你可以称其为一个基类),它有两个具体的延伸(继承者):分别是PERSON以及PARTY_GROUP.数据库的E-R图: 这里PERS

数据库表结构文档自动生成工具

1.需求描述: 软件开发完成后,交付客户给客户使用前通常需要数据库设计文档,很多程序员甚至项目经理自然会想到采用人海战术,一个项目组的成员,分模块来写,然后合并.作为程序员来说,这种方法是在是太low了.那么能否有自动化工具呢,当然有,用度娘搜索“数据库文档生成器”会出来很多个,他们的质量也会参差不齐,要么格式不满足公司文档格式需要.所以该问题的终极解决方案是理解数据库文档生成器的原理,然后自己动手实现一个,听起来是不是很难,其实现起来难度并不大,无图无真相,先上图. 2.技术点解析: 上面生成

Atitti 固化数据库表结构方案

1. 固化数据库表结的重要意义1 2. 如何固化表结构1 2.1. 向上抽象一层,以动词有目标,以名词为存储对象.1 2.2. 数据类型datatype字段:这个用来表明数据是属于哪个功能的.方便筛选1 3. 特例20%::对于十分频繁的功能,也可以特殊化单独建表2 1. 固化数据库表结的重要意义 一个项目,基本由三部分组成,界面 ui ,业务逻辑,数据库 固化数据库表,基本就可以达到了立即提升很大效率的程度... 2. 如何固化表结构 2.1. 向上抽象一层,以动词有目标,以名词为存储对象.

mysql 表结构转excel表格

最近需要写文档,由于开发模式是先开发后写文档(不想吐槽...),数据库表结构什么的都搞好了,然后写文档的时候需要贴表结构,什么字段,类型,相关说明需要一一对应起来,数据库表10多张,字段又多,手动复制粘贴太蛋疼了,于是就写了个将表结构转excel表格的简单实现(丑是丑了点,毕竟实现功能了不是). package net.cloudkit.management.util; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apac

ofbiz之三--模块目录结构

分析按规范构建的模块目录结构(假设模块名称为 note) note - 模块根目录(模块名称, 一般模块请求与之同名) ├build - 当前已经编译的java代码和任何java库.他们能够使这个应用程序运行,但不能仅仅靠它运行. ├classes - 这里是 已经编译过的 *.class 文件; java源文件在当前模块的 src 内 ├lib - 将当前模块的独有的 *.class 文件打包成jar包, 名称为 note.jar 或 ofbiz-note.jar ├javadoc - 由当前

FocusBI: 《DW/BI项目管理》之数据库表结构 (原创)

关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/s/1f9VdZUXztwylkOdFLbcmWw 密码:2r4v 数据行业发展的很快,很多一起做BI的朋友都已转入大数据.云计算.人工智能等高大上的领域去了,而我还停留在原地做BI,导致能一起讨论问题的人越来越少,我还有太多BI领域的知识不会,需要深入学习,只好一个人慢慢前行一点一点的去学. 在做BI实施的