from web_apps import db
import datetime
import json
class BaseModel(db.Model):
'''
数据库orm模型基类
'''
__abstract__ = True
id = db.Column(
db.Integer,
primary_key=True,
autoincrement=True,
comment='id主键')
tenant_id = db.Column(db.Integer, default=1, index=True, comment='租户id')
description = db.Column(db.Text, default='', comment='简介')
sort_no = db.Column(db.Float, default=1, comment='排序')
del_flag = db.Column(db.SmallInteger, default=0, comment='软删除标记')
create_by = db.Column(db.String(100), default='', comment='创建者')
create_time = db.Column(
db.TIMESTAMP,
server_default=db.text('CURRENT_TIMESTAMP'),
comment='创建时间')
update_by = db.Column(db.String(100), default='', comment='修改者')
update_time = db.Column(
db.TIMESTAMP,
server_default=db.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
comment='修改时间')
def to_dict(self, date_type='str'):
'''
转为字典
:return:
'''
value = {}
for column in self.__table__.columns:
attribute = getattr(self, column.name)
if isinstance(attribute, datetime.datetime) and date_type == 'str':
attribute = str(attribute)
value[column.name] = attribute
return value
def from_dict(self, attributes):
"""Update the current instance base on attribute->value by *attributes*"""
for attribute in attributes:
setattr(self, attribute, attributes[attribute])
return self
class User(BaseModel):
'''
用户表
'''
__tablename__ = 'sys_user'
username = db.Column(db.String(100), index=True, comment='登录的用户名')
password = db.Column(db.String(256), index=True, comment='密码')
nickname = db.Column(db.String(100), index=True, comment='昵称')
avatar = db.Column(db.String(1024), comment='头像')
birthday = db.Column(db.DateTime, comment='生日')
sex = db.Column(db.SmallInteger, default=0, comment='性别(0-默认未知,1-男,2-女)')
email = db.Column(db.String(45), index=True, comment='邮箱')
phone = db.Column(db.String(45), index=True, comment='手机号')
org_code = db.Column(db.String(64), index=True, comment='登录会话的机构编码')
tenant_id = db.Column(db.Integer, index=True, comment='登录会话的租户id')
status = db.Column(db.SmallInteger, default=1, comment='2-冻结,1-正常,0-禁用')
user_identity = db.Column(db.SmallInteger, default=1, comment='身份(1普通成员 2上级)')
third_id = db.Column(db.String(100), index=True, comment='第三方登陆的唯一标志')
third_type = db.Column(db.String(100), comment='第三方登陆的类型')
work_no = db.Column(db.String(100), index=True, comment='工号')
verify_token = db.Column(db.String(50), default='', comment='验证token')
login_times = db.Column(db.Integer, default=0, comment='登录次数')
login_time = db.Column(db.Integer, comment='上次登录时间')
login_ip = db.Column(db.String(500), comment='上次登录IP')
valid_start_time = db.Column(db.Integer, comment='有效期(开始)')
valid_end_time = db.Column(db.Integer, comment='有效期(结束)')
def _get_join_obj(self):
"""获取用户租户关联对象,不存在则创建"""
join_obj = db.session.query(UserTenantJoin).filter_by(
tenant_id=self.tenant_id,
user_id=self.id
).first()
if not join_obj:
join_obj = UserTenantJoin(
tenant_id=self.tenant_id,
user_id=self.id
).save()
db.session.add(join_obj)
return join_obj
@property
def depart_id_list(self) -> str:
join_obj = db.session.query(UserTenantJoin).filter_by(
tenant_id=self.tenant_id,
user_id=self.id
).first()
return join_obj.depart_id_list if join_obj else '[]'
@property
def post_id_list(self) -> str:
join_obj = db.session.query(UserTenantJoin).filter_by(
tenant_id=self.tenant_id,
user_id=self.id
).first()
return join_obj.post_id_list if join_obj else '[]'
@property
def role_id_list(self) -> str:
join_obj = db.session.query(UserTenantJoin).filter_by(
tenant_id=self.tenant_id,
user_id=self.id
).first()
return join_obj.role_id_list if join_obj else '["1"]'
@property
def tenant_id_list(self) -> str:
join_objs = db.session.query(UserTenantJoin).filter_by(user_id=self.id).all()
return json.dumps([str(i.tenant_id) for i in join_objs])
class Tenant(BaseModel):
'''
租户表
'''
__tablename__ = 'sys_tenant'
name = db.Column(db.String(100), comment='租户名称')
begin_date = db.Column(db.Integer, comment='开始时间')
end_date = db.Column(db.Integer, comment='结束时间')
status = db.Column(db.SmallInteger, default=1, comment='状态 1正常 0冻结')
class UserTenantJoin(BaseModel):
__tablename__ = 'sys_user_tenant_join'
user_id = db.Column(db.Integer, nullable=False, comment='用户ID')
tenant_id = db.Column(db.Integer, nullable=False, comment='租户ID')
depart_id_list = db.Column(db.Text, default='[]', comment='部门列表')
post_id_list = db.Column(db.Text, default='[]', comment='职务列表')
role_id_list = db.Column(db.Text, default='[]', comment='角色列表')
class Role(BaseModel):
'''
角色表
'''
__tablename__ = 'sys_role'
role_name = db.Column(db.String(100), index=True, comment='角色名称')
role_code = db.Column(db.String(100), index=True, comment='角色编码')
status = db.Column(db.SmallInteger, default=1, comment='1-正常,0-禁用')
permissions = db.Column(db.Text, default='[]', comment='权限列表')
class Depart(BaseModel):
'''
部门表
'''
__tablename__ = 'sys_depart'
depart_name = db.Column(db.String(100), index=True, comment='机构/部门名称')
parent_id = db.Column(db.Integer, comment='父级ID')
depart_name_en = db.Column(db.String(500), index=True, comment='英文名')
depart_name_abbr = db.Column(db.String(500), index=True, comment='缩写')
org_category = db.Column(db.SmallInteger, default=1, comment='机构类别 1公司,2组织机构,2岗位')
org_type = db.Column(db.SmallInteger, default=1, comment='机构类型 1一级部门 2子部门')
org_code = db.Column(db.String(100), index=True, comment='机构编码')
mobile = db.Column(db.String(32), comment='手机号')
fax = db.Column(db.String(32), comment='传真')
address = db.Column(db.String(100), comment='地址')
memo = db.Column(db.String(500), comment='备注')
is_leaf = db.Column(db.SmallInteger, default=1, comment='是否叶子节点: 1:是 0:不是')
status = db.Column(db.SmallInteger, default=1, comment='状态(1启用,0不启用)')
qywx_identifier = db.Column(db.String(100), comment='对接企业微信的ID')
permissions = db.Column(db.Text, default='[]', comment='权限列表')
class Position(BaseModel):
'''
职务表
'''
__tablename__ = 'sys_position'
name = db.Column(db.String(100), comment='名称')
code = db.Column(db.String(100), comment='编码')
org_code = db.Column(db.String(100), default='', comment='所属机构编码')
post_rank = db.Column(db.Integer, default=1, comment='职级')
company_id = db.Column(db.Integer, comment='公司id')
class PerMission(BaseModel):
'''
权限表
'''
__tablename__ = 'sys_permission'
name = db.Column(db.String(100), index=True, comment='名称')
parent_id = db.Column(db.Integer, comment='父级ID')
url = db.Column(db.String(255), default="", comment='路径')
component = db.Column(db.String(255), default="", comment='组件')
component_name = db.Column(db.String(100), default="", comment='组件名称')
redirect = db.Column(db.String(255), default="", comment='一级菜单跳转地址')
menu_type = db.Column(db.SmallInteger, default=0, comment='菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)')
perms = db.Column(db.String(255), comment='菜单权限编码')
perms_type = db.Column(db.SmallInteger, default=1, comment='权限策略1显示2禁用')
always_show = db.Column(db.SmallInteger, default=1, comment='聚合子路由: 1是0否')
icon = db.Column(db.String(255), comment='菜单图标')
is_route = db.Column(db.SmallInteger, default=1, comment='是否路由菜单: 0:不是 1:是(默认值1)')
is_leaf = db.Column(db.SmallInteger, default=1, comment='是否叶子节点: 1:是 0:不是')
keep_alive = db.Column(db.SmallInteger, default=1, comment='是否缓存该页面: 1:是 0:不是')
hidden = db.Column(db.SmallInteger, default=1, comment='是否隐藏路由: 0否,1是')
hide_tab = db.Column(db.SmallInteger, default=1, comment='是否隐藏tab: 0否,1是')
rule_flag = db.Column(db.SmallInteger, default=0, comment='是否添加数据权限1是0否')
status = db.Column(db.SmallInteger, default=1, comment='按钮权限状态(0无效1有效)')
internal_or_external = db.Column(db.SmallInteger, default=1, comment='外链菜单打开方式 0/内部打开 1/外部打开')
class Dict(BaseModel):
'''
数据字典表
'''
__tablename__ = 'sys_dict'
dict_name = db.Column(db.String(100), comment='字典名称')
dict_code = db.Column(db.String(100), default='', comment='字典编码')
type = db.Column(db.SmallInteger, default=1, comment='字典值类型,0为string,1为number')
class DictItem(BaseModel):
'''
数据字典详情
'''
__tablename__ = 'sys_dict_item'
dict_id = db.Column(db.Integer, comment='所属字典id')
name = db.Column(db.String(50), comment='字典项文本')
value = db.Column(db.String(50), default='', comment='字典项值')
extend = db.Column(db.Text, default='{}', comment='额外参数')
status = db.Column(db.SmallInteger, default=1, comment='状态(1启用 0禁用)')
class File(BaseModel):
'''
文件资源表
'''
__tablename__ = 'sys_file'
file_name = db.Column(db.String(255), nullable=True, comment='文件名称')
url = db.Column(db.TEXT, nullable=True, comment='文件地址')
file_type = db.Column(db.String(50), nullable=True, comment='文档类型(folder:文件夹 excel:excel doc:word ppt:ppt image:图片 archive:其他文档 video:视频 pdf:pdf)')
store_type = db.Column(db.String(50), nullable=True, comment='文件上传类型(temp/本地上传(临时文件) manage/知识库)')
parent_id = db.Column(db.Integer, comment='父级id')
file_size = db.Column(db.Float, comment='文件大小(kb)')
iz_folder = db.Column(db.SmallInteger, default=0, comment='是否文件夹(1:是 0:否)')
iz_root_folder = db.Column(db.SmallInteger, default=0, comment='是否为1级文件夹,允许为空 (1:是 )')
iz_star = db.Column(db.SmallInteger, default=0, comment='是否标星(1:是 0:否)')
down_count = db.Column(db.Integer, default=0, comment='下载次数')
read_count = db.Column(db.Integer, default=0, comment='阅读次数')
share_url = db.Column(db.String(255), comment='分享链接')
share_perms = db.Column(db.SmallInteger, default=0, comment='分享权限(1.关闭分享 2.允许所有联系人查看 3.允许任何人查看)')
enable_down = db.Column(db.SmallInteger, default=0, comment='是否允许下载(1:是 0:否)')
enable_update = db.Column(db.SmallInteger, default=0, comment='是否允许修改(1:是 0:否)')
class Notice(BaseModel):
'''
通知公告
'''
__tablename__ = 'sys_notice'
title = db.Column(db.String(200), comment='标题')
msg_content = db.Column(db.Text, comment='内容')
start_time = db.Column(db.Integer, comment='开始时间')
end_time = db.Column(db.Integer, comment='结束时间')
sender = db.Column(db.String(100), comment='发送人')
priority = db.Column(db.String(10), default='M', comment='优先级(L低,M中,H高)')
msg_category = db.Column(db.String(10), comment='消息类型1:通知公告2:系统消息')
msg_type = db.Column(db.String(10), comment='通告对象类型(USER:指定用户,ALL:全体用户)')
send_status = db.Column(db.String(10), default='0', comment='发布状态(0未发布,1已发布,2已撤销)')
send_time = db.Column(db.Integer, comment='发送时间')
cancel_time = db.Column(db.Integer, comment='撤销时间')
bus_type = db.Column(db.String(20), comment='业务类型(email:邮件 bpm:流程)')
bus_id = db.Column(db.String(50), comment='业务id')
open_type = db.Column(db.String(20), comment='打开方式(组件:component 路由:url)')
open_page = db.Column(db.String(255), comment='组件/路由 地址')
user_ids = db.Column(db.Text, default='[]', comment='指定用户')
msg_abstract = db.Column(db.Text, default='', comment='摘要')
dt_task_id = db.Column(db.String(100), comment='钉钉task_id,用于撤回消息')
class NoticeSend(BaseModel):
'''
通知公告发送记录
'''
__tablename__ = 'sys_notice_send'
notice_id = db.Column(db.Integer, comment='通知id')
user_id = db.Column(db.Integer, comment='用户id')
read_flag = db.Column(db.SmallInteger, default=0, comment='阅读状态(0未读,1已读)')
star_flag = db.Column(db.SmallInteger, default=0, comment='标星状态( 1为标星 空/0没有标星)')
read_time = db.Column(db.Integer, comment='阅读时间')
if __name__ == '__main__':
from web_apps import db, app
with app.app_context():
db.create_all()
db.session.commit()
db.session.flush()