resource_model.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. from datetime import datetime
  2. from typing import Optional
  3. from pydantic import BaseModel
  4. from sqlalchemy import Column, Integer, String, DateTime, Table, ForeignKey
  5. from sqlalchemy.orm import relationship, backref
  6. from app.config.const import RESOURCE_STATUS_DELETE
  7. from app.models.base_model import Base
  8. class ResourceModel(Base):
  9. __tablename__ = 'resource'
  10. id = Column(String(36), primary_key=True, index=True)
  11. created_at = Column(DateTime, default=datetime.now())
  12. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  13. name = Column(String(128))
  14. url = Column(String(200))
  15. path = Column(String(200))
  16. perms = Column(String(150))
  17. description = Column(String(200))
  18. icon = Column(String(100))
  19. seq = Column(Integer)
  20. target = Column(String(100))
  21. canbdeeleted = Column(Integer)
  22. resource_type_id = Column(String(36), ForeignKey('resource_type.id'))
  23. resource_id = Column(String(36), ForeignKey('resource.id'))
  24. parent = relationship('ResourceModel', remote_side=[id], backref='resources', uselist=False)
  25. children = relationship('ResourceModel')
  26. status = Column(String(10), default="1")
  27. hidden = Column(Integer, default=0)
  28. def get_id(self):
  29. return str(self.ID)
  30. def to_json(self):
  31. return {
  32. 'menuId': self.id,
  33. 'createTime': self.created_at,
  34. 'updateTime': self.updated_at,
  35. 'menuName': self.name,
  36. 'component': self.url,
  37. 'description': self.description,
  38. 'icon': self.icon,
  39. 'orderNum': self.seq,
  40. 'target': self.target,
  41. 'parentId': self.get_pid(),
  42. 'parentName': self.get_pName(),
  43. 'syresourcetype': self.get_type_json(),
  44. 'status': self.status,
  45. 'path': self.path,
  46. 'perms': self.perms,
  47. # 类型(0目录 1菜单 2按钮)
  48. 'menuType': self.resource_type_id,
  49. }
  50. def to_tree_select_json(self):
  51. return {
  52. 'menuId': self.id,
  53. 'menuName': self.name,
  54. 'menuType': self.resource_type_id,
  55. 'parentId': self.get_pid(),
  56. 'parentName': self.get_pName(),
  57. 'children': [res.to_tree_select_json() for res in self.children if res if res.status != RESOURCE_STATUS_DELETE]
  58. }
  59. def to_router_json(self):
  60. router = {
  61. 'name': self.path.capitalize() if self.path else '',
  62. 'path': self.path,
  63. 'hidden': bool(self.hidden),
  64. 'redirect': 'noRedirect',
  65. 'component': self.url,
  66. 'alwaysShow': True,
  67. 'meta': {
  68. 'title': self.name,
  69. 'icon': self.icon,
  70. 'noCache': False,
  71. 'link': ''
  72. },
  73. 'children': [
  74. res.to_router_json() for res in self.children if res.type.id == '3' or res.type.id == '0'
  75. ]
  76. }
  77. if not router['children']:
  78. del router['children']
  79. del router['redirect']
  80. del router['alwaysShow']
  81. if not router['component']:
  82. router['component'] = 'Layout'
  83. return router
  84. def to_router_dict(self):
  85. router = {
  86. 'id': self.id,
  87. 'name': self.path.capitalize() if self.path else '',
  88. # 'name': self.name,
  89. 'path': self.path,
  90. 'hidden': bool(self.hidden),
  91. 'redirect': 'noRedirect',
  92. 'component': self.url,
  93. 'alwaysShow': True,
  94. 'perms': self.perms,
  95. 'resourceType': self.get_type_json(),
  96. 'meta': {
  97. 'title': self.name,
  98. 'icon': self.icon,
  99. 'noCache': False,
  100. 'link': ''
  101. },
  102. 'parentId': self.get_pid(),
  103. }
  104. if not router['component']:
  105. router['component'] = 'Layout'
  106. return router
  107. def to_menu_json(self):
  108. return {
  109. 'id': self.id,
  110. 'iconCls': self.icon,
  111. 'pid': self.get_pid(),
  112. 'state': 'open',
  113. 'checked': False,
  114. 'attributes': {
  115. 'target': self.target,
  116. 'url': self.url
  117. },
  118. 'text': self.name
  119. }
  120. def get_pid(self):
  121. if self.parent:
  122. return self.parent.id
  123. return ''
  124. def get_pName(self):
  125. if self.parent:
  126. return self.parent.name
  127. return ''
  128. def get_type_json(self):
  129. if self.type:
  130. return self.type.to_json()
  131. return {}
  132. def __repr__(self):
  133. return '<ResourceModel name:%r url:%r>\n' % (self.NAME, self.URL)
  134. class ResourceTypeModel(Base):
  135. __tablename__ = 'resource_type'
  136. id = Column(String(36), primary_key=True)
  137. created_at = Column(DateTime, default=datetime.now())
  138. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  139. name = Column(String(128))
  140. description = Column(String(255))
  141. resources = relationship('ResourceModel', backref='type', lazy='dynamic')
  142. def to_json(self):
  143. return {
  144. 'id': self.id,
  145. # 'createdatetime': self.created_at,
  146. # 'updatedatetime': self.updated_at,
  147. 'name': self.name,
  148. 'description': self.description
  149. }
  150. def __repr__(self):
  151. return '<ResourceTypeModel %r>\n' %(self.name)
  152. class MenuInfo(BaseModel):
  153. menuId: Optional[str] = ""
  154. menuName: Optional[str] = ""
  155. component: Optional[str] = ""
  156. path: Optional[str] = ""
  157. orderNum: int
  158. perms: Optional[str] = ""
  159. menuType: Optional[str] = ""
  160. description: Optional[str] = ""
  161. icon: Optional[str] = ""
  162. parentId: str
  163. status: str
  164. # roles: list
  165. # groups: Optional[list] = []
  166. class MenuStatus(BaseModel):
  167. menuId: str
  168. status: str