Пример #1
0
class Message(Base):
    """
    短信表
    """
    __tablename__ = "messages"

    content = db.Column(
        db.String(255),
        nullable=False,
        comment="短信内容",
    )
    user_id = db.Column(db.Integer(), default=0, comment="短信发布者")
    username = db.Column(db.String(20), nullable=False, comment="短信发布者用户名")
    ip = db.Column(db.String(20), default="", comment="ip地址")
    published_at = db.Column(db.DateTime(), default="", comment="发布时间")
    pid = db.Column(db.Integer(), default=0, comment="所属短信id")
    label = db.Column(db.String(100), default="", comment="预留")

    @classmethod
    def _query_search(cls, query, _keyword):
        if _keyword is not None:
            keyword = '%' + str(_keyword) + '%'
            return query.filter(
                or_(
                    cls.content.like(keyword),
                    cls.username.like(keyword),
                ))
        return query
Пример #2
0
class Guestbook(Base):
    """
    留言表
    """
    __tablename__ = "guestbooks"

    content = db.Column(db.String(255), nullable=False, comment="留言内容", )
    user_id = db.Column(db.Integer(), default=0, comment="留言者")
    user_type = db.Column(db.String(5), default="user", comment="用户类型")
    username = db.Column(db.String(20), default="游客", comment="留言着用户名")
    ip = db.Column(db.String(20), default="", comment="ip地址")
    published_at = db.Column(db.DateTime(), default="", comment="留言时间")
    pid = db.Column(db.Integer(), default=0, comment="所属父级留言id")
    root_id = db.Column(db.String(255),index=True, default=0, comment="节点数据")
    open_comment = db.Column(db.Boolean(), default=0, comment="允许回复我留言")
    good = db.Column(db.Integer(), default=0, comment="点赞")
    read = db.Column(db.Integer(), default=0, comment="是否已读")
    label = db.Column(db.String(100), default="", comment="预留")

    @classmethod
    def _query_search(cls, query, _keyword):
        if _keyword is not None:
            keyword = '%' + str(_keyword) + '%'
            return query.filter(or_(cls.content.like(keyword), cls.username.like(keyword), ))
        return query

    def create(self, data):
        with db.auto_commit():
            self.set_attrs(data)
            self.active = 1
            self.open_comment = 1
            self.ip = get_client_ip()
            self.user_id = current_user.id
            self.username = current_user.name
            self.user_type = 'admin'
            self.published_at = time_now()
            self.created_at = time_now()
            self.updated_at = time_now()
            db.session.add(self)

    @classmethod
    def get_list_all_by_id(cls, id=id):
        query = cls.query.filter(cls.is_delete == 0, cls.root_id.like('%' + str(id) + '%'))
        total = query.with_entities(func.count(cls.id)).scalar()
        result = query.all()
        result = array_sort_by_pid(arrays=result, html="", pid=int(id))
        return total, result

    @classmethod
    def get_by_root_id(cls, root_id=root_id):
        return cls.query.filter(cls.is_delete == 0, cls.root_id == root_id).first()
Пример #3
0
class Link(db.Model):
    shortlink = db.Column(db.String(10), primary_key=True)
    url = db.Column(db.String(256), nullable=False)
    created = db.Column(db.DateTime(),
                        server_default=expression.text('now()'),
                        nullable=False)
    expired_time = db.Column(db.Float(),
                             server_default=expression.text('0'),
                             nullable=False)

    @classmethod
    def create(cls, vals):
        link = cls(**vals)
        db.session.add(link)

        return link

    @classmethod
    def generate_new_link(cls, url, expired_time):
        shortlink = LinkEncode.generate_new_link()

        cls.create({
            'shortlink': shortlink,
            'url': url,
            'expired_time': expired_time
        })

        return shortlink

    @classmethod
    def get_by_shortlink(cls, shortlink):
        link = cls.query.filter_by(shortlink=shortlink).first()
        if link and link.expired_time and time.time() > link.expired_time:
            db.session.delete(link)
            return None

        return link

    @classmethod
    def check_shortlink(cls, shortlink):
        return LinkEncode.check_shortlink(shortlink)
Пример #4
0
class Document(Base):
    """
    文档表
    """
    __tablename__ = "documents"

    uuid = db.Column(db.String(100),
                     nullable=False,
                     comment="别名",
                     unique=True,
                     index=True)
    title = db.Column(db.String(100),
                      nullable=False,
                      comment="文档标题",
                      unique=True)
    use_title = db.Column(db.String(100), comment="文档标题带样式")
    sub_title = db.Column(db.String(100), nullable=False, comment="副标题")
    keyword = db.Column(db.String(255), default="", comment="META关键字")
    description = db.Column(db.String(255), default="", comment="META描述")
    label = db.Column(db.String(255), default="", comment="摘要")
    external_link = db.Column(db.String(100), default="", comment="外部链接")
    published_at = db.Column(db.DateTime(), default="", comment="发布时间")
    thumb_image = db.Column(db.String(100), default="", comment="缩略图")
    author = db.Column(db.String(20), default="", comment="作者")
    source = db.Column(db.String(100), default="", comment="来源")
    source_link = db.Column(db.String(100), default="", comment="来源链接")
    attribute = db.Column(db.String(100), default="", comment="属性")
    content = db.Column(db.Text(), default="", comment="正文")
    tags = db.Column(db.String(100), default="", comment="标签", index=True)
    target = db.Column(db.Boolean(), default=0, comment="新窗口打开")
    click = db.Column(db.Integer(), default=0, comment="阅读数")
    editor = db.Column(db.String(100), default="", comment="编辑")
    is_original = db.Column(db.Boolean(), default=0, comment="是否原创")
    open_comment = db.Column(db.Boolean(), default=0, comment="允许评论")
    attach_file = db.Column(db.String(100), default="", comment="附件地址")
    attach_name = db.Column(db.String(100), default="", comment="附件名称")

    column_id = db.Column(db.Integer(),
                          db.ForeignKey('columns.id'),
                          comment="栏目id")
    admin_id = db.Column(db.Integer(),
                         db.ForeignKey('admins.id'),
                         comment="管理员id")

    column = db.relationship('Column',
                             backref=db.backref('documents', lazy="dynamic"))
    admin = db.relationship('Admin',
                            backref=db.backref('documents', lazy="dynamic"))

    login_show = db.Column(db.Boolean(), default=0, comment="登录可见")
    password_txt = db.Column(db.String(100), default=0, comment="不为空为密码可见")
    user_group = db.Column(db.Boolean(), default=0, comment="VIP可见")

    @classmethod
    def _query_search(cls, query, _keyword):
        if _keyword is not None:
            keyword = '%' + str(_keyword) + '%'
            return query.filter(
                or_(
                    cls.title.like(keyword),
                    cls.label.like(keyword),
                    cls.keyword.like(keyword),
                    cls.description.like(keyword),
                    cls.author.like(keyword),
                ))
        return query

    def create(self, data):
        attributes = request.form.getlist('attribute[]')
        with db.auto_commit():
            self.set_attrs(data)
            self.active = 1
            self.admin = current_user
            self.attribute = ",".join(attributes)
            self.created_at = time_now()
            self.updated_at = time_now()
            db.session.add(self)

    def update(self, data, edit_one_field=None):
        """
        edit_one_field 是否表内单个编辑 标识
        :param data:
        :param flag:
        :return:
        """
        attributes = request.form.getlist('attribute[]')
        with db.auto_commit():
            if not edit_one_field:
                self.set_attrs(data)
                self.attribute = ",".join(attributes)
            else:
                self.set_attr(data)
            self.updated_at = time_now()
Пример #5
0
class Base(db.Model):
    """
    __abstract__设置为True,不会创建Base表
    """
    __abstract__ = True

    id = db.Column(db.Integer(),
                   primary_key=True,
                   autoincrement=True,
                   comment="id")
    is_delete = db.Column(db.Boolean(),
                          index=True,
                          default=0,
                          nullable=False,
                          comment="软删除,0未删除,1删除")
    active = db.Column('is_active',
                       db.Boolean(),
                       index=True,
                       default=0,
                       nullable=False,
                       comment="状态")
    created_at = db.Column(db.DateTime(), nullable=True, comment="创建时间")
    updated_at = db.Column(db.DateTime(), nullable=True, comment="修改时间")

    @classmethod
    def get_limit_all(cls):
        limit = int(request.args.get('limit', 10))
        page = int(request.args.get('page', 1))
        field = request.args.get('field', 'id')
        order = request.args.get('order', 'desc')
        _keyword = request.args.get('keyword', None)
        query = cls.query.filter(cls.is_delete == 0)
        query = cls._query_search(query, _keyword)

        if field and order:
            _obj = getattr(cls, field)
            if order == 'desc':
                query = query.order_by(_obj.desc())
            else:
                query = query.order_by(_obj.asc())
        total = query.with_entities(func.count(cls.id)).scalar()
        result = query.limit(limit).offset((page - 1) * limit).all()
        return total, result

    @classmethod
    def get_list_all(cls, is_sort=False):
        """
        不分页,is_sort 指定是否根据pid排序
        :param is_sort:
        :return:
        """
        _keyword = request.args.get('keyword', None)

        query = cls.query.filter(cls.is_delete == 0)
        query = cls._query_search(query, _keyword)
        total = query.with_entities(func.count(cls.id)).scalar()
        result = query.all()
        if _keyword:
            is_sort = False
        # 搜索的话,结果的 html设置为"" ,防止table渲染问题
        result = array_sort_by_pid(
            result) if is_sort else list_result_with_html(result)
        return total, result

    @classmethod
    def get_all_for_select(cls, is_group=False):
        # is_group 是否分组
        result = cls.query.filter_by().all()
        return array_sort_by_pid_whitespace(result) if is_group else result

    @classmethod
    def get_all(cls, is_group=False):
        # is_group 是否分组
        result = cls.query.filter_by().all()
        return array_sort_to_tree(result) if is_group else result

    @classmethod
    def get_all_in_ids(cls, ids=list()):
        return cls.query.filter(cls.id.in_(ids), cls.is_delete == 0).all()

    def create(self, data):

        with db.auto_commit():
            self.set_attrs(data)
            self.active = 1
            self.created_at = time_now()
            self.updated_at = time_now()
            db.session.add(self)

    def update(self, data, edit_one_field=None):
        """
        edit_one_field 是否表内单个编辑 标识
        :param data:
        :param flag:
        :return:
        """
        with db.auto_commit():
            if not edit_one_field:
                self.set_attrs(data)
            else:
                self.set_attr(data)
            self.updated_at = time_now()

    def destroy(self):
        with db.auto_commit():
            self.is_delete = 1

    def set_attrs(self, attrs):
        for key, value in attrs.items():
            if hasattr(self, key) and key != 'id':
                if value is None:
                    setattr(self, key, 0)
                elif isinstance(value, str):
                    setattr(self, key, value.strip())
                else:
                    setattr(self, key, value)

    def set_attr(self, attrs):
        for key, value in attrs.items():
            if hasattr(self,
                       key) and key != 'id' and key in get_request_field():
                if isinstance(value, str):
                    setattr(self, key, value.strip())
                else:
                    setattr(self, key, value)

    @classmethod
    def get_by_id(cls, id):
        return cls.query.filter_by(id=id).api_first_or_404()

    @classmethod
    def get_all_except_by_id(cls, id, is_sort=True):
        """
        查询除了某个id之外的所有结果
         is_sort是根据pid排序,id和未激活的子集都会清除
        :param id:
        :param is_sort:
        :return:
        """
        result = cls.query.filter_by().filter(cls.id != id,
                                              cls.active == 1).all()
        return array_sort_by_pid_whitespace(result) if is_sort else result
Пример #6
0
class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True, nullable=False)
    username = db.Column(db.String(64),
                         unique=True,
                         index=True,
                         nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
    last_seen = db.Column(db.DateTime(), default=datetime.now())

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        if self.role is None:
            if self.email == current_app.config['FLASKY_ADMIN']:
                self.role = Role.query.filter_by(name='超级管理员').first()
            if self.role is None:
                self.role = Role.query.filter_by(id=self.role_id).first()

    @staticmethod
    def insert_admin():
        email = current_app.config["FLASKY_ADMIN"]
        user = User.query.filter_by(email=email).first()
        if user is None:
            role = Role.query.filter_by(name='超级管理员').first()
            u = User(email=email,
                     username="******",
                     password="******",
                     role_id=role.id)
            db.session.add(u)
            db.session.commit()

    @staticmethod
    def insert_manager():
        role = Role.query.filter_by(name='管理员').first()
        u = User(email="*****@*****.**",
                 username="******",
                 password="******",
                 role_id=role.id)
        db.session.add(u)
        db.session.commit()

    @staticmethod
    def insert_member():
        role = Role.query.filter_by(name='会员').first()
        u = User(email="*****@*****.**",
                 username="******",
                 password="******",
                 role_id=role.id)
        db.session.add(u)
        db.session.commit()

    @staticmethod
    def insert_user(email, username, password, role_name):
        user = User.query.filter_by(username=username).first()
        if user is None:
            role = Role.query.filter_by(name=role_name).first()
            user = User(email=email,
                        username=username,
                        password=password,
                        role_id=role.id)
        db.session.add(user)
        db.session.commit()

    @property
    def password(self):
        raise AttributeError(u'文明密码不可读')

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

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

    def can(self, perm):
        return self.role is not None and self.role.has_permission(perm)

    def is_administrator(self):
        return self.can(Permission.ADMIN)