index.vue 8.46 KB
<template>
	<div class="NCC-common-layout">
		<!-- <div class="NCC-common-layout-left">
      <div class="NCC-common-title">
        <h2>{{$t('common.organization')}}</h2>
        <span class="options">
          <el-tooltip content="组织架构图" placement="top">
            <el-link icon="el-icon-menu" :underline="false" @click="showDiagram" />
          </el-tooltip>
        </span>
      </div>
      <el-scrollbar class="NCC-common-el-tree-scrollbar">
        <el-tree ref="treeBox" v-loading="treeLoading" :data="treeData"
          :element-loading-text="$t('common.loadingText')" :props="defaultProps" default-expand-all
          highlight-current :expand-on-click-node="false" node-key="id"
          @node-click="handleNodeClick" class="NCC-common-el-tree">
          <span class="custom-tree-node" slot-scope="{ data, node }">
            <i :class="data.icon" />
            <span class="text">{{node.label}}</span>
          </span>
        </el-tree>
      </el-scrollbar>
    </div> -->
		<div class="NCC-common-layout-center NCC-flex-main">
			<el-row class="NCC-common-search-box" :gutter="16">
				<el-form @submit.native.prevent>
					<el-col :span="6">
						<el-form-item :label="$t('common.keyWord')">
							<el-input v-model="params.keyword" :placeholder="$t('common.enterKeyword')" clearable />
						</el-form-item>
					</el-col>
					<el-col :span="6">
						<el-form-item>
							<el-button type="primary" icon="el-icon-search" @click="search()">
								{{$t('common.search')}}
							</el-button>
							<el-button icon="el-icon-refresh-right" @click="reset()">{{$t('common.reset')}}
							</el-button>
						</el-form-item>
					</el-col>
				</el-form>
			</el-row>
			<div class="NCC-common-layout-main NCC-flex-main">
				<div class="NCC-common-head">
					<topOpts @add="handleAddEdit()"></topOpts>
					<div class="NCC-common-head-right">
						<el-tooltip effect="dark" :content="$t('common.refresh')" placement="top">
							<el-link icon="icon-ym icon-ym-Refresh NCC-common-head-icon" :underline="false"
								@click="reset()" />
						</el-tooltip>
						<screenfull />
					</div>
				</div>
				<NCC-table v-loading="listLoading" :data="tableData">
					<el-table-column prop="account" label="账号" width="100" />
					<el-table-column prop="realName" label="姓名" width="100" />
					<el-table-column label="性别" width="90" align="center">
						<template slot-scope="scope" sortable>
							<span>{{ scope.row.gender ==1 ? '男': ( scope.row.gender == 2 ? '女' : '保密') }}</span>
						</template>
					</el-table-column>
					<el-table-column prop="mobilePhone" label="手机" />
					<el-table-column prop="email" label="邮箱" />
					<el-table-column prop="description" label="备注" />
					<el-table-column prop="postalAddress" label="通讯地址">
						<template slot-scope="scope">
							<div style="width:100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis">
								{{scope.row.postalAddress}}</div>
						</template>
					</el-table-column>
					<el-table-column prop="school" label="学校名称">
						<template slot-scope="scope">
							<div style="width:100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis">
								{{scope.row.school}}</div>
						</template>
					</el-table-column>
					<el-table-column prop="schoolNumber" label="学号">
						<template slot-scope="scope">
							<div style="width:100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis">
								{{scope.row.schoolNumber}}</div>
						</template>
					</el-table-column>
					<el-table-column prop="creatorTime" label="创建时间" :formatter="ncc.tableDateFormat" width="120" />
					<el-table-column prop="sortCode" label="排序" width="70" align="center" />
					<el-table-column label="状态" width="70" align="center">
						<template slot-scope="scope">
							<el-tag :type="scope.row.enabledMark == 1 ? 'success' : 'danger'" disable-transitions>
								{{scope.row.enabledMark==1?'正常':'停用'}}
							</el-tag>
						</template>
					</el-table-column>
					<el-table-column label="操作" width="150">
						<template slot-scope="scope" v-if="!scope.row.isAdministrator">
							<tableOpts @edit="handleAddEdit(scope.row.id)" @del="handleDel(scope.row.id)">
								<el-dropdown hide-on-click>
									<span class="el-dropdown-link">
										<el-button size="mini" type="text">
											{{$t('common.moreBtn')}}<i class="el-icon-arrow-down el-icon--right"></i>
										</el-button>
									</span>
									<el-dropdown-menu slot="dropdown">
										<el-dropdown-item
											@click.native="handleResetPwd(scope.row.id, scope.row.account)">
											{{$t('user.resetPassword')}}
										</el-dropdown-item>
									</el-dropdown-menu>
								</el-dropdown>
							</tableOpts>
						</template>
					</el-table-column>
				</NCC-table>
				<pagination :total="total" :page.sync="params.currentPage" :limit.sync="params.pageSize"
					@pagination="initData" />
			</div>
		</div>
		<Form v-show="formVisible" ref="Form" @close="removeForm" />
		<Diagram v-if="diagramVisible" ref="Diagram" @close="diagramVisible = false" />
		<ResetPwdForm v-if="resetFormVisible" ref="ResetPwdForm" @refreshDataList="initData" />
	</div>
</template>
<script>
	import {
		getDepartmentSelector
	} from '@/api/permission/department'
	import request from '@/utils/request'
	import {
		getUserList,
		updateUserState,
		delUser
	} from '@/api/permission/user'
	import Form from './Form'
	import Diagram from './Diagram'
	import ResetPwdForm from './ResetPassword'

	export default {
		name: 'permission-user',
		components: {
			Form,
			Diagram,
			ResetPwdForm
		},
		data() {
			return {
				keyword: '',
				treeData: [],
				tableData: [],
				treeLoading: false,
				listLoading: true,
				params: {
					organizeId: '',
					keyword: '',
					currentPage: 1,
					pageSize: 20
				},
				defaultProps: {
					children: 'children',
					label: 'fullName'
				},
				total: 0,
				type: '',
				formVisible: false,
				diagramVisible: false,
				resetFormVisible: false,
				authorizeFormVisible: false
			}
		},
		created() {
			this.getOrganizeList()
		},
		methods: {
			showDiagram() {
				this.diagramVisible = true
				this.$nextTick(() => {
					this.$refs.Diagram.init()
				})
			},
			search() {
				this.params.currentPage = 1
				this.params.pageSize = 20
				this.params.sort = 'desc'
				this.initData()
			},
			reset() {
				this.params.keyword = ''
				this.search()
			},
			getOrganizeList() {
				this.treeLoading = true
				getDepartmentSelector().then(res => {
					this.treeData = res.data.list
					this.treeLoading = false
					this.initData()
				}).catch(() => {
					this.treeLoading = false
				})
			},
			initData() {
				this.listLoading = true
				getUserList(this.params).then(res => {
					this.tableData = res.data.list
					this.total = res.data.pagination.total
					this.listLoading = false
				}).catch(() => {
					this.listLoading = false
				})
			},
			handleNodeClick(data) {
				if (this.params.organizeId === data.id) return
				this.params.organizeId = data.id
				this.type = data.type
				this.reset()
			},
			handleAddEdit(id) {
				this.formVisible = true
				this.$nextTick(() => {
					this.$refs.Form.init(id, this.type === 'department' ? this.params.organizeId : '')
				})
			},
			removeForm(isRefresh) {
				this.formVisible = false
				if (isRefresh) {
					this.keyword = ''
					this.initData()
				}
			},
			removeAuthorizeForm(isRefresh) {
				this.authorizeFormVisible = false
				if (isRefresh) {
					this.keyword = ''
					this.initData()
				}
			},
			handleUpdateState(row) {
				const txt = row.enabledMark ? '禁用' : '开启'
				this.$confirm(`您确定要${txt}当前用户吗, 是否继续?`, '提示', {
					type: 'warning'
				}).then(() => {
					updateUserState(row.id).then(res => {
						this.$message({
							type: 'success',
							message: res.msg,
							duration: 1000,
							onClose: () => {
								row.enabledMark = row.enabledMark ? 0 : 1
							}
						})
					})
				}).catch(() => {})
			},
			handleDel(id) {
				this.$confirm('此操作将永久删除该用户, 是否继续?', '提示', {
					type: 'warning'
				}).then(() => {
					delUser(id).then(res => {
						this.$message({
							type: 'success',
							message: res.msg,
							duration: 1500,
							onClose: () => {
								this.initData()
							}
						})
					})
				}).catch(() => {})

			},
			handleResetPwd(id, account) {
				this.resetFormVisible = true
				this.$nextTick(() => {
					this.$refs.ResetPwdForm.init(id, account)
				})
			}
		}
	}
</script>