# RBAC



用户与角色 多对多 角色与权限 多多多 权限和权限组 多对一 菜单和权限组 一对多

```python
# 用户
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32, default=123)
    email = models.EmailField()
    roles = models.ManyToManyField(to="Role")

    def __str__(self):
        return self.name


# 角色
class Role(models.Model):
    title = models.CharField(max_length=32)
    permissions = models.ManyToManyField(to="Permission")

    def __str__(self):
        return self.title


# 权限表(如增删改查)
class Permission(models.Model):
    url = models.CharField(max_length=32)
    title = models.CharField(max_length=32)
    permission_group = models.ForeignKey("PermissionGroup", default=1)
    code = models.CharField(max_length=32, default="")
    <!-- 当某个权限不需要在菜单栏展示，我们就给他一个parent，这样访问他时，对应的parent权限在菜单栏就会变色 -->
    parent = models.ForeignKey("self", default=1, null=True, blank=True)


# 权限组表
class PermissionGroup(models.Model):
    caption = models.CharField(max_length=32)
    menu = models.ForeignKey("Menu", default=1)


# 菜单表
class Menu(models.Model):
    sord_num =  models.CharField(max_length=32)
    caption = models.CharField(max_length=32)


    def __str__(self):
        return self.caption


{

}
```

使用api.representation装饰器声明content-type

> 参考： https://www.shuzhiduo.com/A/kvJ34Aeg5g/

```python
# 当要返回的数据类型是这里定义的 content-type 的时候，会执行这里的函数
@api.representation('text/html')
def output_html(data, code, headers):
    """ 
        在representation装饰的函数中，必须放回一个Response对象 
    """
    resp = Response(data)
    return resp
```
