resource_model.py 5.6 KB

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