<?php
// +----------------------------------------------------------------------
// | likeshop开源商城系统
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | gitee下载:https://gitee.com/likeshop_gitee
// | github下载:https://github.com/likeshop-github
// | 访问官网:https://www.likeshop.cn
// | 访问社区:https://home.likeshop.cn
// | 访问手册:http://doc.likeshop.cn
// | 微信公众号:likeshop技术社区
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
// | 禁止对系统程序代码以任何目的,任何形式的再发布
// | likeshop团队版权所有并拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeshop.cn.team
// +----------------------------------------------------------------------

namespace app\common\basics;


use app\admin\server\AuthServer;
use app\common\server\ConfigServer;
use app\common\server\UrlServer;
use app\common\utils\Time;
use think\App;
use think\Controller;
use think\exception\HttpResponseException;
use think\facade\Config;
use think\facade\Debug;
use think\facade\View;
use think\Response;
use app\common\model\system\SystemLog;

/**
 * 后台基类
 * Class AdminBase
 * @Author FZR
 * @package app\common\basics
 */
abstract class AdminBase
{
    /**
     * Request实例
     */
    protected $request;

    /**
     * 应用实例
     */
    protected $app;

    /**
     * 管理员ID
     * @var null
     */
    protected $adminId = null;

    /**
     * 管理员信息
     * @var null
     */
    protected $adminUser = null;

    /**
     * 逻辑
     * @var
     */
    protected $logic;

    /**
     * 验证器
     * @var
     */
    protected $validate;

    /**
     * 不需要登录的方法
     * @var array
     */
    public $like_not_need_login = [];

    /**
     * js数据
     * @var array
     */
    protected $js_data = [];

    /**
     * 分页
     * @var int
     */
    public $page_no = 1;
    public $page_size = 15;

    /**
     * 模板颜色
     * @var string
     */
    public $view_theme_color = '';



    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct(App $app)
    {
        $this->app     = $app;
        $this->request = $this->app->request;

        // 控制器初始化
        $this->initialize();
    }

    /**
     * 初始化
     */
    protected function initialize()
    {
        //默认设置参数
        $this->initConfig();

        //验证登录
        $this->checkLogin();

        //验证权限
        $this->checkAuth();

        //默认页面参数
        $this->setViewValue();

        // 系统日志
        $this->log();

        return true;
    }


    //系统日志
    protected function log()
    {
        if(request()->action() != 'login') {
            $data = [
                'admin_id' => $this->adminId,
                'name' => $this->adminUser['name'],
                'account' => $this->adminUser['account'],
                'create_time' => time(),
                'uri' => request()->baseUrl(),
                'type' => request()->method(),
                'param' => json_encode(request()->param(),JSON_UNESCAPED_UNICODE),
                'ip' => request()->ip()
            ];
            SystemLog::create($data);
        }
    }


    /**
     * Notes: 基础配置参数
     * @author 段誉(2021/4/9 14:18)
     */
    protected function initConfig()
    {
        $this->adminUser = session('admin_info');
        $this->adminId = session('admin_info.id');
        //分页参数
        $page_no = (int)$this->request->get('page_no');
        $this->page_no = $page_no && is_numeric($page_no) ? $page_no : $this->page_no;
        $page_size = (int)$this->request->get('page_size');
        $this->page_size = $page_size && is_numeric($page_size) ? $page_size : $this->page_size;
        $this->page_size = min($this->page_size, 100);
    }


    /**
     * 设置视图全局变量
     */
    private function setViewValue()
    {
        $app = Config::get('project');
        View::assign([
            'view_env_name'     => $app['env_name'],
            'view_admin_name'   => $app['admin_name'],
            'view_theme_color'  => $app['theme_color'],
            'view_theme_button' => $app['theme_button'],
            'front_version'     => $app['front_version'],
            'version'           => $app['version'],
            'dateTime'          => Time::getTime(),
            'storageUrl'        => UrlServer::getFileUrl('/'),
            'company_name'      => ConfigServer::get('copyright', 'company_name')
        ]);
        $this->assignJs('image_upload_url', '');
    }


    /**
     * Notes: 检查登录
     * @author 段誉(2021/4/9 14:05)
     * @return bool
     */
    protected function checkLogin()
    {
        //已登录的访问登录页
        if ($this->adminUser && !$this->isNotNeedLogin()) {
            return true;
        }

        //已登录的访问非登录页
        if ($this->adminUser && $this->isNotNeedLogin()) {
            $this->redirect(url('index/index'));
        }

        //未登录的访问非登录页
        if (!$this->adminUser && $this->isNotNeedLogin()) {
            return true;
        }

        //未登录访问登录页
        $this->redirect(url('login/login'));
    }


    /**
     * Notes: 验证登录角色权限
     * @author 段誉(2021/4/13 11:34)
     * @return bool
     */
    protected function checkAuth()
    {
        //未登录的无需权限控制
        if (empty(session('admin_info'))) {
            return true;
        }

        //如果id为1,视为系统超级管理,无需权限控制
        if (session('admin_info.id') == 1) {
            return true;
        }

        //权限控制判断
        $controller_action = request()->controller() . '/' . request()->action();// 当前访问
        $controller_action = strtolower($controller_action);

        //没有的权限
        $none_auth = AuthServer::getRoleNoneAuthUris(session('admin_info.role_id'));
        if (empty($none_auth) || !in_array($controller_action, $none_auth)) {
            //通过权限控制
            return true;
        }

        $this->redirect(url('dispatch/dispatch_error',['msg' => '权限不足,无法访问']));
        return false;
    }


    /**
     * Notes: js
     * @param $name
     * @param $value
     * @author 段誉(2021/4/9 14:23)
     */
    protected function assignJs($name, $value)
    {
        $this->js_data[$name] = $value;
        $js_code = "<script>";
        foreach ($this->js_data as $name => $value) {
            if (is_array($value)) {
                $value = json_encode($value);
            } elseif (!is_integer($value)) {
                $value = '"' . $value . '"';
            }
            $js_code .= $name . '=' . $value . ';';
        }
        $js_code .= "</script>";
        View::assign('js_code', $js_code);
    }


    /**
     * Notes: 是否无需登录
     * @author 段誉(2021/4/9 14:03)
     * @return bool
     */
    private function isNotNeedLogin()
    {
        if (empty($this->like_not_need_login)) {
            return false;
        }
        $action = strtolower(request()->action());
        $data = array_map('strtolower', $this->like_not_need_login);
        if (!in_array($action, $data)) {
            return false;
        }
        return true;
    }


    /**
     * Notes: 自定义重定向
     * @param mixed ...$args
     * @author 段誉(2021/4/9 14:04)
     */
    public function redirect(...$args)
    {
        throw new HttpResponseException(redirect(...$args));
    }



}