表間分析圖:html
咱們能夠在info中新建一個名爲models.py的python文件,用於存儲模型類定義的相關代碼。
前端
在models文件中放入如下代碼:python
from datetime import datetime from werkzeug.security import generate_password_hash, check_password_hash from info import constants from . import db class BaseModel(object): """模型基類,爲每一個模型補充建立時間與更新時間""" create_time = db.Column(db.DateTime, default=datetime.now) # 記錄的建立時間 update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 記錄的更新時間 # 用戶收藏表,創建用戶與其收藏新聞多對多的關係 tb_user_collection = db.Table( "info_user_collection", db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True), # 新聞編號 db.Column("news_id", db.Integer, db.ForeignKey("info_news.id"), primary_key=True), # 分類編號 db.Column("create_time", db.DateTime, default=datetime.now) # 收藏建立時間 ) tb_user_follows = db.Table( "info_user_fans", db.Column('follower_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True), # 粉絲id db.Column('followed_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True) # 被關注人的id ) #用戶表 class User(BaseModel, db.Model): """用戶""" __tablename__ = "info_user" id = db.Column(db.Integer, primary_key=True) # 用戶編號 nick_name = db.Column(db.String(32), unique=True, nullable=False) # 用戶暱稱 password_hash = db.Column(db.String(128), nullable=False) # 加密的密碼 mobile = db.Column(db.String(11), unique=True, nullable=False) # 手機號 avatar_url = db.Column(db.String(256)) # 用戶頭像路徑 last_login = db.Column(db.DateTime, default=datetime.now) # 最後一次登陸時間 is_admin = db.Column(db.Boolean, default=False) signature = db.Column(db.String(512)) # 用戶簽名 gender = db.Column( # 訂單的狀態 db.Enum( "MAN", # 男 "WOMAN" # 女 ), default="MAN") # 當前用戶收藏的全部新聞 collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic") # 用戶收藏的新聞 # 用戶全部的粉絲,添加了反向引用followed,表明用戶都關注了哪些人 followers = db.relationship('User', secondary=tb_user_follows, primaryjoin=id == tb_user_follows.c.followed_id, secondaryjoin=id == tb_user_follows.c.follower_id, backref=db.backref('followed', lazy='dynamic'), lazy='dynamic') # 當前用戶所發佈的新聞 news_list = db.relationship('News', backref='user', lazy='dynamic') def to_dict(self): resp_dict = { "id": self.id, "nick_name": self.nick_name, "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "", "mobile": self.mobile, "gender": self.gender if self.gender else "MAN", "signature": self.signature if self.signature else "", "followers_count": self.followers.count(), "news_count": self.news_list.count() } return resp_dict def to_admin_dict(self): resp_dict = { "id": self.id, "nick_name": self.nick_name, "mobile": self.mobile, "register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"), } return resp_dict #新聞表 class News(BaseModel, db.Model): """新聞""" __tablename__ = "info_news" id = db.Column(db.Integer, primary_key=True) # 新聞編號 title = db.Column(db.String(256), nullable=False) # 新聞標題 source = db.Column(db.String(64), nullable=False) # 新聞來源 digest = db.Column(db.String(512), nullable=False) # 新聞摘要 content = db.Column(db.Text, nullable=False) # 新聞內容 clicks = db.Column(db.Integer, default=0) # 瀏覽量 index_image_url = db.Column(db.String(256)) # 新聞列表圖片路徑 category_id = db.Column(db.Integer, db.ForeignKey("info_category.id")) user_id = db.Column(db.Integer, db.ForeignKey("info_user.id")) # 當前新聞的做者id status = db.Column(db.Integer, default=0) # 當前新聞狀態 若是爲0表明審覈經過,1表明審覈中,-1表明審覈不經過 reason = db.Column(db.String(256)) # 未經過緣由,status = -1 的時候使用 # 當前新聞的全部評論 comments = db.relationship("Comment", lazy="dynamic") def to_review_dict(self): resp_dict = { "id": self.id, "title": self.title, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "status": self.status, "reason": self.reason if self.reason else "" } return resp_dict def to_basic_dict(self): resp_dict = { "id": self.id, "title": self.title, "source": self.source, "digest": self.digest, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "index_image_url": self.index_image_url, "clicks": self.clicks, } return resp_dict def to_dict(self): resp_dict = { "id": self.id, "title": self.title, "source": self.source, "digest": self.digest, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "content": self.content, "comments_count": self.comments.count(), "clicks": self.clicks, "category": self.category.to_dict(), "index_image_url": self.index_image_url, "author": self.user.to_dict() if self.user else None } return resp_dict #評論表 class Comment(BaseModel, db.Model): """評論""" __tablename__ = "info_comment" id = db.Column(db.Integer, primary_key=True) # 評論編號 user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"), nullable=False) # 用戶id news_id = db.Column(db.Integer, db.ForeignKey("info_news.id"), nullable=False) # 新聞id content = db.Column(db.Text, nullable=False) # 評論內容 parent_id = db.Column(db.Integer, db.ForeignKey("info_comment.id")) # 父評論id parent = db.relationship("Comment", remote_side=[id]) # 自關聯 like_count = db.Column(db.Integer, default=0) # 點贊條數 def to_dict(self): resp_dict = { "id": self.id, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "content": self.content, "parent": self.parent.to_dict() if self.parent else None, "user": User.query.get(self.user_id).to_dict(), "news_id": self.news_id, "like_count": self.like_count } return resp_dict #評論點贊表 class CommentLike(BaseModel, db.Model): """評論點贊""" __tablename__ = "info_comment_like" comment_id = db.Column("comment_id", db.Integer, db.ForeignKey("info_comment.id"), primary_key=True) # 評論編號 user_id = db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True) # 用戶編號 #新聞分類表 class Category(BaseModel, db.Model): """新聞分類""" __tablename__ = "info_category" id = db.Column(db.Integer, primary_key=True) # 分類編號 name = db.Column(db.String(64), nullable=False) # 分類名 news_list = db.relationship('News', backref='category', lazy='dynamic') def to_dict(self): resp_dict = { "id": self.id, "name": self.name } return resp_dict
說明: mysql
1.導入datetime包是由於咱們在模型類裏面用到了時間redis
2.文件中導入了兩個庫 generate_password_hash, check_password_hash,第一個是用來加密密碼的,第二個是用來校驗密碼是否正確的sql
3.導入的時候還導入了constants的文件,這個文件目前咱們並沒建立,裏面存放着一些常量信息。數據庫
在info文件夾中新建一個constants.py文件用來存儲一些常量信息:flask
# 圖片驗證碼Redis有效期, 單位:秒 IMAGE_CODE_REDIS_EXPIRES = 300 # 短信驗證碼Redis有效期,單位:秒 SMS_CODE_REDIS_EXPIRES = 300 # 七牛空間域名 QINIU_DOMIN_PREFIX = "http://oyucyko3w.bkt.clouddn.com/" # 首頁展現最多的新聞數量 HOME_PAGE_MAX_NEWS = 10 # 用戶的關注每一頁最多數量 USER_FOLLOWED_MAX_COUNT = 4 # 用戶收藏最多新聞數量 USER_COLLECTION_MAX_NEWS = 10 # 其餘用戶每一頁最多新聞數量 OTHER_NEWS_PAGE_MAX_COUNT = 10 # 點擊排行展現的最多新聞數據 CLICK_RANK_MAX_NEWS = 10 # 管理員頁面用戶每頁多最數據條數 ADMIN_USER_PAGE_MAX_COUNT = 10 # 管理員頁面新聞每頁多最數據條數 ADMIN_NEWS_PAGE_MAX_COUNT = 10
接下來咱們使用命令來完成建表等操做:app
python manage.py mysql init
這樣就成功了 成功之後,就會在文件夾裏自動建立個migrations文件夾ide
建立完文件夾之後,就該去生成遷移文件了:
python manage.py mysql migrate
執行以後:
出現這個的時候,就說明咱們遷移失敗了,咱們這個時候就須要在manage.py裏面導入info文件下的models文件
from info import models
這樣就成了 這樣咱們就能夠繼續去執行咱們的代碼,就成功了
遷移成功之後在versions裏面就會生成一個版本文件
這個時候咱們能夠去mysql數據庫裏看看,成功了就以下就會建立一個表來存放版本:
接下來咱們就能夠從遷移文件到數據庫的創建了
python manage.py mysql upgrade
執行效果:
這樣就成功了,而後咱們就能夠去mysql數據庫裏看看
這樣就成功了
而後咱們能夠加入測試數據來測試一下
測試成功之後表裏就有這些數據了,測試數據的時候可能會碰見亂碼問題,這個時候咱們就須要進入cmd》輸入chcp 65001(意思是指定cmd全部字符編碼強行爲utf8)
在進入mysql,建立表空間的時候指定一下字符集就好了: create database 數據庫名 character set utf8;
在info文件夾裏的init文件裏會發現咱們的redis仍是灰色的 咱們就要去解決這個問題了
咱們去views試圖函數裏導入這個文件,會發現找不到,由於他在函數裏,因此咱們根據db的解決辦法,給他建立一個初始值看看行不行,在給他設置一個參數global(局部變量能夠修改全局變量)
執行之後仍是會發現不行,會報錯
會發現找不到redis_store這個文件,這個問題主要緣由就是程序要一層一層的去導包,而後找不到這個文件,因此咱們能夠等redis先註冊完了之後在導入藍圖,就成了
把咱們所須要的前端文件放在templates文件下,而後再去info>modules>index>views裏去經過render_template這個庫來渲染這個html文件
from . import index_bluep #導入藍圖對象 from flask import render_template @index_bluep.route('/') def index(): """ 首頁 :return: """ return render_template('index.html')
ok了 ,運行之後會發現報錯
這個錯誤主要就是沒有找到這個templates這個文件
咱們去info下的__init__文件裏按住Ctrl點擊Flask進去就會發現templates文件和static在info目錄下,因此會找不到這個文件夾
因此咱們只須要把兩個文件夾放在info目錄下就ok了,
這樣就成功了!
經過這些請求,咱們會發現一個404請求,這個請求就是左側圖標的顯示,由於咱們沒設置,因此他會顯示404錯誤
那麼咱們就來解決這個問題,先把左側圖標放在static靜態文件夾下,而後建立一個視圖函數來處理就ok了
from flask import current_app @index_bluep.route('/favicon.ico') def favicon(): """ 左側圖標設置 :return: """ return current_app.send_static_file('news/favicon.ico')
這樣就成了