Menu.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace app\common\library;
  3. use app\common\model\AuthRule;
  4. use fast\Tree;
  5. use think\Exception;
  6. use think\exception\PDOException;
  7. use think\Log;
  8. use EasyWeChat\Factory;
  9. use Symfony\Component\Cache\Simple\RedisCache;
  10. class Menu
  11. {
  12. /**
  13. * 创建菜单
  14. * @param array $menu
  15. * @param mixed $parent 父类的name或pid
  16. */
  17. public static function create($menu, $parent = 0)
  18. {
  19. if (!is_numeric($parent))
  20. {
  21. $parentRule = AuthRule::getByName($parent);
  22. $pid = $parentRule ? $parentRule['id'] : 0;
  23. }
  24. else
  25. {
  26. $pid = $parent;
  27. }
  28. $allow = array_flip(['file', 'name', 'title', 'icon', 'condition', 'remark', 'ismenu']);
  29. foreach ($menu as $k => $v)
  30. {
  31. $hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
  32. $data = array_intersect_key($v, $allow);
  33. $data['ismenu'] = isset($data['ismenu']) ? $data['ismenu'] : ($hasChild ? 1 : 0);
  34. $data['icon'] = isset($data['icon']) ? $data['icon'] : ($hasChild ? 'fa fa-list' : 'fa fa-circle-o');
  35. $data['pid'] = $pid;
  36. $data['status'] = 'normal';
  37. try
  38. {
  39. $menu = AuthRule::create($data);
  40. if ($hasChild)
  41. {
  42. self::create($v['sublist'], $menu->id);
  43. }
  44. }
  45. catch (PDOException $e)
  46. {
  47. throw new Exception($e->getMessage());
  48. }
  49. }
  50. }
  51. /**
  52. * 删除菜单
  53. * @param string $name 规则name
  54. * @return boolean
  55. */
  56. public static function delete($name)
  57. {
  58. $menu = AuthRule::getByName($name);
  59. if ($menu)
  60. {
  61. // 必须将结果集转换为数组
  62. $ruleList = collection(model('AuthRule')->order('weigh', 'desc')->field('id,pid,name')->select())->toArray();
  63. // 构造菜单数据
  64. $ids = Tree::instance()->init($ruleList)->getChildrenIds($menu['id'], true);
  65. if ($ids)
  66. {
  67. AuthRule::destroy($ids);
  68. }
  69. return true;
  70. }
  71. return false;
  72. }
  73. /**
  74. * @param $adminId
  75. * @param $find 要替换的字符串
  76. * @param $replace 替换成这个
  77. * @param $type type=0,业务域名变成入口域名,type=1 入口域名改成业务域名 ,type=3 入口域名变入口域名
  78. * return $return['errCode'] errCode=0 成功
  79. */
  80. public static function changeMenu($adminId,$find,$replace,$type=0){
  81. $returnArr = [];
  82. $returnArr['errCode'] = 0;
  83. $returnArr['msg'] = '';
  84. $adminConfig = model('AdminConfig')->getAdminInfoAll($adminId);
  85. if(empty($adminConfig['wx_menu'])){ //如果是微信菜单是空的
  86. $returnArr['errCode'] = 0;
  87. $returnArr['msg'] = '该用户微信菜单是空的';
  88. return $returnArr;
  89. }
  90. //替换关键字
  91. $adminConfig['wx_menu'] = json_encode($adminConfig['wx_menu'],JSON_UNESCAPED_UNICODE);
  92. if(!strpos($adminConfig['wx_menu'],$find)){
  93. Log::info(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 无匹配字符");
  94. $returnArr['errCode'] = 0;
  95. $returnArr['msg'] = '匹配不到要替换的字符';
  96. return $returnArr;
  97. }
  98. if($type){
  99. $adminConfig['wx_menu'] = str_replace($find,$replace,$adminConfig['wx_menu']);
  100. $adminConfig['wx_menu'] = json_decode($adminConfig['wx_menu'],true);
  101. }else{
  102. $menu = json_decode($adminConfig['wx_menu'],true);
  103. foreach($menu as $key => $val){
  104. if(isset($val['url'])){
  105. if(strpos($val['url'],'?') > -1) {
  106. $menu[$key]['url'] = str_replace($find, $replace,explode('?',$val['url'])[0]);
  107. $menu[$key]['url'] = $menu[$key]['url'].'?channel_id='.$adminId;
  108. }else{
  109. $menu[$key]['url'] = $val['url'].'?channel_id='.$adminId;
  110. }
  111. }
  112. if(isset($val['sub_button']) && !empty($val['sub_button'])){
  113. foreach($val['sub_button'] as $sub_k => $sub_v){
  114. if(isset($sub_v['url'])){
  115. if(strpos($sub_v['url'],'?') > -1){
  116. $menu[$key]['sub_button'][$sub_k]['url'] = str_replace($find, $replace,explode('?',$sub_v['url'])[0]);
  117. $menu[$key]['sub_button'][$sub_k]['url'] = $menu[$key]['sub_button'][$sub_k]['url'].'?channel_id='.$adminId;
  118. }else{
  119. $menu[$key]['sub_button'][$sub_k]['url'] = $sub_v['url'].'?channel_id='.$adminId;
  120. }
  121. }
  122. }
  123. }
  124. }
  125. $adminConfig['wx_menu'] = $menu;
  126. }
  127. try {
  128. $wechat = new WeChatObject($adminConfig);
  129. $officialAccount = $wechat->getOfficialAccount();
  130. $ret = $officialAccount->menu->create($adminConfig['wx_menu']);
  131. if ($ret['errcode'] == 0) {
  132. Log::info(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 完成");
  133. //更新数据
  134. $update = model('AdminConfig')->update(['wx_menu' => $adminConfig['wx_menu']], ["admin_id" => $adminConfig['admin_id']]);
  135. if ($update) {
  136. Log::info(date('Y-m-d H:i:s') . "替换wx_menu admin_id:{$adminConfig['admin_id']} 更新成功");
  137. return $returnArr;
  138. } else {
  139. $returnArr['errCode'] = 4;
  140. $returnArr['msg'] = '替换微信菜单更新失败';
  141. Log::error(date('Y-m-d H:i:s') . "替换wx_menu admin_id:{$adminConfig['admin_id']} 更新失败");
  142. return $returnArr;
  143. }
  144. } else {
  145. $returnArr['errCode'] = 3;
  146. $returnArr['msg'] = '微信菜单创建失败';
  147. Log::error(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 失败 " . $ret['errmsg']);
  148. return $returnArr;
  149. }
  150. }catch (\Exception $exception){
  151. Log::error(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 失败 触发异常:" . $exception->getMessage());
  152. return ['errCode'=>10,'msg'=>'微信菜单创建失败,触发异常'];
  153. }
  154. }
  155. }