diff --git a/apps/assets/templates/assets/_asset_list_modal.html b/apps/assets/templates/assets/_asset_list_modal.html
index beafa9ae1..5352776fc 100644
--- a/apps/assets/templates/assets/_asset_list_modal.html
+++ b/apps/assets/templates/assets/_asset_list_modal.html
@@ -15,11 +15,11 @@
     text-align: center;
 }
 
-#assetTree2.ztree * {
-    background-color: #f8fafb;
+#asset_modal_tree.ztree * {
+    background-color: white;
 }
-#assetTree2.ztree {
-    background-color: #f8fafb;
+#asset_modal_tree.ztree {
+    background-color: white;
 }
 </style>
 
@@ -29,7 +29,8 @@
            <div class="ibox float-e-margins">
                <div class="ibox-content mailbox-content" style="padding-top: 0;padding-left: 1px">
                    <div class="file-manager ">
-                       <div id="assetTree2" class="ztree">
+                       <div id="asset_modal_tree" class="ztree">
+                           {% trans 'Loading' %} ...
                        </div>
                        <div class="clearfix"></div>
                    </div>
@@ -55,12 +56,78 @@
 </div>
 
 <script>
-var zTree2, asset_table2 = 0;
-function initTable2() {
-    if(asset_table2){
-        return
+function syncTableSelectedAssetToSelect2(table) {
+    var assets = table.selected;
+    console.log('........................', assets);
+    var options = [];
+    var select2Id = assetModalOption.select2Id;
+    $(select2Id + ' option').each(function (i, v) {
+        options.push(v.value)
+    });
+    table.selected_rows.forEach(function (i) {
+        var name = i.hostname + '(' + i.ip + ')';
+        var option = new Option(name, i.id, false, true);
+
+        if (options.indexOf(i.id) === -1) {
+            $(select2Id).append(option).trigger('change');
+        }
+    });
+    $(select2Id).val(assets).trigger('change');
+}
+
+
+
+// 解决input框中的资产和弹出表格中资产的显示不一致
+function syncSelectedAssetsToModalTable(assetModalTable) {
+    var select2Id = assetModalOption.select2Id;
+    var inputAssets = $(select2Id).val();
+    var selectedAssets = assetModalTable.selected.concat();
+
+    // input assets无,table assets选中,则取消勾选(再次click)
+    if (selectedAssets.length !== 0) {
+        $.each(selectedAssets, function (index, assetId) {
+            if ($.inArray(assetId, inputAssets) === -1) {
+                $('#' + assetId).trigger('click');  // 取消勾选
+            }
+        });
     }
 
+    // input assets有,table assets没选,则选中(click)
+    if (inputAssets !== null) {
+        assetModalTable.selected = inputAssets;
+        $.each(inputAssets, function (index, assetId) {
+            var dom = document.getElementById(assetId);
+            if (dom !== null) {
+                var selected = dom.parentElement.parentElement.className.indexOf('selected')
+            }
+            if (selected === -1) {
+                $('#' + assetId).trigger('click');
+            }
+        });
+    }
+}
+
+defaultOnAssetModalConfirm = syncTableSelectedAssetToSelect2;
+defaultOnModalTableDone = syncSelectedAssetsToModalTable;
+
+
+var assetModalOption = {
+    selectStyle: 'multi',
+    select2Id: '#id_assets',
+    onModalTableDone: defaultOnModalTableDone,
+    onModalTreeDone: null,
+    onModalConfirm: defaultOnAssetModalConfirm,
+};
+
+var assetModalTable, assetModalTree = null;
+
+function initAssetModalTable() {
+    if(assetModalTable){
+        return
+    }
+    if (assetModalOption.selectStyle === 'single') {
+        $('.ipt_check_all').addClass('hidden')
+    }
     var options = {
         ele: $('#asset_list_modal_table'),
         ajax_url: '{% url "api-assets:asset-list" %}?show_current_asset=1',
@@ -68,22 +135,26 @@ function initTable2() {
             {data: "id"}, {data: "hostname" }, {data: "ip" }
         ],
         lengthMenu: [[10, 25, 50], [10, 25, 50]],
-        pageLength: 10
+        pageLength: 10,
+        select_style: assetModalOption.selectStyle
     };
-    asset_table2 = jumpserver.initServerSideDataTable(options);
-    return asset_table2
+    assetModalTable = jumpserver.initServerSideDataTable(options);
+    if (assetModalOption.onModalTableDone) {
+        assetModalOption.onModalTableDone(assetModalTable);
+    }
+    return assetModalTable
 }
 
-function onNodeSelected2(event, treeNode) {
-    var url = asset_table2.ajax.url();
+function onModalTreeNodeSelected(event, treeNode) {
+    var url = assetModalTable.ajax.url();
     url = setUrlParam(url, "node_id", treeNode.meta.node.id);
     url = setUrlParam(url, "show_current_asset", "");
-    asset_table2.ajax.url(url);
-    asset_table2.ajax.reload();
+    assetModalTable.ajax.url(url);
+    assetModalTable.ajax.reload();
 }
 
 
-function initTree2() {
+function initModalTree() {
     var url = '{% url 'api-assets:node-children-tree' %}?assets=0';
     var setting = {
         view: {
@@ -102,17 +173,34 @@ function initTree2() {
             type: 'get'
 		},
         callback: {
-            onSelected: onNodeSelected2
+            onSelected: onModalTreeNodeSelected
         }
     };
-    zTree2 = $.fn.zTree.init($("#assetTree2"), setting);
+    $.get(url, function(data, status){
+        $.fn.zTree.init($("#asset_modal_tree"), setting);
+        assetModalTree = $.fn.zTree.getZTreeObj("assetTree2");
+        if (assetModalOption.onModalTreeDone) {
+            assetModalOption.onModalTreeDone(assetModalTree);
+        }
+        return assetModalTree;
+    });
+}
+
+function setAssetModalOptions(options) {
+    assetModalOption = options;
 }
 
 
 $(document).ready(function(){
+
 }).on('show.bs.modal', function () {
-    initTable2();
-    initTree2();
+    initAssetModalTable();
+    initModalTree();
+}).on('click', '#btn_asset_modal_confirm', function () {
+    if (assetModalOption.onModalConfirm) {
+        assetModalOption.onModalConfirm(assetModalTable, assetModalTree);
+    }
+    $("#asset_list_modal").modal('hide');
 })
 </script>
 {% endblock %}
diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html
index 58e0d86e5..fcd0f79ff 100644
--- a/apps/assets/templates/assets/asset_list.html
+++ b/apps/assets/templates/assets/asset_list.html
@@ -226,6 +226,33 @@ function onNodeSelected(event, treeNode) {
     asset_table.ajax.reload();
 }
 
+function onAssetModalConfirmAddAssetToNode(table) {
+    var assets_selected = table.selected;
+    if (!current_node_id) {
+        return
+    }
+
+    var data = {'assets': assets_selected};
+    var success = function () {
+        table.selected = [];
+        table.ajax.reload()
+    };
+
+    var url = '';
+    if (update_node_action === "move") {
+        url = "{% url 'api-assets:node-replace-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id);
+    } else {
+        url = "{% url 'api-assets:node-add-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id);
+    }
+
+    requestApi({
+        'url': url,
+        'method': 'PUT',
+        'body': JSON.stringify(data),
+        'success': success
+    })
+}
+
 $(document).ready(function(){
     initTable();
     initTree();
@@ -236,6 +263,12 @@ $(document).ready(function(){
     else{
         $('#show_current_asset').css('display', 'inline-block');
     }
+
+    var modalOption = {
+        onModalConfirm: onAssetModalConfirmAddAssetToNode,
+        onModalTableDone: null
+    };
+    setAssetModalOptions(modalOption);
 })
 .on('click', '.labels li', function () {
     var val = $(this).text();
@@ -429,7 +462,6 @@ $(document).ready(function(){
      }
 
     function doRemove() {
-       var nodes = zTree.getSelectedNodes();
        if (!current_node_id) {
            return
        }
@@ -472,32 +504,7 @@ $(document).ready(function(){
     }
     $(".ipt_check_all").prop("checked", false)
 })
-.on('click', '#btn_asset_modal_confirm', function () {
-    var assets_selected = asset_table2.selected;
-    if (!current_node_id) {
-        return
-    }
-
-    var data = {'assets': assets_selected};
-    var success = function () {
-        asset_table2.selected = [];
-        asset_table2.ajax.reload()
-    };
-
-    var url = '';
-    if (update_node_action === "move") {
-        url = "{% url 'api-assets:node-replace-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id);
-    } else {
-        url = "{% url 'api-assets:node-add-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id);
-    }
-
-    requestApi({
-        'url': url,
-        'method': 'PUT',
-        'body': JSON.stringify(data),
-        'success': success
-    })
-}).on('hidden.bs.modal', '#asset_list_modal', function () {
+.on('hidden.bs.modal', '#asset_list_modal', function () {
     window.location.reload();
 }).on('click', '#menu_asset_add', function () {
     update_node_action = "add"
diff --git a/apps/assets/templates/assets/domain_create_update.html b/apps/assets/templates/assets/domain_create_update.html
index 399b38011..96bfd02aa 100644
--- a/apps/assets/templates/assets/domain_create_update.html
+++ b/apps/assets/templates/assets/domain_create_update.html
@@ -28,25 +28,6 @@ $(document).ready(function () {
 }).on('click', '.select2-selection__rendered', function (e) {
     e.preventDefault();
     $("#asset_list_modal").modal();
-    initSelectedAssets2Table();
-})
-.on('click', '#btn_asset_modal_confirm', function () {
-    var assets = asset_table2.selected;
-    var options = [];
-    $('#id_assets option').each(function (i, v) {
-        options.push(v.value)
-    });
-    asset_table2.selected_rows.forEach(function (i) {
-        var name = i.hostname + '(' + i.ip + ')';
-        var option = new Option(name, i.id, false, true);
-
-        if (options.indexOf(i.id) === -1) {
-            $('#id_assets').append(option).trigger('change');
-        }
-    });
-    $('.select2').val(assets).trigger('change');
-    $("#asset_list_modal").modal('hide');
-
 })
 .on("submit", "form", function (evt) {
     evt.preventDefault();
diff --git a/apps/assets/templates/assets/label_create_update.html b/apps/assets/templates/assets/label_create_update.html
index a6b9582a5..41646003c 100644
--- a/apps/assets/templates/assets/label_create_update.html
+++ b/apps/assets/templates/assets/label_create_update.html
@@ -32,24 +32,6 @@ $(document).ready(function () {
 }).on('click', '.select2-selection__rendered', function (e) {
     e.preventDefault();
     $("#asset_list_modal").modal();
-    initSelectedAssets2Table();
-})
-.on('click', '#btn_asset_modal_confirm', function () {
-    var assets = asset_table2.selected;
-    var options = [];
-    $('#id_assets option').each(function (i, v) {
-        options.push(v.value)
-    });
-    asset_table2.selected_rows.forEach(function (i) {
-        var name = i.hostname + '(' + i.ip + ')';
-        var option = new Option(name, i.id, false, true);
-
-        if (options.indexOf(i.id) === -1) {
-            $('#id_assets').append(option).trigger('change');
-        }
-    });
-    $('#id_assets').val(assets).trigger('change');
-    $("#asset_list_modal").modal('hide');
 })
 .on("submit", "form", function (evt) {
     evt.preventDefault();
diff --git a/apps/common/signals_handlers.py b/apps/common/signals_handlers.py
index 91901676d..e7dd728c3 100644
--- a/apps/common/signals_handlers.py
+++ b/apps/common/signals_handlers.py
@@ -14,7 +14,7 @@ from .local import thread_local
 
 pattern = re.compile(r'FROM `(\w+)`')
 logger = get_logger(__name__)
-DEBUG_DB_QUERY = os.environ.get('DEBUG_DB_QUERY', '0') == '1'
+DEBUG_DB = os.environ.get('DEBUG_DB', '0') == '1'
 
 
 class Counter:
@@ -58,7 +58,7 @@ def on_request_finished_release_local(sender, **kwargs):
     thread_local.__release_local__()
 
 
-if settings.DEBUG and DEBUG_DB_QUERY:
+if settings.DEBUG and DEBUG_DB:
     request_finished.connect(on_request_finished_logging_db_query)
 
 
diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py
index 27df6314f..ed6e665b5 100644
--- a/apps/jumpserver/settings.py
+++ b/apps/jumpserver/settings.py
@@ -607,8 +607,10 @@ SWAGGER_SETTINGS = {
             'in': 'header'
         }
     },
+    'DEFAULT_API_URL': 'http://www.fit2cloud.com'
 }
 
+
 # Default email suffix
 EMAIL_SUFFIX = CONFIG.EMAIL_SUFFIX
 LOGIN_LOG_KEEP_DAYS = CONFIG.LOGIN_LOG_KEEP_DAYS
diff --git a/apps/ops/templates/ops/command_execution_list.html b/apps/ops/templates/ops/command_execution_list.html
index 3c9f1b54e..81e9635c6 100644
--- a/apps/ops/templates/ops/command_execution_list.html
+++ b/apps/ops/templates/ops/command_execution_list.html
@@ -110,10 +110,16 @@ $(document).ready(function() {
             data_list.pop();
         }
         var html = createPopover(data_list);
-        console.log(html);
         $(this).html(html);
     });
-    $('[data-toggle=popover]').popover({html : true});
+    $('[data-toggle="popover"]').popover({
+        html: true,
+        placement: 'bottom',
+        trigger: 'click',
+        container: 'body'
+    }).on('click', function (e) {
+        $('[data-toggle="popover"]').not(this).popover('hide');
+    });
 })
 </script>
 {% endblock %}
diff --git a/apps/perms/api/asset_permission.py b/apps/perms/api/asset_permission.py
index 810ae5ac9..3e7f4a078 100644
--- a/apps/perms/api/asset_permission.py
+++ b/apps/perms/api/asset_permission.py
@@ -97,6 +97,8 @@ class AssetPermissionViewSet(viewsets.ModelViewSet):
         inherit_nodes_keys = assets.all().values_list('nodes__key', flat=True)
 
         for key in inherit_nodes_keys:
+            if key is None:
+                continue
             ancestor_keys = Node.get_nodes_ancestor_keys_by_key(key, with_self=True)
             inherit_all_nodes.update(ancestor_keys)
         queryset = queryset.filter(
diff --git a/apps/perms/forms/asset_permission.py b/apps/perms/forms/asset_permission.py
index 1d80258d4..6fdaee30b 100644
--- a/apps/perms/forms/asset_permission.py
+++ b/apps/perms/forms/asset_permission.py
@@ -53,6 +53,16 @@ class AssetPermissionForm(OrgModelForm):
             assets_field.queryset = Asset.objects.none()
             nodes_field.queryset = Node.objects.none()
 
+    def set_nodes_initial(self, nodes):
+        field = self.fields['nodes']
+        field.choices = [(n.id, n.full_value) for n in nodes]
+        field.initial = nodes
+
+    def set_assets_initial(self, assets):
+        field = self.fields['assets']
+        field.choices = [(a.id, a.hostname) for a in assets]
+        field.initial = assets
+
     class Meta:
         model = AssetPermission
         exclude = (
diff --git a/apps/perms/signals_handler.py b/apps/perms/signals_handler.py
index e23bc1f8c..8066ce5ca 100644
--- a/apps/perms/signals_handler.py
+++ b/apps/perms/signals_handler.py
@@ -47,7 +47,7 @@ def on_permission_nodes_changed(sender, instance=None, action='', **kwargs):
     if isinstance(instance, AssetPermission):
         logger.debug("Asset permission nodes change signal received")
         nodes = kwargs['model'].objects.filter(pk__in=kwargs['pk_set'])
-        system_users = instance.system_users.all().values_list('id', flat=True)
+        system_users = instance.system_users.all()
         for system_user in system_users:
             system_user.nodes.add(*tuple(nodes))
 
@@ -59,7 +59,7 @@ def on_permission_assets_changed(sender, instance=None, action='', **kwargs):
     if isinstance(instance, AssetPermission):
         logger.debug("Asset permission assets change signal received")
         assets = kwargs['model'].objects.filter(pk__in=kwargs['pk_set'])
-        system_users = instance.system_users.all().values_list('id', flat=True)
+        system_users = instance.system_users.all()
         for system_user in system_users:
             system_user.assets.add(*tuple(assets))
 
diff --git a/apps/perms/templates/perms/asset_permission_asset.html b/apps/perms/templates/perms/asset_permission_asset.html
index ccb1b7f90..093ab39a8 100644
--- a/apps/perms/templates/perms/asset_permission_asset.html
+++ b/apps/perms/templates/perms/asset_permission_asset.html
@@ -100,10 +100,7 @@
                                         <form>
                                             <tr>
                                                 <td colspan="2" class="no-borders">
-                                                    <select data-placeholder="{% trans 'Select nodes' %}" class="select2" id="node_select2" style="width: 100%" multiple="" tabindex="4">
-                                                        {% for node in nodes_remain %}
-                                                        <option value="{{ node.id }}" id="opt_{{ node.id }}">{{ node.full_value }}</option>
-                                                        {% endfor %}
+                                                    <select data-placeholder="{% trans 'Select nodes' %}" class="nodes-select2" id="nodes_select2" style="width: 100%" multiple="" tabindex="4">
                                                     </select>
                                                 </td>
                                             </tr>
@@ -202,35 +199,22 @@ function initAssetTable() {
     return table
 }
 
+
 $(document).ready(function () {
     $('.select2').select2();
     table = initAssetTable();
+
+    var nodeListUrl = "{% url 'api-assets:node-list' %}";
+    nodesSelect2Init(".nodes-select2", nodeListUrl);
+
     $("#asset_select2").parent().find(".select2-selection").on('click', function (e) {
         if ($(e.target).attr('class') !== 'select2-selection__choice__remove'){
             e.preventDefault();
             e.stopPropagation();
             $("#asset_list_modal").modal();
-            initSelectedAssets2Table('#asset_select2');
         }
     })
 })
-.on('click', '#btn_asset_modal_confirm', function () {
-    var assets = asset_table2.selected;
-    var options = [];
-    $('#asset_select2 option').each(function (i, v) {
-        options.push(v.value)
-    });
-    asset_table2.selected_rows.forEach(function (i) {
-        var name = i.hostname + '(' + i.ip + ')';
-        var option = new Option(name, i.id, false, true);
-
-        if (options.indexOf(i.id) === -1) {
-            $('#asset_select2').append(option).trigger('change');
-        }
-    });
-    $('#asset_select2').val(assets).trigger('change');
-    $("#asset_list_modal").modal('hide');
-})
 .on('click', '.btn-add-assets', function () {
     var assets_selected = $("#asset_select2 option:selected").map(function () {
         return $(this).attr('value');
@@ -250,7 +234,7 @@ $(document).ready(function () {
 })
 .on('click', '#btn-add-node', function () {
     var nodes_selected = {};
-    $("#node_select2 option:selected").each(function (i, data) {
+    $("#nodes_select2 option:selected").each(function (i, data) {
         nodes_selected[$(data).attr('value')] = $(data).text();
     });
     if (Object.keys(nodes_selected).length === 0) {
diff --git a/apps/perms/templates/perms/asset_permission_create_update.html b/apps/perms/templates/perms/asset_permission_create_update.html
index 5b69f7b4c..be4424549 100644
--- a/apps/perms/templates/perms/asset_permission_create_update.html
+++ b/apps/perms/templates/perms/asset_permission_create_update.html
@@ -111,31 +111,57 @@ var dateOptions = {
     }
 };
 var api_action =  "{{ api_action }}";
+
+function onAssetModalConfirm(table) {
+    var assets = assetModalTable.selected;
+    var options = [];
+    $('#id_assets option').each(function (i, v) {
+        options.push(v.value)
+    });
+    assetModalTable.selected_rows.forEach(function (i) {
+        var name = i.hostname + '(' + i.ip + ')';
+        var option = new Option(name, i.id, false, true);
+
+        if (options.indexOf(i.id) === -1) {
+            $('#id_assets').append(option).trigger('change');
+        }
+    });
+    $('#id_assets').val(assets).trigger('change');
+}
+
 $(document).ready(function () {
     $('.select2').select2({
         closeOnSelect: false
     });
     var url = "{% url 'api-assets:node-list' %}";
     nodesSelect2Init(".nodes-select2", url);
+
     $('#date_start').daterangepicker(dateOptions);
     $('#date_expired').daterangepicker(dateOptions);
+
+    var modalOption = {
+        onModalConfirm: onAssetModalConfirm,
+        onAssetTableDone: function (modalTable) {
+            syncSelectedAssetsToModalTable(modalTable)
+        },
+    };
+    setAssetModalOptions(modalOption);
     $("#id_assets").parent().find(".select2-selection").on('click', function (e) {
         if ($(e.target).attr('class') !== 'select2-selection__choice__remove'){
             e.preventDefault();
             e.stopPropagation();
             $("#asset_list_modal").modal();
-            initSelectedAssets2Table();
         }
     })
 })
 .on('click', '#btn_asset_modal_confirm', function () {
-    var assets = asset_table2.selected;
+    var assets = assetModalTable.selected;
 
     var options = [];
     $('#id_assets option').each(function (i, v) {
         options.push(v.value)
     });
-    asset_table2.selected_rows.forEach(function (i) {
+    assetModalTable.selected_rows.forEach(function (i) {
         var name = i.hostname + '(' + i.ip + ')';
         var option = new Option(name, i.id, false, true);
 
diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html
index 95a92f16b..2a493e16b 100644
--- a/apps/perms/templates/perms/asset_permission_list.html
+++ b/apps/perms/templates/perms/asset_permission_list.html
@@ -227,7 +227,6 @@ function toggle() {
 $(document).ready(function(){
     initTable();
     initTree();
-
 })
 .on('click', '.btn-del', function () {
     var $this = $(this);
@@ -247,17 +246,19 @@ $(document).ready(function(){
 })
 .on('click', '.btn-create-permission', function () {
     var url = "{% url 'perms:asset-permission-create' %}";
-    var nodes = zTree.getSelectedNodes();
-    var _nodes = [];
-    var _assets = [];
-    $.each(nodes, function (id, node) {
-        if (node.meta.type === 'node') {
-            _nodes.push(node.meta.node.id)
-        } else {
-            _assets.push(node.meta.asset.id)
-        }
-    });
-    url += "?assets=" + _assets.join(",") + "&nodes=" + _nodes.join(",");
+    if (zTree) {
+        var nodes = zTree.getSelectedNodes();
+        var _nodes = [];
+        var _assets = [];
+        $.each(nodes, function (id, node) {
+            if (node.meta.type === 'node') {
+                _nodes.push(node.meta.node.id)
+            } else {
+                _assets.push(node.meta.asset.id)
+            }
+        });
+        url += "?assets=" + _assets.join(",") + "&nodes=" + _nodes.join(",");
+    }
     window.open(url, '_self');
 }).on('click', '.toggle', function (e) {
     e.preventDefault();
@@ -283,7 +284,6 @@ $(document).ready(function(){
             detailRows.push(tr.attr('id'));
         }
     }
-
 }).on('click', '#permission_list_table_filter input', function (e) {
     e.preventDefault();
     e.stopPropagation();
diff --git a/apps/perms/views/asset_permission.py b/apps/perms/views/asset_permission.py
index e7d2f155b..94c7c8c62 100644
--- a/apps/perms/views/asset_permission.py
+++ b/apps/perms/views/asset_permission.py
@@ -53,11 +53,11 @@ class AssetPermissionCreateView(PermissionsMixin, CreateView):
             nodes_id = nodes_id.split(",")
             nodes = Node.objects.filter(id__in=nodes_id)\
                 .exclude(id=Node.org_root().id)
-            form['nodes'].initial = nodes
+            form.set_nodes_initial(nodes)
         if assets_id:
             assets_id = assets_id.split(",")
             assets = Asset.objects.filter(id__in=assets_id)
-            form['assets'].initial = assets
+            form.set_assets_initial(assets)
         return form
 
     def get_context_data(self, **kwargs):
diff --git a/apps/settings/templates/settings/_ldap_list_users_modal.html b/apps/settings/templates/settings/_ldap_list_users_modal.html
index c0d062714..dd839eb5b 100644
--- a/apps/settings/templates/settings/_ldap_list_users_modal.html
+++ b/apps/settings/templates/settings/_ldap_list_users_modal.html
@@ -17,13 +17,6 @@
     padding: 10px 10px;
     text-align: center;
 }
-
-#assetTree2.ztree * {
-    background-color: #f8fafb;
-}
-#assetTree2.ztree {
-    background-color: #f8fafb;
-}
 </style>
 
 <div class="wrapper wrapper-content">
diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js
index 0d88c69bd..3252bb39f 100644
--- a/apps/static/js/jumpserver.js
+++ b/apps/static/js/jumpserver.js
@@ -1,7 +1,8 @@
 //jumpserver 自定义js 2015-01-29
 
 //此函数用于checkbox的全选和反选
-var checked=false;
+var checked = false;
+
 function check_all(form) {
     var checkboxes = document.getElementById(form);
     if (checked === false) {
@@ -16,26 +17,23 @@ function check_all(form) {
     }
 }
 
-function checkAll(id, name){
+function checkAll(id, name) {
     var checklist = document.getElementsByName(name);
-    if(document.getElementById(id).checked)
-        {
-        for(var i=0;i<checklist.length;i++)
-        {
-          checklist[i].checked = 1;
+    if (document.getElementById(id).checked) {
+        for (var i = 0; i < checklist.length; i++) {
+            checklist[i].checked = 1;
         }
-    }else{
-        for(var j=0;j<checklist.length;j++)
-        {
-         checklist[j].checked = 0;
+    } else {
+        for (var j = 0; j < checklist.length; j++) {
+            checklist[j].checked = 0;
         }
     }
 }
 
 //提取指定行的数据,JSON格式
-function GetRowData(row){
+function GetRowData(row) {
     var rowData = {};
-    for(var j=0;j<row.cells.length; j++) {
+    for (var j = 0; j < row.cells.length; j++) {
         name = row.parentNode.rows[0].cells[j].getAttribute("Name");
         if (name) {
             var value = row.cells[j].getAttribute("Value");
@@ -56,16 +54,16 @@ function GetTableDataBox() {
     var checkboxes = document.getElementById("contents_form");
     var id_list = [];
     len = checkboxes.elements.length;
-    for (var i=0; i < len; i++) {
+    for (var i = 0; i < len; i++) {
         if (checkboxes.elements[i].type == "checkbox" && checkboxes.elements[i].checked === true && checkboxes.elements[i].value != "checkall") {
             id_list.push(i);
-         }
         }
+    }
     for (i in id_list) {
         tableData.push(GetRowData(tabProduct.rows[id_list[i]]));
     }
 
-    if (id_list.length === 0){
+    if (id_list.length === 0) {
         alert('请至少选择一行!');
     }
     returnData.push(tableData);
@@ -77,8 +75,8 @@ function move(from, to, from_o, to_o) {
     $("#" + from + " option").each(function () {
         if ($(this).prop("selected") === true) {
             $("#" + to).append(this);
-            if( typeof from_o !== 'undefined'){
-                $("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']"));
+            if (typeof from_o !== 'undefined') {
+                $("#" + to_o).append($("#" + from_o + " option[value='" + this.value + "']"));
             }
         }
     });
@@ -88,18 +86,18 @@ function move_left(from, to, from_o, to_o) {
     $("#" + from + " option").each(function () {
         if ($(this).prop("selected") === true) {
             $("#" + to).append(this);
-            if( typeof from_o !== 'undefined'){
-                $("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']"));
+            if (typeof from_o !== 'undefined') {
+                $("#" + to_o).append($("#" + from_o + " option[value='" + this.value + "']"));
             }
         }
-        $(this).attr("selected",'true');
+        $(this).attr("selected", 'true');
     });
 }
 
 
-function selectAll(){
+function selectAll() {
     // Select all check box
-    $('option').each(function(){
+    $('option').each(function () {
         $(this).attr('selected', true);
     });
 }
@@ -131,7 +129,7 @@ function setAjaxCSRFToken() {
     var sessionid = getCookie('sessionid');
 
     $.ajaxSetup({
-        beforeSend: function(xhr, settings) {
+        beforeSend: function (xhr, settings) {
             if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                 xhr.setRequestHeader("X-CSRFToken", csrftoken);
             }
@@ -143,19 +141,16 @@ function activeNav() {
     var url_array = document.location.pathname.split("/");
     var app = url_array[1];
     var resource = url_array[2];
-    if (app === ''){
+    if (app === '') {
         $('#index').addClass('active');
-    }
-    else if (app === 'xpack' && resource === 'cloud') {
+    } else if (app === 'xpack' && resource === 'cloud') {
         var item = url_array[3];
         $("#" + app).addClass('active');
         $('#' + app + ' #' + resource).addClass('active');
         $('#' + app + ' #' + resource + ' #' + item + ' a').css('color', '#ffffff');
-    }
-    else if (app === 'settings'){
+    } else if (app === 'settings') {
         $("#" + app).addClass('active');
-    }
-    else {
+    } else {
         $("#" + app).addClass('active');
         $('#' + app + ' #' + resource).addClass('active');
     }
@@ -186,14 +181,14 @@ function formSubmit(props) {
     }).done(function (data, textState, jqXHR) {
         if (redirect_to) {
             if (props.message) {
-                var messages="ed65330a45559c87345a0eb6ac7812d18d0d8976$[[\"__json_message\"\0540\05425\054\"asdfasdf \\u521b\\u5efa\\u6210\\u529f\"]]"
+                var messages = "ed65330a45559c87345a0eb6ac7812d18d0d8976$[[\"__json_message\"\0540\05425\054\"asdfasdf \\u521b\\u5efa\\u6210\\u529f\"]]"
                 setCookie("messages", messages)
             }
             location.href = redirect_to;
         } else if (typeof props.success === 'function') {
             return props.success(data, textState, jqXHR);
         }
-    }).fail(function(jqXHR, textStatus, errorThrown) {
+    }).fail(function (jqXHR, textStatus, errorThrown) {
         if (typeof props.error === 'function') {
             return props.error(jqXHR, textStatus, errorThrown)
         }
@@ -233,7 +228,7 @@ function formSubmit(props) {
                 }
                 if (fieldRef.length === 1 && formGroupRef.length === 1) {
                     formGroupRef.addClass('has-error');
-                    var help_msg = v.join("<br/>") ;
+                    var help_msg = v.join("<br/>");
                     helpBlockRef.html(help_msg);
                 } else {
                     $.each(v, function (kk, vv) {
@@ -241,7 +236,7 @@ function formSubmit(props) {
                             $.each(vv, function (kkk, vvv) {
                                 noneFieldErrorMsg += " " + vvv + '<br/>';
                             })
-                        } else{
+                        } else {
                             noneFieldErrorMsg += vv + '<br/>';
                         }
                     })
@@ -264,7 +259,7 @@ function requestApi(props) {
     var user_fail_message = props.fail_message;
     var default_failed_message = gettext('An unknown error occurred while updating..');
     var flash_message = props.flash_message || true;
-    if (props.flash_message === false){
+    if (props.flash_message === false) {
         flash_message = false;
     }
 
@@ -274,7 +269,7 @@ function requestApi(props) {
         data: props.body,
         contentType: props.content_type || "application/json; charset=utf-8",
         dataType: props.data_type || "json"
-    }).done(function(data, textStatue, jqXHR) {
+    }).done(function (data, textStatue, jqXHR) {
         if (flash_message) {
             var msg = "";
             if (user_success_message) {
@@ -287,7 +282,7 @@ function requestApi(props) {
         if (typeof props.success === 'function') {
             return props.success(data);
         }
-    }).fail(function(jqXHR, textStatus, errorThrown) {
+    }).fail(function (jqXHR, textStatus, errorThrown) {
         if (flash_message) {
             var msg = "";
             if (user_fail_message) {
@@ -308,24 +303,24 @@ function requestApi(props) {
             return props.error(jqXHR.responseText, jqXHR.status);
         }
     });
-  // return true;
+    // return true;
 }
 
 // Sweet Alert for Delete
 function objectDelete(obj, name, url, redirectTo) {
     function doDelete() {
         var body = {};
-        var success = function() {
+        var success = function () {
             // swal('Deleted!', "[ "+name+"]"+" has been deleted ", "success");
             if (!redirectTo) {
                 $(obj).parent().parent().remove();
             } else {
-                window.location.href=redirectTo;
+                window.location.href = redirectTo;
             }
         };
-        var fail = function() {
+        var fail = function () {
             // swal("错误", "删除"+"[ "+name+" ]"+"遇到错误", "error");
-            swal(gettext('Error'), "[ "+name+" ]" + gettext("Being used by the asset, please unbind the asset first."), "error");
+            swal(gettext('Error'), "[ " + name + " ]" + gettext("Being used by the asset, please unbind the asset first."), "error");
         };
         requestApi({
             url: url,
@@ -336,6 +331,7 @@ function objectDelete(obj, name, url, redirectTo) {
             error: fail
         });
     }
+
     swal({
         title: gettext('Are you sure about deleting it?'),
         text: " [" + name + "] ",
@@ -350,22 +346,21 @@ function objectDelete(obj, name, url, redirectTo) {
     });
 }
 
-function orgDelete(obj, name, url, redirectTo){
+function orgDelete(obj, name, url, redirectTo) {
     function doDelete() {
         var body = {};
-        var success = function() {
+        var success = function () {
             if (!redirectTo) {
                 $(obj).parent().parent().remove();
             } else {
-                window.location.href=redirectTo;
+                window.location.href = redirectTo;
             }
         };
-        var fail = function(responseText, status) {
-            if (status === 400){
-                swal(gettext("Error"),  "[ " + name + " ] " + gettext("The organization contains undeleted information. Please try again after deleting"), "error");
-            }
-            else if (status === 405){
-                swal(gettext("Error"), " [ "+ name + " ] " + gettext("Do not perform this operation under this organization. Try again after switching to another organization"), "error");
+        var fail = function (responseText, status) {
+            if (status === 400) {
+                swal(gettext("Error"), "[ " + name + " ] " + gettext("The organization contains undeleted information. Please try again after deleting"), "error");
+            } else if (status === 405) {
+                swal(gettext("Error"), " [ " + name + " ] " + gettext("Do not perform this operation under this organization. Try again after switching to another organization"), "error");
             }
         };
         requestApi({
@@ -377,6 +372,7 @@ function orgDelete(obj, name, url, redirectTo){
             error: fail
         });
     }
+
     swal({
         title: gettext("Please ensure that the following information in the organization has been deleted"),
         text: gettext("User list、User group、Asset list、Domain list、Admin user、System user、Labels、Asset permission"),
@@ -391,11 +387,10 @@ function orgDelete(obj, name, url, redirectTo){
     });
 }
 
-$.fn.serializeObject = function()
-{
+$.fn.serializeObject = function () {
     var o = {};
     var a = this.serializeArray();
-    $.each(a, function() {
+    $.each(a, function () {
         if (o[this.name] !== undefined) {
             if (!o[this.name].push) {
                 o[this.name] = [o[this.name]];
@@ -413,7 +408,6 @@ function makeLabel(data) {
 }
 
 
-
 var jumpserver = {};
 jumpserver.checked = false;
 jumpserver.selected = {};
@@ -422,7 +416,7 @@ jumpserver.language = {
     search: gettext('Search'),
     select: {
         rows: {
-            _:  gettext("Selected item %d"),
+            _: gettext("Selected item %d"),
             0: ""
         }
     },
@@ -440,36 +434,40 @@ jumpserver.language = {
     }
 };
 jumpserver.initDataTable = function (options) {
-  // options = {
-  //    ele *: $('#dataTable_id'),
-  //    ajax_url *: '{% url 'users:user-list-api' %}',
-  //    columns *: [{data: ''}, ....],
-  //    dom: 'fltip',
-  //    i18n_url: '{% static "js/...../en-us.json" %}',
-  //    order: [[1, 'asc'], [2, 'asc'], ...],
-  //    buttons: ['excel', 'pdf', 'print'],
-  //    columnDefs: [{target: 0, createdCell: ()=>{}}, ...],
-  //    uc_html: '<a>header button</a>',
-  //    op_html: 'div.btn-group?',
-  //    paging: true
-  // }
-  var ele = options.ele || $('.dataTable');
-  var columnDefs = [
-      {
-          targets: 0,
-          orderable: false,
-          createdCell: function (td, cellData) {
-              $(td).html('<input type="checkbox" class="text-center ipt_check" id=99991937>'.replace('99991937', cellData));
-          }
-      },
-      {className: 'text-center', render: $.fn.dataTable.render.text(), targets: '_all'}
-  ];
-  columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs;
-  var select = {
-      style: 'multi',
-      selector: 'td:first-child'
-  };
-  var table = ele.DataTable({
+    // options = {
+    //    ele *: $('#dataTable_id'),
+    //    ajax_url *: '{% url 'users:user-list-api' %}',
+    //    columns *: [{data: ''}, ....],
+    //    dom: 'fltip',
+    //    i18n_url: '{% static "js/...../en-us.json" %}',
+    //    order: [[1, 'asc'], [2, 'asc'], ...],
+    //    buttons: ['excel', 'pdf', 'print'],
+    //    columnDefs: [{target: 0, createdCell: ()=>{}}, ...],
+    //    uc_html: '<a>header button</a>',
+    //    op_html: 'div.btn-group?',
+    //    paging: true
+    // }
+    var ele = options.ele || $('.dataTable');
+    var columnDefs = [
+        {
+            targets: 0,
+            orderable: false,
+            createdCell: function (td, cellData) {
+                $(td).html('<input type="checkbox" class="text-center ipt_check" id=99991937>'.replace('99991937', cellData));
+            }
+        },
+        {
+            className: 'text-center',
+            render: $.fn.dataTable.render.text(),
+            targets: '_all'
+        }
+    ];
+    columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs;
+    var select = {
+        style: 'multi',
+        selector: 'td:first-child'
+    };
+    var table = ele.DataTable({
         pageLength: options.pageLength || 15,
         dom: options.dom || '<"#uc.pull-left"><"pull-right"<"inline"l><"#fb.inline"><"inline"f><"#fa.inline">>tr<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>',
         order: options.order || [],
@@ -486,15 +484,15 @@ jumpserver.initDataTable = function (options) {
         language: jumpserver.language,
         lengthMenu: [[10, 15, 25, 50, -1], [10, 15, 25, 50, "All"]]
     });
-    table.on('select', function(e, dt, type, indexes) {
-        var $node = table[ type ]( indexes ).nodes().to$();
+    table.on('select', function (e, dt, type, indexes) {
+        var $node = table[type](indexes).nodes().to$();
         $node.find('input.ipt_check').prop('checked', true);
         jumpserver.selected[$node.find('input.ipt_check').prop('id')] = true
-    }).on('deselect', function(e, dt, type, indexes) {
-        var $node = table[ type ]( indexes ).nodes().to$();
+    }).on('deselect', function (e, dt, type, indexes) {
+        var $node = table[type](indexes).nodes().to$();
         $node.find('input.ipt_check').prop('checked', false);
         jumpserver.selected[$node.find('input.ipt_check').prop('id')] = false
-    }).on('draw', function(){
+    }).on('draw', function () {
         $('#op').html(options.op_html || '');
         $('#uc').html(options.uc_html || '');
         $('[data-toggle="popover"]').popover({
@@ -506,16 +504,16 @@ jumpserver.initDataTable = function (options) {
             $('[data-toggle="popover"]').not(this).popover('hide');
         });
     });
-    $('.ipt_check_all').on('click', function() {
-      if ($(this).prop("checked")) {
-          $(this).closest('table').find('.ipt_check').prop('checked', true);
-          jumpserver.checked = true;
-          table.rows({search:'applied', page:'current'}).select();
-      } else {
-          $(this).closest('table').find('.ipt_check').prop('checked', false);
-          jumpserver.checked = false;
-          table.rows({search:'applied', page:'current'}).deselect();
-      }
+    $('.ipt_check_all').on('click', function () {
+        if ($(this).prop("checked")) {
+            $(this).closest('table').find('.ipt_check').prop('checked', true);
+            jumpserver.checked = true;
+            table.rows({search: 'applied', page: 'current'}).select();
+        } else {
+            $(this).closest('table').find('.ipt_check').prop('checked', false);
+            jumpserver.checked = false;
+            table.rows({search: 'applied', page: 'current'}).deselect();
+        }
     });
 
     return table;
@@ -532,40 +530,42 @@ jumpserver.initStaticTable = function (selector) {
 };
 
 jumpserver.initServerSideDataTable = function (options) {
-  // options = {
-  //    ele *: $('#dataTable_id'),
-  //    ajax_url *: '{% url 'users:user-list-api' %}',
-  //    columns *: [{data: ''}, ....],
-  //    dom: 'fltip',
-  //    i18n_url: '{% static "js/...../en-us.json" %}',
-  //    order: [[1, 'asc'], [2, 'asc'], ...],
-  //    buttons: ['excel', 'pdf', 'print'],
-  //    columnDefs: [{target: 0, createdCell: ()=>{}}, ...],
-  //    uc_html: '<a>header button</a>',
-  //    op_html: 'div.btn-group?',
-  //    paging: true
-  // }
-  var ele = options.ele || $('.dataTable');
-  var columnDefs = [
-      {
-          targets: 0,
-          orderable: false,
-          createdCell: function (td, cellData) {
-              $(td).html('<input type="checkbox" class="text-center ipt_check" id=99991937>'.replace('99991937', cellData));
-          }
-      },
-      {
-          targets: '_all',
-          className: 'text-center',
-          render: $.fn.dataTable.render.text()
-      }
-  ];
-  columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs;
-  var select = {
-            style: 'multi',
-            selector: 'td:first-child'
-      };
-  var table = ele.DataTable({
+    // options = {
+    //    ele *: $('#dataTable_id'),
+    //    ajax_url *: '{% url 'users:user-list-api' %}',
+    //    select_style: 'multi',
+    //    columns *: [{data: ''}, ....],
+    //    dom: 'fltip',
+    //    i18n_url: '{% static "js/...../en-us.json" %}',
+    //    order: [[1, 'asc'], [2, 'asc'], ...],
+    //    buttons: ['excel', 'pdf', 'print'],
+    //    columnDefs: [{target: 0, createdCell: ()=>{}}, ...],
+    //    uc_html: '<a>header button</a>',
+    //    op_html: 'div.btn-group?',
+    //    paging: true
+    // }
+    var ele = options.ele || $('.dataTable');
+    var columnDefs = [
+        {
+            targets: 0,
+            orderable: false,
+            createdCell: function (td, cellData) {
+                $(td).html('<input type="checkbox" class="text-center ipt_check" id=99991937>'.replace('99991937', cellData));
+            }
+        },
+        {
+            targets: '_all',
+            className: 'text-center',
+            render: $.fn.dataTable.render.text()
+        }
+    ];
+    var select_style = options.select_style || 'multi';
+    columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs;
+    var select = {
+        style: select_style,
+        selector: 'td:first-child'
+    };
+    var table = ele.DataTable({
         pageLength: options.pageLength || 15,
         // dom: options.dom || '<"#uc.pull-left">fltr<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>',
         dom: options.dom || '<"#uc.pull-left"><"pull-right"<"inline"l><"#fb.inline"><"inline"f><"#fa.inline">>tr<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>',
@@ -576,8 +576,8 @@ jumpserver.initServerSideDataTable = function (options) {
         processing: true,
         searchDelay: 800,
         ajax: {
-            url: options.ajax_url ,
-            error: function(jqXHR, textStatus, errorThrown) {
+            url: options.ajax_url,
+            error: function (jqXHR, textStatus, errorThrown) {
                 var msg = gettext("Unknown error occur");
                 if (jqXHR.responseJSON) {
                     if (jqXHR.responseJSON.error) {
@@ -590,7 +590,7 @@ jumpserver.initServerSideDataTable = function (options) {
             },
             data: function (data) {
                 delete data.columns;
-                if (data.length !== null){
+                if (data.length !== null) {
                     data.limit = data.length;
                     delete data.length;
                 }
@@ -605,15 +605,15 @@ jumpserver.initServerSideDataTable = function (options) {
                     var search_raw = [];
 
                     search_list.map(function (val, index) {
-                       var kv = val.split(":");
-                       if (kv.length === 2) {
-                           var value = kv[1];
-                           var key = kv[0].trim();
-                           value = value.replace("+", " ").trim();
-                           search_attr[key] = value
-                       } else {
-                           search_raw.push(kv)
-                       }
+                        var kv = val.split(":");
+                        if (kv.length === 2) {
+                            var value = kv[1];
+                            var key = kv[0].trim();
+                            value = value.replace("+", " ").trim();
+                            search_attr[key] = value
+                        } else {
+                            search_raw.push(kv)
+                        }
                     });
                     data.search = search_raw.join("");
                     $.each(search_attr, function (k, v) {
@@ -629,8 +629,8 @@ jumpserver.initServerSideDataTable = function (options) {
                     data.order = order;
                 }
             },
-            dataFilter: function(data){
-                var json = jQuery.parseJSON( data );
+            dataFilter: function (data) {
+                var json = jQuery.parseJSON(data);
                 json.recordsTotal = json.count;
                 json.recordsFiltered = json.count;
                 return JSON.stringify(json); // return JSON string
@@ -644,35 +644,36 @@ jumpserver.initServerSideDataTable = function (options) {
     });
     table.selected = [];
     table.selected_rows = [];
-    table.on('select', function(e, dt, type, indexes) {
-        var $node = table[ type ]( indexes ).nodes().to$();
+    table.on('select', function (e, dt, type, indexes) {
+        var $node = table[type](indexes).nodes().to$();
         $node.find('input.ipt_check').prop('checked', true);
         jumpserver.selected[$node.find('input.ipt_check').prop('id')] = true;
         if (type === 'row') {
             var rows = table.rows(indexes).data();
             $.each(rows, function (id, row) {
-                table.selected_rows.push(row);
-                if (row.id && $.inArray(row.id, table.selected) === -1){
-                    table.selected.push(row.id)
+                if (row.id && $.inArray(row.id, table.selected) === -1) {
+                    table.selected.push(row.id);
+                    table.selected_rows.push(row);
                 }
             })
         }
-    }).on('deselect', function(e, dt, type, indexes) {
-        var $node = table[ type ]( indexes ).nodes().to$();
+    }).on('deselect', function (e, dt, type, indexes) {
+        var $node = table[type](indexes).nodes().to$();
         $node.find('input.ipt_check').prop('checked', false);
         jumpserver.selected[$node.find('input.ipt_check').prop('id')] = false;
         if (type === 'row') {
             var rows = table.rows(indexes).data();
             $.each(rows, function (id, row) {
-                if (row.id){
+                if (row.id) {
                     var index = table.selected.indexOf(row.id);
-                    if (index > -1){
-                        table.selected.splice(index, 1)
+                    if (index > -1) {
+                        table.selected.splice(index, 1);
+                        table.selected_rows.splice(index, 1);
                     }
                 }
             })
         }
-    }).on('draw', function(){
+    }).on('draw', function () {
         $('[data-toggle="popover"]').popover({
             html: true,
             placement: 'bottom',
@@ -690,7 +691,7 @@ jumpserver.initServerSideDataTable = function (options) {
 
         $.each(table.selected, function (id, data) {
             var index = table_data.indexOf(data);
-            if (index > -1){
+            if (index > -1) {
                 table.rows(index).select()
             }
         });
@@ -701,13 +702,16 @@ jumpserver.initServerSideDataTable = function (options) {
         $('#fa').html(options.fa_html || '');
     });
     var table_id = table.settings()[0].sTableId;
-    $('#' + table_id + ' .ipt_check_all').on('click', function() {
+    $('#' + table_id + ' .ipt_check_all').on('click', function () {
+        if (select_style !== 'multi') {
+            return
+        }
         if ($(this).prop("checked")) {
             $(this).closest('table').find('.ipt_check').prop('checked', true);
-            table.rows({search:'applied', page:'current'}).select();
+            table.rows({search: 'applied', page: 'current'}).select();
         } else {
             $(this).closest('table').find('.ipt_check').prop('checked', false);
-            table.rows({search:'applied', page:'current'}).deselect();
+            table.rows({search: 'applied', page: 'current'}).deselect();
         }
     });
 
@@ -728,7 +732,7 @@ String.prototype.replaceAll = function (exp, newStr) {
  * 原型:字符串格式化
  * @param args 格式化参数值
  */
-String.prototype.format = function(args) {
+String.prototype.format = function (args) {
     var result = this;
     if (arguments.length < 1) {
         return result;
@@ -738,7 +742,7 @@ String.prototype.format = function(args) {
     if (arguments.length == 1 && typeof (args) == "object") {
         data = args;
     }
-    for ( var key in data) {
+    for (var key in data) {
         var value = data[key];
         if (undefined != value) {
             result = result.replaceAll("\\{" + key + "\\}", value);
@@ -750,7 +754,7 @@ String.prototype.format = function(args) {
 function setCookie(key, value, time) {
     var expires = new Date();
     if (!time) {
-        time =  expires.getTime() + (24 * 60 * 60 * 1000);
+        time = expires.getTime() + (24 * 60 * 60 * 1000);
     }
     expires.setTime(time);
     document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/';
@@ -767,7 +771,7 @@ function delCookie(key) {
 }
 
 function createPopover(dataset, title, callback) {
-    if (callback !== undefined){
+    if (callback !== undefined) {
         var new_dataset = [];
         $.each(dataset, function (index, value) {
             new_dataset.push(callback(value))
@@ -780,12 +784,13 @@ function createPopover(dataset, title, callback) {
 }
 
 
- $(function () {
+$(function () {
     (function ($) {
         $.getUrlParam = function (name) {
             var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
             var r = window.location.search.substr(1).match(reg);
-            if (r != null) return unescape(r[2]); return null;
+            if (r != null) return unescape(r[2]);
+            return null;
         }
     })(jQuery);
 });
@@ -793,12 +798,13 @@ function createPopover(dataset, title, callback) {
 function getUrlParam(name) {
     var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
     var r = window.location.search.substr(1).match(reg);
-    if (r != null) return unescape(r[2]); return null;
+    if (r != null) return unescape(r[2]);
+    return null;
 }
 
 function setUrlParam(url, name, value) {
     var urlArray = url.split("?");
-    if (urlArray.length===1){
+    if (urlArray.length === 1) {
         url += "?" + name + "=" + value;
     } else {
         var oriParam = urlArray[1].split("&");
@@ -835,12 +841,11 @@ var rules_id_map_label = {
     'id_security_password_special_char': gettext('Must contain special characters')
 };
 
-function getRuleLabel(rule){
+function getRuleLabel(rule) {
     var label = '';
-    if (rule.key === rules_short_map_id['min']){
+    if (rule.key === rules_short_map_id['min']) {
         label = rules_id_map_label[rule.key].replace('{N}', rule.value)
-    }
-    else{
+    } else {
         label = rules_id_map_label[rule.key]
     }
     return label
@@ -849,38 +854,33 @@ function getRuleLabel(rule){
 // 校验密码-改变规则颜色
 function checkPasswordRules(password, minLength) {
     if (wordMinLength(password, minLength)) {
-        $('#'+rules_short_map_id['min']).css('color', 'green')
-    }
-    else {
-        $('#'+rules_short_map_id['min']).css('color', '#908a8a')
+        $('#' + rules_short_map_id['min']).css('color', 'green')
+    } else {
+        $('#' + rules_short_map_id['min']).css('color', '#908a8a')
     }
 
     if (wordUpperCase(password)) {
-        $('#'+rules_short_map_id['upper']).css('color', 'green')
-    }
-    else {
-        $('#'+rules_short_map_id['upper']).css('color', '#908a8a')
+        $('#' + rules_short_map_id['upper']).css('color', 'green')
+    } else {
+        $('#' + rules_short_map_id['upper']).css('color', '#908a8a')
     }
 
     if (wordLowerCase(password)) {
-        $('#'+rules_short_map_id['lower']).css('color', 'green')
-    }
-    else {
-        $('#'+rules_short_map_id['lower']).css('color', '#908a8a')
+        $('#' + rules_short_map_id['lower']).css('color', 'green')
+    } else {
+        $('#' + rules_short_map_id['lower']).css('color', '#908a8a')
     }
 
     if (wordNumber(password)) {
-        $('#'+rules_short_map_id['number']).css('color', 'green')
-    }
-    else {
-        $('#'+rules_short_map_id['number']).css('color', '#908a8a')
+        $('#' + rules_short_map_id['number']).css('color', 'green')
+    } else {
+        $('#' + rules_short_map_id['number']).css('color', '#908a8a')
     }
 
     if (wordSpecialChar(password)) {
-        $('#'+rules_short_map_id['special']).css('color', 'green')
-    }
-    else {
-        $('#'+rules_short_map_id['special']).css('color', '#908a8a')
+        $('#' + rules_short_map_id['special']).css('color', 'green')
+    } else {
+        $('#' + rules_short_map_id['special']).css('color', '#908a8a')
     }
 }
 
@@ -890,18 +890,22 @@ function wordMinLength(word, minLength) {
     var re = new RegExp("^(.{" + minLength + ",})$");
     return word.match(re)
 }
+
 // 大写字母
 function wordUpperCase(word) {
     return word.match(/([A-Z]+)/)
 }
+
 // 小写字母
 function wordLowerCase(word) {
     return word.match(/([a-z]+)/)
 }
+
 // 数字字符
 function wordNumber(word) {
     return word.match(/([\d]+)/)
 }
+
 // 特殊字符
 function wordSpecialChar(word) {
     return word.match(/[`,~,!,@,#,\$,%,\^,&,\*,\(,\),\-,_,=,\+,\{,\},\[,\],\|,\\,;,',:,",\,,\.,<,>,\/,\?]+/)
@@ -919,7 +923,7 @@ function popoverPasswordRules(password_check_rules, $el) {
 }
 
 // 初始化弹窗popover
-function initPopover($container, $progress, $idPassword, $el, password_check_rules, i18n_fallback){
+function initPopover($container, $progress, $idPassword, $el, password_check_rules, i18n_fallback) {
     options = {};
     // User Interface
     options.ui = {
@@ -943,37 +947,6 @@ function initPopover($container, $progress, $idPassword, $el, password_check_rul
     popoverPasswordRules(password_check_rules, $el);
 }
 
-// 解决input框中的资产和弹出表格中资产的显示不一致
-function initSelectedAssets2Table(id){
-    if (!id) {
-        id = "#id_assets"
-    }
-    var inputAssets = $(id).val();
-    var selectedAssets = asset_table2.selected.concat();
-
-    // input assets无,table assets选中,则取消勾选(再次click)
-    if (selectedAssets.length !== 0){
-        $.each(selectedAssets, function (index, assetId){
-            if ($.inArray(assetId, inputAssets) === -1){
-                $('#'+assetId).trigger('click');  // 取消勾选
-            }
-        });
-    }
-
-    // input assets有,table assets没选,则选中(click)
-    if (inputAssets !== null){
-        asset_table2.selected = inputAssets;
-        $.each(inputAssets, function(index, assetId){
-            var dom = document.getElementById(assetId);
-            if (dom !== null){
-                var selected = dom.parentElement.parentElement.className.indexOf('selected')
-            }
-            if (selected === -1){
-                $('#'+assetId).trigger('click');
-            }
-        });
-    }
-}
 
 
 function rootNodeAddDom(ztree, callback) {
@@ -1001,7 +974,7 @@ function APIExportData(props) {
             var params = props.params || {};
             params['format'] = props.format;
             params['spm'] = data.spm;
-            for (var k in params){
+            for (var k in params) {
                 export_url = setUrlParam(export_url, k, params[k])
             }
             window.open(export_url);
@@ -1012,7 +985,7 @@ function APIExportData(props) {
     })
 }
 
-function APIImportData(props){
+function APIImportData(props) {
     props = props || {};
     $.ajax({
         url: props.url,
@@ -1021,12 +994,12 @@ function APIImportData(props){
         data: props.body,
         contentType: props.content_type || 'text/csv',
         success: function (data) {
-            if(props.method === 'POST'){
+            if (props.method === 'POST') {
                 $('#created_failed').html('');
                 $('#created_failed_detail').html('');
                 $('#success_created').html(gettext("Import Success"));
                 $('#success_created_detail').html("Count" + ": " + data.length);
-            }else{
+            } else {
                 $('#updated_failed').html('');
                 $('#updated_failed_detail').html('');
                 $('#success_updated').html(gettext("Update Success"));
@@ -1037,11 +1010,11 @@ function APIImportData(props){
         },
         error: function (error) {
             var data = error.responseJSON;
-            if (data instanceof Array){
+            if (data instanceof Array) {
                 var html = '';
                 var li = '';
                 var err = '';
-                $.each(data, function (index, item){
+                $.each(data, function (index, item) {
                     err = '';
                     for (var prop in item) {
                         err += prop + ": " + item[prop][0] + " "
@@ -1052,16 +1025,15 @@ function APIImportData(props){
                     }
                 });
                 html = "<ul>" + html + "</ul>"
-            }
-            else {
+            } else {
                 html = error.responseText
             }
-            if(props.method === 'POST'){
+            if (props.method === 'POST') {
                 $('#success_created').html('');
                 $('#success_created_detail').html('');
                 $('#created_failed').html(gettext("Import failed"));
                 $('#created_failed_detail').html(html);
-            }else{
+            } else {
                 $('#success_updated').html('');
                 $('#success_updated_detail').html('');
                 $('#updated_failed').html(gettext("Update failed"));
@@ -1072,7 +1044,7 @@ function APIImportData(props){
 }
 
 
-function htmlEscape ( d ) {
+function htmlEscape(d) {
     return typeof d === 'string' ?
         d.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;') :
         d;
@@ -1080,10 +1052,9 @@ function htmlEscape ( d ) {
 
 function objectAttrsIsList(obj, attrs) {
     attrs.forEach(function (attr) {
-        if (!obj[attr]){
+        if (!obj[attr]) {
             obj[attr] = []
-        }
-        else if (obj[attr] && !(obj[attr] instanceof Array)){
+        } else if (obj[attr] && !(obj[attr] instanceof Array)) {
             obj[attr] = [obj[attr]]
         }
     })
@@ -1106,8 +1077,8 @@ function objectAttrsIsBool(obj, attrs) {
 }
 
 function cleanDateStr(d) {
-    for (var i=0;i<3;i++) {
-        if (!isNaN(Date.parse(d))){
+    for (var i = 0; i < 3; i++) {
+        if (!isNaN(Date.parse(d))) {
             return d;
         }
         if (!isNaN(Number(d))) {
@@ -1144,7 +1115,7 @@ function toSafeLocalDateStr(d) {
 function getUrlParams(url) {
     url = url.split("?");
     var params = "";
-    if (url.length === 2){
+    if (url.length === 2) {
         params = url[1];
     }
     return params
@@ -1166,7 +1137,7 @@ function getTimeUnits(u) {
 function timeOffset(a, b) {
     var start = safeDate(a);
     var end = safeDate(b);
-    var offset = (end - start)/1000;
+    var offset = (end - start) / 1000;
 
     var days = offset / 3600 / 24;
     var hours = offset / 3600;
@@ -1191,7 +1162,7 @@ function readFile(ref) {
     if (hasFile) {
         var reader = new FileReader();//新建一个FileReader
         reader.readAsText(files[0], "UTF-8");//读取文件
-        reader.onload = function(evt){ //读取完文件之后会回来这里
+        reader.onload = function (evt) { //读取完文件之后会回来这里
             ref.trigger("onload", evt.target.result);
         };
     } else {
@@ -1209,9 +1180,9 @@ function nodesSelect2Init(selector, url) {
             data: function (params) {
                 var page = params.page || 1;
                 var query = {
-                   search: params.term,
-                   offset: (page -1) * 10,
-                   limit: 10
+                    search: params.term,
+                    offset: (page - 1) * 10,
+                    limit: 10
                 };
                 return query
             },
@@ -1220,7 +1191,7 @@ function nodesSelect2Init(selector, url) {
                     return {id: v.id, text: v.full_value}
                 });
                 var more = !!data.next;
-                return {results: results, pagination: {"more": more }}
+                return {results: results, pagination: {"more": more}}
             }
         },
     })