feat(codegen): 添加代码生成器批量操作功能

This commit is contained in:
zxy 2026-04-30 14:10:52 +08:00
parent 4f1215ad12
commit e0f78da62e
8 changed files with 133 additions and 9 deletions

View File

@ -7,6 +7,18 @@
<artifactId>mes-module-infra</artifactId> <artifactId>mes-module-infra</artifactId>
<version>${revision}</version> <version>${revision}</version>
</parent> </parent>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>16</source>
<target>16</target>
</configuration>
</plugin>
</plugins>
</build>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>mes-module-infra-biz</artifactId> <artifactId>mes-module-infra-biz</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -6,10 +6,6 @@ import com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult; import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils; import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import com.ningxia.yunxi.chemmes.framework.common.util.servlet.ServletUtils; import com.ningxia.yunxi.chemmes.framework.common.util.servlet.ServletUtils;
import com.ningxia.yunxi.chemmes.module.infra.convert.codegen.CodegenConvert;
import com.ningxia.yunxi.chemmes.module.infra.dal.dataobject.codegen.CodegenColumnDO;
import com.ningxia.yunxi.chemmes.module.infra.dal.dataobject.codegen.CodegenTableDO;
import com.ningxia.yunxi.chemmes.module.infra.service.codegen.CodegenService;
import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO;
import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO;
import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO;
@ -17,10 +13,14 @@ import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.Codege
import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO;
import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; import com.ningxia.yunxi.chemmes.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO;
import io.swagger.v3.oas.annotations.tags.Tag; import com.ningxia.yunxi.chemmes.module.infra.convert.codegen.CodegenConvert;
import com.ningxia.yunxi.chemmes.module.infra.dal.dataobject.codegen.CodegenColumnDO;
import com.ningxia.yunxi.chemmes.module.infra.dal.dataobject.codegen.CodegenTableDO;
import com.ningxia.yunxi.chemmes.module.infra.service.codegen.CodegenService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -31,8 +31,10 @@ import javax.validation.Valid;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import static com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult.success; import static com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult.success;
import static com.ningxia.yunxi.chemmes.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static com.ningxia.yunxi.chemmes.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@ -46,6 +48,37 @@ public class CodegenController {
@Resource @Resource
private CodegenService codegenService; private CodegenService codegenService;
// CodegenController.java 需要添加
@Operation(summary = "批量删除数据库的表和字段定义")
@DeleteMapping("/delete-list")
@PreAuthorize("@ss.hasPermission('infra:codegen:delete')")
public CommonResult<Boolean> deleteCodegenList(@RequestBody List<Long> tableIds) {
codegenService.deleteCodegenList(tableIds);
return success(true);
}
@Operation(summary = "批量下载生成代码")
@GetMapping("/download-list")
@PreAuthorize("@ss.hasPermission('infra:codegen:download')")
public void downloadCodegenList(String tableIds, HttpServletResponse response) throws IOException {
if (tableIds == null || tableIds.isEmpty()) {
throw new IllegalArgumentException("表ID列表不能为空");
}
String[] split = tableIds.trim().split(",");
//数组转换为List
List<Long> list = Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList());
Map<String, String> codes = codegenService.generationCodesList(list);
String[] paths = codes.keySet().toArray(new String[0]);
ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipUtil.zip(outputStream, paths, ins);
ServletUtils.writeAttachment(response, "codegen-batch.zip", outputStream.toByteArray());
}
@GetMapping("/db/table/list") @GetMapping("/db/table/list")
@Operation(summary = "获得数据库自带的表定义列表", description = "会过滤掉已经导入 Codegen 的表") @Operation(summary = "获得数据库自带的表定义列表", description = "会过滤掉已经导入 Codegen 的表")
@Parameters({ @Parameters({

View File

@ -98,4 +98,9 @@ public interface CodegenService {
*/ */
List<DatabaseTableRespVO> getDatabaseTableList(Long dataSourceConfigId, String name, String comment); List<DatabaseTableRespVO> getDatabaseTableList(Long dataSourceConfigId, String name, String comment);
// CodegenService.java 需要添加
void deleteCodegenList(List<Long> tableIds);
Map<String, String> generationCodesList(List<Long> tableIds);
} }

View File

@ -285,4 +285,26 @@ public class CodegenServiceImpl implements CodegenService {
return BeanUtils.toBean(tables, DatabaseTableRespVO.class); return BeanUtils.toBean(tables, DatabaseTableRespVO.class);
} }
// CodegenServiceImpl.java 需要添加
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteCodegenList(List<Long> tableIds) {
for (Long tableId : tableIds) {
deleteCodegen(tableId);
}
}
@Override
public Map<String, String> generationCodesList(List<Long> tableIds) {
Map<String, String> allCodes = new LinkedHashMap<>();
for (Long tableId : tableIds) {
Map<String, String> codes = generationCodes(tableId);
allCodes.putAll(codes);
}
return allCodes;
}
// ... existing code ...
} }

View File

@ -173,7 +173,7 @@ mes:
codegen: codegen:
base-package: ${mes.info.base-package} base-package: ${mes.info.base-package}
db-schemas: ${spring.datasource.dynamic.datasource.master.name} db-schemas: ${spring.datasource.dynamic.datasource.master.name}
front-type: 10 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
error-code: # 错误码相关配置项 - com.ningxia.yunxi.chemmes.module.majoys.enums.ErrorCodeConstants error-code: # 错误码相关配置项 - com.ningxia.yunxi.chemmes.module.majoys.enums.ErrorCodeConstants
constants-class-list: constants-class-list:
- com.ningxia.yunxi.chemmes.module.infra.enums.ErrorCodeConstants - com.ningxia.yunxi.chemmes.module.infra.enums.ErrorCodeConstants

View File

@ -121,3 +121,13 @@ export const createCodegenList = (data) => {
export const deleteCodegenTable = (id: number) => { export const deleteCodegenTable = (id: number) => {
return request.delete({ url: '/infra/codegen/delete?tableId=' + id }) return request.delete({ url: '/infra/codegen/delete?tableId=' + id })
} }
// 批量删除代码生成表定义
export const deleteCodegenTableList = (ids: number[]) => {
return request.delete({ url: '/infra/codegen/delete-list', data: ids })
}
// 批量下载生成代码
export const downloadCodegenList = (ids: number[]) => {
return request.download({ url: '/infra/codegen/download-list?tableIds=' + ids.join(',') })
}

View File

@ -317,7 +317,7 @@ const props = defineProps({
const formRef = ref() const formRef = ref()
const formData = ref({ const formData = ref({
templateType: null, templateType: null,
frontType: null, frontType: 20,
scene: null, scene: null,
moduleName: '', moduleName: '',
businessName: '', businessName: '',

View File

@ -55,13 +55,32 @@
<Icon class="mr-5px" icon="ep:zoom-in" /> <Icon class="mr-5px" icon="ep:zoom-in" />
导入 导入
</el-button> </el-button>
<el-button
v-hasPermi="['infra:codegen:delete']"
:disabled="selectedIds.length === 0"
type="danger"
@click="handleDeleteAll"
>
<Icon class="mr-5px" icon="ep:delete" />
批量删除
</el-button>
<el-button
v-hasPermi="['infra:codegen:download']"
:disabled="selectedIds.length === 0"
type="primary"
@click="handleGenTableAll"
>
<Icon class="mr-5px" icon="ep:download" />
批量生成代码
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap> </ContentWrap>
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column align="center" label="数据源"> <el-table-column align="center" label="数据源">
<template #default="scope"> <template #default="scope">
{{ {{
@ -168,6 +187,7 @@ const { push } = useRouter() // 路由跳转
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref([]) //
const selectedIds = ref<number[]>([]) // ID
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
@ -249,6 +269,28 @@ const handleGenTable = async (row: CodegenApi.CodegenTableVO) => {
download.zip(res, 'codegen-' + row.className + '.zip') download.zip(res, 'codegen-' + row.className + '.zip')
} }
/** 多选变化处理 */
const handleSelectionChange = (val: CodegenApi.CodegenTableVO[]) => {
selectedIds.value = val.map((item) => item.id)
}
/** 批量删除操作 */
const handleDeleteAll = async () => {
try {
await message.delConfirm()
await CodegenApi.deleteCodegenTableList(selectedIds.value)
message.success(t('common.delSuccess'))
selectedIds.value = []
await getList()
} catch {}
}
/** 批量生成代码操作 */
const handleGenTableAll = async () => {
const res = await CodegenApi.downloadCodegenList(selectedIds.value)
download.zip(res, 'codegen-batch.zip')
}
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
await getList() await getList()