Files
education/frontend/node_modules/.cache/vue-loader/04b997c4500e188bb89343391d89324a.json
T

1 line
39 KiB
JSON

{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\components\\TreePanel\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\components\\TreePanel\\index.vue","mtime":1787567871522},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js","mtime":1787309793790}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICJUcmVlU2lkZWJhciIsDQogIHByb3BzOiB7DQogICAgLy8g5qCR5b2i5pWw5o2uDQogICAgdHJlZURhdGE6IHsNCiAgICAgIHR5cGU6IEFycmF5LA0KICAgICAgZGVmYXVsdDogKCkgPT4gW10NCiAgICB9LA0KICAgIC8vIOagh+mimA0KICAgIHRpdGxlOiB7DQogICAgICB0eXBlOiBTdHJpbmcsDQogICAgICBkZWZhdWx0OiAn5qCR5b2i57uT5p6EJw0KICAgIH0sDQogICAgLy8g5qCH6aKY5Zu+5qCH57G75ZCNDQogICAgdGl0bGVJY29uQ2xhc3M6IHsNCiAgICAgIHR5cGU6IFN0cmluZywNCiAgICAgIGRlZmF1bHQ6ICdlbC1pY29uLW9mZmljZS1idWlsZGluZycNCiAgICB9LA0KICAgIC8vIOaYr+WQpuaYvuekuuaQnOe0ouahhg0KICAgIHNob3dTZWFyY2g6IHsNCiAgICAgIHR5cGU6IEJvb2xlYW4sDQogICAgICBkZWZhdWx0OiB0cnVlDQogICAgfSwNCiAgICAvLyDmkJzntKLmoYbljaDkvY3nrKYNCiAgICBzZWFyY2hQbGFjZWhvbGRlcjogew0KICAgICAgdHlwZTogU3RyaW5nLA0KICAgICAgZGVmYXVsdDogJ+ivt+i+k+WFpeWQjeensCcNCiAgICB9LA0KICAgIC8vIOaYr+WQpum7mOiupOaUtui1t+S+p+i+ueagjw0KICAgIGRlZmF1bHRDb2xsYXBzZWQ6IHsNCiAgICAgIHR5cGU6IEJvb2xlYW4sDQogICAgICBkZWZhdWx0OiBmYWxzZQ0KICAgIH0sDQogICAgLy8g5qCR6YWN572u6aG5DQogICAgdHJlZVByb3BzOiB7DQogICAgICB0eXBlOiBPYmplY3QsDQogICAgICBkZWZhdWx0OiAoKSA9PiAoew0KICAgICAgICBjaGlsZHJlbjogImNoaWxkcmVuIiwNCiAgICAgICAgbGFiZWw6ICJsYWJlbCINCiAgICAgIH0pDQogICAgfSwNCiAgICAvLyDoioLngrnllK/kuIDmoIfor4blrZfmrrUNCiAgICBub2RlS2V5OiB7DQogICAgICB0eXBlOiBTdHJpbmcsDQogICAgICBkZWZhdWx0OiAnaWQnDQogICAgfSwNCiAgICAvLyDmmK/lkKblnKjngrnlh7voioLngrnml7blsZXlvIDmiJbmlLbotbcNCiAgICBleHBhbmRPbkNsaWNrTm9kZTogew0KICAgICAgdHlwZTogQm9vbGVhbiwNCiAgICAgIGRlZmF1bHQ6IGZhbHNlDQogICAgfSwNCiAgICAvLyDmmK/lkKbmmL7npLrlpI3pgInmoYYNCiAgICBzaG93Q2hlY2tib3g6IHsNCiAgICAgIHR5cGU6IEJvb2xlYW4sDQogICAgICBkZWZhdWx0OiBmYWxzZQ0KICAgIH0sDQogICAgLy8g5piv5ZCm5Lil5qC855qE6YG15b6q54i25a2Q5LiN5LqS55u45YWz6IGUDQogICAgY2hlY2tTdHJpY3RseTogew0KICAgICAgdHlwZTogQm9vbGVhbiwNCiAgICAgIGRlZmF1bHQ6IGZhbHNlDQogICAgfSwNCiAgICAvLyDmmK/lkKbpu5jorqTlsZXlvIDmiYDmnInoioLngrkNCiAgICBkZWZhdWx0RXhwYW5kQWxsOiB7DQogICAgICB0eXBlOiBCb29sZWFuLA0KICAgICAgZGVmYXVsdDogZmFsc2UNCiAgICB9LA0KICAgIC8vIOm7mOiupOWxleW8gOeahOiKgueCueeahGtleeaVsOe7hA0KICAgIGRlZmF1bHRFeHBhbmRlZEtleXM6IHsNCiAgICAgIHR5cGU6IEFycmF5LA0KICAgICAgZGVmYXVsdDogKCkgPT4gW10NCiAgICB9LA0KICAgIC8vIOm7mOiupOWuveW6pg0KICAgIGRlZmF1bHRXaWR0aDogew0KICAgICAgdHlwZTogTnVtYmVyLA0KICAgICAgZGVmYXVsdDogMjIwDQogICAgfSwNCiAgICAvLyDmlLbotbfml7bnmoTlrr3luqYNCiAgICBjb2xsYXBzZWRXaWR0aDogew0KICAgICAgdHlwZTogTnVtYmVyLA0KICAgICAgZGVmYXVsdDogMjANCiAgICB9LA0KICAgIC8vIOacgOWwj+WuveW6pg0KICAgIG1pbldpZHRoOiB7DQogICAgICB0eXBlOiBOdW1iZXIsDQogICAgICBkZWZhdWx0OiAxODANCiAgICB9LA0KICAgIC8vIOacgOWkp+WuveW6pg0KICAgIG1heFdpZHRoOiB7DQogICAgICB0eXBlOiBOdW1iZXIsDQogICAgICBkZWZhdWx0OiA0MDANCiAgICB9LA0KICAgIC8vIOacrOWcsOWtmOWCqOeahOWuveW6pmtleQ0KICAgIHN0b3JhZ2VLZXk6IHsNCiAgICAgIHR5cGU6IFN0cmluZywNCiAgICAgIGRlZmF1bHQ6ICd0cmVlLXNpZGViYXItd2lkdGgnDQogICAgfSwNCiAgICAvLyDmmK/lkKblkK/nlKjmnKzlnLDlrZjlgqjlrr3luqYNCiAgICBlbmFibGVTdG9yYWdlOiB7DQogICAgICB0eXBlOiBCb29sZWFuLA0KICAgICAgZGVmYXVsdDogdHJ1ZQ0KICAgIH0sDQogICAgLy8g6Ieq5a6a5LmJ6L+H5ruk5pa55rOVDQogICAgZmlsdGVyTWV0aG9kOiB7DQogICAgICB0eXBlOiBGdW5jdGlvbiwNCiAgICAgIGRlZmF1bHQ6IG51bGwNCiAgICB9DQogIH0sDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIHNlYXJjaEtleXdvcmQ6ICIiLA0KICAgICAgY29sbGFwc2VkOiB0aGlzLmRlZmF1bHRDb2xsYXBzZWQsDQogICAgICBzaWRlYmFyV2lkdGg6IHRoaXMuZGVmYXVsdENvbGxhcHNlZCA/IHRoaXMuY29sbGFwc2VkV2lkdGggOiB0aGlzLmRlZmF1bHRXaWR0aCwNCiAgICAgIGlzUmVzaXppbmc6IGZhbHNlLA0KICAgICAgc3RhcnRYOiAwLA0KICAgICAgc3RhcnRXaWR0aDogMCwNCiAgICAgIHNhdmVXaWR0aFRpbWVyOiBudWxsLA0KICAgICAgcmFmSWQ6IG51bGwsDQogICAgICBpc0xvYWRpbmdGcm9tU3RvcmFnZTogZmFsc2UsDQogICAgICBleHBhbmRlZEFsbDogdGhpcy5kZWZhdWx0RXhwYW5kQWxsDQogICAgfTsNCiAgfSwNCiAgY29tcHV0ZWQ6IHsNCiAgICAvLyDorqHnrpflvZPliY3mmK/lkKblhajpg6jlsZXlvIANCiAgICBpc0V4cGFuZGVkQWxsOiB7DQogICAgICBnZXQoKSB7DQogICAgICAgIHJldHVybiB0aGlzLmV4cGFuZGVkQWxsOw0KICAgICAgfSwNCiAgICAgIHNldCh2YWwpIHsNCiAgICAgICAgdGhpcy5leHBhbmRlZEFsbCA9IHZhbDsNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIHdhdGNoOiB7DQogICAgY29sbGFwc2VkKG5ld1ZhbCwgb2xkVmFsKSB7DQogICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHsNCiAgICAgICAgdGhpcy5oYW5kbGVDb2xsYXBzZUNoYW5nZShuZXdWYWwpOw0KICAgICAgICB0aGlzLiRlbWl0KCJjb2xsYXBzZWQtY2hhbmdlIiwgbmV3VmFsKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOebkeWQrOWGhemDqOWxleW8gOeKtuaAgeWPmOWMlu+8jOinpuWPkeWunumZheagkeeahOWxleW8gC/mlLbotbcNCiAgICBleHBhbmRlZEFsbChuZXdWYWwpIHsNCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsNCiAgICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICAgIHRoaXMuZXhwYW5kQWxsTm9kZXMoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLmNvbGxhcHNlQWxsTm9kZXMoKTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgICB0aGlzLiRlbWl0KCJleHBhbmRlZC1hbGwtY2hhbmdlIiwgbmV3VmFsKTsNCiAgICB9LA0KICAgIC8vIOebkeWQrOaQnOe0ouWFs+mUruivjQ0KICAgIHNlYXJjaEtleXdvcmQodmFsKSB7DQogICAgICBpZiAodGhpcy4kcmVmcy50cmVlUmVmKSB7DQogICAgICAgIHRoaXMuJHJlZnMudHJlZVJlZi5maWx0ZXIodmFsKTsNCiAgICAgICAgdGhpcy4kZW1pdCgic2VhcmNoIiwgdmFsKTsNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5pc0xvYWRpbmdGcm9tU3RvcmFnZSA9IHRydWUNCiAgICBpZiAoIXRoaXMuY29sbGFwc2VkICYmIHRoaXMuZW5hYmxlU3RvcmFnZSkgew0KICAgICAgY29uc3Qgc2F2ZWRXaWR0aCA9IHRoaXMuZ2V0U2F2ZWRXaWR0aCgpOw0KICAgICAgaWYgKHNhdmVkV2lkdGggIT09IG51bGwpIHsNCiAgICAgICAgdGhpcy5zaWRlYmFyV2lkdGggPSBzYXZlZFdpZHRoOw0KICAgICAgfQ0KICAgIH0NCiAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICB0aGlzLmlzTG9hZGluZ0Zyb21TdG9yYWdlID0gZmFsc2UNCiAgICB9KQ0KICAgIGlmICh0aGlzLmV4cGFuZGVkQWxsKSB7DQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIHRoaXMuZXhwYW5kQWxsTm9kZXMoKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfSwNCiAgYmVmb3JlRGVzdHJveSgpIHsNCiAgICB0aGlzLmNsZWFudXAoKTsNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIC8vIOiKgueCuei/h+a7pOaWueazlQ0KICAgIGZpbHRlck5vZGVNZXRob2QodmFsdWUsIGRhdGEpIHsNCiAgICAgIGlmICh0aGlzLmZpbHRlck1ldGhvZCkgew0KICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJNZXRob2QodmFsdWUsIGRhdGEpOw0KICAgICAgfQ0KICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHRydWU7DQogICAgICByZXR1cm4gZGF0YS5sYWJlbCAmJiBkYXRhLmxhYmVsLmluZGV4T2YodmFsdWUpICE9PSAtMTsNCiAgICB9LA0KICAgIC8vIOa4heeQhuWumuaXtuWZqOWSjOWKqOeUu+W4pw0KICAgIGNsZWFudXAoKSB7DQogICAgICBpZiAodGhpcy5yYWZJZCkgew0KICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJhZklkKTsNCiAgICAgICAgdGhpcy5yYWZJZCA9IG51bGw7DQogICAgICB9DQogICAgICBpZiAodGhpcy5zYXZlV2lkdGhUaW1lcikgew0KICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zYXZlV2lkdGhUaW1lcik7DQogICAgICAgIHRoaXMuc2F2ZVdpZHRoVGltZXIgPSBudWxsOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g5aSE55CG5pS26LW3L+WxleW8gOeKtuaAgeWPmOWMlg0KICAgIGhhbmRsZUNvbGxhcHNlQ2hhbmdlKGlzQ29sbGFwc2VkKSB7DQogICAgICBpZiAoaXNDb2xsYXBzZWQpIHsNCiAgICAgICAgdGhpcy5zYXZlV2lkdGhUb1N0b3JhZ2UoKTsNCiAgICAgICAgdGhpcy5zaWRlYmFyV2lkdGggPSB0aGlzLmNvbGxhcHNlZFdpZHRoOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgY29uc3Qgc2F2ZWRXaWR0aCA9IHRoaXMuZ2V0U2F2ZWRXaWR0aCgpOw0KICAgICAgICB0aGlzLnNpZGViYXJXaWR0aCA9IHNhdmVkV2lkdGggIT09IG51bGwgPyBzYXZlZFdpZHRoIDogdGhpcy5kZWZhdWx0V2lkdGg7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDojrflj5bkv53lrZjnmoTlrr3luqYNCiAgICBnZXRTYXZlZFdpZHRoKCkgew0KICAgICAgaWYgKCF0aGlzLmVuYWJsZVN0b3JhZ2UpIHsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9DQogICAgICB0cnkgew0KICAgICAgICBjb25zdCBzYXZlZFdpZHRoID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTsNCiAgICAgICAgaWYgKHNhdmVkV2lkdGgpIHsNCiAgICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHNhdmVkV2lkdGgsIDEwKTsNCiAgICAgICAgICBpZiAoIWlzTmFOKHdpZHRoKSAmJiB3aWR0aCA+PSB0aGlzLm1pbldpZHRoICYmIHdpZHRoIDw9IHRoaXMubWF4V2lkdGgpIHsNCiAgICAgICAgICAgIHJldHVybiB3aWR0aDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGxvYWQgc2lkZWJhciB3aWR0aCBmcm9tIHN0b3JhZ2Ugd2l0aCBrZXkgJHt0aGlzLnN0b3JhZ2VLZXl9OmAsIGVycm9yKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0sDQogICAgLy8g5L+d5a2Y5a695bqm5Yiw5pys5Zyw5a2Y5YKoDQogICAgc2F2ZVdpZHRoVG9TdG9yYWdlKCkgew0KICAgICAgaWYgKHRoaXMuY29sbGFwc2VkIHx8ICF0aGlzLmVuYWJsZVN0b3JhZ2UpIHJldHVybjsNCiAgICAgIHRyeSB7DQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuc3RvcmFnZUtleSwgdGhpcy5zaWRlYmFyV2lkdGgudG9TdHJpbmcoKSk7DQogICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzYXZlIHNpZGViYXIgd2lkdGggdG8gc3RvcmFnZSB3aXRoIGtleSAke3RoaXMuc3RvcmFnZUtleX06YCwgZXJyb3IpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g5YiH5o2i5L6n6L655qCP5pS26LW3L+WxleW8gOeKtuaAgQ0KICAgIHRvZ2dsZUNvbGxhcHNlZCgpIHsNCiAgICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkOw0KICAgIH0sDQogICAgLy8g5YiH5o2i5bGV5byAL+aKmOWPoOaJgOacieiKgueCuQ0KICAgIHRvZ2dsZUV4cGFuZEFsbCgpIHsNCiAgICAgIHRoaXMuaXNFeHBhbmRlZEFsbCA9ICF0aGlzLmlzRXhwYW5kZWRBbGw7DQogICAgfSwNCiAgICAvLyDlsZXlvIDmiYDmnInoioLngrkNCiAgICBleHBhbmRBbGxOb2RlcygpIHsNCiAgICAgIGlmICghdGhpcy4kcmVmcy50cmVlUmVmKSByZXR1cm47DQogICAgICBjb25zdCBhbGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXModGhpcy4kcmVmcy50cmVlUmVmLnJvb3QpOw0KICAgICAgYWxsTm9kZXMuZm9yRWFjaChub2RlID0+IHsNCiAgICAgICAgaWYgKG5vZGUuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCAmJiAhbm9kZS5leHBhbmRlZCkgew0KICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSB0cnVlOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9LA0KICAgIC8vIOiOt+WPluaJgOacieiKgueCuQ0KICAgIGdldEFsbE5vZGVzKHJvb3ROb2RlKSB7DQogICAgICBjb25zdCBub2RlcyA9IFtdOw0KICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZSkgPT4gew0KICAgICAgICBpZiAoIW5vZGUpIHJldHVybjsNCiAgICAgICAgbm9kZXMucHVzaChub2RlKTsNCiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2RlcyAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7DQogICAgICAgICAgbm9kZS5jaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4gdHJhdmVyc2UoY2hpbGQpKTsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICAgIHRyYXZlcnNlKHJvb3ROb2RlKTsNCiAgICAgIHJldHVybiBub2RlczsNCiAgICB9LA0KICAgIC8vIOaUtui1t+aJgOacieiKgueCuQ0KICAgIGNvbGxhcHNlQWxsTm9kZXMoKSB7DQogICAgICBpZiAoIXRoaXMuJHJlZnMudHJlZVJlZikgcmV0dXJuOw0KICAgICAgY29uc3QgYWxsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKHRoaXMuJHJlZnMudHJlZVJlZi5yb290KTsNCiAgICAgIGFsbE5vZGVzLmZvckVhY2gobm9kZSA9PiB7DQogICAgICAgIGlmIChub2RlLmV4cGFuZGVkICE9PSB1bmRlZmluZWQgJiYgbm9kZS5leHBhbmRlZCkgew0KICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDlpITnkIbliLfmlrDmk43kvZwNCiAgICBoYW5kbGVSZWZyZXNoKCkgew0KICAgICAgdGhpcy4kZW1pdCgicmVmcmVzaCIpOw0KICAgIH0sDQogICAgLy8g6IqC54K554K55Ye75LqL5Lu2DQogICAgb25Ob2RlQ2xpY2soZGF0YSwgbm9kZSwgZSkgew0KICAgICAgdGhpcy4kZW1pdCgibm9kZS1jbGljayIsIGRhdGEsIG5vZGUsIGUpOw0KICAgIH0sDQogICAgLy8g5aSN6YCJ5qGG6YCJ5Lit5LqL5Lu2DQogICAgb25DaGVjayhkYXRhLCBjaGVja2VkSW5mbykgew0KICAgICAgdGhpcy4kZW1pdCgiY2hlY2siLCBkYXRhLCBjaGVja2VkSW5mbyk7DQogICAgfSwNCiAgICAvLyDoioLngrnlsZXlvIDkuovku7YNCiAgICBvbk5vZGVFeHBhbmQoZGF0YSwgbm9kZSwgZSkgew0KICAgICAgdGhpcy4kZW1pdCgibm9kZS1leHBhbmQiLCBkYXRhLCBub2RlLCBlKTsNCiAgICB9LA0KICAgIC8vIOiKgueCueaKmOWPoOS6i+S7tg0KICAgIG9uTm9kZUNvbGxhcHNlKGRhdGEsIG5vZGUsIGUpIHsNCiAgICAgIHRoaXMuJGVtaXQoIm5vZGUtY29sbGFwc2UiLCBkYXRhLCBub2RlLCBlKTsNCiAgICB9LA0KICAgIC8vIOaQnOe0ouWkhOeQhg0KICAgIG9uU2VhcmNoKCkgew0KICAgICAgLy8g5pCc57Si6YC76L6R5bey5ZyoIHdhdGNoIOS4reWkhOeQhg0KICAgIH0sDQogICAgLy8g6K6+572u5b2T5YmN6YCJ5Lit55qE6IqC54K5DQogICAgc2V0Q3VycmVudEtleShrZXkpIHsNCiAgICAgIGlmICh0aGlzLiRyZWZzLnRyZWVSZWYpIHsNCiAgICAgICAgdGhpcy4kcmVmcy50cmVlUmVmLnNldEN1cnJlbnRLZXkoa2V5KTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOiOt+WPluW9k+WJjemAieS4reeahOiKgueCuQ0KICAgIGdldEN1cnJlbnROb2RlKCkgew0KICAgICAgaWYgKHRoaXMuJHJlZnMudHJlZVJlZikgew0KICAgICAgICByZXR1cm4gdGhpcy4kcmVmcy50cmVlUmVmLmdldEN1cnJlbnROb2RlKCk7DQogICAgICB9DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KICAgIC8vIOiOt+WPluW9k+WJjemAieS4reeahOiKgueCueeahGtleQ0KICAgIGdldEN1cnJlbnRLZXkoKSB7DQogICAgICBpZiAodGhpcy4kcmVmcy50cmVlUmVmKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRyZWZzLnRyZWVSZWYuZ2V0Q3VycmVudEtleSgpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfSwNCiAgICAvLyDorr7nva7pgInkuK3nmoToioLngrlrZXlz77yI5aSN6YCJ5qGG77yJDQogICAgc2V0Q2hlY2tlZEtleXMoa2V5cykgew0KICAgICAgaWYgKHRoaXMuJHJlZnMudHJlZVJlZiAmJiB0aGlzLnNob3dDaGVja2JveCkgew0KICAgICAgICB0aGlzLiRyZWZzLnRyZWVSZWYuc2V0Q2hlY2tlZEtleXMoa2V5cyk7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDojrflj5bpgInkuK3nmoToioLngrlrZXlz77yI5aSN6YCJ5qGG77yJDQogICAgZ2V0Q2hlY2tlZEtleXMoKSB7DQogICAgICBpZiAodGhpcy4kcmVmcy50cmVlUmVmICYmIHRoaXMuc2hvd0NoZWNrYm94KSB7DQogICAgICAgIHJldHVybiB0aGlzLiRyZWZzLnRyZWVSZWYuZ2V0Q2hlY2tlZEtleXMoKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBbXTsNCiAgICB9LA0KICAgIC8vIOiOt+WPlumAieS4reeahOiKgueCue+8iOWkjemAieahhu+8iQ0KICAgIGdldENoZWNrZWROb2RlcygpIHsNCiAgICAgIGlmICh0aGlzLiRyZWZzLnRyZWVSZWYgJiYgdGhpcy5zaG93Q2hlY2tib3gpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJHJlZnMudHJlZVJlZi5nZXRDaGVja2VkTm9kZXMoKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBbXTsNCiAgICB9LA0KICAgIC8vIOa4heepuuaQnOe0og0KICAgIGNsZWFyU2VhcmNoKCkgew0KICAgICAgdGhpcy5zZWFyY2hLZXl3b3JkID0gIiI7DQogICAgICBpZiAodGhpcy4kcmVmcy50cmVlUmVmKSB7DQogICAgICAgIHRoaXMuJHJlZnMudHJlZVJlZi5maWx0ZXIoIiIpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g6L+H5ruk5qCRDQogICAgZmlsdGVyKHZhbHVlKSB7DQogICAgICB0aGlzLnNlYXJjaEtleXdvcmQgPSB2YWx1ZTsNCiAgICB9LA0KICAgIC8vIOW8gOWni+iwg+aVtOWkp+Wwjw0KICAgIHN0YXJ0UmVzaXplKGUpIHsNCiAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlOw0KICAgICAgdGhpcy5zdGFydFggPSBlLnR5cGUgPT09ICdtb3VzZWRvd24nID8gZS5jbGllbnRYIDogZS50b3VjaGVzWzBdLmNsaWVudFg7DQogICAgICB0aGlzLnN0YXJ0V2lkdGggPSB0aGlzLnNpZGViYXJXaWR0aDsNCiAgICAgIA0KICAgICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlZG93bicpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVSZXNpemVNb3ZlKTsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuc3RvcFJlc2l6ZSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5zdG9wUmVzaXplKTsNCiAgICAgIH0NCiAgICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QoKTsNCiAgICB9LA0KICAgIC8vIOWkhOeQhuiwg+aVtOWkp+Wwj+enu+WKqA0KICAgIGhhbmRsZVJlc2l6ZU1vdmUoZSkgew0KICAgICAgaWYgKCF0aGlzLmlzUmVzaXppbmcpIHJldHVybjsNCiAgICAgIGlmICh0aGlzLnJhZklkKSB7DQogICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWQpOw0KICAgICAgfQ0KICAgICAgdGhpcy5yYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgY29uc3QgY2xpZW50WCA9IGUudHlwZSA9PT0gJ21vdXNlbW92ZScgPyBlLmNsaWVudFggOiBlLnRvdWNoZXNbMF0uY2xpZW50WDsNCiAgICAgICAgY29uc3QgZGVsdGFYID0gY2xpZW50WCAtIHRoaXMuc3RhcnRYOw0KICAgICAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIGRlbHRhWDsNCiAgICAgICAgY29uc3QgY2xhbXBlZFdpZHRoID0gTWF0aC5tYXgodGhpcy5taW5XaWR0aCwgTWF0aC5taW4odGhpcy5tYXhXaWR0aCwgbmV3V2lkdGgpKTsNCiAgICAgICAgaWYgKE1hdGguYWJzKGNsYW1wZWRXaWR0aCAtIHRoaXMuc2lkZWJhcldpZHRoKSA+PSAxKSB7DQogICAgICAgICAgdGhpcy5zaWRlYmFyV2lkdGggPSBjbGFtcGVkV2lkdGg7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g5YGc5q2i6LCD5pW05aSn5bCPDQogICAgc3RvcFJlc2l6ZSgpIHsNCiAgICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nKSByZXR1cm47DQogICAgICB0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTsNCiAgICAgIGlmICh0aGlzLnJhZklkKSB7DQogICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWQpOw0KICAgICAgICB0aGlzLnJhZklkID0gbnVsbDsNCiAgICAgIH0NCiAgICAgIHRoaXMuc3RhcnRYID0gMDsNCiAgICAgIHRoaXMuc3RhcnRXaWR0aCA9IDA7DQogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUpOw0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuc3RvcFJlc2l6ZSk7DQogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUpOw0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLnN0b3BSZXNpemUpOw0KICAgICAgdGhpcy5lbmFibGVVc2VyU2VsZWN0KCk7DQogICAgICB0aGlzLnNhdmVXaWR0aFRvU3RvcmFnZSgpOw0KICAgIH0sDQogICAgLy8g56aB55So55So5oi36YCJ5oupDQogICAgZGlzYWJsZVVzZXJTZWxlY3QoKSB7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3QgPSAnbm9uZSc7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm1velVzZXJTZWxlY3QgPSAnbm9uZSc7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm1zVXNlclNlbGVjdCA9ICdub25lJzsNCiAgICB9LA0KICAgIC8vIOWQr+eUqOeUqOaIt+mAieaLqQ0KICAgIGVuYWJsZVVzZXJTZWxlY3QoKSB7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnJzsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdCA9ICcnOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tb3pVc2VyU2VsZWN0ID0gJyc7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm1zVXNlclNlbGVjdCA9ICcnOw0KICAgIH0sDQogICAgLy8g6YeN572u5a695bqm5Yiw6buY6K6k5YC8DQogICAgcmVzZXRXaWR0aCgpIHsNCiAgICAgIHRoaXMuc2lkZWJhcldpZHRoID0gdGhpcy5kZWZhdWx0V2lkdGg7DQogICAgICB0aGlzLnNhdmVXaWR0aFRvU3RvcmFnZSgpOw0KICAgIH0sDQogICAgLy8g6I635Y+W5b2T5YmN5a695bqmDQogICAgZ2V0Q3VycmVudFdpZHRoKCkgew0KICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhcldpZHRoOw0KICAgIH0sDQogICAgLy8g6K6+572u5a695bqmDQogICAgc2V0V2lkdGgod2lkdGgpIHsNCiAgICAgIGlmICh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInICYmIHdpZHRoID49IHRoaXMubWluV2lkdGggJiYgd2lkdGggPD0gdGhpcy5tYXhXaWR0aCkgew0KICAgICAgICB0aGlzLnNpZGViYXJXaWR0aCA9IHdpZHRoOw0KICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkKSB7DQogICAgICAgICAgdGhpcy5zYXZlV2lkdGhUb1N0b3JhZ2UoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfTsNCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA;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;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/components/TreePanel","sourcesContent":["<template>\r\n <div class=\"tree-sidebar\" :class=\"{ collapsed: collapsed, resizing: isResizing, 'no-initial-transition': isLoadingFromStorage}\" :style=\"{ width: sidebarWidth + 'px' }\">\r\n <!-- 右侧拖动条 -->\r\n <div v-if=\"!collapsed\" class=\"resize-handle\" @mousedown=\"startResize\" @touchstart=\"startResize\" :class=\"{ active: isResizing }\" />\r\n <div class=\"tree-header\">\r\n <span class=\"tree-title\" v-show=\"!collapsed\">\r\n <i :class=\"titleIconClass\"></i> {{ title }}\r\n </span>\r\n <div class=\"tree-actions\" v-show=\"!collapsed\">\r\n <el-tooltip :content=\"isExpandedAll ? '收起全部' : '展开全部'\" placement=\"right\">\r\n <i class=\"tree-action-icon\" :class=\"isExpandedAll ? 'el-icon-arrow-down' : 'el-icon-arrow-up'\" @click=\"toggleExpandAll\" />\r\n </el-tooltip>\r\n <el-tooltip content=\"刷新\" placement=\"right\">\r\n <i class=\"tree-action-icon el-icon-refresh\" @click=\"handleRefresh\" />\r\n </el-tooltip>\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n </div>\r\n \r\n <!-- 侧边栏展开/收起按钮 -->\r\n <div class=\"collapse-button-container\">\r\n <el-tooltip :content=\"collapsed ? '展开' : '收起'\" placement=\"right\">\r\n <i class=\"collapse-button\" :class=\"collapsed ? 'el-icon-d-arrow-right' : 'el-icon-d-arrow-left'\" @click=\"toggleCollapsed\" />\r\n </el-tooltip>\r\n </div>\r\n\r\n <div class=\"tree-search\" v-show=\"!collapsed\" v-if=\"showSearch\">\r\n <el-input v-model=\"searchKeyword\" :placeholder=\"searchPlaceholder\" clearable size=\"small\" prefix-icon=\"el-icon-search\" @input=\"onSearch\" />\r\n </div>\r\n\r\n <div class=\"tree-wrap\" v-show=\"!collapsed\">\r\n <el-tree \r\n ref=\"treeRef\" \r\n :data=\"treeData\" \r\n :props=\"treeProps\" \r\n :expand-on-click-node=\"expandOnClickNode\"\r\n :filter-node-method=\"filterNodeMethod\"\r\n :default-expand-all=\"defaultExpandAll\"\r\n :default-expanded-keys=\"defaultExpandedKeys\"\r\n :node-key=\"nodeKey\"\r\n :check-strictly=\"checkStrictly\"\r\n :show-checkbox=\"showCheckbox\"\r\n @node-click=\"onNodeClick\"\r\n @check=\"onCheck\"\r\n @node-expand=\"onNodeExpand\"\r\n @node-collapse=\"onNodeCollapse\"\r\n >\r\n <span class=\"tree-node\" slot-scope=\"{ node, data }\">\r\n <slot name=\"node\" :node=\"node\" :data=\"data\">\r\n <i :class=\"data.children && data.children.length ? 'el-icon-folder' : 'el-icon-document'\" class=\"node-icon\" />\r\n <span class=\"node-label\" :title=\"node.label\">{{ node.label }}</span>\r\n </slot>\r\n </span>\r\n </el-tree>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: \"TreeSidebar\",\r\n props: {\r\n // 树形数据\r\n treeData: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 标题\r\n title: {\r\n type: String,\r\n default: '树形结构'\r\n },\r\n // 标题图标类名\r\n titleIconClass: {\r\n type: String,\r\n default: 'el-icon-office-building'\r\n },\r\n // 是否显示搜索框\r\n showSearch: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 搜索框占位符\r\n searchPlaceholder: {\r\n type: String,\r\n default: '请输入名称'\r\n },\r\n // 是否默认收起侧边栏\r\n defaultCollapsed: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 树配置项\r\n treeProps: {\r\n type: Object,\r\n default: () => ({\r\n children: \"children\",\r\n label: \"label\"\r\n })\r\n },\r\n // 节点唯一标识字段\r\n nodeKey: {\r\n type: String,\r\n default: 'id'\r\n },\r\n // 是否在点击节点时展开或收起\r\n expandOnClickNode: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否显示复选框\r\n showCheckbox: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否严格的遵循父子不互相关联\r\n checkStrictly: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否默认展开所有节点\r\n defaultExpandAll: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 默认展开的节点的key数组\r\n defaultExpandedKeys: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 默认宽度\r\n defaultWidth: {\r\n type: Number,\r\n default: 220\r\n },\r\n // 收起时的宽度\r\n collapsedWidth: {\r\n type: Number,\r\n default: 20\r\n },\r\n // 最小宽度\r\n minWidth: {\r\n type: Number,\r\n default: 180\r\n },\r\n // 最大宽度\r\n maxWidth: {\r\n type: Number,\r\n default: 400\r\n },\r\n // 本地存储的宽度key\r\n storageKey: {\r\n type: String,\r\n default: 'tree-sidebar-width'\r\n },\r\n // 是否启用本地存储宽度\r\n enableStorage: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 自定义过滤方法\r\n filterMethod: {\r\n type: Function,\r\n default: null\r\n }\r\n },\r\n data() {\r\n return {\r\n searchKeyword: \"\",\r\n collapsed: this.defaultCollapsed,\r\n sidebarWidth: this.defaultCollapsed ? this.collapsedWidth : this.defaultWidth,\r\n isResizing: false,\r\n startX: 0,\r\n startWidth: 0,\r\n saveWidthTimer: null,\r\n rafId: null,\r\n isLoadingFromStorage: false,\r\n expandedAll: this.defaultExpandAll\r\n };\r\n },\r\n computed: {\r\n // 计算当前是否全部展开\r\n isExpandedAll: {\r\n get() {\r\n return this.expandedAll;\r\n },\r\n set(val) {\r\n this.expandedAll = val;\r\n }\r\n }\r\n },\r\n watch: {\r\n collapsed(newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n this.handleCollapseChange(newVal);\r\n this.$emit(\"collapsed-change\", newVal);\r\n }\r\n },\r\n // 监听内部展开状态变化,触发实际树的展开/收起\r\n expandedAll(newVal) {\r\n this.$nextTick(() => {\r\n if (newVal) {\r\n this.expandAllNodes();\r\n } else {\r\n this.collapseAllNodes();\r\n }\r\n });\r\n this.$emit(\"expanded-all-change\", newVal);\r\n },\r\n // 监听搜索关键词\r\n searchKeyword(val) {\r\n if (this.$refs.treeRef) {\r\n this.$refs.treeRef.filter(val);\r\n this.$emit(\"search\", val);\r\n }\r\n }\r\n },\r\n mounted() {\r\n this.isLoadingFromStorage = true\r\n if (!this.collapsed && this.enableStorage) {\r\n const savedWidth = this.getSavedWidth();\r\n if (savedWidth !== null) {\r\n this.sidebarWidth = savedWidth;\r\n }\r\n }\r\n this.$nextTick(() => {\r\n this.isLoadingFromStorage = false\r\n })\r\n if (this.expandedAll) {\r\n this.$nextTick(() => {\r\n this.expandAllNodes();\r\n });\r\n }\r\n },\r\n beforeDestroy() {\r\n this.cleanup();\r\n },\r\n methods: {\r\n // 节点过滤方法\r\n filterNodeMethod(value, data) {\r\n if (this.filterMethod) {\r\n return this.filterMethod(value, data);\r\n }\r\n if (!value) return true;\r\n return data.label && data.label.indexOf(value) !== -1;\r\n },\r\n // 清理定时器和动画帧\r\n cleanup() {\r\n if (this.rafId) {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n if (this.saveWidthTimer) {\r\n clearTimeout(this.saveWidthTimer);\r\n this.saveWidthTimer = null;\r\n }\r\n },\r\n // 处理收起/展开状态变化\r\n handleCollapseChange(isCollapsed) {\r\n if (isCollapsed) {\r\n this.saveWidthToStorage();\r\n this.sidebarWidth = this.collapsedWidth;\r\n } else {\r\n const savedWidth = this.getSavedWidth();\r\n this.sidebarWidth = savedWidth !== null ? savedWidth : this.defaultWidth;\r\n }\r\n },\r\n // 获取保存的宽度\r\n getSavedWidth() {\r\n if (!this.enableStorage) {\r\n return null;\r\n }\r\n try {\r\n const savedWidth = localStorage.getItem(this.storageKey);\r\n if (savedWidth) {\r\n const width = parseInt(savedWidth, 10);\r\n if (!isNaN(width) && width >= this.minWidth && width <= this.maxWidth) {\r\n return width;\r\n }\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load sidebar width from storage with key ${this.storageKey}:`, error);\r\n }\r\n return null;\r\n },\r\n // 保存宽度到本地存储\r\n saveWidthToStorage() {\r\n if (this.collapsed || !this.enableStorage) return;\r\n try {\r\n localStorage.setItem(this.storageKey, this.sidebarWidth.toString());\r\n } catch (error) {\r\n console.warn(`Failed to save sidebar width to storage with key ${this.storageKey}:`, error);\r\n }\r\n },\r\n // 切换侧边栏收起/展开状态\r\n toggleCollapsed() {\r\n this.collapsed = !this.collapsed;\r\n },\r\n // 切换展开/折叠所有节点\r\n toggleExpandAll() {\r\n this.isExpandedAll = !this.isExpandedAll;\r\n },\r\n // 展开所有节点\r\n expandAllNodes() {\r\n if (!this.$refs.treeRef) return;\r\n const allNodes = this.getAllNodes(this.$refs.treeRef.root);\r\n allNodes.forEach(node => {\r\n if (node.expanded !== undefined && !node.expanded) {\r\n node.expanded = true;\r\n }\r\n });\r\n },\r\n // 获取所有节点\r\n getAllNodes(rootNode) {\r\n const nodes = [];\r\n const traverse = (node) => {\r\n if (!node) return;\r\n nodes.push(node);\r\n if (node.childNodes && node.childNodes.length) {\r\n node.childNodes.forEach(child => traverse(child));\r\n }\r\n };\r\n traverse(rootNode);\r\n return nodes;\r\n },\r\n // 收起所有节点\r\n collapseAllNodes() {\r\n if (!this.$refs.treeRef) return;\r\n const allNodes = this.getAllNodes(this.$refs.treeRef.root);\r\n allNodes.forEach(node => {\r\n if (node.expanded !== undefined && node.expanded) {\r\n node.expanded = false;\r\n }\r\n });\r\n },\r\n // 处理刷新操作\r\n handleRefresh() {\r\n this.$emit(\"refresh\");\r\n },\r\n // 节点点击事件\r\n onNodeClick(data, node, e) {\r\n this.$emit(\"node-click\", data, node, e);\r\n },\r\n // 复选框选中事件\r\n onCheck(data, checkedInfo) {\r\n this.$emit(\"check\", data, checkedInfo);\r\n },\r\n // 节点展开事件\r\n onNodeExpand(data, node, e) {\r\n this.$emit(\"node-expand\", data, node, e);\r\n },\r\n // 节点折叠事件\r\n onNodeCollapse(data, node, e) {\r\n this.$emit(\"node-collapse\", data, node, e);\r\n },\r\n // 搜索处理\r\n onSearch() {\r\n // 搜索逻辑已在 watch 中处理\r\n },\r\n // 设置当前选中的节点\r\n setCurrentKey(key) {\r\n if (this.$refs.treeRef) {\r\n this.$refs.treeRef.setCurrentKey(key);\r\n }\r\n },\r\n // 获取当前选中的节点\r\n getCurrentNode() {\r\n if (this.$refs.treeRef) {\r\n return this.$refs.treeRef.getCurrentNode();\r\n }\r\n return null;\r\n },\r\n // 获取当前选中的节点的key\r\n getCurrentKey() {\r\n if (this.$refs.treeRef) {\r\n return this.$refs.treeRef.getCurrentKey();\r\n }\r\n return null;\r\n },\r\n // 设置选中的节点keys(复选框)\r\n setCheckedKeys(keys) {\r\n if (this.$refs.treeRef && this.showCheckbox) {\r\n this.$refs.treeRef.setCheckedKeys(keys);\r\n }\r\n },\r\n // 获取选中的节点keys(复选框)\r\n getCheckedKeys() {\r\n if (this.$refs.treeRef && this.showCheckbox) {\r\n return this.$refs.treeRef.getCheckedKeys();\r\n }\r\n return [];\r\n },\r\n // 获取选中的节点(复选框)\r\n getCheckedNodes() {\r\n if (this.$refs.treeRef && this.showCheckbox) {\r\n return this.$refs.treeRef.getCheckedNodes();\r\n }\r\n return [];\r\n },\r\n // 清空搜索\r\n clearSearch() {\r\n this.searchKeyword = \"\";\r\n if (this.$refs.treeRef) {\r\n this.$refs.treeRef.filter(\"\");\r\n }\r\n },\r\n // 过滤树\r\n filter(value) {\r\n this.searchKeyword = value;\r\n },\r\n // 开始调整大小\r\n startResize(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isResizing = true;\r\n this.startX = e.type === 'mousedown' ? e.clientX : e.touches[0].clientX;\r\n this.startWidth = this.sidebarWidth;\r\n \r\n if (e.type === 'mousedown') {\r\n document.addEventListener('mousemove', this.handleResizeMove);\r\n document.addEventListener('mouseup', this.stopResize);\r\n } else {\r\n document.addEventListener('touchmove', this.handleResizeMove, { passive: false });\r\n document.addEventListener('touchend', this.stopResize);\r\n }\r\n this.disableUserSelect();\r\n },\r\n // 处理调整大小移动\r\n handleResizeMove(e) {\r\n if (!this.isResizing) return;\r\n if (this.rafId) {\r\n cancelAnimationFrame(this.rafId);\r\n }\r\n this.rafId = requestAnimationFrame(() => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const clientX = e.type === 'mousemove' ? e.clientX : e.touches[0].clientX;\r\n const deltaX = clientX - this.startX;\r\n const newWidth = this.startWidth + deltaX;\r\n const clampedWidth = Math.max(this.minWidth, Math.min(this.maxWidth, newWidth));\r\n if (Math.abs(clampedWidth - this.sidebarWidth) >= 1) {\r\n this.sidebarWidth = clampedWidth;\r\n }\r\n });\r\n },\r\n // 停止调整大小\r\n stopResize() {\r\n if (!this.isResizing) return;\r\n this.isResizing = false;\r\n if (this.rafId) {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n this.startX = 0;\r\n this.startWidth = 0;\r\n document.removeEventListener('mousemove', this.handleResizeMove);\r\n document.removeEventListener('mouseup', this.stopResize);\r\n document.removeEventListener('touchmove', this.handleResizeMove);\r\n document.removeEventListener('touchend', this.stopResize);\r\n this.enableUserSelect();\r\n this.saveWidthToStorage();\r\n },\r\n // 禁用用户选择\r\n disableUserSelect() {\r\n document.body.style.userSelect = 'none';\r\n document.body.style.webkitUserSelect = 'none';\r\n document.body.style.mozUserSelect = 'none';\r\n document.body.style.msUserSelect = 'none';\r\n },\r\n // 启用用户选择\r\n enableUserSelect() {\r\n document.body.style.userSelect = '';\r\n document.body.style.webkitUserSelect = '';\r\n document.body.style.mozUserSelect = '';\r\n document.body.style.msUserSelect = '';\r\n },\r\n // 重置宽度到默认值\r\n resetWidth() {\r\n this.sidebarWidth = this.defaultWidth;\r\n this.saveWidthToStorage();\r\n },\r\n // 获取当前宽度\r\n getCurrentWidth() {\r\n return this.sidebarWidth;\r\n },\r\n // 设置宽度\r\n setWidth(width) {\r\n if (typeof width === 'number' && width >= this.minWidth && width <= this.maxWidth) {\r\n this.sidebarWidth = width;\r\n if (!this.collapsed) {\r\n this.saveWidthToStorage();\r\n }\r\n }\r\n }\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.tree-sidebar {\r\n flex-shrink: 0;\r\n width: 220px;\r\n background: #fff;\r\n border-right: 1px solid #e8eaed;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n position: relative;\r\n transition: width 0.25s ease;\r\n \r\n &.collapsed {\r\n width: 42px;\r\n }\r\n \r\n &.resizing {\r\n transition: none;\r\n will-change: width;\r\n \r\n * {\r\n pointer-events: none !important;\r\n }\r\n }\r\n \r\n &.no-initial-transition {\r\n transition: none;\r\n }\r\n}\r\n\r\n.resize-handle {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n width: 6px;\r\n height: 100%;\r\n cursor: col-resize;\r\n z-index: 20;\r\n background: transparent;\r\n transition: background 0.2s;\r\n \r\n &:hover {\r\n background: rgba(64, 158, 255, 0.3);\r\n }\r\n \r\n &.active {\r\n background: rgba(64, 158, 255, 0.5);\r\n }\r\n}\r\n\r\n.collapse-button-container {\r\n position: absolute;\r\n top: 50%;\r\n right: 0;\r\n transform: translateY(-50%);\r\n z-index: 100;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 15px;\r\n height: 20px;\r\n background: #fff;\r\n border-radius: 0 4px 4px 0;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n transition: all 0.2s ease;\r\n \r\n .tree-sidebar.collapsed & {\r\n right: 0;\r\n background: #f7f8fa;\r\n border-radius: 0 4px 4px 0;\r\n }\r\n \r\n .tree-sidebar.resizing & {\r\n pointer-events: none;\r\n }\r\n}\r\n\r\n.collapse-button {\r\n font-size: 14px;\r\n color: #909399;\r\n cursor: pointer;\r\n padding: 4px;\r\n border-radius: 4px;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n color: #00875A;\r\n background: #E6F4EA;\r\n }\r\n}\r\n\r\n.tree-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0 10px;\r\n height: 40px;\r\n border-bottom: 1px solid #e8eaed;\r\n background: #f7f8fa;\r\n flex-shrink: 0;\r\n\r\n .tree-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: #303133;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n\r\n i {\r\n color: #00875A;\r\n font-size: 14px;\r\n }\r\n }\r\n\r\n .tree-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n flex-shrink: 0;\r\n }\r\n}\r\n\r\n.tree-action-icon {\r\n font-size: 14px;\r\n color: #909399;\r\n cursor: pointer;\r\n padding: 4px;\r\n border-radius: 4px;\r\n transition: all 0.2s;\r\n\r\n &:hover {\r\n color: #00875A;\r\n background: #E6F4EA;\r\n }\r\n}\r\n\r\n.tree-search {\r\n padding: 10px 10px 4px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.tree-wrap {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 6px 6px 12px;\r\n \r\n .tree-sidebar.resizing & {\r\n overflow: hidden;\r\n }\r\n\r\n &::-webkit-scrollbar {\r\n width: 4px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: #dcdfe6;\r\n border-radius: 4px;\r\n \r\n &:hover {\r\n background: #c0c4cc;\r\n }\r\n }\r\n\r\n ::v-deep .el-tree-node__content {\r\n height: 32px;\r\n border-radius: 4px;\r\n margin-bottom: 1px;\r\n\r\n &:hover {\r\n background: #f0f7ff;\r\n }\r\n }\r\n\r\n ::v-deep .el-tree-node.is-current > .el-tree-node__content {\r\n background: #E3F2E9;\r\n color: #00875A;\r\n font-weight: 600;\r\n\r\n .node-icon {\r\n color: #00875A !important;\r\n }\r\n }\r\n}\r\n\r\n.tree-node {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n font-size: 13px;\r\n overflow: hidden;\r\n\r\n .node-icon {\r\n font-size: 14px;\r\n color: #f5a623;\r\n flex-shrink: 0;\r\n }\r\n\r\n .node-label {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n}\r\n\r\n::v-deep .el-icon-document.node-icon {\r\n color: #909399 !important;\r\n}\r\n</style>"]}]}