import json from sqlalchemy import Column, String, Integer, BOOLEAN, Float, ForeignKey, select from sqlalchemy.orm import relationship from server.conf import Base, engine url_prefix = f'http://127.0.0.1:7878/' class Role(Base): """角色表""" __tablename__ = 'role' roleId = Column(Integer, primary_key=True) roleName = Column(String(200), nullable=True) flag = Column(BOOLEAN, default=True, nullable=True) operateArr = Column(String(500), nullable=True) user = relationship("User", back_populates="role") operate = [ {'label': '后台管理', 'value': 'admin'}, {'label': '用户管理', 'value': 'userManager'}, {'label': '添加用户', 'value': 'addUser'}, {'label': '修改用户', 'value': 'updateUser'}, {'label': '删除用户', 'value': 'deleteUser'}, {'label': '角色管理', 'value': 'roleManager'}, {'label': '添加角色', 'value': 'addRole'}, {'label': '删除角色', 'value': 'deleteRole'}, {'label': '修改角色', 'value': 'updateRole'}, ] def to_dict(self): tmp = [] if self.operateArr: for i in self.operateArr.split(','): for jj in self.operate: if jj['value'] == i: tmp.append(jj['label']) break ops = ', '.join(tmp) else: ops = '' return { 'pk': self.roleId, 'roleName': self.roleName, 'operateArr': self.operateArr.split(',') if self.operateArr else [], 'auth': ops, } class User(Base): """用户表""" __tablename__ = 'user' userId = Column(Integer, primary_key=True) username = Column(String(200), nullable=False) avatar_url = Column(String(200), nullable=True) password = Column(String(200), nullable=True) roleId = Column(Integer, ForeignKey('role.roleId', ondelete='SET NULL'), nullable=True) role = relationship("Role", back_populates="user") flag = Column(BOOLEAN, nullable=True, default=True) def to_dict(self): return { 'pk': self.userId, 'username': self.username, 'avatar_url': self.avatar_url, 'roleId': self.roleId, 'roleName': self.role.roleName if self.role else '', } class Project(Base): """项目表""" __tablename__ = 'project' projectId = Column(Integer, primary_key=True) name = Column(String(200), nullable=True) platform = Column(String(200), nullable=True) openRank = Column(Float, nullable=True) activity = Column(Float, nullable=True) stars = Column(Integer, nullable=True) attention = Column(Integer, nullable=True) technical_fork = Column(Integer, nullable=True) proj_data = relationship("ProjData", back_populates="project") user_proj_map = relationship("UserProjMap", back_populates="project") class ProjData(Base): """项目数据表""" __tablename__ = 'proj_data' index = Column(Integer, primary_key=True) projectId = Column(Integer, ForeignKey('project.projectId', ondelete='SET NULL'), nullable=False) project = relationship("Project", back_populates="proj_data") label = Column(String(200), nullable=True) tt = Column(Integer, nullable=True) ttType = Column(String(200), nullable=True, comment='时间类型,y年,m月') openRank = Column(Float, nullable=True) activity = Column(Float, nullable=True) stars = Column(Integer, nullable=True) attention = Column(Integer, nullable=True) technical_fork = Column(Integer, nullable=True) async def to_dict(self): return { 'pk': self.projectId, 'label': self.label, 'item': 1, 'tt': self.tt, 'openRank': self.openRank, 'activity': self.activity, 'stars': self.stars, 'attention': self.attention, 'technical_fork': self.technical_fork, } class DevUser(Base): """开发者表""" __tablename__ = 'devuser' devUserId = Column(Integer, primary_key=True) name = Column(String(200), nullable=True) avatar_url = Column(String(500), nullable=True, comment='fork数') platform = Column(String(200), nullable=True) openRank = Column(Float, nullable=True) activity = Column(Float, nullable=True) repos = Column(Integer, nullable=True, comment='仓库总数') stars = Column(Integer, nullable=True, comment='星标数') technical_fork = Column(Integer, nullable=True, comment='被fork数') forks = Column(Integer, nullable=True, comment='fork总数') followers = Column(Integer, nullable=True, comment='关注人数') following = Column(Integer, nullable=True, comment='粉丝人数') template_count = Column(Integer, nullable=True, comment='模板数') issues_count = Column(Integer, nullable=True, comment='模板数') dev_user_data = relationship("DevUserData", back_populates="dev_user") user_devuser_map = relationship("UserDevUserMap", back_populates="dev_user") class DevUserData(Base): """开发者数据表""" __tablename__ = 'devuser_data' index = Column(Integer, primary_key=True) devUserId = Column(Integer, ForeignKey('devuser.devUserId', ondelete='SET NULL'), nullable=False) dev_user = relationship("DevUser", back_populates="dev_user_data") label = Column(String(200), nullable=True) tt = Column(Integer, nullable=True) ttType = Column(String(200), nullable=True, comment='时间类型,y年,m月') openRank = Column(Float, nullable=True) activity = Column(Float, nullable=True) async def to_dict(self): return { 'index': self.index, 'pk': self.devUserId, 'avatar_url': url_prefix + (self.dev_user.avatar_url or ''), 'home': 'https://github.com/' + self.dev_user.name, 'item': 2, 'label': self.label, 'tt': self.tt, 'openRank': self.openRank, 'activity': self.activity, } class UserProjMap(Base): """用户项目映射""" __tablename__ = 'user_proj_map' userId = Column(Integer, ForeignKey('user.userId', ondelete='SET NULL'), primary_key=True,nullable=False) projectId = Column(Integer, ForeignKey('project.projectId', ondelete='SET NULL'), primary_key=True,nullable=False) project = relationship("Project", back_populates="user_proj_map") flag = Column(BOOLEAN, nullable=True, default=True) def to_dict(self): return { 'pk': self.projectId, 'label': self.project.name, 'item': 1, 'openRank': self.project.openRank, 'activity': self.project.activity, 'stars': self.project.stars, 'attention': self.project.attention, 'technical_fork': self.project.technical_fork, } class UserDevUserMap(Base): """用户开发者映射""" __tablename__ = 'user_devuser_map' userId = Column(Integer, ForeignKey('user.userId', ondelete='SET NULL'), primary_key=True,nullable=False) devUserId = Column(Integer, ForeignKey('devuser.devUserId',ondelete='SET NULL'), primary_key=True,nullable=False) dev_user = relationship("DevUser", back_populates="user_devuser_map") flag = Column(BOOLEAN, nullable=True, default=True) def to_dict(self): return { 'pk': self.devUserId, 'avatar_url': url_prefix + (self.dev_user.avatar_url or ''), 'item': 2, 'label': self.dev_user.name, 'openRank': self.dev_user.openRank, 'activity': self.dev_user.activity, } Base.metadata.create_all(engine)