当前位置: 首页 > news >正文

day78 为用户分配角色 为角色分配权限 ajax 字符串拼接

day78 6.22 星期六

权限管理的流程

先传的 user_list   和   role_list

user_list = User表的all 
role_list = Role表的all 

在html页面 角色栏那里 
循环显示 role_list 
判断之后的rid 即点击了的被选中的好似给选中 写法如下:                            <tr {% if role.id|safe == rid %} class="active" {% endif %}>
判断循环的值是否在 之后发送的有选中的值里,有则选中,没有不选 写法如下
 <td><a href="?{% gen_role_url request role.id %}">{{ role.name }}</a></td>
# 拼接的a标签   host/rbac/permission/?uid=3&rid=1  用于判断post? form表单
<td>
{% if role.id in role_id_list %}
<input type="checkbox" name="roles" value="{{ role.id }} " checked>
{% else %} <input type="checkbox" name="roles" value="{{ role.id }} ">
{% endif %}   该开始为没被选中 ,所以显示的是  方形框 没有checked

当点击用户信息之后的某个标签之后,a标签刷新网页

html程序如下

{% for user in user_list %}         
<li class= {% if user.id|safe == uid %} 'active' {% endif %}>   
# 1,2,3 == 1/2/3    后端提交的uid = request.GET.get('uid') 然后前端才显示一个发红的点击事件 active  是因为提交了一个uid = {{user.id}} 没用name        
<a href="?uid={{ user.id }}">{{ user.name }}</a>        
</li>               
{% endfor %}                            
safe 自定义过滤器方法 为:
def safe(value):
    """
    Marks the value as a string that should not be auto-escaped.
    """     # 确保是个字符串而不是自动转义  不就是字符串吗?又没标签 <h1、、
    return mark_safe(value)     

因为前端提交了uid 后端进行动态处理

if uid:
role_id_list=models.User.objects.get(pk=uid).roles.all().values_list("pk")
#[(1,),(2,)]
role_id_list=[item[0] for item in role_id_list] #[1,2]
if rid:
per_id_list = models.Role.objects.filter(pk=rid).values_list("permissions__pk")
else:
per_id_list=models.User.objects.get(pk=uid).roles.values_list("permissions__pk").distinct()

per_id_list=[item[0] for item in per_id_list]    # []  列表【1,2】
print("per_id_list",per_id_list)
return locals()

把role_id_list 和 per_id_list = User.(per__pk) 返回给前端 用户的权限

因为用户可以有多个角色,所以,去重一下权限

再把role权限的代码复制过来

rid没有得到值,没发过来,不成立  没有active
<tr {% if role.id|safe == rid %} class="active" {% endif %}>
 <td><a href="?{% gen_role_url request role.id %}">{{ role.name }}</a></td>
<td>        拼接 rid $用 matable的 方法
{% if role.id in role_id_list %}    # 得到了点击的user的role权限 【1,2】
<input type="checkbox" name="roles" value="{{ role.id }} " checked>
{% else %} <input type="checkbox" name="roles" value="{{ role.id }} ">
{% endif %}   该开始为没被选中 ,所以显示的是  方形框 没有checked
自定义标签 拼接

def gen_role_url(request,rid):

也可以使用deepcopy()

     params = request.GET.copy()   # 1
     #区别:1:querydict的某个方法   copy.copy(request.GET)   __copy__方法
     params._mutable = True
     params['rid'] = rid
     print('自定义标签里的params.urlencode()',params.urlencode())  #自定义标签里的params.urlencode() uid=3&rid=1
     return params.urlencode()

每一个role 所以提交的标签就是 ?uid=3&rid=1

再把方形框 点亮(checked) if role.id in role_id_list

如果点击了 role 因为提交了rid

所以进入代码

if rid:
per_id_list = models.Role.objects.filter(pk=rid).values_list("permissions__pk")
     

per_id_list 就不一样了 传过去的值 是 role等于 pk=rid的 单个权限

而那个是用户的单个权限(但是包括多个角色:所以就是多个角色的多个权限)

到现在因为提交的是a标签的请求,所以都是get请求

并且当 if uid的时候隐藏(hidden)的角色保存可以操作

并且当 if rid的时候隐藏(hidden)的权限保存可以操作

以及ajax里面对 权限的操作就可以完成页面了

把权限 不管是单个角色的权限还是单个用户的权限 赋值给var

var per_id_list = {{ per_id_list }};
$.each(per_id_list,function (i,j) {
    console.log($("[value='"+j+"']")[0]);
    $("#body [value="+j+"']").prop('checked',true);

})

循环,i是序号1,2,3 j是循环列表里的值 [1,3,4]等

通过 "#body [value=" + j(1或者2) + "']" 属性选择器 给加checked选中

prop获得标签 ,添加 ‘checked’ 为tru true 不能为 字符串

上面的等于 $(#body [value= '2'] ) body是 tbody 的大id标签

忘了 最复杂的 ajax 部分了

数据结构如下

$.each(res,function (i,permission) {   #循环之下
var menu_title = permission['menu__title'];
var pk = permission['pk'];          #1-8
var parent_id = permission['parent_id'];    # 为pid none 111 none 555

if (menu_title){        # menu_title  表结构为 老大才有 分别是menu_id 1,2对应的信息管理 和 缴费管理
if('#menu_'+menu_pk.length){          # 判断是否有内容 这个标签体里面
var s =                         #有就给他 添加 子标签 客户列表 
"<tr class='node' id ='per_${pk}'> <td><input name='permission_id' value='${pk}'type='checkbox'>${title}</td></tr>";    # 不会走把?
                        
$("#menu_"+menu_pk).parent().append(s)    # 就是 父标签信息管理栏上append 
}else{                   
var s =                     # 没有就连父标签 一块添加   
"<tr class='root' id ='menu_${menu_pk}'> <td> ${menu_title}</td></tr>" +
"<tr class='node' id ='per_${pk}'> " +
"<td input name='permission_id' id ='${pk}' type='checkbox'>${title}</td></tr>";
$("#body").append(s);       # 添加到tbody里 信息管理 客户列表
}
}else{                      # else 承接 if(menu_title)添加到子标签 后面  一个父标签跟了许多个子标签   没有menu_title 的6个值  第一个else因该是处理多个重复的  menu_title = 1 
var s =
"<td input name='permission_id' value='${pk}'type='checkbox'>${title}</td>";
$("#per_"+parent_id).append(s);     # 承接上面id ='per_${pk}' 添加客户 编辑客户。。。   
}
})                              

每一次刷新 因为是get 请求,所以都会走ajax吗

$.ajax({
    url:'/rbac/permissions_tree/',
    type:'get',     
def permissions_tree(request):
    permissions=Permission.objects.values("pk","title","url","menu__title","menu__pk","parent_id")
    return JsonResponse(list(permissions),safe=False)   # 生成json数据发过去,内部解释器解析一下     
    print("permissions",permissions)    #permissions <QuerySet [{'pk': 1, 'title': '客户列表', 'url': '/customer/list/', 'menu__title': '信息管理', 'menu__pk': 1, 'parent_id': None}, {'pk': 2, 'title': '添加客户', 'url': '/customer/add/', 'menu__title': None, 'menu__pk': None, 'parent_id': 1}, {'pk': 3, 'title': '编辑客户', 'url': '/customer/edit/(?P<cid>\\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 1}, {'pk': 4, 'title': '删除客户', 'url': '/customer/del/(?P<cid>\\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 1}, {'pk': 5, 'title': '缴费列表', 'url': '/payment/list/', 'menu__title': '信息管理', 'menu__pk': 1, 'parent_id': None}, {'pk': 6, 'title': '添加缴费记录', 'url': '/payment/add/', 'menu__title': None, 'menu__pk': None, 'parent_id': 5}, {'pk': 7, 'title': '编辑缴费记录', 'url': '/payment/edit/(?P<pid>\\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 5}, {'pk': 8, 'title': '删除缴费记录', 'url': '/payment/del/(?P<pid>\\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 5}]>
当post请求时

即 两个保存form提交数据 时

<button type="submit" class="right btn btn-success btn-xs" style="padding: 2px 8px;margin: -8px">
    <i class="fa fa-save" aria-hidden="true"> </i>保存
</button>

<button class="right btn btn-success btn-xs" style="padding: 2px 8px ; margin: -3px;">
<i class="fa fa-save" aria-hidden="true"></i>保存
</button>

走如下函数

 为用户更改角色 :找到特定的user 改权限 
 user=models.User.objects.filter(id=uid)

 if request.method=="POST" and request.POST.get('postType')== 'role':
        print(request.POST.getlist("roles"))    
#  <input type="checkbox" name="roles" value="{{ role.id }} " checked>

        l=request.POST.getlist("roles")      #[2,3]
        user.first().roles.set(l)           # 保存更新 user

 为角色更改权限 : 找到特定的role 改权限
 if request.method=="POST" and request.POST.get('postType')== 'permission':
        print(request.POST.getlist("permission_id"))  #permission_id:[1,2,3,4]
        l=request.POST.getlist("permission_id")  #[2,3]
        models.Role.objects.filter(pk=rid).first().permissions.set(l)
                                # 保存更新到 permission  

转载于:https://www.cnblogs.com/Doner/p/11069999.html

相关文章:

  • 概要设计文档(final)
  • 011
  • 标 题: 腾讯面试题目(PHP程序员)
  • log4j配置文件中的additivity属性
  • Domino JVM异常
  • AgileEAS.NET敏捷开发平台-升级版-(丑小鸭的蜕变)[已修复下载链接]
  • Failed to load property source from location 'classpath:/applica)
  • do{}while(0)
  • 操作系统复习
  • 精通Camel-2-Camel的生命周期
  • zabbix命令之:zabbix_sender命令
  • 一打开网页,任务栏就消失的问题
  • Oracle 10g11g安装卸载Oracle Label Security
  • 如何在CentOS 5.5上安装Kippo蜜罐(1)
  • MySQL入门:下载
  • 【comparator, comparable】小总结
  • canvas 绘制双线技巧
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Redis 懒删除(lazy free)简史
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SQLServer之创建显式事务
  • Windows Containers 大冒险: 容器网络
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 阿里云应用高可用服务公测发布
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 聊一聊前端的监控
  • 前端知识点整理(待续)
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 用jQuery怎么做到前后端分离
  • 终端用户监控:真实用户监控还是模拟监控?
  • Java数据解析之JSON
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #考研#计算机文化知识1(局域网及网络互联)
  • (2)Java 简介
  • (4)STL算法之比较
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (五)c52学习之旅-静态数码管
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)详解PHP处理密码的几种方式
  • .Net Web项目创建比较不错的参考文章
  • .net 按比例显示图片的缩略图
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET成年了,然后呢?
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • ::
  • [20160807][系统设计的三次迭代]
  • [ABC294Ex] K-Coloring
  • [ACTF2020 新生赛]Upload 1
  • [ARC066F]Contest with Drinks Hard
  • [C++] new和delete
  • [hdu 1247]Hat’s Words [Trie 图]