Пример #1
0
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])  # 设置自关联多对一关系属性时, 需要设置remote_side
    children = db.relationship("Comment",
                               backref=db.backref("parent", 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
Пример #2
0
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,代表用户都关注了哪些人(自关联多对多时,需要设置primaryjoin和secondaryjoin)
    followers = db.relationship('User',
                                secondary=tb_user_follows,
                                # 关系属性根据哪个外键查, primaryjoin就设置哪个外键, 另一个设置为secondaryjoin
                                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
Пример #3
0
class OrderForm(BaseModel, db.Model):
    """订单"""
    __tablename__ = "order_form"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=True)  # 订单id
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False, primary_key=True)  # 用户id
    address_id = db.Column(db.INTEGER, db.ForeignKey('shipping_address.id'), nullable=False,
                           primary_key=True)  # 地址id
    status = db.Column(db.INTEGER, nullable=False, default=0)  # 定单状态,0代付款,1待发货,2待收货,3已签收,4已取消,-1未支付
    payment_method = db.Column(db.INTEGER, nullable=False)  # 付款方式,0支付宝,1银联,2ebay,3微信,-1未支付

    products = db.relationship('Product', backref='order_form', secondary='order_product', lazy='dynamic')
    address = db.relationship('ShippingAddress', backref=db.backref('order_form', uselist=False))
Пример #4
0
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")  # 用户收藏的新闻
    # 当前用户点赞的所有的评论
    like_comments = db.relationship("Comment",
                                    secondary="info_comment_like",
                                    lazy="dynamic")
    # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人(自关联多对多时,需要设置primaryjoin和secondaryjoin)
    followers = db.relationship(
        'User',
        secondary=tb_user_follows,
        # 自关联多对多关系属性必须设置primaryjoin和secondaryjoin
        primaryjoin=(
            id == tb_user_follows.c.followed_id
        ),  # 该关系属性根据哪个外键查, primaryjoin就设置哪个外键, 另一个设置为secondaryjoin
        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 check_password(self, password):
        return check_password_hash(self.password_hash, password)

    # 使用计算型属性来封装加密过程,对于用户来说只需要进行属性赋值,计算等过程由装饰器完成
    @property
    def password(self):
        raise AttributeError("明文密码不可取")

    @password.setter
    def password(self, value):
        self.password_hash = generate_password_hash(value)

    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
Пример #5
0
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),default='user_pic.png')  # 用户头像路径
    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")

    # 当前用户收藏的所有新闻:维护的是User和News的多对多的关系
    collection_news = db.relationship("News", secondary=tb_user_news_collection, lazy="dynamic")  # 用户收藏的新闻
    authors = db.relationship(
        'User',
        lazy='dynamic',
        secondary=tb_user_author,
        backref=db.backref('fans', lazy='dynamic'),
        #当使用对象abc.authors调用时,查询语句中的条件通过primaryjoin指定
        #如果authors表示作者,则abc表示用户
        primaryjoin=id == tb_user_author.c.user_id,
        #当使用对象abc.users调用时,查询语句中的条件通过sencondaryjoin指定
        #如果users表示用户,则abc表示作者
        secondaryjoin=id == tb_user_author.c.author_id
    )

    # 当前用户所发布的新闻:relationship维护的是User和News的一对多的关系
    # backref:维护的是多对一
    news_list = db.relationship('News', backref='author', lazy='dynamic')
    # 登录
    def to_login_dict(self):
        return {
            'id':self.id,
            'nick_name':self.nick_name,
            # 'avatar_url':'/static/news/images/'+self.avatar_url
            "avatar_url":constants.QINIU_DOMIN_PREFIX+self.avatar_url,
            "create_time":self.create_time,
            "update_time":self.update_time,
            "mobile":self.mobile
        }

    def to_dict(self):
        return {
            "id":self.id,
            "nick_name":self.nick_name,
            "avatar_url":constants.QINIU_DOMIN_PREFIX+self.avatar_url,
            "gender":self.gender,
            "signature":self.signature,
            "news_list":self.news_list
        }
    # def set_password(self,password):
    #     self.password_hash=加密函数(password)

    @property
    def password(self):
        """
        这个方法时password属性的getter方法
        :return: 我的思想是:不让通过这个属性读取密码,所以抛异常
        """
        raise AttributeError('can not read')

    @password.setter
    def password(self, value):
        """
        这个方法时password属性的setter方法
        :param value: 外界传入的明文密码
        :return: 密文密码
        """
        self.password_hash = generate_password_hash(value)

    # def set_passwordhash_with_password(self, password):
    #     from werkzeug.security import generate_password_hash, check_password_hash
    #     self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        """
        校验密码
        :param password: 外界传入的密码明文
        :return: 如果校验通过,返回True。反之,返回False
        """
        return check_password_hash(self.password_hash, password)
Пример #6
0
class User(BaseModel, db.Model):
    """
        用户信息
    BaseModel 继承 -- 实现创建时间和更新时间的补充
    db.Model 数据模型 -- 实体和数据库表名建立关系
    """
    # 数据库表名 -- 和当前类绑定
    __tablename__ = "info_user"
    """ORM建立  属性 = 数据库字段"""
    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")  # 默认 男
    """db.relationship设置关系"""
    # 当前用户收藏的所有新闻 -- 关系 ( 新闻表, 中间表, 懒加载 )
    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')  # 懒加载
    # 用户针对新闻的评论信息 -- 关系 ( 评论表, 反向引用--用户表 )
    comments = db.relationship("Comment", backref="user")

    # 用户点过赞的评论信息 -- 关系 ( 评论表, 中间表, 懒加载 )
    like_comments = db.relationship("Comment",
                                    secondary="info_comment_like",
                                    lazy='dynamic')

    # 当前用户所发布的新闻 -- 关系 ( 新闻表, 反向引用--用户表, 懒加载 )
    news_list = db.relationship('News', backref='user', lazy='dynamic')

    # # 粉丝总数
    # followers_count = 0
    # # 新闻总数
    # news_count = 0

    # 装饰器 -- 读取
    @property
    def password(self):
        # 禁止读取
        raise AttributeError("当前属性不可读")

    # 装饰器 -- set
    @password.setter
    def password(self, value):
        """
            设置password
        :param value: 值
        :return:
        """
        # 获取加密后的值 -- 对原密码进行加密
        self.password_hash = generate_password_hash(value)

    def check_passowrd(self, password):
        """
            检测密码
        :param password: 密码
        :return:
        """
        # 解密后, 对比密码是否正确
        return check_password_hash(self.password_hash, password)

    #
    # # 装饰器 -- get
    # @property
    # def news_count(self):
    #     count = 0
    #     for _ in self.news_list:
    #         count += 1
    #     return count
    #
    # # 装饰器 -- get
    # @property
    # def followers_count(self):
    #     count = 0
    #     for _ in self.followers:
    #         count += 1
    #     return count

    def to_dict(self):
        """
            把对象数据转换为字典数据
        """
        # 封装字典
        resp_dict = {
            "id": self.id,
            "nick_name": self.nick_name,
            "mobile": self.mobile,
            "avatar_url": self.avatar_url,
            "is_admin": self.is_admin,
            "signature": self.signature,
            "gender": self.gender,
            "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"),
            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
            "update_time": self.update_time.strftime("%Y-%m-%d %H:%M:%S"),
            "followers_count": self.followers.count(),
            "news_count": self.news_list.count()
        }
        # 返回字典
        return resp_dict
Пример #7
0
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


    # 以下代码定义password属性的setter 和getter方法
    @property
    def password(self):
        raise ArithmeticError('can not read')
    # 明文密码加密
    @password.setter
    def password(self, value):
        self.password_hash = generate_password_hash(value)

    def check_password(self, value):
        """
        检验密码
        :param value: 传入的明文密码
        :return: 返回Ture/False
        """
        return check_password_hash(value)
Пример #8
0
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')
    # 用户针对新闻的评论信息
    comments = db.relationship("Comment", backref="user")

    # 用户点过赞的评论信息
    like_comments = db.relationship("Comment",
                                    secondary="info_comment_like",
                                    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):
        # 检验密码是否正确,正确为true
        return check_password_hash(self.password_hash, password)

    def to_dict(self):
        """将用户对象信息转换为字典数据"""
        resp_dict = {
            "id": self.id,
            "nick_name": self.nick_name,
            "mobile": self.mobile,
            "avatar_url": self.avatar_url,
            "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
            "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"),
            "gender": self.gender,
            "signature": self.signature,
        }

        return resp_dict
Пример #9
0
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',
            name='gender_types',
        ),
        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装饰的方法,可以当成属性来使用,比如: print(user.password)
    @property
    def password(self):
        raise AttributeError("当前属性不可读")

    #@password.setter给password方法,加了一个设置方法, 比如: user.password = '******'
    @password.setter
    def password(self, value):
        #使用了系统的generate_password_hash方法,使用的是sha256算法加密
        self.password_hash = generate_password_hash(value)

    def check_password(self, password):
        #系统提供的校验密码的方法,check_password_hash,传递密文和明文,返回的是True或者False
        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
Пример #10
0
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), default='user_pic.png')  # 用户头像路径
    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")

    # 当前用户收藏的所有新闻:维护的是User和News的多对多的关系
    collection_news = db.relationship("News",
                                      secondary=tb_user_news_collection,
                                      lazy="dynamic")  # 用户收藏的新闻
    authors = db.relationship(
        'User',
        lazy='dynamic',
        secondary=tb_user_author,
        backref=db.backref('users', lazy='dynamic'),
        #当前对象调用authors属性时,使用primaryjoin条件
        primaryjoin=id == tb_user_author.c.user_id,
        #当前对象调用backref属性即users时,使用secondaryjoin条件
        secondaryjoin=id == tb_user_author.c.author_id)

    # 当前用户所发布的新闻:relationship维护的是User和News的一对多的关系
    # backref:维护的是多对一
    news_list = db.relationship('News', backref='user', lazy='dynamic')

    @property
    def password(self):
        """
        这个方法时password属性的getter方法
        :return: 我的思想是:不让通过这个属性读取密码,所以抛异常
        """
        raise AttributeError('can not read')

    @password.setter
    def password(self, value):
        """
        这个方法时password属性的setter方法
        :param value: 外界传入的明文密码
        :return: 密文密码
        """
        self.password_hash = generate_password_hash(value)

    #对象.password(参数)===>对象.password=参数
    # def set_passwordhash_with_password(self, password):
    #     from werkzeug.security import generate_password_hash, check_password_hash
    #     self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        """
        校验密码
        :param password: 外界传入的密码明文
        :return: 如果校验通过,返回True。反之,返回False
        """
        return check_password_hash(self.password_hash, password)

    def to_login_dict(self):
        return {
            'id': self.id,
            'nick_name': self.nick_name,
            # 'avatar_url':'/static/news/images/'+self.avatar_url
            'avatar_url': constants.QINIU_DOMIN_PREFIX + self.avatar_url
        }

    def to_dict(self):
        return {
            'id': self.id,
            'nick_name': self.nick_name,
            'signature': self.signature if self.signature else '',
            'gender': self.gender,
            'total_news': self.news_list.count(),
            'total_fans': self.users.count(),
            'avatar_url': constants.QINIU_DOMIN_PREFIX + self.avatar_url
        }

    def to_admin_dict(self):
        return {
            'id': self.id,
            'nick_name': self.nick_name,
            'create_time': self.create_time,
            'update_time': self.update_time,
            'mobile': self.mobile
        }
Пример #11
0
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")

    # 当前用户收藏的所有新闻:维护的是User和News的多对多的关系
    collection_news = db.relationship("News",
                                      secondary=tb_user_news_collection,
                                      lazy="dynamic")  # 用户收藏的新闻
    authors = db.relationship('User',
                              lazy='dynamic',
                              secondary=tb_user_author,
                              primaryjoin=id == tb_user_author.c.user_id,
                              secondaryjoin=id == tb_user_author.c.author_id,
                              backref=db.backref('users', lazy='dynamic'))

    # 当前用户所发布的新闻:relationship维护的是User和News的一对多的关系
    # backref:维护的是多对一
    news_list = db.relationship('News', backref='user', lazy='dynamic')

    def to_dict(self):
        """用于将模型对象转字典,方便渲染模板和给ajax响应json数据
        提示:本次操作需要了解一下,因为Django当中会继续这类操作,在DRF中会讲一个概念"序列化"
        将模型对象转字典 : 就是序列化(一般用于做数据的响应前的操作)
        """
        resp_dict = {
            "id":
            self.id,
            "nick_name":
            self.nick_name,
            # http://oyucyko3w.bkt.clouddn.com/Fg-7WDaDihkttxOclQqZkMC3KUqf
            "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

    @property
    def password(self):
        """
        这个方法时password属性的getter方法
        :return: 我的思想是:不让通过这个属性读取密码,所以抛异常
        """
        raise AttributeError('can not read')

    @password.setter
    def password(self, value):
        """
        这个方法时password属性的setter方法
        :param value: 外界传入的明文密码
        :return: 密文密码
        """
        self.password_hash = generate_password_hash(value)

    # def set_passwordhash_with_password(self, password):
    #     from werkzeug.security import generate_password_hash, check_password_hash
    #     self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        """
        校验密码
        :param password: 外界传入的密码明文
        :return: 如果校验通过,返回True。反之,返回False
        """
        return check_password_hash(self.password_hash, password)
Пример #12
0
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="info_user_collection",
                                      lazy="dynamic")  # 用户收藏的新闻
    # 当前用户点赞的所有评论
    like_comments = db.relationship("Comment",
                                    secondary="info_comment_like",
                                    lazy="dynamic")

    # 用户所有的粉丝    自关联多对多关系属性,需要设置primaryjoin和secondaryjoin
    followers = db.relationship(
        'User',
        secondary="info_user_fans",
        # 该关系属性根据哪个外键查, primaryjoin就设置哪个外键, 另一个设置为secondaryjoin
        primaryjoin="UserFollow.followed_id==User.id",
        secondaryjoin="UserFollow.follower_id==User.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_passoword(self, password):
        """
        校验密码
        :param password: 用户输入的明文
        :return: True表示校验成功
        """
        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