From c5355bd6eb921fa58df9855c28a7c6fbf75ef448 Mon Sep 17 00:00:00 2001 From: liaofei <136327134@qq.com> Date: Wed, 26 Apr 2023 15:13:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/system/SystemRouteServices.php | 28 ++++ crmeb/crmeb/command/Util.php | 133 +++++++++++++++++- 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/crmeb/app/services/system/SystemRouteServices.php b/crmeb/app/services/system/SystemRouteServices.php index 72efb6457..c23b85bb7 100644 --- a/crmeb/app/services/system/SystemRouteServices.php +++ b/crmeb/app/services/system/SystemRouteServices.php @@ -111,6 +111,34 @@ class SystemRouteServices extends BaseServices return get_tree_children($list); } + /** + * @param array $importData + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/26 + */ + public function importData(array $importData) + { + $sumNum = count($importData); + $sumPage = ceil($sumNum / 300); + for ($i = 1; $i <= $sumPage; $i++) { + $data = array_slice($importData, $i * 300, 300); + foreach ($data as $item) { + $id = $this->dao->value(['method' => $item['method'], 'path' => $item['path']], 'id'); + if ($id) { + $this->dao->update($id, [ + 'request' => json_encode($item['request']), + 'response' => json_encode($item['response']), + 'request_type' => $item['request_type'], + ]); + } + } + sleep(1); + } + return true; + } + /** * 获取某个应用下的所有路由权限 * @param string $app diff --git a/crmeb/crmeb/command/Util.php b/crmeb/crmeb/command/Util.php index 992ef053b..6979ccd3f 100644 --- a/crmeb/crmeb/command/Util.php +++ b/crmeb/crmeb/command/Util.php @@ -19,10 +19,11 @@ class Util extends Command protected function configure() { $this->setName('util') - ->addArgument('type', Argument::REQUIRED, '类型replace/route/file') + ->addArgument('type', Argument::REQUIRED, '类型replace/route/file/apifox') ->addOption('h', null, Option::VALUE_REQUIRED, '替换成当前域名') ->addOption('u', null, Option::VALUE_REQUIRED, '替换的域名') ->addOption('a', null, Option::VALUE_REQUIRED, '应用名') + ->addOption('f', null, Option::VALUE_REQUIRED, '导入文件路径,文件只能在项目根目录下或者根目录下的其他文件夹内') ->setDescription('工具类'); } @@ -52,6 +53,13 @@ class Util extends Command case 'file': app()->make(SystemFileInfoServices::class)->syncfile(); break; + case 'apifox': + $filePath = $input->getOption('f'); + if (!$filePath) { + return $output->error('缺少导入文件地址'); + } + $this->import($filePath); + break; } $output->info('执行成功'); @@ -91,4 +99,127 @@ class Util extends Command } }); } + + /** + * 导入数据 + * @param string $filePath + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/26 + */ + protected function import(string $filePath) + { + $preg = '/\{+[a-zA-Z0-9]+\}/'; + + $res = file_get_contents(app()->getRootPath() . $filePath); + + $data = json_decode($res, true)['apiCollection'][0]['items']; + + $route = []; + foreach ($data as $item) { + foreach ($item['items'] as $value) { + if (isset($value['api'])) { + $path = str_replace('//', '/', str_replace('{}', '', $value['api']['path'])); + $paramePath = $this->getPathValue($value['api']['parameters']['path'] ?? []); + if (strstr($path, ':') !== false) { + $path = str_replace(':', '', $path); + } + if (preg_match_all($preg, $path, $matches)) { + $paramePathMatche = []; + if (isset($matches[0]) && $matches[0]) { + foreach ($matches[0] as $v) { + $paramePathMatche[] = str_replace(['{', '}'], ['<', '>'], $v); + } + } + if ($paramePathMatche) { + $paramePath = implode('/', $paramePathMatche); + } + } + $route[] = [ + 'method' => strtoupper($value['api']['method']), + 'path' => $path . $paramePath, + 'request_type' => $value['api']['requestBody']['type'], + 'request' => $this->getRequest($value['api']['requestBody']['parameters'] ?? []), + 'response' => $this->getResponse($value['api']['responses'][0]['jsonSchema']['properties'] ?? []), + ]; + } + } + } + + return app()->make(SystemRouteServices::class)->importData($route); + } + + /** + * 获取请求返回数据 + * @param array $options + * @param string $parentId + * @return array + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/26 + */ + protected function getResponse(array $options, $parentId = '') + { + $response = []; + foreach ($options as $key => $option) { + $id = uniqid(); + $response[] = [ + 'attribute' => $key, + 'type' => $option['type'], + 'trip' => '', + 'id' => $id, + 'parentId' => $parentId, + ]; + if (isset($option['properties'])) { + $response = array_merge($response, $this->getResponse($option['properties'], $id)); + } + } + + return $response; + } + + /** + * 获取请求数据 + * @param array $options + * @return array + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/26 + */ + protected function getRequest(array $options) + { + $request = []; + foreach ($options as $option) { + $request[] = [ + 'attribute' => $option['name'], + 'type' => $option['type'], + 'must' => 0, + 'trip' => $option['description'], + 'id' => $option['id'], + ]; + } + return $request; + } + + /** + * 处理path路径 + * @param array $options + * @return string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/26 + */ + protected function getPathValue(array $options) + { + $path = []; + foreach ($options as $option) { + if (strstr($option['name'], '?') !== false) { + $option['name'] = str_replace('?', '', $option['name']) . '?'; + } + $path[] = '<' . $option['name'] . '>'; + } + + return implode('/', $path); + } }