fix(codegen): 修复 CURD 模板已知问题

This commit is contained in:
Ray.Hao
2025-09-17 15:09:00 +08:00
parent 3ecb28549f
commit 62ca74c66a

View File

@@ -6,33 +6,56 @@
:search-config="searchConfig"
@query-click="handleQueryClick"
@reset-click="handleResetClick"
/>
>
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInQuery == 1 && $fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
<template #$fieldConfig.fieldName="scope">
<Dict v-model="scope.formData[scope.prop]" code="$fieldConfig.dictType" v-bind="scope.attrs" />
</template>
#end
#end
</page-search>
<!-- 列表 -->
<page-content
ref="contentRef"
:content-config="contentConfig"
@add-click="handleAddClick"
@export-click="handleExportClick"
@search-click="handleSearchClick"
@toolbar-click="handleToolbarClick"
@operate-click="handleOperateClick"
@filter-change="handleFilterChange"
>
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInList == 1 && $fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
<template #$fieldConfig.fieldName="scope">
<DictLabel v-model="scope.row[scope.prop]" code="$fieldConfig.dictType" />
</template>
#end
#end
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInList == 1 && $fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
<template #$fieldConfig.fieldName="scope">
<DictLabel v-model="scope.row[scope.prop]" code="$fieldConfig.dictType" />
</template>
#end
#end
</page-content>
<!-- 新增/编辑 -->
<page-modal ref="modalRef" :modal-config="modalConfig" @submit-click="handleSubmitClick">
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInForm == 1 && $fieldConfig.formType != "HIDDEN" && $fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
<template #$fieldConfig.fieldName="scope">
<Dict v-model="scope.formData[scope.prop]" code="$fieldConfig.dictType" v-bind="scope.attrs" />
</template>
#end
#end
<!-- 新增 -->
<page-modal ref="addModalRef" :modal-config="addModalConfig" @submit-click="handleSubmitClick">
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInForm == 1 && $fieldConfig.formType != "HIDDEN" && $fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
<template #$fieldConfig.fieldName="scope">
<Dict v-model="scope.formData[scope.prop]" code="$fieldConfig.dictType" v-bind="scope.attrs" />
</template>
#end
#end
</page-modal>
<!-- 编辑 -->
<page-modal ref="editModalRef" :modal-config="editModalConfig" @submit-click="handleSubmitClick">
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInForm == 1 && $fieldConfig.formType != "HIDDEN" && $fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
<template #$fieldConfig.fieldName="scope">
<Dict v-model="scope.formData[scope.prop]" code="$fieldConfig.dictType" v-bind="scope.attrs" />
</template>
#end
#end
</page-modal>
</div>
</template>
@@ -40,44 +63,84 @@
<script setup lang="ts">
defineOptions({ name: "$entityName" });
import ${entityName}API, { ${entityName}PageVO, ${entityName}Form, ${entityName}PageQuery } from "@/api/${moduleName}/${kebabCaseEntityName}-api";
import type { IObject, PageModalInstance } from "@/components/CURD/types";
import ${entityName}API, { ${entityName}Form, ${entityName}PageQuery } from "@/api/${moduleName}/${kebabCaseEntityName}-api";
import type { IObject, IModalConfig, IContentConfig, ISearchConfig } from "@/components/CURD/types";
import usePage from "@/components/CURD/usePage";
// 组合式 CRUD
const {
searchRef,
contentRef,
addModalRef: modalRef,
addModalRef,
editModalRef,
handleQueryClick,
handleResetClick,
handleAddClick,
handleEditClick,
handleSubmitClick,
} = usePage<${entityName}PageQuery, ${entityName}PageVO, ${entityName}Form>();
handleExportClick,
handleSearchClick,
handleFilterChange,
} = usePage();
// 搜索配置
const searchConfig = {
const searchConfig: ISearchConfig = reactive({
permPrefix: "${moduleName}:${kebabCaseEntityName}",
formItems: [
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInQuery == 1)
{
type: "$!{fieldConfig.formType.toLowerCase()}",
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
attrs: {
placeholder: "$fieldConfig.fieldComment",
},
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInQuery == 1)
#if($fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
{
type: "custom",
slotName: "$fieldConfig.fieldName",
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
attrs: {
placeholder: "$fieldConfig.fieldComment",
clearable: true,
style: { width: "200px" },
},
#end
#end
},
#else
{
#if($fieldConfig.javaType == "String")
type: "input",
#elseif($fieldConfig.javaType == "Integer" || $fieldConfig.javaType == "Long")
type: "input-number",
#elseif($fieldConfig.javaType == "Date" || $fieldConfig.javaType == "LocalDateTime")
type: "date-picker",
#else
type: "input",
#end
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
attrs: {
placeholder: "$fieldConfig.fieldComment",
#if($fieldConfig.javaType == "Date" || $fieldConfig.javaType == "LocalDateTime")
type: "daterange",
"range-separator": "~",
"start-placeholder": "开始时间",
"end-placeholder": "截止时间",
"value-format": "YYYY-MM-DD",
#end
clearable: true,
style: { width: "200px" },
},
},
#end
#end
#end
],
};
});
// 列表配置
const contentConfig = {
const contentConfig: IContentConfig<${entityName}PageQuery> = reactive({
// 权限前缀
permPrefix: "${moduleName}:${kebabCaseEntityName}",
table: {
border: true,
highlightCurrentRow: true,
},
// 主键
pk: "id",
// 列表查询接口
@@ -104,78 +167,164 @@ const contentConfig = {
// 表格列配置
cols: [
{ type: "selection", width: 55, align: "center" },
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInList == 1)
#if($fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
{
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInList == 1)
#if($fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
{
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
templet: "custom",
slotName: "$fieldConfig.fieldName"
slotName: "$fieldConfig.fieldName"
},
#else
#else
{ label: "$fieldConfig.fieldComment", prop: "$fieldConfig.fieldName" },
#end
#end
#end
{
label: "操作",
prop: "operation",
#end
#end
#end
{
label: "操作",
prop: "operation",
width: 220,
templet: "tool",
operat: [
{ name: "edit", text: "编辑", attrs: { type: "primary", icon: "edit" } },
{ name: "delete", text: "删除", attrs: { type: "danger", icon: "delete" } },
],
}
operat: ["edit", "delete"],
},
],
};
});
// 弹窗配置
const modalConfig = {
// 新增配置
const addModalConfig: IModalConfig<${entityName}Form> = reactive({
// 权限前缀
permPrefix: "${moduleName}:${kebabCaseEntityName}",
// 主键
pk: "id",
// 弹窗配置
dialog: {
title: "新增${entityComment}",
title: "新增$!{entityComment}",
width: 800,
draggable: true,
},
form: {
labelWidth: 100,
},
// 表单项配置
formItems: [
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInForm == 1 && $fieldConfig.formType != "HIDDEN")
#if($fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
#foreach($fieldConfig in $fieldConfigs)
#if($fieldConfig.isShowInForm == 1 && $fieldConfig.formType != "HIDDEN")
#if($fieldConfig.dictType && $fieldConfig.dictType.trim() != "")
{
type: "custom",
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
slotName: "$fieldConfig.fieldName",
attrs: {
attrs: {
placeholder: "$fieldConfig.fieldComment",
style: { width: "100%" }
},
#if($fieldConfig.isRequired == 1)
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "change" }],
#end
#end
},
#else
#else
{
type: "$!{fieldConfig.formType.toLowerCase()}",
#if($fieldConfig.javaType == "String")
#if($fieldConfig.fieldName.contains("password") || $fieldConfig.fieldName.contains("pwd"))
type: "input",
attrs: {
type: "password",
placeholder: "$fieldConfig.fieldComment",
showPassword: true
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" }],
#end
#elseif($fieldConfig.fieldName.contains("email"))
type: "input",
attrs: {
placeholder: "$fieldConfig.fieldComment",
maxlength: 50
},
rules: [
#if($fieldConfig.isRequired == 1)
{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" },
#end
{ pattern: /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/, message: "请输入正确的邮箱地址", trigger: "blur" }
],
#elseif($fieldConfig.fieldName.contains("mobile") || $fieldConfig.fieldName.contains("phone"))
type: "input",
attrs: {
placeholder: "$fieldConfig.fieldComment",
maxlength: 11
},
rules: [
#if($fieldConfig.isRequired == 1)
{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" },
#end
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }
],
#else
type: "input",
attrs: {
placeholder: "$fieldConfig.fieldComment"
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" }],
#end
#end
#elseif($fieldConfig.javaType == "Integer" || $fieldConfig.javaType == "Long")
type: "input-number",
attrs: {
placeholder: "$fieldConfig.fieldComment",
style: { width: "100%" }
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" }],
#end
#elseif($fieldConfig.javaType == "BigDecimal" || $fieldConfig.javaType == "Double")
type: "input-number",
attrs: {
placeholder: "$fieldConfig.fieldComment",
precision: 2,
style: { width: "100%" }
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" }],
#end
#elseif($fieldConfig.javaType == "Date" || $fieldConfig.javaType == "LocalDateTime")
type: "date-picker",
attrs: {
type: "datetime",
placeholder: "$fieldConfig.fieldComment",
format: "YYYY-MM-DD HH:mm:ss",
"value-format": "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" }
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "change" }],
#end
#elseif($fieldConfig.javaType == "Boolean" || $fieldConfig.fieldName.contains("status"))
type: "switch",
attrs: {
activeText: "启用",
inactiveText: "禁用",
activeValue: 1,
inactiveValue: 0
},
initialValue: 1,
#else
type: "input",
attrs: {
placeholder: "$fieldConfig.fieldComment"
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" }],
#end
#end
label: "$fieldConfig.fieldComment",
prop: "$fieldConfig.fieldName",
attrs: {
placeholder: "$fieldConfig.fieldComment"
},
#if($fieldConfig.isRequired == 1)
rules: [{ required: true, message: "$fieldConfig.fieldComment不能为空", trigger: "blur" }],
#end
},
#end
#end
#end
#end
#end
#end
],
// 提交函数
formAction: (data: ${entityName}Form) => {
@@ -187,7 +336,22 @@ const modalConfig = {
return ${entityName}API.create(data);
}
},
};
});
// 编辑配置
const editModalConfig: IModalConfig<${entityName}Form> = reactive({
permPrefix: "${moduleName}:${kebabCaseEntityName}",
component: "drawer",
drawer: {
title: "编辑$!{entityComment}",
size: 500,
},
pk: "id",
formAction(data: any) {
return ${entityName}API.update(data.id as string, data);
},
formItems: addModalConfig.formItems, // 复用新增的表单项
});
// 处理操作按钮点击
const handleOperateClick = (data: IObject) => {
@@ -198,4 +362,9 @@ const handleOperateClick = (data: IObject) => {
}
};
// 处理工具栏按钮点击(删除等)
const handleToolbarClick = (name: string) => {
console.log(name);
};
</script>