1. 程式人生 > 實用技巧 >新聞專案——專案準備——分析與測試

新聞專案——專案準備——分析與測試

第一步:表間結構分析

表間結構示意圖:

第二步: 模型類分析

模型類準備:

在info資料夾中儲存著我們的所有的業務邏輯,所以,我們可以在info中新建一個名為models.py的python檔案,用於儲存模型類定義的相關程式碼。

在models.py中放入下面的程式碼

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

說明:

  1. 匯入時間是因為我們在模型類中用到了時間
  2. 檔案中匯入了兩個庫generate_password_hash, check_password_hash,第一個是用來加密密碼的,第二個是用來校驗密碼是否正確的
  3. 匯入的時候還匯入了constants的檔案,這個檔案目前我們並沒建立,裡面存放著一些常量資訊。

在info資料夾中新建一個constants.py檔案用來儲存一些常量資訊:

# 圖片驗證碼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

第三步:匯入測試資料

我們在操作檯使用命令來建立遷移所需要的資料夾

python manage.py mysql init

接著生成遷移表

python manage.py mysql migrate

這裡執行之後會發現沒有生成成功。

沒有的成功的原因是我們並沒有把models匯入到啟動檔案中,匯入程式碼:

from info import models

匯入之後我們再重新執行:

執行完成後遷移資料夾中就有一個新的遷移檔案了