From 4e1e040936e7ca06169e40aafd9f82f140f1ff0a Mon Sep 17 00:00:00 2001 From: JaguarJack Date: Sat, 24 Apr 2021 20:32:36 +0800 Subject: [PATCH] =?UTF-8?q?add:=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=85=AC=E5=85=B1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- catch/system/controller/Excel.php | 105 ++++++++++++++++++++++++++++++ catch/system/route.php | 5 ++ 2 files changed, 110 insertions(+) create mode 100644 catch/system/controller/Excel.php diff --git a/catch/system/controller/Excel.php b/catch/system/controller/Excel.php new file mode 100644 index 0000000..5dcbfb6 --- /dev/null +++ b/catch/system/controller/Excel.php @@ -0,0 +1,105 @@ +resetFields(\json_decode($request->post('fields'), true)); + + $excel = app()->make($request->post('model')) + ->field(array_column($fields, 'field')) + ->select() + ->each(function (&$item, $key) use ($fields) { + foreach ($fields as $field) { + if (isset($field['options']) && count($field['options'])) { + $options = $this->valueToLabel($field['options']); + + $item[$field['field']] = $options[$item[$field['field']]] ?? ''; + } + } + })->export(array_column($fields, 'name')); + + return CatchResponse::success($excel); + } + + /** + * 导入 + * + * @time 2021年04月23日 + * @param Request $request + * @return \think\response\Json + */ + public function import(Request $request): \think\response\Json + { + return CatchResponse::success(app()->make($request->post('model')) + ->import( + \json_decode($request->post('fields'), 'field'), + $request->file('file') + )); + + } + + /** + * value => label + * + * @time 2021年04月22日 + * @param array $options + * @return array + */ + protected function valueToLabel(array $options): array + { + $p = []; + foreach ($options as $option) { + $p[$option['value']] = $option['label']; + } + + return $p; + } + + /** + *label => value + * + * @time 2021年04月22日 + * @param array $options + * @return array + */ + protected function labelToValue(array $options): array + { + $p = []; + foreach ($options as $option) { + $p[$option['label']] = $option['value']; + } + + return $p; + } + + /** + * 重组 fields + * + * @time 2021年04月22日 + * @param array $fields + * @return array + */ + protected function resetFields(array $fields): array + { + $f = []; + + foreach ($fields as $field) { + $f[$field['field']] = $field; + } + + return $f; + } +} \ No newline at end of file diff --git a/catch/system/route.php b/catch/system/route.php index 298cd97..0d4526f 100644 --- a/catch/system/route.php +++ b/catch/system/route.php @@ -48,6 +48,11 @@ $router->group(function () use ($router) { $router->put('modules/', '\catchAdmin\system\controller\Module@disOrEnable'); $router->put('cache/modules', '\catchAdmin\system\controller\Module@cache'); $router->delete('clear/modules', '\catchAdmin\system\controller\Module@clear'); + + // excel 导入&导出通用 + $router->post('excel/export', '\catchAdmin\system\controller\Excel@export'); + $router->post('excel/import', '\catchAdmin\system\controller\Excel@import'); + })->middleware('auth'); // 获取 table