index.vue.vm 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <template>
  2. <div class="p-2 auto-overflow-y">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="search">
  5. <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px" class="-mb-15px">
  6. #set($queryColumns=0)
  7. #foreach($column in $columns)
  8. #if($column.query)
  9. #set($dictType=$column.dictType)
  10. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  11. #set($parentheseIndex=$column.columnComment.indexOf("("))
  12. #if($parentheseIndex != -1)
  13. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  14. #else
  15. #set($comment=$column.columnComment)
  16. #end
  17. #if($column.htmlType == "input" || $column.htmlType == "textarea")
  18. <el-form-item label="${comment}" prop="${column.javaField}">
  19. <el-input v-model="queryParams.${column.javaField}" placeholder="请输入${comment}" clearable style="width: 240px" @keyup.enter="handleQuery" />
  20. </el-form-item>
  21. #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
  22. <el-form-item label="${comment}" prop="${column.javaField}">
  23. <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
  24. <el-option v-for="dict in ${dictType}" :key="dict.value" :label="dict.label" :value="dict.value" />
  25. </el-select>
  26. </el-form-item>
  27. #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
  28. <el-form-item label="${comment}" prop="${column.javaField}">
  29. <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
  30. <el-option label="请选择字典生成" value="" />
  31. </el-select>
  32. </el-form-item>
  33. #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
  34. <el-form-item label="${comment}" prop="${column.javaField}">
  35. <el-date-picker
  36. v-model="queryParams.${column.javaField}"
  37. clearable
  38. type="date"
  39. value-format="YYYY-MM-DD"
  40. placeholder="请选择${comment}"
  41. />
  42. </el-form-item>
  43. #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  44. <el-form-item label="${comment}" style="width: 308px">
  45. <el-date-picker
  46. v-model="dateRange${AttrName}"
  47. value-format="YYYY-MM-DD HH:mm:ss"
  48. type="daterange"
  49. range-separator="-"
  50. start-placeholder="开始日期"
  51. end-placeholder="结束日期"
  52. :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
  53. />
  54. </el-form-item>
  55. #end
  56. #end
  57. #end
  58. <el-form-item>
  59. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  60. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  61. </el-form-item>
  62. </el-form>
  63. </div>
  64. </transition>
  65. <el-card shadow="never">
  66. <template #header>
  67. <el-row :gutter="10" class="mb8">
  68. <el-col :span="1.5">
  69. <el-button v-hasPermi="['${moduleName}:${businessName}:add']" type="primary" plain icon="Plus" @click="openForm('create')">新增</el-button>
  70. </el-col>
  71. <el-col :span="1.5">
  72. <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="openForm('update')">修改</el-button>
  73. </el-col>
  74. <el-col :span="1.5">
  75. <el-button v-hasPermi="['${moduleName}:${businessName}:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">删除</el-button>
  76. </el-col>
  77. <el-col :span="1.5">
  78. <el-button v-hasPermi="['${moduleName}:${businessName}:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
  79. </el-col>
  80. <right-toolbar v-model:showSearch="showSearch" :columns="columns" @query-table="getList"></right-toolbar>
  81. </el-row>
  82. </template>
  83. <el-table v-loading="loading" :data="${businessName}List" max-height="#if($queryColumns > 3)400#else 500#end" @selection-change="handleSelectionChange">
  84. <el-table-column type="selection" width="55" align="center" />
  85. #set($aIndex = 0)
  86. #foreach($column in $columns)
  87. #set($javaField=$column.javaField)
  88. #set($parentheseIndex=$column.columnComment.indexOf("("))
  89. #if($parentheseIndex != -1)
  90. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  91. #else
  92. #set($comment=$column.columnComment)
  93. #end
  94. #if($column.pk)
  95. <el-table-column v-if="${column.list}" label="${comment}" align="center" prop="${javaField}" />
  96. #set($aIndex = $aIndex + 1)
  97. #elseif($column.list && $column.htmlType == "datetime")
  98. <el-table-column v-if="columns[$aIndex].visible" label="${comment}" align="center" prop="${javaField}" width="180">
  99. <template #default="scope">
  100. <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
  101. </template>
  102. </el-table-column>
  103. #set($aIndex = $aIndex + 1)
  104. #elseif($column.list && $column.htmlType == "imageUpload")
  105. <el-table-column v-if="columns[$aIndex].visible" label="${comment}" align="center" prop="${javaField}" width="100">
  106. <template #default="scope">
  107. <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
  108. </template>
  109. </el-table-column>
  110. #set($aIndex = $aIndex + 1)
  111. #elseif($column.list && $column.dictType && "" != $column.dictType)
  112. <el-table-column v-if="columns[$aIndex].visible" label="${comment}" align="center" prop="${javaField}">
  113. <template #default="scope">
  114. #if($column.htmlType == "checkbox")
  115. <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
  116. #else
  117. <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
  118. #end
  119. </template>
  120. </el-table-column>
  121. #set($aIndex = $aIndex + 1)
  122. #elseif($column.list && "" != $javaField)
  123. <el-table-column v-if="columns[$aIndex].visible" label="${comment}" align="center" prop="${javaField}" />
  124. #set($aIndex = $aIndex + 1)
  125. #end
  126. #end
  127. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  128. <template #default="scope">
  129. <el-tooltip content="修改" placement="top">
  130. <el-button v-hasPermi="['${moduleName}:${businessName}:edit']" link type="primary" icon="Edit" @click="openForm('update',scope.row)"></el-button>
  131. </el-tooltip>
  132. <el-tooltip content="删除" placement="top">
  133. <el-button v-hasPermi="['${moduleName}:${businessName}:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
  134. </el-tooltip>
  135. </template>
  136. </el-table-column>
  137. </el-table>
  138. <!-- 翻页组件 -->
  139. <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
  140. </el-card>
  141. <!-- 添加或修改${functionName}对话框 -->
  142. <detail-form ref="detailFormRef" apped-to-body @success="getList" />
  143. </div>
  144. </template>
  145. <script setup name="${BusinessName}" lang="ts">
  146. /** 模块导入 */
  147. #if(${webPrefix} != '')
  148. import { list${BusinessName}, del${BusinessName} } from '@/api/${webPrefix}/${moduleName}/${businessName}';
  149. import { ${BusinessName}VO } from '@/api/${webPrefix}/${moduleName}/${businessName}/types';
  150. #else
  151. import { list${BusinessName}, del${BusinessName} } from '@/api/${moduleName}/${businessName}';
  152. import { ${BusinessName}VO } from '@/api/${moduleName}/${businessName}/types';
  153. #end
  154. import DetailForm from './DetailForm.vue';
  155. defineOptions({ name: '${BusinessName}' });
  156. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  157. #if(${dicts} != '')
  158. /** 当前页面引用的数据字典 */
  159. #set($dictsNoSymbol=$dicts.replace("'", ""))
  160. const { ${dictsNoSymbol} } = toRefs<any>(proxy?.useDict(${dicts}));
  161. #end
  162. // 是否加载遮罩层
  163. const loading = ref(true);
  164. // 是否显示查询项
  165. const showSearch = ref(true);
  166. const ${businessName}List = ref<${BusinessName}VO[]>([]);
  167. // 列表选中的记录Id
  168. const ids = ref<Array<number | string>>([]);
  169. // 单选
  170. const single = ref(true);
  171. // 多选
  172. const multiple = ref(true);
  173. // 总记录数
  174. const total = ref(0);
  175. #foreach ($column in $columns)
  176. #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  177. // 日期范围
  178. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  179. const dateRange${AttrName} = ref<[DateModelType, DateModelType]>(['', '']);
  180. #end
  181. #end
  182. // 查询窗体Ref
  183. const queryFormRef = ref<ElFormInstance>();
  184. const columns = ref<FieldOption[]>([
  185. #set($arrayIndex = 0)
  186. #foreach ($column in $columns)
  187. #if($column.isList == "1")
  188. #set($parentheseIndex=$column.columnComment.indexOf("("))
  189. #if($parentheseIndex != -1)
  190. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  191. #else
  192. #set($comment=$column.columnComment)
  193. #end
  194. ##数组下标$foreach.index
  195. { key: $arrayIndex, label: `$comment`, visible: true, children: [] },
  196. #set($arrayIndex = $arrayIndex + 1)
  197. #end
  198. #end
  199. ]);
  200. // 查询参数
  201. const queryParams = reactive({
  202. pageNum: 1,
  203. pageSize: 10,
  204. #foreach ($column in $columns)
  205. #if($column.query)
  206. #if($column.htmlType == "checkbox")
  207. $column.javaField: [],
  208. #elseif($column.javaType == "String")
  209. $column.javaField: '',
  210. #elseif($column.javaType == "Integer" || $column.javaType == "Long")
  211. $column.javaField: undefined,
  212. #else
  213. $column.javaField: undefined,
  214. #end
  215. #end
  216. #end
  217. params: {}
  218. });
  219. /** 查询${functionName}列表 */
  220. const getList = async () => {
  221. loading.value = true;
  222. #foreach ($column in $columns)
  223. #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  224. queryParams.value.params = {};
  225. #break
  226. #end
  227. #end
  228. #foreach ($column in $columns)
  229. #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  230. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  231. proxy?.addDateRange(queryParams.value, dateRange${AttrName}.value, '${AttrName}');
  232. #end
  233. #end
  234. const res = await list${BusinessName}(queryParams);
  235. ${businessName}List.value = res.rows;
  236. total.value = res.total;
  237. loading.value = false;
  238. };
  239. /** 搜索按钮操作 */
  240. const handleQuery = () => {
  241. queryParams.pageNum = 1;
  242. getList();
  243. };
  244. /** 重置按钮操作 */
  245. const resetQuery = () => {
  246. #foreach ($column in $columns)
  247. #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  248. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  249. dateRange${AttrName}.value = ['', ''];
  250. #end
  251. #end
  252. queryFormRef.value?.resetFields();
  253. handleQuery();
  254. };
  255. /** 多选框选中数据 */
  256. const handleSelectionChange = (selection: ${BusinessName}VO[]) => {
  257. ids.value = selection.map((item) => item.${pkColumn.javaField});
  258. single.value = selection.length != 1;
  259. multiple.value = !selection.length;
  260. };
  261. /** 删除按钮操作 */
  262. const handleDelete = async (row?: ${BusinessName}VO) => {
  263. const _${pkColumn.javaField}s = row?.${pkColumn.javaField} || ids.value;
  264. await proxy?.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').finally(() => (loading.value = false));
  265. await del${BusinessName}(_${pkColumn.javaField}s);
  266. await getList();
  267. proxy?.#[[$modal]]#.msgSuccess('删除成功');
  268. };
  269. /** 导出按钮操作 */
  270. const handleExport = () => {
  271. proxy?.download(
  272. '${apiPrefix}/${moduleName}/${businessName}/export',
  273. {
  274. ...queryParams
  275. },
  276. `${businessName}_#[[${new Date().getTime()}]]#.xlsx`);
  277. };
  278. /** 弹出框(增加、修改) */
  279. const detailFormRef = ref();
  280. const openForm = (type: string, row?: ${BusinessName}VO) => {
  281. const id = row?.${pkColumn.javaField} || ids.value[0];
  282. detailFormRef?.value.open(type, id);
  283. };
  284. onMounted(() => {
  285. getList();
  286. });
  287. </script>