初始提交
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, Column, DateTime, Integer, String
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysConfig(Base):
|
||||
"""
|
||||
参数配置表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_config'
|
||||
__table_args__ = {'comment': '参数配置表'}
|
||||
|
||||
config_id = Column(Integer, primary_key=True, nullable=False, autoincrement=True, comment='参数主键')
|
||||
config_name = Column(String(100), nullable=True, server_default="''", comment='参数名称')
|
||||
config_key = Column(String(100), nullable=True, server_default="''", comment='参数键名')
|
||||
config_value = Column(String(500), nullable=True, server_default="''", comment='参数键值')
|
||||
config_type = Column(CHAR(1), nullable=True, server_default='N', comment='系统内置(Y是 N否)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(
|
||||
String(500),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
@@ -0,0 +1,46 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, Integer, String
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysDept(Base):
|
||||
"""
|
||||
部门表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_dept'
|
||||
__table_args__ = {'comment': '部门表'}
|
||||
|
||||
dept_id = Column(BigInteger, primary_key=True, autoincrement=True, comment='部门id')
|
||||
parent_id = Column(BigInteger, server_default='0', comment='父部门id')
|
||||
ancestors = Column(String(50), nullable=True, server_default="''", comment='祖级列表')
|
||||
dept_name = Column(String(30), nullable=True, server_default="''", comment='部门名称')
|
||||
order_num = Column(Integer, server_default='0', comment='显示顺序')
|
||||
leader = Column(
|
||||
String(20),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='负责人',
|
||||
)
|
||||
phone = Column(
|
||||
String(11),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='联系电话',
|
||||
)
|
||||
email = Column(
|
||||
String(50),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='邮箱',
|
||||
)
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='部门状态(0正常 1停用)')
|
||||
del_flag = Column(CHAR(1), nullable=True, server_default='0', comment='删除标志(0代表存在 2代表删除)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
@@ -0,0 +1,70 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, Integer, String
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysDictType(Base):
|
||||
"""
|
||||
字典类型表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_dict_type'
|
||||
__table_args__ = {'comment': '字典类型表'}
|
||||
|
||||
dict_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='字典主键')
|
||||
dict_name = Column(String(100), nullable=True, server_default="''", comment='字典名称')
|
||||
dict_type = Column(String(100), unique=True, nullable=True, server_default="''", comment='字典类型')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='状态(0正常 1停用)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(
|
||||
String(500),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
|
||||
|
||||
class SysDictData(Base):
|
||||
"""
|
||||
字典数据表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_dict_data'
|
||||
__table_args__ = {'comment': '字典数据表'}
|
||||
|
||||
dict_code = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='字典编码')
|
||||
dict_sort = Column(Integer, nullable=True, server_default='0', comment='字典排序')
|
||||
dict_label = Column(String(100), nullable=True, server_default="''", comment='字典标签')
|
||||
dict_value = Column(String(100), nullable=True, server_default="''", comment='字典键值')
|
||||
dict_type = Column(String(100), nullable=True, server_default="''", comment='字典类型')
|
||||
css_class = Column(
|
||||
String(100),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='样式属性(其他样式扩展)',
|
||||
)
|
||||
list_class = Column(
|
||||
String(100),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='表格回显样式',
|
||||
)
|
||||
is_default = Column(CHAR(1), nullable=True, server_default='N', comment='是否默认(Y是 N否)')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='状态(0正常 1停用)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(
|
||||
String(500),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
@@ -0,0 +1,58 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, String
|
||||
|
||||
from config.database import Base
|
||||
|
||||
|
||||
class SysJob(Base):
|
||||
"""
|
||||
定时任务调度表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_job'
|
||||
__table_args__ = {'comment': '定时任务调度表'}
|
||||
|
||||
job_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='任务ID')
|
||||
job_name = Column(String(64), primary_key=True, nullable=False, server_default="''", comment='任务名称')
|
||||
job_group = Column(String(64), primary_key=True, nullable=False, server_default='default', comment='任务组名')
|
||||
job_executor = Column(String(64), nullable=True, server_default='default', comment='任务执行器')
|
||||
invoke_target = Column(String(500), nullable=False, comment='调用目标字符串')
|
||||
job_args = Column(String(255), nullable=True, server_default="''", comment='位置参数')
|
||||
job_kwargs = Column(String(255), nullable=True, server_default="''", comment='关键字参数')
|
||||
cron_expression = Column(String(255), nullable=True, server_default="''", comment='cron执行表达式')
|
||||
misfire_policy = Column(
|
||||
String(20),
|
||||
nullable=True,
|
||||
server_default='3',
|
||||
comment='计划执行错误策略(1立即执行 2执行一次 3放弃执行)',
|
||||
)
|
||||
concurrent = Column(CHAR(1), nullable=True, server_default='1', comment='是否并发执行(0允许 1禁止)')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='状态(0正常 1暂停)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(String(500), nullable=True, server_default="''", comment='备注信息')
|
||||
|
||||
|
||||
class SysJobLog(Base):
|
||||
"""
|
||||
定时任务调度日志表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_job_log'
|
||||
__table_args__ = {'comment': '定时任务调度日志表'}
|
||||
|
||||
job_log_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='任务日志ID')
|
||||
job_name = Column(String(64), nullable=False, comment='任务名称')
|
||||
job_group = Column(String(64), nullable=False, comment='任务组名')
|
||||
job_executor = Column(String(64), nullable=False, comment='任务执行器')
|
||||
invoke_target = Column(String(500), nullable=False, comment='调用目标字符串')
|
||||
job_args = Column(String(255), nullable=True, server_default="''", comment='位置参数')
|
||||
job_kwargs = Column(String(255), nullable=True, server_default="''", comment='关键字参数')
|
||||
job_trigger = Column(String(255), nullable=True, server_default="''", comment='任务触发器')
|
||||
job_message = Column(String(500), nullable=True, comment='日志信息')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='执行状态(0正常 1失败)')
|
||||
exception_info = Column(String(2000), nullable=True, server_default="''", comment='异常信息')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
@@ -0,0 +1,60 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, Index, Integer, String
|
||||
|
||||
from config.database import Base
|
||||
|
||||
|
||||
class SysLogininfor(Base):
|
||||
"""
|
||||
系统访问记录
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_logininfor'
|
||||
__table_args__ = {'comment': '系统访问记录'}
|
||||
|
||||
info_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='访问ID')
|
||||
user_name = Column(String(50), nullable=True, server_default="''", comment='用户账号')
|
||||
ipaddr = Column(String(128), nullable=True, server_default="''", comment='登录IP地址')
|
||||
login_location = Column(String(255), nullable=True, server_default="''", comment='登录地点')
|
||||
browser = Column(String(50), nullable=True, server_default="''", comment='浏览器类型')
|
||||
os = Column(String(50), nullable=True, server_default="''", comment='操作系统')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='登录状态(0成功 1失败)')
|
||||
msg = Column(String(255), nullable=True, server_default="''", comment='提示消息')
|
||||
login_time = Column(DateTime, nullable=True, default=datetime.now(), comment='访问时间')
|
||||
|
||||
idx_sys_logininfor_s = Index('idx_sys_logininfor_s', status)
|
||||
idx_sys_logininfor_lt = Index('idx_sys_logininfor_lt', login_time)
|
||||
|
||||
|
||||
class SysOperLog(Base):
|
||||
"""
|
||||
操作日志记录
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_oper_log'
|
||||
__table_args__ = {'comment': '操作日志记录'}
|
||||
|
||||
oper_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='日志主键')
|
||||
title = Column(String(50), nullable=True, server_default="''", comment='模块标题')
|
||||
business_type = Column(Integer, nullable=True, server_default='0', comment='业务类型(0其它 1新增 2修改 3删除)')
|
||||
method = Column(String(100), nullable=True, server_default="''", comment='方法名称')
|
||||
request_method = Column(String(10), nullable=True, server_default="''", comment='请求方式')
|
||||
operator_type = Column(
|
||||
Integer, nullable=True, server_default='0', comment='操作类别(0其它 1后台用户 2手机端用户)'
|
||||
)
|
||||
oper_name = Column(String(50), nullable=True, server_default="''", comment='操作人员')
|
||||
dept_name = Column(String(50), nullable=True, server_default="''", comment='部门名称')
|
||||
oper_url = Column(String(255), nullable=True, server_default="''", comment='请求URL')
|
||||
oper_ip = Column(String(128), nullable=True, server_default="''", comment='主机地址')
|
||||
oper_location = Column(String(255), nullable=True, server_default="''", comment='操作地点')
|
||||
oper_param = Column(String(2000), nullable=True, server_default="''", comment='请求参数')
|
||||
json_result = Column(String(2000), nullable=True, server_default="''", comment='返回参数')
|
||||
status = Column(Integer, nullable=True, server_default='0', comment='操作状态(0正常 1异常)')
|
||||
error_msg = Column(String(2000), nullable=True, server_default="''", comment='错误消息')
|
||||
oper_time = Column(DateTime, nullable=True, default=datetime.now(), comment='操作时间')
|
||||
cost_time = Column(BigInteger, nullable=True, server_default='0', comment='消耗时间')
|
||||
|
||||
idx_sys_oper_log_bt = Index('idx_sys_oper_log_bt', business_type)
|
||||
idx_sys_oper_log_s = Index('idx_sys_oper_log_s', status)
|
||||
idx_sys_oper_log_ot = Index('idx_sys_oper_log_ot', oper_time)
|
||||
@@ -0,0 +1,52 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, Integer, String
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysMenu(Base):
|
||||
"""
|
||||
菜单权限表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_menu'
|
||||
__table_args__ = {'comment': '菜单权限表'}
|
||||
|
||||
menu_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='菜单ID')
|
||||
menu_name = Column(String(50), nullable=False, comment='菜单名称')
|
||||
parent_id = Column(BigInteger, nullable=True, server_default='0', comment='父菜单ID')
|
||||
order_num = Column(Integer, server_default='0', comment='显示顺序')
|
||||
path = Column(String(200), nullable=True, server_default="''", comment='路由地址')
|
||||
component = Column(
|
||||
String(255),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='组件路径',
|
||||
)
|
||||
query = Column(
|
||||
String(255),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='路由参数',
|
||||
)
|
||||
route_name = Column(String(50), nullable=True, server_default="''", comment='路由名称')
|
||||
is_frame = Column(Integer, nullable=True, server_default='1', comment='是否为外链(0是 1否)')
|
||||
is_cache = Column(Integer, nullable=True, server_default='0', comment='是否缓存(0缓存 1不缓存)')
|
||||
menu_type = Column(CHAR(1), nullable=True, server_default="''", comment='菜单类型(M目录 C菜单 F按钮)')
|
||||
visible = Column(CHAR(1), nullable=True, server_default='0', comment='菜单状态(0显示 1隐藏)')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='菜单状态(0正常 1停用)')
|
||||
perms = Column(
|
||||
String(100),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='权限标识',
|
||||
)
|
||||
icon = Column(String(100), nullable=True, server_default='#', comment='菜单图标')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(String(500), nullable=True, server_default="''", comment='备注')
|
||||
@@ -0,0 +1,38 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, Column, DateTime, Integer, LargeBinary, String
|
||||
from sqlalchemy.dialects import mysql
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysNotice(Base):
|
||||
"""
|
||||
通知公告表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_notice'
|
||||
__table_args__ = {'comment': '通知公告表'}
|
||||
|
||||
notice_id = Column(Integer, primary_key=True, nullable=False, autoincrement=True, comment='公告ID')
|
||||
notice_title = Column(String(50), nullable=False, comment='公告标题')
|
||||
notice_type = Column(CHAR(1), nullable=False, comment='公告类型(1通知 2公告)')
|
||||
notice_content = Column(
|
||||
mysql.LONGBLOB if DataBaseConfig.db_type == 'mysql' else LargeBinary,
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type, False),
|
||||
comment='公告内容',
|
||||
)
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='公告状态(0正常 1关闭)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, comment='创建时间', default=datetime.now())
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, comment='更新时间', default=datetime.now())
|
||||
remark = Column(
|
||||
String(255),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
@@ -0,0 +1,32 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, Integer, String
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysPost(Base):
|
||||
"""
|
||||
岗位信息表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_post'
|
||||
__table_args__ = {'comment': '岗位信息表'}
|
||||
|
||||
post_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='岗位ID')
|
||||
post_code = Column(String(64), nullable=False, comment='岗位编码')
|
||||
post_name = Column(String(50), nullable=False, comment='岗位名称')
|
||||
post_sort = Column(Integer, nullable=False, comment='显示顺序')
|
||||
status = Column(CHAR(1), nullable=False, comment='状态(0正常 1停用)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(
|
||||
String(500),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
@@ -0,0 +1,76 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, Integer, SmallInteger, String
|
||||
from sqlalchemy.dialects import mysql
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysRole(Base):
|
||||
"""
|
||||
角色信息表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_role'
|
||||
__table_args__ = {'comment': '角色信息表'}
|
||||
|
||||
role_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='角色ID')
|
||||
role_name = Column(String(30), nullable=False, comment='角色名称')
|
||||
role_key = Column(String(100), nullable=False, comment='角色权限字符串')
|
||||
role_sort = Column(Integer, nullable=False, comment='显示顺序')
|
||||
data_scope = Column(
|
||||
CHAR(1),
|
||||
nullable=True,
|
||||
server_default='1',
|
||||
comment='数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
|
||||
)
|
||||
menu_check_strictly = Column(
|
||||
mysql.TINYINT(display_width=1) if DataBaseConfig.db_type == 'mysql' else SmallInteger,
|
||||
nullable=True,
|
||||
server_default='1',
|
||||
comment='菜单树选择项是否关联显示',
|
||||
)
|
||||
dept_check_strictly = Column(
|
||||
mysql.TINYINT(display_width=1) if DataBaseConfig.db_type == 'mysql' else SmallInteger,
|
||||
nullable=True,
|
||||
server_default='1',
|
||||
comment='部门树选择项是否关联显示',
|
||||
)
|
||||
status = Column(CHAR(1), nullable=False, comment='角色状态(0正常 1停用)')
|
||||
del_flag = Column(CHAR(1), nullable=True, server_default='0', comment='删除标志(0代表存在 2代表删除)')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
|
||||
remark = Column(
|
||||
String(500),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
|
||||
|
||||
class SysRoleDept(Base):
|
||||
"""
|
||||
角色和部门关联表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_role_dept'
|
||||
__table_args__ = {'comment': '角色和部门关联表'}
|
||||
|
||||
role_id = Column(BigInteger, primary_key=True, nullable=False, comment='角色ID')
|
||||
dept_id = Column(BigInteger, primary_key=True, nullable=False, comment='部门ID')
|
||||
|
||||
|
||||
class SysRoleMenu(Base):
|
||||
"""
|
||||
角色和菜单关联表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_role_menu'
|
||||
__table_args__ = {'comment': '角色和菜单关联表'}
|
||||
|
||||
role_id = Column(BigInteger, primary_key=True, nullable=False, comment='角色ID')
|
||||
menu_id = Column(BigInteger, primary_key=True, nullable=False, comment='菜单ID')
|
||||
@@ -0,0 +1,71 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import CHAR, BigInteger, Column, DateTime, String
|
||||
|
||||
from config.database import Base
|
||||
from config.env import DataBaseConfig
|
||||
from utils.common_util import SqlalchemyUtil
|
||||
|
||||
|
||||
class SysUser(Base):
|
||||
"""
|
||||
用户信息表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_user'
|
||||
__table_args__ = {'comment': '用户信息表'}
|
||||
|
||||
user_id = Column(BigInteger, primary_key=True, nullable=False, autoincrement=True, comment='用户ID')
|
||||
dept_id = Column(
|
||||
BigInteger,
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type, False),
|
||||
comment='部门ID',
|
||||
)
|
||||
user_name = Column(String(30), nullable=False, comment='用户账号')
|
||||
nick_name = Column(String(30), nullable=False, comment='用户昵称')
|
||||
user_type = Column(String(2), nullable=True, server_default='00', comment='用户类型(00系统用户)')
|
||||
email = Column(String(50), nullable=True, server_default="''", comment='用户邮箱')
|
||||
phonenumber = Column(String(11), nullable=True, server_default="''", comment='手机号码')
|
||||
sex = Column(CHAR(1), nullable=True, server_default='0', comment='用户性别(0男 1女 2未知)')
|
||||
avatar = Column(String(100), nullable=True, server_default="''", comment='头像地址')
|
||||
password = Column(String(100), nullable=True, server_default="''", comment='密码')
|
||||
status = Column(CHAR(1), nullable=True, server_default='0', comment='帐号状态(0正常 1停用)')
|
||||
del_flag = Column(CHAR(1), nullable=True, server_default='0', comment='删除标志(0代表存在 2代表删除)')
|
||||
login_ip = Column(String(128), nullable=True, server_default="''", comment='最后登录IP')
|
||||
login_date = Column(DateTime, nullable=True, comment='最后登录时间')
|
||||
pwd_update_date = Column(DateTime, nullable=True, comment='密码最后更新时间')
|
||||
create_by = Column(String(64), nullable=True, server_default="''", comment='创建者')
|
||||
create_time = Column(DateTime, nullable=True, comment='创建时间', default=datetime.now())
|
||||
update_by = Column(String(64), nullable=True, server_default="''", comment='更新者')
|
||||
update_time = Column(DateTime, nullable=True, comment='更新时间', default=datetime.now())
|
||||
remark = Column(
|
||||
String(500),
|
||||
nullable=True,
|
||||
server_default=SqlalchemyUtil.get_server_default_null(DataBaseConfig.db_type),
|
||||
comment='备注',
|
||||
)
|
||||
|
||||
|
||||
class SysUserRole(Base):
|
||||
"""
|
||||
用户和角色关联表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_user_role'
|
||||
__table_args__ = {'comment': '用户和角色关联表'}
|
||||
|
||||
user_id = Column(BigInteger, primary_key=True, nullable=False, comment='用户ID')
|
||||
role_id = Column(BigInteger, primary_key=True, nullable=False, comment='角色ID')
|
||||
|
||||
|
||||
class SysUserPost(Base):
|
||||
"""
|
||||
用户与岗位关联表
|
||||
"""
|
||||
|
||||
__tablename__ = 'sys_user_post'
|
||||
__table_args__ = {'comment': '用户与岗位关联表'}
|
||||
|
||||
user_id = Column(BigInteger, primary_key=True, nullable=False, comment='用户ID')
|
||||
post_id = Column(BigInteger, primary_key=True, nullable=False, comment='岗位ID')
|
||||
@@ -0,0 +1,29 @@
|
||||
from typing import Any
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class CacheMonitorModel(BaseModel):
|
||||
"""
|
||||
缓存监控信息对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
command_stats: list | None = Field(default=[], description='命令统计')
|
||||
db_size: int | None = Field(default=None, description='Key数量')
|
||||
info: dict | None = Field(default={}, description='Redis信息')
|
||||
|
||||
|
||||
class CacheInfoModel(BaseModel):
|
||||
"""
|
||||
缓存监控对象对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
cache_key: str | None = Field(default=None, description='缓存键名')
|
||||
cache_name: str | None = Field(default=None, description='缓存名称')
|
||||
cache_value: Any | None = Field(default=None, description='缓存内容')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
@@ -0,0 +1,15 @@
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class UploadResponseModel(BaseModel):
|
||||
"""
|
||||
上传响应模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
file_name: str | None = Field(default=None, description='新文件映射路径')
|
||||
new_file_name: str | None = Field(default=None, description='新文件名称')
|
||||
original_filename: str | None = Field(default=None, description='原文件名称')
|
||||
url: str | None = Field(default=None, description='新文件url')
|
||||
@@ -0,0 +1,73 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Size
|
||||
|
||||
|
||||
class ConfigModel(BaseModel):
|
||||
"""
|
||||
参数配置表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
config_id: int | None = Field(default=None, description='参数主键')
|
||||
config_name: str | None = Field(default=None, description='参数名称')
|
||||
config_key: str | None = Field(default=None, description='参数键名')
|
||||
config_value: str | None = Field(default=None, description='参数键值')
|
||||
config_type: Literal['Y', 'N'] | None = Field(default=None, description='系统内置(Y是 N否)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
|
||||
@NotBlank(field_name='config_key', message='参数名称不能为空')
|
||||
@Size(field_name='config_key', min_length=0, max_length=100, message='参数名称长度不能超过100个字符')
|
||||
def get_config_key(self) -> str | None:
|
||||
return self.config_key
|
||||
|
||||
@NotBlank(field_name='config_name', message='参数键名不能为空')
|
||||
@Size(field_name='config_name', min_length=0, max_length=100, message='参数键名长度不能超过100个字符')
|
||||
def get_config_name(self) -> str | None:
|
||||
return self.config_name
|
||||
|
||||
@NotBlank(field_name='config_value', message='参数键值不能为空')
|
||||
@Size(field_name='config_value', min_length=0, max_length=500, message='参数键值长度不能超过500个字符')
|
||||
def get_config_value(self) -> str | None:
|
||||
return self.config_value
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_config_key()
|
||||
self.get_config_name()
|
||||
self.get_config_value()
|
||||
|
||||
|
||||
class ConfigQueryModel(ConfigModel):
|
||||
"""
|
||||
参数配置管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class ConfigPageQueryModel(ConfigQueryModel):
|
||||
"""
|
||||
参数配置管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteConfigModel(BaseModel):
|
||||
"""
|
||||
删除参数配置模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
config_ids: str = Field(description='需要删除的参数主键')
|
||||
@@ -0,0 +1,87 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import Network, NotBlank, Size
|
||||
|
||||
|
||||
class DeptModel(BaseModel):
|
||||
"""
|
||||
部门表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
dept_id: int | None = Field(default=None, description='部门id')
|
||||
parent_id: int | None = Field(default=None, description='父部门id')
|
||||
ancestors: str | None = Field(default=None, description='祖级列表')
|
||||
dept_name: str | None = Field(default=None, description='部门名称')
|
||||
order_num: int | None = Field(default=None, description='显示顺序')
|
||||
leader: str | None = Field(default=None, description='负责人')
|
||||
phone: str | None = Field(default=None, description='联系电话')
|
||||
email: str | None = Field(default=None, description='邮箱')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='部门状态(0正常 1停用)')
|
||||
del_flag: Literal['0', '2'] | None = Field(default=None, description='删除标志(0代表存在 2代表删除)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
|
||||
@NotBlank(field_name='dept_name', message='部门名称不能为空')
|
||||
@Size(field_name='dept_name', min_length=0, max_length=30, message='部门名称长度不能超过30个字符')
|
||||
def get_dept_name(self) -> str | None:
|
||||
return self.dept_name
|
||||
|
||||
@NotBlank(field_name='order_num', message='显示顺序不能为空')
|
||||
def get_order_num(self) -> int | None:
|
||||
return self.order_num
|
||||
|
||||
@Size(field_name='phone', min_length=0, max_length=11, message='联系电话长度不能超过11个字符')
|
||||
def get_phone(self) -> str | None:
|
||||
return self.phone
|
||||
|
||||
@Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确')
|
||||
@Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
|
||||
def get_email(self) -> str | None:
|
||||
return self.email
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_dept_name()
|
||||
self.get_order_num()
|
||||
self.get_phone()
|
||||
self.get_email()
|
||||
|
||||
|
||||
class DeptQueryModel(DeptModel):
|
||||
"""
|
||||
部门管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class DeptTreeModel(BaseModel):
|
||||
"""
|
||||
部门树模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
id: int = Field(description='部门id')
|
||||
label: str = Field(description='部门名称')
|
||||
parent_id: int = Field(description='父部门id')
|
||||
children: list['DeptTreeModel'] | None = Field(default=None, description='子部门树')
|
||||
|
||||
|
||||
class DeleteDeptModel(BaseModel):
|
||||
"""
|
||||
删除部门模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
dept_ids: str = Field(default=None, description='需要删除的部门id')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: str | None = Field(default=None, description='更新时间')
|
||||
@@ -0,0 +1,147 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Pattern, Size
|
||||
|
||||
|
||||
class DictTypeModel(BaseModel):
|
||||
"""
|
||||
字典类型表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
dict_id: int | None = Field(default=None, description='字典主键')
|
||||
dict_name: str | None = Field(default=None, description='字典名称')
|
||||
dict_type: str | None = Field(default=None, description='字典类型')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='状态(0正常 1停用)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
|
||||
@NotBlank(field_name='dict_name', message='字典名称不能为空')
|
||||
@Size(field_name='dict_name', min_length=0, max_length=100, message='字典类型名称长度不能超过100个字符')
|
||||
def get_dict_name(self) -> str | None:
|
||||
return self.dict_name
|
||||
|
||||
@NotBlank(field_name='dict_type', message='字典类型不能为空')
|
||||
@Size(field_name='dict_type', min_length=0, max_length=100, message='字典类型类型长度不能超过100个字符')
|
||||
@Pattern(
|
||||
field_name='dict_type',
|
||||
regexp='^[a-z][a-z0-9_]*$',
|
||||
message='字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)',
|
||||
)
|
||||
def get_dict_type(self) -> str | None:
|
||||
return self.dict_type
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_dict_name()
|
||||
self.get_dict_type()
|
||||
|
||||
|
||||
class DictDataModel(BaseModel):
|
||||
"""
|
||||
字典数据表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
dict_code: int | None = Field(default=None, description='字典编码')
|
||||
dict_sort: int | None = Field(default=None, description='字典排序')
|
||||
dict_label: str | None = Field(default=None, description='字典标签')
|
||||
dict_value: str | None = Field(default=None, description='字典键值')
|
||||
dict_type: str | None = Field(default=None, description='字典类型')
|
||||
css_class: str | None = Field(default=None, description='样式属性(其他样式扩展)')
|
||||
list_class: str | None = Field(default=None, description='表格回显样式')
|
||||
is_default: Literal['Y', 'N'] | None = Field(default=None, description='是否默认(Y是 N否)')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='状态(0正常 1停用)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
|
||||
@NotBlank(field_name='dict_label', message='字典标签不能为空')
|
||||
@Size(field_name='dict_label', min_length=0, max_length=100, message='字典标签长度不能超过100个字符')
|
||||
def get_dict_label(self) -> str | None:
|
||||
return self.dict_label
|
||||
|
||||
@NotBlank(field_name='dict_value', message='字典键值不能为空')
|
||||
@Size(field_name='dict_value', min_length=0, max_length=100, message='字典键值长度不能超过100个字符')
|
||||
def get_dict_value(self) -> str | None:
|
||||
return self.dict_value
|
||||
|
||||
@NotBlank(field_name='dict_type', message='字典类型不能为空')
|
||||
@Size(field_name='dict_type', min_length=0, max_length=100, message='字典类型长度不能超过100个字符')
|
||||
def get_dict_type(self) -> str | None:
|
||||
return self.dict_type
|
||||
|
||||
@Size(field_name='css_class', min_length=0, max_length=100, message='样式属性长度不能超过100个字符')
|
||||
def get_css_class(self) -> str | None:
|
||||
return self.css_class
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_dict_label()
|
||||
self.get_dict_value()
|
||||
self.get_dict_type()
|
||||
self.get_css_class()
|
||||
|
||||
|
||||
class DictTypeQueryModel(DictTypeModel):
|
||||
"""
|
||||
字典类型管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class DictTypePageQueryModel(DictTypeQueryModel):
|
||||
"""
|
||||
字典类型管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteDictTypeModel(BaseModel):
|
||||
"""
|
||||
删除字典类型模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
dict_ids: str = Field(description='需要删除的字典主键')
|
||||
|
||||
|
||||
class DictDataQueryModel(DictDataModel):
|
||||
"""
|
||||
字典数据管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class DictDataPageQueryModel(DictDataQueryModel):
|
||||
"""
|
||||
字典数据管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteDictDataModel(BaseModel):
|
||||
"""
|
||||
删除字典数据模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
dict_codes: str = Field(description='需要删除的字典编码')
|
||||
@@ -0,0 +1,132 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Size
|
||||
|
||||
|
||||
class JobModel(BaseModel):
|
||||
"""
|
||||
定时任务调度表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
job_id: int | None = Field(default=None, description='任务ID')
|
||||
job_name: str | None = Field(default=None, description='任务名称')
|
||||
job_group: str | None = Field(default=None, description='任务组名')
|
||||
job_executor: str | None = Field(default=None, description='任务执行器')
|
||||
invoke_target: str | None = Field(default=None, description='调用目标字符串')
|
||||
job_args: str | None = Field(default=None, description='位置参数')
|
||||
job_kwargs: str | None = Field(default=None, description='关键字参数')
|
||||
cron_expression: str | None = Field(default=None, description='cron执行表达式')
|
||||
misfire_policy: Literal['1', '2', '3'] | None = Field(
|
||||
default=None, description='计划执行错误策略(1立即执行 2执行一次 3放弃执行)'
|
||||
)
|
||||
concurrent: Literal['0', '1'] | None = Field(default=None, description='是否并发执行(0允许 1禁止)')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='状态(0正常 1暂停)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注信息')
|
||||
|
||||
@NotBlank(field_name='invoke_target', message='调用目标字符串不能为空')
|
||||
@Size(field_name='invoke_target', min_length=0, max_length=500, message='调用目标字符串长度不能超过500个字符')
|
||||
def get_invoke_target(self) -> str | None:
|
||||
return self.invoke_target
|
||||
|
||||
@NotBlank(field_name='cron_expression', message='Cron执行表达式不能为空')
|
||||
@Size(field_name='cron_expression', min_length=0, max_length=255, message='Cron执行表达式不能超过255个字符')
|
||||
def get_cron_expression(self) -> str | None:
|
||||
return self.cron_expression
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_invoke_target()
|
||||
self.get_cron_expression()
|
||||
|
||||
|
||||
class JobLogModel(BaseModel):
|
||||
"""
|
||||
定时任务调度日志表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
job_log_id: int | None = Field(default=None, description='任务日志ID')
|
||||
job_name: str | None = Field(default=None, description='任务名称')
|
||||
job_group: str | None = Field(default=None, description='任务组名')
|
||||
job_executor: str | None = Field(default=None, description='任务执行器')
|
||||
invoke_target: str | None = Field(default=None, description='调用目标字符串')
|
||||
job_args: str | None = Field(default=None, description='位置参数')
|
||||
job_kwargs: str | None = Field(default=None, description='关键字参数')
|
||||
job_trigger: str | None = Field(default=None, description='任务触发器')
|
||||
job_message: str | None = Field(default=None, description='日志信息')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='执行状态(0正常 1失败)')
|
||||
exception_info: str | None = Field(default=None, description='异常信息')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
|
||||
|
||||
class JobQueryModel(JobModel):
|
||||
"""
|
||||
定时任务管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class JobPageQueryModel(JobQueryModel):
|
||||
"""
|
||||
定时任务管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class EditJobModel(JobModel):
|
||||
"""
|
||||
编辑定时任务模型
|
||||
"""
|
||||
|
||||
type: str | None = Field(default=None, description='操作类型')
|
||||
|
||||
|
||||
class DeleteJobModel(BaseModel):
|
||||
"""
|
||||
删除定时任务模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
job_ids: str = Field(description='需要删除的定时任务ID')
|
||||
|
||||
|
||||
class JobLogQueryModel(JobLogModel):
|
||||
"""
|
||||
定时任务日志不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class JobLogPageQueryModel(JobLogQueryModel):
|
||||
"""
|
||||
定时任务日志管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteJobLogModel(BaseModel):
|
||||
"""
|
||||
删除定时任务日志模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
job_log_ids: str = Field(description='需要删除的定时任务日志ID')
|
||||
@@ -0,0 +1,127 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class OperLogModel(BaseModel):
|
||||
"""
|
||||
操作日志表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
oper_id: int | None = Field(default=None, description='日志主键')
|
||||
title: str | None = Field(default=None, description='模块标题')
|
||||
business_type: Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] | None = (
|
||||
Field(
|
||||
default=None, description='业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8生成代码 9清空数据)'
|
||||
)
|
||||
)
|
||||
method: str | None = Field(default=None, description='方法名称')
|
||||
request_method: str | None = Field(default=None, description='请求方式')
|
||||
operator_type: Literal[0, 1, 2] | None = Field(default=None, description='操作类别(0其它 1后台用户 2手机端用户)')
|
||||
oper_name: str | None = Field(default=None, description='操作人员')
|
||||
dept_name: str | None = Field(default=None, description='部门名称')
|
||||
oper_url: str | None = Field(default=None, description='请求URL')
|
||||
oper_ip: str | None = Field(default=None, description='主机地址')
|
||||
oper_location: str | None = Field(default=None, description='操作地点')
|
||||
oper_param: str | None = Field(default=None, description='请求参数')
|
||||
json_result: str | None = Field(default=None, description='返回参数')
|
||||
status: Literal[0, 1, '0', '1'] | None = Field(default=None, description='操作状态(0正常 1异常)')
|
||||
error_msg: str | None = Field(default=None, description='错误消息')
|
||||
oper_time: datetime | None = Field(default=None, description='操作时间')
|
||||
cost_time: int | None = Field(default=None, description='消耗时间')
|
||||
|
||||
|
||||
class LogininforModel(BaseModel):
|
||||
"""
|
||||
登录日志表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
info_id: int | None = Field(default=None, description='访问ID')
|
||||
user_name: str | None = Field(default=None, description='用户账号')
|
||||
ipaddr: str | None = Field(default=None, description='登录IP地址')
|
||||
login_location: str | None = Field(default=None, description='登录地点')
|
||||
browser: str | None = Field(default=None, description='浏览器类型')
|
||||
os: str | None = Field(default=None, description='操作系统')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='登录状态(0成功 1失败)')
|
||||
msg: str | None = Field(default=None, description='提示消息')
|
||||
login_time: datetime | None = Field(default=None, description='访问时间')
|
||||
|
||||
|
||||
class OperLogQueryModel(OperLogModel):
|
||||
"""
|
||||
操作日志管理不分页查询模型
|
||||
"""
|
||||
|
||||
order_by_column: str | None = Field(default=None, description='排序的字段名称')
|
||||
is_asc: Literal['ascending', 'descending'] | None = Field(
|
||||
default=None, description='排序方式(ascending升序 descending降序)'
|
||||
)
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class OperLogPageQueryModel(OperLogQueryModel):
|
||||
"""
|
||||
操作日志管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteOperLogModel(BaseModel):
|
||||
"""
|
||||
删除操作日志模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
oper_ids: str = Field(description='需要删除的日志主键')
|
||||
|
||||
|
||||
class LoginLogQueryModel(LogininforModel):
|
||||
"""
|
||||
登录日志管理不分页查询模型
|
||||
"""
|
||||
|
||||
order_by_column: str | None = Field(default=None, description='排序的字段名称')
|
||||
is_asc: Literal['ascending', 'descending'] | None = Field(
|
||||
default=None, description='排序方式(ascending升序 descending降序)'
|
||||
)
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class LoginLogPageQueryModel(LoginLogQueryModel):
|
||||
"""
|
||||
登录日志管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteLoginLogModel(BaseModel):
|
||||
"""
|
||||
删除登录日志模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
info_ids: str = Field(description='需要删除的访问ID')
|
||||
|
||||
|
||||
class UnlockUser(BaseModel):
|
||||
"""
|
||||
解锁用户模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
user_name: str = Field(description='用户名称')
|
||||
@@ -0,0 +1,93 @@
|
||||
import re
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
from exceptions.exception import ModelValidatorException
|
||||
from module_admin.entity.vo.menu_vo import MenuModel
|
||||
|
||||
|
||||
class UserLogin(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
user_name: str = Field(description='用户名称')
|
||||
password: str = Field(description='用户密码')
|
||||
code: str | None = Field(default=None, description='验证码')
|
||||
uuid: str | None = Field(default=None, description='会话编号')
|
||||
login_info: dict | None = Field(default=None, description='登录信息,前端无需传递')
|
||||
captcha_enabled: bool | None = Field(default=None, description='是否启用验证码,前端无需传递')
|
||||
|
||||
|
||||
class UserRegister(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
username: str = Field(description='用户名称')
|
||||
password: str = Field(description='用户密码')
|
||||
confirm_password: str = Field(description='用户二次确认密码')
|
||||
code: str | None = Field(default=None, description='验证码')
|
||||
uuid: str | None = Field(default=None, description='会话编号')
|
||||
|
||||
@model_validator(mode='after')
|
||||
def check_password(self) -> 'UserRegister':
|
||||
pattern = r"""^[^<>"'|\\]+$"""
|
||||
if self.password is None or re.match(pattern, self.password):
|
||||
return self
|
||||
raise ModelValidatorException(message='密码不能包含非法字符:< > " \' \\ |')
|
||||
|
||||
|
||||
class Token(BaseModel):
|
||||
access_token: str = Field(description='token信息')
|
||||
token_type: str = Field(description='token类型')
|
||||
|
||||
|
||||
class LoginToken(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
token: str = Field(description='token信息')
|
||||
|
||||
|
||||
class CaptchaCode(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
captcha_enabled: bool = Field(description='是否启用验证码')
|
||||
register_enabled: bool = Field(description='是否启用注册')
|
||||
img: str = Field(description='验证码图片')
|
||||
uuid: str = Field(description='会话编号')
|
||||
|
||||
|
||||
class SmsCode(BaseModel):
|
||||
is_success: bool | None = Field(default=None, description='操作是否成功')
|
||||
sms_code: str = Field(description='短信验证码')
|
||||
session_id: str = Field(description='会话编号')
|
||||
message: str | None = Field(default=None, description='响应信息')
|
||||
|
||||
|
||||
class MenuTreeModel(MenuModel):
|
||||
children: list['MenuTreeModel'] | None | None = Field(default=None, description='子菜单')
|
||||
|
||||
|
||||
class MetaModel(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
title: str | None = Field(default=None, description='设置路由在侧边栏和面包屑中展示的名字')
|
||||
icon: str | None = Field(default=None, description='设置路由的图标')
|
||||
no_cache: bool | None = Field(default=None, description='设置为true,则不会被 <keep-alive>缓存')
|
||||
link: str | None = Field(default=None, description='内链地址(http(s)://开头)')
|
||||
|
||||
|
||||
class RouterModel(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
name: str | None = Field(default=None, description='路由名称')
|
||||
path: str | None = Field(default=None, description='路由地址')
|
||||
hidden: bool | None = Field(default=None, description='是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现')
|
||||
redirect: str | None = Field(
|
||||
default=None, description='重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击'
|
||||
)
|
||||
component: str | None = Field(default=None, description='组件地址')
|
||||
query: str | None = Field(default=None, description='路由参数:如 {"id": 1, "name": "ry"}')
|
||||
always_show: bool | None = Field(
|
||||
default=None, description='当你一个路由下面的children声明的路由大于1个时,自动会变成嵌套的模式--如组件页面'
|
||||
)
|
||||
meta: MetaModel | None = Field(default=None, description='其他元素')
|
||||
children: list['RouterModel'] | None | None = Field(default=None, description='子路由')
|
||||
@@ -0,0 +1,100 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Size
|
||||
|
||||
|
||||
class MenuModel(BaseModel):
|
||||
"""
|
||||
菜单表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
menu_id: int | None = Field(default=None, description='菜单ID')
|
||||
menu_name: str | None = Field(default=None, description='菜单名称')
|
||||
parent_id: int | None = Field(default=None, description='父菜单ID')
|
||||
order_num: int | None = Field(default=None, description='显示顺序')
|
||||
path: str | None = Field(default=None, description='路由地址')
|
||||
component: str | None = Field(default=None, description='组件路径')
|
||||
query: str | None = Field(default=None, description='路由参数')
|
||||
route_name: str | None = Field(default=None, description='路由名称')
|
||||
is_frame: Literal[0, 1] | None = Field(default=None, description='是否为外链(0是 1否)')
|
||||
is_cache: Literal[0, 1] | None = Field(default=None, description='是否缓存(0缓存 1不缓存)')
|
||||
menu_type: Literal['M', 'C', 'F'] | None = Field(default=None, description='菜单类型(M目录 C菜单 F按钮)')
|
||||
visible: Literal['0', '1'] | None = Field(default=None, description='菜单状态(0显示 1隐藏)')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='菜单状态(0正常 1停用)')
|
||||
perms: str | None = Field(default=None, description='权限标识')
|
||||
icon: str | None = Field(default=None, description='菜单图标')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
|
||||
@NotBlank(field_name='menu_name', message='菜单名称不能为空')
|
||||
@Size(field_name='menu_name', min_length=0, max_length=50, message='菜单名称长度不能超过50个字符')
|
||||
def get_menu_name(self) -> str | None:
|
||||
return self.menu_name
|
||||
|
||||
@NotBlank(field_name='order_num', message='显示顺序不能为空')
|
||||
def get_order_num(self) -> int | None:
|
||||
return self.order_num
|
||||
|
||||
@Size(field_name='path', min_length=0, max_length=200, message='路由地址长度不能超过200个字符')
|
||||
def get_path(self) -> str | None:
|
||||
return self.path
|
||||
|
||||
@Size(field_name='component', min_length=0, max_length=255, message='组件路径长度不能超过255个字符')
|
||||
def get_component(self) -> str | None:
|
||||
return self.component
|
||||
|
||||
@NotBlank(field_name='menu_type', message='菜单类型不能为空')
|
||||
def get_menu_type(self) -> Literal['M', 'C', 'F'] | None:
|
||||
return self.menu_type
|
||||
|
||||
@Size(field_name='perms', min_length=0, max_length=100, message='权限标识长度不能超过100个字符')
|
||||
def get_perms(self) -> str | None:
|
||||
return self.perms
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_menu_name()
|
||||
self.get_order_num()
|
||||
self.get_path()
|
||||
self.get_component()
|
||||
self.get_menu_type()
|
||||
self.get_perms()
|
||||
|
||||
|
||||
class MenuQueryModel(MenuModel):
|
||||
"""
|
||||
菜单管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class MenuTreeModel(BaseModel):
|
||||
"""
|
||||
菜单树模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
id: int = Field(description='菜单id')
|
||||
label: str = Field(description='菜单名称')
|
||||
parent_id: int = Field(description='父菜单id')
|
||||
children: list['MenuTreeModel'] | None = Field(default=None, description='子菜单树')
|
||||
|
||||
|
||||
class DeleteMenuModel(BaseModel):
|
||||
"""
|
||||
删除菜单模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
menu_ids: str = Field(description='需要删除的菜单ID')
|
||||
@@ -0,0 +1,62 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Size, Xss
|
||||
|
||||
|
||||
class NoticeModel(BaseModel):
|
||||
"""
|
||||
通知公告表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
notice_id: int | None = Field(default=None, description='公告ID')
|
||||
notice_title: str | None = Field(default=None, description='公告标题')
|
||||
notice_type: Literal['1', '2'] | None = Field(default=None, description='公告类型(1通知 2公告)')
|
||||
notice_content: bytes | None = Field(default=None, description='公告内容')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='公告状态(0正常 1关闭)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
|
||||
@Xss(field_name='notice_title', message='公告标题不能包含脚本字符')
|
||||
@NotBlank(field_name='notice_title', message='公告标题不能为空')
|
||||
@Size(field_name='notice_title', min_length=0, max_length=50, message='公告标题不能超过50个字符')
|
||||
def get_notice_title(self) -> str | None:
|
||||
return self.notice_title
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_notice_title()
|
||||
|
||||
|
||||
class NoticeQueryModel(NoticeModel):
|
||||
"""
|
||||
通知公告管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class NoticePageQueryModel(NoticeQueryModel):
|
||||
"""
|
||||
通知公告管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeleteNoticeModel(BaseModel):
|
||||
"""
|
||||
删除通知公告模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
notice_ids: str = Field(description='需要删除的公告ID')
|
||||
@@ -0,0 +1,51 @@
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class OnlineModel(BaseModel):
|
||||
"""
|
||||
在线用户对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
token_id: str | None = Field(default=None, description='会话编号')
|
||||
user_name: str | None = Field(default=None, description='登录名称')
|
||||
dept_name: str | None = Field(default=None, description='所属部门')
|
||||
ipaddr: str | None = Field(default=None, description='主机')
|
||||
login_location: str | None = Field(default=None, description='登录地点')
|
||||
browser: str | None = Field(default=None, description='浏览器类型')
|
||||
os: str | None = Field(default=None, description='操作系统')
|
||||
login_time: datetime | None = Field(default=None, description='登录时间')
|
||||
|
||||
|
||||
class OnlineQueryModel(OnlineModel):
|
||||
"""
|
||||
岗位管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class OnlinePageResponseModel(BaseModel):
|
||||
"""
|
||||
在线用户分页响应模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
rows: list[OnlineModel] = Field(description='在线用户记录列表')
|
||||
total: int = Field(description='总记录数')
|
||||
|
||||
|
||||
class DeleteOnlineModel(BaseModel):
|
||||
"""
|
||||
强退在线用户模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
token_ids: str = Field(description='需要强退的会话编号')
|
||||
@@ -0,0 +1,72 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Size
|
||||
|
||||
|
||||
class PostModel(BaseModel):
|
||||
"""
|
||||
岗位信息表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
post_id: int | None = Field(default=None, description='岗位ID')
|
||||
post_code: str | None = Field(default=None, description='岗位编码')
|
||||
post_name: str | None = Field(default=None, description='岗位名称')
|
||||
post_sort: int | None = Field(default=None, description='显示顺序')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='状态(0正常 1停用)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
|
||||
@NotBlank(field_name='post_code', message='岗位编码不能为空')
|
||||
@Size(field_name='post_code', min_length=0, max_length=64, message='岗位编码长度不能超过64个字符')
|
||||
def get_post_code(self) -> str | None:
|
||||
return self.post_code
|
||||
|
||||
@NotBlank(field_name='post_name', message='岗位名称不能为空')
|
||||
@Size(field_name='post_name', min_length=0, max_length=50, message='岗位名称长度不能超过50个字符')
|
||||
def get_post_name(self) -> str | None:
|
||||
return self.post_name
|
||||
|
||||
@NotBlank(field_name='post_sort', message='显示顺序不能为空')
|
||||
def get_post_sort(self) -> int | None:
|
||||
return self.post_sort
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_post_code()
|
||||
self.get_post_name()
|
||||
self.get_post_sort()
|
||||
|
||||
|
||||
class PostQueryModel(PostModel):
|
||||
"""
|
||||
岗位管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class PostPageQueryModel(PostQueryModel):
|
||||
"""
|
||||
岗位管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class DeletePostModel(BaseModel):
|
||||
"""
|
||||
删除岗位模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
post_ids: str = Field(description='需要删除的岗位ID')
|
||||
@@ -0,0 +1,157 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import NotBlank, Size
|
||||
|
||||
|
||||
class RoleModel(BaseModel):
|
||||
"""
|
||||
角色表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
role_id: int | None = Field(default=None, description='角色ID')
|
||||
role_name: str | None = Field(default=None, description='角色名称')
|
||||
role_key: str | None = Field(default=None, description='角色权限字符串')
|
||||
role_sort: int | None = Field(default=None, description='显示顺序')
|
||||
data_scope: Literal['1', '2', '3', '4', '5'] | None = Field(
|
||||
default=None,
|
||||
description='数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限)',
|
||||
)
|
||||
menu_check_strictly: int | bool | None = Field(default=None, description='菜单树选择项是否关联显示')
|
||||
dept_check_strictly: int | bool | None = Field(default=None, description='部门树选择项是否关联显示')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='角色状态(0正常 1停用)')
|
||||
del_flag: Literal['0', '2'] | None = Field(default=None, description='删除标志(0代表存在 2代表删除)')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
admin: bool | None = Field(default=False, description='是否为admin')
|
||||
|
||||
@field_validator('menu_check_strictly', 'dept_check_strictly')
|
||||
@classmethod
|
||||
def check_filed_mapping(cls, v: int | bool) -> int | bool:
|
||||
if v == 1:
|
||||
v = True
|
||||
elif v == 0:
|
||||
v = False
|
||||
elif v is True:
|
||||
v = 1
|
||||
elif v is False:
|
||||
v = 0
|
||||
return v
|
||||
|
||||
@model_validator(mode='after')
|
||||
def check_admin(self) -> 'RoleModel':
|
||||
if self.role_id == 1:
|
||||
self.admin = True
|
||||
else:
|
||||
self.admin = False
|
||||
return self
|
||||
|
||||
@NotBlank(field_name='role_name', message='角色名称不能为空')
|
||||
@Size(field_name='role_name', min_length=0, max_length=30, message='角色名称长度不能超过30个字符')
|
||||
def get_role_name(self) -> str | None:
|
||||
return self.role_name
|
||||
|
||||
@NotBlank(field_name='role_key', message='权限字符不能为空')
|
||||
@Size(field_name='role_key', min_length=0, max_length=100, message='权限字符长度不能超过100个字符')
|
||||
def get_role_key(self) -> str | None:
|
||||
return self.role_key
|
||||
|
||||
@NotBlank(field_name='role_sort', message='显示顺序不能为空')
|
||||
def get_role_sort(self) -> int | None:
|
||||
return self.role_sort
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_role_name()
|
||||
self.get_role_key()
|
||||
self.get_role_sort()
|
||||
|
||||
|
||||
class RoleMenuModel(BaseModel):
|
||||
"""
|
||||
角色和菜单关联表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
role_id: int | None = Field(default=None, description='角色ID')
|
||||
menu_id: int | None = Field(default=None, description='菜单ID')
|
||||
|
||||
|
||||
class RoleDeptModel(BaseModel):
|
||||
"""
|
||||
角色和部门关联表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
role_id: int | None = Field(default=None, description='角色ID')
|
||||
dept_id: int | None = Field(default=None, description='部门ID')
|
||||
|
||||
|
||||
class RoleQueryModel(RoleModel):
|
||||
"""
|
||||
角色管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class RolePageQueryModel(RoleQueryModel):
|
||||
"""
|
||||
角色管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class RoleMenuQueryModel(BaseModel):
|
||||
"""
|
||||
角色菜单查询模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
menus: list = Field(default=[], description='菜单信息')
|
||||
checked_keys: list[int] = Field(default=[], description='已选择的菜单ID信息')
|
||||
|
||||
|
||||
class RoleDeptQueryModel(BaseModel):
|
||||
"""
|
||||
角色部门查询模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
depts: list = Field(default=[], description='部门信息')
|
||||
checked_keys: list[int] = Field(default=[], description='已选择的部门ID信息')
|
||||
|
||||
|
||||
class AddRoleModel(RoleModel):
|
||||
"""
|
||||
新增角色模型
|
||||
"""
|
||||
|
||||
dept_ids: list = Field(default=[], description='部门ID信息')
|
||||
menu_ids: list = Field(default=[], description='菜单ID信息')
|
||||
type: str | None = Field(default=None, description='操作类型')
|
||||
|
||||
|
||||
class DeleteRoleModel(BaseModel):
|
||||
"""
|
||||
删除角色模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
role_ids: str = Field(description='需要删除的角色ID')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
@@ -0,0 +1,66 @@
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class CpuInfo(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
cpu_num: int | None = Field(default=None, description='核心数')
|
||||
used: float | None = Field(default=None, description='CPU用户使用率')
|
||||
sys: float | None = Field(default=None, description='CPU系统使用率')
|
||||
free: float | None = Field(default=None, description='CPU当前空闲率')
|
||||
|
||||
|
||||
class MemoryInfo(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
total: str | None = Field(default=None, description='内存总量')
|
||||
used: str | None = Field(default=None, description='已用内存')
|
||||
free: str | None = Field(default=None, description='剩余内存')
|
||||
usage: float | None = Field(default=None, description='使用率')
|
||||
|
||||
|
||||
class SysInfo(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
computer_ip: str | None = Field(default=None, description='服务器IP')
|
||||
computer_name: str | None = Field(default=None, description='服务器名称')
|
||||
os_arch: str | None = Field(default=None, description='系统架构')
|
||||
os_name: str | None = Field(default=None, description='操作系统')
|
||||
user_dir: str | None = Field(default=None, description='项目路径')
|
||||
|
||||
|
||||
class PyInfo(MemoryInfo):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
name: str | None = Field(default=None, description='Python名称')
|
||||
version: str | None = Field(default=None, description='Python版本')
|
||||
start_time: str | None = Field(default=None, description='启动时间')
|
||||
run_time: str | None = Field(default=None, description='运行时长')
|
||||
home: str | None = Field(default=None, description='安装路径')
|
||||
|
||||
|
||||
class SysFiles(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
dir_name: str | None = Field(default=None, description='盘符路径')
|
||||
sys_type_name: str | None = Field(default=None, description='盘符类型')
|
||||
type_name: str | None = Field(default=None, description='文件类型')
|
||||
total: str | None = Field(default=None, description='总大小')
|
||||
used: str | None = Field(default=None, description='已经使用量')
|
||||
free: str | None = Field(default=None, description='剩余大小')
|
||||
usage: str | None = Field(default=None, description='资源的使用率')
|
||||
|
||||
|
||||
class ServerMonitorModel(BaseModel):
|
||||
"""
|
||||
服务监控对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
cpu: CpuInfo | None = Field(description='CPU相关信息')
|
||||
py: PyInfo | None = Field(description='Python相关信息')
|
||||
mem: MemoryInfo | None = Field(description='內存相关信息')
|
||||
sys: SysInfo | None = Field(description='服务器相关信息')
|
||||
sys_files: list[SysFiles] | None = Field(description='磁盘相关信息')
|
||||
@@ -0,0 +1,99 @@
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class TransportCryptoFrontendConfigModel(BaseModel):
|
||||
"""
|
||||
传输层加解密前端运行配置模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
transport_crypto_enabled: bool = Field(description='后端是否启用传输层加解密')
|
||||
transport_crypto_mode: str = Field(description='当前传输层加解密模式')
|
||||
transport_crypto_active: bool = Field(description='前端当前是否应启用传输层加解密')
|
||||
envelope_version: str = Field(description='当前传输层加密信封协议版本')
|
||||
public_key_url: str = Field(description='传输层公钥接口路径')
|
||||
request_envelope_algorithm: str = Field(description='前端请求信封算法标识')
|
||||
response_envelope_algorithm: str = Field(description='前端响应信封算法标识')
|
||||
enabled_paths: list[str] = Field(description='启用传输层加解密的路径列表')
|
||||
required_paths: list[str] = Field(description='强制要求加密传输的路径列表')
|
||||
exclude_paths: list[str] = Field(description='排除传输层加解密的路径列表')
|
||||
max_encrypted_get_url_length: int = Field(description='前端执行加密GET/DELETE请求时允许的最大URL长度')
|
||||
config_expire_at: int = Field(description='前端配置建议刷新时间戳')
|
||||
|
||||
|
||||
class TransportCryptoPublicKeyModel(BaseModel):
|
||||
"""
|
||||
传输层加解密公钥下发模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
kid: str = Field(description='当前启用的密钥版本标识')
|
||||
envelope_version: str = Field(description='当前传输层加密信封协议版本')
|
||||
alg: str = Field(description='当前传输层加密算法标识')
|
||||
public_key: str = Field(description='当前可用的传输层公钥')
|
||||
supported_kids: list[str] = Field(description='当前支持解密的密钥版本列表')
|
||||
expire_at: int = Field(description='当前公钥建议刷新时间戳')
|
||||
|
||||
|
||||
class TransportCryptoKidStatModel(BaseModel):
|
||||
"""
|
||||
传输层加解密按密钥版本统计模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
kid: str | None = Field(default=None, description='密钥版本标识')
|
||||
encrypted_requests: int | None = Field(default=0, description='加密请求次数')
|
||||
decrypt_success: int | None = Field(default=0, description='请求解密成功次数')
|
||||
decrypt_failure: int | None = Field(default=0, description='请求解密失败次数')
|
||||
encrypted_responses: int | None = Field(default=0, description='加密响应次数')
|
||||
|
||||
|
||||
class TransportCryptoFailureRecordModel(BaseModel):
|
||||
"""
|
||||
传输层加解密最近失败记录模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
time: datetime | None = Field(default=None, description='失败时间')
|
||||
method: str | None = Field(default=None, description='请求方法')
|
||||
path: str | None = Field(default=None, description='请求路径')
|
||||
reason: str | None = Field(default=None, description='失败原因分类')
|
||||
kid: str | None = Field(default=None, description='密钥版本标识')
|
||||
|
||||
|
||||
class TransportCryptoMonitorModel(BaseModel):
|
||||
"""
|
||||
传输层加解密监控模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
monitor_scope: str | None = Field(default=None, description='监控统计范围,默认基于Redis聚合')
|
||||
started_at: datetime | None = Field(default=None, description='当前监控统计起始时间')
|
||||
app_env: str | None = Field(default=None, description='当前应用环境')
|
||||
transport_crypto_enabled: bool | None = Field(default=None, description='是否启用传输层加解密')
|
||||
transport_crypto_mode: str | None = Field(default=None, description='当前传输层加解密模式')
|
||||
current_kid: str | None = Field(default=None, description='当前启用的密钥版本')
|
||||
supported_kids: list[str] | None = Field(default=[], description='当前支持的密钥版本列表')
|
||||
enabled_paths: list[str] | None = Field(default=[], description='启用传输层加解密的路径列表')
|
||||
required_paths: list[str] | None = Field(default=[], description='强制要求加密传输的路径列表')
|
||||
exclude_paths: list[str] | None = Field(default=[], description='排除传输层加解密的路径列表')
|
||||
requests_total: int | None = Field(default=0, description='命中传输层加解密规则的请求总数')
|
||||
plain_requests_total: int | None = Field(default=0, description='明文请求总数')
|
||||
encrypted_requests_total: int | None = Field(default=0, description='加密请求总数')
|
||||
required_rejected_total: int | None = Field(default=0, description='强制加密接口被拒绝的次数')
|
||||
decrypt_success_total: int | None = Field(default=0, description='请求解密成功次数')
|
||||
decrypt_failure_total: int | None = Field(default=0, description='请求解密失败次数')
|
||||
plain_responses_total: int | None = Field(default=0, description='明文响应次数')
|
||||
encrypted_responses_total: int | None = Field(default=0, description='加密响应次数')
|
||||
encrypted_error_responses_total: int | None = Field(default=0, description='加密错误响应次数')
|
||||
failure_reasons: dict[str, int] | None = Field(default={}, description='按失败原因归类的次数统计')
|
||||
kid_stats: list[TransportCryptoKidStatModel] | None = Field(default=[], description='按密钥版本归类的统计信息')
|
||||
recent_failures: list[TransportCryptoFailureRecordModel] | None = Field(default=[], description='最近失败事件列表')
|
||||
@@ -0,0 +1,299 @@
|
||||
import re
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
from pydantic.alias_generators import to_camel
|
||||
from pydantic_validation_decorator import Network, NotBlank, Size, Xss
|
||||
|
||||
from exceptions.exception import ModelValidatorException
|
||||
from module_admin.entity.vo.dept_vo import DeptModel
|
||||
from module_admin.entity.vo.post_vo import PostModel
|
||||
from module_admin.entity.vo.role_vo import RoleModel
|
||||
|
||||
|
||||
class TokenData(BaseModel):
|
||||
"""
|
||||
token解析结果
|
||||
"""
|
||||
|
||||
user_id: int | None = Field(default=None, description='用户ID')
|
||||
|
||||
|
||||
class UserModel(BaseModel):
|
||||
"""
|
||||
用户表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
user_id: int | None = Field(default=None, description='用户ID')
|
||||
dept_id: int | None = Field(default=None, description='部门ID')
|
||||
user_name: str | None = Field(default=None, description='用户账号')
|
||||
nick_name: str | None = Field(default=None, description='用户昵称')
|
||||
user_type: str | None = Field(default=None, description='用户类型(00系统用户)')
|
||||
email: str | None = Field(default=None, description='用户邮箱')
|
||||
phonenumber: str | None = Field(default=None, description='手机号码')
|
||||
sex: Literal['0', '1', '2'] | None = Field(default=None, description='用户性别(0男 1女 2未知)')
|
||||
avatar: str | None = Field(default=None, description='头像地址')
|
||||
password: str | None = Field(default=None, description='密码')
|
||||
status: Literal['0', '1'] | None = Field(default=None, description='帐号状态(0正常 1停用)')
|
||||
del_flag: Literal['0', '2'] | None = Field(default=None, description='删除标志(0代表存在 2代表删除)')
|
||||
login_ip: str | None = Field(default=None, description='最后登录IP')
|
||||
login_date: datetime | None = Field(default=None, description='最后登录时间')
|
||||
pwd_update_date: datetime | None = Field(default=None, description='密码最后更新时间')
|
||||
create_by: str | None = Field(default=None, description='创建者')
|
||||
create_time: datetime | None = Field(default=None, description='创建时间')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
remark: str | None = Field(default=None, description='备注')
|
||||
admin: bool | None = Field(default=False, description='是否为admin')
|
||||
|
||||
@model_validator(mode='after')
|
||||
def check_password(self) -> 'UserModel':
|
||||
pattern = r"""^[^<>"'|\\]+$"""
|
||||
if self.password is None or re.match(pattern, self.password):
|
||||
return self
|
||||
raise ModelValidatorException(message='密码不能包含非法字符:< > " \' \\ |')
|
||||
|
||||
@model_validator(mode='after')
|
||||
def check_admin(self) -> 'UserModel':
|
||||
if self.user_id == 1:
|
||||
self.admin = True
|
||||
else:
|
||||
self.admin = False
|
||||
return self
|
||||
|
||||
@Xss(field_name='user_name', message='用户账号不能包含脚本字符')
|
||||
@NotBlank(field_name='user_name', message='用户账号不能为空')
|
||||
@Size(field_name='user_name', min_length=0, max_length=30, message='用户账号长度不能超过30个字符')
|
||||
def get_user_name(self) -> str | None:
|
||||
return self.user_name
|
||||
|
||||
@Xss(field_name='nick_name', message='用户昵称不能包含脚本字符')
|
||||
@Size(field_name='nick_name', min_length=0, max_length=30, message='用户昵称长度不能超过30个字符')
|
||||
def get_nick_name(self) -> str | None:
|
||||
return self.nick_name
|
||||
|
||||
@Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确')
|
||||
@Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
|
||||
def get_email(self) -> str | None:
|
||||
return self.email
|
||||
|
||||
@Size(field_name='phonenumber', min_length=0, max_length=11, message='手机号码长度不能超过11个字符')
|
||||
def get_phonenumber(self) -> str | None:
|
||||
return self.phonenumber
|
||||
|
||||
def validate_fields(self) -> None:
|
||||
self.get_user_name()
|
||||
self.get_nick_name()
|
||||
self.get_email()
|
||||
self.get_phonenumber()
|
||||
|
||||
|
||||
class UserRowModel(UserModel):
|
||||
"""
|
||||
用户列表行数据模型
|
||||
"""
|
||||
|
||||
dept: DeptModel | None = Field(default=None, description='部门信息')
|
||||
|
||||
|
||||
class UserRoleModel(BaseModel):
|
||||
"""
|
||||
用户和角色关联表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
user_id: int | None = Field(default=None, description='用户ID')
|
||||
role_id: int | None = Field(default=None, description='角色ID')
|
||||
|
||||
|
||||
class UserPostModel(BaseModel):
|
||||
"""
|
||||
用户与岗位关联表对应pydantic模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
|
||||
|
||||
user_id: int | None = Field(default=None, description='用户ID')
|
||||
post_id: int | None = Field(default=None, description='岗位ID')
|
||||
|
||||
|
||||
class UserInfoModel(UserModel):
|
||||
post_ids: str | None | None = Field(default=None, description='岗位ID信息')
|
||||
role_ids: str | None | None = Field(default=None, description='角色ID信息')
|
||||
dept: DeptModel | None | None = Field(default=None, description='部门信息')
|
||||
role: list[RoleModel | None] | None = Field(default=[], description='角色信息')
|
||||
|
||||
|
||||
class CurrentUserModel(BaseModel):
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
permissions: list = Field(description='权限信息')
|
||||
roles: list = Field(description='角色信息')
|
||||
user: UserInfoModel | None = Field(description='用户信息')
|
||||
is_default_modify_pwd: bool = Field(default=False, description='是否初始密码修改提醒')
|
||||
is_password_expired: bool = Field(default=False, description='密码是否过期提醒')
|
||||
|
||||
|
||||
class UserDetailModel(BaseModel):
|
||||
"""
|
||||
获取用户详情信息响应模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
data: UserInfoModel | None | None = Field(default=None, description='用户信息')
|
||||
post_ids: list | None = Field(default=None, description='岗位ID信息')
|
||||
posts: list[PostModel | None] = Field(description='岗位信息')
|
||||
role_ids: list | None = Field(default=None, description='角色ID信息')
|
||||
roles: list[RoleModel | None] = Field(description='角色信息')
|
||||
|
||||
|
||||
class UserProfileModel(BaseModel):
|
||||
"""
|
||||
获取个人信息响应模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
data: UserInfoModel | None = Field(description='用户信息')
|
||||
post_group: str | None = Field(description='岗位信息')
|
||||
role_group: str | None = Field(description='角色信息')
|
||||
|
||||
|
||||
class AvatarModel(BaseModel):
|
||||
"""
|
||||
上传头像响应模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
img_url: str = Field(description='头像地址')
|
||||
|
||||
|
||||
class UserQueryModel(UserModel):
|
||||
"""
|
||||
用户管理不分页查询模型
|
||||
"""
|
||||
|
||||
begin_time: str | None = Field(default=None, description='开始时间')
|
||||
end_time: str | None = Field(default=None, description='结束时间')
|
||||
|
||||
|
||||
class UserPageQueryModel(UserQueryModel):
|
||||
"""
|
||||
用户管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class AddUserModel(UserModel):
|
||||
"""
|
||||
新增用户模型
|
||||
"""
|
||||
|
||||
role_ids: list | None = Field(default=[], description='角色ID信息')
|
||||
post_ids: list | None = Field(default=[], description='岗位ID信息')
|
||||
type: str | None = Field(default=None, description='操作类型')
|
||||
|
||||
|
||||
class EditUserModel(AddUserModel):
|
||||
"""
|
||||
编辑用户模型
|
||||
"""
|
||||
|
||||
role: list | None = Field(default=[], description='角色信息')
|
||||
|
||||
|
||||
class ResetPasswordModel(BaseModel):
|
||||
"""
|
||||
重置密码模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
old_password: str | None = Field(default=None, description='旧密码')
|
||||
new_password: str | None = Field(default=None, description='新密码')
|
||||
|
||||
@model_validator(mode='after')
|
||||
def check_new_password(self) -> 'ResetPasswordModel':
|
||||
pattern = r"""^[^<>"'|\\]+$"""
|
||||
if self.new_password is None or re.match(pattern, self.new_password):
|
||||
return self
|
||||
raise ModelValidatorException(message='密码不能包含非法字符:< > " \' \\ |')
|
||||
|
||||
|
||||
class ResetUserModel(UserModel):
|
||||
"""
|
||||
重置用户密码模型
|
||||
"""
|
||||
|
||||
old_password: str | None = Field(default=None, description='旧密码')
|
||||
sms_code: str | None = Field(default=None, description='验证码')
|
||||
session_id: str | None = Field(default=None, description='会话id')
|
||||
|
||||
|
||||
class DeleteUserModel(BaseModel):
|
||||
"""
|
||||
删除用户模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
user_ids: str = Field(description='需要删除的用户ID')
|
||||
update_by: str | None = Field(default=None, description='更新者')
|
||||
update_time: datetime | None = Field(default=None, description='更新时间')
|
||||
|
||||
|
||||
class UserRoleQueryModel(UserModel):
|
||||
"""
|
||||
用户角色关联管理不分页查询模型
|
||||
"""
|
||||
|
||||
role_id: int | None = Field(default=None, description='角色ID')
|
||||
|
||||
|
||||
class UserRolePageQueryModel(UserRoleQueryModel):
|
||||
"""
|
||||
用户角色关联管理分页查询模型
|
||||
"""
|
||||
|
||||
page_num: int = Field(default=1, description='当前页码')
|
||||
page_size: int = Field(default=10, description='每页记录数')
|
||||
|
||||
|
||||
class SelectedRoleModel(RoleModel):
|
||||
"""
|
||||
是否选择角色模型
|
||||
"""
|
||||
|
||||
flag: bool | None = Field(default=False, description='选择标识')
|
||||
|
||||
|
||||
class UserRoleResponseModel(BaseModel):
|
||||
"""
|
||||
用户角色关联管理列表返回模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
roles: list[SelectedRoleModel | None] = Field(default=[], description='角色信息')
|
||||
user: UserInfoModel = Field(description='用户信息')
|
||||
|
||||
|
||||
class CrudUserRoleModel(BaseModel):
|
||||
"""
|
||||
新增、删除用户关联角色及角色关联用户模型
|
||||
"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel)
|
||||
|
||||
user_id: int | None = Field(default=None, description='用户ID')
|
||||
user_ids: str | None = Field(default=None, description='用户ID信息')
|
||||
role_id: int | None = Field(default=None, description='角色ID')
|
||||
role_ids: str | None = Field(default=None, description='角色ID信息')
|
||||
Reference in New Issue
Block a user