BBS - 表结构

 

 

项目流程:python

一、搞清楚需求(产品经理)mysql

(1)基于用户认证组件和Ajax实现登陆验证(图片验证码)web

(2)基于form组件和Ajax实现注册登陆sql

(3)设计系统首页(文章列表渲染)数据库

(4)设计我的站点页面django

(5)文章详情页cookie

(6)实现文章点赞功能session

(7)实现文章评论;文章的评论、评论的评论xss

(8)富文本编辑框和基于bs4模块防护xss攻击测试

 

二、设计表结构

三、按着每一个功能进行开发

四、功能测试

五、项目部署上线

 

  登陆注册,  注册用户,过滤验证--->一张用户表就能够。想描述这我的登陆了怎么样,没有登陆怎么样,就用到了cookie和session---->用户认证组件;

用户认证组件的大前提是必需要用django自带的那个auth_user表,若是那些字段不够用怎么办?本身写一个UserInfo表,去继承AbstractUser这个类,AbstractUser里边有username、passowrd等auth_user里边的字段,进行数据库迁移的时候就生成了UserInfo这一张表,就不会再单独生成auth_user那张表了,UserInfo里边已经有它全部字段。

咱们以前用用户认证组件用的是auth_user表,如今就能够直接用UserInfo这个表了,由于User也是继承的AbstractUser,如今不继承了UserInfo直接去继承。

UserInfo表里边应该还有title、site_name、theme字段,为了解耦把它放在Blog表里边,而后经过一对一关系去链接索取。

  UserInfo表和Blog表是一对一,UserInfo表和Blog、Category是一对多关系。只须要绑定一个一对多就能够了,另一个经过跨表查询去查找。   Category表跟Blog绑定关系或者跟UserInfo绑定关系均可以,这里Category与Blog绑定了一对多的关系。如查询mm建立了多少个分类,经过mm找到站点Blog对象,站点Blog对象跟分类表Category绑定一对多的关系,经过站点Blog对象就能查出全部的分类表的字段了,也就是用户的分类对象了。

  Tag和Category表是同样的,一个站点Blog能够有多个标签Tag,一个标签Tag只能属于一个站点Blog。

  文章Article与分类Category,一个分类能够有多篇文章,一篇文章可否有多个分类?(能够设计成只有一个分类也能够设计成有多个分类)这里咱们设计成了一篇文章只能有一个分类,(Tag标签和文章已是多对多的关系了)。Article跟Category绑定了一对多的关系,同时跟Tag表绑定了多对多的关系,这里用到一个中介模型的概念,不用它去建立第三张表了,咱们本身手动写第三张表。  文章Article与用户UserInfo是一对多的关系。 

  点赞表,哪个用户user(去关联用户表)对哪一篇文章article(去关联文章表)点赞了True或者踩灭False。

  评论表Comment

  哪个用户对哪一篇文章在哪一个时间作了什么评论 ,涉及这4个字段

  要知道这些跟、子评论的父子关系,存的时候要把它描述出来,再加一个parent_comment_id字段

 跟评论:对文章的评论;111  222    333
  子评论:对评论的评论;444
                        555
Comment
nid user_id article_id  content parent_comment_id(null=True)
1       1       1           111     null
2       2       1           222     null
3       3       1           333     null
4       4       1           444     1
5       5       1           555     4

 

# -*- encoding:utf-8 -*-
from django.db import models

# Create your models here.

from django.contrib.auth.models import User, AbstractUser


class UserInfo(AbstractUser):  # 使用用户认证组件须要使用auth_user表,扩展这个表须要继承AbstractUser,User继承的就是AbstractUser
    """
    用户信息
    用户信息表和博客信息表是一对一的关系
    """
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to='avators/', default="/avatars/default.png")  # 存本地用户图像字段
    create_time = models.DateTimeField(verbose_name='建立时间', auto_now_add=True)  # auto_now_add:默认当前时间
 blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE)     def __str__(self):
        return self.username


class Blog(models.Model):
    """
    博客信息表 (站点表)
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='我的博客标题', max_length=64)
    site_name = models.CharField(verbose_name='站点名称', max_length=64)
    theme = models.CharField(verbose_name='博客主题', max_length=32)

    def __str__(self):
        return self.title


class Category(models.Model):
    """
    博主我的文章分类表
    博客信息表和分类表是一对多的关系,用户表和分类表也是一对多的关系,由于用户表和博客信息表是一对一的关系,
    能够找到分类表,因此不须要在写用户表和分类表的映射关系
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='分类标题', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)     def __str__(self):
        return self.title


class Tag(models.Model):
    """
    博主我的文章标签表
    和分类表相似
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='标签名称', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)     def __str__(self):
        return self.title


class Article(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50, verbose_name='文章标题')
    desc = models.CharField(max_length=255, verbose_name='文章描述')
    create_time = models.DateTimeField(verbose_name='建立时间', auto_now_add=True)

    comment_count = models.IntegerField(default=0)
    up_count = models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)

    user = models.ForeignKey(verbose_name='做者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
    category = models.ForeignKey(to='Category', to_field='nid', null=True, on_delete=models.CASCADE)
    tags = models.ManyToManyField(  # 用了一个中介模型,建立第三张表
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )

    def __str__(self):
        return self.title


class Article2Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='文章', to="Article", to_field="nid", on_delete=models.CASCADE)
    tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field="nid", on_delete=models.CASCADE)     # 联合惟一,这两个字段不能重复
    class Meta:
        unique_together = [
            ('article', 'tag'),
        ]

    def __str__(self):
        v = self.article.title + "---" + self.tag.title
        return v


class ArticleUpDown(models.Model):
    """
    点赞表
    哪一个人对哪篇文章点赞或踩
    """

    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserInfo', null=True, on_delete=models.CASCADE)
    article = models.ForeignKey('Article', null=True, on_delete=models.CASCADE)
    is_up = models.BooleanField(default=True)

    class Meta:
        unique_together = [
            ('article', 'user'),
        ]


class Comment(models.Model):
    """
    评论表
    根评论:对文章的评论(哪一个人对哪一个文章在哪一个时间作了什么评论)
    子评论:对评论的评论
    """
    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
    article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid', on_delete=models.CASCADE)
    create_time = models.DateTimeField(verbose_name='建立时间', auto_now_add=True)
    content = models.CharField(verbose_name='评论内容', max_length=255)

    parent_comment = models.ForeignKey('self', null=True, on_delete=models.CASCADE) # 本身关联本身,自关联,能够写成self,也能够写成Commen     def __str__(self):
        return self.content

    '''
    111
    `  444
          555
    222
    333
    Comment
    nid    user_id   article_id  content    parent_comment_id(null=True)
     1        1           1        111              null 
     2        2           1        222              null 
     3        3           1        333              null 
     4        4           1        444                1 
     5        5           1        555                4      
    '''

  查询一篇文章的评论数--->拿到文章对象必须跨表找到与它关联的全部的评论对象,数下有多少条。涉及跨表查询,效率很是低。咱们引入了3个字段,其中有一个comment_content(文章的评论数),为了查询文章评论数的时候没必要每次都跨表去查询,加一个文章评论数的字段。 -->之后每生成一个评论的时候把这个文章找到,把它的comm_content作一个自加1的操做,生成一个评论作一个自加1。  之后文章有多少个评论数,到这个字段里边去取就能够,不用跨表了。每生成一个评论找到它关联的文章作自加1,这个时候也跨表了,多作这一步属于添加的时候慢一点。对于web访问查询的操做要多多与添加。

  点赞也是同样的,加一个点赞字段,每生成一个点赞的时候找到这篇文章给它自加1就能够了

settings里边

改为用mysql

DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'cnblog',#要链接的数据库,链接前需建立好
        'USER':'root',#链接数据库的用户名
        'PASSWORD':'',#链接数据库的密码
        'HOST':'127.0.0.1',#链接本机,默认本机
        'PORT':'3306' #端口,默认3306
    }
}
#要想继承AbstractUser,应该在settings里边写入这个
AUTH_USER_MODEL = "blog.UserInfo"

 

应该先在mysql里边建立cnblog这个数据库再进行数据库迁移建立

mysql> create database cnblog;
Query OK, 1 row affected (0.22 sec)

 

进行数据库迁移

python manage.py makemigrations

python manage.py migrate

 

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

若是提示你这个就 pip install mysqlclient下

 

相关文章
相关标签/搜索