| 1 |
- {"remainingRequest":"/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/node_modules/vue-loader/lib/index.js??vue-loader-options!/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/src/views/system/menu/index.vue?vue&type=script&lang=js&","dependencies":[{"path":"/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/src/views/system/menu/index.vue","mtime":1625514688900},{"path":"/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/node_modules/cache-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/node_modules/babel-loader/lib/index.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/node_modules/cache-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2022060801/addons/admin/node_modules/vue-loader/lib/index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgVHJlZXNlbGVjdCBmcm9tICdAcmlvcGhhZS92dWUtdHJlZXNlbGVjdCcgIC8vIOS4i+aLieagkQ0KaW1wb3J0ICdAcmlvcGhhZS92dWUtdHJlZXNlbGVjdC9kaXN0L3Z1ZS10cmVlc2VsZWN0LmNzcycNCmltcG9ydCB7IG1hcEdldHRlcnMgfSBmcm9tICJ2dWV4IjsNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogIlN5c01lbnUiLA0KICBjb21wb25lbnRzOiB7VHJlZXNlbGVjdH0sDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIGxvYWRpbmc6IHRydWUsICAvLyDliqDovb3nirbmgIENCiAgICAgIGRhdGE6IFtdLCAgLy8g5YiX6KGo5pWw5o2uDQogICAgICB3aGVyZToge30sICAvLyDmkJzntKLmnaHku7YNCiAgICAgIHNob3dFZGl0OiBmYWxzZSwgIC8vIOaYr+WQpuaYvuekuuihqOWNleW8ueeqlw0KICAgICAgZm9ybToge30sICAvLyDooajljZXmlbDmja4NCiAgICAgIHJ1bGVzOiB7ICAvLyDooajljZXpqozor4Hop4TliJkNCiAgICAgICAgdGl0bGU6IFsNCiAgICAgICAgICB7cmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXoj5zljZXlkI3np7AnLCB0cmlnZ2VyOiAnYmx1cid9DQogICAgICAgIF0sDQogICAgICAgIHNvcnQ6IFsNCiAgICAgICAgICB7cmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXmjpLluo/lj7cnLCB0cmlnZ2VyOiAnYmx1cid9DQogICAgICAgIF0NCiAgICAgIH0sDQogICAgICBwZXJtaXNzaW9uTGlzdDogWw0KICAgICAgICB7DQogICAgICAgICAga2V5OiAxLA0KICAgICAgICAgIGxhYmVsOiBg5p+l6K+iYCwNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIGtleTogNSwNCiAgICAgICAgICBsYWJlbDogYOa3u+WKoGAsDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICBrZXk6IDEwLA0KICAgICAgICAgIGxhYmVsOiBg5L+u5pS5YCwNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIGtleTogMTUsDQogICAgICAgICAgbGFiZWw6IGDliKDpmaRgLA0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAga2V5OiAyMCwNCiAgICAgICAgICBsYWJlbDogYOeKtuaAgWAsDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICBrZXk6IDI1LA0KICAgICAgICAgIGxhYmVsOiBg5om56YeP5Yig6ZmkYCwNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIGtleTogMzAsDQogICAgICAgICAgbGFiZWw6IGDlhajpg6jlsZXlvIBgLA0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAga2V5OiAzNSwNCiAgICAgICAgICBsYWJlbDogYOWFqOmDqOaKmOWPoGAsDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICBrZXk6IDQwLA0KICAgICAgICAgIGxhYmVsOiBg5re75Yqg5a2Q57qnYCwNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIGtleTogNDUsDQogICAgICAgICAgbGFiZWw6IGDlr7zlh7rmlbDmja5gLA0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAga2V5OiA1MCwNCiAgICAgICAgICBsYWJlbDogYOWvvOWFpeaVsOaNrmAsDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICBrZXk6IDU1LA0KICAgICAgICAgIGxhYmVsOiBg5YiG6YWN5p2D6ZmQYCwNCiAgICAgICAgfQ0KICAgICAgXSwNCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiB7DQogICAgLi4ubWFwR2V0dGVycyhbInBlcm1pc3Npb24iXSksDQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5xdWVyeSgpOw0KICB9LA0KICBtZXRob2RzOiB7DQogICAgLyog5p+l6K+iICovDQogICAgcXVlcnkoKSB7DQogICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOw0KICAgICAgdGhpcy53aGVyZVsncGlkJ10gPSAwOw0KICAgICAgdGhpcy4kbWVzc2FnZS5jbG9zZUFsbCgpDQogICAgICB0aGlzLiRodHRwLmdldCgnL21lbnUvaW5kZXgnLCB7cGFyYW1zOiB0aGlzLndoZXJlfSkudGhlbihyZXMgPT4gew0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsNCiAgICAgICAgaWYgKHJlcy5kYXRhLmNvZGUgPT09IDApIHsNCiAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLiR1dGlsLnRvVHJlZURhdGEocmVzLmRhdGEuZGF0YSwgJ2lkJywgJ3BpZCcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IocmVzLmRhdGEubXNnIHx8ICfojrflj5bmlbDmja7lpLHotKUnKTsNCiAgICAgICAgfQ0KICAgICAgfSkuY2F0Y2goZSA9PiB7DQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOw0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKGUubWVzc2FnZSk7DQogICAgICB9KTsNCiAgICB9LA0KICAgIC8qKg0KICAgICAqIOW8guatpeWKoOi9veaVsOaNrg0KICAgICAqLw0KICAgIGxvYWQodHJlZSwgdHJlZU5vZGUsIHJlc29sdmUpIHsNCiAgICAgIHRoaXMud2hlcmVbJ3BpZCddID0gdHJlZS5pZDsNCiAgICAgIHRoaXMuJG1lc3NhZ2UuY2xvc2VBbGwoKQ0KICAgICAgdGhpcy4kaHR0cC5nZXQoJy9tZW51L2luZGV4Jywge3BhcmFtczogdGhpcy53aGVyZX0pLnRoZW4ocmVzID0+IHsNCiAgICAgICAgaWYgKHJlcy5kYXRhLmNvZGUgPT09IDApIHsNCiAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhLmRhdGEpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMuZGF0YS5tc2cpOw0KICAgICAgICB9DQogICAgICB9KS5jYXRjaChlID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlLm1lc3NhZ2UpOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvKiDmmL7npLrmt7vliqAgKi8NCiAgICBhZGQocm93KSB7DQogICAgICB0aGlzLmZvcm0gPSB7dHlwZTogMCwgc3RhdHVzOiAxLCBwaWQ6IHJvdyA/IHJvdy5pZCA6IG51bGwsdGFyZ2V0OidfYmxhbmsnfTsNCiAgICAgIHRoaXMuc2hvd0VkaXQgPSB0cnVlOw0KICAgIH0sDQogICAgLyog5pi+56S657yW6L6RICovDQogICAgZWRpdChyb3cpIHsNCiAgICAgIHRoaXMuJG1lc3NhZ2UuY2xvc2VBbGwoKQ0KICAgICAgdGhpcy4kaHR0cC5nZXQoJy9tZW51L2luZm8/aWQ9JyArIHJvdy5pZCkudGhlbihyZXMgPT4gew0KICAgICAgICBpZiAocmVzLmRhdGEuY29kZSA9PT0gMCkgew0KICAgICAgICAgIHRoaXMuZm9ybSA9IHJlcy5kYXRhLmRhdGE7DQogICAgICAgICAgdGhpcy5zaG93RWRpdCA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMuZGF0YS5tc2cpOw0KICAgICAgICB9DQogICAgICB9KS5jYXRjaChlID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlLm1lc3NhZ2UpOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvKiDkv53lrZjnvJbovpEgKi8NCiAgICBzYXZlKCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS5jbG9zZUFsbCgpDQogICAgICB0aGlzLiRyZWZzWydlZGl0Rm9ybSddLnZhbGlkYXRlKCh2YWxpZCkgPT4gew0KICAgICAgICBpZiAodmFsaWQpIHsNCiAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh7bG9jazogdHJ1ZX0pOw0KICAgICAgICAgIHRoaXMuJGh0dHAucG9zdCgnL21lbnUvZWRpdCcsDQogICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZm9ybSwge3BpZDogdGhpcy5mb3JtLnBpZCB8fCAwfSkNCiAgICAgICAgICApLnRoZW4ocmVzID0+IHsNCiAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsNCiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5jb2RlID09PSAwKSB7DQogICAgICAgICAgICAgIHRoaXMuc2hvd0VkaXQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7dHlwZTogJ3N1Y2Nlc3MnLCBtZXNzYWdlOiByZXMuZGF0YS5tc2d9KTsNCiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5pZCkgew0KICAgICAgICAgICAgICAgIC8vIOabtOaWsOaVsOaNrg0KICAgICAgICAgICAgICAgIHRoaXMuJHV0aWwuZWFjaFRyZWVEYXRhKHRoaXMuZGF0YSwgaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pZCA9PT0gdGhpcy5mb3JtLmlkKSB7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgdGhpcy5mb3JtKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMuZGF0YS5tc2cpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pLmNhdGNoKGUgPT4gew0KICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOw0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlLm1lc3NhZ2UpOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfSwNCiAgICAvKiDliKDpmaQgKi8NCiAgICByZW1vdmUocm93KSB7DQogICAgICB0aGlzLiRtZXNzYWdlLmNsb3NlQWxsKCkNCiAgICAgIGlmIChyb3cuY2hpbGRyZW4gJiYgcm93LmNoaWxkcmVuLmxlbmd0aCA+IDApIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7flhYjliKDpmaTlrZDoioLngrknKTsNCiAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHtsb2NrOiB0cnVlfSk7DQogICAgICB0aGlzLiRodHRwLnBvc3QoJy9tZW51L2RlbGV0ZScsIHtpZDpyb3cuaWR9KS50aGVuKHJlcyA9PiB7DQogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsNCiAgICAgICAgaWYgKHJlcy5kYXRhLmNvZGUgPT09IDApIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnc3VjY2VzcycsIG1lc3NhZ2U6IHJlcy5kYXRhLm1zZ30pOw0KICAgICAgICAgIC8vIOWIoOmZpOaVsOaNrg0KICAgICAgICAgIHRoaXMuJHV0aWwuZWFjaFRyZWVEYXRhKHRoaXMuZGF0YSwgaXRlbSA9PiB7DQogICAgICAgICAgICBpZiAoaXRlbS5pZCA9PT0gcm93LnBpZCAmJiB0eXBlb2YgKGl0ZW0uY2hpbGRyZW4pICE9ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICAgIGl0ZW0uY2hpbGRyZW4uc3BsaWNlKGl0ZW0uY2hpbGRyZW4uZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gcm93LmlkKSwgMSk7DQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKHJlcy5kYXRhLm1zZyk7DQogICAgICAgIH0NCiAgICAgIH0pLmNhdGNoKGUgPT4gew0KICAgICAgICBsb2FkaW5nLmNsb3NlKCk7DQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZS5tZXNzYWdlKTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgLyoqDQogICAgICog5bGV5byA5YWo6YOoDQogICAgICovDQogICAgZXhwZW5kQWxsKCl7DQogICAgICB0aGlzLmRhdGEuZm9yRWFjaChkID0+IHsNCiAgICAgICAgdGhpcy4kcmVmcy50YWJsZS50b2dnbGVSb3dFeHBhbnNpb24oZCwgdHJ1ZSk7DQogICAgICB9KTsNCiAgICB9LA0KICAgIC8qKg0KICAgICAqIOaKmOWPoOWFqOmDqA0KICAgICAqLw0KICAgIGZvbGRBbGwoKXsNCiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGQgPT4gew0KICAgICAgICB0aGlzLiRyZWZzLnRhYmxlLnRvZ2dsZVJvd0V4cGFuc2lvbihkLCBmYWxzZSk7DQogICAgICB9KTsNCiAgICB9DQogIH0NCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/system/menu","sourcesContent":["<template>\r\n <div class=\"ele-body\">\r\n <el-card shadow=\"never\">\r\n <!-- 搜索表单 -->\r\n <el-form :model=\"where\" label-width=\"77px\" class=\"ele-form-search\" @keyup.enter.native=\"query\"\r\n @submit.native.prevent>\r\n <el-row :gutter=\"15\">\r\n <el-col :md=\"6\" :sm=\"12\">\r\n <el-form-item label=\"菜单名称:\">\r\n <el-input v-model=\"where.title\" placeholder=\"请输入菜单名称\" clearable/>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :md=\"9\" :sm=\"12\">\r\n <div class=\"ele-form-actions\">\r\n <el-button type=\"primary\" @click=\"query\" icon=\"el-icon-search\" class=\"ele-btn-icon\">查询</el-button>\r\n <el-button @click=\"add()\" type=\"primary\" icon=\"el-icon-plus\" class=\"ele-btn-icon\" v-if=\"permission.includes('sys:menu:add')\">添加</el-button>\r\n <el-button @click=\"expendAll()\" type=\"success\" icon=\"el-icon-_fold\" class=\"ele-btn-icon\" v-if=\"permission.includes('sys:menu:expand')\">展开全部</el-button>\r\n <el-button @click=\"foldAll()\" type=\"warning\" icon=\"el-icon-_unfold\" class=\"ele-btn-icon\" v-if=\"permission.includes('sys:menu:collapse')\">折叠全部</el-button>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <!-- 数据表格 -->\r\n <el-table ref=\"table\" :data=\"data\" v-loading=\"loading\" row-key=\"id\" default-expand-all border\r\n height=\"calc(100vh - 215px)\" highlight-current-row lazy\r\n :load=\"load\"\r\n :tree-props=\"{children: 'children', hasChildren: 'hasChildren'}\">\r\n <el-table-column label=\"编号\" type=\"index\" width=\"60\" align=\"center\" fixed=\"left\"/>\r\n <el-table-column label=\"菜单名称\" show-overflow-tooltip min-width=\"200\" fixed=\"left\">\r\n <template slot-scope=\"{row}\"><i :class=\"row.icon\"/> {{ row.title }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"path\" label=\"路由地址\" show-overflow-tooltip min-width=\"150\"/>\r\n <el-table-column prop=\"component\" label=\"组件路径\" show-overflow-tooltip min-width=\"150\"/>\r\n <el-table-column prop=\"permission\" label=\"权限标识\" show-overflow-tooltip min-width=\"150\"/>\r\n <el-table-column prop=\"status\" label=\"状态\" sortable min-width=\"100\">\r\n <template slot-scope=\"{row}\">\r\n <ele-dot :type=\"['danger', 'success'][row.status]\" :ripple=\"row.status===0\"\r\n :text=\"['禁用','正常'][row.status]\"/>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"类型\" width=\"60px\" align=\"center\">\r\n <template slot-scope=\"{row}\">\r\n <el-tag :type=\"['primary','success'][row.type]\" size=\"mini\">{{ ['菜单', '按钮'][row.type] }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"sort\" label=\"排序\" width=\"60px\" align=\"center\"/>\r\n <el-table-column label=\"创建时间\" show-overflow-tooltip min-width=\"160\" align=\"center\">\r\n <template slot-scope=\"{row}\">{{ row.create_time | toDateString }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"190px\" align=\"center\" :resizable=\"false\" fixed=\"right\">\r\n <template slot-scope=\"{row}\">\r\n <el-link @click=\"add(row)\" icon=\"el-icon-plus\" type=\"primary\" :underline=\"false\" v-if=\"permission.includes('sys:menu:addz')\">添加</el-link>\r\n <el-link @click=\"edit(row)\" icon=\"el-icon-edit\" type=\"primary\" :underline=\"false\" v-if=\"permission.includes('sys:menu:edit')\">修改</el-link>\r\n <el-popconfirm title=\"确定要删除此菜单吗?\" @confirm=\"remove(row)\" class=\"ele-action\">\r\n <el-link slot=\"reference\" icon=\"el-icon-delete\" type=\"danger\" :underline=\"false\" v-if=\"permission.includes('sys:menu:delete')\">删除</el-link>\r\n </el-popconfirm>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </el-card>\r\n <!-- 编辑弹窗 -->\r\n <el-dialog :title=\"form.id?'修改菜单':'添加菜单'\" :visible.sync=\"showEdit\" width=\"800px\"\r\n @closed=\"form={}\" :destroy-on-close=\"true\" custom-class=\"ele-dialog-form\" :lock-scroll=\"false\">\r\n <el-form :model=\"form\" ref=\"editForm\" :rules=\"rules\" label-width=\"82px\" @keyup.enter.native=\"save\"\r\n @submit.native.prevent>\r\n <el-row :gutter=\"15\">\r\n <el-col :sm=\"12\">\r\n <el-form-item label=\"菜单名称:\" prop=\"title\">\r\n <el-input v-model=\"form.title\" placeholder=\"请输入菜单名称\" clearable/>\r\n </el-form-item>\r\n <el-form-item label=\"路由地址:\">\r\n <el-input v-model=\"form.path\" placeholder=\"请输入路由地址\" clearable/>\r\n </el-form-item>\r\n <el-form-item label=\"权限标识:\">\r\n <el-input v-model=\"form.permission\" placeholder=\"请输入权限标识\" clearable/>\r\n </el-form-item>\r\n <el-form-item label=\"菜单类型:\">\r\n <el-radio-group v-model=\"form.type\">\r\n <el-radio :label=\"0\">菜单</el-radio>\r\n <el-radio :label=\"1\">按钮</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n <el-form-item label=\"打开方式:\">\r\n <el-radio-group v-model=\"form.target\">\r\n <el-radio :label=\"'_self'\">内部打开</el-radio>\r\n <el-radio :label=\"'_blank'\">外部打开</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :sm=\"12\">\r\n <el-form-item label=\"菜单图标:\">\r\n <ele-icon-picker v-model=\"form.icon\" placeholder=\"请选择菜单图标\"/>\r\n </el-form-item>\r\n <el-form-item label=\"组件路径:\">\r\n <el-input v-model=\"form.component\" placeholder=\"请输入组件路径\" clearable/>\r\n </el-form-item>\r\n <el-form-item label=\"上级菜单:\">\r\n <treeselect v-model=\"form.pid\" :options=\"data\" placeholder=\"请选择上级菜单\" :defaultExpandLevel=\"3\"\r\n :normalizer=\"(d)=>{return { id: d.id, label: d.title,children:d.children||undefined }}\"/>\r\n </el-form-item>\r\n <el-form-item label=\"菜单状态:\">\r\n <el-radio-group v-model=\"form.status\">\r\n <el-radio :label=\"1\">正常</el-radio>\r\n <el-radio :label=\"2\">禁用</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n <el-form-item label=\"排序号:\" prop=\"sort\">\r\n <el-input-number v-model=\"form.sort\" controls-position=\"right\" :min=\"0\"\r\n placeholder=\"请输入排序号\" class=\"ele-fluid ele-text-left\"/>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-form-item label=\"权限节点:\" v-if=\"form.type==0\">\r\n <el-transfer \r\n v-model=\"form.checkedList\" \r\n :data=\"permissionList\" \r\n :titles=\"['全部节点', '已赋予节点']\"\r\n ></el-transfer>\r\n </el-form-item>\r\n <el-form-item label=\"备注:\">\r\n <el-input v-model=\"form.note\" placeholder=\"请输入备注\" :rows=\"3\" type=\"textarea\"/>\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"showEdit=false\">取消</el-button> \r\n <el-button type=\"primary\" @click=\"save\">保存</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport Treeselect from '@riophae/vue-treeselect' // 下拉树\r\nimport '@riophae/vue-treeselect/dist/vue-treeselect.css'\r\nimport { mapGetters } from \"vuex\";\r\nexport default {\r\n name: \"SysMenu\",\r\n components: {Treeselect},\r\n data() {\r\n return {\r\n loading: true, // 加载状态\r\n data: [], // 列表数据\r\n where: {}, // 搜索条件\r\n showEdit: false, // 是否显示表单弹窗\r\n form: {}, // 表单数据\r\n rules: { // 表单验证规则\r\n title: [\r\n {required: true, message: '请输入菜单名称', trigger: 'blur'}\r\n ],\r\n sort: [\r\n {required: true, message: '请输入排序号', trigger: 'blur'}\r\n ]\r\n },\r\n permissionList: [\r\n {\r\n key: 1,\r\n label: `查询`,\r\n },\r\n {\r\n key: 5,\r\n label: `添加`,\r\n },\r\n {\r\n key: 10,\r\n label: `修改`,\r\n },\r\n {\r\n key: 15,\r\n label: `删除`,\r\n },\r\n {\r\n key: 20,\r\n label: `状态`,\r\n },\r\n {\r\n key: 25,\r\n label: `批量删除`,\r\n },\r\n {\r\n key: 30,\r\n label: `全部展开`,\r\n },\r\n {\r\n key: 35,\r\n label: `全部折叠`,\r\n },\r\n {\r\n key: 40,\r\n label: `添加子级`,\r\n },\r\n {\r\n key: 45,\r\n label: `导出数据`,\r\n },\r\n {\r\n key: 50,\r\n label: `导入数据`,\r\n },\r\n {\r\n key: 55,\r\n label: `分配权限`,\r\n }\r\n ],\r\n }\r\n },\r\n computed: {\r\n ...mapGetters([\"permission\"]),\r\n },\r\n mounted() {\r\n this.query();\r\n },\r\n methods: {\r\n /* 查询 */\r\n query() {\r\n this.loading = true;\r\n this.where['pid'] = 0;\r\n this.$message.closeAll()\r\n this.$http.get('/menu/index', {params: this.where}).then(res => {\r\n this.loading = false;\r\n if (res.data.code === 0) {\r\n this.data = this.$util.toTreeData(res.data.data, 'id', 'pid');\r\n } else {\r\n this.$message.error(res.data.msg || '获取数据失败');\r\n }\r\n }).catch(e => {\r\n this.loading = false;\r\n this.$message.error(e.message);\r\n });\r\n },\r\n /**\r\n * 异步加载数据\r\n */\r\n load(tree, treeNode, resolve) {\r\n this.where['pid'] = tree.id;\r\n this.$message.closeAll()\r\n this.$http.get('/menu/index', {params: this.where}).then(res => {\r\n if (res.data.code === 0) {\r\n resolve(res.data.data)\r\n } else {\r\n this.$message.error(res.data.msg);\r\n }\r\n }).catch(e => {\r\n this.$message.error(e.message);\r\n });\r\n },\r\n /* 显示添加 */\r\n add(row) {\r\n this.form = {type: 0, status: 1, pid: row ? row.id : null,target:'_blank'};\r\n this.showEdit = true;\r\n },\r\n /* 显示编辑 */\r\n edit(row) {\r\n this.$message.closeAll()\r\n this.$http.get('/menu/info?id=' + row.id).then(res => {\r\n if (res.data.code === 0) {\r\n this.form = res.data.data;\r\n this.showEdit = true;\r\n } else {\r\n this.$message.error(res.data.msg);\r\n }\r\n }).catch(e => {\r\n this.$message.error(e.message);\r\n });\r\n },\r\n /* 保存编辑 */\r\n save() {\r\n this.$message.closeAll()\r\n this.$refs['editForm'].validate((valid) => {\r\n if (valid) {\r\n const loading = this.$loading({lock: true});\r\n this.$http.post('/menu/edit',\r\n Object.assign({}, this.form, {pid: this.form.pid || 0})\r\n ).then(res => {\r\n loading.close();\r\n if (res.data.code === 0) {\r\n this.showEdit = false;\r\n this.$message({type: 'success', message: res.data.msg});\r\n if (this.form.id) {\r\n // 更新数据\r\n this.$util.eachTreeData(this.data, item => {\r\n if (item.id === this.form.id) {\r\n Object.assign(item, this.form);\r\n return false;\r\n }\r\n });\r\n } else {\r\n this.query();\r\n }\r\n } else {\r\n this.$message.error(res.data.msg);\r\n }\r\n }).catch(e => {\r\n loading.close();\r\n this.$message.error(e.message);\r\n });\r\n } else {\r\n return false;\r\n }\r\n });\r\n },\r\n /* 删除 */\r\n remove(row) {\r\n this.$message.closeAll()\r\n if (row.children && row.children.length > 0) return this.$message.error('请先删除子节点');\r\n const loading = this.$loading({lock: true});\r\n this.$http.post('/menu/delete', {id:row.id}).then(res => {\r\n loading.close();\r\n if (res.data.code === 0) {\r\n this.$message({type: 'success', message: res.data.msg});\r\n // 删除数据\r\n this.$util.eachTreeData(this.data, item => {\r\n if (item.id === row.pid && typeof (item.children) != 'undefined') {\r\n item.children.splice(item.children.findIndex(d => d.id === row.id), 1);\r\n return false;\r\n }\r\n });\r\n } else {\r\n this.$message.error(res.data.msg);\r\n }\r\n }).catch(e => {\r\n loading.close();\r\n this.$message.error(e.message);\r\n });\r\n },\r\n /**\r\n * 展开全部\r\n */\r\n expendAll(){\r\n this.data.forEach(d => {\r\n this.$refs.table.toggleRowExpansion(d, true);\r\n });\r\n },\r\n /**\r\n * 折叠全部\r\n */\r\n foldAll(){\r\n this.data.forEach(d => {\r\n this.$refs.table.toggleRowExpansion(d, false);\r\n });\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n\r\n</style>"]}]}
|