resource_model.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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))
  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. 'children': [res.to_tree_select_json() for res in self.children]
  55. }
  56. def to_router_json(self):
  57. router = {
  58. 'name': self.path.capitalize() if self.path else '',
  59. 'path': self.path,
  60. 'hidden': bool(self.hidden),
  61. 'redirect': 'noRedirect',
  62. 'component': self.url,
  63. 'alwaysShow': True,
  64. 'meta': {
  65. 'title': self.name,
  66. 'icon': self.icon,
  67. 'noCache': False,
  68. 'link': ''
  69. },
  70. 'children': [
  71. res.to_router_json() for res in self.children if res.type.id == '3' or res.type.id == '0'
  72. ]
  73. }
  74. if not router['children']:
  75. del router['children']
  76. del router['redirect']
  77. del router['alwaysShow']
  78. if not router['component']:
  79. router['component'] = 'Layout'
  80. return router
  81. def to_router_dict(self):
  82. router = {
  83. 'id': self.id,
  84. 'name': self.path.capitalize() if self.path else '',
  85. 'path': self.path,
  86. 'hidden': bool(self.hidden),
  87. 'redirect': 'noRedirect',
  88. 'component': self.url,
  89. 'alwaysShow': True,
  90. 'resourceType': self.get_type_json(),
  91. 'meta': {
  92. 'title': self.name,
  93. 'icon': self.icon,
  94. 'noCache': False,
  95. 'link': ''
  96. },
  97. 'parentId': self.get_pid(),
  98. }
  99. if not router['component']:
  100. router['component'] = 'Layout'
  101. return router
  102. def to_menu_json(self):
  103. return {
  104. 'id': self.id,
  105. 'iconCls': self.icon,
  106. 'pid': self.get_pid(),
  107. 'state': 'open',
  108. 'checked': False,
  109. 'attributes': {
  110. 'target': self.target,
  111. 'url': self.url
  112. },
  113. 'text': self.name
  114. }
  115. def get_pid(self):
  116. if self.parent:
  117. return self.parent.id
  118. return ''
  119. def get_pName(self):
  120. if self.parent:
  121. return self.parent.name
  122. return ''
  123. def get_type_json(self):
  124. if self.type:
  125. return self.type.to_json()
  126. return {}
  127. def __repr__(self):
  128. return '<ResourceModel name:%r url:%r>\n' % (self.NAME, self.URL)
  129. class ResourceTypeModel(Base):
  130. __tablename__ = 'resource_type'
  131. id = Column(String(36), primary_key=True)
  132. created_at = Column(DateTime, default=datetime.now())
  133. updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
  134. name = Column(String(128))
  135. description = Column(String(255))
  136. resources = relationship('ResourceModel', backref='type', lazy='dynamic')
  137. def to_json(self):
  138. return {
  139. 'id': self.id,
  140. # 'createdatetime': self.created_at,
  141. # 'updatedatetime': self.updated_at,
  142. 'name': self.name,
  143. 'description': self.description
  144. }
  145. def __repr__(self):
  146. return '<ResourceTypeModel %r>\n' %(self.name)
  147. class MenuInfo(BaseModel):
  148. menuId: Optional[str] = ""
  149. menuName: Optional[str] = ""
  150. component: Optional[str] = ""
  151. path: Optional[str] = ""
  152. orderNum: int
  153. perms: Optional[str] = ""
  154. menuType: Optional[str] = ""
  155. description: Optional[str] = ""
  156. icon: Optional[str] = ""
  157. parentId: str
  158. status: str
  159. # roles: list
  160. # groups: Optional[list] = []