findOrEmpty((int)$params['id']) ->toArray(); $detail['menu']['pid'] = intval($detail['menu']['pid'] ?? 0); $detail['menu']['type'] = intval($detail['menu']['type'] ?? 0); $detail['menu']['name'] = !empty($detail['menu']['name']) ? $detail['menu']['name'] : $detail['table_comment']; return $detail; } /** * @notes 选择数据表 * @param $params * @param $adminId * @return bool * @author 段誉 * @date 2022/6/20 10:44 */ public static function selectTable($params, $adminId) { Db::startTrans(); try { foreach ($params['table'] as $item) { // 添加主表基础信息 $generateTable = self::initTable($item, $adminId); // 获取数据表字段信息 $column = self::getTableColumn($item['name']); // 添加表字段信息 self::initTableColumn($column, $generateTable['id']); } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 编辑表信息 * @param $params * @return bool * @author 段誉 * @date 2022/6/20 10:44 */ public static function editTable($params) { Db::startTrans(); try { // 更新主表-数据表信息 GenerateTable::update([ 'id' => $params['id'], 'table_name' => $params['table_name'], 'table_comment' => $params['table_comment'], 'template_type' => $params['template_type'], 'author' => $params['author'] ?? '', 'remark' => $params['remark'] ?? '', 'generate_type' => $params['generate_type'], 'module_name' => $params['module_name'], 'class_dir' => $params['class_dir'] ?? '', 'class_comment' => $params['class_comment'] ?? '', 'menu' => [ 'pid' => $params['menu']['pid'] ?? 0, 'type' => $params['menu']['type'] ?? 0, 'name' => $params['menu']['name'] ?? $params['table_comment'], ] ]); // 更新从表-数据表字段信息 foreach ($params['table_column'] as $item) { GenerateColumn::update([ 'id' => $item['id'], 'column_comment' => $item['column_comment'] ?? '', 'is_required' => $item['is_required'] ?? 0, 'is_insert' => $item['is_insert'] ?? 0, 'is_update' => $item['is_update'] ?? 0, 'is_lists' => $item['is_lists'] ?? 0, 'is_query' => $item['is_query'] ?? 0, 'query_type' => $item['query_type'], 'view_type' => $item['view_type'], 'dict_type' => $item['dict_type'] ?? '', ]); } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 删除表相关信息 * @param $params * @return bool * @author 段誉 * @date 2022/6/16 9:30 */ public static function deleteTable($params) { Db::startTrans(); try { GenerateTable::whereIn('id', $params['id'])->delete(); GenerateColumn::whereIn('table_id', $params['id'])->delete(); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 同步表字段 * @param $params * @return bool * @author 段誉 * @date 2022/6/23 16:28 */ public static function syncColumn($params) { Db::startTrans(); try { // table 信息 $table = GenerateTable::findOrEmpty($params['id']); // 删除旧字段 GenerateColumn::whereIn('table_id', $table['id'])->delete(); // 获取当前数据表字段信息 $column = self::getTableColumn($table['table_name']); // 创建新字段数据 self::initTableColumn($column, $table['id']); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 生成代码 * @param $params * @return false|int[] * @author 段誉 * @date 2022/6/24 9:43 */ public static function generate($params) { try { // 获取数据表信息 $tables = GenerateTable::with(['table_column']) ->whereIn('id', $params['id']) ->select()->toArray(); $generator = app()->make(GenerateService::class); $generator->delGenerateDirContent(); $flag = array_unique(array_column($tables, 'table_name')); $flag = implode(',', $flag); $generator->setGenerateFlag(md5($flag . time()), false); // 循环生成 foreach ($tables as $table) { $generator->generate($table); } $zipFile = ''; // 生成压缩包 if ($generator->getGenerateFlag()) { $generator->zipFile(); $generator->delGenerateFlag(); $zipFile = $generator->getDownloadUrl(); } return ['file' => $zipFile]; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 预览 * @param $params * @return false * @author 段誉 * @date 2022/6/23 16:27 */ public static function preview($params) { try { // 获取数据表信息 $table = GenerateTable::with(['table_column']) ->whereIn('id', $params['id']) ->findOrEmpty()->toArray(); $generateService = app()->make(GenerateService::class); return $generateService->preview($table); } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 获取表字段信息 * @param $tableName * @return array * @author 段誉 * @date 2022/6/23 16:28 */ public static function getTableColumn($tableName) { $tablePrefix = config('database.connections.mysql.prefix'); $tableName = str_replace($tablePrefix, '', $tableName); return Db::name($tableName)->getFields(); } /** * @notes 初始化代码生成数据表信息 * @param $tableData * @param $adminId * @return GenerateTable|\think\Model * @author 段誉 * @date 2022/6/23 16:28 */ public static function initTable($tableData, $adminId) { return GenerateTable::create([ 'table_name' => $tableData['name'], 'table_comment' => $tableData['comment'], 'template_type' => GeneratorEnum::TEMPLATE_TYPE_SINGLE, 'generate_type' => GeneratorEnum::GENERATE_TYPE_ZIP, 'module_name' => 'adminapi', 'admin_id' => $adminId, 'menu' => [ 'pid' => 0, // 父级菜单id 'type' => 0, // 构建方式 0-手动添加 1-自动构建 'name' => $tableData['comment'], // 菜单名称 ] ]); } /** * @notes 初始化代码生成字段信息 * @param $column * @param $tableId * @throws \Exception * @author 段誉 * @date 2022/6/23 16:28 */ public static function initTableColumn($column, $tableId) { $defaultColumn = ['id', 'create_time', 'update_time', 'delete_time']; $insertColumn = []; foreach ($column as $value) { $required = 0; if ($value['notnull'] && !$value['primary'] && !in_array($value['name'], $defaultColumn)) { $required = 1; } $columnData = [ 'table_id' => $tableId, 'column_name' => $value['name'], 'column_comment' => $value['comment'], 'column_type' => self::getDbFieldType($value['type']), 'is_required' => $required, 'is_pk' => $value['primary'] ? 1 : 0, ]; if (!in_array($value['name'], $defaultColumn)) { $columnData['is_insert'] = 1; $columnData['is_update'] = 1; $columnData['is_lists'] = 1; $columnData['is_query'] = 1; } $insertColumn[] = $columnData; } (new GenerateColumn())->saveAll($insertColumn); } /** * @notes 下载文件 * @param $fileName * @return false|string * @author 段誉 * @date 2022/6/24 9:51 */ public static function download(string $fileName) { $cacheFileName = cache('curd_file_name' . $fileName); if (empty($cacheFileName)) { self::$error = '请重新生成代码'; return false; } $path = root_path() . 'runtime/generate/' . $fileName; if (!file_exists($path)) { self::$error = '下载失败'; return false; } cache('curd_file_name' . $fileName, null); return $path; } /** * @notes 获取数据表字段类型 * @param string $type * @return string * @author 段誉 * @date 2022/6/15 10:11 */ public static function getDbFieldType(string $type): string { if (0 === strpos($type, 'set') || 0 === strpos($type, 'enum')) { $result = 'string'; } elseif (preg_match('/(double|float|decimal|real|numeric)/is', $type)) { $result = 'float'; } elseif (preg_match('/(int|serial|bit)/is', $type)) { $result = 'int'; } elseif (preg_match('/bool/is', $type)) { $result = 'bool'; } elseif (0 === strpos($type, 'timestamp')) { $result = 'timestamp'; } elseif (0 === strpos($type, 'datetime')) { $result = 'datetime'; } elseif (0 === strpos($type, 'date')) { $result = 'date'; } else { $result = 'string'; } return $result; } }