|
|
|
@ -6,6 +6,9 @@ namespace app; |
|
|
|
use think\App; |
|
|
|
use think\exception\ValidateException; |
|
|
|
use think\Validate; |
|
|
|
use think\facade\View; |
|
|
|
use think\facade\Config; |
|
|
|
use think\facade\Request; |
|
|
|
|
|
|
|
/** |
|
|
|
* 控制器基础类 |
|
|
|
@ -36,6 +39,33 @@ abstract class BaseController |
|
|
|
*/ |
|
|
|
protected $middleware = []; |
|
|
|
|
|
|
|
/* @var array $admin 商家登录信息 */ |
|
|
|
protected $admin; |
|
|
|
|
|
|
|
/* @var string $route 当前控制器名称 */ |
|
|
|
protected $controller = ''; |
|
|
|
|
|
|
|
/* @var string $route 当前方法名称 */ |
|
|
|
protected $action = ''; |
|
|
|
|
|
|
|
/* @var string $route 当前路由uri */ |
|
|
|
protected $routeUri = ''; |
|
|
|
|
|
|
|
/* @var string $route 当前路由:分组名称 */ |
|
|
|
protected $group = ''; |
|
|
|
|
|
|
|
/* @var array $allowAllAction 登录验证白名单 */ |
|
|
|
protected $allowAllAction = [ |
|
|
|
// 登录页面 |
|
|
|
'passport/login', |
|
|
|
]; |
|
|
|
|
|
|
|
/* @var array $notLayoutAction 无需全局layout */ |
|
|
|
protected $notLayoutAction = [ |
|
|
|
// 登录页面 |
|
|
|
'passport/login', |
|
|
|
]; |
|
|
|
|
|
|
|
/** |
|
|
|
* 构造方法 |
|
|
|
* @access public |
|
|
|
@ -48,6 +78,28 @@ abstract class BaseController |
|
|
|
|
|
|
|
// 控制器初始化 |
|
|
|
$this->initialize(); |
|
|
|
// 全局layout |
|
|
|
$this->layout(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 全局layout模板输出 |
|
|
|
* @throws \Exception |
|
|
|
*/ |
|
|
|
private function layout() |
|
|
|
{ |
|
|
|
// 验证当前请求是否在白名单 |
|
|
|
if (!in_array($this->routeUri, $this->notLayoutAction)) { |
|
|
|
// 输出到view |
|
|
|
View::assign([ |
|
|
|
'base_url' => base_url(), // 当前域名 |
|
|
|
'admin_url' => url('/admin'), // 后台模块url |
|
|
|
'group' => $this->group, |
|
|
|
'menus' => $this->menus(), // 后台菜单 |
|
|
|
'admin' => $this->admin, // 商家登录信息 |
|
|
|
'request' => Request::instance() // Request对象 |
|
|
|
]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 初始化 |
|
|
|
@ -91,4 +143,62 @@ abstract class BaseController |
|
|
|
return $v->failException(true)->check($data); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 解析当前路由参数 (分组名称、控制器名称、方法名) |
|
|
|
*/ |
|
|
|
protected function getRouteinfo() |
|
|
|
{ |
|
|
|
// 控制器名称 |
|
|
|
$this->controller = toUnderScore($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 array |
|
|
|
*/ |
|
|
|
private function menus() |
|
|
|
{ |
|
|
|
foreach ($data = Config::get('menus') as $group => $first) { |
|
|
|
$data[$group]['active'] = $group === $this->group; |
|
|
|
// 遍历:二级菜单 |
|
|
|
if (isset($first['submenu'])) { |
|
|
|
foreach ($first['submenu'] as $secondKey => $second) { |
|
|
|
// 二级菜单所有uri |
|
|
|
$secondUris = isset($second['uris']) ? $second['uris'] : [$second['index']]; |
|
|
|
// 二级菜单:active |
|
|
|
!isset($data[$group]['submenu'][$secondKey]['active']) |
|
|
|
&& $data[$group]['submenu'][$secondKey]['active'] = in_array($this->routeUri, $secondUris); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return $data; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 验证登录状态 |
|
|
|
* @return bool |
|
|
|
*/ |
|
|
|
private function checkLogin() |
|
|
|
{ |
|
|
|
// 验证当前请求是否在白名单 |
|
|
|
if (in_array($this->routeUri, $this->allowAllAction)) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
// 验证登录状态 |
|
|
|
if (empty($this->admin) |
|
|
|
|| (int)$this->admin['is_login'] !== 1 |
|
|
|
) { |
|
|
|
$this->redirect('passport/login'); |
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|