// +---------------------------------------------------------------------- namespace app\services\system\admin; use app\Request; use qiniu\basic\BaseServices; use app\model\system\admin\SystemRole; use qiniu\exceptions\AdminException; use qiniu\exceptions\AuthException; use qiniu\utils\ApiErrorCode; use qiniu\services\CacheService; use think\db\exception\DbException; /** * Class SystemRoleServices * @package app\services\system * @mixin SystemRole */ class SystemRoleServices extends BaseServices { /** * 当前管理员权限缓存前缀 */ const ADMIN_RULES_LEVEL = 'Admin_rules_level_'; /** * SystemRoleServices constructor. * @param SystemRole $model */ public function __construct(SystemRole $model) { $this->model = $model; } /** * 获取权限 * @return mixed */ public function getRoleArray(array $where = [], string $field = '', string $key = '') { return $this->search($where)->column($field ?: 'role_name', $key ?: 'id'); } /** * 身份管理列表 * @param array $where * @return array * @throws DbException */ public function getRoleList(array $where) { [$page, $limit] = $this->getPageValue(); $list = $this->getList($where, '*', $page, $limit); $count = $this->getCount($where); /** @var SystemMenusServices $service */ $service = app()->make(SystemMenusServices::class); foreach ($list as &$item) { $item['rules'] = implode(',', array_merge($service->search(['id' => $item['rules']])->column('menu_name', 'id'))); } return compact('count', 'list'); } /** * 后台验证权限 * @param Request $request * @return bool * @throws \Throwable */ public function verifiAuth(Request $request) { $rule = str_replace('adminapi/', '', trim(strtolower($request->rule()->getRule()))); if (in_array($rule, ['logout', 'menuslist'])) { return true; } $method = trim(strtolower($request->method())); $auth = $this->getAllRoles(2); //验证访问接口是否存在 if (!in_array($method . '@@' . $rule, array_map(function ($item) { return trim(strtolower($item['methods'])) . '@@' . trim(strtolower(str_replace(' ', '', $item['api_url']))); }, $auth))) { return true; } $auth = $this->getRolesByAuth($request->adminInfo()['roles'], 2); //验证访问接口是否有权限 if ($auth && empty(array_filter($auth, function ($item) use ($rule, $method) { if (trim(strtolower($item['api_url'])) === $rule && $method === trim(strtolower($item['methods']))) return true; else return false; }))) { throw new AuthException(ApiErrorCode::ERR_AUTH); } return true; } /** * 获取所有权限 * @param int $auth_type * @param int $type * @param string $cachePrefix * @return array|bool|mixed|null * @throws \Throwable */ public function getAllRoles(int $auth_type = 1, int $type = 1, string $cachePrefix = self::ADMIN_RULES_LEVEL) { $cacheName = md5($cachePrefix . '_' . $auth_type . '_' . $type . '_ALl'); return CacheService::redisHandler('system_menus')->remember($cacheName, function () use ($auth_type, $type) { /** @var SystemMenusServices $menusService */ $menusService = app()->make(SystemMenusServices::class); return $menusService->getColumn([['auth_type', '=', $auth_type], ['type', '=', $type]], 'api_url,methods'); }); } /** * 获取指定权限 * @param array $roles * @param int $auth_type * @param int $type * @param string $cachePrefix * @return array|bool|mixed|null * @throws \Throwable */ public function getRolesByAuth(array $roles, int $auth_type = 1, int $type = 1, string $cachePrefix = self::ADMIN_RULES_LEVEL) { if (empty($roles)) return []; $cacheName = md5($cachePrefix . '_' . $auth_type . '_' . $type . '_' . implode('_', $roles)); CacheService::redisHandler('system_menus')->clear(); return CacheService::redisHandler('system_menus')->remember($cacheName, function () use ($roles, $auth_type, $type) { /** @var SystemMenusServices $menusService */ $menusService = app()->make(SystemMenusServices::class); return $menusService->getColumn([['id', 'IN', $this->getRoleIds($roles)], ['auth_type', '=', $auth_type], ['type', '=', $type]], 'api_url,methods'); }); } /** * 获取权限id * @param array $roles * @param string $field * @param string $key * @return array */ public function getRoleIds(array $roles, string $field = 'rules', string $key = 'id') { $rules = $this->model->getColumn([['id', 'IN', $roles], ['status', '=', '1']], $field, $key); return $rules ? array_unique(explode(',', implode(',', $rules))) : []; } public function create($data) { if (parent::create($data)) { CacheService::clear(); return true; } else { throw new AdminException('添加失败'); } } public function update($id, array $data, ?string $key = null) { if (parent::update($id, $data)) { CacheService::clear(); return true; } else { throw new AdminException('修改失败'); } } public function delete($id, ?string $key = null) { if (parent::delete($id)) { CacheService::clear(); return true; } else { throw new AdminException('删除失败,请稍候再试!'); } } }