<template> <section> <!--工具条--> <el-col :span="24" class="toolbar" style="padding-bottom: 0px;"> <el-form :inline="true" :model="filters"> <el-form-item> <el-input v-model="filters.realName" placeholder="真实姓名"> <template slot="prepend">姓名</template> </el-input> </el-form-item> <el-form-item> <el-input v-model="filters.userName" placeholder="登录账号"> <template slot="prepend">账号</template> </el-input> </el-form-item> <el-form-item> <el-button type="primary" v-on:click="getUsers" icon="el-icon-search">查询</el-button> </el-form-item> <el-form-item> <el-button type="success" @click="handleAdd" icon="el-icon-document">新增</el-button> </el-form-item> </el-form> </el-col> <!--列表--> <el-table :data="users" highlight-current-row border v-loading="listLoading" @selection-change="selsChange" tooltip-effect="dark" style="border-radius: 10px 10px 0px 0px;line-height: 25px;" :header-cell-style="{background:'#6F8294',color:'#FFFFFF'}" > <el-table-column type="selection" width="55"> </el-table-column> <!--<el-table-column type="index" width="60">--> <!--</el-table-column>--> <el-table-column prop="userId" label="ID" width="100" sortable> </el-table-column> <el-table-column prop="username" label="账号" width="120" sortable> </el-table-column> <el-table-column prop="realname" label="姓名" width="120" sortable> </el-table-column> <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex" sortable> </el-table-column> <el-table-column prop="mobilephone" label="电话" width="125"> </el-table-column> <el-table-column prop="creattime" label="创建时间" width="170" sortable> </el-table-column> <el-table-column prop="updatetime" label="更新时间" width="170" sortable> </el-table-column> <!-- <el-table-column prop="address" label="地址" min-width="180">--> <!-- </el-table-column>--> <!-- <el-table-column prop="email" label="Email" min-width="180">--> <!-- </el-table-column>--> <el-table-column prop="state" label="启用" width="100" :formatter="formatState" sortable> </el-table-column> <el-table-column label="操作" width="250" fixed="right"> <template slot-scope="scope"> <el-button @click="handleEdit(scope.$index, scope.row)">编辑</el-button> <el-button type="info" @click="roleEdit(scope.$index, scope.row)">角色配置</el-button> <el-button type="danger" @click="handleDel(scope.$index, scope.row)">删除</el-button> </template> </el-table-column> </el-table> <!--工具条--> <el-col :span="24" class="toolbar"> <el-button type="danger" @click="batchRemove" :disabled="this.sels.length===0">批量删除</el-button> <el-pagination layout="total, prev, pager, next" @current-change="handleCurrentChange" :page-size="10" :total="total" style="float:right;"> </el-pagination> </el-col> <!--新增界面--> <el-dialog :title="dialogMap[dialogStatus]" :visible.sync="addFormVisible" :close-on-click-modal="false"> <el-form :model="addForm" label-width="80px" ref="addForm" class="user-form"> <!-- <el-form-item label="所属公司" prop="companyId">--> <!-- <el-select v-model="addForm.companyId" filterable placeholder="请选择">--> <!-- <el-option--> <!-- v-for="item in options"--> <!-- :key="item.roleId"--> <!-- :label="item.roleName"--> <!-- :value="item.roleId">--> <!-- </el-option>--> <!-- </el-select>--> <!-- </el-form-item>--> <el-form-item label="ID"> <span>{{addForm.userId}}</span> </el-form-item> <el-row> <el-col :span="12"> <el-form-item label=" " prop="username" :rules="addFormRules.username"> <el-input v-model="addForm.username" aria-placeholder="用户名长度在5-11位,支持英文和数字"> <template slot="prepend">账 号</template> </el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label=" " prop="realname"> <el-input v-model="addForm.realname"> <template slot="prepend">姓 名</template> </el-input> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label=" " prop="password" :rules="dialogStatus==='update'?[{ required: false}]:addFormRules.password"> <el-input v-model="addForm.password" type="password" show-password :disabled="dialogStatus==='update'"> <template slot="prepend">密 码</template> </el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label=" " prop="checkPass" :rules="dialogStatus==='update'?[{ required: false}]:addFormRules.checkPass"> <el-input v-model="addForm.checkPass" type="password" show-password :disabled="dialogStatus==='update'"> <template slot="prepend">确认密码</template> </el-input> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label=" " prop="email"> <el-input v-model="addForm.email"> <template slot="prepend">Email </template> </el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label=" " prop="address"> <el-input v-model="addForm.address"> <template slot="prepend">地 址</template> </el-input> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label=" " prop="mobilephone"> <el-input v-model="addForm.mobilephone"> <template slot="prepend">电 话</template> </el-input> </el-form-item> </el-col> </el-row> <el-divider></el-divider> <el-row> <el-col :span="12"> <el-form-item label="性别" prop="sex"> <el-radio-group v-model="addForm.sex"> <el-radio class="radio" :label="1">男</el-radio> <el-radio class="radio" :label="0">女</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="启用" prop="state"> <el-radio-group v-model="addForm.state"> <el-radio class="radio" :label="true" >是</el-radio> <el-radio class="radio" :label="false" >否</el-radio> </el-radio-group> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="年龄" prop="age"> <el-input-number v-model="addForm.age" :min="0" :max="200"></el-input-number> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item lable="头像" prop="userface"> <el-upload class="avatar-uploader" action="http://127.0.0.1:7003/upload" :show-file-list="true" accept="image/jpeg,image/jpg,image/png" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" > <img v-if="faceImageUrl" :src="faceImageUrl" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </el-form-item> </el-col> </el-row> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click.native="addFormVisible = false">取消</el-button> <el-button type="primary" @click.native="dialogStatus==='create'?addSubmit():editSubmit()" :loading="addLoading">提交</el-button> </div> </el-dialog> <!--权限设置--> <el-dialog title="权限设置" :visible.sync="roleFormVisible" :close-on-click-modal="false"> <el-form :model="roleEditForm" label-width="80px" ref="roleEditForm" > <el-form-item label="ID"> <span>{{roleEditForm.userId}}</span> </el-form-item> <el-form-item label="账号"> <span>{{roleEditForm.username}}</span> </el-form-item> <el-tree :data="roles" :props="treeDefaultProps" default-expand-all show-checkbox highlight-current check-strictly node-key="roleId" ref="tree" @check-change="treeHandleCheckChange"> </el-tree> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click.native="roleFormVisible = false">取消</el-button> <el-button type="primary" @click.native="roleEditSubmit" :loading="addLoading">提交</el-button> </div> </el-dialog> </section> </template> <script> import util from '../../common/js/util' import NProgress from 'nprogress' import { getUserList, removeUser, batchRemoveUser, editUser, addUser, setUserRole } from '../../api/user'; import { getList} from '../../api/role_api'; import { getList as getRoleList} from '../../api/role_api'; import moment from 'moment' export default { name:'User', data() { var validatePass = (rule, value, callback) => { if (value === '') { callback(new Error('请输入密码')); } else { if (this.checkPass !== '') { this.$refs.addForm.validateField('checkPass'); } callback(); } }; return { filters: { userName: '', realName: '' }, treeDefaultProps: { children: 'children', label: 'roleName', }, dialogMap: { update: '编辑', create: '新增', }, dialogStatus: 'create', users: [], total: 0, pageNum: 1, pageSize: 10, faceImageUrl: '', listLoading: false, sels: [],//列表选中列 //编辑界面是否显示 addFormVisible: false,//新增界面是否显示 addLoading: false, addFormRules: { username: [ { required: true, message: '请输入姓名,用户名长度在5-11位,支持英文和数字', trigger: 'blur' }, ], password: [ { required: true, message: '请输入密码,用户名长度在6-18位,支持英文和数字和非空字符', trigger: 'blur'} ], checkPass: [ { required: true, message: '请输入密码,用户名长度在6-18位,支持英文和数字和非空字符', trigger: 'blur'} ] }, //用户角色配置 roleFormVisible: false, //新增界面数据 addForm: { checkPass:'', userId: 0, username: '', password: '', sex: 1, address: '', realname: '', email: '', mobilephone: '', age: 1, state: true }, roleEditForm: { userId: 1, username: "", roles: [] }, roles: [], roleIds: [], options: [], } }, methods: { //性别显示转换 formatSex: function (row, column) { return row.sex == 1 ? '男' : row.sex == 0 ? '女' : '未知'; }, formatState: function (row, column) { return row.state == true ? '是' : row.state == false ? '否' : '未知'; }, handleCurrentChange(val) { this.pageNum = val; this.getUsers(); }, //获取用户列表 getUsers:function() { let para = { pageNum: this.pageNum, pageSize: this.pageSize, userName: this.filters.userName, realName: this.filters.realName }; this.listLoading = true; getUserList(para).then((res) => { let response = res.data.data; this.total = response.total; this.users = response.list; this.listLoading = false; //NProgress.done(); }).catch((error) => { this.listLoading = false; this.$message.error(error.toString()); }); }, // 获取公司列表 getCompanyNmae(){ let para = { type: "公司" }; getRoleList(para).then((res) => { this.options = res.data.list; this.listLoading = false; //NProgress.done(); }).catch(() => { }); }, //删除 handleDel: function (index, row) { this.$confirm('确认删除该记录吗?', '提示', { type: 'warning' }).then(() => { this.listLoading = true; //NProgress.start(); let para = { userId: row.userId }; removeUser(para).then((res) => { this.listLoading = false; //NProgress.done(); this.$message({ message: '删除成功', type: 'success' }); this.getUsers(); }).catch((error) => { this.listLoading = false; alert(error); }); }).catch(); }, /** * 显示编辑界面 * @param index * @param row 为这行的数据对象 */ handleEdit: function (index, row) { this.addFormVisible = true; this.dialogStatus= 'update', this.addForm = Object.assign({}, row); }, roleEdit: function (index, row) { this.roleFormVisible = true; this.getRoles(); var _this = this; _this.roleIds = []; this.roleEditForm = Object.assign({}, row); let roles = this.roleEditForm.roles; if (util.checkNull(roles)){ roles.forEach(function (role,v_index,v_arr) { if (util.checkNull(role)) { _this.roleIds[v_index] = role.roleId; } }); } this.$nextTick(() => { //反向适配 this.$refs.tree.setCheckedKeys(this.roleIds); }); }, getRoles() { let para = { pageNum: 1, pageSize: 100 }; NProgress.start(); getList(para).then((res) => { this.roles = res.data.list; NProgress.done(); }).catch((error) => { if(null!= error.response && error.response!==undefined){ let status= error.response.status; let msg = error.response.statusText; alert(status+msg); }else { alert(error); } }); }, //显示新增界面,每次点开初始化数据 handleAdd: function () { this.addFormVisible = true; this.dialogStatus= 'create', this.addForm = { username: '', password: '', checkPass: '', sex: 1, address: '', realname: '', email: '', mobilephone: '', age: 1, state: true }; }, //编辑 editSubmit: function () { this.$refs.addForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.editLoading = true; //NProgress.start(); let para = Object.assign({}, this.addForm); //不需要提交的 去掉,后端不好接收 para.authorities = null; para.permissions = null; para.roles = null; this.$delete(para,'checkPass') // para.birth = (!para.birth || para.birth == '') ? '' : util.formatDate.format(new Date(para.birth), 'yyyy-MM-dd'); /* 查询之后格式this.filters.column.create_start_date中日期发生变化; Wed Aug 09 2017 00:00:00 GMT+0800 (中国标准时间) 变成了 "2017-08-08T16:00:00.000Z"; 所以使用 moment 日期格式化插件将时间转换成 [ Wed Aug 09 2017 00:00:00 GMT+0800 (中国标准时间) ] 格 式; */ /*moment 安装 npm install moment --save*/ // para.creattime = moment(para.creattime).format('YYYY-MM-DD HH:mm:ss'); this.editLoading = false; editUser(para).then((res) => { //NProgress.done(); this.$message({ message: '提交成功', type: 'success' }); this.$refs['addForm'].resetFields(); this.addFormVisible = false; this.getUsers(); }).catch(error => alert(error)); }); } }); }, //新增 addSubmit: function () { this.$refs.addForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.addLoading = true; let para = Object.assign({}, this.addForm); this.$delete(para,'checkPass') // para.birth = (!para.birth || para.birth == '') ? '' : util.formatDate.format(new Date(para.birth), 'yyyy-MM-dd'); addUser(para).then((res) => { this.addLoading = false; //NProgress.done(); this.$message({ message: '提交成功', type: 'success' }); this.$refs['addForm'].resetFields(); this.addFormVisible = false; this.getUsers(); }).catch(error => { this.addLoading = false; this.$message({ message: error.message, type: 'error' }); }); }); } }); }, selsChange: function (sels) { this.sels = sels; }, //批量删除 batchRemove: function () { var ids = this.sels.map(item => item.userId).toString(); this.$confirm('确认删除选中记录吗?', '提示', { type: 'warning' }).then(() => { this.listLoading = true; //NProgress.start(); let para = { ids: ids }; batchRemoveUser(para).then((res) => { this.listLoading = false; //NProgress.done(); this.$message({ message: '删除成功', type: 'success' }); this.getUsers(); }); }).catch(() => { }); }, roleEditSubmit: function () { this.$confirm('确认提交吗?', '提示', {}).then(() => { // this.editLoading = true; let userId = this.roleEditForm.userId; let roleIds = this.$refs.tree.getCheckedKeys(); let para = {userId,roleIds}; setUserRole(para).then((res) => { if (res.status ===200) { this.$message({ message: '岗位设置成功', type: 'success' }); } this.getUsers(); this.roleFormVisible = false; }).catch(err => { alert(err); }); console.log(para); }); }, handleAvatarSuccess: function(response){ this.faceImageUrl = 'http://127.0.0.1:7003/'+response.data; }, beforeAvatarUpload: function () { }, treeHandleCheckChange: function (data, checked, indeterminate) { if(checked) { this.roleIds.push(data.roleId); }else { this.roleIds.splice(this.roleIds.contains(data.roleId),1); } // console.log(data, checked, indeterminate); console.log(this.roleIds); } }, mounted() { this.getUsers(); // this.getCompanyNmae(); }, computed: { hideShow() {//当图片多于一张的时候,就隐藏上传框 return this.file === '' ? false : true } }, } </script> <style lang="scss"> .user-form{ .el-form-item__label{ font-size: 12px; } .el-form-item__content{ width: 260px; .el-textarea{ width:100%; } } } </style>