Skip to content

Commit

Permalink
feat(generator): 代码生成字段配置支持选择关联字典
Browse files Browse the repository at this point in the history
暂时仅支持前端部分生成

Closes #I9SWQB
Closes #55
  • Loading branch information
Charles7c committed Aug 26, 2024
1 parent e17d5db commit fdd21a0
Show file tree
Hide file tree
Showing 17 changed files with 143 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ public class FieldConfigDO implements Serializable {
@Schema(description = "查询方式", example = "1")
private QueryTypeEnum queryType;

/**
* 字典编码
*/
@Schema(description = "字典编码", example = "notice_type")
private String dictCode;

/**
* 创建时间
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -366,27 +366,35 @@ private void pretreatment(Map<String, Object> genConfigMap,
.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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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>

Expand Down
Original file line number Diff line number Diff line change
@@ -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>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down
Original file line number Diff line number Diff line change
@@ -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>

Expand Down
Original file line number Diff line number Diff line change
@@ -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>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
<#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>
</#list>
const options: Options = {
form: {},
Expand Down Expand Up @@ -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}' }]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
<#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>
</#list>
<#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>
Expand All @@ -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>
Expand Down Expand Up @@ -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>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import top.continew.starter.extension.crud.annotation.DictField;
import top.continew.starter.extension.crud.model.entity.BaseDO;

import java.io.Serial;
Expand All @@ -29,6 +30,7 @@
* @since 2023/9/11 21:29
*/
@Data
@DictField(valueKey = "code")
@TableName("sys_dict")
public class DictDO extends BaseDO {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,11 @@ public interface DictItemService extends BaseService<DictItemResp, DictItemResp,
* @param dictIds 字典 ID 列表
*/
void deleteByDictIds(List<Long> dictIds);

/**
* 查询枚举字典名称列表
*
* @return 枚举字典名称列表
*/
List<String> listEnumDictNames();
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,23 @@
import top.continew.admin.system.model.req.DictReq;
import top.continew.admin.system.model.resp.DictResp;
import top.continew.starter.data.mybatis.plus.service.IService;
import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.service.BaseService;

import java.util.List;

/**
* 字典业务接口
*
* @author Charles7c
* @since 2023/9/11 21:29
*/
public interface DictService extends BaseService<DictResp, DictResp, DictQuery, DictReq>, IService<DictDO> {

/**
* 查询枚举字典
*
* @return 枚举字典列表
*/
List<LabelValueResp> listEnumDict();
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@
import top.continew.starter.cache.redisson.util.RedisUtils;
import top.continew.starter.core.autoconfigure.project.ProjectProperties;
import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.util.validate.CheckUtils;
import top.continew.starter.core.enums.BaseEnum;
import top.continew.starter.core.util.validate.CheckUtils;
import top.continew.starter.extension.crud.model.resp.LabelValueResp;
import top.continew.starter.extension.crud.service.impl.BaseServiceImpl;

Expand Down Expand Up @@ -81,6 +81,11 @@ public void deleteByDictIds(List<Long> dictIds) {
RedisUtils.deleteByPattern(CacheConstants.DICT_KEY_PREFIX + StringConstants.ASTERISK);
}

@Override
public List<String> listEnumDictNames() {
return ENUM_DICT_CACHE.keySet().stream().toList();
}

/**
* 字典值是否存在
*
Expand Down
Loading

0 comments on commit fdd21a0

Please sign in to comment.