diff --git a/app/Http/Controllers/Api/AdminController.php b/app/Http/Controllers/Api/AdminController.php index a4759adf..93c7c4e9 100644 --- a/app/Http/Controllers/Api/AdminController.php +++ b/app/Http/Controllers/Api/AdminController.php @@ -86,4 +86,18 @@ class AdminController extends BaseController '获取成功' ); } + + /** + * 获取菜单列表 + * @Method GET + * @return JsonResponse + * @throws Exception + */ + public function codes(): JsonResponse + { + return jok( + [], + '获取成功' + ); + } } diff --git a/app/Http/Controllers/core/CodeGenerationController.php b/app/Http/Controllers/core/CodeGenerationController.php index 68d2aa93..ceedfe91 100644 --- a/app/Http/Controllers/core/CodeGenerationController.php +++ b/app/Http/Controllers/core/CodeGenerationController.php @@ -19,23 +19,31 @@ class CodeGenerationController extends BaseController public function generation() { -// $this->insertField = [ -// 'class_name', -// 'class_comment', -// 'sort', -// 'icon', -// 'pid', -// 'field', -// ]; -// -// $params = $this->checkRequiredFields(request()->post()); + $this->insertField = [ + 'class_name', + 'class_comment', + 'sort', + 'icon', + 'pid', + 'field', + ]; - $params = json_decode('{"class_name":"testTemplate","class_comment":"测试代码生成","sort":"9999999","icon":"ant-design:api-outlined","pid":14,"field":[{"name":"name","type":"VARCHAR","type_number":"32","default":null,"comment":"测试名称","null":true,"formShow":true,"tableShow":true,"search":true,"searchValue":"like","formType":"VbenInput"},{"name":"test_name_1","type":"VARCHAR","type_number":"32","default":null,"comment":"测试名称","null":true,"formShow":true,"tableShow":true,"search":true,"searchValue":"like","formType":"VbenInput"}]}', true); -// ds($params); - return $this->service->generate($params); -// return jok( -// $this->service->generate([]) -// ); + $params = $this->checkRequiredFields(request()->post()); + + return jok( + $this->service->generate($params), + '生成成功!' + ); + } + + public function download() + { +// $id = request()->post('id'); + $id = request()->get('id'); + if (!$id) { + return jerr('参数错误!'); + } + return $this->service->download($id); } } diff --git a/app/Models/CodeGenerationModel.php b/app/Models/CodeGenerationModel.php new file mode 100644 index 00000000..43476d24 --- /dev/null +++ b/app/Models/CodeGenerationModel.php @@ -0,0 +1,19 @@ + + */ + protected $guarded = []; + +} diff --git a/app/Service/core/CodeGenerationService.php b/app/Service/core/CodeGenerationService.php index d18054ee..ea83fb73 100644 --- a/app/Service/core/CodeGenerationService.php +++ b/app/Service/core/CodeGenerationService.php @@ -2,7 +2,9 @@ namespace App\Service\core; +use App\Models\CodeGenerationModel; use App\Service\common\UtilsService; +use App\Service\MenuService; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; @@ -75,10 +77,20 @@ class CodeGenerationService return self::$_instance[$name]; } + public function download($id) + { + $model = CodeGenerationModel::find($id); + if (!$model) { + $this->utils->errorThrow('文件不存在'); + } + // 返回下载 $path 文件流 + return response()->download($model['path'], $model['file_name'], ['Content-Type' => 'application/zip']); + } + /** * 创建临时文件夹,复制模板文件,压缩并返回文件流 */ - public function download(): BinaryFileResponse|JsonResponse + public function downloadUrl() { try { // 将后端模板文件内容写入临时目录中 @@ -98,8 +110,15 @@ class CodeGenerationService // 执行文件压缩 $zip->zip($zipFile, $path); - // 返回下载 $path 文件流 - return response()->download($zipFile, "{$this->classComment}-{$this->uniqid}.zip", ['Content-Type' => 'application/zip']); + CodeGenerationModel::create([ + 'title' => $this->classComment, + 'file_name' => "{$this->classComment}-{$this->uniqid}.zip", + 'path' => $zipFile, + 'params' => json_encode($this->param), + 'created_at' => time(), + 'updated_at' => time(), + ]); + return $zipFile; } catch (\Exception $e) { return response()->json([ 'error' => '生成模板文件失败', @@ -134,9 +153,10 @@ class CodeGenerationService * 代码生成主逻辑 * * @param $params + * @return mixed * @throws Exception */ - public function generate($params) + public function generate($params): mixed { $this->param = $params; DB::beginTransaction(); @@ -157,24 +177,19 @@ class CodeGenerationService $this->querySql(); // 生成视图 $this->genViews(); -// // 生成菜单 -// $this->genMenu(); - return $this->download(); -// // 生成导出层 -// $this->genExport(); -// // 生成导入层 -// $this->genImport(); + // 生成菜单 + $this->genMenu(); } catch (Exception $e) { DB::rollBack(); - ds([ - 'error' => '生成代码失败', - 'message' => $e->getMessage(), - 'line' => $e->getLine(), - 'file' => $e->getFile(), - ]); +// ds([ +// 'error' => '生成代码失败', +// 'message' => $e->getMessage(), +// 'line' => $e->getLine(), +// 'file' => $e->getFile(), +// ]); $this->utils->errorThrow($e->getMessage()); } - return $this->download(); + return $this->downloadUrl(); } @@ -240,7 +255,7 @@ class CodeGenerationService $apiPath = app_path('../routes/api.php'); $apiFile = file_get_contents($apiPath, 'y'); $newApi = - "'{$this->dashCase}' => \App\Http\Controllers\Api\CodeGeneration\\{$this->upperCamelCase}Controller::class, // {$this->classComment}} \r\n // 需要登录的路由生成地址"; + "'{$this->dashCase}' => \App\Http\Controllers\Api\CodeGeneration\\{$this->upperCamelCase}Controller::class, // {$this->classComment} \r\n // 需要登录的路由生成地址"; $updateNewFile = str_replace('// 需要登录的路由生成地址', $newApi, $apiFile); @@ -289,35 +304,7 @@ class CodeGenerationService 'model' ); } -// -// /** -// * 生成导出层文件 -// * @return void -// */ -// private function genExport(): void -// { -// $this->strReplaceTmp( -// $this->basePath . $this->tmpPath['server']['export'], -// $this->basePath . $this->newPath['server']['export'], -// 'server', -// 'export' -// ); -// } -// -// /** -// * 生成导入层文件 -// * @return void -// */ -// private function genImport(): void -// { -// $this->strReplaceTmp( -// $this->basePath . $this->tmpPath['server']['import'], -// $this->basePath . $this->newPath['server']['import'], -// 'server', -// 'import' -// ); -// } -// + /** * 生成前端部分文件 * @return void @@ -343,16 +330,24 @@ class CodeGenerationService } } -// /** -// * 生成菜单/授权 -// * -// * @return void -// * @throws Exception -// */ -// private function genMenu(): void -// { -// RoleService::getInstance()->createRoleMenuRelation(UsersEnum::ADMIN_ID, MenuService::getInstance()->save($this->menu)); -// } + /** + * 生成菜单/授权 + * + * @return void + * @throws Exception + */ + private function genMenu(): void + { + MenuService::getInstance()->create([ + 'title' => $this->classComment, + 'icon' => $this->param['icon']?? '', + 'name' => $this->upperCamelCase, + 'path' => "/{$this->dashCase}", + 'component' => "/my-gen/{$this->dashCase}/index", + 'pid' => $this->param['pid'], + 'sort' => $this->param['sort'], + ]); + } /** * 模板内容替换 @@ -425,15 +420,15 @@ class CodeGenerationService } // 设置表单字段 if ($item['formShow']) { - $isNull = $item['null'] == 1 ? 'required' : ''; + $isNull = $item['null'] == 1 ? "'required'" : "''"; $this->insertField .= !empty($this->insertField) ? '","' . $item['name'] : $item['name']; $this->updateField .= !empty($this->updateField) ? '","' . $item['name'] : 'id","' . $item['name']; - $this->viewForm .= "{\n fieldName: '" . $item['name'] . "',\n label: '" . $item['comment'] . "',\n component: '" . $item['formType'] . "',\n rules: " . $isNull . ",\n },\n "; + $this->viewForm .= "{\n fieldName: '" . $item['name'] . "',\n label: '" . $item['comment'] . "',\n component: '" . $item['formType'] . "',\n rules: " . $isNull . ",\n },\n"; } // 设置搜索字段 if ($item['search']) { - $this->viewSearch .= "{\n fieldName: '" . $item['name'] . "',\n label: '" . $item['comment'] . "',\n component: '" . $item['formType'] . "',\n },\n "; - $this->searchField .= !empty($this->searchField) ? ',' . $item['name'] . '\' => \'' . $item['searchValue'] : $item['name'] . '\' => \'' . $item['searchValue']; + $this->viewSearch .= "{\n fieldName: '" . $item['name'] . "',\n label: '" . $item['comment'] . "',\n component: '" . $item['formType'] . "',\n },\n "; + $this->searchField .= !empty($this->searchField) ? "','" . $item['name'] . '\' => \'' . $item['searchValue'] : $item['name'] . '\' => \'' . $item['searchValue']; } // // 设置导出字段 // $this->exportField .= !empty($this->exportField) ? ',"' . $item['comment'] . '"' : '"' . $item['comment'] . '"'; @@ -441,7 +436,7 @@ class CodeGenerationService // // 设置导入字段 // $this->importField .= "'" . $item['name'] . "' => \$row['" . $item['comment'] . "'],\n "; // 设置视图数据字段 - $this->viewData .= "{ field: '{$item['name']}', title: '{$item['comment']}' },\n "; + $this->viewData .= "{ field: '{$item['name']}', title: '{$item['comment']}' },\n "; } /** diff --git a/app/template/view/api/index.ts b/app/template/view/api/index.ts index d048f18a..92901873 100644 --- a/app/template/view/api/index.ts +++ b/app/template/view/api/index.ts @@ -2,10 +2,10 @@ import { requestClient } from '#/api/request'; const prefix = 'dashCase/'; /** - * 分页查询用户列表 + * 分页查询模板名称列表 * @param data */ -export async function getupperCamelCaseList(data: any) { +export async function getupperCamelCaseListApi(data: any) { return requestClient.get(`${prefix}list`, { params: data }); } @@ -13,7 +13,7 @@ export async function getupperCamelCaseList(data: any) { * 获取模板名称详情 * @param id */ -export async function getupperCamelCaseInfo(id: number) { +export async function getupperCamelCaseInfoApi(id: number) { return requestClient.get(`${prefix}detail`, { params: { id } }); } @@ -21,7 +21,7 @@ export async function getupperCamelCaseInfo(id: number) { * 新增模板名称 * @param data */ -export async function createupperCamelCase(data: Record) { +export async function createupperCamelCaseApi(data: Record) { return requestClient.post(`${prefix}create`, data); } @@ -29,7 +29,7 @@ export async function createupperCamelCase(data: Record) { * 编辑模板名称 * @param data */ -export async function updateupperCamelCase(data: Record) { +export async function updateupperCamelCaseApi(data: Record) { return requestClient.post(`${prefix}update`, data); } @@ -37,6 +37,6 @@ export async function updateupperCamelCase(data: Record) { * 删除模板名称 * @param data */ -export async function deleteupperCamelCase(data: Record) { +export async function deleteupperCamelCaseApi(data: Record) { return requestClient.post(`${prefix}delete`, data); } diff --git a/app/template/view/components/modal.vue b/app/template/view/components/modal.vue index 38744a58..58cdc4c8 100644 --- a/app/template/view/components/modal.vue +++ b/app/template/view/components/modal.vue @@ -6,7 +6,7 @@ import { useVbenModal } from '@vben/common-ui'; import { message } from 'ant-design-vue'; import { useVbenForm } from '#/adapter/form'; -import { createupperCamelCase, updateupperCamelCase } from '../api'; +import {createupperCamelCaseApi, updateupperCamelCaseApi} from '../api'; import { modalFormProps } from '../config/form'; defineOptions({ @@ -29,7 +29,7 @@ const [Modal, modalApi] = useVbenModal({ if (e.valid) { const values = await formApi.getValues(); modalApi.setState({ loading: true, confirmLoading: true }); - const submitApi = isUpdate.value ? updateupperCamelCase : createupperCamelCase; + const submitApi = isUpdate.value ? updateupperCamelCaseApi : createupperCamelCaseApi; submitApi(values) .then(() => { message.success('保存成功'); diff --git a/app/template/view/config/table.ts b/app/template/view/config/table.ts index 173f0c30..5a41861c 100644 --- a/app/template/view/config/table.ts +++ b/app/template/view/config/table.ts @@ -1,6 +1,6 @@ import type { VxeGridProps } from '#/adapter/vxe-table'; -import { getupperCamelCaseList } from '../api'; +import { getupperCamelCaseListApi } from '../api'; interface RowType { id: string; @@ -35,7 +35,7 @@ export const gridOptions: VxeGridProps = { ajax: { // 请求后端接口方法 query: async ({ page }, formValues) => { - return await getupperCamelCaseList({ + return await getupperCamelCaseListApi({ page: page.currentPage, pageSize: page.pageSize, ...formValues, diff --git a/app/template/view/index.vue b/app/template/view/index.vue index 72daea59..64216f6b 100644 --- a/app/template/view/index.vue +++ b/app/template/view/index.vue @@ -1,93 +1,74 @@