feat: 实现后台请求兼容接口的模式

This commit is contained in:
augushong
2025-03-10 18:06:51 +08:00
parent afd5f6b1dd
commit 7f92b0e07a
6 changed files with 119 additions and 9 deletions

View File

@@ -3,6 +3,7 @@ APP_DEBUG=true
[APP] [APP]
DEFAULT_TIMEZONE=Asia/Shanghai DEFAULT_TIMEZONE=Asia/Shanghai
AUTO_CACHE_LOG=false AUTO_CACHE_LOG=false
AUTO_PARSE_API=true
[DATABASE] [DATABASE]
TYPE=mysql TYPE=mysql

View File

@@ -43,4 +43,6 @@ return [
'show_error_msg' => false, 'show_error_msg' => false,
// 静态资源上传到OSS前缀 // 静态资源上传到OSS前缀
'oss_static_prefix' => Env::get('adminsystem.oss_static_prefix', 'static_ulthon_admin'), 'oss_static_prefix' => Env::get('adminsystem.oss_static_prefix', 'static_ulthon_admin'),
// 自动兼容接口响应
'auto_parse_api' => Env::get('app.auto_parse_api', true),
]; ];

View File

@@ -17,7 +17,7 @@ abstract class BaseControllerBase
{ {
/** /**
* Request实例. * Request实例.
* @var \think\Request * @var \app\common\provider\Request
*/ */
protected $request; protected $request;

View File

@@ -44,7 +44,7 @@ class AdminBase extends AdminController
*/ */
public function index() public function index()
{ {
if ($this->request->isAjax()) { if ($this->request->isJson()) {
if (input('selectFields')) { if (input('selectFields')) {
return $this->selectList(); return $this->selectList();
} }

View File

@@ -6,9 +6,11 @@ use app\admin\model\SystemAdmin;
use app\BaseController; use app\BaseController;
use app\common\constants\AdminConstant; use app\common\constants\AdminConstant;
use app\common\service\AuthService; use app\common\service\AuthService;
use think\facade\Config;
use think\facade\Env; use think\facade\Env;
use think\facade\View; use think\facade\View;
use think\Model; use think\Model;
use think\response\Json;
use think\template\exception\TemplateNotFoundException; use think\template\exception\TemplateNotFoundException;
use think\Validate; use think\Validate;
@@ -86,6 +88,8 @@ class AdminControllerBase extends BaseController
*/ */
private $dataBrage = []; private $dataBrage = [];
private $internalDataFields = [];
protected $validateRule = null; protected $validateRule = null;
protected $validateMessage = []; protected $validateMessage = [];
@@ -140,8 +144,23 @@ class AdminControllerBase extends BaseController
*/ */
public function assign($name, $value = null, $isAppendToDataBrage = false, $forceObject = false) public function assign($name, $value = null, $isAppendToDataBrage = false, $forceObject = false)
{ {
if ($isAppendToDataBrage) { if (is_array($name)) {
$this->setDataBrage($name, $value, $forceObject); $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); return $this->app->view->assign($name, $value);
@@ -181,8 +200,7 @@ class AdminControllerBase extends BaseController
public function fetch($template = '', $vars = []) public function fetch($template = '', $vars = [])
{ {
$this->assign('data_brage', json_encode($this->dataBrage)); $this->assign('data_brage', json_encode($this->dataBrage));
$this->assign('content_js', $this->fetchJS($template), -1);
$vars['content_js'] = $this->fetchJS($template);
$content_main = View::layout($this->layout) $content_main = View::layout($this->layout)
->config([ ->config([
@@ -191,10 +209,56 @@ class AdminControllerBase extends BaseController
$html = ''; $html = '';
$html .= $content_main; $html .= $content_main;
if ($this->checkParseApi()) {
$data = $this->parseInternalDataFields(View::fetchData());
$r = json_message($data);
return $r;
}
return $html; 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数据. * 设置dataBrage数据.
* *
@@ -205,6 +269,14 @@ class AdminControllerBase extends BaseController
*/ */
public function setDataBrage($name, $value, $forceObject = false) 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)) { if ($forceObject && !is_object($value)) {
$value = (object) $value; $value = (object) $value;
} }
@@ -339,7 +411,7 @@ class AdminControllerBase extends BaseController
/** /**
* 下拉选择列表. * 下拉选择列表.
* @return \think\response\Json * @return Json
*/ */
public function selectList() public function selectList()
{ {
@@ -378,7 +450,7 @@ class AdminControllerBase extends BaseController
'pageKeyName' => $this->pageKeyName, 'pageKeyName' => $this->pageKeyName,
]; ];
View::assign($data); $this->assign($data, -1);
} }
/** /**
@@ -443,7 +515,7 @@ class AdminControllerBase extends BaseController
$this->sessionAdmin = $model_admin; $this->sessionAdmin = $model_admin;
$this->assign('session_admin', $model_admin); $this->assign('session_admin', $model_admin, -1);
} }
/** /**

View File

@@ -2,8 +2,43 @@
namespace base\common\provider; namespace base\common\provider;
use think\facade\Config;
// 应用请求对象类 // 应用请求对象类
class RequestBase extends \think\Request class RequestBase extends \think\Request
{ {
protected $filter = []; 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();
}
} }