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