entity.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from datetime import datetime
  4. from types import NoneType
  5. from typing import Optional
  6. from pydantic import BeforeValidator, Field, PlainSerializer
  7. from pydantic_core import to_json
  8. from typing_extensions import Annotated
  9. from ruoyi_common.base.transformer import to_datetime, str_to_int
  10. from ruoyi_common.domain.entity import LoginUser
  11. from ruoyi_common.base.model import AuditEntity, BaseEntity, VoAccess
  12. class SysUserRole(BaseEntity):
  13. # 用户ID
  14. user_id: int
  15. # 角色ID
  16. role_id: int
  17. class SysUserOnline(BaseEntity):
  18. # 会话编号
  19. token_id: Optional[str] = None
  20. # 用户名称
  21. user_name: Annotated[
  22. Optional[str],
  23. Field(default=None,vo=VoAccess(query=True,sort=True))
  24. ]
  25. # 登录IP地址
  26. ip_addr: Annotated[
  27. Optional[str],
  28. Field(default=None,vo=VoAccess(query=True,sort=True))
  29. ]
  30. # 登录地址
  31. login_location: Optional[str] = None
  32. # 浏览器类型
  33. browser: Optional[str] = None
  34. # 操作系统
  35. os: Optional[str] = None
  36. # 登录时间
  37. login_time: Optional[datetime] = None
  38. # 部门名称
  39. dept_name: Optional[str] = None
  40. @classmethod
  41. def from_loginuser(cls, login_user:LoginUser):
  42. return cls(
  43. token_id=login_user.token.hex,
  44. user_name=login_user.user_name,
  45. dept_name=login_user.dept_name,
  46. ip_addr=login_user.ip_addr,
  47. login_location=login_user.login_location,
  48. browser=login_user.browser,
  49. os=login_user.os,
  50. login_time=login_user.login_time,
  51. )
  52. class SysRoleMenu(BaseEntity):
  53. # 角色ID
  54. role_id: int
  55. # 菜单ID
  56. menu_id: int
  57. class SysUserPost(BaseEntity):
  58. # 用户ID
  59. user_id: int
  60. # 岗位ID
  61. post_id: int
  62. class SysRoleDept(BaseEntity):
  63. # 角色ID
  64. role_id: int
  65. # 部门ID
  66. dept_id: int
  67. class SysPost(AuditEntity):
  68. # 岗位序号
  69. post_id: Annotated[
  70. Optional[int],
  71. BeforeValidator(str_to_int),
  72. Field(gt=0,default=None)
  73. ]
  74. # 岗位编码
  75. post_code: Annotated[
  76. Optional[str],
  77. Field(default=None,vo=VoAccess(query=True))
  78. ]
  79. # 岗位名称
  80. post_name: Annotated[
  81. Optional[str],
  82. Field(default=None,vo=VoAccess(query=True))
  83. ]
  84. # 岗位排序
  85. post_sort: Optional[int] = None
  86. # 状态(0正常 1停用)
  87. status: Annotated[
  88. Optional[str],
  89. Field(default=None,vo=VoAccess(query=True))
  90. ]
  91. # 标识 默认不存在
  92. flag: Annotated[
  93. Optional[str],
  94. Field(default=None,exclude=True,vo=VoAccess(body=False))
  95. ]
  96. class SysOperLog(BaseEntity):
  97. # 日志主键 #
  98. oper_id: Annotated[
  99. Optional[int],
  100. BeforeValidator(str_to_int),
  101. Field(gt=0,default=None)]
  102. # 操作模块 #
  103. title: Optional[str] = None
  104. # 业务类型(0其它 1新增 2修改 3删除)
  105. business_type: Optional[int] = None
  106. # 业务类型数组
  107. business_types: Optional[str] = None
  108. # 请求方法
  109. method: Optional[str] = None
  110. # 请求方式
  111. request_method: Optional[str] = None
  112. # 操作类别(0其它 1后台用户 2手机端用户)
  113. operator_type: Optional[int] = None
  114. # 操作人员
  115. oper_name: Annotated[
  116. Optional[str],
  117. Field(default=None,vo=VoAccess(query=True,sort=True))
  118. ]
  119. # 部门名称
  120. dept_name: Annotated[
  121. Optional[str],
  122. Field(default=None,vo=VoAccess(body=False))
  123. ]
  124. # 请求url
  125. oper_url: Optional[str] = None
  126. # 操作地址
  127. oper_ip: Annotated[
  128. Optional[str],
  129. Field(default=None,vo=VoAccess(query=True))
  130. ]
  131. # 操作地点
  132. oper_location: Optional[str] = None
  133. # 请求参数
  134. oper_param: Annotated[
  135. Optional[str],
  136. BeforeValidator(lambda x: to_json(x) if isinstance(x,(dict,list,tuple)) else x),
  137. ] = None
  138. # 返回参数
  139. json_result: Optional[str] = None
  140. # 操作状态(0正常 1异常)
  141. status: Annotated[
  142. Optional[int],
  143. Field(default=None,vo=VoAccess(query=True))
  144. ]
  145. # 错误消息
  146. error_msg: Optional[str] = None
  147. # 操作时间
  148. oper_time: Annotated[
  149. Optional[datetime],
  150. BeforeValidator(to_datetime()),
  151. Field(default=None,vo=VoAccess(query=True,sort=True))
  152. ]
  153. class SysNotice(AuditEntity):
  154. # 公告ID
  155. notice_id: Annotated[
  156. int,
  157. BeforeValidator(str_to_int),
  158. Field(gt=0,default=None)
  159. ]
  160. # 公告标题
  161. notice_title: Annotated[
  162. Optional[str],
  163. Field(default=None,vo=VoAccess(query=True))
  164. ]
  165. # 公告类型(1通知 2公告)
  166. notice_type: Annotated[
  167. Optional[str],
  168. Field(default=None,vo=VoAccess(query=True))
  169. ]
  170. # 公告内容
  171. notice_content: Annotated[
  172. Optional[str],
  173. BeforeValidator(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x),
  174. PlainSerializer(lambda x: x.encode('utf-8'), return_type=bytes)
  175. ] = None
  176. # 公告状态(0正常 1关闭)
  177. status: Optional[str] = None
  178. create_by: Annotated[
  179. str | int | NoneType,
  180. Field(default=None,vo=VoAccess(body=False,query=True))
  181. ]
  182. class SysLogininfor(AuditEntity):
  183. # id
  184. info_id: Optional[int] = None
  185. # 用户账号
  186. user_name: Annotated[
  187. Optional[str],
  188. Field(default=None,vo=VoAccess(query=True,sort=True))
  189. ]
  190. # 登录状态(0成功 1失败)
  191. status: Annotated[
  192. Optional[str],
  193. Field(default=None,vo=VoAccess(query=True))
  194. ]
  195. # 登录IP地址
  196. ipaddr: Annotated[
  197. Optional[str],
  198. Field(default=None,vo=VoAccess(query=True))
  199. ]
  200. # 登录地点
  201. login_location: Optional[str] = None
  202. # 登录浏览器
  203. browser: Optional[str] = None
  204. # 登录操作系统
  205. os: Optional[str] = None
  206. # 登录时间
  207. login_time: Annotated[
  208. Optional[datetime],
  209. BeforeValidator(to_datetime()),
  210. Field(default=None,vo=VoAccess(query=True,sort=True))
  211. ]
  212. # 提示消息
  213. msg: Optional[str] = None
  214. class SysConfig(AuditEntity):
  215. # 参数主键
  216. config_id: Optional[int] = None # @Excel(name = "参数主键")
  217. # 参数名称
  218. config_name: Annotated[
  219. Optional[str],
  220. Field(default=None,vo=VoAccess(query=True))
  221. ]
  222. # 参数键名
  223. config_key: Annotated[
  224. Optional[str],
  225. Field(default=None,vo=VoAccess(query=True))
  226. ]
  227. # 系统内置(Y是 N否)
  228. config_type: Annotated[
  229. Optional[str],
  230. Field(default=None,vo=VoAccess(query=True))
  231. ]
  232. # 参数键值
  233. config_value: Optional[str] = None # @Excel(name = "参数键值")
  234. class MetaEntity(BaseEntity):
  235. # 设置该路由在侧边栏和面包屑中展示的名字
  236. title: Optional[str] = None # @Excel(name = "标题")
  237. # 设置该路由的图标,对应路径src/assets/icons/svg
  238. icon: Optional[str] = None # @Excel(name = "图标")
  239. # 设置为true,则不会被 <keep-alive>缓存
  240. no_cache: Optional[bool] = None # @Excel(name = "是否缓存", readConverterExp = "Y=是,N=否")
  241. # 内链地址(http(s)://开头)
  242. link: Optional[str] = None
  243. class RouterEntity(BaseEntity):
  244. # 路由名字
  245. name: Optional[str] = None # @Excel(name = "名称")
  246. # 路由路径
  247. path: Optional[str] = None # @Excel(name = "路径")
  248. # 组件路径
  249. component: Optional[str] = None # @Excel(name = "组件")
  250. # 其他元素
  251. meta: Optional[MetaEntity] = None # @Excel(name = "元数据")
  252. # 子路由
  253. children: Optional[list] = [] # @Excel(name = "子路由")
  254. # 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现
  255. hidden: Optional[bool] = None # @Excel(name = "是否隐藏", readConverterExp = "Y=是,N=否")
  256. # 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
  257. always_show: Optional[bool] = None # @Excel(name = "显示根路由", readConverterExp = "Y=是,N=否")
  258. # 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
  259. redirect: Optional[str] = None # @Excel(name = "重定向")
  260. # 排序
  261. sort: Optional[int] = None # @Excel(name = "排序")
  262. # 路由参数:如 {"id": 1, "name": "ry"}
  263. query: Optional[str] = None # @Excel(name = "查询")