(1)基於用戶認證組件和Ajax實現登陸驗證(圖片驗證碼)html
(2)基於forms組件和Ajax實現註冊功能python
(3)設計系統首頁(文章列表渲染)mysql
(4)設計我的站點頁面(跨表查詢、分組查詢)面試
(5)文章詳情頁sql
(6)實現文章點贊功能(Ajax)數據庫
(7)實現文章評論功能:涉及文章的評論和評論的評論django
(8)富文本編輯框和防止xss攻擊bootstrap
博客系統表結構流程圖xss
流程圖地址:https://www.processon.com/diagraming/5b529154e4b0f8477d8d0d9d測試
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表也是本身的用戶表。
在項目根目錄下建立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文件: