// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\admin\controller; use cores\BaseController; use app\admin\service\admin\User as AdminUserService; use cores\exception\BaseException; use app\common\model\Channel; /** * 超管后台控制器基类 * Class Controller * @package app\admin\controller */ class Controller extends BaseController { // 商家登录信息 protected $admin; // 当前控制器名称 protected string $controller = ''; // 当前方法名称 protected string $action = ''; // 当前路由uri protected string $routeUri = ''; // 当前路由:分组名称 protected string $group = ''; // 登录验证白名单 protected array $allowAllAction = [ // 登录页面 'passport/login', ]; /** * 强制验证当前访问的控制器方法method * 例: [ 'login' => 'POST' ] * @var array */ protected array $methodRules = []; /** * 后台初始化 * @return void * @throws BaseException */ public function initialize() { // 设置管理员登录信息 $this->setAdminInfo(); // 当前路由信息 $this->getRouteinfo(); // 验证登录 $this->checkLogin(); // 强制验证当前访问的控制器方法method $this->checkMethodRules(); } /** * 获取当前用户的数据平台权限 * [getUserPlatform description] * @return [type] [description] */ public function getUserPlatform(){ if ($this->admin['user']['role'] == 1) { //京东账号可以看到京东和自营的 if (strpos($this->admin['user']['channel'], 'jd') !== false) { $list = Channel::where('status', 1)->whereIn('code',[$this->admin['user']['channel'],'zy'])->select(); //苏宁账号可以看到苏宁和自营的 } elseif(strpos($this->admin['user']['channel'], 'sn') !== false){ $list = Channel::where('status', 1)->whereIn('code',[$this->admin['user']['channel'],'zy'])->select(); //新阙通信账号可以看到新阙通信和自营的 } elseif($this->admin['user']['channel'] == 'xqtx'){ $list = Channel::where('status', 1)->whereIn('code',['xqtx','zy'])->select(); //其他账号供应商只能看到自己的 } else { $list = Channel::where('status', 1)->whereIn('code',[$this->admin['user']['channel']])->select(); } } else { //超级管理员看到所有的 $list = Channel::where('status', 1)->select(); } return $list; } /** * 获取用户添加和导入数据时的platform * [getUserAddPlatform description] * @return [type] [description] */ public function getUserAddPlatform(){ if ($this->admin['user']['role'] == 1) { if (in_array($this->admin['user']['channel'], ['jd','sn','xqtx'])) { return 'zy'; } else { return $this->admin['user']['channel']; } } else { return 'zy'; } } /** * 设置管理员登录信息 */ private function setAdminInfo() { $this->admin = AdminUserService::getLoginInfo(); } /** * 解析当前路由参数 (分组名称、控制器名称、方法名) */ protected function getRouteinfo() { // 控制器名称 $this->controller = uncamelize($this->request->controller()); // 方法名称 $this->action = $this->request->action(); // 控制器分组 (用于定义所属模块) $groupstr = strstr($this->controller, '.', true); $this->group = $groupstr !== false ? $groupstr : $this->controller; // 当前uri $this->routeUri = "{$this->controller}/$this->action"; } /** * 验证登录状态 * @return void * @throws BaseException */ private function checkLogin(): void { // 验证当前请求是否在白名单 if (in_array($this->routeUri, $this->allowAllAction)) { return; } // 验证登录状态 if (empty($this->admin) || (int)$this->admin['is_login'] !== 1) { throwError('请先登录后再访问', config('status.not_logged')); } } /** * 强制验证当前访问的控制器方法method * @throws BaseException */ private function checkMethodRules(): void { if (!isset($this->methodRules[$this->action])) { return; } $methodRule = $this->methodRules[$this->action]; $currentMethod = $this->request->method(); if (empty($methodRule)) { return; } if (is_array($methodRule) && in_array($currentMethod, $methodRule)) { return; } if (is_string($methodRule) && $methodRule == $currentMethod) { return; } throwError('illegal request method'); } }