diff --git a/src/applet/app/controllers/ControllerBase.php b/src/applet/app/controllers/ControllerBase.php new file mode 100644 index 0000000..6c62c03 --- /dev/null +++ b/src/applet/app/controllers/ControllerBase.php @@ -0,0 +1,253 @@ +request->isOptions() && (header('HTTP/2.0 204 NO CONTENT') || die); + + // 只允许POST的操作 + if (!$this->request->isPost() && $this->postAction && in_array($this->dispatcher->getActionName(), $this->postAction)) { + die(); + } + } + + public function output($code = 0, $msg = null, $data = null) + { + throw new \Exception($msg, $code); + } + + public function beforeExecuteRoute() + { + if (in_array($_SERVER["REQUEST_URI"], ICommon::WHITE_URL)) { + $this->userInfo = []; + return true; + } + } + + public function afterExecuteRoute() + { + + } + + + /** + * 初始化信息 + */ + public function initialize() + { + $this->limit(); + $this->offset(); + } + + public function getRawData($useArray = false) + { + $res = !$this->request->isPost() && !$this->request->isPut() && $this->request->isPatch() && !$this->request->isDelete() ? $this->api(Msg::ErrNotFound) : json_decode(file_get_contents('php://input'), $useArray); + + // return $res ?? $this->api(Msg::ErrInvalidArgument); + return $res ?? []; + } + + /** + * 输出信息并退出程序 + * @param mixed $data + * @param int $count + * @param bool $urlDecodeFlag + */ + public function api($data = Msg::Suc, $count = null, $urlDecodeFlag = false) + { + $preContent = ob_get_contents(); + $preContent && die; + $data === true && $data = Msg::Suc; + $data === false && $data = Msg::ErrFailure; + $res = is_array($data) && isset($data['statusCode'], $data['code'], $data['msg']) ? [ + 'code' => $data['code'], + 'msg' => $data['msg'], + 'data' => [], + ] : ['code' => 0, 'msg' => '', 'data' => $data]; + $count !== null && ($res['count'] = $count); + header('Content-type:application/json;charset=utf-8'); + is_array($data) && isset($data['statusCode']) && header('HTTP/2.0 ' . $data['statusCode']); + die($urlDecodeFlag ? urldecode(json_encode($res, 320)) : json_encode($res, 320)); + } + + + /** + * 重定向uri + * @param string $uri 'controller/action' + */ + protected function forward($uri) + { + $uriParts = explode('/', $uri); + $params = array_slice($uriParts, 2); + $this->dispatcher->forward(['controller' => $uriParts[0], 'action' => $uriParts[1], 'params' => $params,]); + } + + /** + * filter $_GET request + * @param int $setLimit + * @return array + */ + protected function getQuery($setLimit = 0) + { + $get = $this->request->getQuery(); + unset($get['_url']); + $data = []; + foreach ($get as $k => $v) { + $k = htmlspecialchars($k); + $v = htmlspecialchars($v); + $data[$k] = $v; + } + + if ($setLimit) { + $data['limit'] = $data['limit'] ?? $this->limit; + $data['limit'] > 1000 && $data['limit'] = 1000; + } + return $data; + } + + /** + * 过滤字符串 + * @param $str + * @return mixed + */ + protected function _trim($str) + { + return trim(preg_replace('/^ +| +$/ ', ' ', preg_replace('/( | |\r\n|\r|\n)+/', ' ', $str))); + } + + + /** + * [返回每页条数] + * @return [type] [description] + */ + public function limit() + { + if ($this->request->isPost()) { + $pageNum = $this->getRawData('limit')['limit'] ?? ''; + } else { + $pageNum = $this->request->get('limit'); + } + if (!empty($pageNum)) { + $this->limit = $pageNum; + } + } + + /** + * [返回偏移量] + * @return [type] [description] + */ + public function offset() + { + if ($this->request->isPost()) { + $page = $this->getRawData('p')['p'] ?? ''; + } else { + $page = $this->request->get('p'); + } + + if (!empty($page)) { + $this->offset = ($page - 1) * $this->limit; + } + } + + /** + * 记录日志 + * @param $msg + * @param string $name + * @param bool $mode + */ + public function logger($msg, $name = 'debug', $mode = false) + { + //开启了debug模式才记录日志 + if (DEBUG) { + $time = time(); + if (file_exists(DIR_LOG)) { + $path = DIR_LOG . date('Y_m_d', $time) . '_' . $name . '.log'; + $logger = new Logger('messages', ['main' => new Stream($path),]); + $msg = is_array($msg) ? json_encode($msg, 320) : $msg; + $ip = Common::getRealIP() ? Common::getRealIP() : ' IP NULL '; + $msg = $ip . ' ' . $msg; + $logger->debug($msg); + } else { + if ($mode) { + return; + } + @mkdir(DIR_LOG, 0755, true); + $this->logger($msg, $name, true); + } + } + } + + + /** + * [校验参数] + * @param [type] $key [description] + * @param [type] $args [description] + * @return [type] [description] + */ + protected function checkParams($argsKey, $args) + { + if (empty($args)) { + $this->api(Msg::ErrParameterCannotBeNull); + } + + if (empty($argsKey)) { + $this->api(Msg::NewError(400, 'check params value is null')); + } + + + foreach ($argsKey as $key => $value) { + if (!array_key_exists($key, $args)) { + $this->api(Msg::NewError(400, '【' . $key . '】 not null')); + } else { + switch ($value) { + case 'array': + if (!is_array($args[$key])) { + $this->api(Msg::NewError(400, '【' . $key . '】 not object')); + } + break; + + case 'numeric': + if (!is_numeric($args[$key])) { + $this->api(Msg::NewError(400, '【' . $key . '】 not numeric')); + } + break; + + default: + if (!is_string($args[$key])) { + $this->api(Msg::NewError(400, '【' . $key . '】 not string')); + } + break; + } + } + } + } + +} \ No newline at end of file