主子表格 7.6 KB

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