vue-element-admin/node_modules/.cache/vue-loader/1c1d13be3325cc5aef3731bd0dd0111c.json
2025-08-05 23:51:42 +08:00

1 line
18 KiB
JSON

{"remainingRequest":"/Users/kang/Gitea/vue-element-admin-i18n/node_modules/vue-loader/lib/index.js??vue-loader-options!/Users/kang/Gitea/vue-element-admin-i18n/src/views/permission/role.vue?vue&type=script&lang=js","dependencies":[{"path":"/Users/kang/Gitea/vue-element-admin-i18n/src/views/permission/role.vue","mtime":1599486365000},{"path":"/Users/kang/Gitea/vue-element-admin-i18n/node_modules/cache-loader/dist/cjs.js","mtime":1754408227855},{"path":"/Users/kang/Gitea/vue-element-admin-i18n/node_modules/babel-loader/lib/index.js","mtime":1754408228132},{"path":"/Users/kang/Gitea/vue-element-admin-i18n/node_modules/cache-loader/dist/cjs.js","mtime":1754408227855},{"path":"/Users/kang/Gitea/vue-element-admin-i18n/node_modules/vue-loader/lib/index.js","mtime":1754408228175}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnCmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJ0AvdXRpbHMnCmltcG9ydCB7IGdldFJvdXRlcywgZ2V0Um9sZXMsIGFkZFJvbGUsIGRlbGV0ZVJvbGUsIHVwZGF0ZVJvbGUgfSBmcm9tICdAL2FwaS9yb2xlJwppbXBvcnQgaTE4biBmcm9tICdAL2xhbmcnCgpjb25zdCBkZWZhdWx0Um9sZSA9IHsKICBrZXk6ICcnLAogIG5hbWU6ICcnLAogIGRlc2NyaXB0aW9uOiAnJywKICByb3V0ZXM6IFtdCn0KCmV4cG9ydCBkZWZhdWx0IHsKICBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgcm9sZTogT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJvbGUpLAogICAgICByb3V0ZXM6IFtdLAogICAgICByb2xlc0xpc3Q6IFtdLAogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgZGlhbG9nVHlwZTogJ25ldycsCiAgICAgIGNoZWNrU3RyaWN0bHk6IGZhbHNlLAogICAgICBkZWZhdWx0UHJvcHM6IHsKICAgICAgICBjaGlsZHJlbjogJ2NoaWxkcmVuJywKICAgICAgICBsYWJlbDogJ3RpdGxlJwogICAgICB9CiAgICB9CiAgfSwKICBjb21wdXRlZDogewogICAgcm91dGVzRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMucm91dGVzCiAgICB9CiAgfSwKICBjcmVhdGVkKCkgewogICAgLy8gTW9jazogZ2V0IGFsbCByb3V0ZXMgYW5kIHJvbGVzIGxpc3QgZnJvbSBzZXJ2ZXIKICAgIHRoaXMuZ2V0Um91dGVzKCkKICAgIHRoaXMuZ2V0Um9sZXMoKQogIH0sCiAgbWV0aG9kczogewogICAgYXN5bmMgZ2V0Um91dGVzKCkgewogICAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRSb3V0ZXMoKQogICAgICB0aGlzLnNlcnZpY2VSb3V0ZXMgPSByZXMuZGF0YQogICAgICBjb25zdCByb3V0ZXMgPSB0aGlzLmdlbmVyYXRlUm91dGVzKHJlcy5kYXRhKQogICAgICB0aGlzLnJvdXRlcyA9IHRoaXMuaTE4bihyb3V0ZXMpCiAgICB9LAogICAgYXN5bmMgZ2V0Um9sZXMoKSB7CiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldFJvbGVzKCkKICAgICAgdGhpcy5yb2xlc0xpc3QgPSByZXMuZGF0YQogICAgfSwKICAgIGkxOG4ocm91dGVzKSB7CiAgICAgIGNvbnN0IGFwcCA9IHJvdXRlcy5tYXAocm91dGUgPT4gewogICAgICAgIHJvdXRlLnRpdGxlID0gaTE4bi50KGByb3V0ZS4ke3JvdXRlLnRpdGxlfWApCiAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7CiAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IHRoaXMuaTE4bihyb3V0ZS5jaGlsZHJlbikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvdXRlCiAgICAgIH0pCiAgICAgIHJldHVybiBhcHAKICAgIH0sCiAgICAvLyBSZXNoYXBlIHRoZSByb3V0ZXMgc3RydWN0dXJlIHNvIHRoYXQgaXQgbG9va3MgdGhlIHNhbWUgYXMgdGhlIHNpZGViYXIKICAgIGdlbmVyYXRlUm91dGVzKHJvdXRlcywgYmFzZVBhdGggPSAnLycpIHsKICAgICAgY29uc3QgcmVzID0gW10KCiAgICAgIGZvciAobGV0IHJvdXRlIG9mIHJvdXRlcykgewogICAgICAgIC8vIHNraXAgc29tZSByb3V0ZQogICAgICAgIGlmIChyb3V0ZS5oaWRkZW4pIHsgY29udGludWUgfQoKICAgICAgICBjb25zdCBvbmx5T25lU2hvd2luZ0NoaWxkID0gdGhpcy5vbmx5T25lU2hvd2luZ0NoaWxkKHJvdXRlLmNoaWxkcmVuLCByb3V0ZSkKCiAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuICYmIG9ubHlPbmVTaG93aW5nQ2hpbGQgJiYgIXJvdXRlLmFsd2F5c1Nob3cpIHsKICAgICAgICAgIHJvdXRlID0gb25seU9uZVNob3dpbmdDaGlsZAogICAgICAgIH0KCiAgICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShiYXNlUGF0aCwgcm91dGUucGF0aCksCiAgICAgICAgICB0aXRsZTogcm91dGUubWV0YSAmJiByb3V0ZS5tZXRhLnRpdGxlCgogICAgICAgIH0KCiAgICAgICAgLy8gcmVjdXJzaXZlIGNoaWxkIHJvdXRlcwogICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikgewogICAgICAgICAgZGF0YS5jaGlsZHJlbiA9IHRoaXMuZ2VuZXJhdGVSb3V0ZXMocm91dGUuY2hpbGRyZW4sIGRhdGEucGF0aCkKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goZGF0YSkKICAgICAgfQogICAgICByZXR1cm4gcmVzCiAgICB9LAogICAgZ2VuZXJhdGVBcnIocm91dGVzKSB7CiAgICAgIGxldCBkYXRhID0gW10KICAgICAgcm91dGVzLmZvckVhY2gocm91dGUgPT4gewogICAgICAgIGRhdGEucHVzaChyb3V0ZSkKICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHsKICAgICAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLmdlbmVyYXRlQXJyKHJvdXRlLmNoaWxkcmVuKQogICAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMCkgewogICAgICAgICAgICBkYXRhID0gWy4uLmRhdGEsIC4uLnRlbXBdCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KQogICAgICByZXR1cm4gZGF0YQogICAgfSwKICAgIGhhbmRsZUFkZFJvbGUoKSB7CiAgICAgIHRoaXMucm9sZSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSb2xlKQogICAgICBpZiAodGhpcy4kcmVmcy50cmVlKSB7CiAgICAgICAgdGhpcy4kcmVmcy50cmVlLnNldENoZWNrZWROb2RlcyhbXSkKICAgICAgfQogICAgICB0aGlzLmRpYWxvZ1R5cGUgPSAnbmV3JwogICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlCiAgICB9LAogICAgaGFuZGxlRWRpdChzY29wZSkgewogICAgICB0aGlzLmRpYWxvZ1R5cGUgPSAnZWRpdCcKICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZQogICAgICB0aGlzLmNoZWNrU3RyaWN0bHkgPSB0cnVlCiAgICAgIHRoaXMucm9sZSA9IGRlZXBDbG9uZShzY29wZS5yb3cpCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsKICAgICAgICBjb25zdCByb3V0ZXMgPSB0aGlzLmdlbmVyYXRlUm91dGVzKHRoaXMucm9sZS5yb3V0ZXMpCiAgICAgICAgdGhpcy4kcmVmcy50cmVlLnNldENoZWNrZWROb2Rlcyh0aGlzLmdlbmVyYXRlQXJyKHJvdXRlcykpCiAgICAgICAgLy8gc2V0IGNoZWNrZWQgc3RhdGUgb2YgYSBub2RlIG5vdCBhZmZlY3RzIGl0cyBmYXRoZXIgYW5kIGNoaWxkIG5vZGVzCiAgICAgICAgdGhpcy5jaGVja1N0cmljdGx5ID0gZmFsc2UKICAgICAgfSkKICAgIH0sCiAgICBoYW5kbGVEZWxldGUoeyAkaW5kZXgsIHJvdyB9KSB7CiAgICAgIHRoaXMuJGNvbmZpcm0oJ0NvbmZpcm0gdG8gcmVtb3ZlIHRoZSByb2xlPycsICdXYXJuaW5nJywgewogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnQ29uZmlybScsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ0NhbmNlbCcsCiAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgIH0pCiAgICAgICAgLnRoZW4oYXN5bmMoKSA9PiB7CiAgICAgICAgICBhd2FpdCBkZWxldGVSb2xlKHJvdy5rZXkpCiAgICAgICAgICB0aGlzLnJvbGVzTGlzdC5zcGxpY2UoJGluZGV4LCAxKQogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgbWVzc2FnZTogJ0RlbGV0ZSBzdWNjZWQhJwogICAgICAgICAgfSkKICAgICAgICB9KQogICAgICAgIC5jYXRjaChlcnIgPT4geyBjb25zb2xlLmVycm9yKGVycikgfSkKICAgIH0sCiAgICBnZW5lcmF0ZVRyZWUocm91dGVzLCBiYXNlUGF0aCA9ICcvJywgY2hlY2tlZEtleXMpIHsKICAgICAgY29uc3QgcmVzID0gW10KCiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7CiAgICAgICAgY29uc3Qgcm91dGVQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VQYXRoLCByb3V0ZS5wYXRoKQoKICAgICAgICAvLyByZWN1cnNpdmUgY2hpbGQgcm91dGVzCiAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7CiAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IHRoaXMuZ2VuZXJhdGVUcmVlKHJvdXRlLmNoaWxkcmVuLCByb3V0ZVBhdGgsIGNoZWNrZWRLZXlzKQogICAgICAgIH0KCiAgICAgICAgaWYgKGNoZWNrZWRLZXlzLmluY2x1ZGVzKHJvdXRlUGF0aCkgfHwgKHJvdXRlLmNoaWxkcmVuICYmIHJvdXRlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSkgewogICAgICAgICAgcmVzLnB1c2gocm91dGUpCiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXMKICAgIH0sCiAgICBhc3luYyBjb25maXJtUm9sZSgpIHsKICAgICAgY29uc3QgaXNFZGl0ID0gdGhpcy5kaWFsb2dUeXBlID09PSAnZWRpdCcKCiAgICAgIGNvbnN0IGNoZWNrZWRLZXlzID0gdGhpcy4kcmVmcy50cmVlLmdldENoZWNrZWRLZXlzKCkKICAgICAgdGhpcy5yb2xlLnJvdXRlcyA9IHRoaXMuZ2VuZXJhdGVUcmVlKGRlZXBDbG9uZSh0aGlzLnNlcnZpY2VSb3V0ZXMpLCAnLycsIGNoZWNrZWRLZXlzKQoKICAgICAgaWYgKGlzRWRpdCkgewogICAgICAgIGF3YWl0IHVwZGF0ZVJvbGUodGhpcy5yb2xlLmtleSwgdGhpcy5yb2xlKQogICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnJvbGVzTGlzdC5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIGlmICh0aGlzLnJvbGVzTGlzdFtpbmRleF0ua2V5ID09PSB0aGlzLnJvbGUua2V5KSB7CiAgICAgICAgICAgIHRoaXMucm9sZXNMaXN0LnNwbGljZShpbmRleCwgMSwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yb2xlKSkKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhZGRSb2xlKHRoaXMucm9sZSkKICAgICAgICB0aGlzLnJvbGUua2V5ID0gZGF0YS5rZXkKICAgICAgICB0aGlzLnJvbGVzTGlzdC5wdXNoKHRoaXMucm9sZSkKICAgICAgfQoKICAgICAgY29uc3QgeyBkZXNjcmlwdGlvbiwga2V5LCBuYW1lIH0gPSB0aGlzLnJvbGUKICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gZmFsc2UKICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICB0aXRsZTogJ1N1Y2Nlc3MnLAogICAgICAgIGRhbmdlcm91c2x5VXNlSFRNTFN0cmluZzogdHJ1ZSwKICAgICAgICBtZXNzYWdlOiBgCiAgICAgICAgICAgIDxkaXY+Um9sZSBLZXk6ICR7a2V5fTwvZGl2PgogICAgICAgICAgICA8ZGl2PlJvbGUgTmFtZTogJHtuYW1lfTwvZGl2PgogICAgICAgICAgICA8ZGl2PkRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufTwvZGl2PgogICAgICAgICAgYCwKICAgICAgICB0eXBlOiAnc3VjY2VzcycKICAgICAgfSkKICAgIH0sCiAgICAvLyByZWZlcmVuY2U6IHNyYy92aWV3L2xheW91dC9jb21wb25lbnRzL1NpZGViYXIvU2lkZWJhckl0ZW0udnVlCiAgICBvbmx5T25lU2hvd2luZ0NoaWxkKGNoaWxkcmVuID0gW10sIHBhcmVudCkgewogICAgICBsZXQgb25seU9uZUNoaWxkID0gbnVsbAogICAgICBjb25zdCBzaG93aW5nQ2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pCgogICAgICAvLyBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIGNoaWxkIHJvdXRlLCB0aGUgY2hpbGQgcm91dGUgaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQKICAgICAgaWYgKHNob3dpbmdDaGlsZHJlbi5sZW5ndGggPT09IDEpIHsKICAgICAgICBvbmx5T25lQ2hpbGQgPSBzaG93aW5nQ2hpbGRyZW5bMF0KICAgICAgICBvbmx5T25lQ2hpbGQucGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnQucGF0aCwgb25seU9uZUNoaWxkLnBhdGgpCiAgICAgICAgcmV0dXJuIG9ubHlPbmVDaGlsZAogICAgICB9CgogICAgICAvLyBTaG93IHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gY2hpbGQgcm91dGUgdG8gZGlzcGxheQogICAgICBpZiAoc2hvd2luZ0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICAgIG9ubHlPbmVDaGlsZCA9IHsgLi4uIHBhcmVudCwgcGF0aDogJycsIG5vU2hvd2luZ0NoaWxkcmVuOiB0cnVlIH0KICAgICAgICByZXR1cm4gb25seU9uZUNoaWxkCiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZQogICAgfQogIH0KfQo="},{"version":3,"sources":["role.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;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;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","file":"role.vue","sourceRoot":"src/views/permission","sourcesContent":["<template>\n <div class=\"app-container\">\n <el-button type=\"primary\" @click=\"handleAddRole\">\n {{ $t('permission.addRole') }}\n </el-button>\n\n <el-table :data=\"rolesList\" style=\"width: 100%;margin-top:30px;\" border>\n <el-table-column align=\"center\" label=\"Role Key\" width=\"220\">\n <template slot-scope=\"scope\">\n {{ scope.row.key }}\n </template>\n </el-table-column>\n <el-table-column align=\"center\" label=\"Role Name\" width=\"220\">\n <template slot-scope=\"scope\">\n {{ scope.row.name }}\n </template>\n </el-table-column>\n <el-table-column align=\"header-center\" label=\"Description\">\n <template slot-scope=\"scope\">\n {{ scope.row.description }}\n </template>\n </el-table-column>\n <el-table-column align=\"center\" label=\"Operations\">\n <template slot-scope=\"scope\">\n <el-button type=\"primary\" size=\"small\" @click=\"handleEdit(scope)\">\n {{ $t('permission.editPermission') }}\n </el-button>\n <el-button type=\"danger\" size=\"small\" @click=\"handleDelete(scope)\">\n {{ $t('permission.delete') }}\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n\n <el-dialog :visible.sync=\"dialogVisible\" :title=\"dialogType==='edit'?'Edit Role':'New Role'\">\n <el-form :model=\"role\" label-width=\"80px\" label-position=\"left\">\n <el-form-item label=\"Name\">\n <el-input v-model=\"role.name\" placeholder=\"Role Name\" />\n </el-form-item>\n <el-form-item label=\"Desc\">\n <el-input\n v-model=\"role.description\"\n :autosize=\"{ minRows: 2, maxRows: 4}\"\n type=\"textarea\"\n placeholder=\"Role Description\"\n />\n </el-form-item>\n <el-form-item label=\"Menus\">\n <el-tree ref=\"tree\" :check-strictly=\"checkStrictly\" :data=\"routesData\" :props=\"defaultProps\" show-checkbox node-key=\"path\" class=\"permission-tree\" />\n </el-form-item>\n </el-form>\n <div style=\"text-align:right;\">\n <el-button type=\"danger\" @click=\"dialogVisible=false\">\n {{ $t('permission.cancel') }}\n </el-button>\n <el-button type=\"primary\" @click=\"confirmRole\">\n {{ $t('permission.confirm') }}\n </el-button>\n </div>\n </el-dialog>\n </div>\n</template>\n\n<script>\nimport path from 'path'\nimport { deepClone } from '@/utils'\nimport { getRoutes, getRoles, addRole, deleteRole, updateRole } from '@/api/role'\nimport i18n from '@/lang'\n\nconst defaultRole = {\n key: '',\n name: '',\n description: '',\n routes: []\n}\n\nexport default {\n data() {\n return {\n role: Object.assign({}, defaultRole),\n routes: [],\n rolesList: [],\n dialogVisible: false,\n dialogType: 'new',\n checkStrictly: false,\n defaultProps: {\n children: 'children',\n label: 'title'\n }\n }\n },\n computed: {\n routesData() {\n return this.routes\n }\n },\n created() {\n // Mock: get all routes and roles list from server\n this.getRoutes()\n this.getRoles()\n },\n methods: {\n async getRoutes() {\n const res = await getRoutes()\n this.serviceRoutes = res.data\n const routes = this.generateRoutes(res.data)\n this.routes = this.i18n(routes)\n },\n async getRoles() {\n const res = await getRoles()\n this.rolesList = res.data\n },\n i18n(routes) {\n const app = routes.map(route => {\n route.title = i18n.t(`route.${route.title}`)\n if (route.children) {\n route.children = this.i18n(route.children)\n }\n return route\n })\n return app\n },\n // Reshape the routes structure so that it looks the same as the sidebar\n generateRoutes(routes, basePath = '/') {\n const res = []\n\n for (let route of routes) {\n // skip some route\n if (route.hidden) { continue }\n\n const onlyOneShowingChild = this.onlyOneShowingChild(route.children, route)\n\n if (route.children && onlyOneShowingChild && !route.alwaysShow) {\n route = onlyOneShowingChild\n }\n\n const data = {\n path: path.resolve(basePath, route.path),\n title: route.meta && route.meta.title\n\n }\n\n // recursive child routes\n if (route.children) {\n data.children = this.generateRoutes(route.children, data.path)\n }\n res.push(data)\n }\n return res\n },\n generateArr(routes) {\n let data = []\n routes.forEach(route => {\n data.push(route)\n if (route.children) {\n const temp = this.generateArr(route.children)\n if (temp.length > 0) {\n data = [...data, ...temp]\n }\n }\n })\n return data\n },\n handleAddRole() {\n this.role = Object.assign({}, defaultRole)\n if (this.$refs.tree) {\n this.$refs.tree.setCheckedNodes([])\n }\n this.dialogType = 'new'\n this.dialogVisible = true\n },\n handleEdit(scope) {\n this.dialogType = 'edit'\n this.dialogVisible = true\n this.checkStrictly = true\n this.role = deepClone(scope.row)\n this.$nextTick(() => {\n const routes = this.generateRoutes(this.role.routes)\n this.$refs.tree.setCheckedNodes(this.generateArr(routes))\n // set checked state of a node not affects its father and child nodes\n this.checkStrictly = false\n })\n },\n handleDelete({ $index, row }) {\n this.$confirm('Confirm to remove the role?', 'Warning', {\n confirmButtonText: 'Confirm',\n cancelButtonText: 'Cancel',\n type: 'warning'\n })\n .then(async() => {\n await deleteRole(row.key)\n this.rolesList.splice($index, 1)\n this.$message({\n type: 'success',\n message: 'Delete succed!'\n })\n })\n .catch(err => { console.error(err) })\n },\n generateTree(routes, basePath = '/', checkedKeys) {\n const res = []\n\n for (const route of routes) {\n const routePath = path.resolve(basePath, route.path)\n\n // recursive child routes\n if (route.children) {\n route.children = this.generateTree(route.children, routePath, checkedKeys)\n }\n\n if (checkedKeys.includes(routePath) || (route.children && route.children.length >= 1)) {\n res.push(route)\n }\n }\n return res\n },\n async confirmRole() {\n const isEdit = this.dialogType === 'edit'\n\n const checkedKeys = this.$refs.tree.getCheckedKeys()\n this.role.routes = this.generateTree(deepClone(this.serviceRoutes), '/', checkedKeys)\n\n if (isEdit) {\n await updateRole(this.role.key, this.role)\n for (let index = 0; index < this.rolesList.length; index++) {\n if (this.rolesList[index].key === this.role.key) {\n this.rolesList.splice(index, 1, Object.assign({}, this.role))\n break\n }\n }\n } else {\n const { data } = await addRole(this.role)\n this.role.key = data.key\n this.rolesList.push(this.role)\n }\n\n const { description, key, name } = this.role\n this.dialogVisible = false\n this.$notify({\n title: 'Success',\n dangerouslyUseHTMLString: true,\n message: `\n <div>Role Key: ${key}</div>\n <div>Role Name: ${name}</div>\n <div>Description: ${description}</div>\n `,\n type: 'success'\n })\n },\n // reference: src/view/layout/components/Sidebar/SidebarItem.vue\n onlyOneShowingChild(children = [], parent) {\n let onlyOneChild = null\n const showingChildren = children.filter(item => !item.hidden)\n\n // When there is only one child route, the child route is displayed by default\n if (showingChildren.length === 1) {\n onlyOneChild = showingChildren[0]\n onlyOneChild.path = path.resolve(parent.path, onlyOneChild.path)\n return onlyOneChild\n }\n\n // Show parent if there are no child route to display\n if (showingChildren.length === 0) {\n onlyOneChild = { ... parent, path: '', noShowingChildren: true }\n return onlyOneChild\n }\n\n return false\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-container {\n .roles-table {\n margin-top: 30px;\n }\n .permission-tree {\n margin-bottom: 30px;\n }\n}\n</style>\n"]}]}