from django.db import models from django.contrib.auth.models import AbstractUser class Menu(models.Model): """ 菜单 """ name = models.CharField(max_length=30, unique=True, verbose_name="菜单名") route_name = models.CharField(max_length=30, null=True, blank=True, verbose_name="组件名称") icon = models.CharField(max_length=50, null=True, blank=True, verbose_name="图标") path = models.CharField(max_length=158, null=True, blank=True, verbose_name="链接地址") is_frame = models.BooleanField(default=False, verbose_name="外部菜单") is_show = models.BooleanField(default=True, verbose_name="显示标记") sort = models.IntegerField(blank=True, null=True, verbose_name="排序标记") component = models.CharField(max_length=200, null=True, blank=True, verbose_name="组件") pid = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父菜单") label = models.IntegerField(default=1, verbose_name="是否前台菜单 # 1:是 2:不是") def __str__(self): return self.name class Meta: verbose_name = "菜单" verbose_name_plural = verbose_name ordering = ["id"] class Permission(models.Model): """ 权限 """ name = models.CharField(max_length=30, unique=True, verbose_name="权限名") method = models.CharField(max_length=50, null=True, blank=True, verbose_name="方法") pid = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父权限") label = models.IntegerField(default=1, verbose_name="是否前台权限 # 1:是 2:不是") def __str__(self): return self.name class Meta: verbose_name = "权限" verbose_name_plural = verbose_name ordering = ["id"] class Role(models.Model): """ 角色 """ name = models.CharField(max_length=32, verbose_name="角色") permissions = models.ManyToManyField("Permission", blank=True, verbose_name="权限") menus = models.ManyToManyField("Menu", blank=True, verbose_name="菜单") desc = models.CharField(max_length=50, blank=True, null=True, verbose_name="描述") label = models.IntegerField(default=1, verbose_name="是否前台角色 # 1:是 2:不是") companyMid = models.CharField(null=True, blank=True, max_length=36, verbose_name="公司全局id") # 用于绑定公司 # class Meta: # unique_together = ('name', 'companymid') # name companymid 两个字段共同形成唯一约束 class UserProfile(AbstractUser): """ 用户 """ name = models.CharField(max_length=20, null=True, blank=True, verbose_name="姓名") MainId = models.CharField(max_length=36, null=True, blank=True, verbose_name="guid全局id") mobile = models.CharField(max_length=50, null=False, blank=True, verbose_name="手机号码") gender = models.CharField(max_length=10, null=True, blank=True, verbose_name="性别") email = models.EmailField(max_length=50, null=True, blank=True, verbose_name="邮箱") image = models.CharField(max_length=100, default="/image/default.png", verbose_name="头像") area_code = models.CharField(max_length=1000, null=True, blank=True, verbose_name="地区代码") # 地区代码 area_name = models.CharField(max_length=15, null=True, blank=True, verbose_name="地区名") # 地区名 is_sub = models.IntegerField(default=2, verbose_name="是否子账号") # 1:是;2:否。 wx_phone_info = models.CharField(null=True, blank=True, max_length=500, verbose_name="微信手机信息") wx_openid = models.CharField(null=True, blank=True, max_length=255, verbose_name="微信小程序唯一标识") parent_id = models.IntegerField(null=True, blank=True, verbose_name="父账号id") companyMid = models.CharField(null=True, blank=True, max_length=36, verbose_name="公司全局id") # 用于绑定公司 is_active = models.BooleanField(null=True, blank=True, default=True, verbose_name="用户是否可用") # 用户锁定与激活用户 label = models.IntegerField(default=1, verbose_name="是否前台用户 # 1:是 2:不是") roles = models.ManyToManyField("Role", verbose_name="角色", blank=True) company = models.ManyToManyField("Company", verbose_name="公司", blank=True) class Meta: verbose_name = "用户信息" verbose_name_plural = verbose_name ordering = ["id"] def __str__(self): return self.username def get_companies(self): return self.company.all() # 重写方法,校验密码时,不区分大小写 def check_password(self, raw_password): return super().check_password(raw_password.lower()) class Company(models.Model): """ 公司 """ name = models.CharField(max_length=100, verbose_name="企业名称", help_text="企业名称") MainId = models.CharField(max_length=36, null=True, blank=True, verbose_name="guid全局id", help_text="guid全局id") userMid = models.CharField(max_length=36, null=True, blank=True, verbose_name="企业所属人的全局id", help_text="企业所属人的全局id") EUCC = models.CharField(max_length=50, null=True, blank=True, verbose_name="企业统一信用代码", help_text="企业统一信用代码") employeesCount = models.IntegerField(null=True, blank=True, verbose_name="企业员工总数", help_text="企业员工总数") hightechCode = models.CharField(max_length=36, blank=True, verbose_name="高企编码", help_text="高企编码") hightechDate = models.DateField(null=True, blank=True, verbose_name="获取高企时间", help_text="获取高企时间") AmStart = models.CharField(max_length=10, default='8:00', null=True, blank=True, verbose_name="早班起始时间", help_text="早班起始时间") AmEnd = models.CharField(max_length=10, default='12:00', null=True, blank=True, verbose_name="早班结束时间", help_text="早班结束时间") PmStart = models.CharField(max_length=10, default='14:00', null=True, blank=True, verbose_name="午班起始时间", help_text="午班起始时间") PmEnd = models.CharField(max_length=10, default='18:00', null=True, blank=True, verbose_name="午班结束时间", help_text="午班结束时间") tech = models.CharField(max_length=200, null=True, blank=True, verbose_name='技术领域id', help_text="技术领域id") tolerance = models.IntegerField(default=900, verbose_name="打卡容错时间,单位s, 默认900s=15min", help_text="打卡容错时间,单位s, 默认900s=15min") checkIn = models.IntegerField(default=0, verbose_name="打卡方案,0-原方案, 1-新方案(细颗粒度)", help_text="打卡方案,0-原方案, 1-新方案(细颗粒度)") class Meta: verbose_name = "公司信息" verbose_name_plural = verbose_name ordering = ["id"] def __str__(self): return self.name