Commit e8d2dc513b2060db0500d4110869a4f08f3cb3cb
Committed by
&wxr
1 parent
e96f052a
代码生成:完善 Vue3 标准模版的表单
Showing
3 changed files
with
52 additions
and
40 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
| @@ -97,20 +97,21 @@ public class CodegenEngine { | @@ -97,20 +97,21 @@ public class CodegenEngine { | ||
| 97 | * value:生成的路径 | 97 | * value:生成的路径 |
| 98 | */ | 98 | */ |
| 99 | private static final Table<Integer, String, String> FRONT_TEMPLATES = ImmutableTable.<Integer, String, String>builder() | 99 | private static final Table<Integer, String, String> FRONT_TEMPLATES = ImmutableTable.<Integer, String, String>builder() |
| 100 | - // Vue2 | 100 | + // Vue2 标准模版 |
| 101 | .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/index.vue"), | 101 | .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/index.vue"), |
| 102 | vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) | 102 | vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) |
| 103 | .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("api/api.js"), | 103 | .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("api/api.js"), |
| 104 | vueFilePath("api/${table.moduleName}/${classNameVar}.js")) | 104 | vueFilePath("api/${table.moduleName}/${classNameVar}.js")) |
| 105 | - // Vue3 | 105 | + // Vue3 标准模版 |
| 106 | .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/index.vue"), | 106 | .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/index.vue"), |
| 107 | vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) | 107 | vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) |
| 108 | .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/form.vue"), | 108 | .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/form.vue"), |
| 109 | - vue3FilePath("views/${table.moduleName}/${classNameVar}/form.vue")) | ||
| 110 | -// .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/data.ts"), | ||
| 111 | -// vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) | 109 | + vue3FilePath("views/${table.moduleName}/${classNameVar}/${simpleClassName}Form.vue")) |
| 112 | .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("api/api.ts"), | 110 | .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("api/api.ts"), |
| 113 | vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) | 111 | vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) |
| 112 | + // Vue3 Schema 模版 | ||
| 113 | +// .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/data.ts"), | ||
| 114 | +// vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) | ||
| 114 | .build(); | 115 | .build(); |
| 115 | 116 | ||
| 116 | @Resource | 117 | @Resource |
| @@ -203,6 +204,8 @@ public class CodegenEngine { | @@ -203,6 +204,8 @@ public class CodegenEngine { | ||
| 203 | getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); | 204 | getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); |
| 204 | filePath = StrUtil.replace(filePath, "${classNameVar}", | 205 | filePath = StrUtil.replace(filePath, "${classNameVar}", |
| 205 | getStr(bindingMap, "classNameVar")); | 206 | getStr(bindingMap, "classNameVar")); |
| 207 | + filePath = StrUtil.replace(filePath, "${simpleClassName}", | ||
| 208 | + getStr(bindingMap, "simpleClassName")); | ||
| 206 | // sceneEnum 包含的字段 | 209 | // sceneEnum 包含的字段 |
| 207 | CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); | 210 | CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); |
| 208 | filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); | 211 | filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/form.vue.vm
| @@ -27,17 +27,17 @@ | @@ -27,17 +27,17 @@ | ||
| 27 | <el-form-item label="${comment}" prop="${javaField}"> | 27 | <el-form-item label="${comment}" prop="${javaField}"> |
| 28 | <el-input v-model="formData.${javaField}" placeholder="请输入${comment}" /> | 28 | <el-input v-model="formData.${javaField}" placeholder="请输入${comment}" /> |
| 29 | </el-form-item> | 29 | </el-form-item> |
| 30 | - #elseif($column.htmlType == "imageUpload")## 图片上传 TODO 芋艿:待测试 | 30 | + #elseif($column.htmlType == "imageUpload")## 图片上传 |
| 31 | #set ($hasImageUploadColumn = true) | 31 | #set ($hasImageUploadColumn = true) |
| 32 | - <el-form-item label="${comment}"> | ||
| 33 | - <imageUpload v-model="formData.${javaField}"/> | ||
| 34 | - </el-form-item> | ||
| 35 | - #elseif($column.htmlType == "fileUpload")## 文件上传 TODO 芋艿:待测试 | 32 | + <el-form-item label="${comment}"> |
| 33 | + <UploadImg v-model="formData.${javaField}" /> | ||
| 34 | + </el-form-item> | ||
| 35 | + #elseif($column.htmlType == "fileUpload")## 文件上传 | ||
| 36 | #set ($hasFileUploadColumn = true) | 36 | #set ($hasFileUploadColumn = true) |
| 37 | - <el-form-item label="${comment}"> | ||
| 38 | - <fileUpload v-model="formData.${javaField}"/> | ||
| 39 | - </el-form-item> | ||
| 40 | - #elseif($column.htmlType == "editor")## 文本编辑器 TODO 芋艿:待测试 | 37 | + <el-form-item label="${comment}"> |
| 38 | + <UploadFile v-model="formData.${javaField}" /> | ||
| 39 | + </el-form-item> | ||
| 40 | + #elseif($column.htmlType == "editor")## 文本编辑器 | ||
| 41 | <el-form-item label="${comment}"> | 41 | <el-form-item label="${comment}"> |
| 42 | <Editor :model-value="formData.${javaField}" height="150px" /> | 42 | <Editor :model-value="formData.${javaField}" height="150px" /> |
| 43 | </el-form-item> | 43 | </el-form-item> |
| @@ -59,19 +59,20 @@ | @@ -59,19 +59,20 @@ | ||
| 59 | #end | 59 | #end |
| 60 | </el-select> | 60 | </el-select> |
| 61 | </el-form-item> | 61 | </el-form-item> |
| 62 | - #elseif($column.htmlType == "checkbox")## 多选框 TODO 芋艿:待测试 | 62 | + #elseif($column.htmlType == "checkbox")## 多选框 |
| 63 | <el-form-item label="${comment}" prop="${javaField}"> | 63 | <el-form-item label="${comment}" prop="${javaField}"> |
| 64 | <el-checkbox-group v-model="formData.${javaField}"> | 64 | <el-checkbox-group v-model="formData.${javaField}"> |
| 65 | #if ("" != $dictType)## 有数据字典 | 65 | #if ("" != $dictType)## 有数据字典 |
| 66 | #if (!$dictMethods.contains($dictMethod))## 如果不存在,则添加到 dictMethods 数组中,后续好 import | 66 | #if (!$dictMethods.contains($dictMethod))## 如果不存在,则添加到 dictMethods 数组中,后续好 import |
| 67 | #set($ignore = $dictMethods.add($dictMethod) ) | 67 | #set($ignore = $dictMethods.add($dictMethod) ) |
| 68 | #end | 68 | #end |
| 69 | - <el-checkbox | ||
| 70 | - v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())" | ||
| 71 | - key="dict.value" | ||
| 72 | - :label="dict.value"> | ||
| 73 | - {{dict.label}} | ||
| 74 | - </el-checkbox> | 69 | + <el-checkbox |
| 70 | + v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())" | ||
| 71 | + :key="dict.value" | ||
| 72 | + :label="dict.value" | ||
| 73 | + > | ||
| 74 | + {{ dict.label }} | ||
| 75 | + </el-checkbox> | ||
| 75 | #else##没数据字典 | 76 | #else##没数据字典 |
| 76 | <el-checkbox>请选择字典生成</el-checkbox> | 77 | <el-checkbox>请选择字典生成</el-checkbox> |
| 77 | #end | 78 | #end |
| @@ -96,14 +97,19 @@ | @@ -96,14 +97,19 @@ | ||
| 96 | #end | 97 | #end |
| 97 | </el-radio-group> | 98 | </el-radio-group> |
| 98 | </el-form-item> | 99 | </el-form-item> |
| 99 | - #elseif($column.htmlType == "datetime")## 时间框 TODO 芋艿:待测试 | ||
| 100 | - <el-form-item label="${comment}" prop="${javaField}"> | ||
| 101 | - <el-date-picker clearable v-model="formData.${javaField}" type="date" value-format="timestamp" placeholder="选择${comment}" /> | ||
| 102 | - </el-form-item> | ||
| 103 | - #elseif($column.htmlType == "textarea")## 文本框 TODO 芋艿:待测试 | ||
| 104 | - <el-form-item label="${comment}" prop="${javaField}"> | ||
| 105 | - <el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" /> | ||
| 106 | - </el-form-item> | 100 | + #elseif($column.htmlType == "datetime")## 时间框 |
| 101 | + <el-form-item label="${comment}" prop="${javaField}"> | ||
| 102 | + <el-date-picker | ||
| 103 | + v-model="formData.${javaField}" | ||
| 104 | + type="date" | ||
| 105 | + value-format="timestamp" | ||
| 106 | + placeholder="选择${comment}" | ||
| 107 | + /> | ||
| 108 | + </el-form-item> | ||
| 109 | + #elseif($column.htmlType == "textarea")## 文本框 | ||
| 110 | + <el-form-item label="${comment}" prop="${javaField}"> | ||
| 111 | + <el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" /> | ||
| 112 | + </el-form-item> | ||
| 107 | #end | 113 | #end |
| 108 | #end | 114 | #end |
| 109 | #end | 115 | #end |
| @@ -163,7 +169,7 @@ const formRules = reactive({ | @@ -163,7 +169,7 @@ const formRules = reactive({ | ||
| 163 | const formRef = ref() // 表单 Ref | 169 | const formRef = ref() // 表单 Ref |
| 164 | 170 | ||
| 165 | /** 打开弹窗 */ | 171 | /** 打开弹窗 */ |
| 166 | -const openModal = async (type: string, id?: number) => { | 172 | +const open = async (type: string, id?: number) => { |
| 167 | modelVisible.value = true | 173 | modelVisible.value = true |
| 168 | modelTitle.value = t('action.' + type) | 174 | modelTitle.value = t('action.' + type) |
| 169 | formType.value = type | 175 | formType.value = type |
| @@ -178,7 +184,7 @@ const openModal = async (type: string, id?: number) => { | @@ -178,7 +184,7 @@ const openModal = async (type: string, id?: number) => { | ||
| 178 | } | 184 | } |
| 179 | } | 185 | } |
| 180 | } | 186 | } |
| 181 | -defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗 | 187 | +defineExpose({ open }) // 提供 open 方法,用于打开弹窗 |
| 182 | 188 | ||
| 183 | /** 提交表单 */ | 189 | /** 提交表单 */ |
| 184 | const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 | 190 | const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm
| @@ -92,12 +92,12 @@ | @@ -92,12 +92,12 @@ | ||
| 92 | <el-form-item> | 92 | <el-form-item> |
| 93 | <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> | 93 | <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> |
| 94 | <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> | 94 | <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> |
| 95 | - #if ($permissionPrefix.length() < 15) | ||
| 96 | - <el-button type="primary" @click="openModal('create')" v-hasPermi="['${permissionPrefix}:create']"> | 95 | + #if ($permissionPrefix.length() <= 12) |
| 96 | + <el-button type="primary" @click="openForm('create')" v-hasPermi="['${permissionPrefix}:create']"> | ||
| 97 | #else | 97 | #else |
| 98 | <el-button | 98 | <el-button |
| 99 | type="primary" | 99 | type="primary" |
| 100 | - @click="openModal('create')" | 100 | + @click="openForm('create')" |
| 101 | v-hasPermi="['${permissionPrefix}:create']" | 101 | v-hasPermi="['${permissionPrefix}:create']" |
| 102 | > | 102 | > |
| 103 | #end | 103 | #end |
| @@ -148,7 +148,7 @@ | @@ -148,7 +148,7 @@ | ||
| 148 | <el-button | 148 | <el-button |
| 149 | link | 149 | link |
| 150 | type="primary" | 150 | type="primary" |
| 151 | - @click="openModal('update', scope.row.id)" | 151 | + @click="openForm('update', scope.row.id)" |
| 152 | v-hasPermi="['${permissionPrefix}:update']" | 152 | v-hasPermi="['${permissionPrefix}:update']" |
| 153 | > | 153 | > |
| 154 | 编辑 | 154 | 编辑 |
| @@ -172,6 +172,9 @@ | @@ -172,6 +172,9 @@ | ||
| 172 | @pagination="getList" | 172 | @pagination="getList" |
| 173 | /> | 173 | /> |
| 174 | </content-wrap> | 174 | </content-wrap> |
| 175 | + | ||
| 176 | + <!-- 表单弹窗:添加/修改 --> | ||
| 177 | + <${simpleClassName}Form ref="formRef" @success="getList" /> | ||
| 175 | </template> | 178 | </template> |
| 176 | 179 | ||
| 177 | <script setup lang="ts" name="${simpleClassName}"> | 180 | <script setup lang="ts" name="${simpleClassName}"> |
| @@ -181,7 +184,7 @@ import { DICT_TYPE#foreach ($dictMethod in $dictMethods), ${dictMethod}#end } fr | @@ -181,7 +184,7 @@ import { DICT_TYPE#foreach ($dictMethod in $dictMethods), ${dictMethod}#end } fr | ||
| 181 | import { dateFormatter } from '@/utils/formatTime' | 184 | import { dateFormatter } from '@/utils/formatTime' |
| 182 | import download from '@/utils/download' | 185 | import download from '@/utils/download' |
| 183 | import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}' | 186 | import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}' |
| 184 | -// import ConfigForm from './form.vue' | 187 | +import ${simpleClassName}Form from './${simpleClassName}Form.vue' |
| 185 | const message = useMessage() // 消息弹窗 | 188 | const message = useMessage() // 消息弹窗 |
| 186 | const { t } = useI18n() // 国际化 | 189 | const { t } = useI18n() // 国际化 |
| 187 | 190 | ||
| @@ -236,10 +239,10 @@ const resetQuery = () => { | @@ -236,10 +239,10 @@ const resetQuery = () => { | ||
| 236 | } | 239 | } |
| 237 | 240 | ||
| 238 | /** 添加/修改操作 */ | 241 | /** 添加/修改操作 */ |
| 239 | -// const modalRef = ref() | ||
| 240 | -// const openModal = (type: string, id?: number) => { | ||
| 241 | -// modalRef.value.openModal(type, id) | ||
| 242 | -// } | 242 | +const formRef = ref() |
| 243 | +const openForm = (type: string, id?: number) => { | ||
| 244 | + formRef.value.open(type, id) | ||
| 245 | +} | ||
| 243 | 246 | ||
| 244 | /** 删除按钮操作 */ | 247 | /** 删除按钮操作 */ |
| 245 | const handleDelete = async (id: number) => { | 248 | const handleDelete = async (id: number) => { |