resource_model.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. 'seq': self.seq,
  97. 'meta': {
  98. 'title': self.name,
  99. 'icon': self.icon,
  100. 'noCache': False,
  101. 'link': ''
  102. },
  103. 'parentId': self.get_pid(),
  104. }
  105. if not router['component']:
  106. router['component'] = 'Layout'
  107. return router
  108. def to_menu_json(self):
  109. return {
  110. 'id': self.id,
  111. 'iconCls': self.icon,
  112. 'pid': self.get_pid(),
  113. 'state': 'open',
  114. 'checked': False,
  115. 'attributes': {
  116. 'target': self.target,
  117. 'url': self.url
  118. },
  119. 'text': self.name
  120. }
  121. def get_pid(self):
  122. if self.parent:
  123. return self.parent.id
  124. return ''
  125. def get_pName(self):
  126. if self.parent:
  127. return self.parent.name
  128. return ''
  129. def get_type_json(self):
  130. if self.type:
  131. return self.type.to_json()
  132. return {}
  133. def __repr__(self):
  134. return '<ResourceModel name:%r url:%r>\n' % (self.NAME, self.URL)
  135. class ResourceTypeModel(Base):
  136. __tablename__ = 'resource_type'
  137. id = Column(String(36), primary_key=True)
  138. created_at = Column(DateTime, default=datetime.now())
  139. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  140. name = Column(String(128))
  141. description = Column(String(255))
  142. resources = relationship('ResourceModel', backref='type', lazy='dynamic')
  143. def to_json(self):
  144. return {
  145. 'id': self.id,
  146. # 'createdatetime': self.created_at,
  147. # 'updatedatetime': self.updated_at,
  148. 'name': self.name,
  149. 'description': self.description
  150. }
  151. def __repr__(self):
  152. return '<ResourceTypeModel %r>\n' %(self.name)
  153. class MenuInfo(BaseModel):
  154. menuId: Optional[str] = ""
  155. menuName: Optional[str] = ""
  156. component: Optional[str] = ""
  157. path: Optional[str] = ""
  158. orderNum: int
  159. perms: Optional[str] = ""
  160. menuType: Optional[str] = ""
  161. description: Optional[str] = ""
  162. icon: Optional[str] = ""
  163. parentId: str
  164. status: str
  165. # roles: list
  166. # groups: Optional[list] = []
  167. class MenuStatus(BaseModel):
  168. menuId: str
  169. status: str