123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <?php
- namespace app\common\library;
- use app\common\model\AuthRule;
- use fast\Tree;
- use think\Exception;
- use think\exception\PDOException;
- use think\Log;
- use EasyWeChat\Factory;
- use Symfony\Component\Cache\Simple\RedisCache;
- class Menu
- {
- /**
- * 创建菜单
- * @param array $menu
- * @param mixed $parent 父类的name或pid
- */
- public static function create($menu, $parent = 0)
- {
- if (!is_numeric($parent))
- {
- $parentRule = AuthRule::getByName($parent);
- $pid = $parentRule ? $parentRule['id'] : 0;
- }
- else
- {
- $pid = $parent;
- }
- $allow = array_flip(['file', 'name', 'title', 'icon', 'condition', 'remark', 'ismenu']);
- foreach ($menu as $k => $v)
- {
- $hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
- $data = array_intersect_key($v, $allow);
- $data['ismenu'] = isset($data['ismenu']) ? $data['ismenu'] : ($hasChild ? 1 : 0);
- $data['icon'] = isset($data['icon']) ? $data['icon'] : ($hasChild ? 'fa fa-list' : 'fa fa-circle-o');
- $data['pid'] = $pid;
- $data['status'] = 'normal';
- try
- {
- $menu = AuthRule::create($data);
- if ($hasChild)
- {
- self::create($v['sublist'], $menu->id);
- }
- }
- catch (PDOException $e)
- {
- throw new Exception($e->getMessage());
- }
- }
- }
- /**
- * 删除菜单
- * @param string $name 规则name
- * @return boolean
- */
- public static function delete($name)
- {
- $menu = AuthRule::getByName($name);
- if ($menu)
- {
- // 必须将结果集转换为数组
- $ruleList = collection(model('AuthRule')->order('weigh', 'desc')->field('id,pid,name')->select())->toArray();
- // 构造菜单数据
- $ids = Tree::instance()->init($ruleList)->getChildrenIds($menu['id'], true);
- if ($ids)
- {
- AuthRule::destroy($ids);
- }
- return true;
- }
- return false;
- }
- /**
- * @param $adminId
- * @param $find 要替换的字符串
- * @param $replace 替换成这个
- * @param $type type=0,业务域名变成入口域名,type=1 入口域名改成业务域名 ,type=3 入口域名变入口域名
- * return $return['errCode'] errCode=0 成功
- */
- public static function changeMenu($adminId,$find,$replace,$type=0){
- $returnArr = [];
- $returnArr['errCode'] = 0;
- $returnArr['msg'] = '';
- $adminConfig = model('AdminConfig')->getAdminInfoAll($adminId);
- if(empty($adminConfig['wx_menu'])){ //如果是微信菜单是空的
- $returnArr['errCode'] = 0;
- $returnArr['msg'] = '该用户微信菜单是空的';
- return $returnArr;
- }
- //替换关键字
- $adminConfig['wx_menu'] = json_encode($adminConfig['wx_menu'],JSON_UNESCAPED_UNICODE);
- if(!strpos($adminConfig['wx_menu'],$find)){
- Log::info(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 无匹配字符");
- $returnArr['errCode'] = 0;
- $returnArr['msg'] = '匹配不到要替换的字符';
- return $returnArr;
- }
- if($type){
- $adminConfig['wx_menu'] = str_replace($find,$replace,$adminConfig['wx_menu']);
- $adminConfig['wx_menu'] = json_decode($adminConfig['wx_menu'],true);
- }else{
- $menu = json_decode($adminConfig['wx_menu'],true);
- foreach($menu as $key => $val){
- if(isset($val['url'])){
- if(strpos($val['url'],'?') > -1) {
- $menu[$key]['url'] = str_replace($find, $replace,explode('?',$val['url'])[0]);
- $menu[$key]['url'] = $menu[$key]['url'].'?channel_id='.$adminId;
- }else{
- $menu[$key]['url'] = $val['url'].'?channel_id='.$adminId;
- }
- }
- if(isset($val['sub_button']) && !empty($val['sub_button'])){
- foreach($val['sub_button'] as $sub_k => $sub_v){
- if(isset($sub_v['url'])){
- if(strpos($sub_v['url'],'?') > -1){
- $menu[$key]['sub_button'][$sub_k]['url'] = str_replace($find, $replace,explode('?',$sub_v['url'])[0]);
- $menu[$key]['sub_button'][$sub_k]['url'] = $menu[$key]['sub_button'][$sub_k]['url'].'?channel_id='.$adminId;
- }else{
- $menu[$key]['sub_button'][$sub_k]['url'] = $sub_v['url'].'?channel_id='.$adminId;
- }
- }
- }
- }
- }
- $adminConfig['wx_menu'] = $menu;
- }
- try {
- $wechat = new WeChatObject($adminConfig);
- $officialAccount = $wechat->getOfficialAccount();
- $ret = $officialAccount->menu->create($adminConfig['wx_menu']);
- if ($ret['errcode'] == 0) {
- Log::info(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 完成");
- //更新数据
- $update = model('AdminConfig')->update(['wx_menu' => $adminConfig['wx_menu']], ["admin_id" => $adminConfig['admin_id']]);
- if ($update) {
- Log::info(date('Y-m-d H:i:s') . "替换wx_menu admin_id:{$adminConfig['admin_id']} 更新成功");
- return $returnArr;
- } else {
- $returnArr['errCode'] = 4;
- $returnArr['msg'] = '替换微信菜单更新失败';
- Log::error(date('Y-m-d H:i:s') . "替换wx_menu admin_id:{$adminConfig['admin_id']} 更新失败");
- return $returnArr;
- }
- } else {
- $returnArr['errCode'] = 3;
- $returnArr['msg'] = '微信菜单创建失败';
- Log::error(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 失败 " . $ret['errmsg']);
- return $returnArr;
- }
- }catch (\Exception $exception){
- Log::error(date('Y-m-d H:i:s') . "微信菜单创建 admin_id:{$adminConfig['admin_id']} 失败 触发异常:" . $exception->getMessage());
- return ['errCode'=>10,'msg'=>'微信菜单创建失败,触发异常'];
- }
- }
- }
|