1 line
39 KiB
JSON
1 line
39 KiB
JSON
{"remainingRequest":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/vue-loader/lib/index.js??vue-loader-options!/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/views/user/Console.vue?vue&type=script&lang=js","dependencies":[{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/views/user/Console.vue","mtime":1747403482892},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/cache-loader/dist/cjs.js","mtime":1743264595665},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/babel-loader/lib/index.js","mtime":1743264596348},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/cache-loader/dist/cjs.js","mtime":1743264595665},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/vue-loader/lib/index.js","mtime":1743264596512}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:CmltcG9ydCAqIGFzIGVjaGFydHMgZnJvbSAiZWNoYXJ0cyI7CgpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZTogIkNvbnNvbGUiLAogIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgLy8g55So5oi357uf6K6h5pWw5o2uCiAgICAgIHRvdGFsdXNlcjogMCwKICAgICAgdG90YWx0ZWFjaGVyOiAwLAogICAgICB0b3RhbHN0dWRlbnQ6IDAsCiAgICAgIHRvdGFsbWF0Y2g6IDAsCgogICAgICAvLyDojrflpZbmlbDmja4KICAgICAgZmlyc3RsZXZlbDogMCwKICAgICAgc2Vjb25kbGV2ZWw6IDAsCiAgICAgIHRoaXJkbGV2ZWw6IDAsCgogICAgICAvLyDmiqXlkI3otovlir/mlbDmja4KICAgICAgcmVnaXN0cmF0aW9uVHJlbmREYXRhOiBbXSwKCiAgICAgIC8vIOeDremXqOavlOi1m+WIl+ihqAogICAgICBob3RDb21wZXRpdGlvbnM6IFtdLAoKICAgICAgLy8g5YW25LuW57uf6K6h5pWw5o2uCiAgICAgIHRvdGFsaW5mbzogMCwKICAgICAgdG90YWxzdWNjZXNzOiAwLAogICAgICB0b3RhbGRheTogMCwKICAgICAgdG90YWxkYXlzOiAwLAoKICAgICAgLy8g5Zu+6KGo5a6e5L6LCiAgICAgIHJlZ2lzdHJhdGlvblRyZW5kQ2hhcnQ6IG51bGwsCiAgICAgIGF3YXJkQ2hhcnQ6IG51bGwsCgogICAgICAvLyDmmK/lkKbkvb/nlKjmqKHmi5/mlbDmja4KICAgICAgdXNlTW9ja0RhdGE6IGZhbHNlLAogICAgfTsKICB9LAogIG1vdW50ZWQoKSB7CiAgICB0aGlzLmZldGNoQWxsRGF0YSgpOwogIH0sCiAgYmVmb3JlRGVzdHJveSgpIHsKICAgIC8vIOmUgOavgeWbvuihqOWunuS+i++8jOmBv+WFjeWGheWtmOazhOa8jwogICAgaWYgKHRoaXMucmVnaXN0cmF0aW9uVHJlbmRDaGFydCkgewogICAgICB0aGlzLnJlZ2lzdHJhdGlvblRyZW5kQ2hhcnQuZGlzcG9zZSgpOwogICAgfQogICAgaWYgKHRoaXMuYXdhcmRDaGFydCkgewogICAgICB0aGlzLmF3YXJkQ2hhcnQuZGlzcG9zZSgpOwogICAgfQogIH0sCiAgbWV0aG9kczogewogICAgLy8g6I635Y+W5omA5pyJ5pWw5o2uCiAgICBhc3luYyBmZXRjaEFsbERhdGEoKSB7CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgLy8g5LyY5YWI6I635Y+W5Z+656GA57uf6K6h5pWw5o2uCiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFN0YXRpc3RpY3MoKTsKICAgICAgICAvLyDojrflj5blhbbku5bmlbDmja4KICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgICB0aGlzLmZldGNoQXdhcmRTdGF0cygpLAogICAgICAgICAgdGhpcy5mZXRjaFJlZ2lzdHJhdGlvblRyZW5kKCksCiAgICAgICAgICB0aGlzLmZldGNoSG90Q29tcGV0aXRpb25zKCksCiAgICAgICAgXSk7CgogICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsKICAgICAgICAgIHRoaXMuaW5pdFJlZ2lzdHJhdGlvblRyZW5kQ2hhcnQoKTsKICAgICAgICAgIHRoaXMuaW5pdEF3YXJkQ2hhcnQoKTsKICAgICAgICB9KTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCLojrflj5bmlbDmja7lpLHotKUiLCBlcnJvcik7CiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcigi6I635Y+W5pWw5o2u5aSx6LSlIik7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0sCgogICAgLy8g6I635Y+W57uf6K6h5pWw5o2uCiAgICBhc3luYyBmZXRjaFN0YXRpc3RpY3MoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgLy8gdGhpcy4kYXBpLmdldFdpbkNvdW50QnlMZXZlbAogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy4kYXBpLmdldENvdW50VG90YWwoKTsKICAgICAgICBjb25zb2xlLmxvZygicmVzcG9uc2UiLCByZXNwb25zZSk7CiAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGUgPT09IDIwMCkgewogICAgICAgICAgY29uc29sZS5sb2coInJlc3BvbnNlLmRhdGEiLCByZXNwb25zZS5kYXRhKTsKICAgICAgICAgIGNvbnN0IHN0YXRzID0gcmVzcG9uc2UuZGF0YTsKICAgICAgICAgIC8vIOebtOaOpeS9v+eUqOaOpeWPo+i/lOWbnueahOaVsOaNrgogICAgICAgICAgdGhpcy50b3RhbHVzZXIgPSBzdGF0cy50b3RhbFVzZXJzOwogICAgICAgICAgdGhpcy50b3RhbHRlYWNoZXIgPSBzdGF0cy50ZWFjaGVyQ291bnQ7CiAgICAgICAgICB0aGlzLnRvdGFsc3R1ZGVudCA9IHN0YXRzLnN0dWRlbnRDb3VudDsKICAgICAgICAgIHRoaXMudG90YWxtYXRjaCA9IHN0YXRzLmNvbXBldGl0aW9uQ291bnQ7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIuiOt+WPlue7n+iuoeaVsOaNruWksei0pToiLCBlcnJvcik7CiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcigi6I635Y+W57uf6K6h5pWw5o2u5aSx6LSlIik7CiAgICAgICAgLy8g5Y+R55Sf6ZSZ6K+v5pe26YeN572u5pWw5o2u5Li6MAogICAgICAgIHRoaXMudG90YWx1c2VyID0gMDsKICAgICAgICB0aGlzLnRvdGFsdGVhY2hlciA9IDA7CiAgICAgICAgdGhpcy50b3RhbHN0dWRlbnQgPSAwOwogICAgICAgIHRoaXMudG90YWxtYXRjaCA9IDA7CiAgICAgIH0KICAgIH0sCgogICAgLy8g5Yqg6L295qih5ouf5pWw5o2uCiAgICBsb2FkTW9ja0RhdGEoKSB7CiAgICAgIC8vIOaooeaLn+eUqOaIt+e7n+iuoeaVsOaNrgogICAgICB0aGlzLnRvdGFsdXNlciA9IDEyNTY7CiAgICAgIHRoaXMudG90YWx0ZWFjaGVyID0gMTI4OwogICAgICB0aGlzLnRvdGFsc3R1ZGVudCA9IDExMjg7CiAgICAgIHRoaXMudG90YWxtYXRjaCA9IDQ1OwoKICAgICAgLy8g5qih5ouf6I635aWW5pWw5o2uCiAgICAgIHRoaXMuZmlyc3RsZXZlbCA9IDU2OwogICAgICB0aGlzLnNlY29uZGxldmVsID0gMTEyOwogICAgICB0aGlzLnRoaXJkbGV2ZWwgPSAyMzU7CgogICAgICAvLyDmqKHmi5/lhbbku5bnu5/orqHmlbDmja4KICAgICAgdGhpcy50b3RhbGluZm8gPSA4OTsKICAgICAgdGhpcy50b3RhbHN1Y2Nlc3MgPSA4NzY7CiAgICAgIHRoaXMudG90YWxkYXkgPSAzMjsKICAgICAgdGhpcy50b3RhbGRheXMgPSA1OwoKICAgICAgLy8g5qih5ouf5oql5ZCN6LaL5Yq/5pWw5o2uCiAgICAgIHRoaXMuZ2VuZXJhdGVNb2NrVHJlbmREYXRhKCk7CgogICAgICAvLyDmqKHmi5/ng63pl6jmr5TotZvmlbDmja4KICAgICAgdGhpcy5nZW5lcmF0ZU1vY2tIb3RDb21wZXRpdGlvbnMoKTsKICAgIH0sCgogICAgLy8g55Sf5oiQ5qih5ouf6LaL5Yq/5pWw5o2uCiAgICBnZW5lcmF0ZU1vY2tUcmVuZERhdGEoKSB7CiAgICAgIGNvbnN0IGRhdGVzID0gW107CiAgICAgIGNvbnN0IGNvdW50cyA9IFtdOwogICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7CgogICAgICBmb3IgKGxldCBpID0gMjk7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTsKICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSBpKTsKICAgICAgICBjb25zdCBkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGRhdGUpOwogICAgICAgIGRhdGVzLnB1c2goZGF0ZVN0cik7CgogICAgICAgIC8vIOeUn+aIkOmaj+acuuaKpeWQjeaVsOmHj++8jOWRiOeOsOazouWKqOS4iuWNh+i2i+WKvwogICAgICAgIGNvbnN0IGJhc2VDb3VudCA9IDUgKyBNYXRoLmZsb29yKCgzMCAtIGkpIC8gMyk7CiAgICAgICAgY29uc3QgcmFuZG9tRmFjdG9yID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApIC0gMzsKICAgICAgICBjb25zdCBjb3VudCA9IE1hdGgubWF4KDAsIGJhc2VDb3VudCArIHJhbmRvbUZhY3Rvcik7CgogICAgICAgIGNvdW50cy5wdXNoKGNvdW50KTsKICAgICAgfQoKICAgICAgdGhpcy5yZWdpc3RyYXRpb25UcmVuZERhdGEgPSB7CiAgICAgICAgZGF0ZXMsCiAgICAgICAgY291bnRzLAogICAgICB9OwogICAgfSwKCiAgICAvLyDnlJ/miJDmqKHmi5/ng63pl6jmr5TotZvmlbDmja4KICAgIGdlbmVyYXRlTW9ja0hvdENvbXBldGl0aW9ucygpIHsKICAgICAgY29uc3QgY29tcGV0aXRpb25OYW1lcyA9IFsKICAgICAgICAi5YWo5Zu95aSn5a2m55Sf5pWw5a2m5bu65qih56ue6LWbIiwKICAgICAgICAi5LqS6IGU572RK+WIm+aWsOWIm+S4muWkp+i1myIsCiAgICAgICAgIkFDTeeoi+W6j+iuvuiuoeWkp+i1myIsCiAgICAgICAgIuaMkeaImOadr+WIm+aWsOWIm+S4muWkp+i1myIsCiAgICAgICAgIuWFqOWbveWkp+WtpueUn+acuuWZqOS6uuWkp+i1myIsCiAgICAgIF07CgogICAgICB0aGlzLmhvdENvbXBldGl0aW9ucyA9IGNvbXBldGl0aW9uTmFtZXMubWFwKChuYW1lLCBpbmRleCkgPT4gewogICAgICAgIC8vIOeUn+aIkOmaj+acuuaKpeWQjeS6uuaVsO+8jOaOkuWQjei2iuWJjeaKpeWQjeS6uuaVsOi2iuWkmgogICAgICAgIGNvbnN0IGJhc2VDb3VudCA9IDIwMCAtIGluZGV4ICogMzA7CiAgICAgICAgY29uc3QgcmFuZG9tRmFjdG9yID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgY29tcGV0aXRpb25JZDogYGNvbXAtJHtpbmRleCArIDF9YCwKICAgICAgICAgIGNvbXBldGl0aW9uTmFtZTogbmFtZSwKICAgICAgICAgIHJlZ2lzdHJhdGlvbkNvdW50OiBiYXNlQ291bnQgKyByYW5kb21GYWN0b3IsCiAgICAgICAgICBjb21wZXRpdGlvblN0YXR1czogTWF0aC5yYW5kb20oKSA+IDAuMyA/IDAgOiAxLAogICAgICAgIH07CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5bnlKjmiLfnu5/orqHmlbDmja4KICAgIGFzeW5jIGZldGNoVXNlclN0YXRzKCkgewogICAgICAvLyDojrflj5bnlKjmiLfmgLvmlbAKICAgICAgYXdhaXQgdGhpcy4kYXBpLmdldENvdW50KCkudGhlbigocmVzKSA9PiB7CiAgICAgICAgaWYgKHJlcy5jb2RlID09IDIwMCkgewogICAgICAgICAgdGhpcy50b3RhbHVzZXIgPSByZXMuZGF0YTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgLy8g6I635Y+W5pWZ5biI5oC75Lq65pWwCiAgICAgIGF3YWl0IHRoaXMuJGFwaS5nZXRUZWFjaGVyQ291bnQoKS50aGVuKChyZXMpID0+IHsKICAgICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7CiAgICAgICAgICB0aGlzLnRvdGFsdGVhY2hlciA9IHJlcy5kYXRhOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvLyDojrflj5blrabnlJ/mgLvkurrmlbAKICAgICAgYXdhaXQgdGhpcy4kYXBpLmdldFN0dWRlbnRDb3VudCgpLnRoZW4oKHJlcykgPT4gewogICAgICAgIGlmIChyZXMuY29kZSA9PSAyMDApIHsKICAgICAgICAgIHRoaXMudG90YWxzdHVkZW50ID0gcmVzLmRhdGE7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCgogICAgLy8g6I635Y+W5q+U6LWb57uf6K6h5pWw5o2uCiAgICBhc3luYyBmZXRjaENvbXBldGl0aW9uU3RhdHMoKSB7CiAgICAgIC8vIOiOt+WPluaJgOacieavlOi1m+aVsOmHjwogICAgICBhd2FpdCB0aGlzLiRhcGkuQWxsQ29tcGV0aXRpb24oKS50aGVuKChyZXMpID0+IHsKICAgICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7CiAgICAgICAgICB0aGlzLnRvdGFsbWF0Y2ggPSByZXMuZGF0YS5sZW5ndGg7CgogICAgICAgICAgLy8g5aSE55CG54Ot6Zeo5q+U6LWb5pWw5o2uCiAgICAgICAgICB0aGlzLnByb2Nlc3NDb21wZXRpdGlvbkRhdGEocmVzLmRhdGEpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvLyDojrflj5bmiYDmnInotYTmlpkKICAgICAgYXdhaXQgdGhpcy4kYXBpLkFsbGluZm9ybWF0aW9uKCkudGhlbigocmVzKSA9PiB7CiAgICAgICAgaWYgKHJlcy5jb2RlID09IDIwMCkgewogICAgICAgICAgdGhpcy50b3RhbGluZm8gPSByZXMuZGF0YS5sZW5ndGg7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIOiOt+WPluS4g+WkqeWGheavlOi1m+eahOaVsOmHjwogICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgIGNvbnN0IHNldmVuRGF5c0FnbyA9IG5ldyBEYXRlKGN1cnJlbnREYXRlKTsKICAgICAgc2V2ZW5EYXlzQWdvLnNldERhdGUoc2V2ZW5EYXlzQWdvLmdldERhdGUoKSAtIDcpOwoKICAgICAgYXdhaXQgdGhpcy4kYXBpLkFsbENvbXBldGl0aW9uKCkudGhlbigocmVzKSA9PiB7CiAgICAgICAgaWYgKHJlcy5jb2RlID09IDIwMCkgewogICAgICAgICAgdGhpcy50b3RhbGRheXMgPSByZXMuZGF0YS5maWx0ZXIoKGl0ZW0pID0+IHsKICAgICAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uRW5kVGltZSA9IG5ldyBEYXRlKGl0ZW0ucmVnaXN0cmF0aW9uRW5kVGltZSk7CiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uRW5kVGltZSA+PSBzZXZlbkRheXNBZ28gJiYKICAgICAgICAgICAgICByZWdpc3RyYXRpb25FbmRUaW1lIDw9IGN1cnJlbnREYXRlCiAgICAgICAgICAgICk7CiAgICAgICAgICB9KS5sZW5ndGg7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCgogICAgLy8g6I635Y+W6I635aWW57uf6K6h5pWw5o2uCiAgICBhc3luYyBmZXRjaEF3YXJkU3RhdHMoKSB7CiAgICAgIC8vIOS4gOetieWlluS6uuaVsAogICAgICBhd2FpdCB0aGlzLiRhcGkuZ2V0V2luQ291bnRCeUxldmVsKHsgbGV2ZWw6ICLkuIDnrYnlpZYiIH0pLnRoZW4oKHJlcykgPT4gewogICAgICAgIGlmIChyZXMuY29kZSA9PSAyMDApIHsKICAgICAgICAgIHRoaXMuZmlyc3RsZXZlbCA9IHJlcy5kYXRhOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvLyDkuoznrYnlpZbkurrmlbAKICAgICAgYXdhaXQgdGhpcy4kYXBpLmdldFdpbkNvdW50QnlMZXZlbCh7IGxldmVsOiAi5LqM562J5aWWIiB9KS50aGVuKChyZXMpID0+IHsKICAgICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7CiAgICAgICAgICB0aGlzLnNlY29uZGxldmVsID0gcmVzLmRhdGE7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIOS4ieetieWllgogICAgICBhd2FpdCB0aGlzLiRhcGkuZ2V0V2luQ291bnRCeUxldmVsKHsgbGV2ZWw6ICLkuInnrYnlpZYiIH0pLnRoZW4oKHJlcykgPT4gewogICAgICAgIGlmIChyZXMuY29kZSA9PSAyMDApIHsKICAgICAgICAgIHRoaXMudGhpcmRsZXZlbCA9IHJlcy5kYXRhOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAoKICAgIC8vIOiOt+WPluaKpeWQjei2i+WKv+aVsOaNrgogICAgYXN5bmMgZmV0Y2hSZWdpc3RyYXRpb25UcmVuZCgpIHsKICAgICAgLy8g6I635Y+W5oql5ZCN6K6w5b2VCiAgICAgIGF3YWl0IHRoaXMuJGFwaS5SZWdpc3RyYXRpb25BbGwoKS50aGVuKChyZXMpID0+IHsKICAgICAgICBpZiAocmVzLmNvZGUgPT0gMjAwKSB7CiAgICAgICAgICAvLyDlpITnkIbmiqXlkI3otovlir/mlbDmja4KICAgICAgICAgIHRoaXMucHJvY2Vzc1JlZ2lzdHJhdGlvblRyZW5kRGF0YShyZXMuZGF0YSk7CgogICAgICAgICAgLy8g6I635Y+W5oiQ5Yqf5oql5ZCN5pWw6YePCiAgICAgICAgICB0aGlzLnRvdGFsc3VjY2VzcyA9IHJlcy5kYXRhLmZpbHRlcigKICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0ucmVnaXN0cmF0aW9uU3RhdHVzID09ICLmiJDlip/miqXlkI0iCiAgICAgICAgICApLmxlbmd0aDsKCiAgICAgICAgICAvLyDojrflj5bkuIPlpKnlhoXmiJDlip/miqXlkI3nmoTmlbDph48KICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKICAgICAgICAgIGNvbnN0IHNldmVuRGF5c0FnbyA9IG5ldyBEYXRlKGN1cnJlbnREYXRlKTsKICAgICAgICAgIHNldmVuRGF5c0Fnby5zZXREYXRlKHNldmVuRGF5c0Fnby5nZXREYXRlKCkgLSA3KTsKCiAgICAgICAgICB0aGlzLnRvdGFsZGF5ID0gcmVzLmRhdGEuZmlsdGVyKChpdGVtKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvblRpbWUgPSBuZXcgRGF0ZShpdGVtLnJlZ2lzdHJhdGlvblRpbWUpOwogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgIHJlZ2lzdHJhdGlvblRpbWUgPj0gc2V2ZW5EYXlzQWdvICYmCiAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uVGltZSA8PSBjdXJyZW50RGF0ZQogICAgICAgICAgICApOwogICAgICAgICAgfSkubGVuZ3RoOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAoKICAgIC8vIOiOt+WPlueDremXqOavlOi1m+aVsOaNrgogICAgYXN5bmMgZmV0Y2hIb3RDb21wZXRpdGlvbnMoKSB7CiAgICAgIC8vIOiOt+WPluaKpeWQjeiusOW9leWSjOavlOi1m+aVsOaNrgogICAgICBjb25zdCBbcmVnaXN0cmF0aW9uUmVzLCBjb21wZXRpdGlvblJlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgdGhpcy4kYXBpLlJlZ2lzdHJhdGlvbkFsbCgpLAogICAgICAgIHRoaXMuJGFwaS5BbGxDb21wZXRpdGlvbigpLAogICAgICBdKTsKCiAgICAgIGlmIChyZWdpc3RyYXRpb25SZXMuY29kZSA9PSAyMDAgJiYgY29tcGV0aXRpb25SZXMuY29kZSA9PSAyMDApIHsKICAgICAgICBjb25zdCByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uUmVzLmRhdGE7CiAgICAgICAgY29uc3QgY29tcGV0aXRpb25zID0gY29tcGV0aXRpb25SZXMuZGF0YTsKCiAgICAgICAgLy8g6K6h566X5q+P5Liq5q+U6LWb55qE5oql5ZCN5Lq65pWwCiAgICAgICAgY29uc3QgY29tcGV0aXRpb25Db3VudHMgPSB7fTsKICAgICAgICByZWdpc3RyYXRpb25zLmZvckVhY2goKHJlZykgPT4gewogICAgICAgICAgaWYgKCFjb21wZXRpdGlvbkNvdW50c1tyZWcuY29tcGV0aXRpb25JZF0pIHsKICAgICAgICAgICAgY29tcGV0aXRpb25Db3VudHNbcmVnLmNvbXBldGl0aW9uSWRdID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbXBldGl0aW9uQ291bnRzW3JlZy5jb21wZXRpdGlvbklkXSsrOwogICAgICAgIH0pOwoKICAgICAgICAvLyDlsIbmr5TotZvmlbDmja7kuI7miqXlkI3kurrmlbDlkIjlubYKICAgICAgICBjb25zdCBjb21wZXRpdGlvbnNXaXRoQ291bnQgPSBjb21wZXRpdGlvbnMubWFwKChjb21wKSA9PiAoewogICAgICAgICAgLi4uY29tcCwKICAgICAgICAgIHJlZ2lzdHJhdGlvbkNvdW50OiBjb21wZXRpdGlvbkNvdW50c1tjb21wLmNvbXBldGl0aW9uSWRdIHx8IDAsCiAgICAgICAgfSkpOwoKICAgICAgICAvLyDmjInmiqXlkI3kurrmlbDmjpLluo/vvIzlj5bliY015LiqCiAgICAgICAgdGhpcy5ob3RDb21wZXRpdGlvbnMgPSBjb21wZXRpdGlvbnNXaXRoQ291bnQKICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnJlZ2lzdHJhdGlvbkNvdW50IC0gYS5yZWdpc3RyYXRpb25Db3VudCkKICAgICAgICAgIC5zbGljZSgwLCA1KTsKICAgICAgfQogICAgfSwKCiAgICAvLyDlpITnkIbmiqXlkI3otovlir/mlbDmja4KICAgIHByb2Nlc3NSZWdpc3RyYXRpb25UcmVuZERhdGEocmVnaXN0cmF0aW9ucykgewogICAgICAvLyDojrflj5bmnIDov5EzMOWkqeeahOaXpeacnwogICAgICBjb25zdCBkYXRlcyA9IFtdOwogICAgICBjb25zdCBjb3VudHMgPSBbXTsKICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpOwoKICAgICAgZm9yIChsZXQgaSA9IDI5OyBpID49IDA7IGktLSkgewogICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0b2RheSk7CiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gaSk7CiAgICAgICAgY29uc3QgZGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlKTsKICAgICAgICBkYXRlcy5wdXNoKGRhdGVTdHIpOwoKICAgICAgICAvLyDorqHnrpflvZPlpKnnmoTmiqXlkI3mlbDph48KICAgICAgICBjb25zdCBjb3VudCA9IHJlZ2lzdHJhdGlvbnMuZmlsdGVyKChyZWcpID0+IHsKICAgICAgICAgIGNvbnN0IHJlZ0RhdGUgPSBuZXcgRGF0ZShyZWcucmVnaXN0cmF0aW9uVGltZSk7CiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHJlZ0RhdGUpID09PSBkYXRlU3RyOwogICAgICAgIH0pLmxlbmd0aDsKCiAgICAgICAgY291bnRzLnB1c2goY291bnQpOwogICAgICB9CgogICAgICB0aGlzLnJlZ2lzdHJhdGlvblRyZW5kRGF0YSA9IHsKICAgICAgICBkYXRlcywKICAgICAgICBjb3VudHMsCiAgICAgIH07CiAgICB9LAoKICAgIC8vIOWkhOeQhuavlOi1m+aVsOaNrgogICAgcHJvY2Vzc0NvbXBldGl0aW9uRGF0YShjb21wZXRpdGlvbnMpIHsKICAgICAgLy8g5Zyo6L+Z6YeM5Y+v5Lul5re75Yqg5pu05aSa55qE5pWw5o2u5aSE55CG6YC76L6RCiAgICB9LAoKICAgIC8vIOWIneWni+WMluaKpeWQjei2i+WKv+WbvuihqAogICAgaW5pdFJlZ2lzdHJhdGlvblRyZW5kQ2hhcnQoKSB7CiAgICAgIGNvbnN0IGNoYXJ0RG9tID0gdGhpcy4kcmVmcy5yZWdpc3RyYXRpb25UcmVuZDsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25UcmVuZENoYXJ0ID0gZWNoYXJ0cy5pbml0KGNoYXJ0RG9tKTsKCiAgICAgIGNvbnN0IG9wdGlvbiA9IHsKICAgICAgICB0b29sdGlwOiB7CiAgICAgICAgICB0cmlnZ2VyOiAiYXhpcyIsCiAgICAgICAgICBheGlzUG9pbnRlcjogewogICAgICAgICAgICB0eXBlOiAic2hhZG93IiwKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBncmlkOiB7CiAgICAgICAgICBsZWZ0OiAiMyUiLAogICAgICAgICAgcmlnaHQ6ICI0JSIsCiAgICAgICAgICBib3R0b206ICIzJSIsCiAgICAgICAgICBjb250YWluTGFiZWw6IHRydWUsCiAgICAgICAgfSwKICAgICAgICB4QXhpczogewogICAgICAgICAgdHlwZTogImNhdGVnb3J5IiwKICAgICAgICAgIGRhdGE6IHRoaXMucmVnaXN0cmF0aW9uVHJlbmREYXRhLmRhdGVzLAogICAgICAgICAgYXhpc0xhYmVsOiB7CiAgICAgICAgICAgIHJvdGF0ZTogNDUsCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgeUF4aXM6IHsKICAgICAgICAgIHR5cGU6ICJ2YWx1ZSIsCiAgICAgICAgICBuYW1lOiAi5oql5ZCN5Lq65pWwIiwKICAgICAgICB9LAogICAgICAgIHNlcmllczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAi5oql5ZCN5Lq65pWwIiwKICAgICAgICAgICAgdHlwZTogImxpbmUiLAogICAgICAgICAgICBkYXRhOiB0aGlzLnJlZ2lzdHJhdGlvblRyZW5kRGF0YS5jb3VudHMsCiAgICAgICAgICAgIHNtb290aDogdHJ1ZSwKICAgICAgICAgICAgYXJlYVN0eWxlOiB7CiAgICAgICAgICAgICAgb3BhY2l0eTogMC4zLAogICAgICAgICAgICB9LAogICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICBjb2xvcjogIiMxODkwZmYiLAogICAgICAgICAgICB9LAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICB9OwoKICAgICAgdGhpcy5yZWdpc3RyYXRpb25UcmVuZENoYXJ0LnNldE9wdGlvbihvcHRpb24pOwoKICAgICAgLy8g5ZON5bqU56qX5Y+j5aSn5bCP5Y+Y5YyWCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCAoKSA9PiB7CiAgICAgICAgdGhpcy5yZWdpc3RyYXRpb25UcmVuZENoYXJ0LnJlc2l6ZSgpOwogICAgICB9KTsKICAgIH0sCgogICAgLy8g5Yid5aeL5YyW6I635aWW5oOF5Ya15Zu+6KGoCiAgICBpbml0QXdhcmRDaGFydCgpIHsKICAgICAgY29uc3QgY2hhcnREb20gPSB0aGlzLiRyZWZzLmF3YXJkQ2hhcnQ7CiAgICAgIHRoaXMuYXdhcmRDaGFydCA9IGVjaGFydHMuaW5pdChjaGFydERvbSk7CgogICAgICBjb25zdCBvcHRpb24gPSB7CiAgICAgICAgdG9vbHRpcDogewogICAgICAgICAgdHJpZ2dlcjogIml0ZW0iLAogICAgICAgICAgZm9ybWF0dGVyOiAie2F9IDxici8+e2J9OiB7Y30gKHtkfSUpIiwKICAgICAgICB9LAogICAgICAgIGxlZ2VuZDogewogICAgICAgICAgb3JpZW50OiAiaG9yaXpvbnRhbCIsCiAgICAgICAgICBib3R0b206ICJib3R0b20iLAogICAgICAgICAgZGF0YTogWyLkuIDnrYnlpZYiLCAi5LqM562J5aWWIiwgIuS4ieetieWlliJdLAogICAgICAgIH0sCiAgICAgICAgc2VyaWVzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICLojrflpZbmg4XlhrUiLAogICAgICAgICAgICB0eXBlOiAicGllIiwKICAgICAgICAgICAgcmFkaXVzOiBbIjQwJSIsICI3MCUiXSwKICAgICAgICAgICAgYXZvaWRMYWJlbE92ZXJsYXA6IGZhbHNlLAogICAgICAgICAgICBpdGVtU3R5bGU6IHsKICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDEwLAogICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAiI2ZmZiIsCiAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxhYmVsOiB7CiAgICAgICAgICAgICAgc2hvdzogZmFsc2UsCiAgICAgICAgICAgICAgcG9zaXRpb246ICJjZW50ZXIiLAogICAgICAgICAgICB9LAogICAgICAgICAgICBlbXBoYXNpczogewogICAgICAgICAgICAgIGxhYmVsOiB7CiAgICAgICAgICAgICAgICBzaG93OiB0cnVlLAogICAgICAgICAgICAgICAgZm9udFNpemU6ICIxOCIsCiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAiYm9sZCIsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGFiZWxMaW5lOiB7CiAgICAgICAgICAgICAgc2hvdzogZmFsc2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRhdGE6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5maXJzdGxldmVsLAogICAgICAgICAgICAgICAgbmFtZTogIuS4gOetieWlliIsCiAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsgY29sb3I6ICIjZmY0ZDRmIiB9LAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Vjb25kbGV2ZWwsCiAgICAgICAgICAgICAgICBuYW1lOiAi5LqM562J5aWWIiwKICAgICAgICAgICAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogIiNmYWFkMTQiIH0sCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy50aGlyZGxldmVsLAogICAgICAgICAgICAgICAgbmFtZTogIuS4ieetieWlliIsCiAgICAgICAgICAgICAgICBpdGVtU3R5bGU6IHsgY29sb3I6ICIjNTJjNDFhIiB9LAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgIH07CgogICAgICB0aGlzLmF3YXJkQ2hhcnQuc2V0T3B0aW9uKG9wdGlvbik7CgogICAgICAvLyDlk43lupTnqpflj6PlpKflsI/lj5jljJYKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsICgpID0+IHsKICAgICAgICB0aGlzLmF3YXJkQ2hhcnQucmVzaXplKCk7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDmoLzlvI/ljJbml6XmnJ8KICAgIGZvcm1hdERhdGUoZGF0ZSkgewogICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAiMCIpOwogICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICIwIik7CiAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gOwogICAgfSwKCiAgICAvLyDojrflj5bmr5TotZvnirbmgIHmlofmnKwKICAgIGdldENvbXBldGl0aW9uU3RhdHVzKHN0YXR1cykgewogICAgICBjb25zdCBzdGF0dXNNYXAgPSB7CiAgICAgICAgMDogIui/m+ihjOS4rSIsCiAgICAgICAgMTogIuW3sue7iOatoiIsCiAgICAgIH07CiAgICAgIHJldHVybiBzdGF0dXNNYXBbc3RhdHVzXSB8fCAi5pyq55+l54q25oCBIjsKICAgIH0sCiAgfSwKfTsK"},{"version":3,"sources":["Console.vue"],"names":[],"mappings":";AAkHA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;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;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"Console.vue","sourceRoot":"src/views/user","sourcesContent":["<template>\n <div class=\"dashboard-container\">\n <!-- 数据卡片区域 -->\n <a-row :gutter=\"24\">\n <a-col :span=\"6\">\n <a-card class=\"data-card\">\n <a-statistic\n title=\"用户总数\"\n :value=\"totaluser\"\n :precision=\"0\"\n style=\"text-align: center\"\n >\n <template #prefix>\n <a-icon type=\"user\" />\n </template>\n </a-statistic>\n </a-card>\n </a-col>\n <a-col :span=\"6\">\n <a-card class=\"data-card\">\n <a-statistic\n title=\"教师人数\"\n :value=\"totalteacher\"\n :precision=\"0\"\n style=\"text-align: center\"\n >\n <template #prefix>\n <a-icon type=\"team\" />\n </template>\n </a-statistic>\n </a-card>\n </a-col>\n <a-col :span=\"6\">\n <a-card class=\"data-card\">\n <a-statistic\n title=\"学生人数\"\n :value=\"totalstudent\"\n :precision=\"0\"\n style=\"text-align: center\"\n >\n <template #prefix>\n <a-icon type=\"solution\" />\n </template>\n </a-statistic>\n </a-card>\n </a-col>\n <a-col :span=\"6\">\n <a-card class=\"data-card\">\n <a-statistic\n title=\"比赛总数\"\n :value=\"totalmatch\"\n :precision=\"0\"\n style=\"text-align: center\"\n >\n <template #prefix>\n <a-icon type=\"trophy\" />\n </template>\n </a-statistic>\n </a-card>\n </a-col>\n </a-row>\n\n <!-- 趋势图和热门比赛区域 -->\n <a-row :gutter=\"24\" style=\"margin-top: 24px\">\n <!-- 报名趋势图 -->\n <a-col :span=\"16\">\n <a-card title=\"学生报名比赛趋势\" :bordered=\"false\">\n <div ref=\"registrationTrend\" style=\"height: 400px\"></div>\n </a-card>\n </a-col>\n\n <!-- 热门比赛列表 -->\n <a-col :span=\"8\">\n <a-card title=\"热门比赛\" :bordered=\"false\">\n <a-list\n itemLayout=\"horizontal\"\n :dataSource=\"hotCompetitions\"\n :loading=\"loading\"\n >\n <a-list-item slot=\"renderItem\" slot-scope=\"item\">\n <a-list-item-meta>\n <template slot=\"title\">\n <a href=\"javascript:;\">{{ item.competitionName }}</a>\n </template>\n <template slot=\"description\">\n <span>报名人数: {{ item.registrationCount }}</span>\n <span style=\"margin-left: 16px\">\n 状态: {{ getCompetitionStatus(item.competitionStatus) }}\n </span>\n </template>\n <a-avatar\n slot=\"avatar\"\n style=\"background-color: #1890ff\"\n icon=\"trophy\"\n />\n </a-list-item-meta>\n </a-list-item>\n </a-list>\n </a-card>\n </a-col>\n </a-row>\n\n <!-- 获奖情况统计 -->\n <a-row :gutter=\"24\" style=\"margin-top: 24px\">\n <a-col :span=\"24\">\n <a-card title=\"获奖情况统计\" :bordered=\"false\">\n <div ref=\"awardChart\" style=\"height: 300px\"></div>\n </a-card>\n </a-col>\n </a-row>\n </div>\n</template>\n\n<script>\nimport * as echarts from \"echarts\";\n\nexport default {\n name: \"Console\",\n data() {\n return {\n loading: false,\n // 用户统计数据\n totaluser: 0,\n totalteacher: 0,\n totalstudent: 0,\n totalmatch: 0,\n\n // 获奖数据\n firstlevel: 0,\n secondlevel: 0,\n thirdlevel: 0,\n\n // 报名趋势数据\n registrationTrendData: [],\n\n // 热门比赛列表\n hotCompetitions: [],\n\n // 其他统计数据\n totalinfo: 0,\n totalsuccess: 0,\n totalday: 0,\n totaldays: 0,\n\n // 图表实例\n registrationTrendChart: null,\n awardChart: null,\n\n // 是否使用模拟数据\n useMockData: false,\n };\n },\n mounted() {\n this.fetchAllData();\n },\n beforeDestroy() {\n // 销毁图表实例,避免内存泄漏\n if (this.registrationTrendChart) {\n this.registrationTrendChart.dispose();\n }\n if (this.awardChart) {\n this.awardChart.dispose();\n }\n },\n methods: {\n // 获取所有数据\n async fetchAllData() {\n this.loading = true;\n try {\n // 优先获取基础统计数据\n await this.fetchStatistics();\n // 获取其他数据\n await Promise.all([\n this.fetchAwardStats(),\n this.fetchRegistrationTrend(),\n this.fetchHotCompetitions(),\n ]);\n\n this.$nextTick(() => {\n this.initRegistrationTrendChart();\n this.initAwardChart();\n });\n } catch (error) {\n console.error(\"获取数据失败\", error);\n this.$message.error(\"获取数据失败\");\n } finally {\n this.loading = false;\n }\n },\n\n // 获取统计数据\n async fetchStatistics() {\n try {\n // this.$api.getWinCountByLevel\n const response = await this.$api.getCountTotal();\n console.log(\"response\", response);\n if (response.code === 200) {\n console.log(\"response.data\", response.data);\n const stats = response.data;\n // 直接使用接口返回的数据\n this.totaluser = stats.totalUsers;\n this.totalteacher = stats.teacherCount;\n this.totalstudent = stats.studentCount;\n this.totalmatch = stats.competitionCount;\n }\n } catch (error) {\n console.error(\"获取统计数据失败:\", error);\n this.$message.error(\"获取统计数据失败\");\n // 发生错误时重置数据为0\n this.totaluser = 0;\n this.totalteacher = 0;\n this.totalstudent = 0;\n this.totalmatch = 0;\n }\n },\n\n // 加载模拟数据\n loadMockData() {\n // 模拟用户统计数据\n this.totaluser = 1256;\n this.totalteacher = 128;\n this.totalstudent = 1128;\n this.totalmatch = 45;\n\n // 模拟获奖数据\n this.firstlevel = 56;\n this.secondlevel = 112;\n this.thirdlevel = 235;\n\n // 模拟其他统计数据\n this.totalinfo = 89;\n this.totalsuccess = 876;\n this.totalday = 32;\n this.totaldays = 5;\n\n // 模拟报名趋势数据\n this.generateMockTrendData();\n\n // 模拟热门比赛数据\n this.generateMockHotCompetitions();\n },\n\n // 生成模拟趋势数据\n generateMockTrendData() {\n const dates = [];\n const counts = [];\n const today = new Date();\n\n for (let i = 29; i >= 0; i--) {\n const date = new Date(today);\n date.setDate(date.getDate() - i);\n const dateStr = this.formatDate(date);\n dates.push(dateStr);\n\n // 生成随机报名数量,呈现波动上升趋势\n const baseCount = 5 + Math.floor((30 - i) / 3);\n const randomFactor = Math.floor(Math.random() * 10) - 3;\n const count = Math.max(0, baseCount + randomFactor);\n\n counts.push(count);\n }\n\n this.registrationTrendData = {\n dates,\n counts,\n };\n },\n\n // 生成模拟热门比赛数据\n generateMockHotCompetitions() {\n const competitionNames = [\n \"全国大学生数学建模竞赛\",\n \"互联网+创新创业大赛\",\n \"ACM程序设计大赛\",\n \"挑战杯创新创业大赛\",\n \"全国大学生机器人大赛\",\n ];\n\n this.hotCompetitions = competitionNames.map((name, index) => {\n // 生成随机报名人数,排名越前报名人数越多\n const baseCount = 200 - index * 30;\n const randomFactor = Math.floor(Math.random() * 20);\n\n return {\n competitionId: `comp-${index + 1}`,\n competitionName: name,\n registrationCount: baseCount + randomFactor,\n competitionStatus: Math.random() > 0.3 ? 0 : 1,\n };\n });\n },\n\n // 获取用户统计数据\n async fetchUserStats() {\n // 获取用户总数\n await this.$api.getCount().then((res) => {\n if (res.code == 200) {\n this.totaluser = res.data;\n }\n });\n\n // 获取教师总人数\n await this.$api.getTeacherCount().then((res) => {\n if (res.code == 200) {\n this.totalteacher = res.data;\n }\n });\n\n // 获取学生总人数\n await this.$api.getStudentCount().then((res) => {\n if (res.code == 200) {\n this.totalstudent = res.data;\n }\n });\n },\n\n // 获取比赛统计数据\n async fetchCompetitionStats() {\n // 获取所有比赛数量\n await this.$api.AllCompetition().then((res) => {\n if (res.code == 200) {\n this.totalmatch = res.data.length;\n\n // 处理热门比赛数据\n this.processCompetitionData(res.data);\n }\n });\n\n // 获取所有资料\n await this.$api.Allinformation().then((res) => {\n if (res.code == 200) {\n this.totalinfo = res.data.length;\n }\n });\n\n // 获取七天内比赛的数量\n const currentDate = new Date();\n const sevenDaysAgo = new Date(currentDate);\n sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);\n\n await this.$api.AllCompetition().then((res) => {\n if (res.code == 200) {\n this.totaldays = res.data.filter((item) => {\n const registrationEndTime = new Date(item.registrationEndTime);\n return (\n registrationEndTime >= sevenDaysAgo &&\n registrationEndTime <= currentDate\n );\n }).length;\n }\n });\n },\n\n // 获取获奖统计数据\n async fetchAwardStats() {\n // 一等奖人数\n await this.$api.getWinCountByLevel({ level: \"一等奖\" }).then((res) => {\n if (res.code == 200) {\n this.firstlevel = res.data;\n }\n });\n\n // 二等奖人数\n await this.$api.getWinCountByLevel({ level: \"二等奖\" }).then((res) => {\n if (res.code == 200) {\n this.secondlevel = res.data;\n }\n });\n\n // 三等奖\n await this.$api.getWinCountByLevel({ level: \"三等奖\" }).then((res) => {\n if (res.code == 200) {\n this.thirdlevel = res.data;\n }\n });\n },\n\n // 获取报名趋势数据\n async fetchRegistrationTrend() {\n // 获取报名记录\n await this.$api.RegistrationAll().then((res) => {\n if (res.code == 200) {\n // 处理报名趋势数据\n this.processRegistrationTrendData(res.data);\n\n // 获取成功报名数量\n this.totalsuccess = res.data.filter(\n (item) => item.registrationStatus == \"成功报名\"\n ).length;\n\n // 获取七天内成功报名的数量\n const currentDate = new Date();\n const sevenDaysAgo = new Date(currentDate);\n sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);\n\n this.totalday = res.data.filter((item) => {\n const registrationTime = new Date(item.registrationTime);\n return (\n registrationTime >= sevenDaysAgo &&\n registrationTime <= currentDate\n );\n }).length;\n }\n });\n },\n\n // 获取热门比赛数据\n async fetchHotCompetitions() {\n // 获取报名记录和比赛数据\n const [registrationRes, competitionRes] = await Promise.all([\n this.$api.RegistrationAll(),\n this.$api.AllCompetition(),\n ]);\n\n if (registrationRes.code == 200 && competitionRes.code == 200) {\n const registrations = registrationRes.data;\n const competitions = competitionRes.data;\n\n // 计算每个比赛的报名人数\n const competitionCounts = {};\n registrations.forEach((reg) => {\n if (!competitionCounts[reg.competitionId]) {\n competitionCounts[reg.competitionId] = 0;\n }\n competitionCounts[reg.competitionId]++;\n });\n\n // 将比赛数据与报名人数合并\n const competitionsWithCount = competitions.map((comp) => ({\n ...comp,\n registrationCount: competitionCounts[comp.competitionId] || 0,\n }));\n\n // 按报名人数排序,取前5个\n this.hotCompetitions = competitionsWithCount\n .sort((a, b) => b.registrationCount - a.registrationCount)\n .slice(0, 5);\n }\n },\n\n // 处理报名趋势数据\n processRegistrationTrendData(registrations) {\n // 获取最近30天的日期\n const dates = [];\n const counts = [];\n const today = new Date();\n\n for (let i = 29; i >= 0; i--) {\n const date = new Date(today);\n date.setDate(date.getDate() - i);\n const dateStr = this.formatDate(date);\n dates.push(dateStr);\n\n // 计算当天的报名数量\n const count = registrations.filter((reg) => {\n const regDate = new Date(reg.registrationTime);\n return this.formatDate(regDate) === dateStr;\n }).length;\n\n counts.push(count);\n }\n\n this.registrationTrendData = {\n dates,\n counts,\n };\n },\n\n // 处理比赛数据\n processCompetitionData(competitions) {\n // 在这里可以添加更多的数据处理逻辑\n },\n\n // 初始化报名趋势图表\n initRegistrationTrendChart() {\n const chartDom = this.$refs.registrationTrend;\n this.registrationTrendChart = echarts.init(chartDom);\n\n const option = {\n tooltip: {\n trigger: \"axis\",\n axisPointer: {\n type: \"shadow\",\n },\n },\n grid: {\n left: \"3%\",\n right: \"4%\",\n bottom: \"3%\",\n containLabel: true,\n },\n xAxis: {\n type: \"category\",\n data: this.registrationTrendData.dates,\n axisLabel: {\n rotate: 45,\n },\n },\n yAxis: {\n type: \"value\",\n name: \"报名人数\",\n },\n series: [\n {\n name: \"报名人数\",\n type: \"line\",\n data: this.registrationTrendData.counts,\n smooth: true,\n areaStyle: {\n opacity: 0.3,\n },\n itemStyle: {\n color: \"#1890ff\",\n },\n },\n ],\n };\n\n this.registrationTrendChart.setOption(option);\n\n // 响应窗口大小变化\n window.addEventListener(\"resize\", () => {\n this.registrationTrendChart.resize();\n });\n },\n\n // 初始化获奖情况图表\n initAwardChart() {\n const chartDom = this.$refs.awardChart;\n this.awardChart = echarts.init(chartDom);\n\n const option = {\n tooltip: {\n trigger: \"item\",\n formatter: \"{a} <br/>{b}: {c} ({d}%)\",\n },\n legend: {\n orient: \"horizontal\",\n bottom: \"bottom\",\n data: [\"一等奖\", \"二等奖\", \"三等奖\"],\n },\n series: [\n {\n name: \"获奖情况\",\n type: \"pie\",\n radius: [\"40%\", \"70%\"],\n avoidLabelOverlap: false,\n itemStyle: {\n borderRadius: 10,\n borderColor: \"#fff\",\n borderWidth: 2,\n },\n label: {\n show: false,\n position: \"center\",\n },\n emphasis: {\n label: {\n show: true,\n fontSize: \"18\",\n fontWeight: \"bold\",\n },\n },\n labelLine: {\n show: false,\n },\n data: [\n {\n value: this.firstlevel,\n name: \"一等奖\",\n itemStyle: { color: \"#ff4d4f\" },\n },\n {\n value: this.secondlevel,\n name: \"二等奖\",\n itemStyle: { color: \"#faad14\" },\n },\n {\n value: this.thirdlevel,\n name: \"三等奖\",\n itemStyle: { color: \"#52c41a\" },\n },\n ],\n },\n ],\n };\n\n this.awardChart.setOption(option);\n\n // 响应窗口大小变化\n window.addEventListener(\"resize\", () => {\n this.awardChart.resize();\n });\n },\n\n // 格式化日期\n formatDate(date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n },\n\n // 获取比赛状态文本\n getCompetitionStatus(status) {\n const statusMap = {\n 0: \"进行中\",\n 1: \"已终止\",\n };\n return statusMap[status] || \"未知状态\";\n },\n },\n};\n</script>\n\n<style lang=\"less\" scoped>\n.dashboard-container {\n padding: 24px;\n background-color: #f0f2f5;\n min-height: 100%;\n}\n\n.data-card {\n margin-bottom: 24px;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);\n transition: all 0.3s;\n\n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n }\n\n :deep(.ant-statistic-title) {\n font-size: 16px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 16px;\n }\n\n :deep(.ant-statistic-content) {\n font-size: 28px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.85);\n }\n\n :deep(.ant-statistic-content-prefix) {\n margin-right: 8px;\n font-size: 24px;\n color: #1890ff;\n }\n}\n\n.ant-card {\n border-radius: 8px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);\n\n :deep(.ant-card-head) {\n border-bottom: 1px solid #f0f0f0;\n padding: 0 24px;\n\n .ant-card-head-title {\n font-size: 16px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.85);\n }\n }\n}\n</style>\n"]}]} |