update. 完善用户相关基础数据的模型与接口配置
This commit is contained in:
+54
-27
@@ -1,35 +1,30 @@
|
||||
from django.contrib.auth.models import PermissionsMixin, AbstractUser
|
||||
from django.db import models
|
||||
|
||||
from common.base import BaseEntity
|
||||
|
||||
|
||||
# Create your models here.
|
||||
class Permission(models.Model):
|
||||
CODENAMES = [
|
||||
('view', '查看'),
|
||||
('add', '新增'),
|
||||
('edit', '编辑'),
|
||||
('delete', '删除'),
|
||||
]
|
||||
resource = models.CharField("资源标识", max_length=50) # 如 'article', 'menu', 'carousel'
|
||||
action = models.CharField("操作", max_length=10, choices=CODENAMES)
|
||||
desc = models.CharField("描述", max_length=100)
|
||||
class Role(BaseEntity):
|
||||
"""角色模型"""
|
||||
name = models.CharField(max_length=50, unique=True, verbose_name="角色名称")
|
||||
code = models.CharField(max_length=50, unique=True, verbose_name="角色编码")
|
||||
description = models.CharField(max_length=200, blank=True, verbose_name="描述")
|
||||
status = models.BooleanField(default=True, verbose_name="状态")
|
||||
# 直接关联菜单(多对多)
|
||||
menus = models.ManyToManyField(
|
||||
'Menu',
|
||||
blank=True,
|
||||
related_name='roles',
|
||||
verbose_name="菜单权限"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('resource', 'action')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.resource}:{self.action}"
|
||||
verbose_name = "角色"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
class Role(models.Model):
|
||||
name = models.CharField("角色名称", max_length=50, unique=True)
|
||||
permissions = models.ManyToManyField('Permission', blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Department(models.Model):
|
||||
class Department(BaseEntity):
|
||||
name = models.CharField("部门名称", max_length=100, unique=True)
|
||||
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name="上级部门")
|
||||
order = models.IntegerField("排序", default=0)
|
||||
@@ -42,11 +37,20 @@ class Department(models.Model):
|
||||
return self.name
|
||||
|
||||
|
||||
class User(AbstractUser, PermissionsMixin):
|
||||
class User(AbstractUser, PermissionsMixin, BaseEntity):
|
||||
username = models.CharField("英文名/账号", max_length=30, unique=True)
|
||||
cname = models.CharField("中文名", max_length=30, blank=True)
|
||||
phone = models.CharField(max_length=20, blank=True, verbose_name="手机号")
|
||||
avatar = models.CharField(max_length=255, blank=True, verbose_name="头像")
|
||||
dept = models.ForeignKey('Department', on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属部门")
|
||||
is_active = models.BooleanField(default=True)
|
||||
is_active = models.BooleanField(default=True, verbose_name="状态")
|
||||
# 直接在这里定义多对多关系 👈
|
||||
roles = models.ManyToManyField(
|
||||
Role,
|
||||
blank=True,
|
||||
related_name='users',
|
||||
verbose_name="角色"
|
||||
)
|
||||
|
||||
USERNAME_FIELD = 'username'
|
||||
REQUIRED_FIELDS = []
|
||||
@@ -55,5 +59,28 @@ class User(AbstractUser, PermissionsMixin):
|
||||
return f"{self.cname} ({self.username})"
|
||||
|
||||
|
||||
# 给 User 关联 Role(多对多)
|
||||
User.add_to_class('roles', models.ManyToManyField(Role, blank=True))
|
||||
class Menu(BaseEntity):
|
||||
"""菜单模型"""
|
||||
MENU_TYPE_CHOICES = [
|
||||
(0, '目录'),
|
||||
(1, '菜单'),
|
||||
(2, '按钮'),
|
||||
]
|
||||
|
||||
name = models.CharField(max_length=50, verbose_name="菜单名称")
|
||||
code = models.CharField(max_length=50, unique=True, verbose_name="菜单编码")
|
||||
path = models.CharField(max_length=200, blank=True, verbose_name="路由路径")
|
||||
component = models.CharField(max_length=200, blank=True, verbose_name="组件路径")
|
||||
icon = models.CharField(max_length=50, blank=True, verbose_name="图标")
|
||||
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name="父菜单")
|
||||
menu_type = models.IntegerField(choices=MENU_TYPE_CHOICES, default=1, verbose_name="菜单类型")
|
||||
order_num = models.IntegerField(default=0, verbose_name="显示顺序")
|
||||
permission_code = models.CharField(max_length=100, blank=True, verbose_name="权限标识")
|
||||
status = models.BooleanField(default=True, verbose_name="状态")
|
||||
|
||||
class Meta:
|
||||
verbose_name = "菜单"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
Reference in New Issue
Block a user