<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use DB; use Illuminate\Support\Facades\Redis; class PermController extends Controller { // 检查用户是否具有系统访问权限 public function checkAccess($request) { $user_id = $request->user->userId; $role = $this->getUserRole($request); if ($role == 1) return true; // 超级管理员或系统管理员直接进入 $userPerms = $this->getUserAllPerms($user_id, $role); if (!$userPerms) return false; $parse_url = parse_url($request->url()); // 页面url if (!isset($parse_url['path'])) { if (in_array('apply_access', $userPerms)) return true; // 访问权限存在,则返回true } $key = Config('perm_args.perm_menus_data'); $redis = Redis::connection('read'); $menus = $redis->get($key); if (!$menus) { $menuconfig = DB::table('config')->where('config_title', '订单系统')->first(); if (!$menuconfig) return false; $menus = json_decode($menuconfig->config_data); $menu_href = []; $this->getAllMenus($menus, $menu_href); // 获取所有菜单href $expire = Config('perm_args.perm_menus_data_expire'); // 缓存两小时 Redis::setex($key, $expire, json_encode($menu_href)); } else { $menu_href = json_decode($menus); } $path = isset($parse_url['path']) ? $parse_url['path'] : ''; // path路径 if (in_array($path, $menu_href)) { if (preg_match('/\/web\//', $path)) { $permId = str_replace('/web/','',$path); } else { $permId = str_replace('/', '', $path); } $permId = $permId . '_check'; // 路径查看权限 if (in_array('apply_access', $userPerms) && in_array($permId, $userPerms)) return true; // 访问及路径权限存在,则返回true } else { if (in_array('apply_access', $userPerms)) return true; // 访问权限存在,则返回true } return false; } // 检查路径是否存在于菜单 public function getAllMenus($menus, &$menu_href) { foreach ($menus as $k => $v) { if (count($v->childs) > 0) $this->getAllMenus($v->childs, $menu_href); if (strlen($v->href) > 1) $menu_href[] = $v->href; } } // 获取系统信息 public function getBusinessInfo() { // 根据域名查询系统业务ID $business = DB::table('t_business_config')->where('url', Config('website.order_url'))->first(); return !empty($business) ? $business : false; } // 获取用户角色 public function getUserRole(Request $request) { $uid = $request->user->userId; $email = $request->user->email; if ($email == 'admin@ichunt.com') return 1; // 根据域名查询系统业务ID $business = $this->getBusinessInfo(); if ($business) { $bid = $business->bid; // 权限系统配置的管理帐号 $adminAccount = json_decode($business->admin, true); if (in_array($email, $adminAccount)) return 1; // 根据用户ID和业务ID查看角色 $userPerm = DB::table('t_user_perm')->where(['userId' => $uid, 'bid' => $bid])->first(); if (empty($userPerm)) return 0; if ($userPerm->roles == 'null') return 0; // 没有选择角色 $role = json_decode($userPerm->roles, true); $user_role = []; // 当前用户拥有的角色值 foreach ($role as $v) { $department = DB::table('t_role_perm')->where(['roleId' => $v, 'bid' => $bid])->first(); if (!isset($department->name)) continue; $user_role[] = in_array($department->name, array_keys(Config('perm_args.roles'))) ? array_get(Config('perm_args.roles'), $department->name) : 0; } return count($role) > 1 ? implode(',', $user_role) : implode('', $user_role); // 多角色用逗号拼接 } return 0; } // 获取所有角色用户集合 public function getRoleUsers(Request $request, $roleName) { // 根据域名查询系统业务ID $business = $this->getBusinessInfo(); $userId = array(); $roleUsers = array(); if ($business) { $bid = $business->bid; $role = DB::table('t_role_perm')->where(['bid' => $bid, 'name' => $roleName])->first(); $roleId = isset($role->roleId) ? $role->roleId : 0; // $user = DB::select("SELECT * FROM `t_user_perm` WHERE `bid` = $bid AND `roles` REGEXP $roleId"); $user = DB::select("SELECT `userId` FROM `t_user_perm` WHERE `bid` = $bid AND `roles` LIKE '%\"".$roleId."\"%' ORDER BY `mtime`"); if ($user) { foreach ($user as $v) { $userId[] = $v->userId; } if ($userId) { foreach ($userId as $id) { $userInfo = DB::table('user_info')->where('userId', $id)->select('userId', 'name', 'email', 'status')->first(); if (!$userInfo) continue; // 判断用户是否已离职 4为离职状态 // if ($userInfo->status != 4) { $roleUsers[] = $userInfo; // } continue; } } } } return $roleUsers; } // 获取权限菜单 public function getPermMenu($menus, $user_id) { $userPerms = $this->getUserAllPerms($user_id); if ($userPerms) { return $this->handleMenus($menus, $userPerms); } return false; } // 获取用户所有权限 public function getUserAllPerms($user_id, $role=0) { // 根据域名查询系统业务ID $business = $this->getBusinessInfo(); if ($business) { if ($role != 1) { $bid = $business->bid; $url = Config('website.perm_api').$user_id.'/'.$bid; $userPerms = json_decode(curlApi($url), true); if ($userPerms && $userPerms['retcode'] == 0) { return $userPerms['data']['perms']; } } else { // 获取管理员所有权限 return $this->getAllPerms(json_decode($business->configs, true)); } } return false; } // 获取系统配置权限 public function getAllPerms($configs) { $perms = []; foreach ($configs as $k => $v) { $perm_a = []; $perm_b = []; if (isset($v['childs']) && count($v['childs']) > 0) { $perm_b = $this->getAllPerms($v['childs']); } else { $perm_a[] = $v['permId']; } $perms = array_merge($perms, array_merge($perm_a, $perm_b)); } return $perms; } // 处理菜单 public function handleMenus($menus, $perms) { foreach ($menus as $k => $v) { if (strlen($v->href) > 2) { if (preg_match('/\/web\//', $v->href)) { $permId = str_replace('/web/','',$v->href); } else { $permId = str_replace('/', '', $v->href); } // 查看菜单权限 $permId = $permId . '_check'; if (!in_array($permId, $perms)) { unset($menus[$k]); } } if (count($v->childs) > 0) { $menus[$k]->childs = array_values($this->handleMenus($v->childs, $perms)); if (empty($menus[$k]->childs)) { unset($menus[$k]); } } } return array_values($menus); } // 获取主管及其下对应组员的sale_id public function getGroupSalesId($request, $role_id) { $sale_id = []; // 主管ID $manager_role_name = array_keys(Config('perm_args.roles'), $role_id); if ($manager_role_name) { $manager_sales = $this->getRoleUsers($request, $manager_role_name[0]); if ($manager_sales) { foreach ($manager_sales as $v) { $sale_id[] = $v->userId; } } } // 线销主管对应的客服 $manager_to_kefu = Config('perm_args.manager_to_kefu'); if (!in_array($role_id, array_keys($manager_to_kefu))) return 0; $sub_id = $manager_to_kefu[$role_id]; $role_name = array_keys(Config('perm_args.roles'), $sub_id); if (!$role_name) return 0; $sales = $this->getRoleUsers($request, $role_name[0]); if ($sales) { foreach ($sales as $v) { $sale_id[] = $v->userId; } } return $sale_id; } /** * 多角色情况下 * 1.若存在管理员、经理、测试角色,则返回角色 * 2.若存在线销主管,则查询其下客服 * 3.其他情况暂不考虑 * @param [type] $request [description] * @param [type] $role_id [description] * @return [type] [description] */ public function checkUserRoles($request, $role_id) { $roles = explode(',', $role_id); $data = []; $data['role_id'] = min($roles); // 默认最小值 $data['sale_id'] = $request->user->userId; // 默认只能查看自己的订单数据 $master = array_intersect($roles, Config('perm_args.check_all_order')); // 交集,是否能查看所有订单 if ($master) { $data['role_id'] = min($master); // 设置最小值的角色 (因为系统页面都是单角色判断) $data['sale_id'] = 0; return $data; } $intersect = array_intersect($roles, Config('perm_args.manager_order')); // 交集,获取线销主管 if ($intersect) { $data['role_id'] = min($intersect); // 设置最小值的角色 foreach ($intersect as $v) { $sale_ids[] = $this->getGroupSalesId($request, $v); } $arr = array_reduce($sale_ids, 'array_merge', array()); // 转一维数组 $data['sale_id'] = array_merge(array_unique($arr)); // 去重后,再重新索引 } return $data; } // 获取角色对应的主管邮箱 public function getManager($request) { $role = $this->getUserRole($request); // 当前用户角色 $manager_key = array_search($role, Config('perm_args.manager_to_kefu')); // 获取对应的主管key if (!$manager_key) return false; $role_name = array_search($manager_key, Config('perm_args.roles')); // 获取主管对应的角色名称 if (!$role_name) return false; $res = $this->getRoleUsers($request, $role_name); // 获取角色对应的用户 $email = []; if ($res) { foreach ($res as $v) { $email[] = $v->email; } } return $email; } }