feat(generator): 代码生成字段配置支持选择关联字典

暂时仅支持前端部分生成

Closes #I9SWQB
Closes #55
This commit is contained in:
2024-08-27 00:01:57 +08:00
parent e17d5db0fb
commit fdd21a01c1
17 changed files with 143 additions and 93 deletions

View File

@@ -141,6 +141,12 @@ public class FieldConfigDO implements Serializable {
@Schema(description = "查询方式", example = "1")
private QueryTypeEnum queryType;
/**
* 字典编码
*/
@Schema(description = "字典编码", example = "notice_type")
private String dictCode;
/**
* 创建时间
*/

View File

@@ -366,27 +366,35 @@ public class GeneratorServiceImpl implements GeneratorService {
.toList();
genConfigMap.put("fieldConfigs", fieldConfigList);
// 统计部分特殊字段特征
genConfigMap.put("hasLocalDateTime", false);
genConfigMap.put("hasBigDecimal", false);
genConfigMap.put("hasLocalDateTimeField", false);
genConfigMap.put("hasBigDecimalField", false);
genConfigMap.put("hasRequiredField", false);
genConfigMap.put("hasListQueryField", false);
genConfigMap.put("hasListField", false);
Set<String> dictCodeSet = new HashSet<>();
for (FieldConfigDO fieldConfig : fieldConfigList) {
String fieldType = fieldConfig.getFieldType();
if ("LocalDateTime".equals(fieldType)) {
genConfigMap.put("hasLocalDateTime", true);
genConfigMap.put("hasLocalDateTimeField", true);
}
if ("BigDecimal".equals(fieldType)) {
genConfigMap.put("hasBigDecimal", true);
genConfigMap.put("hasBigDecimalField", true);
}
// 必填项
if (Boolean.TRUE.equals(fieldConfig.getIsRequired())) {
genConfigMap.put("hasRequiredField", true);
}
// 字典码
if (StrUtil.isNotBlank(fieldConfig.getDictCode())) {
genConfigMap.put("hasDictField", true);
dictCodeSet.add(fieldConfig.getDictCode());
}
QueryTypeEnum queryType = fieldConfig.getQueryType();
if (null != queryType && StrUtil.equalsAny(queryType.name(), QueryTypeEnum.IN.name(), QueryTypeEnum.NOT_IN
.name(), QueryTypeEnum.BETWEEN.name())) {
genConfigMap.put("hasListQueryField", true);
genConfigMap.put("hasListField", true);
}
}
genConfigMap.put("dictCodes", dictCodeSet);
String subPackageName = templateConfig.getPackageName();
genConfigMap.put("subPackageName", subPackageName);
}

View File

@@ -1,10 +1,10 @@
package ${packageName}.${subPackageName};
import java.io.Serial;
<#if hasLocalDateTime>
<#if hasLocalDateTimeField>
import java.time.LocalDateTime;
</#if>
<#if hasBigDecimal>
<#if hasBigDecimalField>
import java.math.BigDecimal;
</#if>

View File

@@ -1,10 +1,10 @@
package ${packageName}.${subPackageName};
import java.io.Serial;
<#if hasLocalDateTime>
<#if hasLocalDateTimeField>
import java.time.LocalDateTime;
</#if>
<#if hasBigDecimal>
<#if hasBigDecimalField>
import java.math.BigDecimal;
</#if>

View File

@@ -2,13 +2,13 @@ package ${packageName}.${subPackageName};
import java.io.Serial;
import java.io.Serializable;
<#if hasLocalDateTime>
<#if hasLocalDateTimeField>
import java.time.LocalDateTime;
</#if>
<#if hasBigDecimal>
<#if hasBigDecimalField>
import java.math.BigDecimal;
</#if>
<#if hasListQueryField>
<#if hasListField>
import java.util.List;
</#if>

View File

@@ -1,10 +1,10 @@
package ${packageName}.${subPackageName};
import java.io.Serial;
<#if hasLocalDateTime>
<#if hasLocalDateTimeField>
import java.time.LocalDateTime;
</#if>
<#if hasBigDecimal>
<#if hasBigDecimalField>
import java.math.BigDecimal;
</#if>

View File

@@ -1,10 +1,10 @@
package ${packageName}.${subPackageName};
import java.io.Serial;
<#if hasLocalDateTime>
<#if hasLocalDateTimeField>
import java.time.LocalDateTime;
</#if>
<#if hasBigDecimal>
<#if hasBigDecimalField>
import java.math.BigDecimal;
</#if>

View File

@@ -29,15 +29,9 @@ const isUpdate = computed(() => !!dataId.value)
const title = computed(() => (isUpdate.value ? '修改${businessName}' : '新增${businessName}'))
const formRef = ref<InstanceType<typeof GiForm>>()
<#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInForm>
<#-- SELECT/RADIO/CHECK_BOX/TREE_SELECT控件从服务器端获取数据 -->
<#if fieldConfig.formType = 'SELECT' || fieldConfig.formType = 'RADIO'
|| fieldConfig.formType = 'CHECK_BOX' || fieldConfig.formType = 'TREE_SELECT'>
const { ${fieldConfig.columnName}_enum } = useDict('${fieldConfig.columnName}_enum')
<#if hasDictField>
const { <#list dictCodes as dictCode>${dictCode}<#if dictCode_has_next>,</#if></#list> } = useDict(<#list dictCodes as dictCode>'${dictCode}'<#if dictCode_has_next>,</#if></#list>)
</#if>
</#if>
</#list>
const options: Options = {
form: {},
@@ -67,16 +61,15 @@ const columns: Columns = reactive([
type: 'switch',
<#elseif fieldConfig.formType = 'CHECK_BOX'>
type: 'check-group',
options: ${fieldConfig.columnName}_enum,
<#elseif fieldConfig.formType = 'TREE_SELECT'>
type: 'tree-select',
data: '${fieldConfig.columnName}_enum',
<#elseif fieldConfig.formType = 'SELECT'>
type: 'select',
options: ${fieldConfig.columnName}_enum,
<#elseif fieldConfig.formType = 'RADIO'>
type: 'radio-group',
options: ${fieldConfig.columnName}_enum,
type: 'radio-group'
</#if>
<#if fieldConfig.dictCode?? && fieldConfig.dictCode != ''>
options: ${fieldConfig.dictCode},
</#if>
<#if fieldConfig.isRequired>
rules: [{ required: true, message: '请输入${fieldConfig.comment}' }]

View File

@@ -12,62 +12,51 @@
:disabled-column-keys="['name']"
@refresh="search"
>
<#-- 查询字段配置 -->
<template #custom-left>
<#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInQuery>
<#if fieldConfig.formType == "SELECT"><#-- 下拉框 -->
<a-select
v-model="queryForm.${fieldConfig.fieldName}"
:options="${fieldConfig.columnName}_enum"
placeholder="请选择${fieldConfig.comment}"
allow-clear
style="width: 150px"
@change="search"
/>
<#elseif fieldConfig.formType == "RADIO"><#-- 单选框 -->
<a-radio-group v-model="queryForm.${fieldConfig.fieldName}" :options="${fieldConfig.columnName}_enum" @change="search"/>
<#elseif fieldConfig.formType == "DATE"><#-- 日期框 -->
<#if fieldConfig.queryType == "BETWEEN">
<a-range-picker
v-model="queryForm.${fieldConfig.fieldName}"
:placeholder="['请选择开始${fieldConfig.comment}','请选择结束${fieldConfig.comment}']"
format="YYYY-MM-DD"
style="width: 100%"
/>
<#else>
<a-date-picker
v-model="queryForm.${fieldConfig.fieldName}"
placeholder="请选择${fieldConfig.comment}"
format="YYYY-MM-DD"
style="width: 100%"
/>
</#if>
<#elseif fieldConfig.formType == "DATE_TIME"><#-- 日期时间框 -->
<#if fieldConfig.queryType == "BETWEEN">
<a-range-picker
v-model="queryForm.${fieldConfig.fieldName}"
:placeholder="['请选择开始${fieldConfig.comment}','请选择结束${fieldConfig.comment}']"
show-time
format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
/>
<#else>
<a-date-picker
v-model="queryForm.${fieldConfig.fieldName}"
placeholder="请选择${fieldConfig.comment}"
show-time
format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
/>
</#if>
<#else>
<a-input v-model="queryForm.${fieldConfig.fieldName}" placeholder="请输入${fieldConfig.comment}" allow-clear @change="search">
<template #prefix><icon-search /></template>
</a-input>
</#if>
<#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInQuery>
<#if fieldConfig.formType == "SELECT"><#-- 下拉框 -->
<a-select
v-model="queryForm.${fieldConfig.fieldName}"
:options="${fieldConfig.columnName}_enum"
placeholder="请选择${fieldConfig.comment}"
allow-clear
style="width: 150px"
@change="search"
/>
<#elseif fieldConfig.formType == "RADIO"><#-- 单选框 -->
<a-radio-group v-model="queryForm.${fieldConfig.fieldName}" :options="${fieldConfig.dictCode}" @change="search"/>
<#elseif fieldConfig.formType == "DATE"><#-- 日期框 -->
<#if fieldConfig.queryType == "BETWEEN">
<DateRangePicker v-model="queryForm.${fieldConfig.fieldName}" format="YYYY-MM-DD" @change="search" />
<#else>
<a-date-picker
v-model="queryForm.${fieldConfig.fieldName}"
placeholder="请选择${fieldConfig.comment}"
format="YYYY-MM-DD"
style="height: 32px"
/>
</#if>
</#list>
<#elseif fieldConfig.formType == "DATE_TIME"><#-- 日期时间框 -->
<#if fieldConfig.queryType == "BETWEEN">
<DateRangePicker v-model="queryForm.${fieldConfig.fieldName}" @change="search" />
<#else>
<a-date-picker
v-model="queryForm.${fieldConfig.fieldName}"
placeholder="请选择${fieldConfig.comment}"
show-time
format="YYYY-MM-DD HH:mm:ss"
style="height: 32px"
/>
</#if>
<#else>
<a-input v-model="queryForm.${fieldConfig.fieldName}" placeholder="请输入${fieldConfig.comment}" allow-clear @change="search">
<template #prefix><icon-search /></template>
</a-input>
</#if>
</#if>
</#list>
<a-button @click="reset">重置</a-button>
</template>
<template #custom-right>
@@ -83,9 +72,19 @@
</a-button>
</a-tooltip>
</template>
<#-- 列字段配置 -->
<template #name="{ record }">
<a-link @click="onDetail(record)">{{ record.name }}</a-link>
</template>
<#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInList>
<#if fieldConfig.dictCode?? && fieldConfig.dictCode != "">
<template #${fieldConfig.fieldName}="{ record }">
<GiCellTag :value="record.${fieldConfig.fieldName}" :dict="${fieldConfig.dictCode}" />
</template>
</#if>
</#if>
</#list>
<template #action="{ record }">
<a-space>
<a-link v-permission="['${apiModuleName}:${apiName}:update']" @click="onUpdate(record)">修改</a-link>
@@ -118,6 +117,10 @@ import { useDict } from '@/hooks/app'
defineOptions({ name: '${classNamePrefix}' })
<#if hasDictField>
const { <#list dictCodes as dictCode>${dictCode}<#if dictCode_has_next>,</#if></#list> } = useDict(<#list dictCodes as dictCode>'${dictCode}'<#if dictCode_has_next>,</#if></#list>)
</#if>
const queryForm = reactive<${classNamePrefix}Query>({
<#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInQuery>
@@ -127,14 +130,6 @@ const queryForm = reactive<${classNamePrefix}Query>({
sort: ['createTime,desc']
})
<#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInQuery>
<#if fieldConfig.formType == "SELECT" || fieldConfig.formType == "RADIO">
const { ${fieldConfig.columnName}_enum } = useDict('${fieldConfig.columnName}_enum')
</#if>
</#if>
</#list>
const {
tableData: dataList,
loading,