From 2bd36d1848fc274e31b6a0baaa2cbaff68d83997 Mon Sep 17 00:00:00 2001 From: cuijiawang Date: Fri, 26 Sep 2025 17:54:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=20=E6=A8=A1=E6=9D=BF=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/codegen.ts | 218 ++++++ .../components/CustomTemplateDialog.vue | 638 ++++++++++++++++++ .../components/TemplateRepositoryDialog.vue | 392 +++++++++++ src/views/system/codegen/index.vue | 70 +- 4 files changed, 1306 insertions(+), 12 deletions(-) create mode 100644 src/views/system/codegen/components/CustomTemplateDialog.vue create mode 100644 src/views/system/codegen/components/TemplateRepositoryDialog.vue diff --git a/src/api/system/codegen.ts b/src/api/system/codegen.ts index 8308951..7d75114 100644 --- a/src/api/system/codegen.ts +++ b/src/api/system/codegen.ts @@ -44,6 +44,56 @@ export interface CodegenResponse { tableName: string; } +// 用户模板 +export interface UserTemplate { + id?: number; + userId?: number; + templateName: string; + templateGroup: string; + templateContent: string; + description?: string; + isPublic: number; // 0-私有 1-公开 + version?: string; + useCount?: number; + status?: number; // 0-草稿 1-发布 2-禁用 + createTime?: string; + updateTime?: string; + createBy?: string; + updateBy?: string; + isOwner?: boolean; + isPublicText?: string; + statusText?: string; +} + +// 模板仓库配置 +export interface TemplateRepository { + id?: number; + userId?: number; + templateSource: string; // system-系统模板 user-用户模板 + templateId: string; + templateName: string; + templateGroup: string; + isEnabled: number; // 0-隐藏 1-显示 + sortOrder?: number; + createTime?: string; +} + +// 分页查询参数 +export interface PageQuery { + pageNum: number; + pageSize: number; +} + +// 分页响应(MyBatis-Plus Page结构) +export interface PageResult { + records: T[]; + total: number; + current: number; + size: number; + pages?: number; + searchCount?: boolean; +} + // 获取所有模板 export function getAllTemplatesApi() { return http.request>( @@ -62,3 +112,171 @@ export function generateCodeApi(data: CodegenRequest) { } ); } + +// ============= 用户模板管理 API ============= + +// 分页查询用户模板列表 +export function getUserTemplateListApi( + params: PageQuery & { + templateGroup?: string; + isPublic?: number; + } +) { + return http.request>>( + "get", + "/codegen/user-template/list", + { params } + ); +} + +// 查询公开模板列表 +export function getPublicTemplatesApi(templateGroup?: string) { + return http.request>( + "get", + "/codegen/user-template/public", + { params: { templateGroup } } + ); +} + +// 根据ID查询用户模板详情 +export function getUserTemplateByIdApi(id: number) { + return http.request>( + "get", + `/codegen/user-template/${id}` + ); +} + +// 新增用户模板 +export function addUserTemplateApi(data: UserTemplate) { + return http.request>("post", "/codegen/user-template", { + data + }); +} + +// 修改用户模板 +export function updateUserTemplateApi(data: UserTemplate) { + return http.request>( + "post", + "/codegen/user-template/update", + { data } + ); +} + +// 删除用户模板 +export function deleteUserTemplateApi(id: number) { + return http.request>( + "post", + "/codegen/user-template/delete", + { data: { id } } + ); +} + +// 批量删除用户模板 +export function deleteUserTemplatesBatchApi(ids: number[]) { + return http.request>( + "post", + "/codegen/user-template/delete/batch", + { data: { ids } } + ); +} + +// 复制模板 +export function copyTemplateApi(templateId: number, newName: string) { + return http.request>( + "post", + "/codegen/user-template/copy", + { data: { templateId, newName } } + ); +} + +// 验证模板语法 +export function validateTemplateApi(templateContent: string) { + return http.request>( + "post", + "/codegen/user-template/validate", + { data: templateContent } + ); +} + +// 检查模板名称是否存在 +export function checkTemplateNameApi(templateName: string, excludeId?: number) { + return http.request>( + "get", + "/codegen/user-template/check-name", + { params: { templateName, excludeId } } + ); +} + +// ============= 模板仓库管理 API ============= + +// 获取用户的模板仓库列表 +export function getUserRepositoryListApi() { + return http.request>( + "get", + "/codegen/repository/list" + ); +} + +// 获取所有可用模板 +export function getAvailableTemplatesApi() { + return http.request>( + "get", + "/codegen/repository/available" + ); +} + +// 添加模板到用户仓库 +export function addTemplateToRepositoryApi(data: TemplateRepository) { + return http.request>("post", "/codegen/repository/add", { + data + }); +} + +// 从用户仓库移除模板 +export function removeTemplateFromRepositoryApi( + templateSource: string, + templateId: string +) { + return http.request>( + "post", + "/codegen/repository/remove", + { data: { templateSource, templateId } } + ); +} + +// 切换模板启用状态 +export function toggleTemplateStatusApi( + templateSource: string, + templateId: string, + isEnabled: number +) { + return http.request>( + "post", + "/codegen/repository/toggle", + { data: { templateSource, templateId, isEnabled } } + ); +} + +// 批量更新模板排序 +export function updateTemplateSortApi(templates: TemplateRepository[]) { + return http.request>("post", "/codegen/repository/sort", { + data: templates + }); +} + +// 初始化用户模板仓库 +export function initUserRepositoryApi() { + return http.request>("post", "/codegen/repository/init"); +} + +// 检查模板是否已添加到用户仓库 +export function checkTemplateExistsApi( + templateSource: string, + templateId: string +) { + return http.request>( + "get", + "/codegen/repository/check", + { params: { templateSource, templateId } } + ); +} diff --git a/src/views/system/codegen/components/CustomTemplateDialog.vue b/src/views/system/codegen/components/CustomTemplateDialog.vue new file mode 100644 index 0000000..ad311f4 --- /dev/null +++ b/src/views/system/codegen/components/CustomTemplateDialog.vue @@ -0,0 +1,638 @@ + + + + + diff --git a/src/views/system/codegen/components/TemplateRepositoryDialog.vue b/src/views/system/codegen/components/TemplateRepositoryDialog.vue new file mode 100644 index 0000000..4e62eb7 --- /dev/null +++ b/src/views/system/codegen/components/TemplateRepositoryDialog.vue @@ -0,0 +1,392 @@ + + + + + diff --git a/src/views/system/codegen/index.vue b/src/views/system/codegen/index.vue index 352fe39..d124849 100644 --- a/src/views/system/codegen/index.vue +++ b/src/views/system/codegen/index.vue @@ -5,6 +5,8 @@ import { useRenderIcon } from "@/components/ReIcon/src/hooks"; import TemplateSelector from "./components/TemplateSelector.vue"; import ConfigForm from "./components/ConfigForm.vue"; import CodeEditor from "./components/CodeEditor.vue"; +import TemplateRepositoryDialog from "./components/TemplateRepositoryDialog.vue"; +import CustomTemplateDialog from "./components/CustomTemplateDialog.vue"; import Play from "@iconify-icons/ep/caret-right"; import CopyDocument from "@iconify-icons/ep/document-copy"; @@ -45,6 +47,20 @@ const sqlCollapsed = ref(false); const configCollapsed = ref(false); const templateCollapsed = ref(false); +// 弹窗状态 +const templateRepositoryVisible = ref(false); +const customTemplateVisible = ref(false); + +// 打开模板仓库 +const openTemplateRepository = () => { + templateRepositoryVisible.value = true; +}; + +// 打开自定义模板 +const openCustomTemplate = () => { + customTemplateVisible.value = true; +}; + onMounted(() => { loadAllTemplates(); }); @@ -177,19 +193,37 @@ onMounted(() => { @@ -248,6 +282,18 @@ onMounted(() => { /> + + + + + +