表格.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <template>
  2. <div class="layout-padding">
  3. <div class="layout-padding-auto layout-padding-view">
  4. #if($queryList)
  5. <!-- 查询表单区域 -->
  6. <el-row v-show="showSearch">
  7. <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
  8. #foreach($field in $queryList)
  9. #if($field.queryFormType == 'select')
  10. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  11. <el-select v-model="state.queryForm.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">
  12. #if($field.fieldDict)
  13. <el-option
  14. :label="item.label"
  15. :value="item.value"
  16. v-for="(item, index) in ${field.fieldDict}"
  17. :key="index"
  18. />
  19. #else
  20. <el-option label="请选择" value="0" />
  21. #end
  22. </el-select>
  23. </el-form-item>
  24. #elseif($field.queryFormType == 'date')
  25. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  26. <el-date-picker
  27. type="date"
  28. placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  29. v-model="state.queryForm.${field.attrName}"
  30. />
  31. </el-form-item>
  32. #elseif($field.queryFormType == 'datetime')
  33. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  34. <el-date-picker
  35. type="datetime"
  36. placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  37. v-model="state.queryForm.${field.attrName}"
  38. />
  39. </el-form-item>
  40. #elseif($field.formType == 'radio')
  41. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  42. <el-radio-group v-model="state.queryForm.${field.attrName}">
  43. #if($field.fieldDict)
  44. <el-radio
  45. :label="item.value"
  46. v-for="(item, index) in ${field.fieldDict}"
  47. border
  48. :key="index"
  49. >
  50. {{ item.label }}
  51. </el-radio>
  52. #else
  53. <el-radio label="${field.fieldComment}" border>
  54. ${field.fieldComment}
  55. </el-radio>
  56. #end
  57. </el-radio-group>
  58. </el-form-item>
  59. #else
  60. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  61. <el-input
  62. placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  63. v-model="state.queryForm.${field.attrName}"
  64. />
  65. </el-form-item>
  66. #end
  67. #end
  68. <el-form-item>
  69. <el-button icon="search" type="primary" @click="getDataList">
  70. 查询
  71. </el-button>
  72. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  73. </el-form-item>
  74. </el-form>
  75. </el-row>
  76. #end
  77. <!-- 操作按钮区域 -->
  78. <el-row>
  79. <div class="mb8" style="width: 100%">
  80. <el-button
  81. icon="folder-add"
  82. type="primary"
  83. class="ml10"
  84. @click="formDialogRef.openDialog()"
  85. v-auth="'${moduleName}_${functionName}_add'"
  86. >
  87. 新增
  88. </el-button>
  89. <el-button
  90. plain
  91. icon="upload-filled"
  92. type="primary"
  93. class="ml10"
  94. @click="excelUploadRef.show()"
  95. v-auth="'${moduleName}_${functionName}_add'"
  96. >
  97. 导入
  98. </el-button>
  99. <el-button
  100. plain
  101. :disabled="multiple"
  102. icon="Delete"
  103. type="primary"
  104. v-auth="'${moduleName}_${functionName}_del'"
  105. @click="handleDelete(selectObjs)"
  106. >
  107. 删除
  108. </el-button>
  109. <right-toolbar
  110. v-model:showSearch="showSearch"
  111. :export="'${moduleName}_${functionName}_export'"
  112. @exportExcel="exportExcel"
  113. class="ml10 mr20"
  114. style="float: right;"
  115. @queryTable="getDataList"
  116. />
  117. </div>
  118. </el-row>
  119. <!-- 数据表格区域 -->
  120. <el-table
  121. :data="state.dataList"
  122. v-loading="state.loading"
  123. border
  124. :cell-style="tableStyle.cellStyle"
  125. :header-cell-style="tableStyle.headerCellStyle"
  126. @selection-change="selectionChangHandle"
  127. @sort-change="sortChangeHandle"
  128. >
  129. <el-table-column type="selection" width="40" align="center" />
  130. <el-table-column type="index" label="#" width="40" />
  131. #foreach($field in $gridList)
  132. #if($field.fieldDict)
  133. <el-table-column prop="${field.attrName}" label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" show-overflow-tooltip>
  134. <template #default="scope">
  135. <dict-tag :options="$field.fieldDict" :value="scope.row.${field.attrName}" />
  136. </template>
  137. </el-table-column>
  138. #else
  139. <el-table-column
  140. prop="${field.attrName}"
  141. label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  142. #if(${field.gridSort} == '1')
  143. sortable="custom"
  144. #end
  145. show-overflow-tooltip
  146. />
  147. #end
  148. #end
  149. <el-table-column label="操作" width="150">
  150. <template #default="scope">
  151. <el-button
  152. icon="edit-pen"
  153. text
  154. type="primary"
  155. v-auth="'${moduleName}_${functionName}_edit'"
  156. @click="formDialogRef.openDialog(scope.row.${pk.attrName})"
  157. >
  158. 编辑
  159. </el-button>
  160. <el-button
  161. icon="delete"
  162. text
  163. type="primary"
  164. v-auth="'${moduleName}_${functionName}_del'"
  165. @click="handleDelete([scope.row.${pk.attrName}])"
  166. >
  167. 删除
  168. </el-button>
  169. </template>
  170. </el-table-column>
  171. </el-table>
  172. <!-- 分页组件 -->
  173. <pagination
  174. @size-change="sizeChangeHandle"
  175. @current-change="currentChangeHandle"
  176. v-bind="state.pagination"
  177. />
  178. </div>
  179. <!-- 编辑、新增弹窗 -->
  180. <form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
  181. <!-- 导入excel弹窗 (需要在 upms-biz/resources/file 下维护模板) -->
  182. <upload-excel
  183. ref="excelUploadRef"
  184. title="导入"
  185. url="/${moduleName}/${functionName}/import"
  186. temp-url="/admin/sys-file/local/file/${functionName}.xlsx"
  187. @refreshDataList="getDataList"
  188. />
  189. </div>
  190. </template>
  191. <script setup lang="ts" name="system${ClassName}">
  192. // ========== 导入声明 ==========
  193. import { BasicTableProps, useTable } from "/@/hooks/table";
  194. import { fetchList, delObjs } from "/@/api/${moduleName}/${functionName}";
  195. import { useMessage, useMessageBox } from "/@/hooks/message";
  196. import { useDict } from '/@/hooks/dict';
  197. // ========== 组件声明 ==========
  198. // 异步加载表单弹窗组件
  199. const FormDialog = defineAsyncComponent(() => import('./form.vue'));
  200. // ========== 字典数据 ==========
  201. #set($fieldDict=[])
  202. #foreach($field in $queryList)
  203. #if($field.fieldDict)
  204. #set($void=$fieldDict.add($field.fieldDict))
  205. #end
  206. #end
  207. #foreach($field in $gridList)
  208. #if($field.fieldDict)
  209. #set($void=$fieldDict.add($field.fieldDict))
  210. #end
  211. #end
  212. #if($fieldDict)
  213. // 加载字典数据
  214. const { $dict.format($fieldDict) } = useDict($dict.quotation($fieldDict));
  215. #end
  216. // ========== 组件引用 ==========
  217. const formDialogRef = ref(); // 表单弹窗引用
  218. const excelUploadRef = ref(); // Excel上传弹窗引用
  219. const queryRef = ref(); // 查询表单引用
  220. // ========== 响应式数据 ==========
  221. const showSearch = ref(true); // 是否显示搜索区域
  222. const selectObjs = ref([]) as any; // 表格多选数据
  223. const multiple = ref(true); // 是否多选
  224. // ========== 表格状态 ==========
  225. const state: BasicTableProps = reactive<BasicTableProps>({
  226. queryForm: {}, // 查询参数
  227. pageList: fetchList // 分页查询方法
  228. });
  229. // ========== Hook引用 ==========
  230. // 表格相关Hook
  231. const {
  232. getDataList,
  233. currentChangeHandle,
  234. sizeChangeHandle,
  235. sortChangeHandle,
  236. downBlobFile,
  237. tableStyle
  238. } = useTable(state);
  239. // ========== 方法定义 ==========
  240. /**
  241. * 重置查询条件
  242. */
  243. const resetQuery = () => {
  244. // 清空搜索条件
  245. queryRef.value?.resetFields();
  246. // 清空多选
  247. selectObjs.value = [];
  248. // 重新查询
  249. getDataList();
  250. };
  251. /**
  252. * 导出Excel文件
  253. */
  254. const exportExcel = () => {
  255. downBlobFile(
  256. '/${moduleName}/${functionName}/export',
  257. Object.assign(state.queryForm, { ids: selectObjs }),
  258. '${functionName}.xlsx'
  259. );
  260. };
  261. /**
  262. * 表格多选事件处理
  263. * @param objs 选中的数据行
  264. */
  265. const selectionChangHandle = (objs: { $pk.attrName: string }[]) => {
  266. selectObjs.value = objs.map(({ $pk.attrName }) => $pk.attrName);
  267. multiple.value = !objs.length;
  268. };
  269. /**
  270. * 删除数据处理
  271. * @param ids 要删除的数据ID数组
  272. */
  273. const handleDelete = async (ids: string[]) => {
  274. try {
  275. await useMessageBox().confirm('此操作将永久删除');
  276. } catch {
  277. return;
  278. }
  279. try {
  280. await delObjs(ids);
  281. getDataList();
  282. useMessage().success('删除成功');
  283. } catch (err: any) {
  284. useMessage().error(err.msg);
  285. }
  286. };
  287. </script>