Selaa lähdekoodia

代码生成:重构 vue2 模版,适配树表和主子表(90%)

puhui999 1 vuosi sitten
vanhempi
commit
a88c93fc60

+ 203 - 195
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm

@@ -2,203 +2,211 @@
 #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex))
 #set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段
 <template>
-  <Dialog :title="dialogTitle" :visible.sync="dialogVisible">
-    <el-form
-      ref="formRef"
-      :model="formData"
-      :rules="formRules"
-      label-width="100px"
-      v-loading="formLoading"
-    >
-#foreach($column in $subColumns)
-    #if ($column.createOperation || $column.updateOperation)
-        #set ($dictType = $column.dictType)
-        #set ($javaField = $column.javaField)
-        #set ($javaType = $column.javaType)
-        #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-        #set ($comment = $column.columnComment)
-        #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法
-        #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
-            #set ($dictMethod = "getIntDictOptions")
-        #elseif ($javaType == "String")
-            #set ($dictMethod = "getStrDictOptions")
-        #elseif ($javaType == "Boolean")
-            #set ($dictMethod = "getBoolDictOptions")
+  <div class="app-container">
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="formRef" :model="formData" :rules="formRules" v-loading="formLoading" label-width="80px">
+          #foreach($column in $subColumns)
+              #if ($column.createOperation || $column.updateOperation)
+                  #set ($dictType = $column.dictType)
+                  #set ($javaField = $column.javaField)
+                  #set ($javaType = $column.javaType)
+                  #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                  #set ($comment = $column.columnComment)
+                  #if ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 TODO 芋艿:这里要忽略下 join 字段;
+                      #if (!$column.primaryKey)## 忽略主键,不用在表单里
+                        <el-form-item label="${comment}" prop="${javaField}">
+                          <el-input v-model="form.${javaField}" placeholder="请输入${comment}" />
+                        </el-form-item>
+                      #end
+                  #elseif($column.htmlType == "imageUpload")## 图片上传
+                      #set ($hasImageUploadColumn = true)
+                    <el-form-item label="${comment}">
+                      <ImageUpload v-model="form.${javaField}"/>
+                    </el-form-item>
+                  #elseif($column.htmlType == "fileUpload")## 文件上传
+                      #set ($hasFileUploadColumn = true)
+                    <el-form-item label="${comment}">
+                      <FileUpload v-model="form.${javaField}"/>
+                    </el-form-item>
+                  #elseif($column.htmlType == "editor")## 文本编辑器
+                      #set ($hasEditorColumn = true)
+                    <el-form-item label="${comment}">
+                      <editor v-model="form.${javaField}" :min-height="192"/>
+                    </el-form-item>
+                  #elseif($column.htmlType == "select")## 下拉框
+                    <el-form-item label="${comment}" prop="${javaField}">
+                      <el-select v-model="form.${javaField}" placeholder="请选择${comment}">
+                          #if ("" != $dictType)## 有数据字典
+                            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
+                                       :key="dict.value" :label="dict.label" #if ($column.javaType == "Integer" || $column.javaType == "Long"):value="parseInt(dict.value)"#else:value="dict.value"#end />
+                          #else##没数据字典
+                            <el-option label="请选择字典生成" value="" />
+                          #end
+                      </el-select>
+                    </el-form-item>
+                  #elseif($column.htmlType == "checkbox")## 多选框
+                    <el-form-item label="${comment}" prop="${javaField}">
+                      <el-checkbox-group v-model="form.${javaField}">
+                          #if ("" != $dictType)## 有数据字典
+                            <el-checkbox v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
+                                         :key="dict.value" #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.value)"#else:label="dict.value"#end>{{dict.label}}</el-checkbox>
+                          #else##没数据字典
+                            <el-checkbox>请选择字典生成</el-checkbox>
+                          #end
+                      </el-checkbox-group>
+                    </el-form-item>
+                  #elseif($column.htmlType == "radio")## 单选框
+                    <el-form-item label="${comment}" prop="${javaField}">
+                      <el-radio-group v-model="form.${javaField}">
+                          #if ("" != $dictType)## 有数据字典
+                            <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
+                                      :key="dict.value" #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.value)"
+                                      #else:label="dict.value"#end>{{dict.label}}</el-radio>
+                          #else##没数据字典
+                            <el-radio label="1">请选择字典生成</el-radio>
+                          #end
+                      </el-radio-group>
+                    </el-form-item>
+                  #elseif($column.htmlType == "datetime")## 时间框
+                    <el-form-item label="${comment}" prop="${javaField}">
+                      <el-date-picker clearable v-model="form.${javaField}" type="date" value-format="timestamp" placeholder="选择${comment}" />
+                    </el-form-item>
+                  #elseif($column.htmlType == "textarea")## 文本框
+                    <el-form-item label="${comment}" prop="${javaField}">
+                      <el-input v-model="form.${javaField}" type="textarea" placeholder="请输入内容" />
+                    </el-form-item>
+                  #end
+              #end
+          #end
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :disabled="formLoading">确 定</el-button>
+        <el-button @click="dialogVisible = false">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${table.businessName}'
+      #if ($hasImageUploadColumn)
+      import ImageUpload from '@/components/ImageUpload';
+      #end
+      #if ($hasFileUploadColumn)
+      import FileUpload from '@/components/FileUpload';
+      #end
+      #if ($hasEditorColumn)
+      import Editor from '@/components/Editor';
+      #end
+  export default {
+    name: "${simpleClassName}",
+    components: {
+        #if ($hasImageUploadColumn)
+          ImageUpload,
         #end
-        #if ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 TODO 芋艿:这里要忽略下 join 字段;
-      <el-form-item label="${comment}" prop="${javaField}">
-        <el-input v-model="formData.${javaField}" placeholder="请输入${comment}" />
-      </el-form-item>
-        #elseif($column.htmlType == "imageUpload")## 图片上传
-      <el-form-item label="${comment}" prop="${javaField}">
-        <UploadImg v-model="formData.${javaField}" />
-      </el-form-item>
-        #elseif($column.htmlType == "fileUpload")## 文件上传
-      <el-form-item label="${comment}" prop="${javaField}">
-        <UploadFile v-model="formData.${javaField}" />
-      </el-form-item>
-        #elseif($column.htmlType == "editor")## 文本编辑器
-      <el-form-item label="${comment}" prop="${javaField}">
-        <Editor v-model="formData.${javaField}" height="150px" />
-      </el-form-item>
-        #elseif($column.htmlType == "select")## 下拉框
-      <el-form-item label="${comment}" prop="${javaField}">
-        <el-select v-model="formData.${javaField}" placeholder="请选择${comment}">
-                #if ("" != $dictType)## 有数据字典
-          <el-option
-            v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-                #else##没数据字典
-          <el-option label="请选择字典生成" value="" />
+        #if ($hasFileUploadColumn)
+          FileUpload,
+        #end
+        #if ($hasEditorColumn)
+          Editor,
+        #end
+    },
+    data() {
+      return {
+        // 弹出层标题
+        dialogTitle: "",
+        // 是否显示弹出层
+        dialogVisible: false,
+        // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+        formLoading: false,
+        // 表单参数
+        formData: {
+            #foreach ($column in $columns)
+                #if ($column.createOperation || $column.updateOperation)
+                    #if ($column.htmlType == "checkbox")
+                            $column.javaField: [],
+                    #else
+                            $column.javaField: undefined,
+                    #end
                 #end
-        </el-select>
-      </el-form-item>
-        #elseif($column.htmlType == "checkbox")## 多选框
-      <el-form-item label="${comment}" prop="${javaField}">
-        <el-checkbox-group v-model="formData.${javaField}">
-                #if ("" != $dictType)## 有数据字典
-          <el-checkbox
-            v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-            :key="dict.value"
-            :label="dict.value"
-          >
-            {{ dict.label }}
-          </el-checkbox>
-                #else##没数据字典
-          <el-checkbox>请选择字典生成</el-checkbox>
+            #end
+        },
+        // 表单校验
+        formRules: {
+            #foreach ($column in $columns)
+                #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
+                    #set($comment=$column.columnComment)
+                        $column.javaField: [{ required: true, message: "${comment}不能为空", trigger: #if($column.htmlType == "select")"change"#else"blur"#end }],
                 #end
-        </el-checkbox-group>
-      </el-form-item>
-        #elseif($column.htmlType == "radio")## 单选框
-      <el-form-item label="${comment}" prop="${javaField}">
-        <el-radio-group v-model="formData.${javaField}">
-                #if ("" != $dictType)## 有数据字典
-          <el-radio
-            v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-            :key="dict.value"
-            :label="dict.value"
-          >
-            {{ dict.label }}
-          </el-radio>
-                #else##没数据字典
-          <el-radio label="1">请选择字典生成</el-radio>
+            #end
+        },
+      };
+    },
+    methods: {
+      /** 表单重置 */
+      reset() {
+        this.formData = {
+            #foreach ($column in $columns)
+                #if ($column.createOperation || $column.updateOperation)
+                    #if ($column.htmlType == "checkbox")
+                            $column.javaField: [],
+                    #else
+                            $column.javaField: undefined,
+                    #end
                 #end
-        </el-radio-group>
-      </el-form-item>
-        #elseif($column.htmlType == "datetime")## 时间框
-      <el-form-item label="${comment}" prop="${javaField}">
-        <el-date-picker
-          v-model="formData.${javaField}"
-          type="date"
-          value-format="x"
-          placeholder="选择${comment}"
-        />
-      </el-form-item>
-        #elseif($column.htmlType == "textarea")## 文本框
-      <el-form-item label="${comment}" prop="${javaField}">
-        <el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" />
-      </el-form-item>
-        #end
-    #end
-#end
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
-</template>
-<script setup lang="ts">
-import { getIntDictOptions, getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
-import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${table.businessName}'
-
-const { t } = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
-
-const dialogVisible = ref(false) // 弹窗的是否展示
-const dialogTitle = ref('') // 弹窗的标题
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formType = ref('') // 表单的类型:create - 新增;update - 修改
-const formData = ref({
-#foreach ($column in $subColumns)
-    #if ($column.createOperation || $column.updateOperation)
-      #if ($column.htmlType == "checkbox")
-  $column.javaField: [],
-      #else
-  $column.javaField: undefined,
-      #end
-    #end
-#end
-})
-const formRules = reactive({
-#foreach ($column in $subColumns)
-    #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
-        #set($comment=$column.columnComment)
-  $column.javaField: [{ required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == 'select')'change'#else'blur'#end }],
-    #end
-#end
-})
-const formRef = ref() // 表单 Ref
-
-/** 打开弹窗 */
-const open = async (type: string, id?: number, ${subJoinColumn.javaField}: number) => {
-  dialogVisible.value = true
-  dialogTitle.value = t('action.' + type)
-  formType.value = type
-  resetForm()
-  formData.value.${subJoinColumn.javaField} = ${subJoinColumn.javaField}
-  // 修改时,设置数据
-  if (id) {
-    formLoading.value = true
-    try {
-      formData.value = await ${simpleClassName}Api.get${subSimpleClassName}(id)
-    } finally {
-      formLoading.value = false
+            #end
+        };
+        this.resetForm("formRef");
+      },
+      /** 打开弹窗 */
+      open(id) {
+        this.dialogVisible = true;
+        this.reset();
+        const that = this;
+        // 修改时,设置数据
+        if (id) {
+          this.formLoading = true;
+          try {
+              ${simpleClassName}Api.get${subSimpleClassName}(id).then(res=>{
+              that.formData = res.data;
+              that.title = "修改${table.classComment}";
+            })
+          } finally {
+            this.formLoading = false;
+          }
+        }
+        this.title = "新增${table.classComment}";
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.formLoading = true;
+        try {
+          let data = this.formData;
+          this.#[[$]]#refs["formRef"].validate(valid => {
+            if (!valid) {
+              return;
+            }
+            // 修改的提交
+            if (data.${primaryColumn.javaField}) {
+                    ${simpleClassName}Api.update${simpleClassName}(data).then(response => {
+                this.#[[$modal]]#.msgSuccess("修改成功");
+                this.dialogVisible = false;
+                this.#[[$]]#emit('success');
+              });
+              return;
+            }
+            // 添加的提交
+            ${simpleClassName}Api.create${simpleClassName}(data).then(response => {
+              this.#[[$modal]]#.msgSuccess("新增成功");
+              this.dialogVisible = false;
+              this.#[[$]]#emit('success');
+            });
+          });
+        }finally {
+          this.formLoading = false
+        }
+      }
     }
-  }
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  await formRef.value.validate()
-  // 提交请求
-  formLoading.value = true
-  try {
-    const data = formData.value
-    if (formType.value === 'create') {
-      await ${simpleClassName}Api.create${subSimpleClassName}(data)
-      message.success(t('common.createSuccess'))
-    } else {
-      await ${simpleClassName}Api.update${subSimpleClassName}(data)
-      message.success(t('common.updateSuccess'))
-    }
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-#foreach ($column in $subColumns)
-  #if ($column.createOperation || $column.updateOperation)
-      #if ($column.htmlType == "checkbox")
-    $column.javaField: [],
-      #else
-    $column.javaField: undefined,
-      #end
-  #end
-#end
-  }
-  formRef.value?.resetFields()
-}
-</script>
+  };
+</script>

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm

@@ -1,2 +1,2 @@
 ## 主表的 normal 和 inner 使用相同的 form 表单
-#parse("codegen/vue3/views/components/form_sub_normal.vue.vm")
+#parse("codegen/vue/views/components/form_sub_normal.vue.vm")

+ 223 - 343
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm

@@ -4,359 +4,239 @@
 #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex))
 #set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段
 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
+
 <template>
+  <div class="app-container">
 #if ( $subTable.subJoinMany )## 情况一:一对多,table + form
-  <el-form
-    ref="formRef"
-    :model="formData"
-    :rules="formRules"
-    v-loading="formLoading"
-    label-width="0px"
-    :inline-message="true"
-  >
-    <el-table :data="formData" class="-mt-10px">
-      <el-table-column label="序号" type="index" width="100" />
-#foreach($column in $subColumns)
-    #if ($column.createOperation || $column.updateOperation)
-        #set ($dictType = $column.dictType)
-        #set ($javaField = $column.javaField)
-        #set ($javaType = $column.javaType)
-        #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-        #set ($comment = $column.columnComment)
-        #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法
-        #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
-            #set ($dictMethod = "getIntDictOptions")
-        #elseif ($javaType == "String")
-            #set ($dictMethod = "getStrDictOptions")
-        #elseif ($javaType == "Boolean")
-            #set ($dictMethod = "getBoolDictOptions")
-        #end
-        #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写
-        #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
-      <el-table-column label="${comment}" min-width="150">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <el-input v-model="row.${javaField}" placeholder="请输入${comment}" />
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "imageUpload")## 图片上传
-      <el-table-column label="${comment}" min-width="200">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <UploadImg v-model="row.${javaField}" />
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "fileUpload")## 文件上传
-      <el-table-column label="${comment}" min-width="200">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <UploadFile v-model="row.${javaField}" />
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "editor")## 文本编辑器
-      <el-table-column label="${comment}" min-width="400">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <Editor v-model="row.${javaField}" height="150px" />
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "select")## 下拉框
-      <el-table-column label="${comment}" min-width="150">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <el-select v-model="row.${javaField}" placeholder="请选择${comment}">
-              #if ("" != $dictType)## 有数据字典
-                <el-option
-                  v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              #else##没数据字典
-                <el-option label="请选择字典生成" value="" />
-              #end
-            </el-select>
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "checkbox")## 多选框
-      <el-table-column label="${comment}" min-width="150">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <el-checkbox-group v-model="row.${javaField}">
-              #if ("" != $dictType)## 有数据字典
-                <el-checkbox
-                  v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-                  :key="dict.value"
-                  :label="dict.value"
-                >
-                  {{ dict.label }}
-                </el-checkbox>
-              #else##没数据字典
-                <el-checkbox>请选择字典生成</el-checkbox>
-              #end
-            </el-checkbox-group>
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "radio")## 单选框
-      <el-table-column label="${comment}" min-width="150">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <el-radio-group v-model="row.${javaField}">
-              #if ("" != $dictType)## 有数据字典
-                <el-radio
-                  v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-                  :key="dict.value"
-                  :label="dict.value"
-                >
-                  {{ dict.label }}
-                </el-radio>
-              #else##没数据字典
-                <el-radio label="1">请选择字典生成</el-radio>
-              #end
-            </el-radio-group>
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "datetime")## 时间框
-      <el-table-column label="${comment}" min-width="150">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <el-date-picker
-              v-model="row.${javaField}"
-              type="date"
-              value-format="x"
-              placeholder="选择${comment}"
-            />
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #elseif($column.htmlType == "textarea")## 文本框
-      <el-table-column label="${comment}" min-width="200">
-        <template #default="{ row, $index }">
-          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
-            <el-input v-model="row.${javaField}" type="textarea" placeholder="请输入${comment}" />
-          </el-form-item>
-        </template>
-      </el-table-column>
-        #end
-    #end
-#end
-      <el-table-column align="center" fixed="right" label="操作" width="60">
-        <template #default="{ $index }">
-          <el-button @click="handleDelete($index)" link>—</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-  </el-form>
+      <el-form
+          ref="formRef"
+          :model="formData"
+          :rules="formRules"
+          v-loading="formLoading"
+          label-width="0px"
+          :inline-message="true"
+      >
+##        // TODO puhui999: 看看样式是否需要调整
+        <el-table :data="formData" class="-mt-10px">
+          <el-table-column label="序号" type="index" width="100" />
+            #foreach($column in $subColumns)
+                #if ($column.createOperation || $column.updateOperation)
+                    #set ($dictType = $column.dictType)
+                    #set ($javaField = $column.javaField)
+                    #set ($javaType = $column.javaType)
+                    #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                    #set ($comment = $column.columnComment)
+                    #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写
+                    #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
+                      <el-table-column label="${comment}" min-width="150">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <el-input v-model="row.${javaField}" placeholder="请输入${comment}" />
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "imageUpload")## 图片上传
+                        #set ($hasImageUploadColumn = true)
+                      <el-table-column label="${comment}" min-width="200">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <ImageUpload v-model="row.${javaField}"/>
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "fileUpload")## 文件上传
+                        #set ($hasFileUploadColumn = true)
+                      <el-table-column label="${comment}" min-width="200">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <FileUpload v-model="row.${javaField}"/>
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "editor")## 文本编辑器
+                        #set ($hasEditorColumn = true)
+                      <el-table-column label="${comment}" min-width="400">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <editor v-model="row.${javaField}" :min-height="192"/>
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "select")## 下拉框
+                      <el-table-column label="${comment}" min-width="150">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <el-select v-model="row.${javaField}" placeholder="请选择${comment}">
+                                #if ("" != $dictType)## 有数据字典
+                                  <el-option v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
+                                             :key="dict.value" :label="dict.label" #if ($column.javaType == "Integer" || $column.javaType == "Long"):value="parseInt(dict.value)"#else:value="dict.value"#end />
+                                #else##没数据字典
+                                  <el-option label="请选择字典生成" value="" />
+                                #end
+                            </el-select>
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "checkbox")## 多选框
+                      <el-table-column label="${comment}" min-width="150">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <el-checkbox-group v-model="row.${javaField}">
+                                #if ("" != $dictType)## 有数据字典
+                                  <el-checkbox v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
+                                               :key="dict.value" #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.value)"#else:label="dict.value"#end>{{dict.label}}</el-checkbox>
+                                #else##没数据字典
+                                  <el-checkbox>请选择字典生成</el-checkbox>
+                                #end
+                            </el-checkbox-group>
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "radio")## 单选框
+                      <el-table-column label="${comment}" min-width="150">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <el-radio-group v-model="row.${javaField}">
+                                #if ("" != $dictType)## 有数据字典
+                                  <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
+                                            :key="dict.value" #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.value)"
+                                            #else:label="dict.value"#end>{{dict.label}}</el-radio>
+                                #else##没数据字典
+                                  <el-radio label="1">请选择字典生成</el-radio>
+                                #end
+                            </el-radio-group>
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "datetime")## 时间框
+                      <el-table-column label="${comment}" min-width="150">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <el-date-picker
+                                v-model="row.${javaField}"
+                                type="date"
+                                value-format="x"
+                                placeholder="选择${comment}"
+                            />
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #elseif($column.htmlType == "textarea")## 文本框
+                      <el-table-column label="${comment}" min-width="200">
+                        <template slot-scope="{ row, $index }">
+                          <el-form-item :prop="`${$index}.${javaField}`" :rules="formRules.${javaField}" class="mb-0px!">
+                            <el-input v-model="row.${javaField}" type="textarea" placeholder="请输入${comment}" />
+                          </el-form-item>
+                        </template>
+                      </el-table-column>
+                    #end
+                #end
+            #end
+          <el-table-column align="center" fixed="right" label="操作" width="60">
+            <template slot-scope="{ $index }">
+              <el-button @click="handleDelete($index)" link>—</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
   <el-row justify="center" class="mt-3">
     <el-button @click="handleAdd" round>+ 添加${subTable.classComment}</el-button>
   </el-row>
-#else## 情况二:一对一,form
-  <el-form
-    ref="formRef"
-    :model="formData"
-    :rules="formRules"
-    label-width="100px"
-    v-loading="formLoading"
-  >
-#foreach($column in $subColumns)
-  #if ($column.createOperation || $column.updateOperation)
-  #set ($dictType = $column.dictType)
-      #set ($javaField = $column.javaField)
-      #set ($javaType = $column.javaType)
-      #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      #set ($comment = $column.columnComment)
-      #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法
-      #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
-        #set ($dictMethod = "getIntDictOptions")
-      #elseif ($javaType == "String")
-          #set ($dictMethod = "getStrDictOptions")
-      #elseif ($javaType == "Boolean")
-          #set ($dictMethod = "getBoolDictOptions")
-      #end
-      #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写
-      #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
-    <el-form-item label="${comment}" prop="${javaField}">
-      <el-input v-model="formData.${javaField}" placeholder="请输入${comment}" />
-    </el-form-item>
-      #elseif($column.htmlType == "imageUpload")## 图片上传
-    <el-form-item label="${comment}" prop="${javaField}">
-      <UploadImg v-model="formData.${javaField}" />
-    </el-form-item>
-      #elseif($column.htmlType == "fileUpload")## 文件上传
-    <el-form-item label="${comment}" prop="${javaField}">
-      <UploadFile v-model="formData.${javaField}" />
-    </el-form-item>
-      #elseif($column.htmlType == "editor")## 文本编辑器
-    <el-form-item label="${comment}" prop="${javaField}">
-      <Editor v-model="formData.${javaField}" height="150px" />
-    </el-form-item>
-      #elseif($column.htmlType == "select")## 下拉框
-    <el-form-item label="${comment}" prop="${javaField}">
-      <el-select v-model="formData.${javaField}" placeholder="请选择${comment}">
-              #if ("" != $dictType)## 有数据字典
-        <el-option
-          v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-          :key="dict.value"
-          :label="dict.label"
-          :value="dict.value"
-        />
-              #else##没数据字典
-        <el-option label="请选择字典生成" value="" />
-              #end
-      </el-select>
-    </el-form-item>
-      #elseif($column.htmlType == "checkbox")## 多选框
-    <el-form-item label="${comment}" prop="${javaField}">
-      <el-checkbox-group v-model="formData.${javaField}">
-              #if ("" != $dictType)## 有数据字典
-        <el-checkbox
-          v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-          :key="dict.value"
-          :label="dict.value"
-        >
-          {{ dict.label }}
-        </el-checkbox>
-              #else##没数据字典
-        <el-checkbox>请选择字典生成</el-checkbox>
-              #end
-      </el-checkbox-group>
-    </el-form-item>
-      #elseif($column.htmlType == "radio")## 单选框
-    <el-form-item label="${comment}" prop="${javaField}">
-      <el-radio-group v-model="formData.${javaField}">
-              #if ("" != $dictType)## 有数据字典
-        <el-radio
-          v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
-          :key="dict.value"
-          :label="dict.value"
-          >
-          {{ dict.label }}
-        </el-radio>
-              #else##没数据字典
-        <el-radio label="1">请选择字典生成</el-radio>
-              #end
-      </el-radio-group>
-    </el-form-item>
-      #elseif($column.htmlType == "datetime")## 时间框
-    <el-form-item label="${comment}" prop="${javaField}">
-      <el-date-picker
-        v-model="formData.${javaField}"
-        type="date"
-        value-format="x"
-        placeholder="选择${comment}"
-      />
-    </el-form-item>
-      #elseif($column.htmlType == "textarea")## 文本框
-    <el-form-item label="${comment}" prop="${javaField}">
-      <el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" />
-    </el-form-item>
-      #end
-  #end
-#end
-  </el-form>
 #end
+  </div>
 </template>
-<script setup lang="ts">
-import { getIntDictOptions, getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
-import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${table.businessName}'
 
-const props = defineProps<{
-  ${subJoinColumn.javaField}: undefined // ${subJoinColumn.columnComment}(主表的关联字段)
-}>()
-const formLoading = ref(false) // 表单的加载中
-const formData = ref([])
-const formRules = reactive({
-#foreach ($column in $subColumns)
-    #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
-        #set($comment=$column.columnComment)
-  $column.javaField: [{ required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == 'select')'change'#else'blur'#end }],
-    #end
-#end
-})
-const formRef = ref() // 表单 Ref
-
-/** 监听主表的关联字段的变化,加载对应的子表数据 */
-watch(
-  () => props.${subJoinColumn.javaField},
-  async (val) => {
-    // 1. 重置表单
-#if ( $subTable.subJoinMany )
-    formData.value = []
-#else
-    formData.value = {
-    #foreach ($column in $subColumns)
-      #if ($column.createOperation || $column.updateOperation)
-        #if ($column.htmlType == "checkbox")
-      $column.javaField: [],
-        #else
-      $column.javaField: undefined,
-        #end
+<script>
+  import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${table.businessName}'
+      #if ($hasImageUploadColumn)
+      import ImageUpload from '@/components/ImageUpload';
       #end
-    #end
-    }
-#end
-    // 2. val 非空,则加载数据
-    if (!val) {
-      return;
-    }
-    try {
-      formLoading.value = true
-#if ( $subTable.subJoinMany )
-      formData.value = await ${simpleClassName}Api.get${subSimpleClassName}ListBy${SubJoinColumnName}(val)
-#else
-      const data = await ${simpleClassName}Api.get${subSimpleClassName}By${SubJoinColumnName}(val)
-      if (!data) {
-        return
-      }
-      formData.value = data
-#end
-    } finally {
-      formLoading.value = false
-    }
-  },
-  { immediate: true }
-)
-#if ( $subTable.subJoinMany )
-
-/** 新增按钮操作 */
-const handleAdd = () => {
-  const row = {
-#foreach ($column in $subColumns)
-    #if ($column.createOperation || $column.updateOperation)
-      #if ($column.htmlType == "checkbox")
-    $column.javaField: [],
-      #else
-    $column.javaField: undefined,
+      #if ($hasFileUploadColumn)
+      import FileUpload from '@/components/FileUpload';
       #end
-  #end
-#end
-  }
-  row.${subJoinColumn.javaField} = props.${subJoinColumn.javaField}
-  formData.value.push(row)
-}
-
-/** 删除按钮操作 */
-const handleDelete = (index) => {
-  formData.value.splice(index, 1)
-}
-#end
+      #if ($hasEditorColumn)
+      import Editor from '@/components/Editor';
+      #end
+  export default {
+    name: "${simpleClassName}",
+    components: {
+        #if ($hasImageUploadColumn)
+          ImageUpload,
+        #end
+        #if ($hasFileUploadColumn)
+          FileUpload,
+        #end
+        #if ($hasEditorColumn)
+          Editor,
+        #end
+    },
+    data() {
+      return {
+        // 弹出层标题
+        dialogTitle: "",
+        // 是否显示弹出层
+        dialogVisible: false,
+        // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+        formLoading: false,
+        // 表单参数
+        formData: {
+            #foreach ($column in $columns)
+                #if ($column.createOperation || $column.updateOperation)
+                    #if ($column.htmlType == "checkbox")
+                            $column.javaField: [],
+                    #else
+                            $column.javaField: undefined,
+                    #end
+                #end
+            #end
+        },
+        // 表单校验
+        formRules: {
+            #foreach ($column in $columns)
+                #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
+                    #set($comment=$column.columnComment)
+                        $column.javaField: [{ required: true, message: "${comment}不能为空", trigger: #if($column.htmlType == "select")"change"#else"blur"#end }],
+                #end
+            #end
+        },
+      };
+    },
+    props:{
+      ${subJoinColumn.javaField}: undefined // ${subJoinColumn.columnComment}(主表的关联字段)
+    },
+    methods: {
+        #if ( $subTable.subJoinMany )
 
-/** 表单校验 */
-const validate = () => {
-  return formRef.value.validate()
-}
+          /** 新增按钮操作 */
+        handleAdd(){
+            const row = {
+                #foreach ($column in $subColumns)
+                    #if ($column.createOperation || $column.updateOperation)
+                        #if ($column.htmlType == "checkbox")
+                                $column.javaField: [],
+                        #else
+                                $column.javaField: undefined,
+                        #end
+                    #end
+                #end
+            }
+            row.${subJoinColumn.javaField} = this.${subJoinColumn.javaField}
+            this.formData.push(row)
+          },
 
-/** 表单值 */
-const getData = () => {
-  return formData.value
-}
+          /** 删除按钮操作 */
+        handleDelete(index) {
+            this.formData.splice(index, 1)
+          },
+        #end
+      /** 表单值 */
+      getData() {
+        return this.formData
+      },
+      /** 表单校验 */
+      validate() {
 
-defineExpose({ validate, getData })
-</script>
+      }
+    }
+  };
+</script>

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm

@@ -1,4 +1,4 @@
 ## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点:
 ## 1)inner 使用 list 不分页,erp 使用 page 分页
 ## 2)erp 支持单个子表的新增、修改、删除,inner 不支持
-#parse("codegen/vue3/views/components/list_sub_erp.vue.vm")
+#parse("codegen/vue/views/components/list_sub_erp.vue.vm")