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下

 

相關文章
相關標籤/搜索