BBS创数据表

BBS项目类似于博客园 核心:文章的增删改查

一、项目开发基本流程

  1. 需求分析

  2. 架构设计

  3. 分组开发

  4. 提交测试

  5. 交付上线

二、表分析

用户表
个人站点表
文章表
文章分类表
文章标签表
点赞点菜表
文章评论表

三、基础字段分析

# 1.用户表
替换auth_user表
电话号码
用户头像
注册时间
# 2.个人站点表
站点名称
站点标题
站点样式
# 3.文章表
文章标题
文章简介
文章内容
发布时间
# 4.文章分类表
分类名称
# 5.文章标签表
标签名称
# 6.点赞点踩表:记录哪个用户给哪篇文章点了推荐(赞)还是反对(踩)
用户字段(用户主键)>>>:外键字段
文章字段(文章主键)>>>:外键字段
点赞点踩
# 7.文章评论表:记录哪个用户给哪篇文章评论了什么内容
用户字段(用户主键)>>>:外键字段
文章字段(文章主键)>>>:外键字段
评论内容
评论时间

四、外键字段分析

image

五、创建项目以及配置设置步骤

创建django项目
修改配置[os.path.join(BASE_DIR, 'templates')]
项目根目录下创建static目录
在配置文件里写STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
在配置文件里写AUTH_USER_MODEL = 'app01.UserInfo' # 替换了auth_user表
在终端创数据库
在配置文件里修改数据库相关配置
在models.py文件里编写创表的ORM代码
进行数据库迁移
链接数据库

六、配置文件需要提前添加以下几个关键配置

image

七、静态文件里面需要提前引入以下固定文件

image

八、创建表的所有代码如下

from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.


class UserInfo(AbstractUser):
    """1.用户表"""
    phone = models.BigIntegerField(verbose_name='手机号', null=True, blank=True)  # blank参数用于控制admin后台管理与数据库无关
    avatar = models.FileField(verbose_name='用户头像', upload_to='avatar/', default='avatar/default.jpg')
    register_time = models.DateTimeField(verbose_name='注册时间', auto_now_add=True)

    # 用户表与个人站点表一对一外键字段(因为用户表的查询频率较高 所以在用户表里创建)
    site = models.OneToOneField(to='site', on_delete=models.CASCADE, null=True)

    # 修改admin后台管理的表名
    class Meta:
        verbose_name_plural = '用户表'

    def __str__(self):
        return f'用户对象:{self.username}'


class Site(models.Model):
    """2.个人站点表"""
    site_name = models.CharField(verbose_name='站点名称', max_length=32)
    site_title = models.CharField(verbose_name='站点标题', max_length=32)
    site_theme = models.CharField(verbose_name='站点样式', max_length=32, null=True)

    class Meta:
        verbose_name_plural = '个人站点表'

    def __str__(self):
        return f'个人站点对象:{self.site_name}'


class Article(models.Model):
    """3.文章表"""
    title = models.CharField(verbose_name='文章标题', max_length=32)
    desc = models.CharField(verbose_name='文章简介', max_length=255)
    content = models.TextField(verbose_name='文章内容', )
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    # 三个优化字段
    comment_num = models.IntegerField(verbose_name='评论数', default=0)
    up_num = models.IntegerField(verbose_name='点赞数', default=0)
    down_num = models.IntegerField(verbose_name='点踩数', default=0)

    # 外键
    site = models.ForeignKey(to='Site', on_delete=models.CASCADE, null=True)
    category = models.ForeignKey(to='Category', on_delete=models.CASCADE, null=True)
    tags = models.ManyToManyField(to='Tag',
                                  through='Article2Tag',
                                  through_fields=('article', 'tag'),
                                  null=True
                                  )

    class Meta:
        verbose_name_plural = '文章表'

    def __str__(self):
        return f'文章对象:{self.title}'


class Tag(models.Model):
    """5.文章标签表"""
    name = models.CharField(verbose_name='标签名称', max_length=32)
    site = models.ForeignKey(to='Site', on_delete=models.CASCADE, null=True)

    class Meta:
        verbose_name_plural = '文章标签表'

    def __str__(self):
        return f'文章标签对象:{self.name}'


class Category(models.Model):
    """4.文章分类表"""
    name = models.CharField(verbose_name='分类名称', max_length=32)
    site = models.ForeignKey(to='Site', on_delete=models.CASCADE, null=True)

    class Meta:
        verbose_name_plural = '文章分类表'

    def __str__(self):
        return f'文章分类对象:{self.name}'


class Article2Tag(models.Model):
    """文章标与标签表的多对多第三张关系表(半自动创建方式)"""
    article = models.ForeignKey(to='Article', on_delete=models.CASCADE, null=True)
    tag = models.ForeignKey(to='Tag', on_delete=models.CASCADE, null=True)


class UpAndDown(models.Model):
    """6.文章点赞点踩表"""
    user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE, null=True)
    article = models.ForeignKey(to='Article', on_delete=models.CASCADE, null=True)
    is_up = models.BooleanField(verbose_name='点赞点踩')  # 传布尔值存 0或1

    class Meta:
        verbose_name_plural = '文章点赞点踩表'

    def __str__(self):
        return f'文章点赞点踩对象:{self.user}'


class Comment(models.Model):
    """7.文章评论表"""
    user = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE, null=True)
    article = models.ForeignKey(to='Article', on_delete=models.CASCADE, null=True)
    content = models.TextField(verbose_name='评论内容')
    comment_time = models.DateTimeField(verbose_name='评论时间', auto_now_add=True)
    parent = models.ForeignKey(to='self', on_delete=models.CASCADE, null=True)

    class Meta:
        verbose_name_plural = '文章评论表'

    def __str__(self):
        return f'文章评论对象:{self.user}'