博客系統項目流程

1、搞清楚需求(產品經理)

  (1)基於用戶認證組件和Ajax實現登陸驗證(圖片驗證碼)html

  (2)基於forms組件和Ajax實現註冊功能python

  (3)設計系統首頁(文章列表渲染)mysql

  (4)設計我的站點頁面(跨表查詢、分組查詢)面試

  (5)文章詳情頁sql

  (6)實現文章點贊功能(Ajax)數據庫

  (7)實現文章評論功能:涉及文章的評論和評論的評論django

  (8)富文本編輯框和防止xss攻擊bootstrap

2、設計博客園表結構

  博客系統表結構流程圖xss

  流程圖地址:https://www.processon.com/diagraming/5b529154e4b0f8477d8d0d9d測試

  

3、建立項目與遷移表

一、根據表結構圖在models.py中建立模型

from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    """
    用戶信息表:
    使用用戶認證組件,用戶表的字段不夠用,須要繼承AbstractUser類來定製一個本身的用戶表。
    在繼承後,再也不生成auth_user表,直接使用user_info表
    """
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to='avatars/', 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):
    """
    博主我的文章分類表:Linux、python、面試心得、雞湯
    分類表和用戶表是多對一的關係,因爲用戶和站點是一對一,分類表與站點也是多對一的關係
    """
    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)   # 發佈時間
    content = models.TextField()  # 文章內容

    # 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)   # True:贊,  False:滅

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


class Comment(models.Model):
    """
    評論表
    根評論:對文章的評論
    子評論:對評論的評論
    哪個用戶對哪一篇文章在什麼時間作了什麼評論內容
    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
    """
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='評論文章', to='Article', to_field='nid', on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name='評論者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
    content = models.CharField(verbose_name='評論內容', max_length=255)
    create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True)

    # parent_comment = models.ForeignKey("Comment")   # 關聯Comment表,自己就在Comment表中,所以是自關聯
    parent_comment = models.ForeignKey('self', null=True, on_delete=models.CASCADE)   # 設置null=True,爲null的狀況不用存值了

    def __str__(self):
        return self.content

二、修改數據庫配置

settings.py:

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cnblog',     # 要鏈接的數據庫,鏈接前須要建立好
        'USER': 'root',       # 鏈接數據庫的用戶名
        'PASSWORD': '1234',   # 鏈接數據庫的密碼
        'HOST': '127.0.0.1',  # 鏈接主機,默認本機
        'PORT': 3306          # 端口  默認3306
    }
}

三、建立數據庫

  

四、數據庫遷移

  (1)注意在遷移前檢查settings.py文件中,INSTALLED_APPS配置中是否自動加入了當前的APP:blog。

  (2)另外因爲在models.py中,用戶表繼承的是原生用戶表:AbstractUser,所以必需要在settings.py中作以下設置:

AUTH_USER_MODEL = 'blog.UserInfo'

  執行數據庫遷移操做:

$ python3 manage.py makemigrations

  (3)執行報錯:no module named MySQLdb 。這是由於django默認你導入的驅動是MySQLdb,但是MySQLdb 對於py3有很大問題,因此咱們須要的驅動是PyMySQL ,因此要在/cnblog/cnblog/__init__.py裏面寫入:

import pymysql
pymysql.install_as_MySQLdb()

  (4)執行數據庫遷移操做,完成數據庫遷移

$ python3 manage.py makemigrations
$ python3 manage.py migrate

  (5)在pycharm中配置數據庫

  

  (6)查看數據庫中建立的表

  

  能夠看到auth_user表已經沒有了,user_info表中包含原生的字段和擴展的字段。user_info表既是用戶認證組件的user表也是本身的用戶表。

3、按着每個功能進行開發

一、建立和配置靜態文件目錄

  在項目根目錄下建立static 的python package。並在static下建立子目錄blog用於存放博客系統靜態文件。

  在settings.py中配置靜態文件目錄:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/'    # 別名

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")    # 實際路徑
]

  配置好後,別名'/static/'就指代的是.../cnblog/static/目錄了。

  拷入bootstrap文件:

  

 

 

4、功能測試

5、項目部署上線

部署基於python語言的WEB發佈環境

相關文章
相關標籤/搜索