个人博客系列-后端项目-系统角色配置(8)

news2024/9/23 19:57:24

系统角色配置需要设置的接口

用户可以绑定多个角色,角色对应有多个路由权限。用户绑定角色后,可以访问当前角色下的各个api路由和菜单路由。

  1. 用户注册时设置用户角色
  2. 修改用户角色(同时对应用户可以访问的路由将会同步变更)
  3. 添加修改用户角色
  4. 添加url路由和菜单路由
  5. 给角色添加或修改路由

1. 用户注册

class User(AbstractBaseUser):
    username = models.CharField(max_length=255, unique=True, verbose_name="手机号")
    password = models.CharField(max_length=255, unique=False, verbose_name="密码")
    is_vip = models.BooleanField(default=False,verbose_name="是否为vip")
    vip_expires_at = models.DateTimeField(auto_now_add=True,verbose_name="vip过期时间")
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(auto_now=True,verbose_name="最后登录时间")
    USERNAME_FIELD = 'username'

    def set_password(self, raw_password):
        self.password = make_password(raw_password)

    def check_password(self, raw_password):
        return check_password(raw_password, self.password)

    class Meta:
        db_table = "blog_user"
        verbose_name = "用户表"
        verbose_name_plural = verbose_name
    ## urls.py
    path("userregistry/", UserRegisterView.as_view(), name="userregistry")
## views.py
class UserRegisterView(GenericAPIView):
    # 注册接口,局部禁用用户验证和权限
    authentication_classes = ()
    permission_classes = ()
    serializer_class = RegisterSerializer
    def post(self, request, *args, **kwargs):
        res = self.get_serializer(data=request.data)
        res.is_valid(raise_exception=True)
        data = res.validated_data
        return Response({'msg': data})
    def delete(self, request, *args, **kwargs):
        self.delete(self, request, *args, **kwargs)
        return Response()
## serializer.py
from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from userauth.models import User
from systemauth.models import UserRole
class RegisterSerializer(serializers.Serializer):
    """
    注册用户信息序列化校验
    """
    username = serializers.CharField()
    password = serializers.CharField()
    def validate(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        if User.objects.filter(username=username).exists():
            raise serializers.ValidationError('用户名已被占用')
        print(password)
        if not password or len(password) < 6:
            raise serializers.ValidationError("密码不符合要求,请使用6位以上密码")
        if attrs.get("is_vip"):
            attrs['is_vip'] = False
        attrs['is_active'] = True
        # 将用户信息保存到数据库中
        user = User.objects.create(**attrs)
        # 为其设置角色为普通用户,2 在表中设置的是普通用户
        UserRole.objects.create(**{'user_id': user.id, 'role_id': 2})
        if user:
            # 签发token
            refresh = TokenObtainPairSerializer.get_token(user)
            data = {
                'code': 100,
                'message': '登录成功',
                'username': user.username,
                'refresh': str(refresh),
                'access': str(refresh.access_token),
            }
            return data
        else:
            raise serializers.ValidationError('用户注册失败')

API测试
在这里插入图片描述

2. 添加或修改用户角色

## models.py
class UserRole(models.Model):

    user_id = models.IntegerField('用户ID', null=True, blank=True)
    role_id = models.IntegerField('角色ID', null=True, blank=True)

    class Meta:
        db_table = "blog_user_role"
        verbose_name = "用户角色表"
        verbose_name_plural = verbose_name
## serializers.py
class UserRoleSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    user_id = serializers.IntegerField()
    role_id = serializers.IntegerField()
    role_name = serializers.SerializerMethodField()
	
	    def create(self, validated_data):
        if not UserRole.objects.filter(user_id=validated_data['user_id'],role_id=validated_data['role_id']).exists():
            return UserRole.objects.create(**validated_data)	

    def get_role_name(self, obj):
        role_name = Role.objects.get(id=obj.role_id).role_name
        return role_name
        
    class Meta:
        model = UserRole
        fields = '__all__'

## urls.py
from rest_framework import routers
from systemauth import views as system_views

router = routers.DefaultRouter()
router.register(r'role', system_views.RoleView, basename='role')
router.register(r'userrole', system_views.UserRoleViewSet, basename='userrole')

urlpatterns = [

]
urlpatterns += router.urls
## views.py
class UserRoleViewSet(ModelViewSet):
    queryset = UserRole.objects.all()
    serializer_class = UserRoleSerializer

3. 添加修改用户角色

## models.py
class Role(models.Model):
    role_name = models.CharField('角色名字', max_length=16)

    class Meta:
        db_table = "blog_role"
        verbose_name = "角色表"
        verbose_name_plural = verbose_name

    def __int__(self):
        return self.role_name
## serializer.py
class RoleSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    role_name = serializers.CharField()
    class Meta:
        model = Role
        fields = '__all__'

## urls.py
router.register(r'role', system_views.RoleView, basename='role')
## views.py
class RoleView(ModelViewSet):
    serializer_class = RoleSerializer
    queryset = Role.objects.all()

4. 添加或修改api路由和菜单路由

## models.py
class Access(models.Model):
    name = models.CharField('用户权限名称', max_length=256)
    path = models.CharField('用户权限路由', max_length=256)
    method = models.CharField('用户权限请求方式', max_length=16)
    types = models.CharField('权限类型', blank=True, null=True, max_length=10)  # 菜单权限和api权限

    class Meta:
        db_table = "blog_access"
        verbose_name = "权限表"
        verbose_name_plural = verbose_name
## serializers.py
class AccessSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)

    class Meta:
        model = Access
        fields = '__all__'

## views.py
class AccessConfigView(ModelViewSet):
    serializer_class = AccessSerializer
    queryset = Access.objects.all()

## urls.py
router.register(r'accessconfig', system_views.AccessConfigView, basename='accessconfig')

api测试
在这里插入图片描述

4. 给角色添加或修改路由

## models.py
class UserRole(models.Model):
    user_id = models.IntegerField('用户ID', null=True, blank=True)
    role_id = models.IntegerField('角色ID', null=True, blank=True)

    class Meta:
        db_table = "blog_user_role"
        verbose_name = "用户角色表"
        verbose_name_plural = verbose_name
## serializer.py
class ReleAccessSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    access_name = serializers.SerializerMethodField()

    def validate(self, value):
        if "role_id" not in value or "acc_id" not in value:
            raise ValidationError({"error": "参数错误"})
        return value

    def create(self, validated_data):
        if not RoleAccess.objects.filter(role_id=validated_data['role_id'], acc_id=validated_data['acc_id']).exists():
            return RoleAccess.objects.create(**validated_data)

    def get_access_name(self, obj):
        return Access.objects.get(id=obj.acc_id).name
    class Meta:
        model = RoleAccess
        fields = '__all__'
## views.py
class RoleAccessViewSet(ModelViewSet):
    serializer_class = ReleAccessSerializer
    queryset = RoleAccess.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data.get("roleaccess", list()), many=True)
        if serializer.is_valid():
            serializer.save()
            return Response({"success": True}, status=status.HTTP_200_OK)
        else:
            return Response({"success": False, "message": ''.join([''.join(err.get("error", [])) for err in serializer.errors])}, status=status.HTTP_400_BAD_REQUEST)
## urls.py
router.register(r'roleaccess', system_views.RoleAccessViewSet, basename='roleaccess')

接口测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1542583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3如何二次封装el-upload组件进行图片上传及删除

实现功能&#xff1a; 1、封装el-upload组件&#xff0c;父组件可以控制图片上传框的宽高 2、父组件可以传入提示信息&#xff0c;利用具名插槽 3、上传前的校验 4、实现删除功能 不同配置下的效果&#xff1a; 父组件引用&#xff1a; <script setup lang"ts"…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢&#xff1f;2.人为什么要发明工具&#xff0c;进行进化呢&#xff1f;3.人是如何发明工具的&#xff1f;4.为什么要有不同的岗位和行业&#xff1f; 二、计算机(操作系统)发展的基本脉络1.第一台计算…

酷炫的粒子动态表白HTML源码

源码介绍 酷炫的粒子动态表白HTML源码&#xff0c;自己自定义文字&#xff0c;动态组合文字&#xff0c;进行表白&#xff0c;喜欢的朋友可以下载使用&#xff0c;很不错的表白HTML代码 下载地址 酷炫的粒子动态表白HTML源码

Set A Light 3D Studio中文--- 打造专业级3D照明效果

Set A Light 3D Studio是一款专业的灯光模拟软件&#xff0c;专为摄影师和电影制片人打造。它允许用户在计算机上模拟并预览各种布光效果&#xff0c;助力拍摄出真实、精准且具有艺术感的作品。软件提供了丰富的灯光和场景模型&#xff0c;用户可以灵活调整光源参数&#xff0c…

优化金融展厅设计,细节提升客户体验与实用效能

“很赚钱”大部分公众对金融行业的第一印象&#xff0c;这足以见得金融行业在社会经济发展中的重要性&#xff0c;而为了更好的宣传和科普金融相关信息&#xff0c;金融展厅的设计和建设成为了重要措施&#xff0c;它能够充分展示金融机构的实力、品牌形象和服务优势&#xff0…

使用Django实现信号与消息通知系统【第154篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Django实现信号与消息通知系统 在Web应用程序中&#xff0c;实现消息通知系统是至关重…

【Hadoop大数据技术】——Hadoop高可用集群(学习笔记)

&#x1f4d6; 前言&#xff1a;Hadoop设计之初&#xff0c;在架构设计和应用性能方面存在很多不如人意的地方&#xff0c;如HDFS和YARN集群的主节点只能有一个&#xff0c;如果主节点宕机无法使用&#xff0c;那么将导致HDFS或YARN集群无法使用&#xff0c;针对上述问题&#…

网络协议栈--传输层--UDP/TCP协议

目录 本节重点一、再谈端口号1.1 再谈端口号1.2 端口号范围划分1.3 认识知名端口号(Well-Know Port Number)1.4 回答两个问题1.5 netstat1.6 pidof 二、UDP协议2.1 UDP协议段格式2.2 UDP的特点2.3 面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议2.7 UDP…

【Linux】nmcli命令详解

目录 ​编辑 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ​编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ​编辑1.显示所有网络连接 2.显示某个网卡的…

基于ssm的酒店民宿管理系统的设计与实现

系统主要功能介绍&#xff1a; 1、登录&#xff1a;输入账号密码进行登录&#xff0c;登录后才能进行相应的操作 2、客房管理&#xff1a;客房管理主要是酒店预订&#xff0c;可以选择不同的房间&#xff0c;比如大床房&#xff0c;家庭房等&#xff0c;入住办理&#xff0c;…

DC电源模块的设计与调试技巧

BOSHIDA DC电源模块的设计与调试技巧 DC电源模块的设计与调试是电子工程师在实际项目中常常需要面对的任务。一个稳定可靠的DC电源模块对于电路的正常运行起到至关重要的作用。以下是一些设计与调试的技巧&#xff0c;帮助工程师们更好地完成任务。 第一&#xff0c;正确选择…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题&#xff0c;ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

2014年发射的SAR卫星传感器

2014年有多颗SAR卫星发射。包括Sentinel-1A、ALOS-2、SAOCOM 1A、SMAP。 Sentinel-1A 欧空局&#xff08;ESA&#xff09;的Sentinel-1A卫星发射于2014年4月3号&#xff0c;计划发射两颗&#xff0c;载荷为C波段SAR。 Sentinel-1延续了ERS-2和Envisat的观测任务。它具有更快…

宝贝的甜蜜梦乡:新生儿睡眠的温馨指南

引言&#xff1a; 新生儿的睡眠是他们健康成长的重要组成部分&#xff0c;良好的睡眠不仅有助于宝宝的身体发育&#xff0c;还对他们的认知和情绪发展至关重要。然而&#xff0c;新生儿的睡眠模式与成人不同&#xff0c;需要家长们特别关注和照顾。本文将为您介绍新生儿睡眠时间…

linux之zabbix自定义监控

zabbix基本配置见&#xff1a;写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/136783672 自定义监控规则 命令为who | wc -l 显示为2&#xff0c;主机一个&#xff0c;mobaxterm一个&#xff0c;思路是开启3个终端&#xff0c;让主机的zabbix服务自动检测1…

day6:STM32MP157——串口通信实验

使用的是cortex A7内核 【串口通信的工作原理】 本次实验使用的是uart4的串口&#xff0c;分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道&#xff0c;他们分别对应着芯片的PG11和PB2 从引脚名字也可以知道使用了GPIO口&#xff0c;所以本次实验同样需…

neo4j所有关系只显示RELATION,而不显示具体的关系

当看r时&#xff0c;真正的关系在properties中的type里&#xff0c;而type为“RELATION” 造成这个的原因是&#xff1a; 在创建关系时&#xff0c;需要指定关系的类型&#xff0c;这是固定的&#xff0c;不能像属性那样从CSV文件的一个字段动态赋值。标准的Cypher查询语言不支…

【MyBatis】初始化过程

MyBatis 初始化过程 可以分为以下几个步骤&#xff1a; 添加依赖&#xff1a;首先&#xff0c;需要在项目的 pom.xml&#xff08;如果是 Maven 项目&#xff09;或 build.gradle&#xff08;如果是 Gradle 项目&#xff09;文件中添加 MyBatis 以及数据库驱动的依赖。 配置文…

Java集合框架初学者指南:List、Set与Map的实战训练

Java集合框架是Java语言的核心部分&#xff0c;它提供了丰富的类和接口&#xff0c;用来高效地管理和操作大量数据。这个强大的工具箱包括多种集合类型&#xff0c;其中最为常用的是List、Set和Map。 1.List - 有序且可重复的数据清单 概念&#xff1a; List就像一个购物清单&…

Qt程序可执行文件打包

目录 一、新建一个目录二、命令行2.1 添加临时变量2.2 打包命令 三、添加动态库四、普通 Qt 项目打包 Qml 项目打包 笔者写的python程序打包地址&#xff08;https://blog.csdn.net/qq_43700779/article/details/136994813&#xff09; 一、新建一个目录 新目录(例如test)用以…