feat(代码生成):快速生成代码到指定项目目录

pull/791/head
yingjie.liu 2025-07-11 16:15:49 +08:00
parent 2e495f1312
commit 1730b79d6e
2 changed files with 191 additions and 0 deletions

View File

@ -110,3 +110,13 @@ export const deleteCodegenTable = (id: number) => {
export const deleteCodegenTableList = (ids: number[]) => {
return request.delete({ url: '/infra/codegen/delete-list', params: { tableIds: ids.join(',') } })
}
// 快速生成代码到指定路径
export const generateCodeToPath = (data: {
tableId: number
backendPath: string
frontendPath: string
overwrite: boolean
}) => {
return request.post({ url: '/infra/codegen/generate-to-path', data })
}

View File

@ -144,6 +144,14 @@
>
生成代码
</el-button>
<el-button
v-hasPermi="['infra:codegen:download']"
link
type="success"
@click="handleQuickGenTable(scope.row)"
>
快速生成代码
</el-button>
</template>
</el-table-column>
</el-table>
@ -160,6 +168,47 @@
<ImportTable ref="importRef" @success="getList" />
<!-- 弹窗预览代码 -->
<PreviewCode ref="previewRef" />
<!-- 弹窗快速生成代码 -->
<Dialog title="快速生成代码到指定路径" v-model="quickGenDialogVisible" width="600px">
<el-form
ref="quickGenFormRef"
:model="quickGenForm"
:rules="quickGenRules"
label-width="120px"
v-loading="quickGenLoading"
>
<el-form-item label="前端路径" prop="frontendPath">
<el-input
v-model="quickGenForm.frontendPath"
placeholder="请输入前端代码生成路径D:\workspace\frontend\src"
/>
</el-form-item>
<el-form-item label="后端路径" prop="backendPath">
<el-input
v-model="quickGenForm.backendPath"
placeholder="请输入后端代码生成路径D:\workspace\backend\src"
/>
</el-form-item>
<el-form-item label="覆盖选项" prop="overwrite">
<el-checkbox v-model="quickGenForm.overwrite">
覆盖已存在的文件
</el-checkbox>
<div class="form-item-tip">
勾选后将覆盖目标路径中已存在的同名文件请谨慎操作
</div>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitQuickGen" type="primary" :disabled="quickGenLoading">
</el-button>
<el-button @click="quickGenDialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import { dateFormatter } from '@/utils/formatTime'
@ -188,6 +237,61 @@ const queryParams = reactive({
const queryFormRef = ref() //
const dataSourceConfigList = ref<DataSourceConfigApi.DataSourceConfigVO[]>([]) //
//
const quickGenDialogVisible = ref(false) //
const quickGenLoading = ref(false) //
const quickGenFormRef = ref() //
const currentTableRow = ref<CodegenApi.CodegenTableVO>() //
//
const quickGenForm = reactive({
frontendPath: '',
backendPath: '',
overwrite: false
})
//
const quickGenRules = reactive({
frontendPath: [
{ required: true, message: '请输入前端代码生成路径', trigger: 'blur' },
{
validator: (rule: any, value: string, callback: any) => {
if (!value) {
callback()
return
}
//
const isValidPath = /^[a-zA-Z]:\\|^\/|^\./.test(value) || value.includes('/')
if (!isValidPath) {
callback(new Error('请输入有效的路径格式'))
} else {
callback()
}
},
trigger: 'blur'
}
],
backendPath: [
{ required: true, message: '请输入后端代码生成路径', trigger: 'blur' },
{
validator: (rule: any, value: string, callback: any) => {
if (!value) {
callback()
return
}
//
const isValidPath = /^[a-zA-Z]:\\|^\/|^\./.test(value) || value.includes('/')
if (!isValidPath) {
callback(new Error('请输入有效的路径格式'))
} else {
callback()
}
},
trigger: 'blur'
}
]
})
/** 查询列表 */
const getList = async () => {
loading.value = true
@ -277,6 +381,60 @@ const handleGenTable = async (row: CodegenApi.CodegenTableVO) => {
download.zip(res, 'codegen-' + row.className + '.zip')
}
/** 快速生成代码操作 */
const handleQuickGenTable = (row: CodegenApi.CodegenTableVO) => {
currentTableRow.value = row
quickGenDialogVisible.value = true
resetQuickGenForm()
}
/** 提交快速生成代码表单 */
const submitQuickGen = async () => {
//
if (!quickGenFormRef.value) return
await quickGenFormRef.value.validate()
//
try {
const confirmMessage = quickGenForm.overwrite
? '确认生成代码到指定路径?这将覆盖已存在的文件!'
: '确认生成代码到指定路径?'
await message.confirm(confirmMessage, '确认操作')
} catch {
return
}
//
quickGenLoading.value = true
try {
await CodegenApi.generateCodeToPath({
tableId: currentTableRow.value!.id,
backendPath: quickGenForm.backendPath,
frontendPath: quickGenForm.frontendPath,
overwrite: quickGenForm.overwrite
})
message.success('代码生成成功!')
quickGenDialogVisible.value = false
} catch (error) {
console.error('代码生成失败:', error)
message.error('代码生成失败,请检查路径是否正确')
} finally {
quickGenLoading.value = false
}
}
/** 重置快速生成代码表单 */
const resetQuickGenForm = () => {
quickGenForm.frontendPath = ''
quickGenForm.backendPath = ''
quickGenForm.overwrite = false
quickGenFormRef.value?.resetFields()
}
/** 初始化 **/
onMounted(async () => {
await getList()
@ -284,3 +442,26 @@ onMounted(async () => {
dataSourceConfigList.value = await DataSourceConfigApi.getDataSourceConfigList()
})
</script>
<style scoped>
.preset-paths {
margin-top: 8px;
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.preset-label {
font-size: 12px;
color: #606266;
margin-right: 4px;
}
.form-item-tip {
font-size: 12px;
color: #909399;
margin-top: 4px;
line-height: 1.4;
}
</style>