zoukankan      html  css  js  c++  java
  • 新闻咨询平台——模型类设置

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

    表间分析图:

    我们可以在info中新建一个名为models.py的python文件,用于存储模型类定义的相关代码。

    在models文件中放入以下代码:

    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.导入datetime包是因为我们在模型类里面用到了时间

      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

     接下来我们使用命令来完成建表等操作:

    1.建立迁移所用的文件夹

    python manage.py mysql init

     这样就成功了  成功以后,就会在文件夹里自动创建个migrations文件夹

    创建完文件夹以后,就该去生成迁移文件了:

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

    这样就成了

     

     

  • 相关阅读:
    [模仿]Google Doodles 的春分和秋分
    [模仿]canvas视频拼图
    SQL--from w3c school
    txt文件导入mysql
    公益图书馆-基本环境搭建及代码规范
    IP地址
    Android基础_1
    Android_输入输出流
    设计模式(2):观察者模式-2 (委托、事件)
    小张日记 一 正式场合说话要正式
  • 原文地址:https://www.cnblogs.com/yu666666/p/13744026.html
Copyright © 2011-2022 走看看