关键词:
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from utils 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‘)
@property
def password(self):
raise AttributeError("当前属性不可读")
@password.setter
def password(self, value):
self.password_hash = generate_password_hash(value)
def check_passowrd(self, password):
return check_password_hash(self.password_hash, password)
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
flask配置文件的几种方法(代码片段)
配置文件的参数flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:‘DEBUG‘:get_debug_flag(default=False),是否开启Debug模式‘TESTING‘:False,是否开启测试模式‘PROPAGATE_EXCEPTIONS‘:None,‘PRESERVE_CONTEXT_ON_EXCEPTION‘:None,‘... 查看详情
flask配置文件的几种方法(代码片段)
Flask配置文件的几种方法一,属性方式app.env='TESTING'app.debug=True根据app的属性进行环境配置二,字典方式app.config.from_mapping('ENV':'development','DEBUG':True)或者通过字典的key来配置app.c 查看详情
17.在vue中怎么动态样式类的几种方式(代码片段)
这节课,我们来看下Vue中动态设置样式的几种方式。在Vue中有专门为class和style的v-bind用法提供了特殊的功能增强。除了字符串外,表达式的值也可以是对象或数组。我经常用的一种模式就是使用boolean标志,如下所示:<template>... 查看详情
定义常量的几种方式与调用(代码片段)
1 .通过接口的形式1interfaceColorConstant2/**3*红色4*/5intRED=1;6/**7*黄色8*/9intYELLOW=2;1011调用方式:ColorConstant.RED2.通过枚举类的形式(自定义的带有name,index属性的枚举类型必须要写构造函数)1enumConstantEnum2RED("红色",1),YELLOW("黄 查看详情
得到class类的几种方式与常用方法(代码片段)
得到Class类的几种方式与常用方法Class类Class类的常用方法获得Class类的实例代码如下//测试classs类的创建方式有哪些publicclassTest03publicstaticvoidmain(String[]args)throwsClassNotFoundExceptionPersonperson=newStudent();System.out.println(" 查看详情
flask学习-96.flask-sqlalchemy判断查询结果是否存在的几种方式(代码片段)
...0c;再进行下一步操作。这里总结了判断查询结果是否存在的几种方式count()统计个数count()方法返回记录条数,使用示例withapp.app_context():count=Students.query.filter(Students.name=='yy').count 查看详情
flask上下文管理源码分析(代码片段)
...用上下文临时把某些对象变为全局可访问首先我们做如下的几种情况的假设情况一:单进程单线程这种情况可以基于全局变量存储临时的对象情况二:单进程多线程这种情况会出现多个线程共享全局的变量,为了每个线程中的数... 查看详情
出现undefind和null的几种情况(代码片段)
1、变量未定义:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Document</title></head><body><script>console.log(a);//undefined</script& 查看详情
[pytorch]pytorch中模型的参数初始化的几种方法(转)(代码片段)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~本文目录1.xavier初始化2.kaiming初始化3.实际使用中看到的初始化3.1ResNeXt,densenet中初始化3.2wide-residual-networks中初始化(MSRinit)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~转载请注明出处:http://www.cnbl 查看详情
cuda中的几种并行计算模型(代码片段)
BackgroundCUDA编程中由于threadspace和inputspace通常是不同的:ThreadSpace最多可以是5D,2DGrid+3DBlockInputSpace通常是1D,有时也有2D的矩阵等这就导致了我们需要将inputs映射到threads中去,比如我在《CUDA中线程与数据的对应... 查看详情
submit的几种情况(代码片段)
1、最普通的用法*CodeusedtoexecuteareportSUBMITZreport.2、带select-options程序的Submit的用法*Codeusedtopopulate‘select-options‘&executereportDATA:seltabtypetableofrsparams,seltab_walikelineofseltab.seltab_wa-seln 查看详情
迭代器失效的几种情况(代码片段)
引言:最近自己写代码用到了删除链表中某个节点操作,因为迭代器使用不规范,造成了程序崩溃。例如,对某个迭代器解引用所获得的值并不是执行erase()前这个迭代器指向的值,还有可能对未指向任何元素的迭... 查看详情
javascriptjs中定义对象的几种方式(转)
JavaScript学习12JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象。 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2... 查看详情
论项目中静态库符号冲突的几种解决方式(代码片段)
在实际项目过程中,我们经常会碰到引入三方的静态库后出现符号冲突的现象,也就是出现duplicatesymbols错误,那么如何解决这类冲突呢?这里我们区分几种不同的冲突情况最复杂的情况:项目中使用的libSDKA.a和libSDKB.a中有符号冲突,这... 查看详情
js中定义对象的几种方式
... JavaScript中没有类的概念,只有对象。 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型(“prototype”)方式 5.动态原型方式 一.基于已有... 查看详情
复合(组合)索引失效的几种情况总结(代码片段)
创建一张测试表:EMP表CREATETABLEemp(idINT(11)NOTNULLAUTO_INCREMENT,empnoINTNOTNULL,NAMEVARCHAR(30)DEFAULTNULL,ageINT(13)DEFAULTNULL,deptIdINT(11)DEFAULTNULL,PRIMARYKEY(id))ENGINE=INNODBAUTO_INCREMEN 查看详情
javascript学习12js中定义对象的几种方式
avaScript学习12JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象。 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.... 查看详情
评估机器学习模型的几种方法(验证集的重要性)(代码片段)
什么是评估机器学习模型 机器学习的目的是得到可以泛化(generalize)的模型,即在前所未见的数据上表现很好的模型,而过拟合则是核心难点。你只能控制可以观察的事情,所以能够可靠地衡量模型的泛化能... 查看详情