123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- /**
- * @author: xaboy<365615158@qq.com>
- * @day: 2017/11/13
- */
- namespace app\models\system;
- use crmeb\traits\ModelTrait;
- use crmeb\basic\BaseModel;
- use think\facade\Cache;
- use think\facade\Db;
- /**
- * 身份管理 model
- * Class SystemRole
- * @package app\models\system
- */
- class SystemRole extends BaseModel
- {
- /**
- * 数据表主键
- * @var string
- */
- protected $pk = 'id';
- /**
- * 模型名称
- * @var string
- */
- protected $name = 'system_role';
- /**
- * 所有权限缓存前缀
- */
- const ADMIN_RULES_ALL = 'Admin_rules_all_';
- /**
- * 当前管理员权限缓存前缀
- */
- const ADMIN_RULES_LEVEL = 'Admin_rules_level_';
- /**
- * 验证规则缓存
- * @var bool
- */
- protected static $isCache = true;
- use ModelTrait;
- public static function setRulesAttr($value)
- {
- return is_array($value) ? implode(',', $value) : $value;
- }
- /**
- * 选择管理员身份
- * @param int $level
- * @return array
- */
- public static function getRole($level = 0)
- {
- return self::where('status', 1)->where('level', $level)->column('role_name', 'id');
- }
- public static function getAllRule(string $module, $cachePrefix = self::ADMIN_RULES_ALL): array
- {
- static $auth = null;
- if (Cache::has($cachePrefix) && ($auth = Cache::get($cachePrefix)) && !self::$isCache) return $auth;
- $auth === null && ($auth = SystemMenus::where('module', $module)->where('rule', '<>', '')->column('rule', 'rule'));
- if (is_null($auth))
- $auth = [];
- else
- Cache::set($cachePrefix, $auth);
- return $auth;
- }
- /**
- * 获取当前管理员可访问的权限
- * @param $rules
- * @return array
- */
- public static function getRolesByAuthRule($module, $rules, $cachePrefix = self::ADMIN_RULES_LEVEL)
- {
- $cacheName = $cachePrefix . $rules;
- if (empty($rules)) return [];
- if (Cache::has($cacheName) && ($_auth = Cache::get($cacheName)) && !self::$isCache) return $_auth;
- $rules = self::where('id', 'IN', $rules)->where('status', '1')->column('rules', 'id');
- $rules = array_unique(explode(',', implode(',', $rules)));
- $_auth = SystemMenus::where('module', $module)->whereIn('id', $rules)->column('rule', 'rule');
- if (is_null($_auth))
- $_auth = [];
- else
- Cache::set($cacheName, $_auth);
- return $_auth;
- }
- public static function rolesByAuth($rules, $type = 1, $cachePrefix = self::ADMIN_RULES_LEVEL)
- {
- $cacheName = $cachePrefix . $rules . '_' . $type;
- if (empty($rules)) return [];
- if (Cache::has($cacheName) && ($_auth = Cache::get($cacheName)) && !self::$isCache) return $_auth;
- $rules = self::where('id', 'IN', $rules)->where('status', '1')->column('rules', 'id');
- $rules = array_unique(explode(',', implode(',', $rules)));
- $_auth = SystemMenus::all(function ($query) use ($rules, $type) {
- $query->where('id', 'IN', $rules)->where('type', $type)
- ->where('controller|action', '<>', '')
- ->field('module,controller,action,params');
- });
- $_auth = self::tidyAuth($_auth ?: []);
- if (count($_auth)) Cache::set($cacheName, $_auth);
- return $_auth;
- }
- public static function getAllAuth($type = 1, $cachePrefix = self::ADMIN_RULES_ALL)
- {
- $cachePrefix = $cachePrefix . $type;
- static $auth = null;
- $auth === null && ($auth = SystemMenus::where('api_url', '<>', '')->where('auth_type', $type)->column('api_url', 'methods'));
- return $auth;
- }
- /**
- * 获取所有权限
- * @param int $type
- * @param string $cachePrefix
- * @return mixed
- */
- public function getAllRuleAuth(int $type = 1, string $cachePrefix = self::ADMIN_RULES_ALL)
- {
- $cachePrefix = $cachePrefix . $type;
- return Cache::remember($cachePrefix, function () use ($type) {
- return SystemMenus::where('api_url', '<>', '')->where('auth_type', $type)->field(['api_url', 'methods'])->select()->toArray();
- });
- }
- /**
- * 获取指定权限
- * @param array $rules
- * @param int $type
- * @param string $cachePrefix
- * @return mixed
- */
- public function getRolesByAuth(array $rules, int $type = 1, string $cachePrefix = self::ADMIN_RULES_LEVEL)
- {
- if (empty($rules)) return [];
- $cacheName = $cachePrefix . '_' . $type;
- return Cache::remember($cacheName, function () use ($rules, $type) {
- return SystemMenus::whereIn('id', $this->getRoleIds($rules))->where('auth_type', $type)->field(['api_url', 'methods'])->select()->toArray();
- });
- }
- /**
- * 获取权限id
- * @param array $rules
- * @return array
- */
- public function getRoleIds(array $rules)
- {
- $rules = self::where('id', 'IN', $rules)->where('status', '1')->column('rules', 'id');
- return array_unique(explode(',', implode(',', $rules)));
- }
- protected static function tidyAuth($_auth)
- {
- $auth = [];
- foreach ($_auth as $k => $val) {
- $auth[] = SystemMenus::getAuthName($val['action'], $val['controller'], $val['module'], $val['params']);
- }
- return $auth;
- }
- public static function systemPage($where)
- {
- $model = new self;
- if (strlen(trim($where['role_name']))) $model = $model->where('role_name', 'LIKE', "%$where[role_name]%");
- if (strlen(trim($where['status']))) $model = $model->where('status', $where['status']);
- $model = $model->where('level', bcadd($where['level'], 1, 0));
- $model = $model->order('id desc');
- $count = $model->count();
- $list = $model->page((int)$where['page'], (int)$where['limit'])
- ->select()
- ->each((function ($item) {
- $item->rules = SystemMenus::where('id', 'IN', $item->rules)->column('menu_name', 'id');
- }));
- return compact('count', 'list');
- }
- }
|