From 6174ca90e12c561c5c562bf46908910fe8214b32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=99=A8=E6=9B=A6?= <635132977@qq.com>
Date: Tue, 16 Apr 2024 15:20:55 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=A1=B5=E7=9A=84?=
 =?UTF-8?q?=E5=88=97=E6=95=B0=E7=94=B1=E5=8E=9F=E5=85=881=E5=88=97?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E5=A4=9A=EF=BC=881-4=EF=BC=89?=
 =?UTF-8?q?=E5=88=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../resources/vm/vue/element.ts.index.vue.vm  | 1311 ++++++++---------
 1 file changed, 619 insertions(+), 692 deletions(-)

diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
index 14d6229..d128863 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
+++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
@@ -1,706 +1,633 @@
 <template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div class="search" v-show="showSearch">
-        <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
-#foreach($column in $columns)
-#if($column.query)
-#set($dictType=$column.dictType)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.htmlType == "input" || $column.htmlType == "textarea")
-          <el-form-item label="${comment}" prop="${column.javaField}">
-            <el-input v-model="queryParams.${column.javaField}" placeholder="请输入${comment}" clearable style="width: 240px" @keyup.enter="handleQuery" />
-          </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-          <el-form-item label="${comment}" prop="${column.javaField}">
-            <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable style="width: 240px">
-              <el-option
-                v-for="dict in ${dictType}"
-                :key="dict.value"
-                :label="dict.label"
-                :value="dict.value"
-              />
-            </el-select>
-          </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-          <el-form-item label="${comment}" prop="${column.javaField}">
-            <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable style="width: 240px">
-              <el-option label="请选择字典生成" value="" />
-            </el-select>
-          </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-          <el-form-item label="${comment}" prop="${column.javaField}">
-            <el-date-picker clearable
-              v-model="queryParams.${column.javaField}"
-              type="date"
-              value-format="YYYY-MM-DD"
-              placeholder="请选择${comment}"
+    <div class="p-2">
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+            <div class="search" v-show="showSearch">
+                <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
+                    #foreach($column in $columns)
+                        #if($column.query)
+                            #set($dictType=$column.dictType)
+                            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                            #set($parentheseIndex=$column.columnComment.indexOf("("))
+                            #if($parentheseIndex != -1)
+                                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                            #else
+                                #set($comment=$column.columnComment)
+                            #end
+                            #if($column.htmlType == "input" || $column.htmlType == "textarea")
+                                <el-form-item label="${comment}" prop="${column.javaField}">
+                                    <el-input v-model="queryParams.${column.javaField}" placeholder="请输入${comment}" clearable style="width: 240px" @keyup.enter="handleQuery" />
+                                </el-form-item>
+                            #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
+                                <el-form-item label="${comment}" prop="${column.javaField}">
+                                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable style="width: 240px">
+                                        <el-option
+                                            v-for="dict in ${dictType}"
+                                            :key="dict.value"
+                                            :label="dict.label"
+                                            :value="dict.value"
+                                        />
+                                    </el-select>
+                                </el-form-item>
+                            #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
+                                <el-form-item label="${comment}" prop="${column.javaField}">
+                                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable style="width: 240px">
+                                        <el-option label="请选择字典生成" value="" />
+                                    </el-select>
+                                </el-form-item>
+                            #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
+                                <el-form-item label="${comment}" prop="${column.javaField}">
+                                    <el-date-picker clearable
+                                                    v-model="queryParams.${column.javaField}"
+                                                    type="date"
+                                                    value-format="YYYY-MM-DD"
+                                                    placeholder="请选择${comment}"
+                                    />
+                                </el-form-item>
+                            #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                                <el-form-item label="${comment}" style="width: 308px">
+                                    <el-date-picker
+                                        v-model="dateRange${AttrName}"
+                                        value-format="YYYY-MM-DD"
+                                        type="daterange"
+                                        range-separator="-"
+                                        start-placeholder="开始日期"
+                                        end-placeholder="结束日期"
+                                        :default-time="[new Date(2024, 1, 1, 0, 0, 0), new Date(2024, 1, 1, 23, 59, 59)]"
+                                    />
+                                </el-form-item>
+                            #end
+                        #end
+                    #end
+                    <el-form-item>
+                        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </transition>
+
+        <el-card shadow="never">
+            <template #header>
+                <el-row :gutter="10" class="mb8">
+                    <el-col :span="1.5">
+                        <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
+                    </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['${moduleName}:${businessName}:export']">导出</el-button>
+                    </el-col>
+                    <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+                </el-row>
+            </template>
+
+            <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
+                <el-table-column type="selection" width="55" align="center" />
+                #foreach($column in $columns)
+                    #set($javaField=$column.javaField)
+                    #set($parentheseIndex=$column.columnComment.indexOf("("))
+                    #if($parentheseIndex != -1)
+                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                    #else
+                        #set($comment=$column.columnComment)
+                    #end
+                    #if($column.pk)
+                        <el-table-column label="${comment}" align="center" prop="${javaField}" v-if="${column.list}" />
+                    #elseif($column.list && $column.htmlType == "datetime")
+                        <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
+                            <template #default="scope">
+                                <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
+                            </template>
+                        </el-table-column>
+                    #elseif($column.list && $column.htmlType == "imageUpload")
+                        <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
+                            <template #default="scope">
+                                <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
+                            </template>
+                        </el-table-column>
+                    #elseif($column.list && $column.dictType && "" != $column.dictType)
+                        <el-table-column label="${comment}" align="center" prop="${javaField}">
+                            <template #default="scope">
+                                #if($column.htmlType == "checkbox")
+                                    <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
+                                #else
+                                    <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
+                                #end
+                            </template>
+                        </el-table-column>
+                    #elseif($column.list && "" != $javaField)
+                        <el-table-column label="${comment}" align="center" prop="${javaField}" />
+                    #end
+                #end
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                    <template #default="scope">
+                        <el-tooltip content="修改" placement="top">
+                            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']"></el-button>
+                        </el-tooltip>
+                        <el-tooltip content="删除" placement="top">
+                            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']"></el-button>
+                        </el-tooltip>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <pagination
+                v-show="total>0"
+                :total="total"
+                v-model:page="queryParams.pageNum"
+                v-model:limit="queryParams.pageSize"
+                @pagination="getList"
             />
-          </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-          <el-form-item label="${comment}" style="width: 308px">
-            <el-date-picker
-                v-model="dateRange${AttrName}"
-                value-format="YYYY-MM-DD"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                :default-time="[new Date(2024, 1, 1, 0, 0, 0), new Date(2024, 1, 1, 23, 59, 59)]"
-            />
-          </el-form-item>
-#end
-#end
-#end
-          <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
-      </div>
-    </transition>
+        </el-card>
+        <!-- 添加或修改${functionName}对话框 -->
+        <el-dialog :title="dialog.title" v-model="dialog.visible" width="1200px" append-to-body>
+            <el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="100px">
+                <el-row>
+                    #foreach($column in $columns)
+                        #set($field=$column.javaField)
+                        #if(($column.insert || $column.edit) && !$column.pk)
+                            #set($parentheseIndex=$column.columnComment.indexOf("("))
+                            #if($parentheseIndex != -1)
+                                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                            #else
+                                #set($comment=$column.columnComment)
+                            #end
+                            #set($dictType=$column.dictType)
+                            #if(${editColumns}==1)
+                            <el-col :span="24">
+                            #end
+                            #if(${editColumns}==2)
+                            <el-col :span="12">
+                            #end
+                            #if(${editColumns}==3)
+                            <el-col :span="8">
+                            #end
+                            #if(${editColumns}==4)
+                            <el-col :span="6">
+                            #end
+                            #if($column.htmlType == "input")
+                                #if(${field} == "version")
+                                    <el-form-item label="${comment}" prop="${field}" v-show="false">
+                                        <el-input v-model="form.${field}" placeholder="请输入${comment}" />
+                                    </el-form-item>
+                                #else
+                                    <el-form-item label="${comment}" prop="${field}">
+                                        <el-input v-model="form.${field}" placeholder="请输入${comment}" />
+                                    </el-form-item>
+                                #end
+                            #elseif($column.htmlType == "imageUpload")
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <image-upload v-model="form.${field}"/>
+                                </el-form-item>
+                            #elseif($column.htmlType == "fileUpload")
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <file-upload v-model="form.${field}"/>
+                                </el-form-item>
+                            #elseif($column.htmlType == "editor")
+                                <el-form-item label="${comment}">
+                                    <editor v-model="form.${field}" :min-height="192"/>
+                                </el-form-item>
+                            #elseif($column.htmlType == "select" && "" != $dictType)
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-select v-model="form.${field}" placeholder="请选择${comment}">
+                                        <el-option
+                                            v-for="dict in ${dictType}"
+                                            :key="dict.value"
+                                            :label="dict.label"
+                                            #if($column.javaType == "Integer" || $column.javaType == "Long")
+                                            :value="parseInt(dict.value)"
+                                            #else
+                                            :value="dict.value"
+                                            #end
+                                        ></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            #elseif($column.htmlType == "select" && $dictType)
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-select v-model="form.${field}" placeholder="请选择${comment}">
+                                        <el-option label="请选择字典生成" value="" />
+                                    </el-select>
+                                </el-form-item>
+                            #elseif($column.htmlType == "checkbox" && "" != $dictType)
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-checkbox-group v-model="form.${field}">
+                                        <el-checkbox
+                                            v-for="dict in ${dictType}"
+                                            :key="dict.value"
+                                            :label="dict.value">
+                                            {{dict.label}}
+                                        </el-checkbox>
+                                    </el-checkbox-group>
+                                </el-form-item>
+                            #elseif($column.htmlType == "checkbox" && $dictType)
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-checkbox-group v-model="form.${field}">
+                                        <el-checkbox>请选择字典生成</el-checkbox>
+                                    </el-checkbox-group>
+                                </el-form-item>
+                            #elseif($column.htmlType == "radio" && "" != $dictType)
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-radio-group v-model="form.${field}">
+                                        <el-radio
+                                            v-for="dict in ${dictType}"
+                                            :key="dict.value"
+                                            #if($column.javaType == "Integer" || $column.javaType == "Long")
+                                            :label="parseInt(dict.value)"
+                                            #else
+                                            :label="dict.value"
+                                            #end
+                                        >{{dict.label}}</el-radio>
+                                    </el-radio-group>
+                                </el-form-item>
+                            #elseif($column.htmlType == "radio" && $dictType)
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-radio-group v-model="form.${field}">
+                                        <el-radio label="1">请选择字典生成</el-radio>
+                                    </el-radio-group>
+                                </el-form-item>
+                            #elseif($column.htmlType == "datetime")
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-date-picker clearable
+                                                    v-model="form.${field}"
+                                                    type="datetime"
+                                                    value-format="YYYY-MM-DD HH:mm:ss"
+                                                    placeholder="请选择${comment}">
+                                    </el-date-picker>
+                                </el-form-item>
+                            #elseif($column.htmlType == "textarea")
+                                <el-form-item label="${comment}" prop="${field}">
+                                    <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
+                                </el-form-item>
+                            #end
+                        </el-col>
+                        #end
 
-    <el-card shadow="never">
-      <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="success" plain icon="Top" @click="handleImport()" v-hasPermi="['${moduleName}:${businessName}:import']">导入</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['${moduleName}:${businessName}:export']">导出</el-button>
-          </el-col>
-          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-        </el-row>
-      </template>
-
-      <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-#foreach($column in $columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk)
-        <el-table-column label="${comment}" align="center" prop="${javaField}" v-if="${column.list}" />
-#elseif($column.list && $column.htmlType == "datetime")
-        <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-          <template #default="scope">
-            <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-          </template>
-        </el-table-column>
-#elseif($column.list && $column.htmlType == "imageUpload")
-        <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-          <template #default="scope">
-            <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-          </template>
-        </el-table-column>
-#elseif($column.list && $column.dictType && "" != $column.dictType)
-        <el-table-column label="${comment}" align="center" prop="${javaField}">
-          <template #default="scope">
-#if($column.htmlType == "checkbox")
-            <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-#else
-            <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-#end
-          </template>
-        </el-table-column>
-#elseif($column.list && "" != $javaField)
-        <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#end
-#end
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']"></el-button>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination
-          v-show="total>0"
-          :total="total"
-          v-model:page="queryParams.pageNum"
-          v-model:limit="queryParams.pageSize"
-          @pagination="getList"
-      />
-    </el-card>
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="780px" append-to-body>
-      <el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-#set($field=$column.javaField)
-#if(($column.insert || $column.edit) && !$column.pk)
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#set($dictType=$column.dictType)
-#if($column.htmlType == "input")
-    #if(${field} == "version")
-        <el-form-item label="${comment}" prop="${field}" v-show="false">
-            <el-input v-model="form.${field}" placeholder="请输入${comment}" />
-        </el-form-item>
-    #else
-        <el-form-item label="${comment}" prop="${field}">
-            <el-input v-model="form.${field}" placeholder="请输入${comment}" />
-        </el-form-item>
-    #end
-#elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-#elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-            <el-option
-                v-for="dict in ${dictType}"
-                :key="dict.value"
-                :label="dict.label"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-                :value="parseInt(dict.value)"
-#else
-                :value="dict.value"
-#end
-            ></el-option>
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="请选择${comment}">
-            <el-option label="请选择字典生成" value="" />
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox
-                v-for="dict in ${dictType}"
-                :key="dict.value"
-                :label="dict.value">
-                {{dict.label}}
-            </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>请选择字典生成</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio
-                v-for="dict in ${dictType}"
-                :key="dict.value"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-                :label="parseInt(dict.value)"
-#else
-                :label="dict.value"
-#end
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-                <el-radio label="1">请选择字典生成</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-            v-model="form.${field}"
-            type="datetime"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            placeholder="请选择${comment}">
-          </el-date-picker>
-        </el-form-item>
-#elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-            <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-#end
-#end
-#end
-  #if($table.sub)
-      <el-divider content-position="center">${subTable.functionName}信息</el-divider>
-      <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-              <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">添加</el-button>
-          </el-col>
-          <el-col :span="1.5">
-              <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">删除</el-button>
-          </el-col>
-      </el-row>
-      <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-          <el-table-column type="selection" width="50" align="center" />
-          <el-table-column label="序号" align="center" prop="index" width="50" />
-          #foreach($column in $subTable.columns)
-              #set($javaField=$column.javaField)
-              #set($parentheseIndex=$column.columnComment.indexOf("("))
-              #if($parentheseIndex != -1)
-                  #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-              #else
-                  #set($comment=$column.columnComment)
-              #end
-              #if($column.pk || $javaField == ${subTableFkclassName})
-              #elseif($column.list && $column.htmlType == "input")
-                  #if(${javaField} == "version")
-                  <el-table-column v-if="false" label="$comment" prop="${javaField}" width="150">
-                      <template #default="scope">
-                          <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
-                      </template>
-                  </el-table-column>
-                  #else
-                  <el-table-column label="$comment" prop="${javaField}" width="150">
-                      <template #default="scope">
-                          <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
-                      </template>
-                  </el-table-column>
-                  #end
-              #elseif($column.list && $column.htmlType == "datetime")
-              <el-table-column label="$comment" prop="${javaField}" width="240">
-                  <template #default="scope">
-                      <el-date-picker clearable
-                                      v-model="scope.row.$javaField"
-                                      type="date"
-                                      value-format="YYYY-MM-DD"
-                                      placeholder="请选择$comment">
-                      </el-date-picker>
-                  </template>
-              </el-table-column>
-              #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
-              <el-table-column label="$comment" prop="${javaField}" width="150">
-                  <template #default="scope">
-                      <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-                          <el-option
-                              v-for="dict in $column.dictType"
-                              :key="dict.value"
-                              :label="dict.label"
-                              :value="dict.value"
-                          ></el-option>
-                      </el-select>
-                  </template>
-              </el-table-column>
-              #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
-              <el-table-column label="$comment" prop="${javaField}" width="150">
-                  <template #default="scope">
-                      <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-                          <el-option label="请选择字典生成" value="" />
-                      </el-select>
-                  </template>
-              </el-table-column>
-              #end
-          #end
-      </el-table>
-  #end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 导入对话框 -->
-    <el-dialog v-model="upload.open" :title="upload.title" width="400px" append-to-body>
-      <el-upload
-          ref="uploadRef"
-          :limit="1"
-          accept=".xlsx, .xls"
-          :headers="upload.headers"
-          :action="upload.url + '?updateSupport=' + upload.updateSupport"
-          :disabled="upload.isUploading"
-          :on-progress="handleFileUploadProgress"
-          :on-success="handleFileSuccess"
-          :auto-upload="false"
-          drag
-      >
-          <el-icon class="el-icon--upload">
-              <i-ep-upload-filled />
-          </el-icon>
-          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-          <template #tip>
-              <div class="text-center el-upload__tip">
-                  <div class="el-upload__tip">
-                      <el-checkbox v-model="upload.updateSupport" />
-                      是否更新已经存在的${functionName}数据
-                  </div>
-                  <span>仅允许导入xls、xlsx格式文件。</span>
-                  <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板 </el-link>
-              </div>
-          </template>
-      </el-upload>
-      <template #footer>
-          <div class="dialog-footer">
-              <el-button type="primary" @click="submitFileForm">确 定</el-button>
-              <el-button @click="upload.open = false">取 消</el-button>
-          </div>
-      </template>
-    </el-dialog>
-  </div>
+                    #end
+                </el-row>
+                #if($table.sub)
+                    <el-divider content-position="center">${subTable.functionName}信息</el-divider>
+                    <el-row :gutter="10" class="mb8">
+                        <el-col :span="1.5">
+                            <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">添加</el-button>
+                        </el-col>
+                        <el-col :span="1.5">
+                            <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">删除</el-button>
+                        </el-col>
+                    </el-row>
+                    <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
+                        <el-table-column type="selection" width="50" align="center" />
+                        <el-table-column label="序号" align="center" prop="index" width="50" />
+                        #foreach($column in $subTable.columns)
+                            #set($javaField=$column.javaField)
+                            #set($parentheseIndex=$column.columnComment.indexOf("("))
+                            #if($parentheseIndex != -1)
+                                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                            #else
+                                #set($comment=$column.columnComment)
+                            #end
+                            #if($column.pk || $javaField == ${subTableFkclassName})
+                            #elseif($column.list && $column.htmlType == "input")
+                                #if(${javaField} == "version")
+                                    <el-table-column v-if="false" label="$comment" prop="${javaField}" width="150">
+                                        <template #default="scope">
+                                            <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
+                                        </template>
+                                    </el-table-column>
+                                #else
+                                    <el-table-column label="$comment" prop="${javaField}" width="150">
+                                        <template #default="scope">
+                                            <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
+                                        </template>
+                                    </el-table-column>
+                                #end
+                            #elseif($column.list && $column.htmlType == "datetime")
+                                <el-table-column label="$comment" prop="${javaField}" width="240">
+                                    <template #default="scope">
+                                        <el-date-picker clearable
+                                                        v-model="scope.row.$javaField"
+                                                        type="date"
+                                                        value-format="YYYY-MM-DD"
+                                                        placeholder="请选择$comment">
+                                        </el-date-picker>
+                                    </template>
+                                </el-table-column>
+                            #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
+                                <el-table-column label="$comment" prop="${javaField}" width="150">
+                                    <template #default="scope">
+                                        <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
+                                            <el-option
+                                                v-for="dict in $column.dictType"
+                                                :key="dict.value"
+                                                :label="dict.label"
+                                                :value="dict.value"
+                                            ></el-option>
+                                        </el-select>
+                                    </template>
+                                </el-table-column>
+                            #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
+                                <el-table-column label="$comment" prop="${javaField}" width="150">
+                                    <template #default="scope">
+                                        <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
+                                            <el-option label="请选择字典生成" value="" />
+                                        </el-select>
+                                    </template>
+                                </el-table-column>
+                            #end
+                        #end
+                    </el-table>
+                #end
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
 </template>
 
-<script setup lang="ts">
-import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from '@/api/${moduleName}/${businessName}';
-#if($table.sub)
-import { ${BusinessName}VO, ${subClassName}VO, ${BusinessName}Query, ${BusinessName}Form } from '@/api/${moduleName}/${businessName}/types';
-#else
-import { ${BusinessName}VO, ${BusinessName}Query, ${BusinessName}Form } from '@/api/${moduleName}/${businessName}/types';
-#end
-import { globalHeaders } from '@/utils/request';
-
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-#if(${dicts} != '')
-#set($dictsNoSymbol=$dicts.replace("'", ""))
-const { ${dictsNoSymbol} } = toRefs<any>(proxy?.useDict(${dicts}));
-#end
-
-// 表格数据
-const ${businessName}List = ref<${BusinessName}VO[]>([]);
-#if($table.sub)
-// 子表格数据
-const ${subclassName}List = ref<${subClassName}VO[]>([]);
-#end
-const buttonLoading = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-// 选中数组
-const ids = ref<Array<string | number>>([]);
-#if($table.sub)
-// 子表选中数据
-const checked${subClassName} = ref<${subClassName}VO[]>([]);
-#end
-// 非单个禁用
-const single = ref(true);
-// 非多个禁用
-const multiple = ref(true);
-// 总条数
-const total = ref(0);
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-const dateRange${AttrName} = ref<[DateModelType, DateModelType]>(['', '']);
-#end
-#end
-
-const queryFormRef = ref<ElFormInstance>();
-const ${businessName}FormRef = ref<ElFormInstance>();
-const uploadRef = ref<ElUploadInstance>();
-
-/*** 导入参数 */
-const upload = reactive<ImportOption>({
-    // 是否显示弹出层(导入)
-    open: false,
-    // 弹出层标题(导入)
-    title: '',
-    // 是否禁用上传
-    isUploading: false,
-    // 是否更新已经存在的用户数据
-    updateSupport: 1,
-    // 设置上传的请求头部
-    headers: globalHeaders(),
-    // 上传的地址
-    url: import.meta.env.VITE_APP_BASE_API + '/${moduleName}/${businessName}/importData'
-});
-
-const dialog = reactive<DialogOption>({
-  visible: false,
-  title: ''
-});
-
-const initFormData: ${BusinessName}Form = {
-#foreach ($column in $columns)
-#if($column.insert || $column.edit)
-#if($column.htmlType == "checkbox")
-  $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
- #if(${column.javaField} == "version")
-  $column.javaField: 0#if($foreach.count != $columns.size()),#end
- #else
-  $column.javaField: undefined#if($foreach.count != $columns.size()),#end
- #end
-#end
-#end
-#end
-};
-const data = reactive<PageData<${BusinessName}Form, ${BusinessName}Query>>({
-  form: {...initFormData},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-#foreach ($column in $columns)
-#if($column.query)
-#if($column.htmlType != "datetime" || $column.queryType != "BETWEEN")
-    $column.javaField: undefined,
-#end
-#end
-#end
-    params: {
-#foreach ($column in $columns)
-#if($column.query)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      $column.javaField: undefined#if($foreach.count != $columns.size()),#end
-#end
-#end
-#end
-    }
-  },
-  rules: {
-#foreach ($column in $columns)
-#if($column.insert || $column.edit)
-#if($column.required)
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-    $column.javaField: [
-      { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-    ]#if($foreach.count != $columns.size()),#end
-#end
-#end
-#end
-  }
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 查询${functionName}列表 */
-const getList = async () => {
-  loading.value = true;
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-  queryParams.value.params = {};
-#break
-#end
-#end
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-  proxy?.addDateRange(queryParams.value, dateRange${AttrName}.value, '${AttrName}');
-#end
-#end
-  const res = await list${BusinessName}(queryParams.value);
-  ${businessName}List.value = res.rows;
-  total.value = res.total;
-  loading.value = false;
-};
-
-/** 取消按钮 */
-const cancel = () => {
-  reset();
-  dialog.visible = false;
-};
-
-/** 表单重置 */
-const reset = () => {
-  form.value = {...initFormData};
-#if($table.sub)
-  ${subclassName}List.value = [];
-#end
-  ${businessName}FormRef.value?.resetFields();
-};
-
-/** 搜索按钮操作 */
-const handleQuery = () => {
-  queryParams.value.pageNum = 1;
-  getList();
-};
-
-/** 重置按钮操作 */
-const resetQuery = () => {
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-  dateRange${AttrName}.value = ['', ''];
-#end
-#end
-  queryFormRef.value?.resetFields();
-  handleQuery();
-};
-
-/** 多选框选中数据 */
-const handleSelectionChange = (selection: ${BusinessName}VO[]) => {
-  ids.value = selection.map(item => item.${pkColumn.javaField});
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-};
-
-/** 新增按钮操作 */
-const handleAdd = () => {
-  reset();
-  dialog.visible = true;
-  dialog.title = '添加${functionName}';
-};
-
-/** 修改按钮操作 */
-const handleUpdate = async (row?: ${BusinessName}VO) => {
-  reset();
-  const _${pkColumn.javaField} = row?.${pkColumn.javaField} || ids.value[0];
-  const res = await get${BusinessName}(_${pkColumn.javaField});
-  Object.assign(form.value, res.data);
-#foreach ($column in $columns)
-  #if($column.htmlType == "checkbox")
-  form.value.$column.javaField = form.value.${column.javaField}.split(",");
-  #end
-#end
-#if($table.sub)
-  ${subclassName}List.value = res.data.${subclassName}List;
-#end
-  dialog.visible = true;
-  dialog.title = '修改${functionName}';
-};
-
-/** 提交按钮 */
-const submitForm = () => {
-  ${businessName}FormRef.value?.validate(async (valid: boolean) => {
-    if (valid) {
-      buttonLoading.value = true;
-      #foreach ($column in $columns)
-        #if($column.htmlType == "checkbox")
-        form.value.$column.javaField = form.value.${column.javaField}.join(",");
+<script setup name="${BusinessName}" lang="ts">
+    import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from '@/api/${moduleName}/${businessName}';
+        #if($table.sub)
+        import { ${BusinessName}VO, ${subClassName}VO, ${BusinessName}Query, ${BusinessName}Form } from '@/api/${moduleName}/${businessName}/types';
+        #else
+        import { ${BusinessName}VO, ${BusinessName}Query, ${BusinessName}Form } from '@/api/${moduleName}/${businessName}/types';
         #end
-      #end
-    #if($table.sub)
-      form.value.${subclassName}List = ${subclassName}List.value;
-    #end
-      if (form.value.${pkColumn.javaField}) {
-        await update${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
-      } else {
-        await add${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
-      }
-      proxy?.#[[$modal]]#.msgSuccess('操作成功');
-      dialog.visible = false;
-      await getList();
-    }
-  });
-};
 
-/** 删除按钮操作 */
-const handleDelete = async (row?: ${BusinessName}VO) => {
-  const _${pkColumn.javaField}s = row?.${pkColumn.javaField} || ids.value;
-  await proxy?.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').finally(() => loading.value = false);
-  await del${BusinessName}(_${pkColumn.javaField}s);
-  proxy?.#[[$modal]]#.msgSuccess("删除成功");
-  await getList();
-};
+    const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+        #if(${dicts} != '')
+            #set($dictsNoSymbol=$dicts.replace("'", ""))
+        const { ${dictsNoSymbol} } = toRefs<any>(proxy?.useDict(${dicts}));
+        #end
 
-#if($table.sub)
-/** ${subTable.functionName}序号 */
-const row${subClassName}Index = ({row,rowIndex}: {row: ${subClassName}VO,rowIndex: number}) => {
-    row.index = rowIndex + 1;
-}
+    // 表格数据
+    const ${businessName}List = ref<${BusinessName}VO[]>([]);
+        #if($table.sub)
+        // 子表格数据
+        const ${subclassName}List = ref<${subClassName}VO[]>([]);
+        #end
+    const buttonLoading = ref(false);
+    const loading = ref(true);
+    const showSearch = ref(true);
+    // 选中数组
+    const ids = ref<Array<string | number>>([]);
+        #if($table.sub)
+        // 子表选中数据
+        const checked${subClassName} = ref<${subClassName}VO[]>([]);
+        #end
+    // 非单个禁用
+    const single = ref(true);
+    // 非多个禁用
+    const multiple = ref(true);
+    // 总条数
+    const total = ref(0);
+        #foreach ($column in $columns)
+            #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+            const dateRange${AttrName} = ref<[DateModelType, DateModelType]>(['', '']);
+            #end
+        #end
 
-/** ${subTable.functionName}添加按钮操作 */
-const handleAdd${subClassName} = () => {
-    let obj = {};
-#foreach($column in $subTable.columns)
-  #if($column.pk || $column.javaField == ${subTableFkclassName})
-  #elseif($column.list && "" != $javaField)
-   #if(${column.javaField} == "version")
-    obj.$column.javaField = 0;
-   #else
-    obj.$column.javaField = "";
-   #end
-  #end
-#end
-    ${subclassName}List.value.push(obj);
-}
+    const queryFormRef = ref<ElFormInstance>();
+    const ${businessName}FormRef = ref<ElFormInstance>();
 
-/** ${subTable.functionName}删除按钮操作 */
-const handleDelete${subClassName} = () => {
-    if (checked${subClassName}.value.length == 0) {
-        proxy.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
-    } else {
-        const ${subclassName}s = ${subclassName}List.value;
-        const checked${subClassName}s = checked${subClassName}.value;
-        ${subclassName}List.value = ${subclassName}s.filter(function(item) {
-            return checked${subClassName}s.indexOf(item.index) == -1
-        });
-    }
-}
-
-/** 复选框选中数据 */
-const handle${subClassName}SelectionChange = (selection: ${subClassName}VO[]) => {
-    checked${subClassName}.value = selection.map(item => item.index)
-}
-#end
-
-/** 导出按钮操作 */
-const handleExport = () => {
-  proxy?.download('${moduleName}/${businessName}/export', {
-    ...queryParams.value
-  }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-};
-
-/** 导入按钮操作 */
-const handleImport = () => {
-    upload.title = '${functionName}导入';
-    upload.open = true;
-};
-
-/** 下载模板操作 */
-const importTemplate = () => {
-    proxy?.download('${moduleName}/${businessName}/importTemplate', {}, `${businessName}_template.xlsx`);
-};
-
-/**文件上传中处理 */
-const handleFileUploadProgress = () => {
-    upload.isUploading = true;
-};
-/** 文件上传成功处理 */
-const handleFileSuccess = (response: any, file: UploadFile) => {
-    upload.open = false;
-    upload.isUploading = false;
-    uploadRef.value?.handleRemove(file);
-    ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', {
-        dangerouslyUseHTMLString: true
+    const dialog = reactive<DialogOption>({
+        visible: false,
+        title: ''
     });
-    getList();
-};
 
-/** 提交上传文件 */
-function submitFileForm() {
-    uploadRef.value?.submit();
-}
+    const initFormData: ${BusinessName}Form = {
+        #foreach ($column in $columns)
+            #if($column.insert || $column.edit)
+                #if($column.htmlType == "checkbox")
+                        $column.javaField: []#if($foreach.count != $columns.size()),#end
+                #else
+                    #if(${column.javaField} == "version")
+                            $column.javaField: 0#if($foreach.count != $columns.size()),#end
+                    #else
+                            $column.javaField: undefined#if($foreach.count != $columns.size()),#end
+                    #end
+                #end
+            #end
+        #end
+    };
+    const data = reactive<PageData<${BusinessName}Form, ${BusinessName}Query>>({
+        form: {...initFormData},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            #foreach ($column in $columns)
+                #if($column.query)
+                    #if($column.htmlType != "datetime" || $column.queryType != "BETWEEN")
+                            $column.javaField: undefined,
+                    #end
+                #end
+            #end
+            params: {
+                #foreach ($column in $columns)
+                    #if($column.query)
+                        #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                                $column.javaField: undefined#if($foreach.count != $columns.size()),#end
+                        #end
+                    #end
+                #end
+            }
+        },
+        rules: {
+            #foreach ($column in $columns)
+                #if($column.insert || $column.edit)
+                    #if($column.required)
+                        #set($parentheseIndex=$column.columnComment.indexOf("("))
+                        #if($parentheseIndex != -1)
+                            #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                        #else
+                            #set($comment=$column.columnComment)
+                        #end
+                            $column.javaField: [
+                            { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
+                        ]#if($foreach.count != $columns.size()),#end
+                    #end
+                #end
+            #end
+        }
+    });
 
-onMounted(() => {
-  getList();
-});
+    const { queryParams, form, rules } = toRefs(data);
+
+    /** 查询${functionName}列表 */
+    const getList = async () => {
+        loading.value = true;
+        #foreach ($column in $columns)
+            #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                queryParams.value.params = {};
+                #break
+            #end
+        #end
+        #foreach ($column in $columns)
+            #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                proxy?.addDateRange(queryParams.value, dateRange${AttrName}.value, '${AttrName}');
+            #end
+        #end
+        const res = await list${BusinessName}(queryParams.value);
+            ${businessName}List.value = res.rows;
+        total.value = res.total;
+        loading.value = false;
+    };
+
+    /** 取消按钮 */
+    const cancel = () => {
+        reset();
+        dialog.visible = false;
+    };
+
+    /** 表单重置 */
+    const reset = () => {
+        form.value = {...initFormData};
+        #if($table.sub)
+                ${subclassName}List.value = [];
+        #end
+            ${businessName}FormRef.value?.resetFields();
+    };
+
+    /** 搜索按钮操作 */
+    const handleQuery = () => {
+        queryParams.value.pageNum = 1;
+        getList();
+    };
+
+    /** 重置按钮操作 */
+    const resetQuery = () => {
+        #foreach ($column in $columns)
+            #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+                dateRange${AttrName}.value = ['', ''];
+            #end
+        #end
+        queryFormRef.value?.resetFields();
+        handleQuery();
+    };
+
+    /** 多选框选中数据 */
+    const handleSelectionChange = (selection: ${BusinessName}VO[]) => {
+        ids.value = selection.map(item => item.${pkColumn.javaField});
+        single.value = selection.length != 1;
+        multiple.value = !selection.length;
+    };
+
+    /** 新增按钮操作 */
+    const handleAdd = () => {
+        reset();
+        dialog.visible = true;
+        dialog.title = '添加${functionName}';
+    };
+
+    /** 修改按钮操作 */
+    const handleUpdate = async (row?: ${BusinessName}VO) => {
+        reset();
+        const _${pkColumn.javaField} = row?.${pkColumn.javaField} || ids.value[0];
+        const res = await get${BusinessName}(_${pkColumn.javaField});
+        Object.assign(form.value, res.data);
+        #foreach ($column in $columns)
+            #if($column.htmlType == "checkbox")
+                form.value.$column.javaField = form.value.${column.javaField}.split(",");
+            #end
+        #end
+        #if($table.sub)
+                ${subclassName}List.value = res.data.${subclassName}List;
+        #end
+        dialog.visible = true;
+        dialog.title = '修改${functionName}';
+    };
+
+    /** 提交按钮 */
+    const submitForm = () => {
+            ${businessName}FormRef.value?.validate(async (valid: boolean) => {
+            if (valid) {
+                buttonLoading.value = true;
+                #foreach ($column in $columns)
+                    #if($column.htmlType == "checkbox")
+                        form.value.$column.javaField = form.value.${column.javaField}.join(",");
+                    #end
+                #end
+                #if($table.sub)
+                    form.value.${subclassName}List = ${subclassName}List.value;
+                #end
+                if (form.value.${pkColumn.javaField}) {
+                    await update${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
+                } else {
+                    await add${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
+                }
+                proxy?.#[[$modal]]#.msgSuccess('操作成功');
+                dialog.visible = false;
+                await getList();
+            }
+        });
+    };
+
+    /** 删除按钮操作 */
+    const handleDelete = async (row?: ${BusinessName}VO) => {
+        const _${pkColumn.javaField}s = row?.${pkColumn.javaField} || ids.value;
+        await proxy?.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').finally(() => loading.value = false);
+        await del${BusinessName}(_${pkColumn.javaField}s);
+        proxy?.#[[$modal]]#.msgSuccess("删除成功");
+        await getList();
+    };
+
+    #if($table.sub)
+    /** ${subTable.functionName}序号 */
+    const row${subClassName}Index = ({row,rowIndex}: {row: ${subClassName}VO,rowIndex: number}) => {
+        row.index = rowIndex + 1;
+    }
+
+    /** ${subTable.functionName}添加按钮操作 */
+    const handleAdd${subClassName} = () => {
+        let obj = {};
+        #foreach($column in $subTable.columns)
+        #if($column.pk || $column.javaField == ${subTableFkclassName})
+        #elseif($column.list && "" != $javaField)
+        #if(${column.javaField} == "version")
+        obj.$column.javaField = 0;
+        #else
+        obj.$column.javaField = "";
+        #end
+        #end
+        #end
+        ${subclassName}List.value.push(obj);
+    }
+
+    /** ${subTable.functionName}删除按钮操作 */
+    const handleDelete${subClassName} = () => {
+        if (checked${subClassName}.value.length == 0) {
+            proxy.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
+        } else {
+            const ${subclassName}s = ${subclassName}List.value;
+            const checked${subClassName}s = checked${subClassName}.value;
+            ${subclassName}List.value = ${subclassName}s.filter(function(item) {
+                return checked${subClassName}s.indexOf(item.index) == -1
+            });
+        }
+    }
+
+    /** 复选框选中数据 */
+    const handle${subClassName}SelectionChange = (selection: ${subClassName}VO[]) => {
+        checked${subClassName}.value = selection.map(item => item.index)
+    }
+    #end
+
+    /** 导出按钮操作 */
+    const handleExport = () => {
+        proxy?.download('${moduleName}/${businessName}/export', {
+            ...queryParams.value
+        }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
+    };
+
+    onMounted(() => {
+        getList();
+    });
 </script>

From c8738f6eb016d4400d0dfbbd8ad09b720ad00588 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=99=A8=E6=9B=A6?= <635132977@qq.com>
Date: Tue, 16 Apr 2024 15:21:43 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=A1=B5=E7=9A=84?=
 =?UTF-8?q?=E5=88=97=E6=95=B0=E7=94=B1=E5=8E=9F=E5=85=881=E5=88=97?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E5=A4=9A=EF=BC=881-4=EF=BC=89?=
 =?UTF-8?q?=E5=88=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/java/com/ruoyi/generator/domain/GenTable.java     | 3 +++
 .../src/main/java/com/ruoyi/generator/util/VelocityUtils.java  | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
index 6c5d71f..5602538 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
@@ -156,6 +156,9 @@ public class GenTable implements Serializable
     /** 备注   */
     private String remark;
 
+    /** 编辑页列数  */
+    private Integer editColumns;
+
     /**
      * 请求参数
      */
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
index a3a6cd7..09663da 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
@@ -70,6 +70,8 @@ public class VelocityUtils {
         velocityContext.put("columns", genTable.getColumns());
         velocityContext.put("table", genTable);
         velocityContext.put("dicts", getDicts(genTable));
+        /* 编辑页列数*/
+        velocityContext.put("editColumns", genTable.getEditColumns());
         setMenuVelocityContext(velocityContext, genTable);
         if (GenConstants.TPL_TREE.equals(tplCategory)) {
             setTreeVelocityContext(velocityContext, genTable);

From 108bd8e7c4f69e38a78857b31954b5ad32a4fb53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=99=A8=E6=9B=A6?= <635132977@qq.com>
Date: Tue, 16 Apr 2024 17:39:27 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=A1=B5=E7=9A=84?=
 =?UTF-8?q?=E5=88=97=E6=95=B0=E7=94=B1=E5=8E=9F=E5=85=881=E5=88=97?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E5=A4=9A=EF=BC=881-4=EF=BC=89?=
 =?UTF-8?q?=E5=88=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/resources/vm/vue/element.ts.index.vue.vm           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
index d128863..d7a38fd 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
+++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
@@ -263,7 +263,7 @@
                                     <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
                                 </el-form-item>
                             #end
-                        </el-col>
+                            </el-col>
                         #end
 
                     #end

From d86def60368e112195acd84a039d460a555dfd57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=99=A8=E6=9B=A6?= <635132977@qq.com>
Date: Tue, 16 Apr 2024 18:57:41 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=A1=B5=E7=9A=84?=
 =?UTF-8?q?=E5=88=97=E6=95=B0=E7=94=B1=E5=8E=9F=E5=85=881=E5=88=97?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=E5=A4=9A=EF=BC=881-4=EF=BC=89?=
 =?UTF-8?q?=E5=88=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../resources/vm/vue/element.ts.index.vue.vm  | 104 ++++++++++++++++--
 script/sql/mysql/update.sql                   |   3 +
 script/sql/postgresql/update.sql              |   3 +
 3 files changed, 102 insertions(+), 8 deletions(-)

diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
index d7a38fd..5a7b54a 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
+++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index.vue.vm
@@ -78,6 +78,9 @@
                     <el-col :span="1.5">
                         <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
                     </el-col>
+                    <el-col :span="1.5">
+                        <el-button type="success" plain icon="Top" @click="handleImport()" v-hasPermi="['${moduleName}:${businessName}:import']">导入</el-button>
+                    </el-col>
                     <el-col :span="1.5">
                         <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['${moduleName}:${businessName}:export']">导出</el-button>
                     </el-col>
@@ -144,7 +147,7 @@
             />
         </el-card>
         <!-- 添加或修改${functionName}对话框 -->
-        <el-dialog :title="dialog.title" v-model="dialog.visible" width="1200px" append-to-body>
+        <el-dialog :title="dialog.title" v-model="dialog.visible" width="1000px" append-to-body>
             <el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="100px">
                 <el-row>
                     #foreach($column in $columns)
@@ -158,16 +161,16 @@
                             #end
                             #set($dictType=$column.dictType)
                             #if(${editColumns}==1)
-                            <el-col :span="24">
+                        <el-col :span="24">
                             #end
                             #if(${editColumns}==2)
-                            <el-col :span="12">
+                        <el-col :span="12">
                             #end
                             #if(${editColumns}==3)
-                            <el-col :span="8">
+                        <el-col :span="8">
                             #end
                             #if(${editColumns}==4)
-                            <el-col :span="6">
+                        <el-col :span="6">
                             #end
                             #if($column.htmlType == "input")
                                 #if(${field} == "version")
@@ -263,9 +266,8 @@
                                     <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
                                 </el-form-item>
                             #end
-                            </el-col>
+                        </el-col>
                         #end
-
                     #end
                 </el-row>
                 #if($table.sub)
@@ -348,16 +350,54 @@
                 </div>
             </template>
         </el-dialog>
+
+        <!-- 导入对话框 -->
+        <el-dialog v-model="upload.open" :title="upload.title" width="400px" append-to-body>
+            <el-upload
+                ref="uploadRef"
+                :limit="1"
+                accept=".xlsx, .xls"
+                :headers="upload.headers"
+                :action="upload.url + '?updateSupport=' + upload.updateSupport"
+                :disabled="upload.isUploading"
+                :on-progress="handleFileUploadProgress"
+                :on-success="handleFileSuccess"
+                :auto-upload="false"
+                drag
+            >
+                <el-icon class="el-icon--upload">
+                    <i-ep-upload-filled />
+                </el-icon>
+                <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                <template #tip>
+                    <div class="text-center el-upload__tip">
+                        <div class="el-upload__tip">
+                            <el-checkbox v-model="upload.updateSupport" />
+                            是否更新已经存在的${functionName}数据
+                        </div>
+                        <span>仅允许导入xls、xlsx格式文件。</span>
+                        <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板 </el-link>
+                    </div>
+                </template>
+            </el-upload>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitFileForm">确 定</el-button>
+                    <el-button @click="upload.open = false">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
     </div>
 </template>
 
-<script setup name="${BusinessName}" lang="ts">
+<script setup lang="ts">
     import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from '@/api/${moduleName}/${businessName}';
         #if($table.sub)
         import { ${BusinessName}VO, ${subClassName}VO, ${BusinessName}Query, ${BusinessName}Form } from '@/api/${moduleName}/${businessName}/types';
         #else
         import { ${BusinessName}VO, ${BusinessName}Query, ${BusinessName}Form } from '@/api/${moduleName}/${businessName}/types';
         #end
+    import { globalHeaders } from '@/utils/request';
 
     const { proxy } = getCurrentInstance() as ComponentInternalInstance;
         #if(${dicts} != '')
@@ -395,6 +435,23 @@
 
     const queryFormRef = ref<ElFormInstance>();
     const ${businessName}FormRef = ref<ElFormInstance>();
+    const uploadRef = ref<ElUploadInstance>();
+
+    /*** 导入参数 */
+    const upload = reactive<ImportOption>({
+        // 是否显示弹出层(导入)
+        open: false,
+        // 弹出层标题(导入)
+        title: '',
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 1,
+        // 设置上传的请求头部
+        headers: globalHeaders(),
+        // 上传的地址
+        url: import.meta.env.VITE_APP_BASE_API + '/${moduleName}/${businessName}/importData'
+    });
 
     const dialog = reactive<DialogOption>({
         visible: false,
@@ -627,6 +684,37 @@
         }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
     };
 
+    /** 导入按钮操作 */
+    const handleImport = () => {
+        upload.title = '${functionName}导入';
+        upload.open = true;
+    };
+
+    /** 下载模板操作 */
+    const importTemplate = () => {
+        proxy?.download('${moduleName}/${businessName}/importTemplate', {}, `${businessName}_template.xlsx`);
+    };
+
+    /**文件上传中处理 */
+    const handleFileUploadProgress = () => {
+        upload.isUploading = true;
+    };
+    /** 文件上传成功处理 */
+    const handleFileSuccess = (response: any, file: UploadFile) => {
+        upload.open = false;
+        upload.isUploading = false;
+        uploadRef.value?.handleRemove(file);
+        ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', {
+            dangerouslyUseHTMLString: true
+        });
+        getList();
+    };
+
+    /** 提交上传文件 */
+    function submitFileForm() {
+        uploadRef.value?.submit();
+    }
+
     onMounted(() => {
         getList();
     });
diff --git a/script/sql/mysql/update.sql b/script/sql/mysql/update.sql
index b055636..bd7934e 100644
--- a/script/sql/mysql/update.sql
+++ b/script/sql/mysql/update.sql
@@ -72,3 +72,6 @@ insert into sys_menu values('130',  'EasyRetry控制台',  '2',   '6',  'easyret
 -- 增加ancestors字段
 ALTER TABLE `mf_product` ADD COLUMN `ancestors` VARCHAR(760) NULL DEFAULT '' COMMENT '祖级列表' AFTER `parent_id`;
 ALTER TABLE `demo_product` ADD COLUMN `ancestors` VARCHAR(760) NULL DEFAULT '' COMMENT '祖级列表' AFTER `parent_id`;
+
+--增加edit_columns字段
+ALTER TABLE `gen_table` ADD COLUMN `edit_columns` TINYINT NULL DEFAULT 1 AFTER `remark`;
diff --git a/script/sql/postgresql/update.sql b/script/sql/postgresql/update.sql
index b3e2c5c..b0febc8 100644
--- a/script/sql/postgresql/update.sql
+++ b/script/sql/postgresql/update.sql
@@ -133,3 +133,6 @@ insert into sys_menu values('130',  'EasyRetry控制台',  '2',   '6',  'easyret
 -- 增加ancestors字段
 ALTER TABLE "mf_product" ADD "ancestors" VARCHAR(760) NULL;
 COMMENT ON COLUMN "mf_product"."ancestors" IS '祖级列表';
+
+--增加edit_columns字段
+ALTER TABLE `gen_table` ADD COLUMN `edit_columns` TINYINT NULL DEFAULT 1 AFTER `remark`;