from datetime import datetime from typing import Optional from pydantic import BaseModel from sqlalchemy import Column, Integer, String, DateTime, Table, ForeignKey from sqlalchemy.orm import relationship, backref from app.models.base_model import Base class ResourceModel(Base): __tablename__ = 'resource' id = Column(String(36), primary_key=True, index=True) created_at = Column(DateTime, default=datetime.now()) updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) name = Column(String(128)) url = Column(String(200)) path = Column(String(200)) perms = Column(String(150)) description = Column(String(200)) icon = Column(String(100)) seq = Column(Integer) target = Column(String(100)) canbdeeleted = Column(Integer) resource_type_id = Column(String(36), ForeignKey('resource_type.id')) resource_id = Column(String(36), ForeignKey('resource.id')) parent = relationship('ResourceModel', remote_side=[id], backref='resources', uselist=False) children = relationship('ResourceModel') status = Column(String(10)) hidden = Column(Integer, default=0) def get_id(self): return str(self.ID) def to_json(self): return { 'menuId': self.id, 'createTime': self.created_at, 'updateTime': self.updated_at, 'menuName': self.name, 'component': self.url, 'description': self.description, 'icon': self.icon, 'orderNum': self.seq, 'target': self.target, 'parentId': self.get_pid(), 'parentName': self.get_pName(), 'syresourcetype': self.get_type_json(), 'status': self.status, 'path': self.path, 'perms': self.perms, # 类型(0目录 1菜单 2按钮) 'menuType': self.resource_type_id, } def to_tree_select_json(self): return { 'menuId': self.id, 'menuName': self.name, 'menuType': self.resource_type_id, 'children': [res.to_tree_select_json() for res in self.children] } def to_router_json(self): router = { 'name': self.path.capitalize() if self.path else '', 'path': self.path, 'hidden': bool(self.hidden), 'redirect': 'noRedirect', 'component': self.url, 'alwaysShow': True, 'meta': { 'title': self.name, 'icon': self.icon, 'noCache': False, 'link': '' }, 'children': [ res.to_router_json() for res in self.children if res.type.id == '3' or res.type.id == '0' ] } if not router['children']: del router['children'] del router['redirect'] del router['alwaysShow'] if not router['component']: router['component'] = 'Layout' return router def to_menu_json(self): return { 'id': self.id, 'iconCls': self.icon, 'pid': self.get_pid(), 'state': 'open', 'checked': False, 'attributes': { 'target': self.target, 'url': self.url }, 'text': self.name } def get_pid(self): if self.parent: return self.parent.id return '' def get_pName(self): if self.parent: return self.parent.name return '' def get_type_json(self): if self.type: return self.type.to_json() return {} def __repr__(self): return '\n' % (self.NAME, self.URL) class ResourceTypeModel(Base): __tablename__ = 'resource_type' id = Column(String(36), primary_key=True) created_at = Column(DateTime, default=datetime.now()) updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) name = Column(String(128)) description = Column(String(255)) resources = relationship('ResourceModel', backref='type', lazy='dynamic') def to_json(self): return { 'id': self.id, 'createdatetime': self.created_at, 'updatedatetime': self.updated_at, 'name': self.name, 'description': self.description } def __repr__(self): return '\n' %(self.name) class MenuInfo(BaseModel): menuId: Optional[str] = "" menuName: Optional[str] = "" component: Optional[str] = "" path: Optional[str] = "" orderNum: int perms: Optional[str] = "" menuType: Optional[str] = "" description: Optional[str] = "" parentId: str status: str roles: list groups: Optional[list] = []