index.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import tree from "./tree.vue";
  4. import { useUser } from "./utils/hook";
  5. import { PureTableBar } from "@/components/RePureTableBar";
  6. import { useRenderIcon } from "@/components/ReIcon/src/hooks";
  7. import Upload from "@iconify-icons/ri/upload-line";
  8. import Role from "@iconify-icons/ri/admin-line";
  9. import Password from "@iconify-icons/ri/lock-password-line";
  10. import More from "@iconify-icons/ep/more-filled";
  11. import Delete from "@iconify-icons/ep/delete";
  12. import EditPen from "@iconify-icons/ep/edit-pen";
  13. import Refresh from "@iconify-icons/ep/refresh";
  14. import AddFill from "@iconify-icons/ri/add-circle-line";
  15. defineOptions({
  16. name: "User"
  17. });
  18. const treeRef = ref();
  19. const formRef = ref();
  20. const tableRef = ref();
  21. const {
  22. form,
  23. loading,
  24. columns,
  25. dataList,
  26. treeData,
  27. treeLoading,
  28. selectedNum,
  29. pagination,
  30. buttonClass,
  31. onSearch,
  32. resetForm,
  33. onbatchDel,
  34. openDialog,
  35. onTreeSelect,
  36. handleUpdate,
  37. handleDelete,
  38. handleUpload,
  39. handleReset,
  40. handleRole,
  41. handleSizeChange,
  42. onSelectionCancel,
  43. handleCurrentChange,
  44. handleSelectionChange
  45. } = useUser(tableRef, treeRef);
  46. </script>
  47. <template>
  48. <div class="flex justify-between">
  49. <tree
  50. ref="treeRef"
  51. class="min-w-[200px] mr-2"
  52. :treeData="treeData"
  53. :treeLoading="treeLoading"
  54. @tree-select="onTreeSelect"
  55. />
  56. <div class="w-[calc(100%-200px)]">
  57. <el-form
  58. ref="formRef"
  59. :inline="true"
  60. :model="form"
  61. class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px]"
  62. >
  63. <el-form-item label="用户名称:" prop="username">
  64. <el-input
  65. v-model="form.username"
  66. placeholder="请输入用户名称"
  67. clearable
  68. class="!w-[160px]"
  69. />
  70. </el-form-item>
  71. <el-form-item label="手机号码:" prop="phone">
  72. <el-input
  73. v-model="form.phone"
  74. placeholder="请输入手机号码"
  75. clearable
  76. class="!w-[160px]"
  77. />
  78. </el-form-item>
  79. <el-form-item label="状态:" prop="status">
  80. <el-select
  81. v-model="form.status"
  82. placeholder="请选择"
  83. clearable
  84. class="!w-[160px]"
  85. >
  86. <el-option label="已开启" value="1" />
  87. <el-option label="已关闭" value="0" />
  88. </el-select>
  89. </el-form-item>
  90. <el-form-item>
  91. <el-button
  92. type="primary"
  93. :icon="useRenderIcon('search')"
  94. :loading="loading"
  95. @click="onSearch"
  96. >
  97. 搜索
  98. </el-button>
  99. <el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)">
  100. 重置
  101. </el-button>
  102. </el-form-item>
  103. </el-form>
  104. <PureTableBar
  105. title="用户管理(仅演示,操作后不生效)"
  106. :columns="columns"
  107. @refresh="onSearch"
  108. >
  109. <template #buttons>
  110. <el-button
  111. type="primary"
  112. :icon="useRenderIcon(AddFill)"
  113. @click="openDialog()"
  114. >
  115. 新增用户
  116. </el-button>
  117. </template>
  118. <template v-slot="{ size, dynamicColumns }">
  119. <div
  120. v-if="selectedNum > 0"
  121. v-motion-fade
  122. class="bg-[var(--el-fill-color-light)] w-full h-[46px] mb-2 pl-4 flex items-center"
  123. >
  124. <div class="flex-auto">
  125. <span
  126. style="font-size: var(--el-font-size-base)"
  127. class="text-[rgba(42,46,54,0.5)] dark:text-[rgba(220,220,242,0.5)]"
  128. >
  129. 已选 {{ selectedNum }} 项
  130. </span>
  131. <el-button type="primary" text @click="onSelectionCancel">
  132. 取消选择
  133. </el-button>
  134. </div>
  135. <el-popconfirm title="是否确认删除?" @confirm="onbatchDel">
  136. <template #reference>
  137. <el-button type="danger" text class="mr-1">
  138. 批量删除
  139. </el-button>
  140. </template>
  141. </el-popconfirm>
  142. </div>
  143. <pure-table
  144. ref="tableRef"
  145. row-key="id"
  146. adaptive
  147. align-whole="center"
  148. table-layout="auto"
  149. :loading="loading"
  150. :size="size"
  151. :data="dataList"
  152. :columns="dynamicColumns"
  153. :pagination="pagination"
  154. :paginationSmall="size === 'small' ? true : false"
  155. :header-cell-style="{
  156. background: 'var(--el-fill-color-light)',
  157. color: 'var(--el-text-color-primary)'
  158. }"
  159. @selection-change="handleSelectionChange"
  160. @page-size-change="handleSizeChange"
  161. @page-current-change="handleCurrentChange"
  162. >
  163. <template #operation="{ row }">
  164. <el-button
  165. class="reset-margin"
  166. link
  167. type="primary"
  168. :size="size"
  169. :icon="useRenderIcon(EditPen)"
  170. @click="openDialog('编辑', row)"
  171. >
  172. 修改
  173. </el-button>
  174. <el-popconfirm
  175. :title="`是否确认删除用户编号为${row.id}的这条数据`"
  176. @confirm="handleDelete(row)"
  177. >
  178. <template #reference>
  179. <el-button
  180. class="reset-margin"
  181. link
  182. type="primary"
  183. :size="size"
  184. :icon="useRenderIcon(Delete)"
  185. >
  186. 删除
  187. </el-button>
  188. </template>
  189. </el-popconfirm>
  190. <el-dropdown>
  191. <el-button
  192. class="ml-3 mt-[2px]"
  193. link
  194. type="primary"
  195. :size="size"
  196. :icon="useRenderIcon(More)"
  197. @click="handleUpdate(row)"
  198. />
  199. <template #dropdown>
  200. <el-dropdown-menu>
  201. <el-dropdown-item>
  202. <el-button
  203. :class="buttonClass"
  204. link
  205. type="primary"
  206. :size="size"
  207. :icon="useRenderIcon(Upload)"
  208. @click="handleUpload(row)"
  209. >
  210. 上传头像
  211. </el-button>
  212. </el-dropdown-item>
  213. <el-dropdown-item>
  214. <el-button
  215. :class="buttonClass"
  216. link
  217. type="primary"
  218. :size="size"
  219. :icon="useRenderIcon(Password)"
  220. @click="handleReset(row)"
  221. >
  222. 重置密码
  223. </el-button>
  224. </el-dropdown-item>
  225. <el-dropdown-item>
  226. <el-button
  227. :class="buttonClass"
  228. link
  229. type="primary"
  230. :size="size"
  231. :icon="useRenderIcon(Role)"
  232. @click="handleRole(row)"
  233. >
  234. 分配角色
  235. </el-button>
  236. </el-dropdown-item>
  237. </el-dropdown-menu>
  238. </template>
  239. </el-dropdown>
  240. </template>
  241. </pure-table>
  242. </template>
  243. </PureTableBar>
  244. </div>
  245. </div>
  246. </template>
  247. <style scoped lang="scss">
  248. :deep(.el-dropdown-menu__item i) {
  249. margin: 0;
  250. }
  251. :deep(.el-button:focus-visible) {
  252. outline: none;
  253. }
  254. .search-form {
  255. :deep(.el-form-item) {
  256. margin-bottom: 12px;
  257. }
  258. }
  259. </style>