AdminMenu.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace app\admin\model;
  3. class AdminMenu extends Base
  4. {
  5. //设置字段信息
  6. protected $schema = [
  7. 'id' =>'bigint',//
  8. 'menu_name' =>'varchar',//菜单名称
  9. 'menu_code' =>'varchar',//菜单code
  10. 'menu_img' =>'varchar',//菜单图片
  11. 'menu_route' =>'varchar',//菜单路由
  12. 'menu_url' =>'varchar',//菜单地址
  13. 'menu_api' =>'varchar',//接口地址
  14. 'pid' =>'bigint',//父级id
  15. 'is_show' =>'int',//是否禁用
  16. 'is_private' =>'int',//是否私有
  17. 'level' =>'tinyint',//菜单等级,0公共,1超管,2业务公司,3供应商
  18. 'is_display' =>'int',//是否展示
  19. 'weight' =>'double',//权重
  20. 'status' =>'int',//状态
  21. 'is_del' =>'int',//是否删除
  22. 'addtime' =>'datetime',//
  23. 'updatetime' =>'datetime',//
  24. 'menu_type' =>'tinyint',//1菜单2 页面
  25. ];
  26. public static function GetMenu($menuid){
  27. $info=self::where(["id"=>$menuid,"is_del"=>0])->findOrEmpty();
  28. if($info->pid>0){
  29. $paren = self::where(['pid'=>$info->pid,'is_del'=>0])->findOrEmpty();
  30. }
  31. return ["menu_name"=>$info->menu_name,"parent_name"=>$paren->menu_name??"","parent_id"=>$info->pid];
  32. }
  33. public function ActionInfo(){
  34. return $this->hasMany(Action::class,"action_id")->where(["is_del"=>0]);
  35. }
  36. //由二级菜单获取父级集合
  37. public static function GetMenuBySecod($menuid,$result=[]){
  38. $menuArr = self::where(['id'=>$menuid])->findOrEmpty();
  39. if(!$menuArr->isEmpty()){
  40. if($menuArr->pid>0) self::GetMenuBySecod($menuArr->pid,$result);
  41. $result[] = ['id' => $menuid, 'rename' => $menuArr->menu_name, 'pid' => $menuArr->pid];
  42. }
  43. return $result;
  44. }
  45. //通过功能集合返回菜单树状集
  46. public function GetMenuByActionArr($actionArr,$where=[]){
  47. $menuArr = Action::with(["ActionInfo"])->whereIn("id",$actionArr)->select();
  48. $tree=[];
  49. if(!$menuArr->isEmpty()){
  50. $menuid = [];
  51. foreach ($menuArr as $item){
  52. $menuid[$item->menuid][] =$item->action_code;
  53. }
  54. $menuArrId = array_unique(array_column($menuArr->toArray(),"menuid"));
  55. $menuAll=$this->where($where)->column("menu_name,menu_img,menu_route,is_display,status,pid,weight","id");
  56. foreach ($menuArrId as $item){
  57. $this->buildForwardTree($item,$menuid[$item]??[],$menuAll,$tree);
  58. }
  59. $weight= array_column($tree,'weight');
  60. array_multisort($weight, SORT_DESC, $tree);
  61. }
  62. return $tree;
  63. }
  64. //有子找父级
  65. public function buildForwardTree($itemId, $child = [],&$items, &$menuTree=[]) {
  66. if(!isset($items[$itemId]))return;
  67. $node=$items[$itemId];
  68. if($node['pid']==0){
  69. if(!isset($menuTree[$itemId])){
  70. $menuTree[$itemId]=$node;
  71. }
  72. $menuTree[$itemId]['child'][]=$child;
  73. $weight= array_column($menuTree[$itemId]['child'],"weight");
  74. array_multisort($weight, SORT_DESC, $menuTree[$itemId]['child']);
  75. }else{
  76. $node['action']=$child;
  77. $this->buildForwardTree($node['pid'],$node,$items,$menuTree);
  78. }
  79. }
  80. public function GetMenuActionTree($pid=0){
  81. $result = $this->field('menu_name,menu_img,menu_route,is_display,status,pid,weight,id')
  82. ->where(['pid'=>$pid,'is_del'=>0])
  83. ->order(['weight'=>'desc','id'=>'desc'])->select();
  84. $remp=[];
  85. if($result->isEmpty())return $remp;
  86. foreach ($result as $item){
  87. $item->child = $this->GetMenuActionTree($item->id);
  88. if($item->pid>0){
  89. $item->action = Action::with(["ActionInfo"])->field("id,action_code")->where
  90. (['menuid'=>$item->id,'is_del'=>0])->select();
  91. }
  92. $remp[] = $item;
  93. }
  94. return $remp;
  95. }
  96. }