ListViewTemplate.ftl 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <div class="list-view">
  3. <div class="filters-container">
  4. <el-input placeholder="输入关键字" v-model="search" clearable
  5. class="filter-item"></el-input>
  6. <el-button @click="getData" type="primary" icon="el-icon-search"
  7. class="filter-item">搜索
  8. </el-button>
  9. <el-button @click="addRow" type="primary" icon="el-icon-plus"
  10. class="filter-item">添加
  11. </el-button>
  12. <el-button @click="download" type="primary" icon="el-icon-download"
  13. :loading="downloading" class="filter-item">导出EXCEL
  14. </el-button>
  15. </div>
  16. <el-table :data="tableData" row-key="id" ref="table"
  17. header-row-class-name="table-header-row"
  18. header-cell-class-name="table-header-cell"
  19. row-class-name="table-row" cell-class-name="table-cell"
  20. :height="tableHeight">
  21. <el-table-column v-if="multipleMode" align="center" type="selection"
  22. width="50">
  23. </el-table-column>
  24. <el-table-column prop="id" label="ID" width="100">
  25. <template slot="header" slot-scope="{column}">
  26. <sortable-header :column="column" :current-sort="sort"
  27. @changeSort="changeSort">
  28. </sortable-header>
  29. </template>
  30. </el-table-column>
  31. <#list model.fields as field>
  32. <#if field.showInList>
  33. <el-table-column prop="${field.modelName!''}" label="${field.remark!field.modelName}"
  34. <#if field.formType == 'date' || field.formType == 'currentDate'>
  35. :formatter="dateFormatter"
  36. <#elseif field.formType == 'datetime' || field.formType == 'currentTime'>
  37. :formatter="datetimeFormatter"
  38. <#elseif field.formType == 'select' && field.apiFlag == '1'>
  39. :formatter="${field.modelName}Formatter"
  40. </#if>>
  41. <template slot="header" slot-scope="{column}">
  42. <sortable-header :column="column" :current-sort="sort" @changeSort="changeSort">
  43. </sortable-header>
  44. </template>
  45. <#if field.formType == 'singleImage'>
  46. <template slot-scope="{row}">
  47. <el-image style="width: 30px; height: 30px"
  48. :src="row.${field.modelName}" fit="cover"
  49. :preview-src-list="[row.${field.modelName}]"></el-image>
  50. </template>
  51. <#elseif field.formType == 'multiImage'>
  52. <template slot-scope="{row}">
  53. <el-image style="width: 30px; height: 30px"
  54. :src="row.${field.modelName}[0]" fit="cover"
  55. :preview-src-list="row.${field.modelName}"></el-image>
  56. </template>
  57. <#elseif field.formType == 'switch'>
  58. <template slot-scope="{row}">
  59. <el-tag :type="row.${field.modelName}?'':'info'">{{row.${field.modelName}}}</el-tag>
  60. </template>
  61. </#if>
  62. </el-table-column>
  63. </#if>
  64. </#list>
  65. <el-table-column
  66. label="操作"
  67. align="center"
  68. fixed="right"
  69. min-width="150">
  70. <template slot-scope="{row}">
  71. <#list model.subtables as subtable>
  72. <el-button @click="$router.push({path:'/${subtable.subCode}List',query:{column:row.${subtable.column}+',${subtable.subColumn}'}})" type="primary" size="small" plain>${subtable.name}
  73. </el-button>
  74. </#list>
  75. <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
  76. <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
  77. </template>
  78. </el-table-column>
  79. </el-table>
  80. <div class="pagination-wrapper">
  81. <div class="multiple-mode-wrapper">
  82. <el-button v-if="!multipleMode"
  83. @click="toggleMultipleMode(true)">批量编辑</el-button>
  84. <el-button-group v-else>
  85. <el-button @click="operation1">批量操作1</el-button>
  86. <el-button @click="operation2">批量操作2</el-button>
  87. <el-button @click="toggleMultipleMode(false)">取消</el-button>
  88. </el-button-group>
  89. </div>
  90. <el-pagination background @size-change="onSizeChange"
  91. @current-change="onCurrentChange" :current-page="page"
  92. :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
  93. layout="total, sizes, prev, pager, next, jumper"
  94. :total="totalElements">
  95. </el-pagination>
  96. </div>
  97. </div>
  98. </template>
  99. <script>
  100. import { mapState } from "vuex";
  101. import pageableTable from "@/mixins/pageableTable";
  102. export default {
  103. name: '${model.className}List',
  104. mixins: [pageableTable],
  105. created() {
  106. this.getData();
  107. },
  108. data() {
  109. return {
  110. multipleMode: false,
  111. search: "",
  112. url: "/${model.className?uncap_first}/all",
  113. downloading: false,
  114. <#list model.fields as field>
  115. <#if field.formType == 'select' && field.apiFlag == '1'>
  116. ${field.modelName}Options:${field.optionsValue},
  117. </#if>
  118. </#list>
  119. }
  120. },
  121. computed: {
  122. selection() {
  123. return this.$refs.table.selection.map(i => i.id);
  124. }
  125. },
  126. methods: {
  127. <#list model.fields as field>
  128. <#if field.formType == 'select' && field.apiFlag == '1'>
  129. ${field.modelName}Formatter(row, column, cellValue, index) {
  130. let selectedOption = this.${field.modelName}Options.find(i => i.value === cellValue);
  131. if (selectedOption) {
  132. return selectedOption.label;
  133. }
  134. return '';
  135. },
  136. </#if>
  137. </#list>
  138. beforeGetData() {
  139. if (this.search) {
  140. return { search: this.search };
  141. }
  142. },
  143. toggleMultipleMode(multipleMode) {
  144. this.multipleMode = multipleMode;
  145. if (!multipleMode) {
  146. this.$refs.table.clearSelection();
  147. }
  148. },
  149. addRow() {
  150. this.$router.push({
  151. path: "/${model.className?uncap_first}Edit",
  152. query: {
  153. ...this.$route.query
  154. }
  155. });
  156. },
  157. editRow(row) {
  158. this.$router.push({
  159. path: "/${model.className?uncap_first}Edit",
  160. query: {
  161. id: row.id
  162. }
  163. });
  164. },
  165. download() {
  166. this.downloading = true;
  167. this.$axios
  168. .get("/${model.className?uncap_first}/excel", {
  169. responseType: "blob",
  170. params: { size: 10000 }
  171. })
  172. .then(res => {
  173. console.log(res);
  174. this.downloading = false;
  175. const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
  176. const link = document.createElement("a");
  177. link.href = downloadUrl;
  178. link.setAttribute(
  179. "download",
  180. res.headers["content-disposition"].split("filename=")[1]
  181. );
  182. document.body.appendChild(link);
  183. link.click();
  184. link.remove();
  185. })
  186. .catch(e => {
  187. console.log(e);
  188. this.downloading = false;
  189. this.$message.error(e.error);
  190. });
  191. },
  192. operation1() {
  193. this.$notify({
  194. title: '提示',
  195. message: this.selection
  196. });
  197. },
  198. operation2() {
  199. this.$message('操作2');
  200. },
  201. deleteRow(row) {
  202. this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
  203. return this.$http.post(`/${model.className?uncap_first}/del/${r'${row.id}'}`)
  204. }).then(() => {
  205. this.$message.success('删除成功');
  206. this.getData();
  207. }).catch(action => {
  208. if (action === 'cancel') {
  209. this.$message.info('删除取消');
  210. } else {
  211. this.$message.error('删除失败');
  212. }
  213. })
  214. },
  215. }
  216. }
  217. </script>
  218. <style lang="less" scoped>
  219. </style>