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

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

用户可以绑定多个角色,角色对应有多个路由权限。用户绑定角色后,可以访问当前角色下的各个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.pypath("userregistry/", UserRegisterView.as_view(), name="userregistry")
## views.py
class UserRegisterView(GenericAPIView):# 注册接口,局部禁用用户验证和权限authentication_classes = ()permission_classes = ()serializer_class = RegisterSerializerdef post(self, request, *args, **kwargs):res = self.get_serializer(data=request.data)res.is_valid(raise_exception=True)data = res.validated_datareturn 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'] = Falseattrs['is_active'] = True# 将用户信息保存到数据库中user = User.objects.create(**attrs)# 为其设置角色为普通用户,2 在表中设置的是普通用户UserRole.objects.create(**{'user_id': user.id, 'role_id': 2})if user:# 签发tokenrefresh = TokenObtainPairSerializer.get_token(user)data = {'code': 100,'message': '登录成功','username': user.username,'refresh': str(refresh),'access': str(refresh.access_token),}return dataelse: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_namereturn role_nameclass Meta:model = UserRolefields = '__all__'
## urls.py
from rest_framework import routers
from systemauth import views as system_viewsrouter = 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_namedef __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 = Rolefields = '__all__'
## urls.py
router.register(r'role', system_views.RoleView, basename='role')
## views.py
class RoleView(ModelViewSet):serializer_class = RoleSerializerqueryset = 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 = Accessfields = '__all__'
## views.py
class AccessConfigView(ModelViewSet):serializer_class = AccessSerializerqueryset = 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 valuedef 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).nameclass Meta:model = RoleAccessfields = '__all__'
## views.py
class RoleAccessViewSet(ModelViewSet):serializer_class = ReleAccessSerializerqueryset = 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.rhkb.cn/news/285143.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python写爬虫爬取京东商品信息

工具库 爬虫有两种方案&#xff1a; 第一种方式是使用request模拟请求&#xff0c;并使用bs4解析respond得到数据。第二种是使用selenium和无头浏览器&#xff0c;selenium自动化操作无头浏览器&#xff0c;由无头浏览器实现请求&#xff0c;对得到的数据进行解析。 第一种方…

[Java基础揉碎]单例模式

目录 什么是设计模式 什么是单例模式 饿汉式与懒汉式 饿汉式vs懒汉式 懒汉式存在线程安全问题 什么是设计模式 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、 以及解决问题的思考方式。设计模式就像是经典的棋谱&am…

数据分析和机器学习库Pandas的使用

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析和机器学习的工具之一。Pandas 提供了两种数据结构&#xff0c;分别是 Series&#xff08;一维数组结构&#xff09;与 DataFrame&#xff08;二维数组结构&#xff09;&#xff0c;极大地增强的了 …

STM32微控制器的中断优先级设置对系统性能有何影响?

STM32微控制器的中断优先级设置对系统性能有着显著的影响。正确配置中断优先级可以确保关键任务得到及时响应&#xff0c;提高系统的实时性和可靠性。相反&#xff0c;如果中断优先级设置不当&#xff0c;可能会导致系统响应延迟&#xff0c;甚至出现死锁等问题。本文将详细探讨…

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高&#xff0c;性能要好通常用来做自动驾驶的AI推理&#xff0c;具体外观如下图 1.刷机软件sdkmanager&#xff1a;下载链接 NVIDIA账号需要注册&#xff0c;正常一步一步往下走就行。在ubuntu18以上的系统安…

pycharm搭建新的解释器及删除处理

目录 1.创建虚拟环境 个人实际操作&#xff1a; 对于“继承全局站点包”&#xff1a; 2.创建一个新项目 3.删除操作 &#xff08;1&#xff09;删除解释器 &#xff08;2&#xff09;删除新建项目 1.创建虚拟环境 Pycharm官方文档说明网址&#xff1a; Configure a virt…

C语言 数组指针 指针数组

指针数组 什么是指针数组&#xff0c;他是一个数组&#xff0c;数组的元素是指针。但是指针也有多种数据类型&#xff0c;有数组指针、函数指针、整形指针、字符串指针。 现在我就使用函数指针来写代码&#xff0c;也就是函数指针数组的应用代码&#xff1a; #include <s…

Qt实现简易的多线程TCP服务器(支持多个客户端连接)附源码

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

自注意力机制的理解

一、自注意力要解决什么问题 循环神经网络由于信息传递的容量以及梯度消失问题&#xff0c;只能建立短距离依赖关系。为了建立长距离的依赖关系&#xff0c;可以增加网络的层数或者使用全连接网络。但是全连接网络无法处理变长的输入序列&#xff0c;另外&#xff0c;不同的输…

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…

ASP .Net Core 8.0 依赖注入的三种注入模式

&#x1f433;前言 &#x1f340;在.NET中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于解耦组件之间的依赖关系。 依赖注入的核心思想是将对象的依赖关系&#xff08;即对象所需的其他服务或组件&#…

Cesium for UE-02-创建第一个关卡(Level),添加地形和地图及建筑物

继上一个章节后&#xff0c;本章节主要记录如何使用安装的Cesium for UE插件建立关卡。 先打开虚幻引擎 创建关卡场景 1. 打开我们上一个章节新建的项目&#xff0c;myapp02 登录cesium账号 打开项目后&#xff0c;可以看到左侧为插件页面 点击 Connect to Cesium ion按钮会在…

Neo4j桌面版导入CVS文件

之后会出来一个提示框&#xff0c;而且会跳出相关文件夹&#xff1a; 然后我们将CSV文件放在此目录下&#xff1a; 我们的relation.csv是这样的 参见&#xff1a; NEO4J的基本使用以及桌面版NEO4J Desktop导入CSV文件_neo4j desktop使用-CSDN博客

银行监管报送系统介绍(五):金融统计数据大集中自动化报送系统——PBOC Report

人民银行金融统计数据大集中自动化报送系统&#xff08;简称PBOC Report&#xff09;&#xff0c;是基于现代计算机网络技术应用基础上&#xff0c;由人行总行设置金融统计数据服务器&#xff0c;建立的一个全国统一的金融统计数据库。 人行针对各银行存贷款、中间业务、网点人…

unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)

切换一下布局就行了。 附&#xff1a;Road Architect教学地址

微服务(基础篇-003-Nacos)

目录 Nacos注册中心&#xff08;1&#xff09; 认识和安装Nacos&#xff08;1.1&#xff09; Nacos快速入门&#xff08;1.2&#xff09; 服务注册到Nacos(1.2.1) Nacos服务分级存储模型&#xff08;1.3&#xff09; 配置集群&#xff08;1.3.1&#xff09; 根据集群修改…

部署Prometheus+grafana详解

目录 一、prometheus 介绍 二、prometheus 对比 zabbix 三、prometheus 监控插件 四、部署 1、下载所需的包 2.编辑prometheus的配置文件 3、编辑alertmanager 的配置文件 4、tmpl 模板&#xff08;将此文件创建在/opt/alertmanager/tmpl/&#xff09; 5.启动&#xff0…

使能 Linux 内核自带的 FlexCAN 驱动

一. 简介 前面一篇文章学习了 ALPHA开发板修改CAN的设备树节点信息&#xff0c;并加载测试过设备树文件&#xff0c;文件如下&#xff1a; ALPHA开发板修改CAN的设备树节点信息-CSDN博客 本文是学习使能 IMX6ULL的 CAN驱动&#xff0c;也就是通过内核配置来实现。 二. 使能…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

qt Qt Remote Object(QtRO)实现进程间通信

简介 Qt Remote Object简称QtRO&#xff0c;这是Qt5.9以后官方推出来的新模块&#xff0c;专门用于进程间通信&#xff08;IPC&#xff09;。是基于Socket来封装的&#xff0c;兼容LPC和RPC。LPC即Local Process Communication&#xff0c;而RPC是指Remote Process Communicat…