执行过npm install命令的vue-element-admin源码
康凯
2022-05-20 aa4c235a8ca67ea8b731f90c951a465e92c0a865
1
{"remainingRequest":"D:\\源码\\vue-element-admin-master\\node_modules\\babel-loader\\lib\\index.js!D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\源码\\vue-element-admin-master\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\源码\\vue-element-admin-master\\src\\views\\permission\\role.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\源码\\vue-element-admin-master\\src\\views\\permission\\role.vue","mtime":1649647926000},{"path":"D:\\源码\\vue-element-admin-master\\babel.config.js","mtime":1649647926000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovXHU2RTkwXHU3ODAxL3Z1ZS1lbGVtZW50LWFkbWluLW1hc3Rlci9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSAiRDovXHU2RTkwXHU3ODAxL3Z1ZS1lbGVtZW50LWFkbWluLW1hc3Rlci9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIgZnJvbSAiRDovXHU2RTkwXHU3ODAxL3Z1ZS1lbGVtZW50LWFkbWluLW1hc3Rlci9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlci5qcyI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICJEOi9cdTZFOTBcdTc4MDEvdnVlLWVsZW1lbnQtYWRtaW4tbWFzdGVyL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnOwppbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tICdAL3V0aWxzJzsKaW1wb3J0IHsgZ2V0Um91dGVzIGFzIF9nZXRSb3V0ZXMsIGdldFJvbGVzIGFzIF9nZXRSb2xlcywgYWRkUm9sZSwgZGVsZXRlUm9sZSwgdXBkYXRlUm9sZSB9IGZyb20gJ0AvYXBpL3JvbGUnOwp2YXIgZGVmYXVsdFJvbGUgPSB7CiAga2V5OiAnJywKICBuYW1lOiAnJywKICBkZXNjcmlwdGlvbjogJycsCiAgcm91dGVzOiBbXQp9OwpleHBvcnQgZGVmYXVsdCB7CiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIHJvbGU6IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSb2xlKSwKICAgICAgcm91dGVzOiBbXSwKICAgICAgcm9sZXNMaXN0OiBbXSwKICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsCiAgICAgIGRpYWxvZ1R5cGU6ICduZXcnLAogICAgICBjaGVja1N0cmljdGx5OiBmYWxzZSwKICAgICAgZGVmYXVsdFByb3BzOiB7CiAgICAgICAgY2hpbGRyZW46ICdjaGlsZHJlbicsCiAgICAgICAgbGFiZWw6ICd0aXRsZScKICAgICAgfQogICAgfTsKICB9LAogIGNvbXB1dGVkOiB7CiAgICByb3V0ZXNEYXRhOiBmdW5jdGlvbiByb3V0ZXNEYXRhKCkgewogICAgICByZXR1cm4gdGhpcy5yb3V0ZXM7CiAgICB9CiAgfSwKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgLy8gTW9jazogZ2V0IGFsbCByb3V0ZXMgYW5kIHJvbGVzIGxpc3QgZnJvbSBzZXJ2ZXIKICAgIHRoaXMuZ2V0Um91dGVzKCk7CiAgICB0aGlzLmdldFJvbGVzKCk7CiAgfSwKICBtZXRob2RzOiB7CiAgICBnZXRSb3V0ZXM6IGZ1bmN0aW9uIGdldFJvdXRlcygpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgdmFyIHJlczsKICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBfZ2V0Um91dGVzKCk7CgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJlcyA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICBfdGhpcy5zZXJ2aWNlUm91dGVzID0gcmVzLmRhdGE7CiAgICAgICAgICAgICAgICBfdGhpcy5yb3V0ZXMgPSBfdGhpcy5nZW5lcmF0ZVJvdXRlcyhyZXMuZGF0YSk7CgogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSkoKTsKICAgIH0sCiAgICBnZXRSb2xlczogZnVuY3Rpb24gZ2V0Um9sZXMoKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CiAgICAgICAgdmFyIHJlczsKICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIF9nZXRSb2xlcygpOwoKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXMgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgIF90aGlzMi5yb2xlc0xpc3QgPSByZXMuZGF0YTsKCiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgfSkpKCk7CiAgICB9LAogICAgLy8gUmVzaGFwZSB0aGUgcm91dGVzIHN0cnVjdHVyZSBzbyB0aGF0IGl0IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBzaWRlYmFyCiAgICBnZW5lcmF0ZVJvdXRlczogZnVuY3Rpb24gZ2VuZXJhdGVSb3V0ZXMocm91dGVzKSB7CiAgICAgIHZhciBiYXNlUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJy8nOwogICAgICB2YXIgcmVzID0gW107CgogICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocm91dGVzKSwKICAgICAgICAgIF9zdGVwOwoKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICAgICAgdmFyIHJvdXRlID0gX3N0ZXAudmFsdWU7CgogICAgICAgICAgLy8gc2tpcCBzb21lIHJvdXRlCiAgICAgICAgICBpZiAocm91dGUuaGlkZGVuKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBvbmx5T25lU2hvd2luZ0NoaWxkID0gdGhpcy5vbmx5T25lU2hvd2luZ0NoaWxkKHJvdXRlLmNoaWxkcmVuLCByb3V0ZSk7CgogICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuICYmIG9ubHlPbmVTaG93aW5nQ2hpbGQgJiYgIXJvdXRlLmFsd2F5c1Nob3cpIHsKICAgICAgICAgICAgcm91dGUgPSBvbmx5T25lU2hvd2luZ0NoaWxkOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICBwYXRoOiBwYXRoLnJlc29sdmUoYmFzZVBhdGgsIHJvdXRlLnBhdGgpLAogICAgICAgICAgICB0aXRsZTogcm91dGUubWV0YSAmJiByb3V0ZS5tZXRhLnRpdGxlCiAgICAgICAgICB9OyAvLyByZWN1cnNpdmUgY2hpbGQgcm91dGVzCgogICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7CiAgICAgICAgICAgIGRhdGEuY2hpbGRyZW4gPSB0aGlzLmdlbmVyYXRlUm91dGVzKHJvdXRlLmNoaWxkcmVuLCBkYXRhLnBhdGgpOwogICAgICAgICAgfQoKICAgICAgICAgIHJlcy5wdXNoKGRhdGEpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICB9CgogICAgICByZXR1cm4gcmVzOwogICAgfSwKICAgIGdlbmVyYXRlQXJyOiBmdW5jdGlvbiBnZW5lcmF0ZUFycihyb3V0ZXMpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgICB2YXIgZGF0YSA9IFtdOwogICAgICByb3V0ZXMuZm9yRWFjaChmdW5jdGlvbiAocm91dGUpIHsKICAgICAgICBkYXRhLnB1c2gocm91dGUpOwoKICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHsKICAgICAgICAgIHZhciB0ZW1wID0gX3RoaXMzLmdlbmVyYXRlQXJyKHJvdXRlLmNoaWxkcmVuKTsKCiAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGRhdGEgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGRhdGEpLCBfdG9Db25zdW1hYmxlQXJyYXkodGVtcCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfSwKICAgIGhhbmRsZUFkZFJvbGU6IGZ1bmN0aW9uIGhhbmRsZUFkZFJvbGUoKSB7CiAgICAgIHRoaXMucm9sZSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSb2xlKTsKCiAgICAgIGlmICh0aGlzLiRyZWZzLnRyZWUpIHsKICAgICAgICB0aGlzLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZE5vZGVzKFtdKTsKICAgICAgfQoKICAgICAgdGhpcy5kaWFsb2dUeXBlID0gJ25ldyc7CiAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICB9LAogICAgaGFuZGxlRWRpdDogZnVuY3Rpb24gaGFuZGxlRWRpdChzY29wZSkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIHRoaXMuZGlhbG9nVHlwZSA9ICdlZGl0JzsKICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgdGhpcy5jaGVja1N0cmljdGx5ID0gdHJ1ZTsKICAgICAgdGhpcy5yb2xlID0gZGVlcENsb25lKHNjb3BlLnJvdyk7CiAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcm91dGVzID0gX3RoaXM0LmdlbmVyYXRlUm91dGVzKF90aGlzNC5yb2xlLnJvdXRlcyk7CgogICAgICAgIF90aGlzNC4kcmVmcy50cmVlLnNldENoZWNrZWROb2RlcyhfdGhpczQuZ2VuZXJhdGVBcnIocm91dGVzKSk7IC8vIHNldCBjaGVja2VkIHN0YXRlIG9mIGEgbm9kZSBub3QgYWZmZWN0cyBpdHMgZmF0aGVyIGFuZCBjaGlsZCBub2RlcwoKCiAgICAgICAgX3RoaXM0LmNoZWNrU3RyaWN0bHkgPSBmYWxzZTsKICAgICAgfSk7CiAgICB9LAogICAgaGFuZGxlRGVsZXRlOiBmdW5jdGlvbiBoYW5kbGVEZWxldGUoX3JlZikgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKCiAgICAgIHZhciAkaW5kZXggPSBfcmVmLiRpbmRleCwKICAgICAgICAgIHJvdyA9IF9yZWYucm93OwogICAgICB0aGlzLiRjb25maXJtKCdDb25maXJtIHRvIHJlbW92ZSB0aGUgcm9sZT8nLCAnV2FybmluZycsIHsKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ0NvbmZpcm0nLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICdDYW5jZWwnLAogICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICB9KS50aGVuKCAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHsKICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZVJvbGUocm93LmtleSk7CgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIF90aGlzNS5yb2xlc0xpc3Quc3BsaWNlKCRpbmRleCwgMSk7CgogICAgICAgICAgICAgICAgX3RoaXM1LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRGVsZXRlIHN1Y2NlZCEnCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUzKTsKICAgICAgfSkpKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICB9KTsKICAgIH0sCiAgICBnZW5lcmF0ZVRyZWU6IGZ1bmN0aW9uIGdlbmVyYXRlVHJlZShyb3V0ZXMpIHsKICAgICAgdmFyIGJhc2VQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnLyc7CiAgICAgIHZhciBjaGVja2VkS2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOwogICAgICB2YXIgcmVzID0gW107CgogICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHJvdXRlcyksCiAgICAgICAgICBfc3RlcDI7CgogICAgICB0cnkgewogICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7CiAgICAgICAgICB2YXIgcm91dGUgPSBfc3RlcDIudmFsdWU7CiAgICAgICAgICB2YXIgcm91dGVQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VQYXRoLCByb3V0ZS5wYXRoKTsgLy8gcmVjdXJzaXZlIGNoaWxkIHJvdXRlcwoKICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikgewogICAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IHRoaXMuZ2VuZXJhdGVUcmVlKHJvdXRlLmNoaWxkcmVuLCByb3V0ZVBhdGgsIGNoZWNrZWRLZXlzKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoY2hlY2tlZEtleXMuaW5jbHVkZXMocm91dGVQYXRoKSB8fCByb3V0ZS5jaGlsZHJlbiAmJiByb3V0ZS5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICAgICAgICByZXMucHVzaChyb3V0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3IyLmYoKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlczsKICAgIH0sCiAgICBjb25maXJtUm9sZTogZnVuY3Rpb24gY29uZmlybVJvbGUoKSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwoKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoKSB7CiAgICAgICAgdmFyIGlzRWRpdCwgY2hlY2tlZEtleXMsIGluZGV4LCBfeWllbGQkYWRkUm9sZSwgZGF0YSwgX3RoaXM2JHJvbGUsIGRlc2NyaXB0aW9uLCBrZXksIG5hbWU7CgogICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpc0VkaXQgPSBfdGhpczYuZGlhbG9nVHlwZSA9PT0gJ2VkaXQnOwogICAgICAgICAgICAgICAgY2hlY2tlZEtleXMgPSBfdGhpczYuJHJlZnMudHJlZS5nZXRDaGVja2VkS2V5cygpOwogICAgICAgICAgICAgICAgX3RoaXM2LnJvbGUucm91dGVzID0gX3RoaXM2LmdlbmVyYXRlVHJlZShkZWVwQ2xvbmUoX3RoaXM2LnNlcnZpY2VSb3V0ZXMpLCAnLycsIGNoZWNrZWRLZXlzKTsKCiAgICAgICAgICAgICAgICBpZiAoIWlzRWRpdCkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE2OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDY7CiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUm9sZShfdGhpczYucm9sZS5rZXksIF90aGlzNi5yb2xlKTsKCiAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgaW5kZXggPSAwOwoKICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICBpZiAoIShpbmRleCA8IF90aGlzNi5yb2xlc0xpc3QubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIShfdGhpczYucm9sZXNMaXN0W2luZGV4XS5rZXkgPT09IF90aGlzNi5yb2xlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxMTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgX3RoaXM2LnJvbGVzTGlzdC5zcGxpY2UoaW5kZXgsIDEsIE9iamVjdC5hc3NpZ24oe30sIF90aGlzNi5yb2xlKSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoImJyZWFrIiwgMTQpOwoKICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxODsKICAgICAgICAgICAgICAgIHJldHVybiBhZGRSb2xlKF90aGlzNi5yb2xlKTsKCiAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgIF95aWVsZCRhZGRSb2xlID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgICAgICBkYXRhID0gX3lpZWxkJGFkZFJvbGUuZGF0YTsKICAgICAgICAgICAgICAgIF90aGlzNi5yb2xlLmtleSA9IGRhdGEua2V5OwoKICAgICAgICAgICAgICAgIF90aGlzNi5yb2xlc0xpc3QucHVzaChfdGhpczYucm9sZSk7CgogICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICBfdGhpczYkcm9sZSA9IF90aGlzNi5yb2xlLCBkZXNjcmlwdGlvbiA9IF90aGlzNiRyb2xlLmRlc2NyaXB0aW9uLCBrZXkgPSBfdGhpczYkcm9sZS5rZXksIG5hbWUgPSBfdGhpczYkcm9sZS5uYW1lOwogICAgICAgICAgICAgICAgX3RoaXM2LmRpYWxvZ1Zpc2libGUgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICBfdGhpczYuJG5vdGlmeSh7CiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnU3VjY2VzcycsCiAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5VXNlSFRNTFN0cmluZzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlxuICAgICAgICAgICAgPGRpdj5Sb2xlIEtleTogIi5jb25jYXQoa2V5LCAiPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlJvbGUgTmFtZTogIikuY29uY2F0KG5hbWUsICI8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+RGVzY3JpcHRpb246ICIpLmNvbmNhdChkZXNjcmlwdGlvbiwgIjwvZGl2PlxuICAgICAgICAgICIpLAogICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWU0KTsKICAgICAgfSkpKCk7CiAgICB9LAogICAgLy8gcmVmZXJlbmNlOiBzcmMvdmlldy9sYXlvdXQvY29tcG9uZW50cy9TaWRlYmFyL1NpZGViYXJJdGVtLnZ1ZQogICAgb25seU9uZVNob3dpbmdDaGlsZDogZnVuY3Rpb24gb25seU9uZVNob3dpbmdDaGlsZCgpIHsKICAgICAgdmFyIGNoaWxkcmVuID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTsKICAgICAgdmFyIHBhcmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOwogICAgICB2YXIgb25seU9uZUNoaWxkID0gbnVsbDsKICAgICAgdmFyIHNob3dpbmdDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIHJldHVybiAhaXRlbS5oaWRkZW47CiAgICAgIH0pOyAvLyBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIGNoaWxkIHJvdXRlLCB0aGUgY2hpbGQgcm91dGUgaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQKCiAgICAgIGlmIChzaG93aW5nQ2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgb25seU9uZUNoaWxkID0gc2hvd2luZ0NoaWxkcmVuWzBdOwogICAgICAgIG9ubHlPbmVDaGlsZC5wYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudC5wYXRoLCBvbmx5T25lQ2hpbGQucGF0aCk7CiAgICAgICAgcmV0dXJuIG9ubHlPbmVDaGlsZDsKICAgICAgfSAvLyBTaG93IHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gY2hpbGQgcm91dGUgdG8gZGlzcGxheQoKCiAgICAgIGlmIChzaG93aW5nQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgb25seU9uZUNoaWxkID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwYXJlbnQpLCB7fSwgewogICAgICAgICAgcGF0aDogJycsCiAgICAgICAgICBub1Nob3dpbmdDaGlsZHJlbjogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBvbmx5T25lQ2hpbGQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn07"},{"version":3,"mappings":"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","names":["key","name","description","routes","data","role","rolesList","dialogVisible","dialogType","checkStrictly","defaultProps","children","label","computed","routesData","created","methods","getRoutes","res","getRoles","generateRoutes","route","path","title","generateArr","handleAddRole","handleEdit","scope","handleDelete","confirmButtonText","cancelButtonText","type","then","deleteRole","message","catch","console","generateTree","confirmRole","isEdit","checkedKeys","updateRole","index","addRole","dangerouslyUseHTMLString","onlyOneShowingChild","onlyOneChild","noShowingChildren"],"sourceRoot":"src/views/permission","sources":["role.vue"],"sourcesContent":["<template>\n  <div class=\"app-container\">\n    <el-button type=\"primary\" @click=\"handleAddRole\">New Role</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)\">Edit</el-button>\n          <el-button type=\"danger\" size=\"small\" @click=\"handleDelete(scope)\">Delete</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\n            ref=\"tree\"\n            :check-strictly=\"checkStrictly\"\n            :data=\"routesData\"\n            :props=\"defaultProps\"\n            show-checkbox\n            node-key=\"path\"\n            class=\"permission-tree\"\n          />\n        </el-form-item>\n      </el-form>\n      <div style=\"text-align:right;\">\n        <el-button type=\"danger\" @click=\"dialogVisible=false\">Cancel</el-button>\n        <el-button type=\"primary\" @click=\"confirmRole\">Confirm</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'\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      this.routes = this.generateRoutes(res.data)\n    },\n    async getRoles() {\n      const res = await getRoles()\n      this.rolesList = res.data\n    },\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"]}]}