主子表格.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <template>
  2. <div class="layout-padding">
  3. <div class="layout-padding-auto layout-padding-view">
  4. #if($queryList)
  5. <el-row v-show="showSearch">
  6. <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
  7. #foreach($field in $queryList)
  8. #if($field.queryFormType == 'select')
  9. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  10. <el-select v-model="state.queryForm.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">
  11. #if($field.fieldDict)
  12. <el-option
  13. :label="item.label"
  14. :value="item.value"
  15. v-for="(item, index) in ${field.fieldDict}"
  16. :key="index">
  17. </el-option>
  18. #else
  19. <el-option label="请选择">0</el-option>
  20. #end
  21. </el-select>
  22. </el-form-item>
  23. #elseif($field.queryFormType == 'date')
  24. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  25. <el-date-picker
  26. type="date"
  27. placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  28. v-model="state.queryForm.${field.attrName}">
  29. </el-date-picker>
  30. </el-form-item>
  31. #elseif($field.queryFormType == 'datetime')
  32. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  33. <el-date-picker
  34. type="datetime"
  35. placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  36. v-model="state.queryForm.${field.attrName}">
  37. </el-date-picker>
  38. </el-form-item>
  39. #elseif($field.formType == 'radio')
  40. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  41. <el-radio-group v-model="state.queryForm.${field.attrName}">
  42. #if($field.fieldDict)
  43. <el-radio
  44. :label="item.value"
  45. v-for="(item, index) in ${field.fieldDict}"
  46. border
  47. :key="index">
  48. {{ item.label }}
  49. </el-radio>
  50. #else
  51. <el-radio label="${field.fieldComment}" border>${field.fieldComment}</el-radio>
  52. #end
  53. </el-radio-group>
  54. </el-form-item>
  55. #else
  56. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">
  57. <el-input
  58. placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  59. v-model="state.queryForm.${field.attrName}"
  60. style="max-width: 180px"
  61. />
  62. </el-form-item>
  63. #end
  64. #end
  65. <el-form-item>
  66. <el-button icon="search" type="primary" @click="getDataList">
  67. 查询
  68. </el-button>
  69. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  70. </el-form-item>
  71. </el-form>
  72. </el-row>
  73. #end
  74. <el-row>
  75. <div class="mb8" style="width: 100%">
  76. <el-button
  77. icon="folder-add"
  78. type="primary"
  79. class="ml10"
  80. @click="formDialogRef.openDialog()"
  81. v-auth="'${moduleName}_${functionName}_add'">
  82. 新增
  83. </el-button>
  84. <el-button
  85. plain
  86. :disabled="multiple"
  87. icon="Delete"
  88. type="primary"
  89. v-auth="'${moduleName}_${functionName}_del'"
  90. @click="handleDelete(selectObjs)">
  91. 删除
  92. </el-button>
  93. <right-toolbar
  94. v-model:showSearch="showSearch"
  95. :export="'${moduleName}_${functionName}_export'"
  96. @exportExcel="exportExcel"
  97. class="ml10 mr20"
  98. style="float: right;"
  99. @queryTable="getDataList">
  100. </right-toolbar>
  101. </div>
  102. </el-row>
  103. <el-table
  104. :data="state.dataList"
  105. v-loading="state.loading"
  106. border
  107. :cell-style="tableStyle.cellStyle"
  108. :header-cell-style="tableStyle.headerCellStyle"
  109. @selection-change="selectionChangeHandle"
  110. @sort-change="sortChangeHandle">
  111. <el-table-column type="selection" width="40" align="center" />
  112. <el-table-column type="index" label="#" width="40" />
  113. #foreach($field in $gridList)
  114. #if($field.fieldDict)
  115. <el-table-column prop="${field.attrName}" label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" show-overflow-tooltip>
  116. <template #default="scope">
  117. <dict-tag :options="$field.fieldDict" :value="scope.row.${field.attrName}"></dict-tag>
  118. </template>
  119. </el-table-column>
  120. #else
  121. <el-table-column
  122. prop="${field.attrName}"
  123. label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"
  124. #if(${field.gridSort} == '1')
  125. sortable="custom"
  126. #end
  127. show-overflow-tooltip
  128. />
  129. #end
  130. #end
  131. <el-table-column label="操作" width="200">
  132. <template #default="scope">
  133. #if($ChildClassName)
  134. <el-button
  135. text
  136. type="primary"
  137. icon="view"
  138. v-auth="'${moduleName}_${functionName}_view'"
  139. @click="formDialogRef.openDialog(scope.row.${pk.attrName}, true)">
  140. 详情
  141. </el-button>
  142. #end
  143. <el-button
  144. icon="edit-pen"
  145. text
  146. type="primary"
  147. v-auth="'${moduleName}_${functionName}_edit'"
  148. @click="formDialogRef.openDialog(scope.row.${pk.attrName})">
  149. 编辑
  150. </el-button>
  151. <el-button
  152. icon="delete"
  153. text
  154. type="primary"
  155. v-auth="'${moduleName}_${functionName}_del'"
  156. @click="handleDelete([scope.row.${pk.attrName}])">
  157. 删除
  158. </el-button>
  159. </template>
  160. </el-table-column>
  161. </el-table>
  162. <pagination
  163. @size-change="sizeChangeHandle"
  164. @current-change="currentChangeHandle"
  165. v-bind="state.pagination"
  166. />
  167. </div>
  168. <!-- 编辑、新增 -->
  169. <form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
  170. </div>
  171. </template>
  172. <script setup lang="ts" name="system${ClassName}">
  173. import { BasicTableProps, useTable } from "/@/hooks/table";
  174. import { fetchList, delObjs } from "/@/api/${moduleName}/${functionName}";
  175. import { useMessage, useMessageBox } from "/@/hooks/message";
  176. import { useDict } from '/@/hooks/dict';
  177. // 引入组件
  178. const FormDialog = defineAsyncComponent(() => import('./form.vue'));
  179. // 定义查询字典
  180. #set($fieldDict=[])
  181. #foreach($field in $queryList)
  182. #if($field.fieldDict)
  183. #set($void=$fieldDict.add($field.fieldDict))
  184. #end
  185. #end
  186. #foreach($field in $gridList)
  187. #if($field.fieldDict)
  188. #set($void=$fieldDict.add($field.fieldDict))
  189. #end
  190. #end
  191. #if($fieldDict)
  192. const { $dict.format($fieldDict) } = useDict($dict.quotation($fieldDict));
  193. #end
  194. // 定义变量内容
  195. const formDialogRef = ref();
  196. // 搜索变量
  197. const queryRef = ref();
  198. const showSearch = ref(true);
  199. // 多选变量
  200. const selectObjs = ref([]) as any;
  201. const multiple = ref(true);
  202. const state: BasicTableProps = reactive<BasicTableProps>({
  203. queryForm: {},
  204. pageList: fetchList
  205. });
  206. // table hook
  207. const {
  208. getDataList,
  209. currentChangeHandle,
  210. sizeChangeHandle,
  211. sortChangeHandle,
  212. downBlobFile,
  213. tableStyle
  214. } = useTable(state);
  215. // 清空搜索条件
  216. const resetQuery = () => {
  217. // 清空搜索条件
  218. queryRef.value?.resetFields();
  219. // 清空多选
  220. selectObjs.value = [];
  221. getDataList();
  222. };
  223. // 导出excel
  224. const exportExcel = () => {
  225. downBlobFile('/${moduleName}/${functionName}/export', Object.assign(state.queryForm, { ids: selectObjs }), '${functionName}.xlsx');
  226. };
  227. // 多选事件
  228. const selectionChangeHandle = (objs: { $pk.attrName: string }[]) => {
  229. selectObjs.value = objs.map(({ $pk.attrName }) => $pk.attrName);
  230. multiple.value = !objs.length;
  231. };
  232. // 删除操作
  233. const handleDelete = async (ids: string[]) => {
  234. try {
  235. await useMessageBox().confirm('此操作将永久删除');
  236. } catch {
  237. return;
  238. }
  239. try {
  240. await delObjs(ids);
  241. getDataList();
  242. useMessage().success('删除成功');
  243. } catch (err: any) {
  244. useMessage().error(err.msg);
  245. }
  246. };
  247. </script>