新聞諮詢平臺 ———模型類設置

一.表間結構分析及模型類建立

表間分析圖: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
View Code

說明: 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
View Code

 

 接下來咱們使用命令來完成建表等操做:app

1.創建遷移所用的文件夾

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')

這樣就成了

 

 

 

 

 

 

相關文章
相關標籤/搜索