From 7f92b0e07a8d35ac82478fa54318ab7271a751d9 Mon Sep 17 00:00:00 2001 From: augushong Date: Mon, 10 Mar 2025 18:06:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=85=BC=E5=AE=B9=E6=8E=A5=E5=8F=A3=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .example.env | 1 + config/app.php | 2 + extend/base/BaseControllerBase.php | 2 +- .../admin/controller/system/AdminBase.php | 2 +- .../common/controller/AdminControllerBase.php | 86 +++++++++++++++++-- extend/base/common/provider/RequestBase.php | 35 ++++++++ 6 files changed, 119 insertions(+), 9 deletions(-) diff --git a/.example.env b/.example.env index 4a98ed5..328aca0 100644 --- a/.example.env +++ b/.example.env @@ -3,6 +3,7 @@ APP_DEBUG=true [APP] DEFAULT_TIMEZONE=Asia/Shanghai AUTO_CACHE_LOG=false +AUTO_PARSE_API=true [DATABASE] TYPE=mysql diff --git a/config/app.php b/config/app.php index 5348568..108678b 100644 --- a/config/app.php +++ b/config/app.php @@ -43,4 +43,6 @@ return [ 'show_error_msg' => false, // 静态资源上传到OSS前缀 'oss_static_prefix' => Env::get('adminsystem.oss_static_prefix', 'static_ulthon_admin'), + // 自动兼容接口响应 + 'auto_parse_api' => Env::get('app.auto_parse_api', true), ]; diff --git a/extend/base/BaseControllerBase.php b/extend/base/BaseControllerBase.php index 5697543..5aa0caf 100644 --- a/extend/base/BaseControllerBase.php +++ b/extend/base/BaseControllerBase.php @@ -17,7 +17,7 @@ abstract class BaseControllerBase { /** * Request实例. - * @var \think\Request + * @var \app\common\provider\Request */ protected $request; diff --git a/extend/base/admin/controller/system/AdminBase.php b/extend/base/admin/controller/system/AdminBase.php index 23224dc..dacd721 100644 --- a/extend/base/admin/controller/system/AdminBase.php +++ b/extend/base/admin/controller/system/AdminBase.php @@ -44,7 +44,7 @@ class AdminBase extends AdminController */ public function index() { - if ($this->request->isAjax()) { + if ($this->request->isJson()) { if (input('selectFields')) { return $this->selectList(); } diff --git a/extend/base/common/controller/AdminControllerBase.php b/extend/base/common/controller/AdminControllerBase.php index 430af08..31171a2 100644 --- a/extend/base/common/controller/AdminControllerBase.php +++ b/extend/base/common/controller/AdminControllerBase.php @@ -6,9 +6,11 @@ use app\admin\model\SystemAdmin; use app\BaseController; use app\common\constants\AdminConstant; use app\common\service\AuthService; +use think\facade\Config; use think\facade\Env; use think\facade\View; use think\Model; +use think\response\Json; use think\template\exception\TemplateNotFoundException; use think\Validate; @@ -86,6 +88,8 @@ class AdminControllerBase extends BaseController */ private $dataBrage = []; + private $internalDataFields = []; + protected $validateRule = null; protected $validateMessage = []; @@ -140,8 +144,23 @@ class AdminControllerBase extends BaseController */ public function assign($name, $value = null, $isAppendToDataBrage = false, $forceObject = false) { - if ($isAppendToDataBrage) { - $this->setDataBrage($name, $value, $forceObject); + if (is_array($name)) { + $forceObject = $isAppendToDataBrage; + $isAppendToDataBrage = $value; + + if ($isAppendToDataBrage === true) { + foreach ($name as $k => $v) { + $this->setDataBrage($k, $v, $forceObject); + } + } elseif ($isAppendToDataBrage === -1) { + $this->internalDataFields = array_merge($this->internalDataFields, array_keys($name)); + } + } else { + if ($isAppendToDataBrage === true) { + $this->setDataBrage($name, $value, $forceObject); + } elseif ($isAppendToDataBrage === -1) { + $this->internalDataFields[] = $name; + } } return $this->app->view->assign($name, $value); @@ -181,8 +200,7 @@ class AdminControllerBase extends BaseController public function fetch($template = '', $vars = []) { $this->assign('data_brage', json_encode($this->dataBrage)); - - $vars['content_js'] = $this->fetchJS($template); + $this->assign('content_js', $this->fetchJS($template), -1); $content_main = View::layout($this->layout) ->config([ @@ -191,10 +209,56 @@ class AdminControllerBase extends BaseController $html = ''; $html .= $content_main; + if ($this->checkParseApi()) { + $data = $this->parseInternalDataFields(View::fetchData()); + $r = json_message($data); + + return $r; + } return $html; } + public function checkParseApi() + { + if (Config::get('app.auto_parse_api')) { + if ($this->request->isJsonPure() && $this->request->param('get_page_data')) { + return true; + } + } + + return false; + } + + /** + * 处理数据,过滤内部字段. + * @param array $data 内部数据 + * @return array + */ + public function parseInternalDataFields($data) + { + foreach ($this->internalDataFields as $field) { + if (isset($data[$field])) { + unset($data[$field]); + } + } + + if (isset($data['data_brage'])) { + $data_brage = json_decode($data['data_brage'], true); + + // 如果data_brage中的key在data中存在,则删掉data_brage中的 + foreach ($data as $key => $value) { + if (isset($data_brage[$key])) { + unset($data_brage[$key]); + } + } + + $data['data_brage'] = $data_brage; + } + + return $data; + } + /** * 设置dataBrage数据. * @@ -205,6 +269,14 @@ class AdminControllerBase extends BaseController */ public function setDataBrage($name, $value, $forceObject = false) { + if (is_array($name)) { + foreach ($name as $k => $v) { + $this->setDataBrage($k, $v, $forceObject); + } + + return $this; + } + if ($forceObject && !is_object($value)) { $value = (object) $value; } @@ -339,7 +411,7 @@ class AdminControllerBase extends BaseController /** * 下拉选择列表. - * @return \think\response\Json + * @return Json */ public function selectList() { @@ -378,7 +450,7 @@ class AdminControllerBase extends BaseController 'pageKeyName' => $this->pageKeyName, ]; - View::assign($data); + $this->assign($data, -1); } /** @@ -443,7 +515,7 @@ class AdminControllerBase extends BaseController $this->sessionAdmin = $model_admin; - $this->assign('session_admin', $model_admin); + $this->assign('session_admin', $model_admin, -1); } /** diff --git a/extend/base/common/provider/RequestBase.php b/extend/base/common/provider/RequestBase.php index a66e424..96b30d7 100644 --- a/extend/base/common/provider/RequestBase.php +++ b/extend/base/common/provider/RequestBase.php @@ -2,8 +2,43 @@ namespace base\common\provider; +use think\facade\Config; + // 应用请求对象类 class RequestBase extends \think\Request { protected $filter = []; + + /** + * 当前是否JSON请求 + * @return bool + */ + public function isJson(): bool + { + $acceptType = $this->type(); + + $is_json = str_contains($acceptType, 'json'); + if (!$is_json) { + return false; + } + + if (!Config::get('app.auto_parse_api')) { + return true; + } + if ($this->has('get_page_data')) { + return false; + } + + return true; + } + + /** + * 仅通过实际请求参数判断请求 + * + * @return bool + */ + public function isJsonPure() + { + return parent::isJson(); + } }