|  | @@ -65,6 +65,11 @@ class Api
 | 
											
												
													
														|  |      protected $responseType = 'json';
 |  |      protected $responseType = 'json';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | 
 |  | +     * @var int 日志类型 1 文件;2sql
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    public $logType = 1;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  |       * 构造方法
 |  |       * 构造方法
 | 
											
												
													
														|  |       * @access public
 |  |       * @access public
 | 
											
												
													
														|  |       * @param Request $request Request 对象
 |  |       * @param Request $request Request 对象
 | 
											
										
											
												
													
														|  | @@ -73,8 +78,22 @@ class Api
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          $this->request = is_null($request) ? Request::instance() : $request;
 |  |          $this->request = is_null($request) ? Request::instance() : $request;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +        if(config('site.apisite_switch') == 0){
 | 
											
												
													
														|  | 
 |  | +            $controllername = $this->request->controller();
 | 
											
												
													
														|  | 
 |  | +            $controllername = strtolower($controllername);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            if(!in_array($controllername,['notify','easemob','payios'])){
 | 
											
												
													
														|  | 
 |  | +                $notice = config('site.apisite_notice') ?: '全站维护中';
 | 
											
												
													
														|  | 
 |  | +                $this->error($notice);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |          // 控制器初始化
 |  |          // 控制器初始化
 | 
											
												
													
														|  |          $this->_initialize();
 |  |          $this->_initialize();
 | 
											
												
													
														|  | 
 |  | +        //日志
 | 
											
												
													
														|  | 
 |  | +        $this->request_log();
 | 
											
												
													
														|  | 
 |  | +        //用户活跃
 | 
											
												
													
														|  | 
 |  | +        $this->user_active();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          // 前置操作方法
 |  |          // 前置操作方法
 | 
											
												
													
														|  |          if ($this->beforeActionList) {
 |  |          if ($this->beforeActionList) {
 | 
											
										
											
												
													
														|  | @@ -122,16 +141,20 @@ class Api
 | 
											
												
													
														|  |                  $this->error(__('Please login first'), null, 401);
 |  |                  $this->error(__('Please login first'), null, 401);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |              // 判断是否需要验证权限
 |  |              // 判断是否需要验证权限
 | 
											
												
													
														|  | -            if (!$this->auth->match($this->noNeedRight)) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +            /*if (!$this->auth->match($this->noNeedRight)) {
 | 
											
												
													
														|  |                  // 判断控制器和方法判断是否有对应权限
 |  |                  // 判断控制器和方法判断是否有对应权限
 | 
											
												
													
														|  |                  if (!$this->auth->check($path)) {
 |  |                  if (!$this->auth->check($path)) {
 | 
											
												
													
														|  |                      $this->error(__('You have no permission'), null, 403);
 |  |                      $this->error(__('You have no permission'), null, 403);
 | 
											
												
													
														|  |                  }
 |  |                  }
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | 
 |  | +            }*/
 | 
											
												
													
														|  |          } else {
 |  |          } else {
 | 
											
												
													
														|  |              // 如果有传递token才验证是否登录状态
 |  |              // 如果有传递token才验证是否登录状态
 | 
											
												
													
														|  |              if ($token) {
 |  |              if ($token) {
 | 
											
												
													
														|  |                  $this->auth->init($token);
 |  |                  $this->auth->init($token);
 | 
											
												
													
														|  | 
 |  | +                //传就必须传对
 | 
											
												
													
														|  | 
 |  | +                if (!$this->auth->isLogin()) {
 | 
											
												
													
														|  | 
 |  | +                    $this->error(__('Please login first'), null, 401);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -169,6 +192,12 @@ class Api
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      protected function success($msg = '', $data = null, $code = 1, $type = null, array $header = [])
 |  |      protected function success($msg = '', $data = null, $code = 1, $type = null, array $header = [])
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | 
 |  | +        if($msg == 1){
 | 
											
												
													
														|  | 
 |  | +            $msg = 'success';
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        if(empty($msg)){
 | 
											
												
													
														|  | 
 |  | +            $msg = '操作成功';
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |          $this->result($msg, $data, $code, $type, $header);
 |  |          $this->result($msg, $data, $code, $type, $header);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -182,6 +211,9 @@ class Api
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      protected function error($msg = '', $data = null, $code = 0, $type = null, array $header = [])
 |  |      protected function error($msg = '', $data = null, $code = 0, $type = null, array $header = [])
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | 
 |  | +        if(empty($msg)){
 | 
											
												
													
														|  | 
 |  | +            $msg = __('Invalid parameters');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |          $this->result($msg, $data, $code, $type, $header);
 |  |          $this->result($msg, $data, $code, $type, $header);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -204,6 +236,10 @@ class Api
 | 
											
												
													
														|  |              'time' => Request::instance()->server('REQUEST_TIME'),
 |  |              'time' => Request::instance()->server('REQUEST_TIME'),
 | 
											
												
													
														|  |              'data' => $data,
 |  |              'data' => $data,
 | 
											
												
													
														|  |          ];
 |  |          ];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        //日志
 | 
											
												
													
														|  | 
 |  | +        $this->request_log_update($result);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |          // 如果未设置类型则使用默认类型判断
 |  |          // 如果未设置类型则使用默认类型判断
 | 
											
												
													
														|  |          $type = $type ? : $this->responseType;
 |  |          $type = $type ? : $this->responseType;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -327,4 +363,197 @@ class Api
 | 
											
												
													
														|  |          //刷新Token
 |  |          //刷新Token
 | 
											
												
													
														|  |          $this->request->token();
 |  |          $this->request->token();
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * 接口请求限制
 | 
											
												
													
														|  | 
 |  | +     * @param int $apiLimit
 | 
											
												
													
														|  | 
 |  | +     * @param int $apiLimitTime
 | 
											
												
													
														|  | 
 |  | +     * @param string $key
 | 
											
												
													
														|  | 
 |  | +     * @return bool | true:通过 false:拒绝
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    public function apiLimit($apiLimit = 1, $apiLimitTime = 1000, $key = '')
 | 
											
												
													
														|  | 
 |  | +    {
 | 
											
												
													
														|  | 
 |  | +        $userId = $this->auth->id;
 | 
											
												
													
														|  | 
 |  | +        $controller = request()->controller();
 | 
											
												
													
														|  | 
 |  | +        $action = request()->action();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (!$key) {
 | 
											
												
													
														|  | 
 |  | +            $key = strtolower($controller) . '_' . strtolower($action) . '_' . $userId;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        $redis = new Redis();
 | 
											
												
													
														|  | 
 |  | +        $redisconfig = config("redis");
 | 
											
												
													
														|  | 
 |  | +        $redis->connect($redisconfig["host"], $redisconfig["port"]);
 | 
											
												
													
														|  | 
 |  | +        if ($redisconfig['redis_pwd']) {
 | 
											
												
													
														|  | 
 |  | +            $redis->auth($redisconfig['redis_pwd']);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        if($redisconfig['redis_selectdb'] > 0){
 | 
											
												
													
														|  | 
 |  | +            $redis->select($redisconfig['redis_selectdb']);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        //
 | 
											
												
													
														|  | 
 |  | +        //指定键值新增+1 并获取
 | 
											
												
													
														|  | 
 |  | +        $count = $redis->incr($key);
 | 
											
												
													
														|  | 
 |  | +        if ($count > $apiLimit) {
 | 
											
												
													
														|  | 
 |  | +            return false;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        //设置过期时间
 | 
											
												
													
														|  | 
 |  | +        if ($count == 1) {
 | 
											
												
													
														|  | 
 |  | +            $redis->pExpire($key, $apiLimitTime);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        return true;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    /*
 | 
											
												
													
														|  | 
 |  | +     * api 请求日志
 | 
											
												
													
														|  | 
 |  | +     * */
 | 
											
												
													
														|  | 
 |  | +    protected function request_log(){
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        //api_request_log
 | 
											
												
													
														|  | 
 |  | +        $modulename     = $this->request->module();
 | 
											
												
													
														|  | 
 |  | +        $controllername = $this->request->controller();
 | 
											
												
													
														|  | 
 |  | +        $actionname     = $this->request->action();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if(strtolower($actionname) == 'callback'){
 | 
											
												
													
														|  | 
 |  | +            return true;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        defined('API_REQUEST_LOG_TYPE') or define('API_REQUEST_LOG_TYPE', $this->logType);
 | 
											
												
													
														|  | 
 |  | +        $params = $this->request->request();
 | 
											
												
													
														|  | 
 |  | +        if ($this->logType === 1){
 | 
											
												
													
														|  | 
 |  | +            //日志统一写入
 | 
											
												
													
														|  | 
 |  | +            register_shutdown_function([new LogUtil, 'close']);
 | 
											
												
													
														|  | 
 |  | +            LogUtil::getInstance('Api/'); //设置日志存入通道
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            LogUtil::info('uid', 'Api-Middleware-Log', 'request_log', $this->auth->id);
 | 
											
												
													
														|  | 
 |  | +            LogUtil::info('url', 'Api-Middleware-Log', 'request_log', $modulename . '/' . $controllername . '/' . $actionname);
 | 
											
												
													
														|  | 
 |  | +            LogUtil::info('params', 'Api-Middleware-Log', 'request_log', $params);
 | 
											
												
													
														|  | 
 |  | +            LogUtil::info('ip', 'Api-Middleware-Log', 'request_log', request()->ip());
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        }else{
 | 
											
												
													
														|  | 
 |  | +            $data = [
 | 
											
												
													
														|  | 
 |  | +                'uid'   => $this->auth->id,
 | 
											
												
													
														|  | 
 |  | +                'api'   => $modulename.'/'.$controllername.'/'.$actionname,
 | 
											
												
													
														|  | 
 |  | +                'params' => json_encode($params),
 | 
											
												
													
														|  | 
 |  | +                'addtime'  => time(),
 | 
											
												
													
														|  | 
 |  | +                'adddatetime'  => date('Y-m-d H:i:s'),
 | 
											
												
													
														|  | 
 |  | +                'ip'   => request()->ip(),
 | 
											
												
													
														|  | 
 |  | +            ];
 | 
											
												
													
														|  | 
 |  | +            $request_id = db('api_request_log')->insertGetId($data);
 | 
											
												
													
														|  | 
 |  | +            defined('API_REQUEST_ID') or define('API_REQUEST_ID', $request_id);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    protected function request_log_update($log_result){
 | 
											
												
													
														|  | 
 |  | +        $actionname     = $this->request->action();
 | 
											
												
													
														|  | 
 |  | +        if(strtolower($actionname) == 'givegifttoyou'){
 | 
											
												
													
														|  | 
 |  | +            //return true;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if ($this->logType === 1){
 | 
											
												
													
														|  | 
 |  | +            if (strlen(json_encode($log_result['data'])) > 1000) {
 | 
											
												
													
														|  | 
 |  | +                $log_result['data'] = '数据太多,不记录';
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            LogUtil::info('result', 'Api-Middleware-Log', 'request_log', $log_result);
 | 
											
												
													
														|  | 
 |  | +        }else{
 | 
											
												
													
														|  | 
 |  | +            if(defined('API_REQUEST_ID')) { //记录app正常返回结果
 | 
											
												
													
														|  | 
 |  | +                if(strlen(json_encode($log_result['data'])) > 1000) {
 | 
											
												
													
														|  | 
 |  | +                    $log_result['data'] = '数据太多,不记录';
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +                db('api_request_log')->where('id',API_REQUEST_ID)->update(['result'=>json_encode($log_result)]);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //更新用户活跃
 | 
											
												
													
														|  | 
 |  | +    protected function user_active(){
 | 
											
												
													
														|  | 
 |  | +        if($this->auth->isLogin()){
 | 
											
												
													
														|  | 
 |  | +            db('user_active')->where('user_id',$this->auth->id)->update(['requesttime'=>time()]);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //获取用户是否活跃,7200秒,2小时
 | 
											
												
													
														|  | 
 |  | +    //1活跃,0不活跃
 | 
											
												
													
														|  | 
 |  | +    protected function user_activeinfo($user_id,$requesttime = 0){
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if(empty($requesttime)){
 | 
											
												
													
														|  | 
 |  | +            $requesttime = db('user_active')->where('user_id',$user_id)->value('requesttime');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        $result = [
 | 
											
												
													
														|  | 
 |  | +            'is_active' => 1,
 | 
											
												
													
														|  | 
 |  | +            'active_text' => get_last_time($requesttime).'在线',
 | 
											
												
													
														|  | 
 |  | +        ];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if(time() - $requesttime > 7200){
 | 
											
												
													
														|  | 
 |  | +            $result = [
 | 
											
												
													
														|  | 
 |  | +                'is_active' => 0,
 | 
											
												
													
														|  | 
 |  | +                'active_text' => '离线',
 | 
											
												
													
														|  | 
 |  | +            ];
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        return $result;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //获取用户是否vip,1是,0否
 | 
											
												
													
														|  | 
 |  | +    protected function is_vip($user_id){
 | 
											
												
													
														|  | 
 |  | +        $result = 0;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        $vip_endtime = db('user_wallet')->where('user_id',$user_id)->value('vip_endtime');
 | 
											
												
													
														|  | 
 |  | +        $result = $vip_endtime > time() ? 1 : 0;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        return $result;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //用户是否有某项权限
 | 
											
												
													
														|  | 
 |  | +    //1有,0没有
 | 
											
												
													
														|  | 
 |  | +    protected function user_power($user_id,$power = ''){
 | 
											
												
													
														|  | 
 |  | +        $is_vip = $this->is_vip($user_id);
 | 
											
												
													
														|  | 
 |  | +        if($is_vip != 1){
 | 
											
												
													
														|  | 
 |  | +            return 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        $power = db('user_power')->where('user_id',$user_id)->value($power);
 | 
											
												
													
														|  | 
 |  | +        return $power;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //是否关注
 | 
											
												
													
														|  | 
 |  | +    protected function is_follow($uid,$follow_uid){
 | 
											
												
													
														|  | 
 |  | +        $where = [
 | 
											
												
													
														|  | 
 |  | +            'uid' => $uid,
 | 
											
												
													
														|  | 
 |  | +            'follow_uid' => $follow_uid,
 | 
											
												
													
														|  | 
 |  | +        ];
 | 
											
												
													
														|  | 
 |  | +        $check = db('user_follow')->where($where)->find();
 | 
											
												
													
														|  | 
 |  | +        if($check){
 | 
											
												
													
														|  | 
 |  | +            return 1;
 | 
											
												
													
														|  | 
 |  | +        }else{
 | 
											
												
													
														|  | 
 |  | +            return 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //是否拉黑
 | 
											
												
													
														|  | 
 |  | +    protected function is_black($uid,$black_user_id){
 | 
											
												
													
														|  | 
 |  | +        $where = [
 | 
											
												
													
														|  | 
 |  | +            'user_id' => $uid,
 | 
											
												
													
														|  | 
 |  | +            'black_user_id' => $black_user_id,
 | 
											
												
													
														|  | 
 |  | +        ];
 | 
											
												
													
														|  | 
 |  | +        $check = db('user_blacklist')->where($where)->find();
 | 
											
												
													
														|  | 
 |  | +        if($check){
 | 
											
												
													
														|  | 
 |  | +            return 1;
 | 
											
												
													
														|  | 
 |  | +        }else{
 | 
											
												
													
														|  | 
 |  | +            return 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //是否好友
 | 
											
												
													
														|  | 
 |  | +    protected function is_friend($uid,$follow_uid){
 | 
											
												
													
														|  | 
 |  | +        $is_follow = $this->is_follow($uid,$follow_uid);
 | 
											
												
													
														|  | 
 |  | +        $be_follow = $this->is_follow($follow_uid,$uid);
 | 
											
												
													
														|  | 
 |  | +        if($is_follow && $be_follow){
 | 
											
												
													
														|  | 
 |  | +            return 1;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        return 0;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  }
 |  |  }
 |