mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-04 17:14:21 +00:00
feat: 重构代码生成模块并优化定时任务功能
refactor(backend): 清理冗余模板文件并统一模板结构 fix(backend): 修复定时任务状态显示与操作逻辑 perf(backend): 优化数据库连接日志和初始化流程 style(frontend): 调整应用列表空状态显示样式 docs: 更新README中的命令说明和环境配置 chore: 添加banner.txt和统一环境变量格式
This commit is contained in:
@@ -24,8 +24,8 @@
|
||||
clearable
|
||||
style="width: 167.5px"
|
||||
>
|
||||
<el-option value="true" label="启用" />
|
||||
<el-option value="false" label="停用" />
|
||||
<el-option value="true" label="运行中" />
|
||||
<el-option value="false" label="暂停" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 时间范围,收起状态下隐藏 -->
|
||||
@@ -190,7 +190,7 @@
|
||||
<el-table-column label="状态" prop="status" min-width="100">
|
||||
<template #default="scope">
|
||||
<el-tag :type="scope.row.status === true ? 'success' : 'danger'">
|
||||
{{ scope.row.status === true ? "启用" : "停用" }}
|
||||
{{ scope.row.status === true ? "运行中" : "暂停" }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -254,12 +254,14 @@
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item
|
||||
:disabled="scope.row.status === false"
|
||||
icon="Check"
|
||||
@click="handleOption(scope.row.id, 1)"
|
||||
>
|
||||
暂停
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
:disabled="scope.row.status === true"
|
||||
icon="CircleClose"
|
||||
@click="handleOption(scope.row.id, 2)"
|
||||
>
|
||||
@@ -324,7 +326,7 @@
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="状态" :span="2">
|
||||
<el-tag :type="detailFormData.status ? 'success' : 'danger'">
|
||||
{{ detailFormData.status ? "启用" : "停用" }}
|
||||
{{ detailFormData.status ? "运行中" : "暂停" }}
|
||||
</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="最大实例数" :span="2">{{
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
|
||||
<!-- 空状态 -->
|
||||
<div v-if="applicationList.length === 0 && !loading" >
|
||||
<el-empty :image-size="120" description="暂无应用" />
|
||||
<el-empty :image-size="80" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
<!-- 分页区域 -->
|
||||
|
||||
@@ -9,12 +9,29 @@
|
||||
<el-form-item label="表描述" prop="tableComment">
|
||||
<el-input v-model="queryFormData.table_comment" placeholder="请输入表描述" clearable style="width: 200px" @keyup.enter="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="创建时间" style="width: 308px">
|
||||
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"/>
|
||||
<el-form-item v-if="isExpand" prop="start_time" label="创建时间">
|
||||
<DatePicker
|
||||
v-model="dateRange"
|
||||
@update:model-value="handleDateRangeChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item class="search-buttons">
|
||||
<el-button v-hasPerm="['generator:gencode:query']" type="primary" icon="search" native-type="submit">查询</el-button>
|
||||
<el-button v-hasPerm="['generator:gencode:query']" icon="refresh" @click="handleRefresh">重置</el-button>
|
||||
<!-- 展开/收起 -->
|
||||
<template v-if="isExpandable">
|
||||
<el-link class="ml-3" type="primary" underline="never" @click="isExpand = !isExpand">
|
||||
{{ isExpand ? "收起" : "展开" }}
|
||||
<el-icon>
|
||||
<template v-if="isExpand">
|
||||
<ArrowUp />
|
||||
</template>
|
||||
<template v-else>
|
||||
<ArrowDown />
|
||||
</template>
|
||||
</el-icon>
|
||||
</el-link>
|
||||
</template>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
@@ -46,7 +63,7 @@
|
||||
<el-button v-hasPerm="['generator:gencode:delete']" type="danger" plain icon="Delete" :disabled="ids.length === 0" @click="handleDelete()">批量删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button v-hasPerm="['generator:gencode:code']" type="warning" plain icon="Download" :disabled="!canGenerate" @click="handleGenTableClick">批量生成</el-button>
|
||||
<el-button v-hasPerm="['generator:gencode:code']" type="warning" plain icon="Download" :disabled="!canGenerate" @click="handleGenTable()">批量生成</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
@@ -88,7 +105,7 @@
|
||||
<el-empty :image-size="80" description="暂无数据" />
|
||||
</template>
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'selection')?.show" type="selection" align="center" width="55"></el-table-column>
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'index')?.show" label="序号" type="index" min-width="60" align="center" fixed>
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'index')?.show" label="序号" type="index" min-width="30" align="center" fixed>
|
||||
<template #default="scope">
|
||||
<span>{{(queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1}}</span>
|
||||
</template>
|
||||
@@ -98,17 +115,11 @@
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'class_name')?.show" label="实体" prop="class_name" :show-overflow-tooltip="true"/>
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'created_at')?.show" label="创建时间" prop="created_at" />
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'updated_at')?.show" label="更新时间" prop="updated_at" />
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'operation')?.show" label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<el-table-column v-if="tableColumns.find(col => col.prop === 'operation')?.show" label="操作" align="center" min-width="120" class-name="small-padding fixed-width">
|
||||
<template #default="scope">
|
||||
<el-tooltip content="代码生成" placement="top">
|
||||
<el-button v-hasPerm="['generator:gencode:update']" link type="primary" :icon="MagicStick" @click="handleEditTable(scope.row)"></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="删除" placement="top">
|
||||
<el-button v-hasPerm="['generator:gencode:delete']" link type="danger" icon="Delete" @click="handleDelete(scope.row)"></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="同步" placement="top">
|
||||
<el-button v-hasPerm="['generator:gencode:sync']" link type="success" icon="Refresh" @click="handleSynchDb(scope.row)"></el-button>
|
||||
</el-tooltip>
|
||||
<el-button v-hasPerm="['generator:gencode:update']" link type="primary" :icon="MagicStick" @click="handleEditTable(scope.row)">代码生成</el-button>
|
||||
<el-button v-hasPerm="['generator:gencode:delete']" link type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
|
||||
<el-button v-hasPerm="['generator:gencode:sync']" link type="success" icon="Refresh" @click="handleSynchDb(scope.row)">同步</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -195,7 +206,7 @@
|
||||
|
||||
<!-- 代码生成抽屉 -->
|
||||
<el-drawer v-model="editVisible" :title="'【代码生成】' + info.table_name" size="80%" @close="handleClose">
|
||||
<el-steps :active="activeStep" align-center finish-status="success" simple>
|
||||
<el-steps :active="activeStep" finish-status="success" simple>
|
||||
<el-step title="基础配置" />
|
||||
<el-step title="字段配置" />
|
||||
<el-step title="预览代码" />
|
||||
@@ -243,8 +254,8 @@
|
||||
<el-button size="small" type="primary" plain>查询</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="bulkSet('is_query', 1)">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_query', 0)">全不选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_query', '1')">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_query', '0')">全不选</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
@@ -252,17 +263,26 @@
|
||||
<el-button size="small" type="success" plain>列表</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="bulkSet('is_list', 1)">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_list', 0)">全不选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_list', '1')">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_list', '0')">全不选</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
<el-dropdown>
|
||||
<el-button size="small" type="warning" plain>表单</el-button>
|
||||
<el-button size="small" type="warning" plain>新增</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="bulkSet(['is_insert', 'is_edit'], 1)">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet(['is_insert', 'is_edit'], 0)">全不选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_insert', '1')">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_insert', '0')">全不选</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
<el-dropdown>
|
||||
<el-button size="small" type="danger" plain>编辑</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="bulkSet('is_edit', '1')">全选</el-dropdown-item>
|
||||
<el-dropdown-item @click="bulkSet('is_edit', '0')">全不选</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
@@ -270,22 +290,24 @@
|
||||
</div>
|
||||
<el-table
|
||||
ref="dragTable"
|
||||
v-loading="loading"
|
||||
:data="columns"
|
||||
row-key="id"
|
||||
:max-height="tableHeight"
|
||||
highlight--currentrow
|
||||
class="data-table__content"
|
||||
border
|
||||
stripe
|
||||
>
|
||||
<el-table-column label="序号" type="index" min-width="5%"/>
|
||||
<el-table-column label="字段列名" prop="column_name" min-width="10%" :show-overflow-tooltip="true"/>
|
||||
<el-table-column label="字段描述" min-width="10%">
|
||||
<el-table-column label="字段注释" min-width="10%">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.column_comment"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="列类型" prop="column_type" min-width="10%" :show-overflow-tooltip="true"/>
|
||||
<el-table-column label="字段类型" min-width="11%">
|
||||
<el-table-column label="python类型" min-width="11%">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.python_type">
|
||||
<el-option label="str" value="str" />
|
||||
@@ -301,29 +323,29 @@
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="字段属性" min-width="10%">
|
||||
<el-table-column label="python属性" min-width="10%">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.python_field"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="插入" min-width="5%">
|
||||
<el-table-column label="新增" min-width="5%">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.is_insert" true-label="1" false-label="0"></el-checkbox>
|
||||
<el-checkbox v-model="scope.row.is_insert" true-value="1" false-value="0"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="编辑" min-width="5%">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.is_edit" true-label="1" false-label="0"></el-checkbox>
|
||||
<el-checkbox v-model="scope.row.is_edit" true-value="1" false-value="0"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="列表" min-width="5%">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.is_list" true-label="1" false-label="0"></el-checkbox>
|
||||
<el-checkbox v-model="scope.row.is_list" true-value="1" false-value="0"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="查询" min-width="5%">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.is_query" true-label="1" false-label="0"></el-checkbox>
|
||||
<el-checkbox v-model="scope.row.is_query" true-value="1" false-value="0"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="查询方式" min-width="10%">
|
||||
@@ -342,12 +364,12 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="必填" min-width="5%">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.is_required" true-label="1" false-label="0"></el-checkbox>
|
||||
<el-checkbox v-model="scope.row.is_required" true-value="1" false-value="0"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="唯一" min-width="5%">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.is_unique" true-label="1" false-label="0"></el-checkbox>
|
||||
<el-checkbox v-model="scope.row.is_unique" true-value="1" false-value="0"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="表单类型" min-width="12%">
|
||||
@@ -382,20 +404,20 @@
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<!-- 第三步:预览 -->
|
||||
<!-- 第三步:预览代码 -->
|
||||
<el-row v-show="activeStep == 2">
|
||||
<el-col :span="24" class="mb-2">
|
||||
<div class="flex-y-center gap-3">
|
||||
<span class="text-sm color-#909399">预览范围</span>
|
||||
<el-radio-group v-model="previewScope" size="small">
|
||||
<el-radio-button label="all">全部</el-radio-button>
|
||||
<el-radio-button label="frontend">前端</el-radio-button>
|
||||
<el-radio-button label="backend">后端</el-radio-button>
|
||||
<el-radio-button label="sql">数据库</el-radio-button>
|
||||
<el-radio-button value="all">全部</el-radio-button>
|
||||
<el-radio-button value="frontend">前端</el-radio-button>
|
||||
<el-radio-button value="backend">后端</el-radio-button>
|
||||
<el-radio-button value="sql">数据库</el-radio-button>
|
||||
</el-radio-group>
|
||||
<span class="ml-3 text-sm color-#909399">类型</span>
|
||||
<el-checkbox-group v-model="previewTypes" size="small">
|
||||
<el-checkbox-button v-for="t in previewTypeOptions" :key="t" :label="t">
|
||||
<el-checkbox-button v-for="t in previewTypeOptions" :key="t" :value="t">
|
||||
{{ t }}
|
||||
</el-checkbox-button>
|
||||
</el-checkbox-group>
|
||||
@@ -442,24 +464,24 @@
|
||||
|
||||
<!-- 第四步:代码生成 -->
|
||||
<el-form v-show="activeStep == 3" ref="genInfo" :model="info" :rules="rules" label-width="150px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="tpl_category">
|
||||
<template #label>生成模板</template>
|
||||
<el-select v-model="info.tpl_category" @change="tplSelectChange">
|
||||
<el-option label="单表(增删改查)" value="crud" />
|
||||
<el-option label="树表(增删改查)" value="tree" />
|
||||
<el-option label="主子表(增删改查)" value="sub" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="tpl_category">
|
||||
<template #label>生成模板</template>
|
||||
<el-select v-model="info.tpl_category" @change="tplSelectChange">
|
||||
<el-option label="单表(增删改查)" value="crud" />
|
||||
<el-option label="树表(增删改查)" value="tree" />
|
||||
<el-option label="主子表(增删改查)" value="sub" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="tpl_web_type">
|
||||
<template #label>前端类型</template>
|
||||
<el-select v-model="info.tpl_web_type">
|
||||
<el-option label="Vue2 Element UI 模版" value="element-ui" />
|
||||
<el-option label="Vue3 Element Plus 模版" value="element-plus" />
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="tpl_web_type">
|
||||
<template #label>前端类型</template>
|
||||
<el-select v-model="info.tpl_web_type" default-first-option>
|
||||
<el-option label="Vue3 Element Plus 模版" value="element-plus" />
|
||||
<el-option label="Vue2 Element UI 模版" value="element-ui" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -468,7 +490,7 @@
|
||||
<el-form-item prop="package_name">
|
||||
<template #label>
|
||||
生成包路径
|
||||
<el-tooltip content="生成在哪个java包下,例如 com.ruoyi.system" placement="top">
|
||||
<el-tooltip content="生成在哪个python模块下,例如 module_gencode" placement="top">
|
||||
<el-icon><QuestionFilled/></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
@@ -630,23 +652,77 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<template v-if="info.tpl_category == 'sub'">
|
||||
<h4 class="form-header">关联信息</h4>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
关联子表的表名
|
||||
<el-tooltip content="关联子表的表名, 如:sys_user" placement="top">
|
||||
<el-icon><QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<el-select v-model="info.sub_table_name" placeholder="请选择" @change="subSelectChange">
|
||||
<el-option
|
||||
v-for="(item, index) in tables"
|
||||
:key="index"
|
||||
:label="item.table_name + ':' + item.table_comment"
|
||||
:value="item.table_name"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item>
|
||||
<template #label>
|
||||
子表关联的外键名
|
||||
<el-tooltip content="子表关联的外键名, 如:user_id" placement="top">
|
||||
<el-icon><QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<el-select v-model="info.sub_table_fk_name" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="(column, index) in subColumns"
|
||||
:key="index"
|
||||
:label="column.column_name + ':' + column.column_comment"
|
||||
:value="column.column_name"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<template #footer>
|
||||
<!-- 公共按钮:关闭 -->
|
||||
<el-button :icon="Close" @click="close">关闭</el-button>
|
||||
<el-button v-if="activeStep !== 0" type="success" :icon="Back" @click="prevStep">上一步</el-button>
|
||||
<el-button v-if="activeStep === 2" type="warning" :icon="Download" @click="handleGenTable(info)">下载代码</el-button>
|
||||
<el-button v-if="activeStep === 3" type="primary" :icon="FolderOpened" :loading="loading" @click="generateCode()">写入本地</el-button>
|
||||
<el-button v-if="activeStep !== 3" type="primary" @click="nextStep">
|
||||
<el-icon v-if="activeStep !== 1">
|
||||
<Right />
|
||||
</el-icon>
|
||||
<el-icon v-if="activeStep === 1">
|
||||
<View />
|
||||
</el-icon>
|
||||
下一步
|
||||
|
||||
<!-- 第一步:只有“下一步” -->
|
||||
<el-button v-if="activeStep === 0" type="primary" @click="nextStep">
|
||||
下一步,字段配置<el-icon class="el-icon--right"><Right /></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 第二步:有“上一步”和“下一步” -->
|
||||
<el-button v-if="activeStep === 1" type="success" :icon="Back" @click="prevStep">上一步,基础配置</el-button>
|
||||
<el-button v-if="activeStep === 1" type="warning" :icon="Edit" @click="submitForm">保存字段配置</el-button>
|
||||
<el-button v-if="activeStep === 1" type="primary" @click="nextStep">
|
||||
下一步,预览代码<el-icon class="el-icon--right"><View /></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 第三步:有“上一步”和“下载代码” -->
|
||||
<el-button v-if="activeStep === 2" type="success" :icon="Back" @click="prevStep">上一步,字段配置</el-button>
|
||||
<el-button v-if="activeStep === 2" type="primary" @click="nextStep">
|
||||
下一步,生成代码<el-icon class="el-icon--right"><Right /></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 第四步:有“上一步”和“写入本地” -->
|
||||
<el-button v-if="activeStep === 3" type="success" :icon="View" @click="prevStep">上一步,预览代码</el-button>
|
||||
<el-button v-if="activeStep === 3" type="warning" :icon="Download" :loading="loading" @click="prepareGenTable(info)">下载代码</el-button>
|
||||
<el-button v-if="activeStep === 3" type="primary" :icon="FolderOpened" :loading="loading" @click="prepareGenTable(info)">写入本地</el-button>
|
||||
</template>
|
||||
</el-drawer>
|
||||
</div>
|
||||
@@ -654,20 +730,21 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
defineOptions({
|
||||
name: "GenCode",
|
||||
inheritAttrs: false,
|
||||
name: "GenCode",
|
||||
inheritAttrs: false,
|
||||
});
|
||||
|
||||
import "codemirror/mode/javascript/javascript.js";
|
||||
import { ref, reactive, computed, onActivated, onMounted } from 'vue';
|
||||
import { useClipboard } from '@vueuse/core';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { useRoute } from 'vue-router';
|
||||
import Codemirror from "codemirror-editor-vue3";
|
||||
import type { EditorConfiguration } from "codemirror";
|
||||
import type { CmComponentRef } from "codemirror-editor-vue3";
|
||||
import { ElMessage, ElMessageBox, type FormInstance, type TableInstance } from 'element-plus';
|
||||
import { QuestionFilled, MagicStick, View, CopyDocument, Close, Right, FolderOpened, Back, Download } from '@element-plus/icons-vue';
|
||||
import GencodeAPI, { type GenTableOutVO, type DatabaseTable, type GenTableQueryParam, type GenTableColumnOutSchema, type GenTableSchema } from "@/api/generator/gencode";
|
||||
import { QuestionFilled, MagicStick, View, CopyDocument, Close, Right, FolderOpened, Back, Download, Edit } from '@element-plus/icons-vue';
|
||||
import GencodeAPI, { type GenTableOutVO, type DatabaseTable, type GenTableQueryParam, type GenTableColumnOutSchema, type GenTableSchema, type DictOption } from "@/api/generator/gencode";
|
||||
import { formatToDateTime } from "@/utils/dateUtil";
|
||||
|
||||
|
||||
// 表格列配置接口
|
||||
@@ -689,16 +766,10 @@ interface TreeNode {
|
||||
// 文件数据接口
|
||||
interface FileData {
|
||||
path: string;
|
||||
fileName: string;
|
||||
file_name: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
// 字典选项接口
|
||||
interface DictOption {
|
||||
dict_type: string;
|
||||
dict_name: string;
|
||||
}
|
||||
|
||||
// 菜单选项接口
|
||||
interface MenuOption {
|
||||
id: number;
|
||||
@@ -719,7 +790,9 @@ const total = ref<number>(0);
|
||||
const uniqueId = ref("");
|
||||
const editVisible = ref(false);
|
||||
const tableHeight = ref<number>(0);
|
||||
const activeStep = ref(0);
|
||||
const activeStep = ref(2);
|
||||
const isExpandable = ref(true);
|
||||
const isExpand = ref(false);
|
||||
|
||||
// UI状态
|
||||
const createTableVisible = ref(false);
|
||||
@@ -727,7 +800,7 @@ const importVisible = ref(false);
|
||||
|
||||
// 表单和列表数据
|
||||
const createContent = ref("");
|
||||
const dateRange = ref<string[]>([]);
|
||||
const dateRange = ref<[Date, Date] | []>([]);
|
||||
const tableList = ref<GenTableOutVO[]>([]);
|
||||
const dbTableList = ref<DatabaseTable[]>([]);
|
||||
const ids = ref<number[]>([]);
|
||||
@@ -767,7 +840,7 @@ const preview = reactive({
|
||||
open: false,
|
||||
title: "代码预览",
|
||||
data: {},
|
||||
active_name: "model.py"
|
||||
active_name: "controller.py"
|
||||
});
|
||||
|
||||
const previewScope = ref<"all" | "frontend" | "backend" | "sql">('all');
|
||||
@@ -781,7 +854,9 @@ const queryFormData = reactive<GenTableQueryParam>({
|
||||
page_no: 1,
|
||||
page_size: 10,
|
||||
table_name: undefined,
|
||||
table_comment: undefined
|
||||
table_comment: undefined,
|
||||
start_time: undefined,
|
||||
end_time: undefined,
|
||||
});
|
||||
|
||||
// 表格列配置
|
||||
@@ -806,6 +881,18 @@ const cmOptions: EditorConfiguration = {
|
||||
readOnly: true
|
||||
};
|
||||
|
||||
// 处理日期范围变化
|
||||
function handleDateRangeChange(range: [Date, Date]) {
|
||||
dateRange.value = range;
|
||||
if (range && range.length === 2) {
|
||||
queryFormData.start_time = formatToDateTime(range[0]);
|
||||
queryFormData.end_time = formatToDateTime(range[1]);
|
||||
} else {
|
||||
queryFormData.start_time = undefined;
|
||||
queryFormData.end_time = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// 工具函数
|
||||
const { copy } = useClipboard();
|
||||
|
||||
@@ -909,9 +996,9 @@ function buildTree(data: FileData[]): TreeNode {
|
||||
|
||||
// 添加文件节点
|
||||
currentNode.children?.push({
|
||||
label: item.fileName,
|
||||
label: item.file_name,
|
||||
content: item?.content,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
return root;
|
||||
@@ -945,7 +1032,7 @@ async function handlePreview(row: GenTableOutVO): Promise<void> {
|
||||
|
||||
return {
|
||||
path,
|
||||
fileName,
|
||||
file_name: fileName,
|
||||
content: contentStr
|
||||
} as FileData;
|
||||
});
|
||||
@@ -980,17 +1067,7 @@ async function handlePreview(row: GenTableOutVO): Promise<void> {
|
||||
async function loadingData(): Promise<void> {
|
||||
loading.value = true;
|
||||
try {
|
||||
// 创建包含日期范围的查询参数
|
||||
const queryParams = {
|
||||
...queryFormData,
|
||||
// 添加日期范围参数
|
||||
...(dateRange.value.length > 0 ? {
|
||||
start_time: dateRange.value[0],
|
||||
end_time: dateRange.value[1]
|
||||
} : {})
|
||||
};
|
||||
|
||||
const response = await GencodeAPI.listTable(queryParams);
|
||||
const response = await GencodeAPI.listTable(queryFormData);
|
||||
if (response?.data?.data) {
|
||||
tableList.value = response.data.data.items;
|
||||
total.value = response.data.data.total;
|
||||
@@ -1028,7 +1105,9 @@ async function handleGenTable(row?: GenTableOutVO): Promise<void> {
|
||||
}
|
||||
|
||||
await GencodeAPI.genCodeToPath(tbNames[0]);
|
||||
ElMessage.success('代码已生成到指定路径');
|
||||
} else {
|
||||
// ZIP压缩包下载
|
||||
const tableNamesArray = Array.isArray(tbNames) ? tbNames : [tbNames];
|
||||
const response = await GencodeAPI.batchGenCode(tableNamesArray);
|
||||
// 处理文件下载
|
||||
@@ -1039,6 +1118,7 @@ async function handleGenTable(row?: GenTableOutVO): Promise<void> {
|
||||
link.download = 'code.zip';
|
||||
link.click();
|
||||
URL.revokeObjectURL(url); // 释放URL对象
|
||||
ElMessage.success('代码生成成功,正在下载...');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('生成代码失败:', error);
|
||||
@@ -1047,11 +1127,6 @@ async function handleGenTable(row?: GenTableOutVO): Promise<void> {
|
||||
}
|
||||
}
|
||||
|
||||
/** 工具栏生成代码按钮点击事件 */
|
||||
function handleGenTableClick(): void {
|
||||
handleGenTable();
|
||||
}
|
||||
|
||||
/** 同步数据库操作 */
|
||||
async function handleSynchDb(row: GenTableOutVO): Promise<void> {
|
||||
const tableName = row.table_name || '';
|
||||
@@ -1253,11 +1328,8 @@ async function handleQuery(): Promise<void> {
|
||||
await loadingData();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 路由和导航
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
|
||||
// ===== 生命周期和初始化 =====
|
||||
@@ -1316,9 +1388,6 @@ const rules = {
|
||||
};
|
||||
|
||||
// ===== 工具函数
|
||||
|
||||
|
||||
|
||||
/** 生成模板变更处理 */
|
||||
function tplSelectChange(): void {
|
||||
// 当选择树表模板时,重置树相关字段
|
||||
@@ -1418,8 +1487,10 @@ async function submitForm() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** 生成代码 - 第四步执行 */
|
||||
async function generateCode() {
|
||||
|
||||
/** 关闭抽屉 */
|
||||
// 在生成代码前保存配置并处理菜单和字典信息
|
||||
async function prepareGenTable(info: GenTableOutVO) {
|
||||
try {
|
||||
// 先保存配置
|
||||
const saved = await submitForm();
|
||||
@@ -1427,45 +1498,17 @@ async function generateCode() {
|
||||
return;
|
||||
}
|
||||
|
||||
loading.value = true;
|
||||
// 调用handleGenTable执行实际的代码生成
|
||||
await handleGenTable(info);
|
||||
|
||||
// 执行代码生成
|
||||
const tableName = info.table_name || 'unknown_table';
|
||||
if (info.gen_type === '1') {
|
||||
// 自定义路径生成
|
||||
await GencodeAPI.genCodeToPath(tableName);
|
||||
ElMessage.success('代码已生成到指定路径');
|
||||
} else {
|
||||
// ZIP压缩包下载
|
||||
const response = await GencodeAPI.batchGenCode([tableName]);
|
||||
// 处理文件下载
|
||||
const blob = new Blob([response.data], { type: 'application/zip' });
|
||||
const url = URL.createObjectURL(blob);
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = `${tableName}_code.zip`;
|
||||
link.click();
|
||||
URL.revokeObjectURL(url); // 释放URL对象
|
||||
ElMessage.success('代码生成成功,正在下载...');
|
||||
}
|
||||
|
||||
// 生成成功后关闭抽屉并返回列表页
|
||||
// 生成成功后关闭抽屉
|
||||
editVisible.value = false;
|
||||
setTimeout(() => {
|
||||
router.push({
|
||||
path: '/gencode/backcode/index',
|
||||
query: { t: new Date().getTime() }
|
||||
});
|
||||
}, 1500);
|
||||
} catch (error) {
|
||||
console.error('生成代码失败:', error);
|
||||
ElMessage.error('代码生成失败,请稍后重试');
|
||||
} finally {
|
||||
loading.value = false;
|
||||
console.error('准备生成代码失败:', error);
|
||||
ElMessage.error('操作失败,请稍后重试');
|
||||
}
|
||||
}
|
||||
|
||||
/** 关闭抽屉 */
|
||||
// 下一步
|
||||
async function nextStep(): Promise<void> {
|
||||
if (activeStep.value < 3) {
|
||||
|
||||
Reference in New Issue
Block a user