resource_model.py 5.9 KB

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