update. 完善用户相关基础数据的模型与接口配置

This commit is contained in:
2026-04-07 12:52:26 +08:00
parent 53e91fa458
commit ae80234f65
11 changed files with 778 additions and 61 deletions
+54 -27
View File
@@ -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