新闻咨询平台 ———模型类设置

一.表间结构分析及模型类建立

表间分析图: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')

这样就成了

 

 

 

 

 

 

相关文章
相关标签/搜索