<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.name" placeholder="权限名称"> <template slot="prepend">权限名称</template> </el-input> </el-form-item> <el-form-item> <el-button type="primary" v-on:click="getTableList()" 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="tableList" highlight-current-row v-loading="listLoading" @selection-change="selsChange" tooltip-effect="dark" style="border-radius: 10px 10px 0px 0px;line-height: 25px" height="600px" :header-cell-style="{background:'#6F8294',color:'#FFFFFF'}" size="small" row-key="permissionId" border :row-class-name="tableRowClassName" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" > <el-table-column type="selection" width="55"> </el-table-column> <!--<el-table-column type="index" width="60">--> <!--</el-table-column>--> <el-table-column prop="permissionId" label="ID" width="130" sortable> </el-table-column> <el-table-column prop="name" label="权限名称" min-width="150" sortable> </el-table-column> <!-- <el-table-column prop="description" label="描述" min-width="120" sortable>--> <!-- </el-table-column>--> <el-table-column prop="ismenu" label="是否目录" width="100" :formatter="formatState" sortable> </el-table-column> <el-table-column prop="path" label="访问路径" width="300" sortable> </el-table-column> <el-table-column prop="permissionOrder" label="排序" width="100" sortable> </el-table-column> <el-table-column label="操作" align="center" width="230" fixed="right"> <template slot-scope="scope"> <el-button type="success" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> <el-button type="warning" @click="handleEdit(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="pageSize" :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="110px" :rules="addFormRules" ref="addForm"> <el-form-item label="ID"> <span>{{addForm.permissionId}}</span> </el-form-item> <el-row :gutter="20"> <el-col :span="8"> <el-form-item label="权限名称" prop="name"> <el-input v-model="addForm.name" auto-complete="off" placeholder="请输入权限名称:例如:用户新增权限"></el-input> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="权限描述" prop="description"> <el-input v-model="addForm.description" auto-complete="off" placeholder="请输入权限描述:例如:用户管理员"></el-input> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="图标" prop="iconCls"> <el-input v-model="addForm.iconCls" auto-complete="off" placeholder="element icon图标名称"></el-input> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col> <el-form-item label="菜单访问路径" prop="path"> <el-input v-model="addForm.path" auto-complete="off" placeholder="设置为前端router的path值"></el-input> <!-- <el-cascader-panel--> <!-- v-model="addForm.path"--> <!-- :options="cascaderOptions"--> <!-- :props="pannelProps"--> <!-- ></el-cascader-panel>--> </el-form-item> </el-col> </el-row> <el-form-item label="接口访问路径" prop="url"> <el-input v-model="addForm.url" auto-complete="off" placeholder="设置为后端微服务路径:例如:/cloud-user-center/user/update"></el-input> <el-cascader-panel v-model="addForm.url" :options="tableList" :props="pannelUrlProps" ></el-cascader-panel> </el-form-item> <el-row :gutter="20"> <el-col :span="8"> <el-form-item label="权限排序" prop="permissionOrder"> <el-input placeholder="请输入权限排序,如001" v-model="addForm.permissionOrder" clearable> </el-input> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="设置权限上级" prop="parentId"> <el-input v-model="addForm.parentId" auto-complete="off" placeholder="请输入或者选择适配权限"></el-input> </el-form-item> </el-col> <el-col :span="8"> <el-button type="info" size="mini" @click="drawer = true">设置权限上级</el-button> </el-col> </el-row> <el-form-item label="是否目录" prop="ismenu"> <el-switch v-model="addForm.ismenu" active-color="#13ce66" inactive-color="#ff4949" active-text="是" inactive-text="否" > </el-switch> </el-form-item> <el-form-item label="是否隐藏" prop="hidden"> <el-switch v-model="addForm.hidden" active-color="#13ce66" inactive-color="#ff4949" active-text="是" inactive-text="否" > </el-switch> </el-form-item> </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-drawer title="设置权限上级" :visible.sync="drawer" append-to-body withHeader> <el-row> <el-col :span="7" :offset="1"> <span style="color:#E6A23C">不设置为顶级权限</span> </el-col> <el-col :span="8" > <el-button type="primary" @click.native="treeMerge(false)">合并节点</el-button> </el-col> <el-col :span="8"> <el-button type="primary" @click.native="treeMerge(true)">展开节点</el-button> </el-col> </el-row> <el-tree :data="tableList" :props="treeDefaultProps" @check="clickDeal" :default-expand-all = "treeExpand" show-checkbox highlight-current check-strictly node-key="permissionId" ref="tree"> </el-tree> </el-drawer> </section> </template> <script> import util from '../../common/js/util' //import NProgress from 'nprogress' import { getList, remove, batchRemove, edit, add } from '../../api/perm_api'; import moment from 'moment' export default { name:'Perm', data() { return { filters: { name: '' }, cascaderOptions:[], tableList: [], total: 0, pageNum: 1, pageSize: 500, listLoading: false, sels: [],//列表选中列 treeDefaultProps: { children: 'children', label: 'name', }, pannelProps: { children: 'children', label: 'name', value: 'path', checkStrictly: true, }, pannelUrlProps: { children: 'children', label: 'name', value: 'url', checkStrictly: true, emitPath: false }, treeExpand: true, addFormVisible: false,//新增界面是否显示 dialogMap: { update: '编辑', create: '新增', }, dialogStatus: 'create', drawer: false, addLoading: false, addFormRules: { name: [ { required: true, message: '请输入权限名称', trigger: 'blur' } ], path: [ { required: true, message: '请输入总路径', trigger: 'blur' } ], url: [ { required: true, message: '请输入权限路径', trigger: 'blur' } ], permissionOrder: [ { required: true, message: '请输入排序字段', trigger: 'blur' } ] }, //新增界面数据 addForm: { permissionId:'', description: '', name: '', url: '', path: '', parentId: 0, ismenu: true, permissionOrder: '0', chidren: [], component: '', method: '*', hidden: false, iconCls:'' } } }, methods: { //性别显示转换 formatSex: function (row, column) { return row.sex == 1 ? '男' : row.sex == 0 ? '女' : '未知'; }, formatState: function (row, column) { return row.ismenu == true ? '是' : row.ismenu == false ? '否' : '未知'; }, handleCurrentChange(val) { this.pageNum = val; this.getTableList(); }, //获取列表 getTableList() { let para = { pageNum: this.pageNum, pageSize: this.pageSize, name: this.filters.name }; this.listLoading = true; //NProgress.start(); getList(para).then((res) => { this.total = res.data.total; this.tableList = res.data.list; this.listLoading = false; //NProgress.done(); }).catch((error) => { this.listLoading = false; if(null!= error.response && error.response!==undefined){ let status= error.response.status; let msg = error.response.statusText; alert(status+msg); }else { alert(error); } }); }, //删除 handleDel: function (index, row) { this.$confirm('确认删除该记录吗?', '提示', { type: 'warning' }).then(() => { this.listLoading = true; //NProgress.start(); let para = { permissionId: row.permissionId }; remove(para).then((res) => { this.listLoading = false; //NProgress.done(); this.$message({ message: '删除成功', type: 'success' }); this.getTableList(); }).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); }, //显示新增界面,每次点开初始化数据 handleAdd: function () { this.addFormVisible = true; this.dialogStatus= 'create', this.addForm = { description: '', name: '', url: '', path: '', parentId: 0, ismenu: '', permissionOrder:'0' }; }, //编辑 editSubmit: function () { this.$refs.addForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.addLoading = true; //NProgress.start(); let para = Object.assign({}, this.addForm); para.creattime = moment(para.creattime).format('YYYY-MM-DD HH:mm:ss'); this.addLoading = false; edit(para).then((res) => { //NProgress.done(); this.$message({ message: '提交成功', type: 'success' }); this.$refs['addForm'].resetFields(); this.addFormVisible = false; this.getTableList(); }).catch(error => alert(error)); }); } }); }, //新增 addSubmit: function () { this.$refs.addForm.validate((valid) => { if (valid) { this.$confirm('确认提交吗?', '提示', {}).then(() => { this.addLoading = true; //NProgress.start(); let para = Object.assign({}, this.addForm); para.birth = (!para.birth || para.birth == '') ? '' : util.formatDate.format(new Date(para.birth), 'yyyy-MM-dd'); add(para).then((res) => { this.addLoading = false; //NProgress.done(); this.$message({ message: '提交成功', type: 'success' }); this.$refs['addForm'].resetFields(); this.addFormVisible = false; this.getTableList(); }).catch(error => alert(error)); }); } }); }, selsChange: function (sels) { this.sels = sels; }, //批量删除 batchRemove: function () { var ids = this.sels.map(item => item.permissionId); this.$confirm('确认删除选中记录吗?', '提示', { type: 'warning' }).then(() => { this.listLoading = true; //NProgress.start(); // let para = { ids: ids }; batchRemove(ids).then((response) => { let res = response.data; if (res.code !== '200') { return this.$message.error(res.msg); } //NProgress.done(); this.$message({ message: '删除成功', type: 'success' }); this.getTableList(); }); }).catch((err) => { this.$message.error(err); }).finally(() => { this.listLoading = false; }); }, showDrawer: function(){ this.drawer = true; this.$nextTick(() => { //反向适配 this.$refs.tree.setCheckedKeys([this.addForm.parentId]); }); }, clickDeal: function (currentObj, treeStatus) { this.addForm.parentId = currentObj.permissionId; this.$refs.tree.setCheckedKeys([currentObj.permissionId]); // this.drawer = false; }, treeMerge: function (expand) { this.treeExpand = expand; for(var i=0;i<this.$refs.tree.store._getAllNodes().length;i++){ this.$refs.tree.store._getAllNodes()[i].expanded=this.treeExpand; } }, tableRowClassName({row, rowIndex}) { if (row.parentId === 0 || row.ismenu) { return 'warning-row'; } else { return 'success-row'; } return ''; } }, mounted() { this.getTableList(); // this.cascaderOptions = this.$router.options.routes; } } </script> <style rel="stylesheet/scss" lang="scss"> .el-drawer.rtl { overflow: scroll } .el-row{ .el-col { margin-right: 0px; } } .el-table .warning-row { background: oldlace; } .el-table .success-row { background: #f0f9eb; } </style>