1 line
32 KiB
JSON
1 line
32 KiB
JSON
{"remainingRequest":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/vue-loader/lib/index.js??vue-loader-options!/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/components/edit/tinymce.vue?vue&type=script&lang=js","dependencies":[{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/components/edit/tinymce.vue","mtime":1743947405816},{"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:CmltcG9ydCB7IG1lc3NhZ2UgfSBmcm9tICJAL3V0aWxzL2NvbnN0IjsKaW1wb3J0IHsKICBjcmVhdGVBcnRpY2xlLAogIEFsbENvbXBldGl0aW9uLAogIFNlbmRTTVMsCiAgU2VuZEVtYWlsLAogIEFsbEFydGljbGUsCn0gZnJvbSAiQC9hcGkiOwppbXBvcnQgdGlueW1jZSBmcm9tICJ0aW55bWNlL3RpbnltY2UiOyAvL3RpbnltY2Xpu5jorqRoaWRkZW7vvIzkuI3lvJXlhaXkuI3mmL7npLoKaW1wb3J0IEVkaXRvciBmcm9tICJAdGlueW1jZS90aW55bWNlLXZ1ZSI7IC8v57yW6L6R5Zmo5byV5YWlCmltcG9ydCAidGlueW1jZS90aGVtZXMvc2lsdmVyL3RoZW1lIjsgLy/nvJbovpHlmajkuLvpopgKaW1wb3J0ICJ0aW55bWNlL2ljb25zL2RlZmF1bHQiOyAvL+W8leWFpee8lui+keWZqOWbvuagh2ljb27vvIzkuI3lvJXlhaXliJnkuI3mmL7npLrlr7nlupTlm77moIcKLy8g5byV5YWl57yW6L6R5Zmo5o+S5Lu277yI5Z+65pys5YWN6LS55o+S5Lu26YO95Zyo6L+Z5YS/5LqG77yJCmltcG9ydCAidGlueW1jZS9wbHVnaW5zL2Fkdmxpc3QiOyAvL+mrmOe6p+WIl+ihqAppbXBvcnQgInRpbnltY2UvcGx1Z2lucy9hdXRvbGluayI7IC8v6Ieq5Yqo6ZO+5o6lCmltcG9ydCAidGlueW1jZS9wbHVnaW5zL2xpbmsiOyAvL+i2hemTvuaOpQppbXBvcnQgInRpbnltY2UvcGx1Z2lucy9pbWFnZSI7IC8v5o+S5YWl57yW6L6R5Zu+54mHCmltcG9ydCAidGlueW1jZS9wbHVnaW5zL2xpc3RzIjsgLy/liJfooajmj5Lku7YKaW1wb3J0ICJ0aW55bWNlL3BsdWdpbnMvY2hhcm1hcCI7IC8v54m55q6K5a2X56ymCmltcG9ydCAidGlueW1jZS9wbHVnaW5zL21lZGlhIjsgLy/mj5LlhaXnvJbovpHlqpLkvZMKaW1wb3J0ICJ0aW55bWNlL3BsdWdpbnMvd29yZGNvdW50IjsgLy8g5a2X5pWw57uf6K6hCi8vICAgaW1wb3J0IENvb2tpZXMgZnJvbSAianMtY29va2llIjsKCmNvbnN0IGZvbnRzID0gWwogICLlrovkvZM95a6L5L2TIiwKICAi5b6u6L2v6ZuF6buRPeW+rui9r+mbhem7kSIsCiAgIuaWsOWui+S9kz3mlrDlrovkvZMiLAogICLpu5HkvZM96buR5L2TIiwKICAi5qW35L2TPealt+S9kyIsCiAgIumatuS5pj3pmrbkuaYiLAogICJDb3VyaWVyIE5ldz1jb3VyaWVyIG5ldyxjb3VyaWVyIiwKICAiQWtydXRpS25kUGFkbWluaT1Ba3BkbWktbiIsCiAgIkFuZGFsZSBNb25vPWFuZGFsZSBtb25vLHRpbWVzIiwKICAiQXJpYWw9YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYiLAogICJBcmlhbCBCbGFjaz1hcmlhbCBibGFjayxhdmFudCBnYXJkZSIsCiAgIkJvb2sgQW50aXF1YT1ib29rIGFudGlxdWEscGFsYXRpbm8iLAogICJDb21pYyBTYW5zIE1TPWNvbWljIHNhbnMgbXMsc2Fucy1zZXJpZiIsCiAgIkNvdXJpZXIgTmV3PWNvdXJpZXIgbmV3LGNvdXJpZXIiLAogICJHZW9yZ2lhPWdlb3JnaWEscGFsYXRpbm8iLAogICJIZWx2ZXRpY2E9aGVsdmV0aWNhIiwKICAiSW1wYWN0PWltcGFjdCxjaGljYWdvIiwKICAiU3ltYm9sPXN5bWJvbCIsCiAgIlRhaG9tYT10YWhvbWEsYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYiLAogICJUZXJtaW5hbD10ZXJtaW5hbCxtb25hY28iLAogICJUaW1lcyBOZXcgUm9tYW49dGltZXMgbmV3IHJvbWFuLHRpbWVzIiwKICAiVHJlYnVjaGV0IE1TPXRyZWJ1Y2hldCBtcyxnZW5ldmEiLAogICJWZXJkYW5hPXZlcmRhbmEsZ2VuZXZhIiwKICAiV2ViZGluZ3M9d2ViZGluZ3MiLAogICJXaW5nZGluZ3M9d2luZ2RpbmdzLHphcGYgZGluZ2JhdHMiLApdOwpleHBvcnQgZGVmYXVsdCB7CiAgY29tcG9uZW50czogewogICAgRWRpdG9yLAogIH0sCiAgcHJvcHM6IHsKICAgIC8v5YaF5a65CiAgICB2YWx1ZTogewogICAgICB0eXBlOiBTdHJpbmcsCiAgICAgIGRlZmF1bHQ6ICIiLAogICAgfSwKICAgIC8v5piv5ZCm56aB55SoCiAgICBkaXNhYmxlZDogewogICAgICB0eXBlOiBCb29sZWFuLAogICAgICBkZWZhdWx0OiBmYWxzZSwKICAgIH0sCiAgICAvLyDnlKjkuo7ljLrliIbljZXkuKp0aW55bWNlCiAgICB0aW55bWNlSWQ6IHsKICAgICAgdHlwZTogU3RyaW5nLAogICAgICBkZWZhdWx0OiAidGlueW1jZSIsCiAgICB9LAogICAgLy/mj5Lku7YKICAgIHBsdWdpbnM6IHsKICAgICAgdHlwZTogW1N0cmluZywgQXJyYXldLAogICAgICBkZWZhdWx0OiAiYWR2bGlzdCBhdXRvbGluayBsaW5rIGltYWdlIGxpc3RzIGNoYXJtYXAgIG1lZGlhIHdvcmRjb3VudCIsCiAgICB9LAogICAgLy/lt6XlhbfmoI8KICAgIHRvb2xiYXI6IHsKICAgICAgdHlwZTogW1N0cmluZywgQXJyYXldLAogICAgICBkZWZhdWx0OgogICAgICAgICJ1bmRvIHJlZG8gfCAgZm9ybWF0c2VsZWN0IHwgYm9sZCBpdGFsaWMgfCBhbGlnbmxlZnQgYWxpZ25jZW50ZXIgYWxpZ25yaWdodCBhbGlnbmp1c3RpZnkgfCBidWxsaXN0IG51bWxpc3Qgb3V0ZGVudCBpbmRlbnQgfCBsaXN0cyBpbWFnZSBtZWRpYSB0YWJsZSIsCiAgICB9LAogIH0sCiAgZGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIG1lc3NhZ2UsCiAgICAgIC8v5Yid5aeL5YyW6YWN572uCiAgICAgIGdyYWRlczogW10sCiAgICAgIG15VmFsdWU6IHRoaXMudmFsdWUsCiAgICAgIEFydGljbGVUaXRsZTogIiIsCiAgICAgIGNvbXBldGl0aW9uSWQ6ICIiLAogICAgICBhcnRpY2xlVHlwZTogIiIsCiAgICAgIGJyaWVmQ29udGVudDogIiIsCiAgICAgIGluaXQ6IHsKICAgICAgICBzZWxlY3RvcjogIiMiICsgdGhpcy50aW55bWNlSWQsCiAgICAgICAgbGFuZ3VhZ2VfdXJsOiAiQC9jb21wb25lbnRzL2VkaXQvemhfQ04uanMiLCAvL+axieWMlui3r+W+hOaYr+iHquWumuS5ieeahO+8jOS4gOiIrOaUvuWcqHB1YmxpY+aIlnN0YXRpY+mHjOmdogogICAgICAgIGxhbmd1YWdlOiAiemhfQ04iLAogICAgICAgIHNraW5fdXJsOiAiL3RpbnltY2Uvc2tpbnMvdWkvb3hpZGUiLCAvL+earuiCpAogICAgICAgIHBsdWdpbnM6IHRoaXMucGx1Z2lucywgLy/mj5Lku7YKICAgICAgICAvL+W3peWFt+agjwogICAgICAgIHRvb2xiYXI6IHRoaXMudG9vbGJhciwKICAgICAgICB0b29sYmFyX2xvY2F0aW9uOiAiLyIsCiAgICAgICAgZm9udHNpemVfZm9ybWF0czoKICAgICAgICAgICIxMnB4IDE0cHggMTZweCAxOHB4IDIwcHggMjJweCAyNHB4IDI4cHggMzJweCAzNnB4IDQ4cHggNTZweCA3MnB4IiwgLy/lrZfkvZPlpKflsI8KICAgICAgICBmb250X2Zvcm1hdHM6IGZvbnRzLmpvaW4oIjsiKSwKICAgICAgICBjb250ZW50X3N0eWxlOiAicCB7bWFyZ2luOiAwcHg7IGJvcmRlcjowcHggOyBwYWRkaW5nOiAwcHh9IiwgLy8g6K6+572ucOeahOihjOmXtOi3nQogICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgLy8gaGVpZ2h0OiA1MDAsLy/pq5jluqYKICAgICAgICBwbGFjZWhvbGRlcjogIuWcqOi/memHjOi+k+WFpeaWh+WtlyIsCgogICAgICAgIGJyYW5kaW5nOiBmYWxzZSwgLy/pmpDol4/lj7PkuIvop5LmioDmnK/mlK/mjIEKICAgICAgICAvL+WbvueJh+S4iuS8oAogICAgICB9LAogICAgICBBcnRpY2xlSWQ6ICIiLAogICAgICBBcnRpY2xlOiB7fSwKICAgIH07CiAgfSwKICB3YXRjaDogewogICAgLy/nm5HlkKzlhoXlrrnlj5jljJYKICAgIHZhbHVlKG5ld1ZhbHVlKSB7CiAgICAgIHRoaXMubXlWYWx1ZSA9IG5ld1ZhbHVlID09IG51bGwgPyAiIiA6IG5ld1ZhbHVlOwogICAgfSwKICAgIG15VmFsdWUobmV3VmFsdWUpIHsKICAgICAgaWYgKHRoaXMudHJpZ2dlckNoYW5nZSkgewogICAgICAgIHRoaXMuJGVtaXQoImNoYW5nZSIsIG5ld1ZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRlbWl0KCJpbnB1dCIsIG5ld1ZhbHVlKTsKICAgICAgfQogICAgfSwKICB9LAogIG1vdW50ZWQoKSB7CiAgICB0aW55bWNlLmluaXQoe30pOwogICAgLy8gY29uc29sZS5sb2codGhpcy50b29sYmFyLCc9PT09PT0nKQogICAgdGhpcy5HZXRBcml0bGUoKTsKICAgIEFsbENvbXBldGl0aW9uKCkKICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgLy8g6I635Y+W56ue6LWb5pWw5o2uCiAgICAgICAgY29uc3QgY29tcGV0aXRpb25zID0gcmVzcG9uc2UuZGF0YTsKCiAgICAgICAgLy8g6L2s5o2i5pWw5o2u5Li66YCC5ZCIc2VsZWN06YCJ6aG555qE5qC85byPCiAgICAgICAgY29uc3Qgc2VsZWN0T3B0aW9ucyA9IGNvbXBldGl0aW9ucy5tYXAoKGNvbXBldGl0aW9uKSA9PiAoewogICAgICAgICAgbGFiZWw6IGNvbXBldGl0aW9uLmNvbXBldGl0aW9uTmFtZSwKICAgICAgICAgIHZhbHVlOiBjb21wZXRpdGlvbi5jb21wZXRpdGlvbklkLAogICAgICAgIH0pKTsKICAgICAgICAvLyDlsIbovazmjaLlkI7nmoTmlbDmja7lrZjlgqjlnKhWdWXlrp7kvovkuK3vvIzku6Xkvr/lnKjmqKHmnb/kuK3kvb/nlKgKICAgICAgICB0aGlzLmdyYWRlcyA9IHNlbGVjdE9wdGlvbnM7CiAgICAgIH0pCiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgfSk7CiAgfSwKICBtZXRob2RzOiB7CiAgICBHZXRBcml0bGUoKSB7CiAgICAgIGNvbnNvbGUubG9nKHRoaXMuQXJ0aWNsZUlkKTsKICAgICAgaWYgKHRoaXMuQXJ0aWNsZUlkICE9ICIiIHx8IG51bGwpIHsKICAgICAgICBBbGxBcnRpY2xlKCkudGhlbigocmVzKSA9PiB7CiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pOwogICAgICAgICAgICBpZiAoaXRlbS5hcnRpY2xlSWQgPT0gdGhpcy5BcnRpY2xlSWQpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtKTsKICAgICAgICAgICAgICB0aGlzLmNvbXBldGl0aW9uSWQgPSBpdGVtLmNvbXBldGl0aW9uSWQ7CiAgICAgICAgICAgICAgKHRoaXMuQXJ0aWNsZVRpdGxlID0gaXRlbS5hcnRpY2xlVGl0bGUpLAogICAgICAgICAgICAgICAgKHRoaXMubXlWYWx1ZSA9IGl0ZW0uYXJ0aWNsZUNvbnRlbnQpLAogICAgICAgICAgICAgICAgKHRoaXMuYXJ0aWNsZVR5cGUgPSBpdGVtLmFydGljbGVUeXBlKSwKICAgICAgICAgICAgICAgICh0aGlzLmJyaWVmQ29udGVudCA9IGl0ZW0uYnJpZWZDb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBvbkNsaWNrKGUpIHsKICAgICAgdGhpcy4kZW1pdCgib25DbGljayIsIGUsIHRpbnltY2UpOwogICAgfSwKICAgIC8v5Y+v5Lul5re75Yqg5LiA5Lqb6Ieq5bex55qE6Ieq5a6a5LmJ5LqL5Lu277yM5aaC5riF56m65YaF5a65CiAgICBjbGVhcigpIHsKICAgICAgdGhpcy5teVZhbHVlID0gIiI7CiAgICB9LAogICAgU2VuZFRpbnltY2UoKSB7CiAgICAgIGNvbnN0IGRhdGEgPSB7CiAgICAgICAgdXNlcklkOiB0aGlzLiRzdG9yZS5zdGF0ZS51c2VyLnVzZXJJZCwKICAgICAgICBicmllZkNvbnRlbnQ6IHRoaXMuYnJpZWZDb250ZW50LAogICAgICAgIGNvbXBldGl0aW9uSWQ6IHRoaXMuY29tcGV0aXRpb25JZCwKICAgICAgICBhcnRpY2xlVHlwZTogdGhpcy5hcnRpY2xlVHlwZSwKICAgICAgICBhcnRpY2xlVGl0bGU6IHRoaXMuQXJ0aWNsZVRpdGxlLAogICAgICAgIGFydGljbGVDb250ZW50OiB0aGlzLm15VmFsdWUsCiAgICAgIH07CgogICAgICBjcmVhdGVBcnRpY2xlKGRhdGEpCiAgICAgICAgLnRoZW4oKHJlcykgPT4gewogICAgICAgICAgaWYgKHJlcy5jb2RlID09IDIwMCkgewogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoIuWPkemAgeaIkOWKnyIpOwogICAgICAgICAgICB0aGlzLmFydGljbGVJZCA9IHJlcy5kYXRhOwogICAgICAgICAgICBpZiAodGhpcy5hcnRpY2xlVHlwZSA9PSAi5YWs5ZGKIikgewogICAgICAgICAgICAgIC8vIOivoumXruaYr+WQpui/m+ihjOefreS/oeWSjOmCruS7tumAmuefpQogICAgICAgICAgICAgIHRoaXMuJG1vZGFsLmNvbmZpcm0oewogICAgICAgICAgICAgICAgdGl0bGU6IGDnoa7orqTlj5HpgIHnn63kv6HkuI7pgq7ku7bpgJrnn6XnlKjmiLc/YCwKICAgICAgICAgICAgICAgIG9uT2s6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgY29tcGV0aXRpb25JZDogdGhpcy5jb21wZXRpdGlvbklkLAogICAgICAgICAgICAgICAgICAgIGFydGljbGVJZDogdGhpcy5hcnRpY2xlSWQsCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHRoaXMuJGFwaQogICAgICAgICAgICAgICAgICAgIC5TZW5kRW1haWwoZGF0YSkKICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRhcGkuU2VuZFNNUyhkYXRhKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCLnn63kv6Hpgq7ku7bmj5DphpLmiJDlip8hIik7CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlLm1zZyB8fCAi5Y+R6YCB5aSx6LSlISIpOwogICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi5Y+R5biD5aSx6LSlIik7CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAudGhlbigobm90aWZpY2F0aW9uRGF0YSkgPT4gewogICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIFNlbmRFbWFpbChub3RpZmljYXRpb25EYXRhKQogICAgICAgICAgICAgIC50aGVuKCgpID0+IFNlbmRTTVMobm90aWZpY2F0aW9uRGF0YSkpCiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCLnn63kv6Hmj5DphpLkuI7pgq7ku7bmj5DphpLmiJDlip8iKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgdGhpcy4kbm90aWZ5LmVycm9yKHsgdGl0bGU6ICLplJnor68iLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pOwogICAgICAgIH0pOwogICAgfSwKICB9LAp9Owo="},{"version":3,"sources":["tinymce.vue"],"names":[],"mappings":";AAuIA;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;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;;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;;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","file":"tinymce.vue","sourceRoot":"src/components/edit","sourcesContent":["<template>\n <div class=\"tinymce-editor fade-in\">\n <!-- 页面标题 -->\n <div class=\"editor-header\">\n <h1 class=\"editor-title\">创建新文章</h1>\n <p class=\"editor-subtitle\">分享你的知识、经验和创意</p>\n </div>\n\n <!-- 文章标题输入 -->\n <a-input\n v-model=\"ArticleTitle\"\n placeholder=\"请输入文章标题 (5-50字)\"\n class=\"article-title-input\"\n :maxLength=\"50\"\n :allowClear=\"true\"\n />\n\n <!-- 文章简介输入 -->\n <a-textarea\n v-model=\"briefContent\"\n placeholder=\"请输入文章简介,简明扼要地介绍文章内容 (50-200字)\"\n :auto-size=\"{ minRows: 2, maxRows: 5 }\"\n class=\"article-brief-textarea\"\n :maxLength=\"200\"\n />\n\n <!-- 文章信息 -->\n <div class=\"article-info-card fade-in-delay-1\">\n <div class=\"info-title\">\n <a-icon type=\"info-circle\" />\n <span>文章信息</span>\n </div>\n\n <div class=\"form-item-container\">\n <!-- 选择比赛 -->\n <a-form-item label=\"选择相关比赛\">\n <a-select\n v-model=\"competitionId\"\n :options=\"grades\"\n allowClear\n placeholder=\"请选择相关比赛\"\n :showSearch=\"true\"\n :filterOption=\"filterOption\"\n >\n <template slot=\"suffixIcon\">\n <a-icon type=\"trophy\" />\n </template>\n </a-select>\n </a-form-item>\n\n <!-- 选择文章类型 -->\n <a-form-item label=\"文章类型\">\n <a-select\n v-model=\"articleType\"\n :options=\"message\"\n allowClear\n placeholder=\"请选择文章类型\"\n >\n <template slot=\"suffixIcon\">\n <a-icon type=\"tags\" />\n </template>\n </a-select>\n </a-form-item>\n </div>\n </div>\n\n <!-- 文章封面 -->\n <!-- <div class=\"cover-upload fade-in-delay-2\">\n <div class=\"cover-title\">\n <a-icon type=\"picture\" />\n <span style=\"margin-left: 8px\">文章封面</span>\n </div>\n\n <p class=\"cover-description\">\n 一个好的封面图能够吸引更多读者,建议尺寸 900×500 像素\n </p>\n\n <div class=\"cover-preview hover-lift\">\n <img v-if=\"coverUrl\" :src=\"coverUrl\" alt=\"文章封面\" />\n <div v-else class=\"upload-placeholder\">\n <a-icon type=\"file-image\" style=\"font-size: 48px; color: #d9d9d9\" />\n <p style=\"margin-top: 16px; color: #999\">点击上传封面图片</p>\n </div>\n\n <a-upload\n name=\"file\"\n :showUploadList=\"false\"\n :beforeUpload=\"beforeUpload\"\n @change=\"handleCoverChange\"\n >\n <a-button type=\"primary\" class=\"cover-upload-btn\">\n <a-icon :type=\"coverUrl ? 'edit' : 'upload'\" />\n {{ coverUrl ? \"更换封面\" : \"上传封面\" }}\n </a-button>\n </a-upload>\n </div>\n </div> -->\n\n <!-- 编辑器容器 -->\n <div class=\"editor-container fade-in-delay-2\">\n <Editor\n :id=\"tinymceId\"\n :init=\"init\"\n :disabled=\"disabled\"\n v-model=\"myValue\"\n @onClick=\"onClick\"\n ></Editor>\n <div class=\"word-count\">字数: {{ wordCount }}</div>\n </div>\n\n <!-- 内容预览区域 -->\n <div v-if=\"showPreview\" class=\"preview-container fade-in\">\n <div class=\"preview-title\">\n <a-icon type=\"eye\" />\n <span>文章预览</span>\n </div>\n\n <div class=\"preview-content\" v-html=\"myValue\"></div>\n </div>\n\n <!-- 操作按钮 -->\n <div class=\"publish-container\">\n <a-button @click=\"togglePreview\" style=\"margin-right: 16px\">\n <a-icon :type=\"showPreview ? 'eye-invisible' : 'eye'\" />\n {{ showPreview ? \"关闭预览\" : \"预览文章\" }}\n </a-button>\n\n <a-button type=\"primary\" class=\"publish-btn\" @click=\"confirmPublish\">\n <a-icon type=\"plus\" />\n 发布文章\n </a-button>\n </div>\n </div>\n</template>\n<script>\nimport { message } from \"@/utils/const\";\nimport {\n createArticle,\n AllCompetition,\n SendSMS,\n SendEmail,\n AllArticle,\n} from \"@/api\";\nimport tinymce from \"tinymce/tinymce\"; //tinymce默认hidden,不引入不显示\nimport Editor from \"@tinymce/tinymce-vue\"; //编辑器引入\nimport \"tinymce/themes/silver/theme\"; //编辑器主题\nimport \"tinymce/icons/default\"; //引入编辑器图标icon,不引入则不显示对应图标\n// 引入编辑器插件(基本免费插件都在这儿了)\nimport \"tinymce/plugins/advlist\"; //高级列表\nimport \"tinymce/plugins/autolink\"; //自动链接\nimport \"tinymce/plugins/link\"; //超链接\nimport \"tinymce/plugins/image\"; //插入编辑图片\nimport \"tinymce/plugins/lists\"; //列表插件\nimport \"tinymce/plugins/charmap\"; //特殊字符\nimport \"tinymce/plugins/media\"; //插入编辑媒体\nimport \"tinymce/plugins/wordcount\"; // 字数统计\n// import Cookies from \"js-cookie\";\n\nconst fonts = [\n \"宋体=宋体\",\n \"微软雅黑=微软雅黑\",\n \"新宋体=新宋体\",\n \"黑体=黑体\",\n \"楷体=楷体\",\n \"隶书=隶书\",\n \"Courier New=courier new,courier\",\n \"AkrutiKndPadmini=Akpdmi-n\",\n \"Andale Mono=andale mono,times\",\n \"Arial=arial,helvetica,sans-serif\",\n \"Arial Black=arial black,avant garde\",\n \"Book Antiqua=book antiqua,palatino\",\n \"Comic Sans MS=comic sans ms,sans-serif\",\n \"Courier New=courier new,courier\",\n \"Georgia=georgia,palatino\",\n \"Helvetica=helvetica\",\n \"Impact=impact,chicago\",\n \"Symbol=symbol\",\n \"Tahoma=tahoma,arial,helvetica,sans-serif\",\n \"Terminal=terminal,monaco\",\n \"Times New Roman=times new roman,times\",\n \"Trebuchet MS=trebuchet ms,geneva\",\n \"Verdana=verdana,geneva\",\n \"Webdings=webdings\",\n \"Wingdings=wingdings,zapf dingbats\",\n];\nexport default {\n components: {\n Editor,\n },\n props: {\n //内容\n value: {\n type: String,\n default: \"\",\n },\n //是否禁用\n disabled: {\n type: Boolean,\n default: false,\n },\n // 用于区分单个tinymce\n tinymceId: {\n type: String,\n default: \"tinymce\",\n },\n //插件\n plugins: {\n type: [String, Array],\n default: \"advlist autolink link image lists charmap media wordcount\",\n },\n //工具栏\n toolbar: {\n type: [String, Array],\n default:\n \"undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists image media table\",\n },\n },\n data() {\n return {\n message,\n //初始化配置\n grades: [],\n myValue: this.value,\n ArticleTitle: \"\",\n competitionId: \"\",\n articleType: \"\",\n briefContent: \"\",\n init: {\n selector: \"#\" + this.tinymceId,\n language_url: \"@/components/edit/zh_CN.js\", //汉化路径是自定义的,一般放在public或static里面\n language: \"zh_CN\",\n skin_url: \"/tinymce/skins/ui/oxide\", //皮肤\n plugins: this.plugins, //插件\n //工具栏\n toolbar: this.toolbar,\n toolbar_location: \"/\",\n fontsize_formats:\n \"12px 14px 16px 18px 20px 22px 24px 28px 32px 36px 48px 56px 72px\", //字体大小\n font_formats: fonts.join(\";\"),\n content_style: \"p {margin: 0px; border:0px ; padding: 0px}\", // 设置p的行间距\n width: \"100%\",\n // height: 500,//高度\n placeholder: \"在这里输入文字\",\n\n branding: false, //隐藏右下角技术支持\n //图片上传\n },\n ArticleId: \"\",\n Article: {},\n };\n },\n watch: {\n //监听内容变化\n value(newValue) {\n this.myValue = newValue == null ? \"\" : newValue;\n },\n myValue(newValue) {\n if (this.triggerChange) {\n this.$emit(\"change\", newValue);\n } else {\n this.$emit(\"input\", newValue);\n }\n },\n },\n mounted() {\n tinymce.init({});\n // console.log(this.toolbar,'======')\n this.GetAritle();\n AllCompetition()\n .then((response) => {\n // 获取竞赛数据\n const competitions = response.data;\n\n // 转换数据为适合select选项的格式\n const selectOptions = competitions.map((competition) => ({\n label: competition.competitionName,\n value: competition.competitionId,\n }));\n // 将转换后的数据存储在Vue实例中,以便在模板中使用\n this.grades = selectOptions;\n })\n .catch((error) => {\n console.error(error);\n });\n },\n methods: {\n GetAritle() {\n console.log(this.ArticleId);\n if (this.ArticleId != \"\" || null) {\n AllArticle().then((res) => {\n res.data.forEach((item) => {\n console.log(item);\n if (item.articleId == this.ArticleId) {\n console.log(item);\n this.competitionId = item.competitionId;\n (this.ArticleTitle = item.articleTitle),\n (this.myValue = item.articleContent),\n (this.articleType = item.articleType),\n (this.briefContent = item.briefContent);\n }\n });\n });\n }\n },\n onClick(e) {\n this.$emit(\"onClick\", e, tinymce);\n },\n //可以添加一些自己的自定义事件,如清空内容\n clear() {\n this.myValue = \"\";\n },\n SendTinymce() {\n const data = {\n userId: this.$store.state.user.userId,\n briefContent: this.briefContent,\n competitionId: this.competitionId,\n articleType: this.articleType,\n articleTitle: this.ArticleTitle,\n articleContent: this.myValue,\n };\n\n createArticle(data)\n .then((res) => {\n if (res.code == 200) {\n this.$message.success(\"发送成功\");\n this.articleId = res.data;\n if (this.articleType == \"公告\") {\n // 询问是否进行短信和邮件通知\n this.$modal.confirm({\n title: `确认发送短信与邮件通知用户?`,\n onOk: () => {\n let data = {\n competitionId: this.competitionId,\n articleId: this.articleId,\n };\n this.$api\n .SendEmail(data)\n .then(() => {\n this.$api.SendSMS(data).then(() => {\n this.$message.success(\"短信邮件提醒成功!\");\n });\n })\n .catch((e) => {\n this.$message.error(e.msg || \"发送失败!\");\n throw e;\n });\n },\n });\n }\n } else {\n throw new Error(\"发布失败\");\n }\n })\n .then((notificationData) => {\n if (notificationData) {\n return SendEmail(notificationData)\n .then(() => SendSMS(notificationData))\n .then(() => {\n this.$message.success(\"短信提醒与邮件提醒成功\");\n });\n }\n })\n .catch((error) => {\n console.error(error);\n this.$notify.error({ title: \"错误\", message: error.message });\n });\n },\n },\n};\n</script>\n<style scoped>\n/* 在线发帖页面美化样式 */\n\n/* 整体容器样式 */\n.tinymce-editor {\n /* max-width: 1200px; */\n margin: 0 auto;\n padding: 30px;\n background-color: #fff;\n border-radius: 16px;\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.08);\n position: relative;\n}\n\n/* 页面标题 */\n.editor-header {\n text-align: center;\n margin-bottom: 40px;\n position: relative;\n}\n\n.editor-title {\n font-size: 28px;\n font-weight: 600;\n color: #333;\n margin-bottom: 10px;\n position: relative;\n display: inline-block;\n}\n\n.editor-title::after {\n content: \"\";\n position: absolute;\n bottom: -10px;\n left: 50%;\n transform: translateX(-50%);\n width: 80px;\n height: 4px;\n background: linear-gradient(90deg, #3690cf, #6dc6ff);\n border-radius: 2px;\n}\n\n.editor-subtitle {\n font-size: 16px;\n color: #666;\n margin-top: 20px;\n}\n\n/* 输入框美化 */\n.tinymce-editor .ant-input,\n.tinymce-editor .ant-input-affix-wrapper {\n border-radius: 10px;\n border: 1px solid #e8e8e8;\n padding: 12px 16px;\n font-size: 16px;\n transition: all 0.3s;\n margin-bottom: 20px;\n box-shadow: 0 0 0 2px transparent;\n}\n\n.tinymce-editor .ant-input:hover,\n.tinymce-editor .ant-input-affix-wrapper:hover {\n border-color: #3690cf;\n}\n\n.tinymce-editor .ant-input:focus,\n.tinymce-editor .ant-input-affix-wrapper-focused {\n border-color: #3690cf;\n box-shadow: 0 0 0 2px rgba(54, 144, 207, 0.2);\n}\n\n/* 标题输入框特殊样式 */\n.article-title-input {\n font-size: 20px !important;\n font-weight: 500;\n padding: 16px 20px !important;\n margin-bottom: 20px;\n border-radius: 12px !important;\n}\n\n.article-title-input::placeholder {\n color: #aaa;\n}\n\n/* 文章简介美化 */\n.article-brief-textarea {\n border-radius: 10px;\n min-height: 80px !important;\n margin-bottom: 30px;\n background-color: #f9fafc;\n}\n\n/* 表单项美化 */\n.form-item-container {\n display: flex;\n gap: 20px;\n margin-bottom: 25px;\n}\n\n.form-item-container .ant-form-item {\n flex: 1;\n margin-bottom: 0;\n}\n\n.tinymce-editor .ant-form-item-label {\n margin-bottom: 8px;\n}\n\n.tinymce-editor .ant-form-item-label > label {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n height: auto;\n}\n\n/* 下拉选择框美化 */\n.tinymce-editor .ant-select {\n width: 100%;\n}\n\n.tinymce-editor .ant-select-selector {\n border-radius: 10px !important;\n padding: 8px 16px !important;\n height: auto !important;\n min-height: 48px !important;\n display: flex;\n align-items: center;\n transition: all 0.3s;\n}\n\n.tinymce-editor .ant-select-selection-search {\n display: flex;\n align-items: center;\n}\n\n.tinymce-editor .ant-select:hover .ant-select-selector {\n border-color: #3690cf !important;\n}\n\n.tinymce-editor .ant-select-focused .ant-select-selector {\n border-color: #3690cf !important;\n box-shadow: 0 0 0 2px rgba(54, 144, 207, 0.2) !important;\n}\n\n/* 编辑器容器 */\n.editor-container {\n position: relative;\n margin-bottom: 25px;\n border-radius: 12px;\n overflow: hidden;\n border: 1px solid #e8e8e8;\n transition: all 0.3s;\n}\n\n.editor-container:hover {\n border-color: #3690cf;\n box-shadow: 0 0 0 2px rgba(54, 144, 207, 0.05);\n}\n\n/* TinyMCE编辑器自定义样式 */\n.tox-tinymce {\n border-radius: 12px !important;\n overflow: hidden;\n border: none !important;\n}\n\n.tox .tox-toolbar__group {\n border-radius: 6px !important;\n margin: 2px 4px !important;\n padding: 0 4px !important;\n}\n\n.tox .tox-tbtn {\n border-radius: 6px !important;\n}\n\n.tox .tox-tbtn:hover {\n background-color: rgba(54, 144, 207, 0.1) !important;\n}\n\n.tox .tox-tbtn--enabled {\n background-color: rgba(54, 144, 207, 0.2) !important;\n}\n\n/* 发布按钮容器 */\n.publish-container {\n display: flex;\n justify-content: center;\n margin-top: 40px;\n position: relative;\n}\n\n/* 发布按钮 */\n.publish-btn {\n min-width: 180px;\n height: 50px;\n padding: 0 30px;\n font-size: 16px;\n font-weight: 500;\n background: linear-gradient(135deg, #3690cf, #2a78b8) !important;\n border: none !important;\n border-radius: 25px !important;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 8px 15px rgba(54, 144, 207, 0.3);\n transition: all 0.3s !important;\n}\n\n.publish-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 10px 20px rgba(54, 144, 207, 0.4) !important;\n background: linear-gradient(135deg, #2a78b8, #1e5c8e) !important;\n}\n\n.publish-btn .anticon {\n margin-right: 8px;\n font-size: 18px;\n}\n\n/* 文章信息卡片 */\n.article-info-card {\n background-color: #f9fafc;\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 25px;\n border: 1px dashed #e0e0e0;\n}\n\n.article-info-card .info-title {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 15px;\n display: flex;\n align-items: center;\n}\n\n.article-info-card .info-title .anticon {\n color: #3690cf;\n margin-right: 8px;\n font-size: 18px;\n}\n\n/* 编辑器底部状态栏 */\n.tox-statusbar {\n border-top: 1px solid #eee !important;\n}\n\n/* 上传图片区域 */\n.upload-box {\n border: 2px dashed #e0e0e0;\n border-radius: 12px;\n padding: 20px;\n text-align: center;\n cursor: pointer;\n transition: all 0.3s;\n margin-bottom: 25px;\n}\n\n.upload-box:hover {\n border-color: #3690cf;\n background-color: rgba(54, 144, 207, 0.05);\n}\n\n.upload-icon {\n font-size: 48px;\n color: #d0d0d0;\n margin-bottom: 10px;\n transition: all 0.3s;\n}\n\n.upload-box:hover .upload-icon {\n color: #3690cf;\n}\n\n.upload-text {\n color: #666;\n font-size: 14px;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .tinymce-editor {\n padding: 20px 15px;\n }\n\n .form-item-container {\n flex-direction: column;\n gap: 15px;\n }\n\n .editor-title {\n font-size: 24px;\n }\n\n .publish-btn {\n width: 100%;\n }\n}\n\n/* 动画效果 */\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.fade-in {\n animation: fadeIn 0.5s ease forwards;\n}\n\n.fade-in-delay-1 {\n animation: fadeIn 0.5s ease 0.1s forwards;\n opacity: 0;\n}\n\n.fade-in-delay-2 {\n animation: fadeIn 0.5s ease 0.2s forwards;\n opacity: 0;\n}\n\n/* 字数统计提示 */\n.word-count {\n position: absolute;\n right: 15px;\n bottom: 15px;\n font-size: 12px;\n color: #999;\n background: rgba(255, 255, 255, 0.9);\n padding: 4px 10px;\n border-radius: 15px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n/* 预览效果区域 */\n.preview-container {\n margin-top: 30px;\n padding: 20px;\n border-radius: 12px;\n background-color: #f9fafc;\n border: 1px solid #eee;\n}\n\n.preview-title {\n font-size: 18px;\n font-weight: 500;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 1px solid #eee;\n color: #333;\n display: flex;\n align-items: center;\n}\n\n.preview-title .anticon {\n margin-right: 8px;\n color: #3690cf;\n}\n\n.preview-content {\n padding: 15px;\n background: white;\n border-radius: 8px;\n min-height: 100px;\n}\n\n/* 自定义悬停效果 */\n.hover-lift {\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n}\n\n.hover-lift:hover {\n transform: translateY(-3px);\n box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);\n}\n\n/* 标签选择区域 */\n.tags-container {\n margin-bottom: 25px;\n}\n\n.tags-title {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 12px;\n}\n\n.tag-select {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.tag-item {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n background-color: #f0f2f5;\n color: #555;\n border-radius: 20px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.3s;\n}\n\n.tag-item:hover {\n background-color: #e6f7ff;\n color: #3690cf;\n}\n\n.tag-item.active {\n background-color: #3690cf;\n color: white;\n}\n\n.tag-item .anticon {\n margin-right: 5px;\n}\n\n/* 文章封面上传区域 */\n.cover-upload {\n margin-bottom: 25px;\n}\n\n.cover-title {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 12px;\n}\n\n.cover-description {\n font-size: 14px;\n color: #888;\n margin-bottom: 15px;\n}\n\n.cover-preview {\n width: 100%;\n height: 200px;\n border-radius: 12px;\n overflow: hidden;\n background-color: #f5f5f5;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.cover-preview img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.cover-upload-btn {\n position: absolute;\n bottom: 15px;\n right: 15px;\n z-index: 5;\n}\n</style>\n"]}]} |