主子表格.vue 10 KB

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