更新代码生成模板

This commit is contained in:
阿沐 2024-09-25 14:17:23 +08:00
parent 12c4661173
commit f593c88083
10 changed files with 168 additions and 74 deletions

View File

@ -1,11 +1,11 @@
{
"project": {
"packageName": "net.maku",
"version": "1.0.0",
"backendPath": "D:\\generator\\maku-boot\\maku-server",
"frontendPath": "D:\\generator\\maku-admin",
"version": "",
"backendPath": "/Users/maku/makunet/maku-boot/maku-boot-new",
"frontendPath": "/Users/maku/makunet/maku-admin",
"tablePrefix": "tb_",
"moduleName": "business",
"moduleName": "test",
"author": "阿沐",
"email": "babamu@126.com"
},

View File

@ -2,7 +2,7 @@ package ${package}.${moduleName}.convert;
import ${package}.${moduleName}.entity.${ClassName}Entity;
import ${package}.${moduleName}.vo.${ClassName}VO;
<#if tableOperation?seq_contains('import') || tableOperation?seq_contains('export')>
<#if !hasSub?? && (tableOperation?seq_contains('import') || tableOperation?seq_contains('export'))>
import ${package}.${moduleName}.vo.${ClassName}ExcelVO;
</#if>
import org.mapstruct.Mapper;
@ -28,7 +28,7 @@ public interface ${ClassName}Convert {
List<${ClassName}Entity> convertList2(List<${ClassName}VO> list);
<#if tableOperation?seq_contains('import') || tableOperation?seq_contains('export')>
<#if !hasSub?? && (tableOperation?seq_contains('import') || tableOperation?seq_contains('export'))>
List<${ClassName}ExcelVO> convertExcelList(List<${ClassName}Entity> list);
List<${ClassName}Entity> convertExcelList2(List<${ClassName}ExcelVO> list);

View File

@ -30,6 +30,12 @@ public class ${ClassName}Entity<#if baseClass??> extends ${baseClass.code}</#if>
<#if field.primaryPk>
@TableId
</#if>
<#if field.fieldName == 'deleted'>
@TableLogic
</#if>
<#if field.fieldName == 'version'>
@Version
</#if>
<#if field.autoFill == "INSERT">
@TableField(value = "${field.fieldName}", fill = FieldFill.INSERT)
<#elseif field.autoFill == "INSERT_UPDATE">

View File

@ -6,6 +6,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.fhs.core.trans.vo.TransPojo;
import com.fhs.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType;
import ${package}.framework.common.excel.LocalDateTimeConverter;
<#list importList as i>
import ${i!};
</#list>
@ -29,11 +30,10 @@ public class ${ClassName}ExcelVO implements TransPojo {
</#if>
<#list gridList as field>
<#if field.fieldComment!?length gt 0>
@ExcelProperty("${field.fieldComment}")
</#if>
<#if field.attrType == 'LocalDateTime'>
@ExcelProperty(value = "${field.fieldComment}", converter = LocalDateTimeConverter.class)
@ExcelProperty(value = "${field.fieldComment!}", converter = LocalDateTimeConverter.class)
<#elseif field.fieldComment!?length gt 0>
@ExcelProperty("${field.fieldComment}")
</#if>
<#if field.formDict??>
private String ${field.attrName}Label;

View File

@ -3,6 +3,7 @@ package ${package}.${moduleName}.query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.*;
import ${package}.framework.common.query.Query;
import org.springframework.format.annotation.DateTimeFormat;
@ -24,12 +25,14 @@ public class ${ClassName}Query extends Query {
<#if field.fieldComment!?length gt 0>
@Schema(description = "${field.fieldComment}")
</#if>
<#if field.queryFormType == 'date'>
@DateTimeFormat(pattern="yyyy-MM-dd")
<#elseif field.queryFormType == 'datetime'>
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
<#if field.queryFormType == 'date' || field.queryFormType == 'datetime'>
private List<String> ${field.attrName};
<#else>
private ${field.attrType} ${field.attrName};
</#if>
private ${field.attrType}<#if field.queryFormType == 'date' || field.queryFormType == 'datetime'>[]</#if> ${field.attrName};
</#list>
<#if hasLeftTree>
private List<Long> ${leftRelationField};
</#if>
}

View File

@ -75,32 +75,35 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Dao, ${
private LambdaQueryWrapper<${ClassName}Entity> getWrapper(${ClassName}Query query){
LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
<#if hasTree>
<#list queryList as field>
<#if hasTree && field.attrName == treePid>
<#assign hasTreePid = true>
if (ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}())) {
wrapper.eq(${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
} else {
wrapper.isNull(${ClassName}Entity::get${treePid?cap_first});
}
<#else>
<#if field.queryFormType == 'date' || field.queryFormType == 'datetime'>
if (ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}())) {
wrapper.between(${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}().get(0), query.get${field.attrName?cap_first}().get(1));
}
<#elseif field.queryType == '='>
wrapper.eq(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == 'like'>
wrapper.like(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
</#if>
</#if>
</#list>
<#if hasTree && !hasTreePid??>
wrapper.isNull(${ClassName}Entity::get${treePid?cap_first});
</#if>
<#list queryList as field>
<#if field.queryFormType == 'date' || field.queryFormType == 'datetime'>
wrapper.between(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, ArrayUtils.isNotEmpty(query.get${field.attrName?cap_first}()) ? query.get${field.attrName?cap_first}()[0] : null, ArrayUtils.isNotEmpty(query.get${field.attrName?cap_first}()) ? query.get${field.attrName?cap_first}()[1] : null);
<#elseif field.queryType == '='>
wrapper.eq(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == '!='>
wrapper.ne(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == '>'>
wrapper.gt(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == '>='>
wrapper.ge(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == '<'>
wrapper.lt(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == '<='>
wrapper.le(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == 'like'>
wrapper.like(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == 'left like'>
wrapper.likeLeft(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
<#elseif field.queryType == 'right like'>
wrapper.likeRight(ObjectUtil.isNotEmpty(query.get${field.attrName?cap_first}()), ${ClassName}Entity::get${field.attrName?cap_first}, query.get${field.attrName?cap_first}());
</#if>
</#list>
<#if hasLeftTree>
// 左侧树过滤
wrapper.in(query.get${leftRelationField?cap_first}() != null, ${ClassName}Entity::get${leftRelationField?cap_first}, query.get${leftRelationField?cap_first}());
</#if>
return wrapper;
}
@ -200,7 +203,11 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Dao, ${
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(List<Long> idList) {
<#if hasTree>
idList.forEach(this::deleteAllChildren);
<#else>
removeByIds(idList);
</#if>
<#if subs?size gt 0>
// 删除子表数据
@ -213,6 +220,25 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Dao, ${
}
</#if>
<#if hasTree>
/**
* 递归删除所有子节点
*
* @param id 节点ID
*/
private void deleteAllChildren(Long id) {
// 查询当前节点的所有子节点
List<${ClassName}Entity> childrenList = baseMapper.selectList(new LambdaQueryWrapper<${ClassName}Entity>().eq(${ClassName}Entity::get${treePid?cap_first}, id));
// 递归删除每个子节点
for (${ClassName}Entity children : childrenList) {
deleteAllChildren(children.getId());
}
// 删除当前节点
baseMapper.deleteById(id);
}
</#if>
<#if tableOperation?seq_contains('import')>
@Override
public void importByExcel(MultipartFile file) {

View File

@ -18,9 +18,7 @@ import ${i!};
*/
@Data
@Schema(description = "${tableComment}")
public class ${ClassName}VO implements Serializable {
private static final long serialVersionUID = 1L;
public class ${ClassName}VO {
<#list fieldList as field>
<#if field.fieldComment!?length gt 0>
@Schema(description = "${field.fieldComment}")

View File

@ -39,7 +39,7 @@ const emit = defineEmits(['refreshDataList'])
const visible = defineModel<boolean>('visible')
const dataFormRef = ref()
<#if subs?size gt 0>
const activeName = ref("${subs[0].className}")
const activeName = ref('${subs[0].className}')
</#if>
<#list subs as sub>
const ${sub.className}Ref = ref()

View File

@ -1,11 +1,21 @@
<#macro maFormItem model field>
<el-form-item label="${field.fieldComment!}" prop="${field.attrName}">
<#if hasTree && field.fieldName == treePid>
<#if hasTree && field.attrName == treePid>
<ma-data-tree-select
v-model="${model}.${field.attrName}"
url="${requestUrl}/list"
:props="{ label: '${treeLabel}', value: '${treeId}' }"
pplaceholder="${field.fieldComment!}" />
:props="{ label: '${treeLabel}', value: '${treeId}', pid: '${treePid}' }"
placeholder="${field.fieldComment!}" />
<#elseif hasLeftTree?? && field.attrName == leftRelationField>
<ma-data-tree-select
v-model="${model}.${field.attrName}"
<#if hasLeftFormDs??>
:props="{ label: '${leftTreeLabel}', value: '${leftTreeId}' }"
url="${leftRequestUrl}/list"
<#else>
url="${leftRequestUrl}"
</#if>
/>
<#elseif field.formType == 'input'>
<el-input v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></el-input>
<#elseif field.formType == 'number'>
@ -24,32 +34,40 @@
</#if>
<#elseif field.formType == 'radio'>
<#if field.formDict??>
<ma-dict-radio v-model="${model}.${field.attrName}" dict-type="${field.formDict}"></ma-dict-radio>
<ma-dict-radio v-model="${model}.${field.attrName}" dict-type="${field.formDict}"></ma-dict-radio>
<#else>
<el-radio-group v-model="${model}.${field.attrName}">
<el-radio :value="0">启用</el-radio>
<el-radio :value="1">禁用</el-radio>
</el-radio-group>
<el-radio-group v-model="${model}.${field.attrName}">
<el-radio :value="0">启用</el-radio>
<el-radio :value="1">禁用</el-radio>
</el-radio-group>
</#if>
<#elseif field.formType == 'checkbox'>
<#if field.formDict??>
<ma-dict-checkbox v-model="${model}.${field.attrName}" dict-type="${field.formDict}"></ma-dict-checkbox>
<#else>
<el-checkbox-group v-model="${model}.${field.attrName}">
<el-checkbox :value="1">启用</el-checkbox>
<el-checkbox :value="0">禁用</el-checkbox>
<el-checkbox :value="1">启用</el-checkbox>
<el-checkbox :value="0">禁用</el-checkbox>
</el-checkbox-group>
</#if>
<#elseif field.formType == 'address'>
<ma-address v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></ma-address>
<#elseif field.formType == 'date'>
<el-date-picker type="date" placeholder="${field.fieldComment!}" v-model="${model}.${field.attrName}"></el-date-picker>
<el-date-picker type="date" value-format="YYYY-MM-DD" placeholder="${field.fieldComment!}" v-model="${model}.${field.attrName}"></el-date-picker>
<#elseif field.formType == 'datetime'>
<el-date-picker type="datetime" placeholder="${field.fieldComment!}" v-model="${model}.${field.attrName}"></el-date-picker>
<el-date-picker type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="${field.fieldComment!}" v-model="${model}.${field.attrName}"></el-date-picker>
<#elseif field.formType == 'treeselect'>
<el-tree-select v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></el-tree-select>
<ma-data-tree-select v-model="${model}.${field.attrName}" url="${field.formDict!}" :props="{ label: 'name', value: 'id' }" placeholder="${field.fieldComment!}" />
<#elseif field.formType == 'user'>
<ma-user-input v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></ma-user-input>
<#elseif field.formType == 'org'>
<ma-org-select v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></ma-org-select>
<#elseif field.formType == 'post'>
<ma-post-input v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></ma-post-input>
<#elseif field.formType == 'file'>
<ma-upload-file v-model="${model}.${field.attrName}"></ma-upload-file>
<#elseif field.formType == 'image'>
<ma-upload-images v-model="${model}.${field.attrName}"></ma-upload-images>
<#else>
<el-input v-model="${model}.${field.attrName}" placeholder="${field.fieldComment!}"></el-input>
</#if>

View File

@ -1,14 +1,31 @@
<template>
<#if hasLeftTree>
<el-row :gutter="10">
<el-col :span="5">
<#if hasLeftFormDs??>
<ma-data-tree-left url="${leftRequestUrl}/list" title="${leftTitle}" manage @click="handleClick" @manage="treeVisible = true" />
<#else>
<ma-data-tree-left url="${leftRequestUrl}" title="${leftTitle}" @click="handleClick" />
</#if>
</el-col>
<el-col :span="19">
</#if>
<#if tableOperation?seq_contains('query')>
<el-card class="layout-query">
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList()">
<#list queryList as field>
<el-form-item prop="${field.attrName}">
<#if field.queryFormType == 'text' || field.queryFormType == 'textarea' || field.queryFormType == 'editor'>
<#if hasTree && field.attrName == treePid>
<ma-data-tree-select
v-model="state.queryForm.${field.attrName}"
url="${requestUrl}/list"
:props="{ label: '${treeLabel}', value: '${treeId}', pid: '${treePid}' }"
placeholder="${field.fieldComment!}" />
<#elseif field.queryFormType == 'input'>
<el-input v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}"></el-input>
<#elseif field.queryFormType == 'select'>
<#if field.queryDict??>
<ma-dict-select v-model="state.queryForm.${field.attrName}" dict-type="${field.queryDict}" placeholder="${field.fieldComment!}" clearable></ma-dict-select>
<#if field.formDict??>
<ma-dict-select v-model="state.queryForm.${field.attrName}" dict-type="${field.formDict}" placeholder="${field.fieldComment!}" clearable></ma-dict-select>
<#else>
<el-select v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}">
<el-option label="选择" value="0"></el-option>
@ -16,24 +33,22 @@
</#if>
<#elseif field.queryFormType == 'radio'>
<#if field.formDict??>
<ma-dict-radio v-model="state.queryForm.${field.attrName}" dict-type="${field.formDict}"></ma-dict-radio>
<ma-dict-radio v-model="state.queryForm.${field.attrName}" dict-type="${field.formDict}" placeholder="${field.fieldComment!}"></ma-dict-radio>
<#else>
<el-radio-group v-model="state.queryForm.${field.attrName}">
<el-radio-group v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}">
<el-radio :label="0">单选</el-radio>
</el-radio-group>
</#if>
<#elseif field.queryFormType == 'date'>
<el-date-picker
v-model="daterange"
type="daterange"
value-format="yyyy-MM-dd">
</el-date-picker>
<el-date-picker v-model="state.queryForm.${field.attrName}" value-format="YYYY-MM-DD" type="daterange" start-placeholder="${field.fieldComment!}" end-placeholder="结束日期" clearable />
<#elseif field.queryFormType == 'datetime'>
<el-date-picker
v-model="datetimerange"
type="datetimerange"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
<el-date-picker v-model="state.queryForm.${field.attrName}" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" start-placeholder="${field.fieldComment!}" end-placeholder="结束日期" clearable />
<#elseif field.queryFormType == 'user'>
<ma-user-input v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}"></ma-user-input>
<#elseif field.queryFormType == 'org'>
<ma-org-input v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}"></ma-org-input>
<#elseif field.queryFormType == 'post'>
<ma-post-input v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}"></ma-post-input>
<#else>
<el-input v-model="state.queryForm.${field.attrName}" placeholder="${field.fieldComment!}"></el-input>
</#if>
@ -59,9 +74,9 @@
</#if>
<#if tableOperation?seq_contains('import')>
<el-space <#if authLevel==1>v-auth="'${authority}:import'"</#if>>
<ma-upload-file action="${requestUrl}/import">
<ma-upload-excel action="${requestUrl}/import">
<el-button plain icon="Upload">导入</el-button>
</ma-upload-file>
</ma-upload-excel>
</el-space>
</#if>
<#if tableOperation?seq_contains('export')>
@ -80,7 +95,9 @@
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<#list gridList as field>
<#if field.formDict??>
<ma-dict-table prop="${field.attrName}" label="${field.fieldComment!}" dict-type="${field.formDict}"></ma-dict-table>
<ma-dict-column prop="${field.attrName}" label="${field.fieldComment!}" dict-type="${field.formDict}"></ma-dict-column>
<#elseif field.formType=='image'>
<ma-image-column prop="${field.attrName}" label="${field.fieldComment!}" header-align="center" align="center"></ma-image-column>
<#else>
<el-table-column prop="${field.attrName}" label="${field.fieldComment!}" header-align="center" align="center"></el-table-column>
</#if>
@ -113,7 +130,16 @@
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdateRef" v-model:visible="addOrUpdateVisible" @refreshDataList="getDataList"></add-or-update>
</#if>
<#if hasLeftTree && hasLeftFormDs??>
<el-drawer v-if="treeVisible" v-model="treeVisible" title="${leftTitle}" :size="800" :before-close="handleClose">
<Left${FunctionNameLeft}></Left${FunctionNameLeft}>
</el-drawer>
</#if>
</el-card>
<#if hasLeftTree>
</el-col>
</el-row>
</#if>
</template>
<script setup lang="ts" name="${ModuleName}${FunctionName}Index">
@ -124,13 +150,30 @@
import AddOrUpdate from './add-or-update.vue'
</#if>
<#if hasTree>import { use${FunctionName}TreeLoadApi } from '@/api/${moduleName}/${functionName}'</#if>
<#if hasLeftTree>
<#if hasLeftFormDs??>
import Left${FunctionNameLeft} from '../${functionNameLeft}/index.vue'
import emit, { MittEvent } from '@/utils/emits'
const treeVisible = ref(false)
const handleClose = () => {
treeVisible.value = false
emit.emit(MittEvent.LeftTree)
}
</#if>
const handleClick = (idList: any[]) => {
state.queryForm.${leftRelationField} = idList
getDataList()
}
</#if>
const state: IHooksOptions = reactive({
dataListUrl: '${requestUrl}/page',
<#if tableOperation?seq_contains('query')>
deleteUrl: '${requestUrl}',
</#if>
queryForm: {
<#if hasLeftTree>${leftRelationField}: [],</#if>
<#list queryList as field>
<#if field.formType == 'date'>
startDate: '',