Django实战1-权限管理功能实现-09:组织架构关联用户

实现组织架构和用户绑定,通过绑定按钮设置组织架构和用户之间一对多的关联关系。

1 关联用户

1.1 关联用户的视图实现

打开sandboxMP/apps/system/views_structure.py,添加如下内容:

from django.contrib.auth import get_user_model
User = get_user_model()

class Structure2UserView(LoginRequiredMixin, View):

    def get(self, request):
        if ‘id‘ in request.GET and request.GET[‘id‘]:
           # 通过id获取需要绑定用户的组织架构实例
            structure = get_object_or_404(Structure, pk=int(request.GET[‘id‘]))
           # 通过外键的反向查找(_set),找到已经绑定到该组织架构的所有用户信息
            added_users = structure.userprofile_set.all()
           # 查找系统中所有用户信息,User = get_user_object()使用自定义用户模型都是通过这种模式
            all_users = User.objects.all()
           # 通集合获取差集set().difference(),得出还未绑定的用户
            un_add_users = set(all_users).difference(added_users)
           # 将这些数据返回给前端,用来渲染数据,形成一个复选框,左边是未绑定用户,右边是已经绑定的用户
            ret = dict(structure=structure, added_users=added_users, un_add_users=list(un_add_users))
        return render(request, ‘system/structure/structure_user.html‘, ret)

    def post(self, request):
        res = dict(result=False)
        id_list = None
        # 通过id获取structure实列
        structure = get_object_or_404(Structure, pk=int(request.POST[‘id‘]))
        # 获取需要绑定到structure实例的用户id
        if ‘to‘ in request.POST and request.POST.getlist(‘to‘, []):
            id_list = map(int, request.POST.getlist(‘to‘, []))
        # 清空组织架构原有用户绑定信息
        structure.userprofile_set.clear()
        if id_list:
            # 绑定新的用户数据
            for user in User.objects.filter(id__in=id_list):
                structure.userprofile_set.add(user)
        res[‘result‘] = True
        return HttpResponse(json.dumps(res), content_type=‘application/json‘)

视图实现思路:参照代码中的注释。

1.2 关联用户URL配置

打开sandboxMP/apps/system/urls.py, 新增URL配置:

urlpatterns = [
    ‘‘‘原有内容省略‘‘‘
    path(‘basic/structure/add_user/‘, views_structure.Structure2UserView.as_view(), name=‘basic-structure-add_user‘),
]

1.3 新增用户关联的模板页

新建sandboxMP/templates/system/structure/structure_user.html,内容如下:

{% extends ‘base-layer.html‘ %}
{% load staticfiles %}

{% block css %}
    <link rel="stylesheet" href="{% static ‘plugins/select2/select2.min.css‘ %}">
{% endblock %}
{% block main %}
    <div class="box box-danger">
        <form class="form-horizontal" id="selectUsersForm" action="" method="post">
            {% csrf_token %}
            <input type="hidden" name=‘id‘ value="{{ structure.id }}"/>
            <div class="box-body">
                <div class="row">
                    <div class="col-xs-5">
                        <label class="control-label">可选用户:</label>
                        <select name="from" id="multiselect" class="form-control" size="18" multiple="multiple">
                            {% for item in un_add_users %}
                                <option value="{{ item.id }}">{{ item.name }}({{ item.username }})</option>
                            {% endfor %}
                        </select>
                    </div>
                    <div class="col-xs-2">
                        <br><br><br><br><br><br>
                        <button type="button" id="multiselect_rightAll" class="btn btn-block"><i
                                class="glyphicon glyphicon-forward"></i></button>
                        <button type="button" id="multiselect_rightSelected" class="btn btn-block"><i
                                class="glyphicon glyphicon-chevron-right"></i></button>
                        <button type="button" id="multiselect_leftSelected" class="btn btn-block"><i
                                class="glyphicon glyphicon-chevron-left"></i></button>
                        <button type="button" id="multiselect_leftAll" class="btn btn-block"><i
                                class="glyphicon glyphicon-backward"></i></button>
                    </div>
                    <div class="col-xs-5">
                        <label class="control-label">编辑:{{structure.name}}-已绑定用户:</label>
                        <select name="to" id="multiselect_to" class="form-control" size="18" multiple="multiple">
                            {% for item in added_users %}
                                <option value="{{ item.id }}">{{ item.name }}({{ item.username }})</option>
                            {% endfor %}
                        </select>
                    </div>
                </div>
                <div class="row">
                    <div class="col-xs-12 margin-top-5">
                        <p class="text-maroon">*注意:一个用户只能隶属一个部门,如果选择的用户已存在部门,用户将会从原有部门移出</p>
                    </div>
                </div>
            </div>
            <div class="box-footer ">
                <div class="row span7 text-center ">
                    <button type="button" id="btnCancel" class="btn btn-default margin-right ">重置</button>
                    <button type="button" id="btnSave" class="btn btn-info margin-right ">保存</button>
                </div>
            </div>
        </form>
    </div>
{% endblock %}

{% block javascripts %}
    <script src="{% static ‘plugins/select/multiselect.min.js‘ %}"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            //初始化多选列表
            $(‘#multiselect‘).multiselect({
                search: {
                    left: ‘<input type="text" class="form-control" placeholder="Search..." />‘,
                    right: ‘<input type="text" class="form-control" placeholder="Search..." />‘,
                },
                fireSearch: function (value) {
                    return value.length > 3;
                }
            });

        });

        $("#btnSave").click(function () {
            $(‘#multiselect_to option‘).prop(‘selected‘, true);
            var data = $("#selectUsersForm").serialize();
            console.log(data);
            $.ajax({
                type: $("#selectUsersForm").attr(‘method‘),
                url: "{% url ‘system:basic-structure-add_user‘ %}",
                data: data,
                cache: false,
                success: function (msg) {
                    if (msg.result) {
                        layer.alert(‘操作成功‘, {icon: 1});
                    } else {
                        //alert(msg.message);
                        layer.alert(‘操作失败‘, {icon: 2});
                    }
                    return;
                }
            });
        });

        /*点取消刷新新页面*/
        $("#btnCancel").click(function () {
            window.location.reload();

        });
    </script>
{% endblock %}

组织架构关联用户模板页使用了一个jQuery多选框组建:http://crlcu.github.io/multiselect/, 具体用法可以参考官方网址,网址中也有使用案例,没有太高要求的直接参考案例里面的用法就可以了。

1.4 为关联用户的按钮添加点击事件

我们需要在组织架构管理页面点击关联按钮调用关联弹窗,完成组织架构和用户的绑定。 在sandboxMP/templates/system/structure/structure.html模板中{% block javascripts %} 标签下添加如下内容:

   //删除单个数据
    function doDelete(id) {
        ‘‘‘原有内容省略‘‘‘

    }
    //新增的关联用户,放到doDelete()函数后面
    function doAddUser(id) {
        layer.open({
            type: 2,
            title: ‘编辑:{{structure.name}}‘,
            shadeClose: false,
            maxmin: true,
            area: [‘800px‘, ‘600px‘],
            content: ["{% url ‘system:basic-structure-add_user‘ %}" + ‘?id=‘ + id, ‘no‘],
            end: function () {
                window.location.reload();
            }
        });
    }
    //关联用户的函数到这里就结束了
</script>

最终运行效果:

有关组织架构的完整操作到这里就结束了,datatables初始化的时候已经启用了搜索功能,组织架构没有单独配置查询的功能,有兴趣可以自行完成。

完成以上配置,访问structure管理页面,可以通过头部复选框选中多条数据,然后点上面的删除按钮,进行批量删除。点击单条数据后面的删除按钮可以删除单条记录。

原文地址:https://www.cnblogs.com/jameslove/p/11043775.html

时间: 2024-11-05 19:05:23

Django实战1-权限管理功能实现-09:组织架构关联用户的相关文章

django项目后台权限管理功能。

对后台管理员进行分角色,分类别管理,每个管理员登录账号后只显示自己负责的权限范围. 创建后台管理数据库 models.py文件内 # 管理员表 class Superuser(models.Model): super_id=models.AutoField(primary_key=True) super_name=models.CharField(max_length=255) super_pwd=models.CharField(max_length=255) role = models.Ma

Django实战1-权限管理功能实现-08:组织架构修改和删除

1 组织架构的修改 实现思路: 1.请求:前台通过修改按钮,请求修改页面,同时传递修改数据的id到后台,后台通过reques.GET方法获取id,返回数据,并将数据渲染到修改页面 2.执行:前台修改完数据后,提交保存,后台通过ID获取数据实例,通过form.is_valid()成功验证数据想信息后,调用form.save()方法将数据保存到数据库. 1.1 组织架构修改视图 修改和添加操作很类似,添加是在数据库中插入一条新的纪录,修改是修改数据库已有实例,因此组织架构修改视图,可以和添加使用同一

Django实战1-权限管理功能实现-07:组织架构列表展示

1 组织架构列表实现 我们需要在项目中可以查看所有组织建构的数据,数据以列表的形式在页面上展示,效果如下: 1.1 组织架构列表视图 打开sandboxMP/apps/system/views_structure.py, 添加列表视图: class StructureListView(LoginRequiredMixin, View): def get(self, request): fields = ['id', 'name', 'type', 'parent__name'] ret = di

Django实战1-权限管理功能实现-01:搭建开发环境

1 项目开发环境 语言环境: python3.6.2 , django-2.1.2 数据库环境:sqlite3(开发环境使用,部署环境使用mysql5.6) 开发工具:pycharm 2 安装python 说明:已经安装过python3.6环境的可以跳过此步.python安装包下载地址:https://www.python.org/downloads/windows/ 访问上面地址,找到Python 3.6.2rc2 - 2017-07-07,点击 Windows x86-64 executab

基于Django实现RBAC权限管理

概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际应用中,url是依附在菜单下的,比如一个简单的生产企业管理系统,菜单可以大致分为以下几块:制造.资材.生产管理.人事.财务等等.每个菜单下又可以有子菜单,但最终都会指向一个url,点击这个url,通过Django路由系统执行一个视图函数,来完成某种操作.这里,制造部的员工登录系统后,肯定不能点击财务

PHP实现权限管理功能

权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样. 首先先看下数据库 总共有5张表,users,roles和roleswork 3张表与另外2张表形成"w"型的关系,也是比较常见的一种权限数据库的方式,首先先做权限的设定,也就是管理层给不同用户设定不同权限. 1.管理员页面RBAC.php <!DOCTYPE html> <html> <head> <meta charset="UT

&lt;测试用例设计&gt;用户及权限管理功能常规测试方法

1)  赋予一个人员相应的权限后,在界面上看此人员是否具有此权限,并以此人员身份登陆,验证权限设置是否正确(能否超出所给予的权限): 2)  删除或修改已经登陆系统并正在进行操作的人员的权限,程序能否正确处理: 3)  重新注册系统变更登陆身份后再登录,看程序是否能正确执行,具有权限是否正确: 4)  在有工作组或角色管理的情况下,删除包含用户的工作组或角色,程序能否正确处理: 5)  不同权限用户登录同一个系统,权限范围是否正确: 6)  覆盖系统所有权限设定: 7)  能否添加信息为空的用户

TP thinkphp 权限管理功能

目前,在tp框架中做权限管理 分rbac(老)与auth(推荐)认证方式: 老的tp版本中封装的是rbac认证: 新一点的都开始使用auth方式管理了.推荐使用此方式: 实现步骤一:引入类库Auth.class.php 实现步骤二:创建数据表 a.菜单表 CREATE TABLE `wifi_admin_nav` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '菜单表', `pid` int(11) unsigned DEFAUL

solr入门之搭建具有安全控制和权限管理功能的SolrCloud集群

结合上次搭建项目和配置安全控制的经验,工程的搭建过程应该如下: 1.搭建zookeeper集群 2.配置solr的jetty启动配置 3.在solr启动配置中增加zk的acl配置信息 4.使用solr配置,启动solrcloud集群将 集群交给zookeeper管理 5.上传相关的配置文件,创建集合 6.上传安全配置文件 7.登录admin界面,查看集群状态及能否访问到zookeeper上的文件 8.添加数据到solrcloud中 9.配置客户端,使用solrj来操作solrcloud(摸索阶段