CRM权限管理(1)、用户权限设计思路

需求分析:

  • 1、不同用户可能有不同的权限;
  • 2、权限体现即为登录后显示的菜单列表;
  • 例如:教师有 查看负责的班级、批改作业、报名录入、报名审核等功能,所以登录后显示如下图:

  • 学生只有 查看和提交作业 的功能,登录后显示为下图:


Models.py

一个用户可以有多个角色,一个角色可以有多个菜单(权限)。

from django.db import models
from django.contrib.auth.models import AbstractUser, User


class Menu(models.Model):
    """动态菜单"""
    name = models.CharField(max_length=64)
    url_type_choices = (
        (0, 'absolute'),
        (1, 'dynamic'),  # 带参数的url
    )
    url_type = models.SmallIntegerField(choices=url_type_choices)
    url_name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

    class Meta:
        unique_together = ('name', 'url_name')
        db_table = '菜单'
        verbose_name = '菜单'
        verbose_name_plural = verbose_name


class Role(models.Model):
    """角色,可以包括学生,讲师等"""
    title = models.CharField(max_length=64, unique=True)
    menu = models.ManyToManyField('Menu')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '角色'
        verbose_name_plural = verbose_name
        db_table = '角色'


class UserProfile(AbstractUser):
    """用户信息"""
    # 一个角色可以对应多个用户,一个用户可以有多个角色
    role = models.ManyToManyField('Role', blank=True, null=True)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = verbose_name
        db_table = '用户信息'

index.html

<ul class="nav nav-sidebar">
    <!--1、循环当前登录用户的所有角色-->
    {% for role in request.user.role.select_related %}

        <!--2、循环每个角色的所有菜单(权限)-->
        {% for menu in role.menu.select_related %}

            <!--3、判断当前页面是否是与当前菜单一致,存储为is_active变量,供随后使用-->
            <li class="{% is_active menu.url_name request.path as is_active %}">
                <!--4、直接根据is_active变量判断是够增加高亮属性-->
                <a class="{% if is_active %}menu_active{% else %}{% endif %}"
                   href="{% if menu.url_type == 0 %}{{ menu.url_name }}{% else %}{% url menu.url_name %}{% endif %}">
                {{ menu.name }}
                </a>
            </li>
        {% endfor %}
    {% endfor %}
</ul>

后台操作

  • 1、添加menu

  • 2、添加角色,并指定menu

  • 3、给用户分配角色即可

猜你喜欢

转载自www.cnblogs.com/fqh202/p/9462271.html
今日推荐