1 line
35 KiB
JSON
1 line
35 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/account/center/index.vue?vue&type=script&lang=js","dependencies":[{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/views/account/center/index.vue","mtime":1743943089632},{"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:CmltcG9ydCBQYWdlVmlldyBmcm9tICIuLi8uLi8uLi9sYXlvdXRzL1BhZ2VWaWV3LnZ1ZSI7CmltcG9ydCBSb3V0ZVZpZXcgZnJvbSAiLi4vLi4vLi4vbGF5b3V0cy9Sb3V0ZVZpZXcudnVlIjsKaW1wb3J0IHsgQXBwUGFnZSwgQXJ0aWNsZVBhZ2UsIFByb2plY3RQYWdlIH0gZnJvbSAiLi9wYWdlIjsKaW1wb3J0IHsgbWFwR2V0dGVycyB9IGZyb20gInZ1ZXgiOwoKZXhwb3J0IGRlZmF1bHQgewogIGNvbXBvbmVudHM6IHsKICAgIFJvdXRlVmlldywKICAgIFBhZ2VWaWV3LAogICAgQXBwUGFnZSwKICAgIEFydGljbGVQYWdlLAogICAgUHJvamVjdFBhZ2UsCiAgfSwKICBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgdXNlcmltZzogdGhpcy4kc3RvcmUuc3RhdGUuYXZhdGFyLAogICAgICB0YWdzOiBbIuaKgOacr+eIseWlveiAhSIsICLliY3nq6/lvIDlj5EiLCAi55Sf5rS76K6w5b2VIl0sCiAgICAgIHRhZ0lucHV0VmlzaWJsZTogZmFsc2UsCiAgICAgIHRhZ0lucHV0VmFsdWU6ICIiLAogICAgICB0ZWFtU3Bpbm5pbmc6IHRydWUsCiAgICAgIHNoZW5mZW46ICIiLAogICAgICB0YWJMaXN0Tm9UaXRsZTogWwogICAgICAgIHsKICAgICAgICAgIGtleTogImFydGljbGUiLAogICAgICAgICAgdGFiOiAi5oiR55qE5paH56ugIiwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGtleTogImFwcCIsCiAgICAgICAgICB0YWI6ICLmiJHnmoTmlLbol48iLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAga2V5OiAicHJvamVjdCIsCiAgICAgICAgICB0YWI6ICLmiJHnmoTor4TorroiLAogICAgICAgIH0sCiAgICAgIF0sCiAgICAgIG5vVGl0bGVLZXk6ICJhcnRpY2xlIiwKICAgICAgbWF0Y2hzOiBbXSwKICAgICAgY29sb3JzOiBbIiNmNTAiLCAiIzJkYjdmNSIsICIjODdkMDY4IiwgIiMxMDhlZTkiLCAiIzcyMmVkMSJdLAoKICAgICAgLy8g5paH56ug55u45YWz5pWw5o2uCiAgICAgIGFydGljbGVzOiBbXSwKICAgICAgY3VycmVudDogMSwKICAgICAgcGFnZVNpemU6IDYsCiAgICAgIHRvdGFsOiAwLAogICAgICBhcnRpY2xlRmlsdGVyOiAiYWxsIiwKCiAgICAgIC8vIOe7n+iuoeaVsOaNrgogICAgICBhcnRpY2xlQ291bnQ6IDAsCiAgICAgIHZpZXdDb3VudDogMCwKICAgICAgbGlrZUNvdW50OiAwLAogICAgfTsKICB9LAogIGNvbXB1dGVkOiB7CiAgICAuLi5tYXBHZXR0ZXJzKFsibmlja25hbWUiLCAiYXZhdGFyIl0pLAogIH0sCiAgbW91bnRlZCgpIHsKICAgIC8vIOiuvue9rueUqOaIt+i6q+S7vQogICAgaWYgKHRoaXMuJHN0b3JlLnN0YXRlLnVzZXIudXNlclByaXZpbGVnZXMgPT0gMCkgewogICAgICB0aGlzLnNoZW5mZW4gPSAi566h55CG5ZGYIjsKICAgIH0gZWxzZSBpZiAodGhpcy4kc3RvcmUuc3RhdGUudXNlci51c2VyUHJpdmlsZWdlcyA9PSAxKSB7CiAgICAgIHRoaXMuc2hlbmZlbiA9ICLmlZnluIgiOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zaGVuZmVuID0gIuWtpueUnyI7CiAgICB9CgogICAgLy8g6I635Y+W5q+U6LWb5L+h5oGvCiAgICB0aGlzLmZldGNoQ29tcGV0aXRpb25zKCk7CgogICAgLy8g6I635Y+W5paH56ug5YiX6KGoCiAgICB0aGlzLmZldGNoQXJ0aWNsZXMoKTsKCiAgICAvLyDojrflj5bnu5/orqHmlbDmja4KICAgIHRoaXMuZmV0Y2hTdGF0cygpOwogIH0sCiAgbWV0aG9kczogewogICAgLy8g6I635Y+W5q+U6LWb5L+h5oGvCiAgICBmZXRjaENvbXBldGl0aW9ucygpIHsKICAgICAgdGhpcy50ZWFtU3Bpbm5pbmcgPSB0cnVlOwogICAgICB0aGlzLiRhcGkKICAgICAgICAuUmVnaXN0cmF0aW9uQWxsKCkKICAgICAgICAudGhlbigocmVzKSA9PiB7CiAgICAgICAgICB0aGlzLm1hdGNocyA9IHJlcy5kYXRhLmZpbHRlcigobWF0Y2gpID0+IHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoLnN0dWRlbnRJZCA9PSB0aGlzLiRzdG9yZS5zdGF0ZS51c2VyLnVzZXJJZDsKICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy50ZWFtU3Bpbm5pbmcgPSBmYWxzZTsKICAgICAgICB9KQogICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCLojrflj5bmr5TotZvkv6Hmga/lpLHotKU6IiwgZXJyKTsKICAgICAgICAgIHRoaXMudGVhbVNwaW5uaW5nID0gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8vIOiOt+WPluaWh+eroOWIl+ihqAogICAgZmV0Y2hBcnRpY2xlcygpIHsKICAgICAgdGhpcy4kYXBpCiAgICAgICAgLkFsbEFydGljbGUoKQogICAgICAgIC50aGVuKChyZXMpID0+IHsKICAgICAgICAgIC8vIOi/h+a7pOWHuuW9k+WJjeeUqOaIt+eahOaWh+eroAogICAgICAgICAgY29uc3QgdXNlckFydGljbGVzID0gcmVzLmRhdGEuZmlsdGVyKChhcnRpY2xlKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBhcnRpY2xlLnVzZXJJZCA9PT0gdGhpcy4kc3RvcmUuc3RhdGUudXNlci51c2VySWQ7CiAgICAgICAgICB9KTsKCiAgICAgICAgICAvLyDmoLnmja7nrZvpgInmnaHku7bmjpLluo8KICAgICAgICAgIHRoaXMuZmlsdGVyQXJ0aWNsZXNCeUNvbmRpdGlvbih1c2VyQXJ0aWNsZXMpOwoKICAgICAgICAgIC8vIOiuvue9ruaAu+aVsAogICAgICAgICAgdGhpcy50b3RhbCA9IHVzZXJBcnRpY2xlcy5sZW5ndGg7CiAgICAgICAgICB0aGlzLmFydGljbGVDb3VudCA9IHVzZXJBcnRpY2xlcy5sZW5ndGg7CgogICAgICAgICAgLy8g6K6h566X5oC75rWP6KeI6YeP5ZKM54K56LWe5pWwCiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVN0YXRzKHVzZXJBcnRpY2xlcyk7CiAgICAgICAgfSkKICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgY29uc29sZS5lcnJvcigi6I635Y+W5paH56ug5YiX6KGo5aSx6LSlOiIsIGVycik7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8vIOagueaNruetm+mAieadoeS7tui/h+a7pOaWh+eroAogICAgZmlsdGVyQXJ0aWNsZXNCeUNvbmRpdGlvbihhcnRpY2xlcykgewogICAgICBsZXQgZmlsdGVyZWRBcnRpY2xlcyA9IFsuLi5hcnRpY2xlc107CgogICAgICAvLyDlupTnlKjnrZvpgInmnaHku7YKICAgICAgc3dpdGNoICh0aGlzLmFydGljbGVGaWx0ZXIpIHsKICAgICAgICBjYXNlICJob3QiOgogICAgICAgICAgLy8g5oyJ54Ot5bqm77yI5rWP6KeI6YeP77yJ5o6S5bqPCiAgICAgICAgICBmaWx0ZXJlZEFydGljbGVzLnNvcnQoCiAgICAgICAgICAgIChhLCBiKSA9PiAoYi52aWV3Q291bnQgfHwgMCkgLSAoYS52aWV3Q291bnQgfHwgMCkKICAgICAgICAgICk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyZWNlbnQiOgogICAgICAgICAgLy8g5oyJ5Y+R5biD5pe26Ze05o6S5bqPCiAgICAgICAgICBmaWx0ZXJlZEFydGljbGVzLnNvcnQoCiAgICAgICAgICAgIChhLCBiKSA9PiBuZXcgRGF0ZShiLnB1Ymxpc2hUaW1lKSAtIG5ldyBEYXRlKGEucHVibGlzaFRpbWUpCiAgICAgICAgICApOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8vIOm7mOiupOaMieWPkeW4g+aXtumXtOaOkuW6jwogICAgICAgICAgZmlsdGVyZWRBcnRpY2xlcy5zb3J0KAogICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYi5wdWJsaXNoVGltZSkgLSBuZXcgRGF0ZShhLnB1Ymxpc2hUaW1lKQogICAgICAgICAgKTsKICAgICAgfQoKICAgICAgLy8g5YiG6aG15aSE55CGCiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAodGhpcy5jdXJyZW50IC0gMSkgKiB0aGlzLnBhZ2VTaXplOwogICAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyB0aGlzLnBhZ2VTaXplOwogICAgICB0aGlzLmFydGljbGVzID0gZmlsdGVyZWRBcnRpY2xlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICB9LAoKICAgIC8vIOiuoeeul+e7n+iuoeaVsOaNrgogICAgY2FsY3VsYXRlU3RhdHMoYXJ0aWNsZXMpIHsKICAgICAgdGhpcy52aWV3Q291bnQgPSBhcnRpY2xlcy5yZWR1Y2UoCiAgICAgICAgKHN1bSwgYXJ0aWNsZSkgPT4gc3VtICsgKGFydGljbGUudmlld0NvdW50IHx8IDApLAogICAgICAgIDAKICAgICAgKTsKICAgICAgdGhpcy5saWtlQ291bnQgPSBhcnRpY2xlcy5yZWR1Y2UoCiAgICAgICAgKHN1bSwgYXJ0aWNsZSkgPT4gc3VtICsgKGFydGljbGUubGlrZUNvdW50IHx8IDApLAogICAgICAgIDAKICAgICAgKTsKICAgIH0sCgogICAgLy8g6I635Y+W57uf6K6h5pWw5o2uCiAgICBmZXRjaFN0YXRzKCkgewogICAgICAvLyDlpoLmnpzmnInkuJPpl6jnmoRBUEnlj6/ku6XlnKjov5nph4zosIPnlKgKICAgIH0sCgogICAgLy8g562b6YCJ5paH56ugCiAgICBmaWx0ZXJBcnRpY2xlcygpIHsKICAgICAgdGhpcy5jdXJyZW50ID0gMTsgLy8g6YeN572u6aG156CBCiAgICAgIHRoaXMuZmV0Y2hBcnRpY2xlcygpOwogICAgfSwKCiAgICAvLyDliIbpobXlpITnkIYKICAgIGhhbmRsZVBhZ2VDaGFuZ2UocGFnZSkgewogICAgICB0aGlzLmN1cnJlbnQgPSBwYWdlOwogICAgICB0aGlzLmZldGNoQXJ0aWNsZXMoKTsKICAgIH0sCgogICAgLy8g5q+P6aG15pi+56S65pWw6YeP5Y+Y5YyWCiAgICBvblNob3dTaXplQ2hhbmdlKGN1cnJlbnQsIHNpemUpIHsKICAgICAgdGhpcy5jdXJyZW50ID0gMTsKICAgICAgdGhpcy5wYWdlU2l6ZSA9IHNpemU7CiAgICAgIHRoaXMuZmV0Y2hBcnRpY2xlcygpOwogICAgfSwKCiAgICAvLyDojrflj5bmlofnq6DlsIHpnaLlm74KICAgIGdldEFydGljbGVJbWFnZShhcnRpY2xlKSB7CiAgICAgIGlmICghYXJ0aWNsZS5hcnRpY2xlQ29udGVudCkgcmV0dXJuIHJlcXVpcmUoIkAvYXNzZXRzL2JnLnN2ZyIpOwoKICAgICAgLy8g5LuO5paH56ug5YaF5a655Lit5o+Q5Y+W5Zu+54mHCiAgICAgIGNvbnN0IGltYWdlUmVnZXggPSAvKGh0dHBbc10/OlwvXC9bXihcc3wiKV0rXC4ocG5nfGpwZ3xqcGVnfGdpZnx3ZWJwKSkvZ2k7CiAgICAgIGNvbnN0IG1hdGNoZXMgPSBhcnRpY2xlLmFydGljbGVDb250ZW50Lm1hdGNoKGltYWdlUmVnZXgpOwoKICAgICAgLy8g5aaC5p6c5om+5Yiw5Zu+54mH77yM6L+U5Zue56ys5LiA5bygCiAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoID4gMCkgewogICAgICAgIHJldHVybiBtYXRjaGVzWzBdOwogICAgICB9CgogICAgICBjb25zdCByYW5kb21TZWVkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDApOwoKICAgICAgLy8g5aaC5p6c5rKh5pyJ5om+5Yiw5Yy56YWN55qE5Zu+54mH77yM5Y+v5Lul5L2/55So6ZqP5py65Zu+54mHCiAgICAgIHJldHVybiAiaHR0cHM6Ly90dS5sdHl1YW5mYW5nLmNuL2FwaS9mZW5namluZy5waHA/IiArIHJhbmRvbVNlZWQ7CiAgICB9LAoKICAgIC8vIOiOt+WPluaWh+eroOaRmOimgQogICAgZ2V0QXJ0aWNsZUV4Y2VycHQoY29udGVudCkgewogICAgICBpZiAoIWNvbnRlbnQpIHJldHVybiAiIjsKCiAgICAgIC8vIOenu+mZpEhUTUzmoIfnrb4KICAgICAgY29uc3QgcGxhaW5UZXh0ID0gY29udGVudC5yZXBsYWNlKC88W14+XSs+L2csICIiKTsKCiAgICAgIC8vIOaIquWPluWJjTEwMOS4quWtl+espuS9nOS4uuaRmOimgQogICAgICByZXR1cm4gKAogICAgICAgIHBsYWluVGV4dC5zdWJzdHJpbmcoMCwgMTAwKSArIChwbGFpblRleHQubGVuZ3RoID4gMTAwID8gIi4uLiIgOiAiIikKICAgICAgKTsKICAgIH0sCgogICAgLy8g5qC85byP5YyW5pel5pyfCiAgICBmb3JtYXREYXRlKGRhdGVTdHJpbmcpIHsKICAgICAgaWYgKCFkYXRlU3RyaW5nKSByZXR1cm4gIiI7CgogICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7CiAgICAgIHJldHVybiBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KAogICAgICAgIDIsCiAgICAgICAgIjAiCiAgICAgICl9LSR7U3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAiMCIpfWA7CiAgICB9LAoKICAgIC8vIOafpeeci+aWh+eroOivpuaDhQogICAgdmlld0FydGljbGUoaWQpIHsKICAgICAgdGhpcy4kcm91dGVyLnB1c2goYC9jb21tdW5pdHkvcGFnZXM/aWQ9JHtpZH1gKTsKICAgIH0sCgogICAgLy8g5Yib5bu65paw5paH56ugCiAgICBjcmVhdGVOZXdBcnRpY2xlKCkgewogICAgICB0aGlzLiRyb3V0ZXIucHVzaCgiL3dyaXRlIik7CiAgICB9LAoKICAgIC8vIOagh+etvuebuOWFs+aWueazlQogICAgaGFuZGxlVGFiQ2hhbmdlKGtleSwgdHlwZSkgewogICAgICB0aGlzW3R5cGVdID0ga2V5OwogICAgfSwKCiAgICBoYW5kbGVUYWdDbG9zZShyZW1vdmVUYWcpIHsKICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFncy5maWx0ZXIoKHRhZykgPT4gdGFnICE9PSByZW1vdmVUYWcpOwogICAgICB0aGlzLnRhZ3MgPSB0YWdzOwogICAgfSwKCiAgICBzaG93VGFnSW5wdXQoKSB7CiAgICAgIHRoaXMudGFnSW5wdXRWaXNpYmxlID0gdHJ1ZTsKICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gewogICAgICAgIHRoaXMuJHJlZnMudGFnSW5wdXQuZm9jdXMoKTsKICAgICAgfSk7CiAgICB9LAoKICAgIGhhbmRsZUlucHV0Q2hhbmdlKGUpIHsKICAgICAgdGhpcy50YWdJbnB1dFZhbHVlID0gZS50YXJnZXQudmFsdWU7CiAgICB9LAoKICAgIGhhbmRsZVRhZ0lucHV0Q29uZmlybSgpIHsKICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IHRoaXMudGFnSW5wdXRWYWx1ZTsKICAgICAgbGV0IHRhZ3MgPSB0aGlzLnRhZ3M7CiAgICAgIGlmIChpbnB1dFZhbHVlICYmICF0YWdzLmluY2x1ZGVzKGlucHV0VmFsdWUpKSB7CiAgICAgICAgdGFncyA9IFsuLi50YWdzLCBpbnB1dFZhbHVlXTsKICAgICAgfQoKICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7CiAgICAgICAgdGFncywKICAgICAgICB0YWdJbnB1dFZpc2libGU6IGZhbHNlLAogICAgICAgIHRhZ0lucHV0VmFsdWU6ICIiLAogICAgICB9KTsKICAgIH0sCiAgfSwKfTsK"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AA0NA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;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;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/account/center","sourcesContent":["<template>\n <div class=\"page-header-wrapper-grid-content-main custom-scrollbar\">\n <!-- 数据统计卡片 -->\n <div class=\"data-stats animate-fade-in-up\">\n <div class=\"stat-card glow-border\">\n <div class=\"stat-number\">{{ articleCount }}</div>\n <div class=\"stat-title\">发布文章</div>\n </div>\n <div class=\"stat-card glow-border\">\n <div class=\"stat-number\">{{ viewCount }}</div>\n <div class=\"stat-title\">文章浏览</div>\n </div>\n <div class=\"stat-card glow-border\">\n <div class=\"stat-number\">{{ likeCount }}</div>\n <div class=\"stat-title\">获得点赞</div>\n </div>\n <div class=\"stat-card glow-border\">\n <div class=\"stat-number\">{{ matchs.length }}</div>\n <div class=\"stat-title\">参与比赛</div>\n </div>\n </div>\n\n <a-row :gutter=\"24\">\n <a-col :md=\"24\" :lg=\"8\">\n <a-card\n :bordered=\"false\"\n class=\"hover-card animate-fade-in-up\"\n style=\"animation-delay: 0.1s\"\n >\n <div class=\"account-center-avatarHolder\">\n <div class=\"avatar\">\n <img\n :src=\"src=\"https://onlinephoto.oss-cn-chengdu.aliyuncs.com/hangtian/touxiang.jpg\"\n data-src=\"//www.cmstui.com/wp-content/themes/zibll/img/avatar-default.png\"\n class=\"lazyload avatar avatar-id-1\"\" alt=\"用户头像\" />\n </div>\n <div class=\"username\">{{ $store.state.user.userName }}</div>\n <div class=\"bio\">{{ shenfen }}</div>\n </div>\n\n <a-divider />\n\n <div class=\"account-center-tags\">\n <div class=\"tagsTitle\">个人标签</div>\n <div>\n <template v-for=\"(tag, index) in tags\">\n <a-tooltip v-if=\"tag.length > 20\" :key=\"tag\" :title=\"tag\">\n <a-tag\n :key=\"tag\"\n :closable=\"index !== 0\"\n @close=\"() => handleTagClose(tag)\"\n >{{ `${tag.slice(0, 20)}...` }}</a-tag\n >\n </a-tooltip>\n <a-tag\n v-else\n :key=\"tag\"\n :closable=\"index !== 0\"\n @close=\"() => handleTagClose(tag)\"\n >{{ tag }}</a-tag\n >\n </template>\n <a-input\n v-if=\"tagInputVisible\"\n ref=\"tagInput\"\n type=\"text\"\n size=\"small\"\n :style=\"{ width: '78px' }\"\n :value=\"tagInputValue\"\n @change=\"handleInputChange\"\n @blur=\"handleTagInputConfirm\"\n @keyup.enter=\"handleTagInputConfirm\"\n />\n <a-tag\n v-else\n @click=\"showTagInput\"\n style=\"background: #fff; borderstyle: dashed\"\n >\n <a-icon type=\"plus\" />添加标签\n </a-tag>\n </div>\n </div>\n\n <a-divider :dashed=\"true\" />\n\n <div class=\"account-center-team\">\n <div class=\"teamTitle\">我的比赛</div>\n <a-empty v-if=\"matchs.length === 0\" description=\"暂无参赛记录\" />\n <a-spin :spinning=\"teamSpinning\">\n <div class=\"members\" v-for=\"(item, index) in matchs\" :key=\"index\">\n <a-card\n class=\"match-card\"\n :bordered=\"false\"\n :bodyStyle=\"{ padding: '12px' }\"\n >\n <div class=\"match-title\">\n <a-icon\n type=\"trophy\"\n :style=\"{ color: colors[index % colors.length] }\"\n />\n <span>{{ item.competitionName }}</span>\n </div>\n <div class=\"match-info\">\n <a-tag :color=\"colors[index % colors.length]\">\n {{ item.competitionType }}\n </a-tag>\n <span class=\"match-date\">{{\n formatDate(item.registrationTime)\n }}</span>\n </div>\n </a-card>\n </div>\n </a-spin>\n </div>\n </a-card>\n </a-col>\n\n <a-col :md=\"24\" :lg=\"16\">\n <a-card\n class=\"animate-fade-in-up\"\n style=\"animation-delay: 0.2s; width: 100%\"\n :bordered=\"false\"\n :tabList=\"tabListNoTitle\"\n :activeTabKey=\"noTitleKey\"\n @tabChange=\"(key) => handleTabChange(key, 'noTitleKey')\"\n >\n <div v-if=\"noTitleKey === 'article'\">\n <!-- 文章筛选和排序 -->\n <div class=\"article-filter\">\n <a-radio-group\n v-model=\"articleFilter\"\n buttonStyle=\"solid\"\n @change=\"filterArticles\"\n >\n <a-radio-button value=\"all\">全部文章</a-radio-button>\n <a-radio-button value=\"hot\">热门文章</a-radio-button>\n <a-radio-button value=\"recent\">最近发布</a-radio-button>\n </a-radio-group>\n\n <a-button type=\"primary\" icon=\"plus\" @click=\"createNewArticle\">\n 发布文章\n </a-button>\n </div>\n\n <!-- 文章列表 -->\n <div class=\"article-list\">\n <a-empty v-if=\"articles.length === 0\" description=\"暂无文章\" />\n <div v-else>\n <div\n class=\"article-item\"\n v-for=\"(article, index) in articles\"\n :key=\"index\"\n @click=\"viewArticle(article.id)\"\n >\n <div class=\"article-cover\">\n <img :src=\"getArticleImage(article)\" :alt=\"article.title\" />\n </div>\n <div class=\"article-content\">\n <div class=\"article-title\">{{ article.articleTitle }}</div>\n <div\n class=\"article-description\"\n v-html=\"getArticleExcerpt(article.articleContent)\"\n ></div>\n <div class=\"article-meta\">\n <div class=\"article-date\">\n <a-icon type=\"calendar\" />\n {{ formatDate(article.publishTime) }}\n </div>\n <div class=\"article-stats\">\n <span\n ><a-icon type=\"eye\" />\n {{ article.viewCount || 0 }}</span\n >\n <span style=\"margin-left: 16px\"\n ><a-icon type=\"like\" />\n {{ article.likeCount || 0 }}</span\n >\n <span style=\"margin-left: 16px\"\n ><a-icon type=\"message\" />\n {{ article.commentCount || 0 }}</span\n >\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- 分页 -->\n <div class=\"pagination-container\" v-if=\"articles.length > 0\">\n <a-pagination\n :current=\"current\"\n :pageSize=\"pageSize\"\n :total=\"total\"\n @change=\"handlePageChange\"\n showQuickJumper\n :showSizeChanger=\"true\"\n :pageSizeOptions=\"['6', '12', '24', '36']\"\n @showSizeChange=\"onShowSizeChange\"\n />\n </div>\n </div>\n </div>\n\n <!-- 其他标签页内容 -->\n <div v-else-if=\"noTitleKey === 'app'\">\n <a-empty description=\"功能开发中...\" />\n </div>\n\n <div v-else-if=\"noTitleKey === 'project'\">\n <a-empty description=\"功能开发中...\" />\n </div>\n </a-card>\n </a-col>\n </a-row>\n </div>\n</template>\n\n<script>\nimport PageView from \"../../../layouts/PageView.vue\";\nimport RouteView from \"../../../layouts/RouteView.vue\";\nimport { AppPage, ArticlePage, ProjectPage } from \"./page\";\nimport { mapGetters } from \"vuex\";\n\nexport default {\n components: {\n RouteView,\n PageView,\n AppPage,\n ArticlePage,\n ProjectPage,\n },\n data() {\n return {\n userimg: this.$store.state.avatar,\n tags: [\"技术爱好者\", \"前端开发\", \"生活记录\"],\n tagInputVisible: false,\n tagInputValue: \"\",\n teamSpinning: true,\n shenfen: \"\",\n tabListNoTitle: [\n {\n key: \"article\",\n tab: \"我的文章\",\n },\n {\n key: \"app\",\n tab: \"我的收藏\",\n },\n {\n key: \"project\",\n tab: \"我的评论\",\n },\n ],\n noTitleKey: \"article\",\n matchs: [],\n colors: [\"#f50\", \"#2db7f5\", \"#87d068\", \"#108ee9\", \"#722ed1\"],\n\n // 文章相关数据\n articles: [],\n current: 1,\n pageSize: 6,\n total: 0,\n articleFilter: \"all\",\n\n // 统计数据\n articleCount: 0,\n viewCount: 0,\n likeCount: 0,\n };\n },\n computed: {\n ...mapGetters([\"nickname\", \"avatar\"]),\n },\n mounted() {\n // 设置用户身份\n if (this.$store.state.user.userPrivileges == 0) {\n this.shenfen = \"管理员\";\n } else if (this.$store.state.user.userPrivileges == 1) {\n this.shenfen = \"教师\";\n } else {\n this.shenfen = \"学生\";\n }\n\n // 获取比赛信息\n this.fetchCompetitions();\n\n // 获取文章列表\n this.fetchArticles();\n\n // 获取统计数据\n this.fetchStats();\n },\n methods: {\n // 获取比赛信息\n fetchCompetitions() {\n this.teamSpinning = true;\n this.$api\n .RegistrationAll()\n .then((res) => {\n this.matchs = res.data.filter((match) => {\n return match.studentId == this.$store.state.user.userId;\n });\n this.teamSpinning = false;\n })\n .catch((err) => {\n console.error(\"获取比赛信息失败:\", err);\n this.teamSpinning = false;\n });\n },\n\n // 获取文章列表\n fetchArticles() {\n this.$api\n .AllArticle()\n .then((res) => {\n // 过滤出当前用户的文章\n const userArticles = res.data.filter((article) => {\n return article.userId === this.$store.state.user.userId;\n });\n\n // 根据筛选条件排序\n this.filterArticlesByCondition(userArticles);\n\n // 设置总数\n this.total = userArticles.length;\n this.articleCount = userArticles.length;\n\n // 计算总浏览量和点赞数\n this.calculateStats(userArticles);\n })\n .catch((err) => {\n console.error(\"获取文章列表失败:\", err);\n });\n },\n\n // 根据筛选条件过滤文章\n filterArticlesByCondition(articles) {\n let filteredArticles = [...articles];\n\n // 应用筛选条件\n switch (this.articleFilter) {\n case \"hot\":\n // 按热度(浏览量)排序\n filteredArticles.sort(\n (a, b) => (b.viewCount || 0) - (a.viewCount || 0)\n );\n break;\n case \"recent\":\n // 按发布时间排序\n filteredArticles.sort(\n (a, b) => new Date(b.publishTime) - new Date(a.publishTime)\n );\n break;\n default:\n // 默认按发布时间排序\n filteredArticles.sort(\n (a, b) => new Date(b.publishTime) - new Date(a.publishTime)\n );\n }\n\n // 分页处理\n const startIndex = (this.current - 1) * this.pageSize;\n const endIndex = startIndex + this.pageSize;\n this.articles = filteredArticles.slice(startIndex, endIndex);\n },\n\n // 计算统计数据\n calculateStats(articles) {\n this.viewCount = articles.reduce(\n (sum, article) => sum + (article.viewCount || 0),\n 0\n );\n this.likeCount = articles.reduce(\n (sum, article) => sum + (article.likeCount || 0),\n 0\n );\n },\n\n // 获取统计数据\n fetchStats() {\n // 如果有专门的API可以在这里调用\n },\n\n // 筛选文章\n filterArticles() {\n this.current = 1; // 重置页码\n this.fetchArticles();\n },\n\n // 分页处理\n handlePageChange(page) {\n this.current = page;\n this.fetchArticles();\n },\n\n // 每页显示数量变化\n onShowSizeChange(current, size) {\n this.current = 1;\n this.pageSize = size;\n this.fetchArticles();\n },\n\n // 获取文章封面图\n getArticleImage(article) {\n if (!article.articleContent) return require(\"@/assets/bg.svg\");\n\n // 从文章内容中提取图片\n const imageRegex = /(http[s]?:\\/\\/[^(\\s|\")]+\\.(png|jpg|jpeg|gif|webp))/gi;\n const matches = article.articleContent.match(imageRegex);\n\n // 如果找到图片,返回第一张\n if (matches && matches.length > 0) {\n return matches[0];\n }\n\n const randomSeed = Math.floor(Math.random() * 10000);\n\n // 如果没有找到匹配的图片,可以使用随机图片\n return \"https://tu.ltyuanfang.cn/api/fengjing.php?\" + randomSeed;\n },\n\n // 获取文章摘要\n getArticleExcerpt(content) {\n if (!content) return \"\";\n\n // 移除HTML标签\n const plainText = content.replace(/<[^>]+>/g, \"\");\n\n // 截取前100个字符作为摘要\n return (\n plainText.substring(0, 100) + (plainText.length > 100 ? \"...\" : \"\")\n );\n },\n\n // 格式化日期\n formatDate(dateString) {\n if (!dateString) return \"\";\n\n const date = new Date(dateString);\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}-${String(date.getDate()).padStart(2, \"0\")}`;\n },\n\n // 查看文章详情\n viewArticle(id) {\n this.$router.push(`/community/pages?id=${id}`);\n },\n\n // 创建新文章\n createNewArticle() {\n this.$router.push(\"/write\");\n },\n\n // 标签相关方法\n handleTabChange(key, type) {\n this[type] = key;\n },\n\n handleTagClose(removeTag) {\n const tags = this.tags.filter((tag) => tag !== removeTag);\n this.tags = tags;\n },\n\n showTagInput() {\n this.tagInputVisible = true;\n this.$nextTick(() => {\n this.$refs.tagInput.focus();\n });\n },\n\n handleInputChange(e) {\n this.tagInputValue = e.target.value;\n },\n\n handleTagInputConfirm() {\n const inputValue = this.tagInputValue;\n let tags = this.tags;\n if (inputValue && !tags.includes(inputValue)) {\n tags = [...tags, inputValue];\n }\n\n Object.assign(this, {\n tags,\n tagInputVisible: false,\n tagInputValue: \"\",\n });\n },\n },\n};\n</script>\n\n<style lang=\"less\" scoped>\n/* 论坛个人中心美化样式 */\n\n/* 整体页面背景 */\n.page-header-wrapper-grid-content-main {\n width: 100%;\n min-height: 100vh;\n background-color: #f6f8fa;\n background-image: linear-gradient(\n to bottom,\n rgba(240, 244, 248, 0.8),\n rgba(255, 255, 255, 0.8)\n );\n padding: 24px;\n}\n\n/* 卡片通用样式 */\n.ant-card {\n border-radius: 16px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n transition: all 0.4s ease;\n margin-bottom: 24px;\n border: none;\n}\n\n.ant-card:hover {\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n transform: translateY(-5px);\n}\n\n/* 左侧个人信息卡片 */\n.account-center-avatarHolder {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 32px 0 16px;\n position: relative;\n}\n\n/* 背景装饰 */\n.account-center-avatarHolder::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 120px;\n background: linear-gradient(135deg, #3690cf, #2a78b8);\n z-index: 0;\n border-radius: 16px 16px 50% 50% / 16px 16px 25% 25%;\n}\n\n/* 头像样式 */\n.account-center-avatarHolder .avatar {\n width: 120px;\n height: 120px;\n border-radius: 50%;\n margin-bottom: 24px;\n border: 5px solid #fff;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n position: relative;\n z-index: 1;\n background: #fff;\n transition: all 0.3s ease;\n}\n\n.account-center-avatarHolder .avatar:hover {\n transform: scale(1.05);\n box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);\n}\n\n.account-center-avatarHolder .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: all 0.5s ease;\n}\n\n.account-center-avatarHolder .avatar:hover img {\n transform: scale(1.1);\n}\n\n/* 用户名样式 */\n.account-center-avatarHolder .username {\n color: #2c3e50;\n font-size: 24px;\n font-weight: 600;\n margin-bottom: 8px;\n position: relative;\n z-index: 1;\n}\n\n/* 身份标签 */\n.account-center-avatarHolder .bio {\n display: inline-block;\n padding: 4px 12px;\n background: rgba(54, 144, 207, 0.1);\n color: #3690cf;\n border-radius: 20px;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 8px;\n position: relative;\n z-index: 1;\n}\n\n/* 分割线美化 */\n.ant-divider {\n margin: 24px 0;\n border-color: rgba(0, 0, 0, 0.06);\n}\n\n.ant-divider-dashed {\n border-style: dashed;\n border-color: rgba(0, 0, 0, 0.09);\n}\n\n/* 标签区域 */\n.account-center-tags {\n padding: 0 16px;\n}\n\n.account-center-tags .tagsTitle {\n font-size: 18px;\n font-weight: 600;\n color: #2c3e50;\n margin-bottom: 16px;\n position: relative;\n padding-left: 12px;\n}\n\n.account-center-tags .tagsTitle::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 4px;\n background: #3690cf;\n border-radius: 2px;\n}\n\n/* 标签样式 */\n.ant-tag {\n margin: 0 8px 8px 0;\n padding: 4px 12px;\n border-radius: 16px;\n font-size: 13px;\n border: none;\n background: #f0f2f5;\n color: #555;\n transition: all 0.3s;\n}\n\n.ant-tag:hover {\n background: #e6f7ff;\n color: #3690cf;\n}\n\n/* 新增标签按钮 */\n.ant-tag-dashed {\n border: 1px dashed #d9d9d9;\n background: transparent;\n transition: all 0.3s;\n}\n\n.ant-tag-dashed:hover {\n border-color: #3690cf;\n color: #3690cf;\n}\n\n/* 比赛区域 */\n.account-center-team {\n padding: 0 16px;\n}\n\n.account-center-team .teamTitle {\n font-size: 18px;\n font-weight: 600;\n color: #2c3e50;\n margin-bottom: 16px;\n position: relative;\n padding-left: 12px;\n}\n\n.account-center-team .teamTitle::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 4px;\n background: #3690cf;\n border-radius: 2px;\n}\n\n/* 比赛卡片样式 */\n.members {\n margin-bottom: 16px;\n transition: all 0.3s;\n}\n\n.members .ant-tag {\n display: inline-block;\n margin: 5px;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 14px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n transition: all 0.3s;\n}\n\n.members .ant-tag:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n}\n\n/* 右侧选项卡样式 */\n.ant-tabs-bar {\n border-bottom: none;\n margin-bottom: 24px;\n}\n\n.ant-tabs-nav {\n margin: 0 auto 16px;\n width: fit-content;\n background: #f5f5f5;\n border-radius: 50px;\n padding: 4px;\n}\n\n.ant-tabs-tab {\n margin: 0 !important;\n padding: 8px 24px !important;\n border-radius: 50px !important;\n transition: all 0.3s;\n font-weight: 500;\n}\n\n.ant-tabs-tab-active {\n background: #3690cf !important;\n color: white !important;\n}\n\n/* 文章列表样式 */\n.article-list {\n padding: 16px;\n}\n\n.article-item {\n display: flex;\n margin-bottom: 20px;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);\n transition: all 0.3s;\n}\n\n.article-item:hover {\n transform: translateY(-5px);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);\n}\n\n.article-cover {\n width: 200px;\n height: 134px;\n overflow: hidden;\n}\n\n.article-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: transform 0.5s;\n}\n\n.article-item:hover .article-cover img {\n transform: scale(1.1);\n}\n\n.article-content {\n flex: 1;\n padding: 16px;\n position: relative;\n}\n\n.article-title {\n font-size: 18px;\n font-weight: 600;\n margin-bottom: 8px;\n color: #333;\n}\n\n.article-description {\n font-size: 14px;\n color: #666;\n margin-bottom: 16px;\n line-height: 1.6;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n}\n\n.article-meta {\n position: absolute;\n bottom: 16px;\n left: 16px;\n right: 16px;\n display: flex;\n justify-content: space-between;\n font-size: 12px;\n color: #999;\n}\n\n/* 数据统计卡片 */\n.data-stats {\n display: flex;\n margin-bottom: 24px;\n}\n\n.stat-card {\n flex: 1;\n background: white;\n border-radius: 12px;\n padding: 16px;\n text-align: center;\n margin: 0 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);\n transition: all 0.3s;\n}\n\n.stat-card:hover {\n transform: translateY(-5px);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);\n}\n\n.stat-number {\n font-size: 32px;\n font-weight: 600;\n color: #3690cf;\n margin-bottom: 8px;\n}\n\n.stat-title {\n font-size: 14px;\n color: #666;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .article-cover {\n width: 120px;\n }\n\n .stat-card {\n padding: 12px;\n }\n\n .stat-number {\n font-size: 24px;\n }\n}\n\n@media (max-width: 480px) {\n .article-item {\n flex-direction: column;\n }\n\n .article-cover {\n width: 100%;\n height: 180px;\n }\n\n .data-stats {\n flex-wrap: wrap;\n }\n\n .stat-card {\n flex: 0 0 calc(50% - 16px);\n margin-bottom: 16px;\n }\n}\n\n/* 悬浮效果 */\n.hover-card {\n position: relative;\n overflow: hidden;\n}\n\n.hover-card::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.1);\n transform: translateX(-100%) rotate(45deg);\n transition: transform 0.6s;\n}\n\n.hover-card:hover::after {\n transform: translateX(100%) rotate(45deg);\n}\n\n/* 动画效果 */\n@keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.animate-fade-in-up {\n animation: fadeInUp 0.6s ease forwards;\n}\n\n/* 更多自定义样式 */\n.custom-scrollbar::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n\n.custom-scrollbar::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 10px;\n}\n\n.custom-scrollbar::-webkit-scrollbar-thumb {\n background: #c1c1c1;\n border-radius: 10px;\n}\n\n.custom-scrollbar::-webkit-scrollbar-thumb:hover {\n background: #3690cf;\n}\n\n/* 闪光边框效果 */\n.glow-border {\n position: relative;\n}\n\n.glow-border::before {\n content: \"\";\n position: absolute;\n top: -2px;\n left: -2px;\n right: -2px;\n bottom: -2px;\n background: linear-gradient(45deg, #3690cf, #6dc6ff, #3690cf);\n background-size: 200% 200%;\n z-index: -1;\n border-radius: 18px;\n animation: glowingBorder 3s ease-in-out infinite;\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.glow-border:hover::before {\n opacity: 1;\n}\n\n@keyframes glowingBorder {\n 0% {\n background-position: 0% 50%;\n }\n 50% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0% 50%;\n }\n}\n</style>\n"]}]} |