Przeglądaj źródła

Merge branch 'master' of http://182.92.174.150:3000/tiegu/czo

dukai 3 lat temu
rodzic
commit
2958d05988

+ 5 - 0
src/assets/styles/common.scss

@@ -5,6 +5,7 @@
 	overflow: auto;
 	display: flex;
 	flex-direction: column;
+	background-color: #f0f2f5;
 	// 条件选择、搜索容器
 	.search-container {
 		width: 100%;
@@ -39,8 +40,12 @@
 						border-top: 1px solid #dfe6ec;
 						border-left: 1px solid #dfe6ec;
 						cursor: pointer;
+						&:first-child {
+							border-top-left-radius: 5px;
+						}
 						&:last-child {
 							border-right: 1px solid #dfe6ec;
+							border-top-right-radius: 5px;
 						}
 					}
 				}

+ 1 - 1
src/components/treeChoice/index.vue

@@ -3,7 +3,7 @@
 		<el-input placeholder="输入名称搜索" v-model="filterText" style="margin-bottom: 10px"></el-input>
 		<el-tree :data="dataList" node-key="id" default-expand-all :highlight-current="true" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree" @node-click="nodeClick">
 			<span class="custom-tree-node" slot-scope="{ data }">
-				<span>{{ data.menuName }}</span>
+				<span>{{ data[nodeVal] }}</span>
 			</span>
 		</el-tree>
 	</div>

+ 1 - 1
src/layout/index.vue

@@ -80,7 +80,7 @@
 		position: relative;
 		height: 100%;
 		width: 100%;
-		background-color: #f0f2f5;
+
 		overflow: hidden;
 		&.mobile.openSidebar {
 			position: fixed;

+ 2 - 1
src/plugins/msg.js

@@ -1,3 +1,4 @@
+import { Notification } from 'element-ui'
 export default function (param = {}) {
 	if (!param.title) {
 		switch (param.type) {
@@ -19,7 +20,7 @@ export default function (param = {}) {
 		param.title = '成功'
 	}
 	if (!param.message) return
-	this.$notify({
+	Notification({
 		title: param.title,
 		message: param.message,
 		type: param.type || 'success',

+ 43 - 30
src/utils/request.js

@@ -1,9 +1,11 @@
 import axios from 'axios'
-import { Notification, MessageBox } from 'element-ui'
+import { Loading, MessageBox } from 'element-ui'
+import notifi from '@/plugins/msg.js'
 import store from '@/store'
 import { getToken } from '@/utils/auth'
+import { blobValidate } from '@/utils/tiegu'
 import errorCode from '@/utils/errorCode'
-
+let downloadLoadingInstance
 let pending = []
 let cancelToken = axios.CancelToken
 let removePending = (config) => {
@@ -11,7 +13,7 @@ let removePending = (config) => {
 		let key = +p
 		let item = pending[key]
 		if (item.url === config.url && item.method === config.method && JSON.stringify(item.params) === JSON.stringify(config.params) && JSON.stringify(item.data) === JSON.stringify(config.data)) {
-			item.cancel('操作太频繁,请稍后再试')
+			item.cancel('repeat submission')
 			pending.splice(item, 1)
 		}
 	}
@@ -59,8 +61,8 @@ instance.interceptors.request.use(
 instance.interceptors.response.use(
 	(response) => {
 		removePending(response.config)
-		const code = response.status || 200
-		const msg = errorCode[code] || response.data.msg || errorCode['default']
+		const code = response.data.code || 200
+		const message = errorCode[code] || response.data.msg || errorCode['default']
 		if (code === 401) {
 			MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
 				confirmButtonText: '重新登录',
@@ -71,25 +73,13 @@ instance.interceptors.response.use(
 					location.href = '/index'
 				})
 			})
-		} else if (code === 500) {
-			Notification({
-				title: 'code500',
-				message: msg,
-				type: 'error',
-				duration: 2000,
-				customClass: 'elemsg-notify'
-			})
-			return Promise.reject(new Error(msg))
-		} else if (code === 501) {
-			return { code: 501, data: {} }
 		} else if (code !== 200) {
-			return { code: 0, data: {} }
-		} else {
-			return response.data
+			notifi({ message, type: 'error' })
 		}
+		return response.data
 	},
 	(error) => {
-		console.log('err:' + error)
+		console.log(error)
 		let { message } = error
 		if (message == 'Network Error') {
 			message = '后端接口连接异常'
@@ -97,22 +87,15 @@ instance.interceptors.response.use(
 			message = '系统接口请求超时'
 		} else if (message.includes('Request failed with status code')) {
 			message = '系统接口' + message.substr(message.length - 3) + '异常'
-		} else if (error.includes('Cancel')) {
+		} else if (message.includes('repeat')) {
 			message = '操作太频繁,请稍后再试'
 		} else {
 			message = '系统错误,请联系管理员'
 		}
-		notif(message)
+		notifi({ message, type: 'error' })
+		return { code: 0 }
 	}
 )
-function notif(msg) {
-	Notification({
-		message: msg,
-		type: 'error',
-		duration: 3000,
-		customClass: 'elemsg-notify'
-	})
-}
 function tansParams(params) {
 	let result = ''
 	for (const propName of Object.keys(params)) {
@@ -134,4 +117,34 @@ function tansParams(params) {
 	}
 	return result
 }
+
+// 通用下载方法
+export function download(url, params, filename) {
+	downloadLoadingInstance = Loading.service({ text: '正在下载数据,请稍候', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' })
+	return instance
+		.post(url, params, {
+			transformRequest: [
+				(params) => {
+					return tansParams(params)
+				}
+			],
+			headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+			responseType: 'blob'
+		})
+		.then(async (data) => {
+			const isLogin = await blobValidate(data)
+			if (isLogin) {
+				const blob = new Blob([data])
+				saveAs(blob, filename)
+			} else {
+				notifi({ message: '无效的会话,或者会话已过期,请重新登录。', type: 'error' })
+			}
+			downloadLoadingInstance.close()
+		})
+		.catch((r) => {
+			console.error(r)
+			notifi({ message: '下载文件出现错误,请联系管理员!', type: 'error' })
+			downloadLoadingInstance.close()
+		})
+}
 export default instance

+ 83 - 92
src/views/monitor/job/index.vue

@@ -1,78 +1,73 @@
 <template>
-	<div class="app-container">
-		<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-			<el-form-item label="任务名称" prop="jobName">
-				<el-input v-model="queryParams.jobName" placeholder="请输入任务名称" clearable size="small" @keyup.enter.native="handleQuery" />
-			</el-form-item>
-			<el-form-item label="任务组名" prop="jobGroup">
-				<el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable size="small">
-					<el-option v-for="dict in dict.type.sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value" />
-				</el-select>
-			</el-form-item>
-			<el-form-item label="任务状态" prop="status">
-				<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable size="small">
-					<el-option v-for="dict in dict.type.sys_job_status" :key="dict.value" :label="dict.label" :value="dict.value" />
-				</el-select>
-			</el-form-item>
-			<el-form-item>
-				<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-				<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-			</el-form-item>
-		</el-form>
-
-		<el-row :gutter="10" class="mb8">
-			<el-col :span="1.5">
-				<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['monitor:job:add']">新增</el-button>
-			</el-col>
-			<el-col :span="1.5">
-				<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['monitor:job:edit']">修改</el-button>
-			</el-col>
-			<el-col :span="1.5">
-				<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['monitor:job:remove']">删除</el-button>
-			</el-col>
-			<el-col :span="1.5">
-				<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['monitor:job:export']">导出</el-button>
-			</el-col>
-			<el-col :span="1.5">
-				<el-button type="info" plain icon="el-icon-s-operation" size="mini" @click="handleJobLog" v-hasPermi="['monitor:job:query']">日志</el-button>
-			</el-col>
-			<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-		</el-row>
-
-		<el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
-			<el-table-column type="selection" width="55" align="center" />
-			<el-table-column label="任务编号" width="100" align="center" prop="jobId" />
-			<el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
-			<el-table-column label="任务组名" align="center" prop="jobGroup">
-				<template slot-scope="scope">
-					<dict-tag :options="dict.type.sys_job_group" :value="scope.row.jobGroup" />
-				</template>
-			</el-table-column>
-			<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
-			<el-table-column label="cron执行表达式" align="center" prop="cronExpression" :show-overflow-tooltip="true" />
-			<el-table-column label="状态" align="center">
-				<template slot-scope="scope">
-					<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
-				</template>
-			</el-table-column>
-			<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-				<template slot-scope="scope">
-					<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']">修改</el-button>
-					<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']">删除</el-button>
-					<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['monitor:job:changeStatus', 'monitor:job:query']">
-						<span class="el-dropdown-link"> <i class="el-icon-d-arrow-right el-icon--right"></i>更多 </span>
-						<el-dropdown-menu slot="dropdown">
-							<el-dropdown-item command="handleRun" icon="el-icon-caret-right" v-hasPermi="['monitor:job:changeStatus']">执行一次</el-dropdown-item>
-							<el-dropdown-item command="handleView" icon="el-icon-view" v-hasPermi="['monitor:job:query']">任务详细</el-dropdown-item>
-							<el-dropdown-item command="handleJobLog" icon="el-icon-s-operation" v-hasPermi="['monitor:job:query']">调度日志</el-dropdown-item>
-						</el-dropdown-menu>
-					</el-dropdown>
-				</template>
-			</el-table-column>
-		</el-table>
-
-		<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
+	<div class="page-container">
+		<div class="search-container" v-show="showSearch">
+			<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+				<el-form-item label="任务名称" prop="jobName">
+					<el-input v-model="queryParams.jobName" placeholder="请输入任务名称" clearable size="small" @keyup.enter.native="handleQuery" />
+				</el-form-item>
+				<el-form-item label="任务组名" prop="jobGroup">
+					<el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable size="small">
+						<el-option v-for="dict in dict.type.sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="任务状态" prop="status">
+					<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable size="small">
+						<el-option v-for="dict in dict.type.sys_job_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
+					<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="content-container">
+			<div class="main">
+				<div class="table-nav">
+					<div class="tags">
+						<div class="tag">计划任务</div>
+					</div>
+					<div class="actions">
+						<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['monitor:job:add']">添加</el-button>
+						<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['monitor:job:export']">导出</el-button>
+						<el-button type="info" plain icon="el-icon-s-operation" size="mini" @click="handleJobLog" v-hasPermi="['monitor:job:query']" style="margin-right: 10px">日志</el-button>
+						<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+					</div>
+				</div>
+				<el-table v-loading="loading" border :data="jobList">
+					<el-table-column label="任务编号" width="100" align="center" prop="jobId" />
+					<el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
+					<el-table-column label="任务组名" align="center" prop="jobGroup">
+						<template slot-scope="scope">
+							<dict-tag :options="dict.type.sys_job_group" :value="scope.row.jobGroup" />
+						</template>
+					</el-table-column>
+					<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
+					<el-table-column label="cron执行表达式" align="center" prop="cronExpression" :show-overflow-tooltip="true" />
+					<el-table-column label="状态" align="center">
+						<template slot-scope="scope">
+							<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+						<template slot-scope="scope">
+							<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']">修改</el-button>
+							<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']">删除</el-button>
+							<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['monitor:job:changeStatus', 'monitor:job:query']">
+								<span class="el-dropdown-link"> <i class="el-icon-d-arrow-right el-icon--right"></i>更多 </span>
+								<el-dropdown-menu slot="dropdown">
+									<el-dropdown-item command="handleRun" icon="el-icon-caret-right" v-hasPermi="['monitor:job:changeStatus']">执行一次</el-dropdown-item>
+									<el-dropdown-item command="handleView" icon="el-icon-view" v-hasPermi="['monitor:job:query']">任务详细</el-dropdown-item>
+									<el-dropdown-item command="handleJobLog" icon="el-icon-s-operation" v-hasPermi="['monitor:job:query']">调度日志</el-dropdown-item>
+								</el-dropdown-menu>
+							</el-dropdown>
+						</template>
+					</el-table-column>
+				</el-table>
 
+				<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
+			</div>
+		</div>
 		<!-- 添加或修改定时任务对话框 -->
 		<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
 			<el-form ref="form" :model="form" :rules="rules" label-width="120px">
@@ -214,12 +209,6 @@
 			return {
 				// 遮罩层
 				loading: true,
-				// 选中数组
-				ids: [],
-				// 非单个禁用
-				single: true,
-				// 非多个禁用
-				multiple: true,
 				// 显示搜索条件
 				showSearch: true,
 				// 总条数
@@ -300,12 +289,6 @@
 				this.resetForm('queryForm')
 				this.handleQuery()
 			},
-			// 多选框选中数据
-			handleSelectionChange(selection) {
-				this.ids = selection.map((item) => item.jobId)
-				this.single = selection.length != 1
-				this.multiple = !selection.length
-			},
 			// 更多操作触发
 			handleCommand(command, row) {
 				switch (command) {
@@ -392,15 +375,23 @@
 					if (valid) {
 						if (this.form.jobId != undefined) {
 							updateJob(this.form).then((response) => {
-								this.$modal.msgSuccess('修改成功')
-								this.open = false
-								this.getList()
+								if (response.code == 200) {
+									this.$msg({ message: '修改成功' })
+									this.open = false
+									this.getList()
+								} else {
+									this.$msg({ message: response.msg, type: 'error' })
+								}
 							})
 						} else {
 							addJob(this.form).then((response) => {
-								this.$modal.msgSuccess('新增成功')
-								this.open = false
-								this.getList()
+								if (response.code == 200) {
+									this.$msg({ message: '新增成功' })
+									this.open = false
+									this.getList()
+								} else {
+									this.$msg({ message: response.msg, type: 'error' })
+								}
 							})
 						}
 					}
@@ -408,7 +399,7 @@
 			},
 			/** 删除按钮操作 */
 			handleDelete(row) {
-				const jobIds = row.jobId || this.ids
+				const jobIds = row.jobId
 				this.$modal
 					.confirm('是否确认删除定时任务编号为"' + jobIds + '"的数据项?')
 					.then(function () {

+ 51 - 26
src/views/system/levelPosition/index.vue

@@ -8,8 +8,8 @@
 						<div class="tag" :style="isActive(2)" @click="toTab2">职务</div>
 					</div>
 					<div class="actions">
-						<el-button type="primary" plain size="small " v-show="tabIndex == 1" @click="addLevel" v-hasPermi="['system:levelPosition:addLevel']">添加</el-button>
-						<el-button type="primary" plain size="small " v-show="tabIndex == 2" @click="addPost" v-hasPermi="['system:levelPosition:addPost']">添加</el-button>
+						<el-button type="primary" icon="el-icon-plus" size="mini " v-show="tabIndex == 1" @click="addLevel" v-hasPermi="['system:levelPosition:addLevel']">添加</el-button>
+						<el-button type="primary" icon="el-icon-plus" size="mini " v-show="tabIndex == 2" @click="addPost" v-hasPermi="['system:levelPosition:addPost']">添加</el-button>
 					</div>
 				</div>
 				<!-- 级别表格 -->
@@ -20,7 +20,7 @@
 					:header-cell-style="{ 'text-align': 'center' }"
 					:cell-style="{ textAlign: 'center', cursor: 'pointer' }"
 					highlight-current-row
-					@current-change="rowClick"
+					@current-change="rowHandler"
 					v-show="tabIndex == 1"
 				>
 					<el-table-column label="级别" prop="levelName" width="200">
@@ -30,18 +30,26 @@
 					</el-table-column>
 					<el-table-column label="黑星" prop="blackStar" width="100" />
 					<el-table-column label="红星" prop="redStar" width="100" />
-					<el-table-column label="描述" prop="remarks" width="1000" />
-					<el-table-column label="操作" class-name="small-padding fixed-width">
+					<el-table-column label="描述" prop="remarks" />
+					<el-table-column label="操作" class-name="small-padding fixed-width" width="300">
 						<template slot-scope="scope">
-							<el-button size="mini" type="text" icon="el-icon-edit" @click="updLevel(scope.row)" v-hasPermi="['system:levelPosition:updLevel']">编辑</el-button>
-							<el-button size="mini" type="text" icon="el-icon-delete" @click="delLevel(scope.row)" v-hasPermi="['system:levelPosition:delLevel']">删除</el-button>
-							<el-button size="mini" type="text" icon="el-icon-top" @click="levelUpOrder(scope.row)" v-hasPermi="['system:levelPosition:upLevel']">上升</el-button>
-							<el-button size="mini" type="text" icon="el-icon-bottom" @click="levelDownOrder(scope.row)" v-hasPermi="['system:levelPosition:downLevel']">下降</el-button>
+							<el-button size="mini" type="text" icon="el-icon-edit" @click.stop="updLevel(scope.row)" v-hasPermi="['system:levelPosition:updLevel']">编辑</el-button>
+							<el-button size="mini" type="text" icon="el-icon-delete" @click.stop="delLevel(scope.row)" v-hasPermi="['system:levelPosition:delLevel']">删除</el-button>
+							<el-button size="mini" type="text" icon="el-icon-top" @click.stop="levelUpOrder(scope.row)" v-hasPermi="['system:levelPosition:upLevel']">上升</el-button>
+							<el-button size="mini" type="text" icon="el-icon-bottom" @click.stop="levelDownOrder(scope.row)" v-hasPermi="['system:levelPosition:downLevel']">下降</el-button>
 						</template>
 					</el-table-column>
 				</el-table>
 				<!-- 职务表格 -->
-				<el-table v-loading="loading" :data="postList" border :header-cell-style="{ 'text-align': 'center' }" :cell-style="{ 'text-align': 'center' }" v-show="tabIndex == 2">
+				<el-table
+					v-loading="loading"
+					:data="postList"
+					border
+					:header-cell-style="{ 'text-align': 'center' }"
+					:cell-style="{ 'text-align': 'center' }"
+					highlight-current-row
+					v-show="tabIndex == 2"
+				>
 					<el-table-column label="职务" prop="jobName" width="200" />
 					<el-table-column label="级别" width="200">
 						<template slot-scope="scope">
@@ -53,8 +61,8 @@
 							{{ getDeptName(scope.row.deptId) }}
 						</template>
 					</el-table-column>
-					<el-table-column label="描述" prop="remarks" width="800" />
-					<el-table-column label="操作" class-name="small-padding fixed-width">
+					<el-table-column label="描述" prop="remarks" />
+					<el-table-column label="操作" class-name="small-padding fixed-width" width="300">
 						<template slot-scope="scope">
 							<el-button size="mini" type="text" icon="el-icon-edit" @click="updPost(scope.row)" v-hasPermi="['system:levelPosition:updPost']">编辑</el-button>
 							<el-button size="mini" type="text" icon="el-icon-delete" @click="delPost(scope.row)" v-hasPermi="['system:levelPosition:delPost']">删除</el-button>
@@ -265,7 +273,7 @@
 			//删除级别
 			delLevel(row) {
 				this.$modal
-					.confirm()
+					.confirm('确定要删除吗')
 					.then(() => {
 						levelDel(row.levelId).then((res) => {
 							if (res.code == 200) {
@@ -309,19 +317,15 @@
 									this.$msg({ message: '修改成功' })
 									this.getLevelList()
 									this.levelCancel()
-								} else {
-									this.$msg({ type: 'error', message: res.msg })
 								}
 							})
 						} else {
 							this.levelForm.levelSort = this.levelList.length ? this.levelList[0].levelSort + 1 : 1
 							levelAdd(this.levelForm).then((res) => {
-								if (res.code == 200) {
+								if (res.code === 200) {
 									this.$msg({ message: '添加成功' })
 									this.getLevelList()
 									this.levelCancel()
-								} else {
-									this.$msg({ type: 'error', message: res.msg })
 								}
 							})
 						}
@@ -334,7 +338,7 @@
 			levelUpOrder(row) {
 				let prevList = this.levelList.filter((item) => item.levelSort > row.levelSort)
 				prevList.sort((a, b) => {
-					return b.levelSort - a.levelSort
+					return a.levelSort - b.levelSort
 				})
 				let prev = prevList[0]
 				if (!prev) {
@@ -346,8 +350,13 @@
 					]
 					levelOrder(d).then((res) => {
 						if (res.code == 200) {
+							let pSort = prev.levelSort
+							prev.levelSort = row.levelSort
+							row.levelSort = pSort
+							this.levelList.sort((a, b) => {
+								return b.levelSort - a.levelSort
+							})
 							this.$msg({ message: '设置成功' })
-							this.getLevelList()
 						}
 					})
 				}
@@ -368,8 +377,13 @@
 					]
 					levelOrder(d).then((res) => {
 						if (res.code == 200) {
+							let nSort = next.levelSort
+							next.levelSort = row.levelSort
+							row.levelSort = nSort
+							this.levelList.sort((a, b) => {
+								return b.levelSort - a.levelSort
+							})
 							this.$msg({ message: '设置成功' })
-							this.getLevelList()
 						}
 					})
 				}
@@ -379,7 +393,8 @@
 				this.tabIndex = 1
 			},
 			//级别行单击
-			rowClick(e) {
+			rowHandler(e) {
+				if (!e) return
 				this.postForm.levelId = e.levelId
 				this.postForm.levelName = e.levelName
 				this.postList = []
@@ -427,7 +442,7 @@
 			//删除职务
 			delPost(row) {
 				this.$modal
-					.confirm()
+					.confirm('确定要删除吗')
 					.then(() => {
 						postDel(row.jobId).then((res) => {
 							if (res.code == 200) {
@@ -506,7 +521,7 @@
 			postUpOrder(row) {
 				let prevList = this.postList.filter((item) => item.jobSort > row.jobSort)
 				prevList.sort((a, b) => {
-					return b.jobSort - a.jobSort
+					return a.jobSort - b.jobSort
 				})
 				let prev = prevList[0]
 				if (!prev) {
@@ -518,8 +533,13 @@
 					]
 					postOrder(d).then((res) => {
 						if (res.code == 200) {
+							let pSort = prev.jobSort
+							prev.jobSort = row.jobSort
+							row.jobSort = pSort
+							this.postList.sort((a, b) => {
+								return b.jobSort - a.jobSort
+							})
 							this.$msg({ message: '设置成功' })
-							this.getPostList()
 						}
 					})
 				}
@@ -540,8 +560,13 @@
 					]
 					postOrder(d).then((res) => {
 						if (res.code == 200) {
+							let nSort = next.jobSort
+							next.jobSort = row.jobSort
+							row.jobSort = nSort
+							this.postList.sort((a, b) => {
+								return b.jobSort - a.jobSort
+							})
 							this.$msg({ message: '设置成功' })
-							this.getPostList()
 						}
 					})
 				}

+ 3 - 3
src/views/system/tableHead/index.vue

@@ -2,7 +2,7 @@
 	<div class="page-container">
 		<div class="search-container">
 			<el-input v-model="queryParams.columnName" placeholder="输入表头名称" clearable size="small" style="width: 150px" />
-			<el-button type="primary" plain size="small " style="margin-left: 3px" @click="getList" v-hasPermi="['system:tableHead:listTable']">搜索</el-button>
+			<el-button type="primary" icon="el-icon-search" size="small " style="margin-left: 3px" @click="getList" v-hasPermi="['system:tableHead:listTable']">搜索</el-button>
 		</div>
 		<div class="content-container">
 			<TreeChoice :dataList="menuList" nodeKey="id" nodeVal="menuName" @itemClick="menuClick" />
@@ -12,7 +12,7 @@
 						<div class="tag" :style="isActive(1)">表头管理</div>
 					</div>
 					<div class="actions">
-						<el-button type="primary" plain size="small " style="margin: 0 0 10px 3px" @click="handleAdd" v-hasPermi="['system:tableHead:addTable']">添加</el-button>
+						<el-button type="primary" icon="el-icon-plus" size="mini " style="margin: 0 0 10px 3px" @click="handleAdd" v-hasPermi="['system:tableHead:addTable']">添加</el-button>
 					</div>
 				</div>
 				<el-table v-loading="loading" :data="tableHeadList" border>
@@ -187,7 +187,7 @@
 			//删除表头数据
 			handleDelete(data) {
 				this.$modal
-					.confirm()
+					.confirm('确定要删除吗')
 					.then(() => {
 						tableHeadDel(data.id).then((res) => {
 							if (res.code == 200) {

+ 506 - 668
src/views/system/user/index.vue

@@ -1,675 +1,513 @@
 <template>
-  <div class="app-container">
-    <el-row :gutter="20">
-      <!--部门数据-->
-      <el-col :span="4" :xs="24">
-        <div class="head-container">
-          <el-input
-            v-model="deptName"
-            placeholder="请输入部门名称"
-            clearable
-            size="small"
-            prefix-icon="el-icon-search"
-            style="margin-bottom: 20px"
-          />
-        </div>
-        <div class="head-container">
-          <el-tree
-            :data="deptOptions"
-            :props="defaultProps"
-            :expand-on-click-node="false"
-            :filter-node-method="filterNode"
-            ref="tree"
-            default-expand-all
-            @node-click="handleNodeClick"
-          />
-        </div>
-      </el-col>
-      <!--用户数据-->
-      <el-col :span="20" :xs="24">
-        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-          <el-form-item label="用户名称" prop="userName">
-            <el-input
-              v-model="queryParams.userName"
-              placeholder="请输入用户名称"
-              clearable
-              size="small"
-              style="width: 240px"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="手机号码" prop="phonenumber">
-            <el-input
-              v-model="queryParams.phonenumber"
-              placeholder="请输入手机号码"
-              clearable
-              size="small"
-              style="width: 240px"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="状态" prop="status">
-            <el-select
-              v-model="queryParams.status"
-              placeholder="用户状态"
-              clearable
-              size="small"
-              style="width: 240px"
-            >
-              <el-option
-                v-for="dict in dict.type.sys_normal_disable"
-                :key="dict.value"
-                :label="dict.label"
-                :value="dict.value"
-              />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="创建时间">
-            <el-date-picker
-              v-model="dateRange"
-              size="small"
-              style="width: 240px"
-              value-format="yyyy-MM-dd"
-              type="daterange"
-              range-separator="-"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-            ></el-date-picker>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
+	<div class="page-container">
+		<div class="search-container" v-show="showSearch">
+			<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+				<el-form-item label="用户名称" prop="userName">
+					<el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+				</el-form-item>
+				<el-form-item label="手机号码" prop="phonenumber">
+					<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+				</el-form-item>
+				<el-form-item label="状态" prop="status">
+					<el-select v-model="queryParams.status" placeholder="用户状态" clearable size="small" style="width: 240px">
+						<el-option v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="创建时间">
+					<el-date-picker
+						v-model="dateRange"
+						size="small"
+						style="width: 240px"
+						value-format="yyyy-MM-dd"
+						type="daterange"
+						range-separator="-"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+					></el-date-picker>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+					<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="content-container">
+			<TreeChoice :dataList="deptOptions" nodeKey="id" nodeVal="label" @itemClick="handleNodeClick" />
+			<div class="main">
+				<div class="table-nav">
+					<div class="tags">
+						<div class="tag">用户管理</div>
+					</div>
+					<div class="actions">
+						<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:user:add']">添加</el-button>
+						<el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['system:user:import']">导入</el-button>
+						<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['system:user:export']" style="margin-right: 10px">导出</el-button>
+						<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+					</div>
+				</div>
+				<el-table v-loading="loading" border :data="userList">
+					<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+					<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
+					<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+					<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
+					<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
+					<el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
+						<template slot-scope="scope">
+							<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+						</template>
+					</el-table-column>
+					<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
+						<template slot-scope="scope">
+							<span>{{ parseTime(scope.row.createTime) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
+						<template slot-scope="scope" v-if="scope.row.userId !== 1">
+							<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']">修改</el-button>
+							<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']">删除</el-button>
+							<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">
+								<span class="el-dropdown-link"> <i class="el-icon-d-arrow-right el-icon--right"></i>更多 </span>
+								<el-dropdown-menu slot="dropdown">
+									<el-dropdown-item command="handleResetPwd" icon="el-icon-key" v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
+									<el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check" v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item>
+								</el-dropdown-menu>
+							</el-dropdown>
+						</template>
+					</el-table-column>
+				</el-table>
 
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button
-              type="primary"
-              plain
-              icon="el-icon-plus"
-              size="mini"
-              @click="handleAdd"
-              v-hasPermi="['system:user:add']"
-            >新增</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button
-              type="success"
-              plain
-              icon="el-icon-edit"
-              size="mini"
-              :disabled="single"
-              @click="handleUpdate"
-              v-hasPermi="['system:user:edit']"
-            >修改</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button
-              type="danger"
-              plain
-              icon="el-icon-delete"
-              size="mini"
-              :disabled="multiple"
-              @click="handleDelete"
-              v-hasPermi="['system:user:remove']"
-            >删除</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button
-              type="info"
-              plain
-              icon="el-icon-upload2"
-              size="mini"
-              @click="handleImport"
-              v-hasPermi="['system:user:import']"
-            >导入</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button
-              type="warning"
-              plain
-              icon="el-icon-download"
-              size="mini"
-              @click="handleExport"
-              v-hasPermi="['system:user:export']"
-            >导出</el-button>
-          </el-col>
-          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
-        </el-row>
+				<pagination v-show="total > queryParams.pageSize" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
+			</div>
+		</div>
+		<!-- 添加或修改用户配置对话框 -->
+		<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+			<el-form ref="form" :model="form" :rules="rules" label-width="80px">
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="用户昵称" prop="nickName">
+							<el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="归属部门" prop="deptId">
+							<treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="手机号码" prop="phonenumber">
+							<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="邮箱" prop="email">
+							<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
+							<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
+							<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="用户性别">
+							<el-select v-model="form.sex" placeholder="请选择">
+								<el-option v-for="dict in dict.type.sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="状态">
+							<el-radio-group v-model="form.status">
+								<el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="岗位">
+							<el-select v-model="form.postIds" multiple placeholder="请选择">
+								<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="角色">
+							<el-select v-model="form.roleIds" multiple placeholder="请选择">
+								<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="24">
+						<el-form-item label="备注">
+							<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<div slot="footer" class="dialog-footer">
+				<el-button type="primary" @click="submitForm">确 定</el-button>
+				<el-button @click="cancel">取 消</el-button>
+			</div>
+		</el-dialog>
 
-        <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
-          <el-table-column type="selection" width="50" align="center" />
-          <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
-          <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
-          <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
-          <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
-          <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
-          <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
-            <template slot-scope="scope">
-              <el-switch
-                v-model="scope.row.status"
-                active-value="0"
-                inactive-value="1"
-                @change="handleStatusChange(scope.row)"
-              ></el-switch>
-            </template>
-          </el-table-column>
-          <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
-            <template slot-scope="scope">
-              <span>{{ parseTime(scope.row.createTime) }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="操作"
-            align="center"
-            width="160"
-            class-name="small-padding fixed-width"
-          >
-            <template slot-scope="scope" v-if="scope.row.userId !== 1">
-              <el-button
-                size="mini"
-                type="text"
-                icon="el-icon-edit"
-                @click="handleUpdate(scope.row)"
-                v-hasPermi="['system:user:edit']"
-              >修改</el-button>
-              <el-button
-                size="mini"
-                type="text"
-                icon="el-icon-delete"
-                @click="handleDelete(scope.row)"
-                v-hasPermi="['system:user:remove']"
-              >删除</el-button>
-              <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">
-                <span class="el-dropdown-link">
-                  <i class="el-icon-d-arrow-right el-icon--right"></i>更多
-                </span>
-                <el-dropdown-menu slot="dropdown">
-                  <el-dropdown-item command="handleResetPwd" icon="el-icon-key"
-                    v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
-                  <el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check"
-                    v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item>
-                </el-dropdown-menu>
-              </el-dropdown>
-            </template>
-          </el-table-column>
-        </el-table>
-
-        <pagination
-          v-show="total>0"
-          :total="total"
-          :page.sync="queryParams.pageNum"
-          :limit.sync="queryParams.pageSize"
-          @pagination="getList"
-        />
-      </el-col>
-    </el-row>
-
-    <!-- 添加或修改用户配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="用户昵称" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="归属部门" prop="deptId">
-              <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="手机号码" prop="phonenumber">
-              <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
-              <el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
-              <el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password/>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="用户性别">
-              <el-select v-model="form.sex" placeholder="请选择">
-                <el-option
-                  v-for="dict in dict.type.sys_user_sex"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="状态">
-              <el-radio-group v-model="form.status">
-                <el-radio
-                  v-for="dict in dict.type.sys_normal_disable"
-                  :key="dict.value"
-                  :label="dict.value"
-                >{{dict.label}}</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="岗位">
-              <el-select v-model="form.postIds" multiple placeholder="请选择">
-                <el-option
-                  v-for="item in postOptions"
-                  :key="item.postId"
-                  :label="item.postName"
-                  :value="item.postId"
-                  :disabled="item.status == 1"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="角色">
-              <el-select v-model="form.roleIds" multiple placeholder="请选择">
-                <el-option
-                  v-for="item in roleOptions"
-                  :key="item.roleId"
-                  :label="item.roleName"
-                  :value="item.roleId"
-                  :disabled="item.status == 1"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="备注">
-              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 用户导入对话框 -->
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload
-        ref="upload"
-        :limit="1"
-        accept=".xlsx, .xls"
-        :headers="upload.headers"
-        :action="upload.url + '?updateSupport=' + upload.updateSupport"
-        :disabled="upload.isUploading"
-        :on-progress="handleFileUploadProgress"
-        :on-success="handleFileSuccess"
-        :auto-upload="false"
-        drag
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-        <div class="el-upload__tip text-center" slot="tip">
-          <div class="el-upload__tip" slot="tip">
-            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据
-          </div>
-          <span>仅允许导入xls、xlsx格式文件。</span>
-          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
-        </div>
-      </el-upload>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">确 定</el-button>
-        <el-button @click="upload.open = false">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
+		<!-- 用户导入对话框 -->
+		<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+			<el-upload
+				ref="upload"
+				:limit="1"
+				accept=".xlsx, .xls"
+				:headers="upload.headers"
+				:action="upload.url + '?updateSupport=' + upload.updateSupport"
+				:disabled="upload.isUploading"
+				:on-progress="handleFileUploadProgress"
+				:on-success="handleFileSuccess"
+				:auto-upload="false"
+				drag
+			>
+				<i class="el-icon-upload"></i>
+				<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+				<div class="el-upload__tip text-center" slot="tip">
+					<div class="el-upload__tip" slot="tip"> <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据 </div>
+					<span>仅允许导入xls、xlsx格式文件。</span>
+					<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
+				</div>
+			</el-upload>
+			<div slot="footer" class="dialog-footer">
+				<el-button type="primary" @click="submitFileForm">确 定</el-button>
+				<el-button @click="upload.open = false">取 消</el-button>
+			</div>
+		</el-dialog>
+	</div>
 </template>
 
 <script>
-import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus } from "@/api/system/user";
-import { getToken } from "@/utils/auth";
-import { treeselect } from "@/api/system/dept";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+	import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus } from '@/api/system/user'
+	import { getToken } from '@/utils/auth'
+	import { treeselect } from '@/api/system/dept'
+	import Treeselect from '@riophae/vue-treeselect'
+	import TreeChoice from '@/components/treeChoice/index.vue'
+	import '@riophae/vue-treeselect/dist/vue-treeselect.css'
 
-export default {
-  name: "User",
-  dicts: ['sys_normal_disable', 'sys_user_sex'],
-  components: { Treeselect },
-  data() {
-    return {
-      // 遮罩层
-      loading: true,
-      // 选中数组
-      ids: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 用户表格数据
-      userList: null,
-      // 弹出层标题
-      title: "",
-      // 部门树选项
-      deptOptions: undefined,
-      // 是否显示弹出层
-      open: false,
-      // 部门名称
-      deptName: undefined,
-      // 默认密码
-      initPassword: undefined,
-      // 日期范围
-      dateRange: [],
-      // 岗位选项
-      postOptions: [],
-      // 角色选项
-      roleOptions: [],
-      // 表单参数
-      form: {},
-      defaultProps: {
-        children: "children",
-        label: "label"
-      },
-      // 用户导入参数
-      upload: {
-        // 是否显示弹出层(用户导入)
-        open: false,
-        // 弹出层标题(用户导入)
-        title: "",
-        // 是否禁用上传
-        isUploading: false,
-        // 是否更新已经存在的用户数据
-        updateSupport: 0,
-        // 设置上传的请求头部
-        headers: { Authorization: "Bearer " + getToken() },
-        // 上传的地址
-        url: process.env.VUE_APP_BASE_API + "/system/user/importData"
-      },
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        userName: undefined,
-        phonenumber: undefined,
-        status: undefined,
-        deptId: undefined
-      },
-      // 列信息
-      columns: [
-        { key: 0, label: `用户编号`, visible: true },
-        { key: 1, label: `用户名称`, visible: true },
-        { key: 2, label: `用户昵称`, visible: true },
-        { key: 3, label: `部门`, visible: true },
-        { key: 4, label: `手机号码`, visible: true },
-        { key: 5, label: `状态`, visible: true },
-        { key: 6, label: `创建时间`, visible: true }
-      ],
-      // 表单校验
-      rules: {
-        userName: [
-          { required: true, message: "用户名称不能为空", trigger: "blur" },
-          { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
-        ],
-        nickName: [
-          { required: true, message: "用户昵称不能为空", trigger: "blur" }
-        ],
-        password: [
-          { required: true, message: "用户密码不能为空", trigger: "blur" },
-          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
-        ],
-        email: [
-          {
-            type: "email",
-            message: "'请输入正确的邮箱地址",
-            trigger: ["blur", "change"]
-          }
-        ],
-        phonenumber: [
-          {
-            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-            message: "请输入正确的手机号码",
-            trigger: "blur"
-          }
-        ]
-      }
-    };
-  },
-  watch: {
-    // 根据名称筛选部门树
-    deptName(val) {
-      this.$refs.tree.filter(val);
-    }
-  },
-  created() {
-    this.getList();
-    this.getTreeselect();
-    this.getConfigKey("sys.user.initPassword").then(response => {
-      this.initPassword = response.msg;
-    });
-  },
-  methods: {
-    /** 查询用户列表 */
-    getList() {
-      this.loading = true;
-      listUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
-          this.userList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
-      );
-    },
-    /** 查询部门下拉树结构 */
-    getTreeselect() {
-      treeselect().then(response => {
-        this.deptOptions = response.data;
-      });
-    },
-    // 筛选节点
-    filterNode(value, data) {
-      if (!value) return true;
-      return data.label.indexOf(value) !== -1;
-    },
-    // 节点单击事件
-    handleNodeClick(data) {
-      this.queryParams.deptId = data.id;
-      this.getList();
-    },
-    // 用户状态修改
-    handleStatusChange(row) {
-      let text = row.status === "0" ? "启用" : "停用";
-      this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function() {
-        return changeUserStatus(row.userId, row.status);
-      }).then(() => {
-        this.$modal.msgSuccess(text + "成功");
-      }).catch(function() {
-        row.status = row.status === "0" ? "1" : "0";
-      });
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        userId: undefined,
-        deptId: undefined,
-        userName: undefined,
-        nickName: undefined,
-        password: undefined,
-        phonenumber: undefined,
-        email: undefined,
-        sex: undefined,
-        status: "0",
-        remark: undefined,
-        postIds: [],
-        roleIds: []
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.dateRange = [];
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.userId);
-      this.single = selection.length != 1;
-      this.multiple = !selection.length;
-    },
-    // 更多操作触发
-    handleCommand(command, row) {
-      switch (command) {
-        case "handleResetPwd":
-          this.handleResetPwd(row);
-          break;
-        case "handleAuthRole":
-          this.handleAuthRole(row);
-          break;
-        default:
-          break;
-      }
-    },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.getTreeselect();
-      getUser().then(response => {
-        this.postOptions = response.posts;
-        this.roleOptions = response.roles;
-        this.open = true;
-        this.title = "添加用户";
-        this.form.password = this.initPassword;
-      });
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      this.getTreeselect();
-      const userId = row.userId || this.ids;
-      getUser(userId).then(response => {
-        this.form = response.data;
-        this.postOptions = response.posts;
-        this.roleOptions = response.roles;
-        this.form.postIds = response.postIds;
-        this.form.roleIds = response.roleIds;
-        this.open = true;
-        this.title = "修改用户";
-        this.form.password = "";
-      });
-    },
-    /** 重置密码按钮操作 */
-    handleResetPwd(row) {
-      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        closeOnClickModal: false,
-        inputPattern: /^.{5,20}$/,
-        inputErrorMessage: "用户密码长度必须介于 5 和 20 之间"
-      }).then(({ value }) => {
-          resetUserPwd(row.userId, value).then(response => {
-            this.$modal.msgSuccess("修改成功,新密码是:" + value);
-          });
-        }).catch(() => {});
-    },
-    /** 分配角色操作 */
-    handleAuthRole: function(row) {
-      const userId = row.userId;
-      this.$router.push("/system/user-auth/role/" + userId);
-    },
-    /** 提交按钮 */
-    submitForm: function() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.userId != undefined) {
-            updateUser(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addUser(this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const userIds = row.userId || this.ids;
-      this.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function() {
-        return delUser(userIds);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      this.download('system/user/export', {
-        ...this.queryParams
-      }, `user_${new Date().getTime()}.xlsx`)
-    },
-    /** 导入按钮操作 */
-    handleImport() {
-      this.upload.title = "用户导入";
-      this.upload.open = true;
-    },
-    /** 下载模板操作 */
-    importTemplate() {
-      this.download('system/user/importTemplate', {
-      }, `user_template_${new Date().getTime()}.xlsx`)
-    },
-    // 文件上传中处理
-    handleFileUploadProgress(event, file, fileList) {
-      this.upload.isUploading = true;
-    },
-    // 文件上传成功处理
-    handleFileSuccess(response, file, fileList) {
-      this.upload.open = false;
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
-      this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
-      this.getList();
-    },
-    // 提交上传文件
-    submitFileForm() {
-      this.$refs.upload.submit();
-    }
-  }
-};
-</script>
+	export default {
+		name: 'User',
+		dicts: ['sys_normal_disable', 'sys_user_sex'],
+		components: { Treeselect, TreeChoice },
+		data() {
+			return {
+				// 遮罩层
+				loading: true,
+				// 显示搜索条件
+				showSearch: true,
+				// 总条数
+				total: 0,
+				// 用户表格数据
+				userList: null,
+				// 弹出层标题
+				title: '',
+				// 部门树选项
+				deptOptions: undefined,
+				// 是否显示弹出层
+				open: false,
+				// 部门名称
+				deptName: undefined,
+				// 默认密码
+				initPassword: undefined,
+				// 日期范围
+				dateRange: [],
+				// 岗位选项
+				postOptions: [],
+				// 角色选项
+				roleOptions: [],
+				// 表单参数
+				form: {},
+				defaultProps: {
+					children: 'children',
+					label: 'label'
+				},
+				// 用户导入参数
+				upload: {
+					// 是否显示弹出层(用户导入)
+					open: false,
+					// 弹出层标题(用户导入)
+					title: '',
+					// 是否禁用上传
+					isUploading: false,
+					// 是否更新已经存在的用户数据
+					updateSupport: 0,
+					// 设置上传的请求头部
+					headers: { Authorization: 'Bearer ' + getToken() },
+					// 上传的地址
+					url: process.env.VUE_APP_BASE_API + '/system/user/importData'
+				},
+				// 查询参数
+				queryParams: {
+					pageNum: 1,
+					pageSize: 10,
+					userName: undefined,
+					phonenumber: undefined,
+					status: undefined,
+					deptId: undefined
+				},
+				// 列信息
+				columns: [
+					{ key: 0, label: `用户编号`, visible: true },
+					{ key: 1, label: `用户名称`, visible: true },
+					{ key: 2, label: `用户昵称`, visible: true },
+					{ key: 3, label: `部门`, visible: true },
+					{ key: 4, label: `手机号码`, visible: true },
+					{ key: 5, label: `状态`, visible: true },
+					{ key: 6, label: `创建时间`, visible: true }
+				],
+				// 表单校验
+				rules: {
+					userName: [
+						{ required: true, message: '用户名称不能为空', trigger: 'blur' },
+						{ min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
+					],
+					nickName: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
+					password: [
+						{ required: true, message: '用户密码不能为空', trigger: 'blur' },
+						{ min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
+					],
+					email: [
+						{
+							type: 'email',
+							message: "'请输入正确的邮箱地址",
+							trigger: ['blur', 'change']
+						}
+					],
+					phonenumber: [
+						{
+							pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+							message: '请输入正确的手机号码',
+							trigger: 'blur'
+						}
+					]
+				}
+			}
+		},
+		created() {
+			this.getList()
+			this.getTreeselect()
+			this.getConfigKey('sys.user.initPassword').then((response) => {
+				this.initPassword = response.msg
+			})
+		},
+		methods: {
+			/** 查询用户列表 */
+			getList() {
+				this.loading = true
+				listUser(this.addDateRange(this.queryParams, this.dateRange)).then((response) => {
+					this.userList = response.rows
+					this.total = response.total
+					this.loading = false
+				})
+			},
+			/** 查询部门下拉树结构 */
+			getTreeselect() {
+				treeselect().then((response) => {
+					this.deptOptions = response.data
+				})
+			},
+			// 节点单击事件
+			handleNodeClick(data) {
+				this.queryParams.deptId = data.id
+				this.getList()
+			},
+			// 用户状态修改
+			handleStatusChange(row) {
+				let text = row.status === '0' ? '启用' : '停用'
+				this.$modal
+					.confirm('确认要"' + text + '""' + row.userName + '"用户吗?')
+					.then(function () {
+						return changeUserStatus(row.userId, row.status)
+					})
+					.then(() => {
+						this.$modal.msgSuccess(text + '成功')
+					})
+					.catch(function () {
+						row.status = row.status === '0' ? '1' : '0'
+					})
+			},
+			// 取消按钮
+			cancel() {
+				this.open = false
+				this.reset()
+			},
+			// 表单重置
+			reset() {
+				this.form = {
+					userId: undefined,
+					deptId: undefined,
+					userName: undefined,
+					nickName: undefined,
+					password: undefined,
+					phonenumber: undefined,
+					email: undefined,
+					sex: undefined,
+					status: '0',
+					remark: undefined,
+					postIds: [],
+					roleIds: []
+				}
+				this.resetForm('form')
+			},
+			/** 搜索按钮操作 */
+			handleQuery() {
+				this.queryParams.pageNum = 1
+				this.getList()
+			},
+			/** 重置按钮操作 */
+			resetQuery() {
+				this.dateRange = []
+				this.resetForm('queryForm')
+				this.handleQuery()
+			},
+			// 更多操作触发
+			handleCommand(command, row) {
+				switch (command) {
+					case 'handleResetPwd':
+						this.handleResetPwd(row)
+						break
+					case 'handleAuthRole':
+						this.handleAuthRole(row)
+						break
+					default:
+						break
+				}
+			},
+			/** 新增按钮操作 */
+			handleAdd() {
+				this.reset()
+				this.getTreeselect()
+				getUser().then((response) => {
+					this.postOptions = response.posts
+					this.roleOptions = response.roles
+					this.open = true
+					this.title = '添加用户'
+					this.form.password = this.initPassword
+				})
+			},
+			/** 修改按钮操作 */
+			handleUpdate(row) {
+				this.reset()
+				this.getTreeselect()
+				const userId = row.userId || this.ids
+				getUser(userId).then((response) => {
+					this.form = response.data
+					this.postOptions = response.posts
+					this.roleOptions = response.roles
+					this.form.postIds = response.postIds
+					this.form.roleIds = response.roleIds
+					this.open = true
+					this.title = '修改用户'
+					this.form.password = ''
+				})
+			},
+			/** 重置密码按钮操作 */
+			handleResetPwd(row) {
+				this.$prompt('请输入"' + row.userName + '"的新密码', '提示', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					closeOnClickModal: false,
+					inputPattern: /^.{5,20}$/,
+					inputErrorMessage: '用户密码长度必须介于 5 和 20 之间'
+				})
+					.then(({ value }) => {
+						resetUserPwd(row.userId, value).then((response) => {
+							this.$modal.msgSuccess('修改成功,新密码是:' + value)
+						})
+					})
+					.catch(() => {})
+			},
+			/** 分配角色操作 */
+			handleAuthRole: function (row) {
+				const userId = row.userId
+				this.$router.push('/system/user-auth/role/' + userId)
+			},
+			/** 提交按钮 */
+			submitForm: function () {
+				this.$refs['form'].validate((valid) => {
+					if (valid) {
+						if (this.form.userId != undefined) {
+							updateUser(this.form).then((response) => {
+								this.$modal.msgSuccess('修改成功')
+								this.open = false
+								this.getList()
+							})
+						} else {
+							addUser(this.form).then((response) => {
+								this.$modal.msgSuccess('新增成功')
+								this.open = false
+								this.getList()
+							})
+						}
+					}
+				})
+			},
+			/** 删除按钮操作 */
+			handleDelete(row) {
+				const userIds = row.userId
+				this.$modal
+					.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
+					.then(function () {
+						return delUser(userIds)
+					})
+					.then(() => {
+						this.getList()
+						this.$modal.msgSuccess('删除成功')
+					})
+					.catch(() => {})
+			},
+			/** 导出按钮操作 */
+			handleExport() {
+				this.download(
+					'system/user/export',
+					{
+						...this.queryParams
+					},
+					`user_${new Date().getTime()}.xlsx`
+				)
+			},
+			/** 导入按钮操作 */
+			handleImport() {
+				this.upload.title = '用户导入'
+				this.upload.open = true
+			},
+			/** 下载模板操作 */
+			importTemplate() {
+				this.download('system/user/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`)
+			},
+			// 文件上传中处理
+			handleFileUploadProgress(event, file, fileList) {
+				this.upload.isUploading = true
+			},
+			// 文件上传成功处理
+			handleFileSuccess(response, file, fileList) {
+				this.upload.open = false
+				this.upload.isUploading = false
+				this.$refs.upload.clearFiles()
+				this.$alert(response.msg, '导入结果', { dangerouslyUseHTMLString: true })
+				this.getList()
+			},
+			// 提交上传文件
+			submitFileForm() {
+				this.$refs.upload.submit()
+			}
+		}
+	}
+</script>