index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { useMenu } from "./utils/hook";
  4. import { transformI18n } from "@/plugins/i18n";
  5. import { PureTableBar } from "@/components/RePureTableBar";
  6. import { useRenderIcon } from "@/components/ReIcon/src/hooks";
  7. import Delete from "~icons/ep/delete";
  8. import EditPen from "~icons/ep/edit-pen";
  9. import Refresh from "~icons/ep/refresh";
  10. import AddFill from "~icons/ri/add-circle-line";
  11. defineOptions({
  12. name: "SystemMenu"
  13. });
  14. const formRef = ref();
  15. const tableRef = ref();
  16. const {
  17. form,
  18. loading,
  19. columns,
  20. dataList,
  21. onSearch,
  22. resetForm,
  23. openDialog,
  24. handleDelete,
  25. handleSelectionChange
  26. } = useMenu();
  27. function onFullscreen() {
  28. // 重置表格高度
  29. tableRef.value.setAdaptive();
  30. }
  31. </script>
  32. <template>
  33. <div class="main">
  34. <el-form
  35. ref="formRef"
  36. :inline="true"
  37. :model="form"
  38. class="search-form bg-bg_color w-full pl-8 pt-[12px] overflow-auto"
  39. >
  40. <el-form-item label="菜单名称:" prop="title">
  41. <el-input
  42. v-model="form.title"
  43. placeholder="请输入菜单名称"
  44. clearable
  45. class="w-[180px]!"
  46. />
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button
  50. type="primary"
  51. :icon="useRenderIcon('ri/search-line')"
  52. :loading="loading"
  53. @click="onSearch"
  54. >
  55. 搜索
  56. </el-button>
  57. <el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)">
  58. 重置
  59. </el-button>
  60. </el-form-item>
  61. </el-form>
  62. <PureTableBar
  63. title="菜单管理(仅演示,操作后不生效)"
  64. :columns="columns"
  65. :isExpandAll="false"
  66. :tableRef="tableRef?.getTableRef()"
  67. @refresh="onSearch"
  68. @fullscreen="onFullscreen"
  69. >
  70. <template #buttons>
  71. <el-button
  72. type="primary"
  73. :icon="useRenderIcon(AddFill)"
  74. @click="openDialog()"
  75. >
  76. 新增菜单
  77. </el-button>
  78. </template>
  79. <template v-slot="{ size, dynamicColumns }">
  80. <pure-table
  81. ref="tableRef"
  82. adaptive
  83. :adaptiveConfig="{ offsetBottom: 45 }"
  84. align-whole="center"
  85. row-key="id"
  86. showOverflowTooltip
  87. table-layout="auto"
  88. :loading="loading"
  89. :size="size"
  90. :data="dataList"
  91. :columns="dynamicColumns"
  92. :header-cell-style="{
  93. background: 'var(--el-fill-color-light)',
  94. color: 'var(--el-text-color-primary)'
  95. }"
  96. @selection-change="handleSelectionChange"
  97. >
  98. <template #operation="{ row }">
  99. <el-button
  100. class="reset-margin"
  101. link
  102. type="primary"
  103. :size="size"
  104. :icon="useRenderIcon(EditPen)"
  105. @click="openDialog('修改', row)"
  106. >
  107. 修改
  108. </el-button>
  109. <el-button
  110. v-show="row.menuType !== 3"
  111. class="reset-margin"
  112. link
  113. type="primary"
  114. :size="size"
  115. :icon="useRenderIcon(AddFill)"
  116. @click="openDialog('新增', { parentId: row.id } as any)"
  117. >
  118. 新增
  119. </el-button>
  120. <el-popconfirm
  121. :title="`是否确认删除菜单名称为${transformI18n(row.title)}的这条数据${row?.children?.length > 0 ? '。注意下级菜单也会一并删除,请谨慎操作' : ''}`"
  122. @confirm="handleDelete(row)"
  123. >
  124. <template #reference>
  125. <el-button
  126. class="reset-margin"
  127. link
  128. type="primary"
  129. :size="size"
  130. :icon="useRenderIcon(Delete)"
  131. >
  132. 删除
  133. </el-button>
  134. </template>
  135. </el-popconfirm>
  136. </template>
  137. </pure-table>
  138. </template>
  139. </PureTableBar>
  140. </div>
  141. </template>
  142. <style lang="scss" scoped>
  143. :deep(.el-table__inner-wrapper::before) {
  144. height: 0;
  145. }
  146. .main-content {
  147. margin: 24px 24px 0 !important;
  148. }
  149. .search-form {
  150. :deep(.el-form-item) {
  151. margin-bottom: 12px;
  152. }
  153. }
  154. </style>