123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- <!--
- - Copyright (c) 2018-2025, lengleng All rights reserved.
- -
- - Redistribution and use in source and binary forms, with or without
- - modification, are permitted provided that the following conditions are met:
- -
- - Redistributions of source code must retain the above copyright notice,
- - this list of conditions and the following disclaimer.
- - Redistributions in binary form must reproduce the above copyright
- - notice, this list of conditions and the following disclaimer in the
- - documentation and/or other materials provided with the distribution.
- - Neither the name of the pig4cloud.com developer nor the names of its
- - contributors may be used to endorse or promote products derived from
- - this software without specific prior written permission.
- - Author: lengleng (wangiegie@gmail.com)
- -->
- <template>
- <div class="user">
- <basic-container>
- <el-row :span="24">
- <el-col
- :xs="24"
- :sm="24"
- :md="5"
- class="user__tree">
- <avue-tree
- :option="treeOption"
- :data="treeData"
- @node-click="nodeClick"/>
- </el-col>
- <el-col
- :xs="24"
- :sm="24"
- :md="19"
- class="user__main">
- <avue-crud
- ref="crud"
- :option="option"
- v-model="form"
- :page="page"
- :table-loading="listLoading"
- :before-open="handleOpenBefore"
- :data="list"
- @on-load="getList"
- @search-change="handleFilter"
- @refresh-change="handleRefreshChange"
- @row-update="update"
- @row-save="create">
- <template slot="menuLeft">
- <el-button
- v-if="sys_user_add"
- class="filter-item"
- type="primary"
- size="mini"
- icon="el-icon-edit"
- @click="handleCreate">添加
- </el-button>
- </template>
- <template
- slot="username"
- slot-scope="scope">
- <span>{{ scope.row.username }}</span>
- </template>
- <template
- slot="role"
- slot-scope="scope">
- <span
- v-for="(role,index) in scope.row.roleList"
- :key="index">
- <el-tag>{{ role.roleName }} </el-tag>
- </span>
- </template>
- <template
- slot="deptId"
- slot-scope="scope">
- {{ scope.row.deptName }}
- </template>
- <template
- slot="lockFlag"
- slot-scope="scope">
- <el-tag>{{ scope.label }}</el-tag>
- </template>
- <template
- slot="menu"
- slot-scope="scope">
- <el-button
- v-if="sys_user_edit"
- type="text"
- size="mini"
- icon="el-icon-edit"
- @click="handleUpdate(scope.row,scope.index)">编辑
- </el-button>
- <el-button
- v-if="sys_user_del"
- type="text"
- size="mini"
- icon="el-icon-delete"
- @click="deletes(scope.row,scope.index)">删除
- </el-button>
- </template>
- <template
- slot="deptIdForm"
- slot-scope="scope">
- <avue-input
- v-model="form.deptId"
- :node-click="getNodeData"
- :dic="treeDeptData"
- :props="defaultProps"
- type="tree"
- placeholder="请选择所属部门"/>
- </template>
- <template
- slot="roleForm"
- slot-scope="scope">
- <avue-select
- v-model="role"
- :dic="rolesOptions"
- :props="roleProps"
- multiple
- placeholder="请选择角色"/>
- </template>
- </avue-crud>
- </el-col>
- </el-row>
- </basic-container>
- </div>
- </template>
- <script>
- import {addObj, delObj, fetchList, putObj} from '@/api/admin/user'
- import {deptRoleList} from '@/api/admin/role'
- import {fetchTree} from '@/api/admin/dept'
- import {tableOption} from '@/const/crud/admin/user'
- import {mapGetters} from 'vuex'
- export default {
- name: 'SysUser',
- data() {
- return {
- searchForm: {},
- treeOption: {
- nodeKey: 'id',
- addBtn: false,
- menu: false,
- props: {
- label: 'name',
- value: 'id'
- }
- },
- treeData: [],
- option: tableOption,
- treeDeptData: [],
- checkedKeys: [],
- roleProps: {
- label: 'roleName',
- value: 'roleId'
- },
- defaultProps: {
- label: 'name',
- value: 'id'
- },
- page: {
- total: 0, // 总页数
- currentPage: 1, // 当前页数
- pageSize: 20, // 每页显示多少条,
- isAsc: false// 是否倒序
- },
- list: [],
- listLoading: true,
- role: [],
- form: {},
- rolesOptions: []
- }
- },
- computed: {
- ...mapGetters(['permissions'])
- },
- watch: {
- role() {
- this.form.role = this.role
- }
- },
- created() {
- this.sys_user_add = this.permissions['sys_user_add']
- this.sys_user_edit = this.permissions['sys_user_edit']
- this.sys_user_del = this.permissions['sys_user_del']
- this.init()
- },
- methods: {
- init() {
- fetchTree().then(response => {
- this.treeData = response.data.data
- })
- },
- nodeClick(data) {
- this.page.page = 1
- this.getList(this.page, {deptId: data.id})
- },
- getList(page, params) {
- this.listLoading = true
- fetchList(Object.assign({
- current: page.currentPage,
- size: page.pageSize
- }, params, this.searchForm)).then(response => {
- this.list = response.data.data.records
- this.page.total = response.data.data.total
- this.listLoading = false
- })
- },
- getNodeData() {
- deptRoleList().then(response => {
- this.rolesOptions = response.data.data
- })
- },
- handleDept() {
- fetchTree().then(response => {
- this.treeDeptData = response.data.data
- })
- },
- handleFilter(param) {
- this.searchForm = param
- this.getList(this.page, param)
- },
- handleRefreshChange() {
- this.getList(this.page)
- },
- handleCreate() {
- this.$refs.crud.rowAdd()
- },
- handleOpenBefore(show, type) {
- window.boxType = type
- this.handleDept()
- if (['edit', 'views'].includes(type)) {
- this.role = []
- for (var i = 0; i < this.form.roleList.length; i++) {
- this.role[i] = this.form.roleList[i].roleId
- }
- deptRoleList().then(response => {
- this.rolesOptions = response.data.data
- })
- } else if (type === 'add') {
- this.role = []
- }
- show()
- },
- handleUpdate(row, index) {
- console.log(row)
- this.$refs.crud.rowEdit(row, index)
- this.form.password = undefined
- },
- create(row, done, loading) {
- if (this.form.phone.indexOf('*') > 0) {
- this.form.phone = undefined
- }
- addObj(this.form).then(() => {
- this.getList(this.page)
- done()
- this.$notify({
- title: '成功',
- message: '创建成功',
- type: 'success',
- duration: 2000
- })
- }).catch(() => {
- loading()
- })
- },
- update(row, index, done, loading) {
- if (this.form.phone && this.form.phone.indexOf('*') > 0) {
- this.form.phone = undefined
- }
- putObj(this.form).then(() => {
- this.getList(this.page)
- done()
- this.$notify({
- title: '成功',
- message: '修改成功',
- type: 'success',
- duration: 2000
- })
- }).catch(() => {
- loading()
- })
- },
- deletes(row, index) {
- this.$confirm(
- '此操作将永久删除该用户(用户名:' + row.username + '), 是否继续?',
- '提示',
- {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }
- ).then(() => {
- delObj(row.userId)
- .then(() => {
- this.list.splice(index, 1)
- this.$notify({
- title: '成功',
- message: '删除成功',
- type: 'success',
- duration: 2000
- })
- })
- .cache(() => {
- this.$notify({
- title: '失败',
- message: '删除失败',
- type: 'error',
- duration: 2000
- })
- })
- })
- }
- }
- }
- </script>
- <style lang="scss">
- .user {
- height: 100%;
- &__tree {
- padding-top: 3px;
- padding-right: 20px;
- }
- &__main {
- .el-card__body {
- padding-top: 0;
- }
- }
- }
- </style>
|