From f9c4de6c51bd7329522872541897ab5e23b7b8f9 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 10 Mar 2023 17:20:19 +0800 Subject: [PATCH] * code for add recommend and depend. --- module/group/control.php | 116 +++++++++--------- module/group/css/addrelation.css | 2 + module/group/js/addrelation.js | 13 ++ module/group/js/editmanagepriv.js | 95 +++++++++++--- module/group/lang/zh-cn.php | 25 ++-- module/group/model.php | 19 +-- ...endation.html.php => addrelation.html.php} | 27 +--- module/group/view/editmanagepriv.html.php | 34 ++--- 8 files changed, 200 insertions(+), 131 deletions(-) create mode 100644 module/group/css/addrelation.css create mode 100644 module/group/js/addrelation.js rename module/group/view/{addrecommendation.html.php => addrelation.html.php} (66%) diff --git a/module/group/control.php b/module/group/control.php index 64a41f23bb..48f0b25ced 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -561,14 +561,18 @@ class group extends control * Add recommendation. * * @param string $privIdList + * @param string $type depend|recommend * @access public * @return void */ - public function addRecommendation($privIdList) + public function addRelation($privIdList, $type) { + if(strpos("depend|recommend", $type) === false) return print('Error type'); + if($_POST) { - $this->group->saveRelation($privIdList, 'recommend'); + $this->group->saveRelation($privIdList, $type); + if(strpos($privIdList, ',') === false) print(js::execute("if(typeof(parent.parent.getSideRelation) == 'function') parent.parent.getSideRelation({$privIdList})")); return print(js::reload('parent')); } @@ -579,34 +583,49 @@ class group extends control $this->view->privs = $privs; $this->view->modules = array('' => $this->lang->group->selectModule) + $this->group->getMenuModules(null, true); $this->view->modulePrivs = $this->group->getPrivByModule($modules); - $this->view->recommends = $this->group->getPrivRelation($privIdList, 'recommend'); + $this->view->relations = $this->group->getPrivRelation($privIdList, $type); + $this->view->type = $type; $this->display(); } + /** + * Delete relation. + * + * @param string $type + * @param int $privID + * @param int $relationPriv + * @access public + * @return void + */ + public function deleteRelation($type, $privID, $relationPriv) + { + $this->dao->delete()->from(TABLE_PRIVRELATION)->where('type')->eq($type)->andWhere('priv')->eq($privID)->andWhere('relationPriv')->eq($relationPriv)->exec(); + } + /** * Ajax get priv tree. * * @param string $privIdList * @param string $module + * @param string $type recommend|depend * @access public * @return void */ - public function ajaxGetPrivTree($privIdList, $module) + public function ajaxGetPrivTree($privIdList, $module, $type = 'recommend') { if(is_string($privIdList)) $privIdList = explode(',', $privIdList); $modules = $this->group->getMenuModules(null, true); $modulePrivs = $this->group->getPrivByModule($module); - $recommends = $this->group->getPrivRelation($privIdList, 'recommend', $module); + $relations = $this->group->getPrivRelation($privIdList, $type, $module); $tree = "'; @@ -658,73 +677,60 @@ class group extends control **/ public function editPriv($privID) { - $privID = intval($privID); - $currentLang = $this->app->clientLang ? : 'zh-cn'; - $priv = $this->group->getPrivInfo($privID,$currentLang); + $privID = intval($privID); + $currentLang = $this->app->clientLang ? : 'zh-cn'; + $priv = $this->group->getPrivInfo($privID,$currentLang); - if(!empty($_POST)) - { - $responseResult = "success"; - $responseMeessage = $this->lang->saveSuccess; - $locate = "parent"; - $this->group->updatePrivLang($privID,$currentLang); - if(dao::isError()) - { - $responseResult = "fail"; - $responseMessage = dao::getError(); - $locate = ""; - } - $this->send(array('result'=>$responseResult,'message'=>$responseMessage,'locate'=>$locate)); - } + if(!empty($_POST)) + { + $responseResult = "success"; + $responseMeessage = $this->lang->saveSuccess; + $locate = "parent"; + $this->group->updatePrivLang($privID,$currentLang); + if(dao::isError()) + { + $responseResult = "fail"; + $responseMessage = dao::getError(); + $locate = ""; + } + $this->send(array('result'=>$responseResult,'message'=>$responseMessage,'locate'=>$locate)); + } - $this->view->modulePackage = $this->group->getModuleAndPackageTree(); + $this->view->modulePackage = $this->group->getModuleAndPackageTree(); if($priv) - { - $this->view->priv = $priv; - $this->display(); - } - } - - /** - * Add dependent privs. - * - * @access public - * @return void - */ - public function addDependent() - { - $this->display(); + { + $this->view->priv = $priv; + $this->display(); + } } /** * AJAX: Get priv's related priv list. * * @param int $privID - * @param string $type * @access public * @return bool */ - public function ajaxGetPrivRelations($privID, $type = 'depend') + public function ajaxGetPrivRelations($privID) { - $moduleLang = $this->group->getMenuModules('', true); $relatedPrivs = $this->group->getPrivRelation($privID); - if(empty($relatedPrivs)) return print(''); - $privList = array(); - foreach($relatedPrivs as $relatedPrivID => $relatedPriv) + $moduleLang = $this->group->getMenuModules('', true); + $privList = array('depend' => array(), 'recommend' => array()); + foreach($relatedPrivs as $type => $relations) { - if(!isset($privList[$relatedPriv->type])) $privList[$relatedPriv->type] = array(); - if(!isset($privList[$relatedPriv->type][$relatedPriv->module])) $privList[$relatedPriv->type][$relatedPriv->module] = array(); - $privList[$relatedPriv->type][$relatedPriv->module]['title'] = zget($moduleLang, $relatedPriv->module, $relatedPriv->module); - $privList[$relatedPriv->type][$relatedPriv->module]['module'] = $relatedPriv->module; - $privList[$relatedPriv->type][$relatedPriv->module]['children'][] = array('title' => $relatedPriv->name); + foreach($relations as $relatedPriv) + { + $module = $relatedPriv->module; + if(!isset($privList[$type][$module])) $privList[$type][$module] = array(); + $privList[$type][$module]['title'] = zget($moduleLang, $module, $module); + $privList[$type][$module]['module'] = $relatedPriv->module; + $privList[$type][$module]['children'][] = array('title' => $relatedPriv->name, 'relationPriv' => $relatedPriv->id, 'privID' => $privID); + } + $privList[$type] = array_values($privList[$type]); } - - $privList['depend'] = array_values($privList['depend']); - $privList['recommend'] = array_values($privList['recommend']); - return print(json_encode($privList)); } } diff --git a/module/group/css/addrelation.css b/module/group/css/addrelation.css new file mode 100644 index 0000000000..6911f169ac --- /dev/null +++ b/module/group/css/addrelation.css @@ -0,0 +1,2 @@ +.tree .relationBox li{float:left; width: 150px;} +#dataform {min-height:240px;} diff --git a/module/group/js/addrelation.js b/module/group/js/addrelation.js new file mode 100644 index 0000000000..dea8191c66 --- /dev/null +++ b/module/group/js/addrelation.js @@ -0,0 +1,13 @@ +$(function() +{ + $('ul.tree:first > li').addClass('open').addClass('id'); + $('#module').change(function() + { + if($(this).val() == '') return; + $('.treeBox').load(createLink('group', 'ajaxGetPrivTree', 'privIdList=' + privIdList + '&module=' + $(this).val() + '&type=' + type), function() + { + $('ul.tree').tree(); + $('ul.tree:first > li').addClass('open').addClass('id'); + }); + }) +}) diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index 498b033c82..532e52bdf8 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -14,11 +14,11 @@ function initRecomendTree(data) initialState: 'active', itemCreator: function($li, item) { - $li.append('' + item.title + (item.children ? '' : '') + ''); + $li.append('' + item.title + (item.children ? '' : '') + ''); if(item.active) $li.addClass('active open in'); } }); -}; +} /** * Init comp depend-tree. @@ -35,11 +35,11 @@ function initDependTree(data) initialState: 'active', itemCreator: function($li, item) { - $li.append('' + item.title + (item.children ? '' : '') + ''); + $li.append('' + item.title + (item.children ? '' : '') + ''); if(item.active) $li.addClass('active open in'); } }); -}; +} /** * update comp tree after click checkbox-label. @@ -51,24 +51,56 @@ function initDependTree(data) function updatePrivTree(objTree) { $(".menuTree.depend").data('zui.tree').reload(objTree.dependData || [] ); - if(objTree.dependData && objTree.dependData.length) + if(objTree.dependData && objTree.dependData.length) { $(".menuTree.depend + .empty-tip").addClass('hidden'); + + var privCount = 0; + $.each(objTree.dependData, function(index, item){if(item.children) privCount += item.children.length;}); + $(".menuTree.depend").closest('.priv-panel').find('.panel-title .priv-count').html('(' + privCount + ')'); } else { $(".menuTree.depend + .empty-tip").removeClass('hidden'); + $(".menuTree.depend").closest('.priv-panel').find('.panel-title .priv-count').html(''); } $(".menuTree.recommend").data('zui.tree').reload(objTree.recommendData || []); if(objTree.recommendData && objTree.recommendData.length) { $(".menuTree.recommend + .empty-tip").addClass('hidden'); + + var privCount = 0; + $.each(objTree.recommendData, function(index, item){if(item.children) privCount += item.children.length;}); + $(".menuTree.recommend").closest('.priv-panel').find('.panel-title .priv-count').html('(' + privCount + ')'); } else { $(".menuTree.recommend + .empty-tip").removeClass('hidden'); + $(".menuTree.recommend").closest('.priv-panel').find('.panel-title .priv-count').html(''); } -}; +} + +/** + * Get relation side. + * + * @param int $privID + * @access public + * @return void + */ +function getSideRelation(privID) +{ + $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + privID), function(data) + { + var objTree = {}; + if(data) + { + var relatedPriv = JSON.parse(data); + objTree.dependData = relatedPriv.depend; + objTree.recommendData = relatedPriv.recommend; + } + updatePrivTree(objTree); + }) +} $(function() { @@ -101,20 +133,43 @@ $(function() if($(e.target).prop('tagName') == 'LABEL') { var selectedID = $(this).siblings('input:checkbox').data('id'); - $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + selectedID), function(data) - { - var objTree = {}; - if(data) - { - var relatedPriv = JSON.parse(data); - objTree = { - dependData: relatedPriv.depend, - recommendData: relatedPriv.recommend - }; - } - updatePrivTree(objTree); - }) + $('.side a#addDependent').attr('href', createLink('group', 'addRelation', "privIdList=" + selectedID + '&type=depend')); + $('.side a#addRecommendation').attr('href', createLink('group', 'addRelation', "privIdList=" + selectedID + '&type=recommend')); + getSideRelation(selectedID); } }); -}); + $(document).on('click', '.side .priv-item .icon-close', function() + { + var $this = $(this); + var privCount = $this.closest('.menuTree').find('.priv-item[data-has-children="false"]').length; + var type = $this.data('type') + var privID = $this.data('privid') + var relationPriv = $this.data('relationpriv'); + $.get(createLink('group', 'deleteRelation', 'type=' + type + '&privID=' + privID + '&relationPriv=' + relationPriv)); + $this.closest('.priv-panel').find('.panel-title .priv-count').html('(' + (privCount - 1) + ')'); + $this.closest('li').remove(); + }) + + $(document).on('change', '.checkbox-primary input[type=checkbox]', function() + { + var privIdList = ''; + $('.checkbox-primary input[type=checkbox]:checked').each(function() + { + var privID = $(this).data('id'); + if(privID) privIdList += ',' + privID; + }); + + if(privIdList == '') + { + $('#batchSetDepend').attr('href', '#').attr('disabled', 'disabled'); + $('#batchSetRecommend').attr('href', '#').attr('disabled', 'disabled'); + return; + } + + privIdList = privIdList.substr(1); + $('#batchSetDepend').attr('href', createLink('group', 'addRelation', "privIdList=" + privIdList + '&type=depend')).removeAttr('disabled'); + $('#batchSetRecommend').attr('href', createLink('group', 'addRelation', "privIdList=" + privIdList + '&type=recommend')).removeAttr('disabled'); + if(!$('#batchSetDepend').hasClass('modaled')) $('#batchSetDepend,#batchSetRecommend').modal().addClass('modaled'); + }) +}); diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index ab60c59d4e..d0362d5ab8 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -55,17 +55,20 @@ $lang->group->editPriv = '编辑权限'; $lang->group->privName = '权限名称'; $lang->group->privDesc = '描述'; $lang->group->add = '添加'; -$lang->group->batchSetDependency = '批量设置依赖'; -$lang->group->managePrivPackage = '维护权限包'; -$lang->group->createPrivPackage = '新增权限包'; -$lang->group->editPrivPackage = '编辑权限包'; -$lang->group->deletePrivPackage = '删除权限包'; -$lang->group->sortPrivPackages = '权限包排序'; -$lang->group->addRecommendation = '添加推荐'; -$lang->group->selectedPrivs = '选中权限:%s'; -$lang->group->selectModule = '选择模块'; -$lang->group->recommendPrivs = '依赖权限'; -$lang->group->dependentPrivs = '推荐权限'; + +$lang->group->batchSetDependency = '批量设置依赖'; +$lang->group->batchSetRecommendation = '批量设置推荐'; +$lang->group->managePrivPackage = '维护权限包'; +$lang->group->createPrivPackage = '新增权限包'; +$lang->group->editPrivPackage = '编辑权限包'; +$lang->group->deletePrivPackage = '删除权限包'; +$lang->group->sortPrivPackages = '权限包排序'; +$lang->group->addRecommendation = '添加推荐'; +$lang->group->addDependent = '添加依赖'; +$lang->group->selectedPrivs = '选中权限:%s'; +$lang->group->selectModule = '选择模块'; +$lang->group->recommendPrivs = '依赖的权限'; +$lang->group->dependentPrivs = '推荐的权限'; $lang->group->id = '编号'; $lang->group->name = '分组名称'; diff --git a/module/group/model.php b/module/group/model.php index b338c3380a..683a3e77e4 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1214,13 +1214,16 @@ class groupModel extends model */ public function getPrivRelation($priv, $type = '', $module = '') { - return $this->dao->select('t1.type,t2.*,t3.name')->from(TABLE_PRIVRELATION)->alias('t1') + $relations = $this->dao->select('t1.type,t2.*,t3.name')->from(TABLE_PRIVRELATION)->alias('t1') ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id') ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv') ->where('t1.priv')->in($priv) ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() ->beginIF($module)->andWhere('t2.module')->eq($module)->fi() - ->fetchAll('id'); + ->fetchGroup('type', 'id'); + + if(!empty($type)) return zget($relations, $type, array()); + return $relations; } /** @@ -1347,7 +1350,7 @@ class groupModel extends model if(empty($views)) return array(); $views = explode(',', $views); - $tree = []; + $tree = []; foreach($views as $viewIndex => $view) { $viewModules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); @@ -1355,14 +1358,14 @@ class groupModel extends model $viewModules = explode(',', $viewModules); foreach($viewModules as $moduleIndex => $module) - { + { $this->app->loadLang($module); - $tree[$module] = $this->lang->{$module}->common;; + $tree[$module] = $this->lang->{$module}->common;; $packages = $this->getPrivPackagesByModule($module); foreach($packages as $packageID => $package) - { - $tree[$module. ',' . $packageID] = $this->lang->{$module}->common .'/'. $package->name; + { + $tree[$module. ',' . $packageID] = $this->lang->{$module}->common .'/'. $package->name; } } } @@ -1440,7 +1443,7 @@ class groupModel extends model $views = explode(',', $views); foreach($views as $index => $view) { - $views[$view] = $this->lang->{$view}->common; + $views[$view] = isset($this->lang->{$view}->common) ? $this->lang->{$view}->common : $view; unset($views[$index]); } diff --git a/module/group/view/addrecommendation.html.php b/module/group/view/addrelation.html.php similarity index 66% rename from module/group/view/addrecommendation.html.php rename to module/group/view/addrelation.html.php index 3013e5a81b..f30097ea56 100644 --- a/module/group/view/addrecommendation.html.php +++ b/module/group/view/addrelation.html.php @@ -1,6 +1,6 @@ -
-

group->addRecommendation;?>

+

group->addDependent : $lang->group->addRecommendation;?>

@@ -43,8 +39,7 @@
    $modulePriv):?> - -
  • module}]", array($id => $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : '')?>
  • +
  • $modulePriv->name), (empty($relations) or isset($relations[$id])) ? $id : '')?>
@@ -57,19 +52,5 @@
- + diff --git a/module/group/view/editmanagepriv.html.php b/module/group/view/editmanagepriv.html.php index 6da4f38a02..9c3583aeb1 100644 --- a/module/group/view/editmanagepriv.html.php +++ b/module/group/view/editmanagepriv.html.php @@ -26,25 +26,24 @@
group->addPriv?> createLink('group', 'managePrivPackage', ''), $lang->group->managePrivPackage, '', 'class="btn btn-primary"');?> - group->batchSetDependency?> + + group->batchSetDependency?> + group->batchSetRecommendation?> +
- + +
-
依赖的权限
+
+ group->dependentPrivs?> + +
@@ -52,11 +51,14 @@
- inLink('addDependent'), $lang->group->add, '', "class='btn btn-primary'");?> + ' . $lang->group->add, '', "class='btn btn-primary iframe' id='addDependent'");?>
-
推荐的权限
+
+ group->recommendPrivs?> + +
@@ -64,10 +66,14 @@
- ' . $lang->group->add, '', "class='btn btn-primary iframe'");?> + ' . $lang->group->add, '', "class='btn btn-primary iframe' id='addRecommendation'");?>
+ + +
+