index.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <div class="user-management-container">
  3. <el-row :gutter="20">
  4. <!--部门数据-->
  5. <el-col :span="4" :xs="24">
  6. <div class="head-container">
  7. <el-input
  8. v-model="deptName"
  9. clearable
  10. placeholder="请输入部门名称"
  11. prefix-icon="el-icon-search"
  12. size="small"
  13. style="margin-bottom: 20px"
  14. @keyup.enter.native="getTreeselect" />
  15. </div>
  16. <div class="head-container">
  17. <el-tree
  18. ref="tree"
  19. :data="deptOptions"
  20. default-expand-all
  21. :expand-on-click-node="false"
  22. :filter-node-method="filterNode"
  23. :props="defaultProps"
  24. @node-click="handleNodeClick" />
  25. </div>
  26. </el-col>
  27. <!--用户数据-->
  28. <el-col :span="20" :xs="24">
  29. <vab-query-form>
  30. <vab-query-form-left-panel :span="12">
  31. <el-button
  32. v-permissions="['system:user:add']"
  33. icon="el-icon-plus"
  34. type="primary"
  35. @click="handleEdit($event)">
  36. 添加
  37. </el-button>
  38. <el-button
  39. v-permissions="['system:user:delete']"
  40. icon="el-icon-delete"
  41. type="danger"
  42. @click="handleDelete($event)">
  43. 删除
  44. </el-button>
  45. </vab-query-form-left-panel>
  46. <vab-query-form-right-panel :span="12">
  47. <el-form :inline="true" :model="queryForm" @submit.native.prevent>
  48. <el-form-item>
  49. <el-input
  50. v-model.trim="queryForm.keyWords"
  51. clearable
  52. placeholder="请输入用户名"
  53. @keyup.enter.native="queryData" />
  54. </el-form-item>
  55. <el-form-item>
  56. <el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
  57. </el-form-item>
  58. </el-form>
  59. </vab-query-form-right-panel>
  60. </vab-query-form>
  61. <el-table v-loading="listLoading" :data="list" :height="height" @selection-change="setSelectRows">
  62. <el-table-column align="center" show-overflow-tooltip type="selection" />
  63. <!-- <el-table-column align="center" label="序号" width="55">
  64. <template #default="{ $index }">
  65. {{ $index + 1 }}
  66. </template>
  67. </el-table-column>-->
  68. <el-table-column v-permissions="['SysAdmin']" align="center" label="id" prop="id" width="60" />
  69. <el-table-column align="center" label="用户名" prop="userName" show-overflow-tooltip />
  70. <el-table-column align="center" label="昵称" prop="nickName" show-overflow-tooltip />
  71. <el-table-column align="center" label="手机号" prop="phone" show-overflow-tooltip />
  72. <el-table-column align="center" label="邮箱" prop="email" show-overflow-tooltip />
  73. <el-table-column align="center" label="部门" prop="deptName" show-overflow-tooltip />
  74. <!-- <el-table-column align="center" label="角色" show-overflow-tooltip>-->
  75. <!-- <template #default="{ row }">-->
  76. <!-- <el-tag v-for="(item, index) in row.roles" :key="index">-->
  77. <!-- {{ item }}-->
  78. <!-- </el-tag>-->
  79. <!-- </template>-->
  80. <!-- </el-table-column>-->
  81. <el-table-column align="center" label="创建时间" prop="createdTime">
  82. <template #default="scope">
  83. <span>{{ parseTime(scope.row.createdTime) }}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column align="center" label="账号状态" prop="status">
  87. <template #default="scope">
  88. <span>{{ selectDictLabel(statusOptions, scope.row.status) }}</span>
  89. </template>
  90. </el-table-column>
  91. <el-table-column align="center" label="操作" show-overflow-tooltip width="120">
  92. <template #default="{ row }">
  93. <el-button v-permissions="['system:user:resetPwd']" type="text" @click="handleResetPwd(row)">
  94. 重置
  95. </el-button>
  96. <el-button v-permissions="['system:user:edit']" type="text" @click="handleEdit(row)">编辑</el-button>
  97. <el-button v-permissions="['system:user:delete']" type="text" @click="handleDelete(row)">删除</el-button>
  98. </template>
  99. </el-table-column>
  100. <template #empty>
  101. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  102. </template>
  103. </el-table>
  104. <el-pagination
  105. background
  106. :current-page="queryForm.pageNum"
  107. :layout="layout"
  108. :page-size="queryForm.pageSize"
  109. :total="total"
  110. @current-change="handleCurrentChange"
  111. @size-change="handleSizeChange" />
  112. </el-col>
  113. </el-row>
  114. <edit ref="edit" @fetch-data="fetchData" />
  115. <rest-pwd ref="restPwd" @fetch-data="fetchData" />
  116. </div>
  117. </template>
  118. <script>
  119. import deptApi from '@/api/system/dept'
  120. import userApi from '@/api/system/user'
  121. import Edit from './components/UserEdit'
  122. import RestPwd from './components/RestPwd'
  123. export default {
  124. name: 'User',
  125. components: { Edit, RestPwd },
  126. data() {
  127. return {
  128. list: [],
  129. listLoading: true,
  130. layout: 'total, sizes, prev, pager, next, jumper',
  131. total: 0,
  132. selectRows: '',
  133. queryForm: {
  134. pageNum: 1,
  135. pageSize: 10,
  136. userName: '',
  137. },
  138. deptName: '',
  139. // 部门树选项
  140. deptOptions: undefined,
  141. defaultProps: {
  142. id: 'id',
  143. children: 'children',
  144. label: 'deptName',
  145. },
  146. // 状态数据字典
  147. statusOptions: [],
  148. }
  149. },
  150. computed: {
  151. height() {
  152. return this.$baseTableHeight(1)
  153. },
  154. },
  155. created() {
  156. this.fetchData()
  157. this.getTreeselect()
  158. this.getDicts('sys_normal_disable').then((response) => {
  159. this.statusOptions = response.data.values || []
  160. })
  161. },
  162. methods: {
  163. /** 查询部门下拉树结构 */
  164. async getTreeselect() {
  165. const { data: data } = await deptApi.getTree({
  166. deptName: this.deptName,
  167. })
  168. this.deptOptions = data
  169. },
  170. // 筛选节点
  171. filterNode(value, data) {
  172. if (!value) return true
  173. return data[this.defaultProps.label].indexOf(value) !== -1
  174. },
  175. // 节点单击事件
  176. handleNodeClick(data) {
  177. this.queryForm.deptId = data.id
  178. this.fetchData()
  179. },
  180. setSelectRows(val) {
  181. this.selectRows = val
  182. },
  183. handleResetPwd(row) {
  184. this.$refs['restPwd'].showEdit(row)
  185. },
  186. handleEdit(row) {
  187. if (row.id) {
  188. this.$refs['edit'].showEdit(row)
  189. } else {
  190. this.$refs['edit'].showEdit()
  191. }
  192. },
  193. handleDelete(row) {
  194. if (row.id) {
  195. this.$baseConfirm('你确定要删除当前项吗', null, async () => {
  196. const { msg } = await userApi.doDelete({ ids: [row.id] })
  197. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  198. await this.fetchData()
  199. })
  200. } else {
  201. if (this.selectRows.length > 0) {
  202. const ids = this.selectRows.map((item) => item.id).join()
  203. this.$baseConfirm('你确定要删除选中项吗', null, async () => {
  204. const { msg } = await userApi.doDelete({ ids })
  205. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  206. await this.fetchData()
  207. })
  208. } else {
  209. this.$baseMessage('未选中任何行', 'error', 'vab-hey-message-error')
  210. }
  211. }
  212. },
  213. handleSizeChange(val) {
  214. this.queryForm.pageSize = val
  215. this.fetchData()
  216. },
  217. handleCurrentChange(val) {
  218. this.queryForm.pageNum = val
  219. this.fetchData()
  220. },
  221. queryData() {
  222. this.queryForm.pageNum = 1
  223. this.fetchData()
  224. },
  225. async fetchData() {
  226. this.listLoading = true
  227. const {
  228. data: { list, total },
  229. } = await userApi.getList(this.queryForm)
  230. this.list = list
  231. this.total = total
  232. this.listLoading = false
  233. },
  234. },
  235. }
  236. </script>