index.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <template>
  2. <div class="app-container">
  3. <!-- 上层输入框 -->
  4. <DynamicForm :formItems="formItems" @query="queryTree" @reset="resetForm" />
  5. <!-- 上层按钮 -->
  6. <DynamicButtonGroup :buttons="buttons" />
  7. <!-- 中间渲染 -->
  8. <!-- -->
  9. <el-table v-loading="loading" :data="tableList" ref="tableRef" @selection-change="handleSelectionChange">
  10. <el-table-column type="selection" width="55" align="center" />
  11. <el-table-column label="树形表主键" align="center" prop="treeTablePrimaryKey" />
  12. <el-table-column label="树形表名" align="center" prop="treeTableName" />
  13. <el-table-column label="树形表格别名" align="center" prop="treeDesc" />
  14. <el-table-column label="树形递归列" align="center" prop="treeTableDgl" />
  15. <el-table-column label="树形条件" align="center" prop="treeTableCondition" />
  16. <el-table-column label="绑定表名称" align="center" prop="tableNameDes" />
  17. <el-table-column label="绑定表id" align="center" prop="tableId" />
  18. <!-- <el-table-column label="表格描述" align="center" prop="dtNotes" />
  19. <el-table-column label="时间格式" align="center" prop="timeFormat" /> -->
  20. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  21. <template slot-scope="scope">
  22. <el-dropdown>
  23. <el-button type="warning" plain size="small">
  24. 处理<i class="el-icon-arrow-down el-icon--right"></i>
  25. </el-button>
  26. <el-dropdown-menu slot="dropdown">
  27. <el-dropdown-item>
  28. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改
  29. </el-button>
  30. </el-dropdown-item>
  31. <el-dropdown-item>
  32. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除
  33. </el-button>
  34. </el-dropdown-item>
  35. </el-dropdown-menu>
  36. </el-dropdown>
  37. </template>
  38. </el-table-column>
  39. </el-table>
  40. <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  41. @pagination="getList" />
  42. </div>
  43. </template>
  44. <script>
  45. import DynamicForm from './components/DynamicForm.vue';
  46. import DynamicButtonGroup from './components/DynamicButtonGroup.vue';
  47. import { listTreeTable, removeTreeTable } from "@/api/treeTable/tableList";
  48. import { delMenu } from "@/api/system/menu";
  49. // import Treeselect from "@riophae/vue-treeselect";
  50. // import { delForm, addForm, updateForm, listForm } from "@/api/treeTable/form";
  51. // import { getMenuList, addMenu, getRouters } from "@/api/menu.js";
  52. // import {addGroup, listGroup, getTable, delGroup, updataGroup } from "@/api/relateTable/index.js";
  53. export default {
  54. name: "TreeTable",
  55. components: {
  56. DynamicForm,
  57. DynamicButtonGroup,
  58. },
  59. data() {
  60. return {
  61. // 总条数
  62. total: 0,
  63. //输入框配置
  64. formItems: [{
  65. label: '树形表名',
  66. prop: 'treeTableName',
  67. attrs: {
  68. placeholder: '请输入树形表名',
  69. clearable: true,
  70. },
  71. },{
  72. label: '表格别名',
  73. prop: 'treeDesc',
  74. attrs: {
  75. placeholder: '请输入树形表格别名',
  76. clearable: true,
  77. },
  78. }],
  79. // 非单个禁用
  80. single: true,
  81. // 非多个禁用
  82. multiple: true,
  83. //标记,2增加3修改4查看
  84. mode: 4,
  85. // 遮罩层
  86. loading: true,
  87. tableList: [],
  88. // 选中数组(包含所有数据)
  89. selection: [],
  90. // 多选框勾选数据
  91. tempSelection: [],
  92. // 查询参数
  93. queryParams: {
  94. treeTableName: '',
  95. pageNum: 1,
  96. pageSize: 10,
  97. },
  98. };
  99. },
  100. created() {
  101. this.getList();
  102. },
  103. beforeRouteEnter(to, from, next) {
  104. next(vm => {
  105. vm.getList(); // 当导航被确认后,调用 getList 方法
  106. });
  107. },
  108. computed: {
  109. buttons() {
  110. return [
  111. {
  112. label: '新增',
  113. type: 'primary',
  114. plain: true,
  115. icon: 'el-icon-plus',
  116. size: 'mini',
  117. click: this.handleAdd,
  118. },
  119. {
  120. label: '修改',
  121. type: 'success',
  122. plain: true,
  123. icon: 'el-icon-edit',
  124. size: 'mini',
  125. disabled: this.single,
  126. click: this.handleUpdate,
  127. },
  128. {
  129. label: '删除',
  130. type: 'danger',
  131. plain: true,
  132. icon: 'el-icon-delete',
  133. size: 'mini',
  134. disabled: this.multiple,
  135. click: this.handleBatchDelete,
  136. }
  137. ];
  138. }
  139. },
  140. methods: {
  141. getList() {
  142. this.loading = true;
  143. this.tempSelection = JSON.parse(JSON.stringify(this.selection));
  144. //
  145. listTreeTable(this.queryParams).then((response) => {
  146. console.log('response', response)
  147. // response.rows = response.rows.filter(
  148. // (item) => !this.tempSelection.find((val) => val.tId == item.tId)
  149. // );
  150. // this.tableList = [...this.tempSelection, ...response.rows];
  151. this.tableList = response.rows;
  152. this.total = response.total;
  153. this.loading = false;
  154. // if (this.tempSelection.length) {
  155. // this.$nextTick(() => {
  156. // this.tempSelection.forEach((item) => {
  157. // this.$refs.tableRef.toggleRowSelection(item);
  158. // });
  159. // });
  160. // }
  161. });
  162. },
  163. /* 输入框查询 */
  164. queryTree(queryParams) {
  165. this.queryParams = queryParams
  166. console.log('[输入框查询]', this.queryParams)
  167. this.getList()
  168. },
  169. /* 输入框重置 */
  170. resetForm() {
  171. console.log('输入框已重置');
  172. },
  173. // 选择多条
  174. handleSelectionChange(selection) {
  175. this.selection = selection;
  176. this.single = selection.length !== 1;
  177. this.multiple = !selection.length;
  178. },
  179. /* ---------按钮事件start---------*/
  180. // 新增
  181. handleAdd() {
  182. console.log('新增按钮被点击');
  183. this.mode = 2
  184. this.$router.push({
  185. path: "/system/fromModel/index/treeTableMange",
  186. query: {
  187. mode: this.mode // mode
  188. }
  189. });
  190. },
  191. // 修改
  192. handleUpdate(rowData) {
  193. let row;
  194. if (rowData instanceof PointerEvent || rowData instanceof Event) {
  195. row = this.selection[0]
  196. } else {
  197. row = rowData
  198. }
  199. if(row){
  200. this.mode = 3
  201. this.$router.push({
  202. path: "/system/fromModel/index/treeTableMange",
  203. query: {
  204. mode: this.mode, // mode
  205. editorId: row.id,
  206. editorTableId: Number(row.tableId),
  207. treeTableKey: row.treeTableKey,
  208. }
  209. });
  210. }
  211. },
  212. // 删除
  213. handleDelete(row) {
  214. console.log('删除按钮被点击', row.id, row);
  215. this.$modal
  216. .confirm(
  217. '是否确认删除编号为"' +
  218. row.id +
  219. '"的数据项?删除后菜单中相关数据也将删除!'
  220. )
  221. .then(async () => {
  222. let res = await delMenu(row.menuId);
  223. if (res.code == 200) {
  224. await removeTreeTable(row.id);
  225. } else {
  226. return Promise.reject(new Error('删除菜单失败'));
  227. }
  228. }
  229. ).then(() => {
  230. this.getList();
  231. this.$modal.msgSuccess("删除成功");
  232. })
  233. .catch((e) => {
  234. console.log(e);
  235. });
  236. },
  237. /* ---------按钮事件end---------*/
  238. // 删除多条
  239. handleBatchDelete() {
  240. if (this.selection.length === 0) {
  241. this.$message.warning('请先选择要删除的记录');
  242. return;
  243. }
  244. let str = this.selection.map(item => item.id).join(',');
  245. let strList = this.selection.map(item => item.id)
  246. let menuIds = this.tableList
  247. .filter(tableItem => this.selection.some(selectionItem => selectionItem.id === tableItem.id))
  248. .map(tableItem => tableItem.menuId);
  249. console.log('menuIds', menuIds)
  250. this.$modal
  251. .confirm(
  252. '是否确认删除编号为"' +
  253. str +
  254. '"的数据项?删除后菜单中相关数据也将删除!'
  255. )
  256. .then(async () => {
  257. let res = await delMenu(menuIds);
  258. if (res.code == 200) {
  259. for (let item of strList) { // 使用 for...of 循环
  260. try {
  261. await removeTreeTable(item);
  262. } catch (error) {
  263. console.error('删除过程中出现错误:', error);
  264. return Promise.reject(error); // 错误发生时抛出异常
  265. }
  266. }
  267. } else {
  268. return Promise.reject(new Error('删除菜单失败'));
  269. }
  270. }
  271. ).then(() => {
  272. this.getList();
  273. this.$modal.msgSuccess("删除成功");
  274. })
  275. .catch((e) => {
  276. console.log(e);
  277. });
  278. },
  279. },
  280. };
  281. </script>
  282. <style scoped>
  283. .tree_table_context {
  284. display: flex;
  285. height: 100%
  286. }
  287. .tree_table_left {
  288. flex: 35%;
  289. }
  290. .tree_table_right {
  291. flex: 65%;
  292. }
  293. </style>