瀏覽代碼

Merge branch 'master' of http://132.232.92.186:3000/XinXiBu/oa-system

yuanrf 1 年之前
父節點
當前提交
e7744a2d33

+ 582 - 20
package-lock.json

@@ -8,6 +8,8 @@
       "name": "oa-system",
       "version": "1.0.0",
       "dependencies": {
+        "@ckeditor/ckeditor5-build-classic": "^38.1.0",
+        "@ckeditor/ckeditor5-vue2": "^3.0.1",
         "@fullcalendar/core": "^6.1.4",
         "@fullcalendar/daygrid": "^6.1.4",
         "@fullcalendar/interaction": "^6.1.4",
@@ -17,6 +19,7 @@
         "element-ui": "^2.15.13",
         "tippy.js": "^6.3.7",
         "vue": "^2.5.2",
+        "vue-quill-editor": "^3.0.6",
         "vue-router": "^3.0.1",
         "vue-typed-js": "^0.1.2",
         "vue2-org-tree": "^1.3.6",
@@ -76,6 +79,474 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/@ckeditor/ckeditor5-adapter-ckfinder": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-38.1.0.tgz",
+      "integrity": "sha512-ThWSKz4uOTmkELGuodtKUEZdgwl6BAzqfrmWcm85313esuAVuYrRVuHvOboMPjxg4pMfemfL/Cp/03nvugqZCg==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-autoformat": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-38.1.0.tgz",
+      "integrity": "sha512-heptwiVtPzriWPNq9Qpns8ClSHD49LcqdGDU0bWhAbDhfUmbIeUiFiaPn8F8u9R2qWpg0E5bIHzxED6uRBr5Nw==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-basic-styles": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-38.1.0.tgz",
+      "integrity": "sha512-K/lhLLY52YZ2AfTOeqqwIOiPbIh7qYEfj/kytMd7PQ1ScFYbGMdWwgPTXpFi0JG7O2vK+5fkS+03e4klTX6IkA==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-block-quote": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-38.1.0.tgz",
+      "integrity": "sha512-gEkVmhq4kSZR55vojSubz4JXDmffHm0FurL5wV/y28W5HigWI1PmbeZhxHLHtlB6DPseLIWRjB5Q9Nku5UoN0w==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-build-classic": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-38.1.0.tgz",
+      "integrity": "sha512-bP3EYzrhgWEk4C2jeupmCKf+joJUxlXdaeEtwB8a15XMjMj5k6HrpnCtilqbyF7Yc+KxAsffjERmXXsO902tLg==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-adapter-ckfinder": "38.1.0",
+        "@ckeditor/ckeditor5-autoformat": "38.1.0",
+        "@ckeditor/ckeditor5-basic-styles": "38.1.0",
+        "@ckeditor/ckeditor5-block-quote": "38.1.0",
+        "@ckeditor/ckeditor5-ckbox": "38.1.0",
+        "@ckeditor/ckeditor5-ckfinder": "38.1.0",
+        "@ckeditor/ckeditor5-cloud-services": "38.1.0",
+        "@ckeditor/ckeditor5-easy-image": "38.1.0",
+        "@ckeditor/ckeditor5-editor-classic": "38.1.0",
+        "@ckeditor/ckeditor5-essentials": "38.1.0",
+        "@ckeditor/ckeditor5-heading": "38.1.0",
+        "@ckeditor/ckeditor5-image": "38.1.0",
+        "@ckeditor/ckeditor5-indent": "38.1.0",
+        "@ckeditor/ckeditor5-link": "38.1.0",
+        "@ckeditor/ckeditor5-list": "38.1.0",
+        "@ckeditor/ckeditor5-media-embed": "38.1.0",
+        "@ckeditor/ckeditor5-paragraph": "38.1.0",
+        "@ckeditor/ckeditor5-paste-from-office": "38.1.0",
+        "@ckeditor/ckeditor5-table": "38.1.0",
+        "@ckeditor/ckeditor5-typing": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ckbox": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-38.1.0.tgz",
+      "integrity": "sha512-+NgnBxwwIxL2nbvC/C+CEPm2VpkT6jsojkEEYoK6sOLoG0iCiCmEZWyROCGUJZw2JEN0cXbTpZaZTfw2cyXHFg==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ckfinder": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-38.1.0.tgz",
+      "integrity": "sha512-3WwXMv/VljZhDzfd/Qt2AqbFFyQlrC+qEkv4V+qLRo6Tc2VhtUJ56J9zIjtedR+KGdJ0GiZm+eK+cl2MWlZ+JA==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-clipboard": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-38.1.0.tgz",
+      "integrity": "sha512-OoxzP+GG9b80otVlGbJH6kTWM5AR5oJNGyj76KaxmhWfpyVifHM14iIFBjuEDzORsRZdb3+DA26+GcnkJ08/GA==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "@ckeditor/ckeditor5-widget": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-cloud-services": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-38.1.0.tgz",
+      "integrity": "sha512-2BbKF4/xlF+6YNHTxvJMzTEaopKRrnpEFJaoHI9kN/EnmpwjI+6VRj7ezdk33xCUcSqP8K/sMyIFuL86GP7maQ==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-core": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-38.1.0.tgz",
+      "integrity": "sha512-jlz42+72zDVThAuQD0LMRA7qhWRHeestgBhMkVYdi1KRTEB59FWvV9vLfrJGs/qiB5vVkzDvK4etKqjOWm1KnA==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-easy-image": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-38.1.0.tgz",
+      "integrity": "sha512-q4SWi3BI28cR2bxsCjr+Gzk4Z7P7ao73q1BanqqPodkOw52WimlEM9uTJu9Q3mw1757WHQeozVeIvdYjcu4qMw==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-editor-classic": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-38.1.0.tgz",
+      "integrity": "sha512-FDB+G4jNS/1nBP25VP1F+XYlosKRW68AEsmR52X1zW64KW/9AAA9jSLQLmAsf/JA96HOviSdNDItlvzwq4x05g==",
+      "dependencies": {
+        "ckeditor5": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-engine": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-38.1.0.tgz",
+      "integrity": "sha512-Ldkw66gPMAL9GHnD+PsteWCay3ImPd+Lh/s54ISQxPDN8v4G3MNx9n003RA0ZtLKrbVhYXmAIF3xlzWWAkQK4w==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-enter": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-38.1.0.tgz",
+      "integrity": "sha512-mBjr1Bk12ugPgScxnRncAxM5YcQUQosf01T5ekqT4/tAmoICyVgcJk4OU1H16TOzIRul0D4dr6eeg1yUhRHZPg==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-essentials": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-38.1.0.tgz",
+      "integrity": "sha512-/RsNDJSHXQ4YcdcFFVoneC0PeW/d0NFz8ba6Sh5lCvfr/ja7HztmtkmGmPej6O7POqkWXRTbdKL7Zistnhm6Mg==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-heading": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-38.1.0.tgz",
+      "integrity": "sha512-pGqmJtaM7S509oj3S3cAkd2ClxASyUaD0QeDxSiJ2MzQQSph0v+CiKnzicLAb/hmhVB8ik5i21OpStNuGtn2Ww==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-image": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-38.1.0.tgz",
+      "integrity": "sha512-KaxsCdP4H381pnP4+hIoITsitfoWzLX2CCFNwglImHwsw3GzMd4uRuJjq+Zvd8mTPifULTWNsg6O4S9dEe3zmA==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "ckeditor5": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-indent": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-38.1.0.tgz",
+      "integrity": "sha512-rcTHpvOM/JRtHE+n8dnirAIIzGV2HtjuBdRMjwrU5F4Q0dgPDh/zWbm6/bAgSjjhE0aiUgdxgfItmGlnAu1pFw==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-link": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-38.1.0.tgz",
+      "integrity": "sha512-/GoXWpZ522GD0qGvqj0Y57Lo2amakWRN//k3Nc5sHvtxjhwP87Wqb8YGtVR1bB33xmvWzBwB7W1EHA+Gqkh84A==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "ckeditor5": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-list": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-38.1.0.tgz",
+      "integrity": "sha512-FiBjSPjudYp4thheroIbhZ5qIpPsd/FpHrzEvtvvkuse8ltw17hwCxnCViyDQgnowhoAlJmmEwo7P8C4U4Qs0A==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-media-embed": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-38.1.0.tgz",
+      "integrity": "sha512-k+x6tQ4jlH9pQvpBzb9a1paQm569Hm86tfHitkK18OHtBLgscNAGsswwzEBT/7ek+sP/25n1ugxdlXFeBtA0+A==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-paragraph": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-38.1.0.tgz",
+      "integrity": "sha512-B0meYDsGzR1e7pXN7Ky8L1BD80gJa+WHDUcDMLtEb+awQrdXf6JmD1CbH6ejbfBWSq+klO4cucenDSN4PK9e/g==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-paste-from-office": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-38.1.0.tgz",
+      "integrity": "sha512-RYZiCyRvCEqlLymAmW7OWVWRb0bkCuU2gWKiv/jhvgP58ZoGWDszVgAXJEcGJqCaJ2Q6mL7AVu4sdTDshTUk2A==",
+      "dependencies": {
+        "ckeditor5": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-select-all": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-38.1.0.tgz",
+      "integrity": "sha512-04QCaVepM86iLSnQANMG6BAt0zW248So2vo5dOhSEvCoj6HlOtfxOSdwLykiLMYaKUucxhDtvboHEexshcQ34w==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-table": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-38.1.0.tgz",
+      "integrity": "sha512-jXP30EjjCc73HdmwZDWxwP88xL9mCvFudE3swIOp4VLoyMDRQHFudsdZ0qoLmmy+Bobje6pJk8vNKalUaMKAKg==",
+      "dependencies": {
+        "ckeditor5": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-typing": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-38.1.0.tgz",
+      "integrity": "sha512-Y30Ein/vSBpVMnqPMEO41DcG03zZBX1alaY8p3E30K4J19i8krZ49fr6ej06Tz9JtwF6SjRqK9BGan5KL3XeeQ==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ui": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-38.1.0.tgz",
+      "integrity": "sha512-k44qe+z/08En0/SKc/LC9jSy7Gy5S/5L6HReJ/ah7Ur2xbvA8hiiH1qc39m0vuUOFYC+YrYmvEps5o/ADgmy4A==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "color-convert": "2.0.1",
+        "color-parse": "1.4.2",
+        "lodash-es": "^4.17.15",
+        "vanilla-colorful": "0.7.2"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ui/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/@ckeditor/ckeditor5-undo": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-38.1.0.tgz",
+      "integrity": "sha512-bm0WPJUqLihYVOsEWVXFLLM4hYh3vW4xcphUQNtkkkL4yXzvCYqtFr1vODgBsOiLfcmLhQzwSP/gWOxTzwtPqQ==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-upload": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-38.1.0.tgz",
+      "integrity": "sha512-IaBXioCzhOik6qIAFZEm8eCv2yVUNpAZ9RVbbQbmVqm6W2u8dh6or1j33XEwMXtIVbakbmgEjuBTy3w+gxoDCQ==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-utils": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-38.1.0.tgz",
+      "integrity": "sha512-TVo2R4tMT2VGXlGcpi3XbmyHqTx4IMM6RPICqQyo8Cl8SR8ksyPXeAJuTLvXbYaxbVKhztnY/p6Uu/zEBV7kdA==",
+      "dependencies": {
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-vue2": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-vue2/-/ckeditor5-vue2-3.0.1.tgz",
+      "integrity": "sha512-vS9ffP3rOFgM8oeG9XVFD+UtcYAhkgFDfBHjswJuCgUM0Iw8uqLlCiDPbs4PeJsend8GcmmtNeFdcQaSPkOtpw==",
+      "engines": {
+        "node": ">=14.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-watchdog": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-38.1.0.tgz",
+      "integrity": "sha512-o6M8bTnvrxfcwmX05iuvH9fvOwfe7pvEpduXDI35gXDUqOYN14lQFkU48OM4C/QvRQyos8WNLq2d+yg0cwNnIQ==",
+      "dependencies": {
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-widget": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-38.1.0.tgz",
+      "integrity": "sha512-7j1lgMKLOGdjndRWyogHGTW0pDr+0q5YP0LyqGWciiuxN6SWYSLOaYACBVKnCWp6VtvmPM473ZXF2RKW7YOVQQ==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-enter": "38.1.0",
+        "@ckeditor/ckeditor5-typing": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "lodash-es": "^4.17.15"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
     "node_modules/@fullcalendar/core": {
       "version": "6.1.4",
       "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.4.tgz",
@@ -1838,7 +2309,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
       "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dev": true,
       "dependencies": {
         "function-bind": "^1.1.1",
         "get-intrinsic": "^1.0.2"
@@ -2037,6 +2507,30 @@
         "safe-buffer": "^5.0.1"
       }
     },
+    "node_modules/ckeditor5": {
+      "version": "38.1.0",
+      "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-38.1.0.tgz",
+      "integrity": "sha512-rWkzD5d6qJkeC4IrVV56f3x2bd5USyYJ0Ida2nGReNLvQD4DhOsedfUe2cffhiSCDXW9nzyLAYtgDPl2V2zJaA==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "38.1.0",
+        "@ckeditor/ckeditor5-core": "38.1.0",
+        "@ckeditor/ckeditor5-engine": "38.1.0",
+        "@ckeditor/ckeditor5-enter": "38.1.0",
+        "@ckeditor/ckeditor5-paragraph": "38.1.0",
+        "@ckeditor/ckeditor5-select-all": "38.1.0",
+        "@ckeditor/ckeditor5-typing": "38.1.0",
+        "@ckeditor/ckeditor5-ui": "38.1.0",
+        "@ckeditor/ckeditor5-undo": "38.1.0",
+        "@ckeditor/ckeditor5-upload": "38.1.0",
+        "@ckeditor/ckeditor5-utils": "38.1.0",
+        "@ckeditor/ckeditor5-watchdog": "38.1.0",
+        "@ckeditor/ckeditor5-widget": "38.1.0"
+      },
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=5.7.1"
+      }
+    },
     "node_modules/clap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
@@ -2336,8 +2830,15 @@
     "node_modules/color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/color-parse": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz",
+      "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==",
+      "dependencies": {
+        "color-name": "^1.0.0"
+      }
     },
     "node_modules/color-string": {
       "version": "0.3.0",
@@ -3868,7 +4369,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
       "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
-      "dev": true,
       "dependencies": {
         "is-arguments": "^1.0.4",
         "is-date-object": "^1.0.1",
@@ -3893,7 +4393,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
       "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
-      "dev": true,
       "dependencies": {
         "has-property-descriptors": "^1.0.0",
         "object-keys": "^1.1.1"
@@ -4856,6 +5355,11 @@
       "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
       "dev": true
     },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
     "node_modules/extend-shallow": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@@ -4946,6 +5450,11 @@
       "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==",
       "dev": true
     },
+    "node_modules/fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+    },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -5299,8 +5808,7 @@
     "node_modules/function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "node_modules/function.prototype.name": {
       "version": "1.1.5",
@@ -5324,7 +5832,6 @@
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
       "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -5339,7 +5846,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
       "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
-      "dev": true,
       "dependencies": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
@@ -5513,7 +6019,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
       "dependencies": {
         "function-bind": "^1.1.1"
       },
@@ -5555,7 +6060,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
       "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-      "dev": true,
       "dependencies": {
         "get-intrinsic": "^1.1.1"
       },
@@ -5579,7 +6083,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
       "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       },
@@ -5591,7 +6094,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
       "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-      "dev": true,
       "dependencies": {
         "has-symbols": "^1.0.2"
       },
@@ -6226,7 +6728,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
       "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -6359,7 +6860,6 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
       "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dev": true,
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -6551,7 +7051,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
       "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
@@ -7018,6 +7517,11 @@
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
     "node_modules/lodash.camelcase": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -7780,7 +8284,6 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7883,7 +8386,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
       "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3"
@@ -7899,7 +8401,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
       "engines": {
         "node": ">= 0.4"
       }
@@ -8246,6 +8747,11 @@
         "no-case": "^2.2.0"
       }
     },
+    "node_modules/parchment": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+    },
     "node_modules/parse-asn1": {
       "version": "5.1.6",
       "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
@@ -11362,6 +11868,45 @@
       "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
       "dev": true
     },
+    "node_modules/quill": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
+      "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+      "dependencies": {
+        "clone": "^2.1.1",
+        "deep-equal": "^1.0.1",
+        "eventemitter3": "^2.0.3",
+        "extend": "^3.0.2",
+        "parchment": "^1.1.4",
+        "quill-delta": "^3.6.2"
+      }
+    },
+    "node_modules/quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "dependencies": {
+        "deep-equal": "^1.0.1",
+        "extend": "^3.0.2",
+        "fast-diff": "1.1.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/quill/node_modules/clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/quill/node_modules/eventemitter3": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+      "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
+    },
     "node_modules/randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -11616,7 +12161,6 @@
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
       "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-      "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -13823,6 +14367,11 @@
         "spdx-expression-parse": "^3.0.0"
       }
     },
+    "node_modules/vanilla-colorful": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz",
+      "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg=="
+    },
     "node_modules/vary": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -13942,6 +14491,19 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "quill": "^1.3.4"
+      },
+      "engines": {
+        "node": ">= 4.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
     "node_modules/vue-router": {
       "version": "3.6.5",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz",

+ 3 - 0
package.json

@@ -10,6 +10,8 @@
     "build": "node build/build.js"
   },
   "dependencies": {
+    "@ckeditor/ckeditor5-build-classic": "^38.1.0",
+    "@ckeditor/ckeditor5-vue2": "^3.0.1",
     "@fullcalendar/core": "^6.1.4",
     "@fullcalendar/daygrid": "^6.1.4",
     "@fullcalendar/interaction": "^6.1.4",
@@ -19,6 +21,7 @@
     "element-ui": "^2.15.13",
     "tippy.js": "^6.3.7",
     "vue": "^2.5.2",
+    "vue-quill-editor": "^3.0.6",
     "vue-router": "^3.0.1",
     "vue-typed-js": "^0.1.2",
     "vue2-org-tree": "^1.3.6",

+ 29 - 19
src/assets/js/common.js

@@ -1,24 +1,34 @@
 export default{
-    install(Vue){
-        //这里是示例方法 getTime是方法名 function()可以携带参数
-        Vue.prototype.getTime = function(val,fun,title){
-            this.$confirm(val, '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning'
-            }).then(() => {
-                fun
-                this.$message({
-                type: 'success',
-                message: title+'成功!'
-                });
-            }).catch(() => {
-                this.$message({
-                type: 'info',
-                message: '已取消'+title
-                });          
-            });
+    data(){
+
+    },
+    methods: {
+        randomString(encode = 36, number = -8) {
+            return Math.random() // 生成随机数字,
+                .toString(encode) // 转化成36进制
+                .slice(number) 
         }
     }
+    // install(Vue){
+    //     //这里是示例方法 getTime是方法名 function()可以携带参数
+    //     Vue.prototype.getTime = function(val,fun,title){
+    //         this.$confirm(val, '提示', {
+    //             confirmButtonText: '确定',
+    //             cancelButtonText: '取消',
+    //             type: 'warning'
+    //         }).then(() => {
+    //             fun
+    //             this.$message({
+    //             type: 'success',
+    //             message: title+'成功!'
+    //             });
+    //         }).catch(() => {
+    //             this.$message({
+    //             type: 'info',
+    //             message: '已取消'+title
+    //             });          
+    //         });
+    //     }
+    // }
     
 }

+ 8 - 8
src/components/Finance/DailyFeePayment.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="visa-box">
-        <div class="search-ul">
-            <div class="search-li">
+        <div class="visasearch-ul">
+            <div class="visasearch-li">
                 <div class="feeType-box">
                     <label>费用类型: </label>
                     <el-select  v-model="feeTypValue" filterable placeholder="请选择费用类型"  @change="filtersub()">
@@ -470,17 +470,17 @@ export default {
         width: 20%;
         justify-content: end;
     }*/
-    .search-ul{
+    .visasearch-ul{
         margin-bottom: 10px;
     }
-    .search-li label{
+    .visasearch-li label{
         color: #606266;
     }
-    .search-li{
+    .visasearch-li{
         display: flex;
         justify-content: space-between;
     }
-    .search-li>div{
+    .visasearch-li>div{
         margin-right: 10px;
     }
     .dailyment-box .el-table th.el-table__cell>.cell{
@@ -533,7 +533,7 @@ export default {
     .dailyment-box .el-link{
         margin: 0 8px;
     }
-    .search-li .feeType-box{
+    .visasearch-li .feeType-box{
         margin-right: 0;
     }
-</style>
+</style>y

+ 19 - 4
src/components/Finance/FeesPage.vue

@@ -59,10 +59,11 @@
                 </el-table-column>
                 <el-table-column prop="priceNameContent" label="费用所属" width="200">
                     <template slot-scope="scope">
-                        <el-popover style="white-space: pre-wrap;" placement="top-start" width="100" trigger="click"
-                            :content="scope.row.priceMsgContent">
-                            <span slot="reference">{{ scope.row.priceNameContent }}</span>
-                        </el-popover>
+                        <span @click="open(scope.row.priceMsgContent)" slot="reference">{{ scope.row.priceNameContent }}</span>
+                        <!-- <el-popover style="white-space: pre-wrap;" placement="top-start" width="200" trigger="click">
+                            <p>{{scope.row.priceMsgContent.replace(/<br\s*\/?>/,"</p><p>")}}</p>
+                            <span @click="open(scope.row.priceMsgContent)" slot="reference">{{ scope.row.priceNameContent }}</span>
+                        </el-popover> -->
                     </template>
                 </el-table-column>
                 <el-table-column prop="priceName" label="费用模块" width="120">
@@ -98,6 +99,9 @@
             <div class="remainder"></div>
             <div class="reviewed"></div>
         </div>
+        <el-row>
+            <el-button size="mini" type="primary" @click="goback()">返 回</el-button>
+        </el-row>
     </div>
 </template>
 
@@ -272,6 +276,11 @@ export default {
         },
         ceshi() {
             console.log("tg")
+        },
+        open(val) {
+            this.$alert(val, '费用所属', {
+            dangerouslyUseHTMLString: true
+            });
         }
     },
     mounted() {
@@ -280,6 +289,8 @@ export default {
         this.userid = JSON.parse(localStorage.getItem('userinif')).userInfo.userId;
         this.getPostSearchGrpCreditCardPayment();
         // this.getTime('是否通过该条费用?',this.ceshi(),'通过') 
+        // this.randomString()
+        this.test();
     }
 }
 </script>
@@ -328,4 +339,8 @@ export default {
 .reviewed {
     color: #1D5DA4;
 }
+.fesspage-box .el-row{
+    margin-top: 10px;
+    text-align: end;
+}
 </style>

+ 153 - 0
src/components/GPT/Richtext.vue

@@ -0,0 +1,153 @@
+<template>
+    <div class="richtext-box">
+        <quill-editor class="editor"
+            ref="myTextEditor"
+            v-model="content"
+            :options="editorOption"
+            @blur="onEditorBlur($event)"
+            @focus="onEditorFocus($event)"
+            @ready="onEditorReady($event)"
+            @change="onEditorChange($event)">
+            <button id="custom-button">defineAsyncComponent</button>
+        </quill-editor>
+    </div>
+</template>
+<script>
+    export default {
+      data () {
+        return {
+          content: null,
+          editorOption: {
+            modules: {
+              toolbar: [
+                ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
+                ["blockquote", "code-block"], // 引用  代码块
+                [{ header: 1 }, { header: 2 }], // 1、2 级标题
+                [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
+                [{ script: "sub" }, { script: "super" }], // 上标/下标
+                [{ indent: "-1" }, { indent: "+1" }], // 缩进
+                // [{'direction': 'rtl'}],                         // 文本方向
+                [{ size: ["small", false, "large", "huge"] }], // 字体大小
+                [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
+                [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
+                [{ font: [] }], // 字体种类
+                [{ align: [] }], // 对齐方式
+                ["clean"], // 清除文本格式
+                ["link", "image", "video"], // 链接、图片、视频
+                ["sourceEditor"]
+              ], //工具菜单栏配置
+            },
+            placeholder: '请在这里添加产品描述', //提示
+            readyOnly: false, //是否只读
+            theme: 'snow', //主题 snow/bubble
+            syntax: true, //语法检测
+          }
+        }
+      },
+      methods: {
+        // 失去焦点
+        onEditorBlur(editor) {},
+        // 获得焦点
+        onEditorFocus(editor) {},
+        // 开始
+        onEditorReady(editor) {},
+        // 值发生变化
+        onEditorChange(editor) {
+          this.content = editor.html;
+          console.log(editor);
+        },
+      },
+      computed: {
+        editor() {
+          return this.$refs.myTextEditor.quillEditor;
+        }
+      },
+      mounted() {
+        // console.log('this is my editor',this.editor);
+      } 
+    }
+</script>
+<style>
+.richtext-box{
+    background-color: #fff;
+    padding: 10px;
+    box-shadow: 0 0 5px #0005;
+    border-radius: 10px;
+    height: 100%;
+}
+.richtext-box .editor {
+line-height: normal !important;
+height: 800px;
+}
+.richtext-box .ql-snow .ql-tooltip[data-mode=link]::before {
+content: "请输入链接地址:";
+}
+.richtext-box .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
+    border-right: 0px;
+    content: '保存';
+    padding-right: 0px;
+}
+
+.richtext-box .ql-snow .ql-tooltip[data-mode=video]::before {
+    content: "请输入视频地址:";
+}
+
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-label::before,
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-item::before {
+content: '14px';
+}
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+content: '10px';
+}
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+content: '18px';
+}
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
+.richtext-box .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+content: '32px';
+}
+
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item::before {
+content: '文本';
+}
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+content: '标题1';
+}
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+content: '标题2';
+}
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+content: '标题3';
+}
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+content: '标题4';
+}
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+content: '标题5';
+}
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
+.richtext-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+content: '标题6';
+}
+
+.richtext-box .ql-snow .ql-picker.ql-font .ql-picker-label::before,
+.richtext-box .ql-snow .ql-picker.ql-font .ql-picker-item::before {
+content: '标准字体';
+}
+.richtext-box .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
+.richtext-box .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+content: '衬线字体';
+}
+.richtext-box .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
+.richtext-box .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+content: '等宽字体';
+}
+</style>

+ 21 - 17
src/components/OP/AirTicketRes.vue

@@ -6,9 +6,10 @@
                 <div class="communal-title">
                     <div>机票费用录入</div>
                 </div>
-                <div style="display: flex;">
+                <div style="display: flex;justify-content: space-between;">
                     <div style="width: 60%;">
-                        <el-select v-model="DiId" placeholder="团组选择" @change="AirTicketResSelectChange">
+                        <el-select v-model="DiId" placeholder="团组选择" clearable filterable
+                            @change="AirTicketResSelectChange">
                             <el-option v-for="item in AirTicketResSelectData" :key="item.id" :label="item.groupName"
                                 :value="item.id">
                             </el-option>
@@ -23,18 +24,19 @@
                         </router-link>
                     </div>
                 </div>
-                <span style="font-weight: bold;">团队名称:</span>
-                {{ delegationInfo.teamName }}&nbsp;&nbsp;&nbsp;
-                <span style="font-weight: bold;">客户:</span>
-                {{ delegationInfo.clientName }}&nbsp;&nbsp;&nbsp;
-                <span style="font-weight: bold;">出访国家:</span>
-                {{ delegationInfo.visitCountry }}&nbsp;&nbsp;&nbsp;
-                <span style="font-weight: bold;">起止日期:</span>
-                {{ delegationInfo.visitStartDate }}—{{ delegationInfo.visitEndDate }}&nbsp;&nbsp;&nbsp;
-                <span style="font-weight: bold;">天数/人数:</span>
-                {{ delegationInfo.visitDays }}天/{{ delegationInfo.visitPNumber }}人
+                <div style="margin:10px 0;color:#606266;">
+                    <span style="font-weight: bold;font-size:17px;">团队名称:</span>
+                    <span style="color:#606266;">{{ delegationInfo.teamName }}&nbsp;&nbsp;&nbsp;</span>
+                    <span style="font-weight: bold;font-size:17px;">客户:</span>
+                    <span style="color:#606266;">{{ delegationInfo.clientName }}&nbsp;&nbsp;&nbsp;</span>
+                    <span style="font-weight: bold;font-size:17px;">出访国家:</span>
+                    <span style="color:#606266;">{{ delegationInfo.visitCountry }}&nbsp;&nbsp;&nbsp;</span>
+                    <span style="font-weight: bold;font-size:17px;">起止日期:</span>
+                    <span style="color:#606266;">{{ delegationInfo.visitStartDate }}—{{ delegationInfo.visitEndDate }}&nbsp;&nbsp;&nbsp;</span>
+                    <span style="font-weight: bold;font-size:17px;">天数/人数:</span>
+                    <span style="color:#606266;">{{ delegationInfo.visitDays }}天/{{ delegationInfo.visitPNumber }}人</span>
+                </div>
             </div>
-            <hr style='background-color:#5555; height:1px; border:none;' />
             <template>
                 <el-table :data="tableDatas.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border
                     style="width: 100%" v-loading="loading" element-loading-text="拼命加载中...">
@@ -49,7 +51,7 @@
                     </el-table-column>
                     <el-table-column prop="clientName" label="客人名单" width="280">
                     </el-table-column>
-                    <el-table-column prop="clientNum" label="客人人数" width="50">
+                    <el-table-column prop="clientNum" label="客人人数" width="100">
                     </el-table-column>
                     <el-table-column prop="prePrice,preCurrencyStr" label="机票单价" width="120" sortable>
                         <template slot-scope="scope">
@@ -157,9 +159,11 @@ export default {
                 if (res.data.code == 200) {
                     that.tableDatas = res.data.data.airTicketReservations;
                     that.tableData = that.tableDatas
-                    if (that.tableDatas.slice((that.currentPage - 1) * that.pageSize, that.currentPage * that.pageSize).length == 0) {
-                        if (that.currentPage > 1) {
-                            that.currentPage = that.currentPage - 1;
+                    if (that.tableDatas.length != 0) {
+                        if (that.tableDatas.slice((that.currentPage - 1) * that.pageSize, that.currentPage * that.pageSize).length == 0) {
+                            if (that.currentPage > 1) {
+                                that.currentPage = that.currentPage - 1;
+                            }
                         }
                     }
                     that.delegationInfo = res.data.data.delegationInfo

+ 275 - 0
src/components/OP/DecreasePayments.vue

@@ -0,0 +1,275 @@
+<template>
+    <div>
+        <div class="communal-list">
+            <div>
+
+                <div class="communal-title">
+                    <div>团组增减款项</div>
+                </div>
+                <div style="display: flex;">
+                    <div style="width: 90%;">
+                        <el-select v-model="DiId" placeholder="团组选择" clearable filterable @change="DecreasePaymentsChange">
+                            <el-option v-for="item in delegationInfoList" :key="item.id" :label="item.teamName"
+                                :value="item.id">
+                            </el-option>
+                        </el-select>
+                    </div>
+                    <div>
+                        <router-link :to="{ path: '/home/OpDecreasePayments', query: { DiId } }">
+                            <el-button type="primary" style="margin-left: 10px;">新增</el-button>
+                        </router-link>
+                    </div>
+                </div>
+                <span style="font-weight: bold;">团队名称:</span>
+                {{ delegationInfo.teamName }}&nbsp;&nbsp;&nbsp;
+                <span style="font-weight: bold;">客户:</span>
+                {{ delegationInfo.clientName }}&nbsp;&nbsp;&nbsp;
+                <span style="font-weight: bold;">出访国家:</span>
+                {{ delegationInfo.visitCountry }}&nbsp;&nbsp;&nbsp;
+                <span style="font-weight: bold;">起止日期:</span>
+                {{ delegationInfo.visitStartDate }}—{{ delegationInfo.visitEndDate }}&nbsp;&nbsp;&nbsp;
+                <span style="font-weight: bold;">天数/人数:</span>
+                {{ delegationInfo.visitDays }}天/{{ delegationInfo.visitPNumber }}人
+            </div>
+            <hr style='background-color:#5555; height:1px; border:none;' />
+            <template>
+                <el-table :data="tableDatas.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border
+                    style="width: 100%" v-loading="loading" element-loading-text="拼命加载中...">
+                    <el-table-column prop="num" label="序 号" width="55">
+                        <template slot-scope="scope">
+                            {{ (currentPage - 1) * pageSize + scope.$index + 1 }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="priceName" label="费用名称" width="260">
+                    </el-table-column>
+                    <el-table-column prop="price,currency" label="费用" sortable>
+                        <template slot-scope="scope">
+                            {{ scope.row.price }}({{ scope.row.currency }})
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="filePath" label="附件">
+                    </el-table-column>
+                    <el-table-column prop="createUserName" label="操作人" width="120">
+                    </el-table-column>
+                    <el-table-column prop="createTime" label="操作时间">
+                    </el-table-column>
+                    <el-table-column prop="isAudit" label="是否审核" width="120">
+                        <template slot-scope="isAudit">
+                            <span v-if="isAudit.row.isAudit == 1">已通过</span>
+                            <span v-else-if="isAudit.row.isAudit == 0">未审核</span>
+                            <span v-else-if="isAudit.row.isAudit == 2">未通过</span>
+                            <span v-else>自动审核通过</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" width="280">
+                        <template slot-scope="scope">
+                            <el-button size="mini" @click="download(scope.$index, scope.row)">下载</el-button>
+                            <el-button size="mini" @click="upDate(scope.$index, scope.row)">编辑</el-button>
+                            <el-button size="mini" type="danger" @click="del(scope.$index, scope.row)">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </template>
+            <div class="block">
+                <el-pagination align='center' @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                    :current-page="currentPage" :page-sizes="[10, 12, 15, 20]" :page-size="pageSize"
+                    layout="total, sizes, prev, pager, next" :total="tableDatas.length">
+                </el-pagination>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            loading: false,
+            tableDatas: [],
+            tableData: [],
+            currentPage: 1, // 当前页码
+            pageSize: 12,// 每页的数据条数
+            input: '',
+            token: '',
+            userId: 0,
+            DiId: '',
+            delegationInfoList: [],
+            delegationInfo: {}
+        }
+    },
+    methods: {
+        //每页条数改变时触发 选择一页显示多少行
+        handleSizeChange(val) {
+            this.currentPage = 1;
+            this.pageSize = val;
+        },
+        //当前页改变时触发 跳转其他页
+        handleCurrentChange(val) {
+            this.currentPage = val;
+        },
+        //团组下拉框
+        DecreasePaymentsSelect() {
+            var url = "/api/Groups/DecreasePaymentsSelect"
+            var that = this
+            this.$axios({
+                method: 'post',
+                url: url,
+                headers: {
+                    Authorization: 'Bearer ' + this.token
+                },
+                data: {
+                    UserId: that.userId,
+                    CTId: 98
+                }
+            }).then(function (res) {
+                if (res.data.code == 200) {
+                    that.delegationInfoList = res.data.data.groupName;
+                    that.DiId = that.delegationInfoList[0].id;
+                    that.delegationInfo = that.delegationInfoList[0];
+                    that.DecreasePaymentsList()
+                }
+            }).catch(function (error) {
+                that.$message.error("网络错误,请稍后重试");
+            });
+        },
+        DecreasePaymentsChange() {
+            for (let index = 0; index < this.delegationInfoList.length; index++) {
+                if (this.delegationInfoList[index].id == this.DiId) {
+                    this.delegationInfo = this.delegationInfoList[index];
+                    break;
+                }
+            }
+            this.DecreasePaymentsList();
+        },
+        //团组信息绑定
+        DecreasePaymentsList() {
+            var url = "/api/Groups/DecreasePaymentsList"
+            var that = this
+            this.$axios({
+                method: 'post',
+                url: url,
+                headers: {
+                    Authorization: 'Bearer ' + this.token
+                },
+                data: {
+                    diId: that.DiId
+                }
+            }).then(function (res) {
+                if (res.data.code == 200) {
+                    that.tableDatas = res.data.data;
+                    that.tableData = that.tableDatas
+                    if (that.tableDatas.length != 0) {
+                        if (that.tableDatas.slice((that.currentPage - 1) * that.pageSize, that.currentPage * that.pageSize).length == 0) {
+                            if (that.currentPage > 1) {
+                                that.currentPage = that.currentPage - 1;
+                            }
+                        }
+                    }
+                }
+            }).catch(function (error) {
+
+                that.$message.error("网络错误,请稍后重试");
+            });
+        },
+        upDate(index, row) {
+            if (row.isAudit == 3 || row.isAudit == 0 || row.isAudit == 2) {
+                this.$router.push({
+                    path: "/home/OpDecreasePayments",
+                    query: {
+                        DiId: this.DiId,
+                        id: row.id
+                    }
+                })
+            } else if (row.isAudit == 1) {
+                this.$message('审核已通过,不可编辑!');
+            }
+
+        },
+        del(index, row) {
+            this.$confirm('此操作将删除该数据, 是否继续?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                var url = "/api/Groups/DelDecreasePayments"
+                var that = this
+                this.$axios({
+                    method: 'post',
+                    url: url,
+                    headers: {
+                        Authorization: 'Bearer ' + this.token
+                    },
+                    data: {
+                        Id: row.id,
+                        DeleteUserId: this.userId
+                    }
+                }).then(function (res) {
+                    console.log(res)
+
+                    if (res.data.code == 200) {
+
+                        that.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        });
+                        that.DecreasePaymentsSelect();
+                    } else {
+                        that.$message.error('删除失败!');
+                    }
+                    that.loading = false
+                }).catch(function (error) {
+                    that.loading = false
+                    that.$message.error("网络错误,请稍后重试");
+                });
+            }).catch(() => {
+                this.$message({
+                    type: 'info',
+                    message: '操作已取消!'
+                });
+            });
+        },
+        download(index, row) {
+            if (row.filePath != "") {
+                window.location.href = "http://132.232.92.186:24/Office/GrpFile/" + row.filePath
+            } else {
+                this.$message.error("暂未上传附件");
+            }
+
+        }
+
+    },
+    mounted() {
+        this.token = JSON.parse(localStorage.getItem('userinif')).token;
+        this.userId = JSON.parse(localStorage.getItem('userinif')).userInfo.userId
+        this.DecreasePaymentsSelect();
+        //this.AirTicketResList()
+    }
+}
+</script>
+<style>
+.communal-list {
+    background-color: #fff;
+    padding: 10px;
+    box-shadow: 0 0 5px #0005;
+    border-radius: 10px;
+}
+
+.communal-title {
+    display: flex;
+    font-size: 17px;
+    font-weight: 600;
+    color: #555;
+    margin-top: 8px;
+    margin-bottom: 10px;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.communal-box {
+    display: flex;
+}
+
+.communal-box>button {
+    margin-left: 10px;
+    padding: 8px 20px;
+}
+</style>

+ 3 - 3
src/components/OP/Groupedit.vue

@@ -89,9 +89,9 @@
                     </el-form-item>
                 </el-form>
                 <el-form-item>
-                  <el-button type="primary" @click="submitForm('ruleForm')">确 定</el-button>
-                  <el-button @click="resetForm('ruleForm')">重 置</el-button>
-                  <el-button @click="clickback()">返 回</el-button>
+                    <el-button type="primary" @click="submitForm('ruleForm')">确 定</el-button>
+                    <el-button @click="resetForm('ruleForm')">重 置</el-button>
+                    <el-button @click="clickback()">返 回</el-button>
                 </el-form-item>
               </el-form>
         </div>

+ 7 - 0
src/components/OP/OCRIdentify.vue

@@ -131,6 +131,13 @@ export default {
                 reader.onload = function () {
                 imgResult = reader.result
                 }
+                3
+
+
+
+
+
+                
                 reader.onerror = function (error) {
                 reject(error)
                 }

+ 21 - 19
src/components/OP/OpAirTicketRes.vue

@@ -4,14 +4,12 @@
             <div class="communal-title">
                 <div>{{ title }}</div>
             </div>
-
         </div>
-        <hr style='background-color:#5555; height:1px; border:none;' />
-        <div style="color:red;display: flex;">
-            <div style="text-align:left;width:20%;">
-                *团组成本预算 - 机票的预算:
+        <div style="display: flex;">
+            <div style="text-align:left;font-size: 17px;font-weight: 600;color: #555;">
+                团组成本预算 - 机票的预算:
             </div>
-            <div style="margin-left:20px;color:red;" v-if="airGroupCostParameter != null">
+            <div style="margin-left:20px;color: #555;" v-if="airGroupCostParameter != null">
                 经济舱: {{ airGroupCostParameter.jjccb }}元/人 {{ airGroupCostParameter.jjcrs }}人
                 共:{{ airGroupCostParameter.jjccb * airGroupCostParameter.jjcrs
                 }}元&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@@ -19,17 +17,18 @@
                 共:{{ airGroupCostParameter.gwccb * airGroupCostParameter.gwcrs
                 }}元&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
             </div>
-            <div style="margin-left:20px;color:red;" v-else>
+            <div style="margin-left:20px;" v-else>
                 团组成本暂未开放此团数据!
             </div>
         </div>
+        <hr style='background-color:#5555; height:1px; border:none;' />
         <div>
             <el-form :model="delegationInfo" label-width="100px" class="demo-ruleForm">
                 <div style="display: flex;">
                     <div style="width: 33%;">
                         <el-form-item label="团组名称:" label-width="160px">
-                            <el-select v-model="DiIdSelect" placeholder="团组选择" @change="AirTicketResChange"
-                                style="width: 100%;">
+                            <el-select v-model="DiIdSelect" clearable filterable placeholder="团组选择"
+                                @change="AirTicketResChange" :disabled="isShow" style="width: 100%;">
                                 <el-option v-for="item in AirTicketResSelectData" :key="item.id" :label="item.groupName"
                                     :value="item.id">
                                 </el-option>
@@ -88,7 +87,7 @@
                             <el-input placeholder="机票总价" v-model="airTicketResOpData.price" style="width: 58%;"
                                 :disabled="true">
                             </el-input>
-                            <el-select v-model="airTicketResOpData.currency" style="width: 35%;" :disabled="true">
+                            <el-select v-model="airTicketResOpData.currency" style="width: 40%;" :disabled="true">
                                 <el-option key="48" label="CNY" :value="48"></el-option>
                                 <el-option key="49" label="USD" :value="49"></el-option>
                                 <el-option key="51" label="EUR" :value="51"></el-option>
@@ -164,28 +163,28 @@
                     </div>
                 </div>
                 <div style="display: flex;">
-                    <div style="width: 90%;">
+                    <div style="width: 100%;">
                         <el-form-item label="此舱位客人名称:" prop="clientName" label-width="160px">
                             <el-input placeholder="此舱位客人名称" v-model="airTicketResOpData.clientName">
                             </el-input>
                         </el-form-item>
                     </div>
                 </div>
-                <div>
+                <!-- <div>
                     <span style="color: red; padding-left: 100px;">
                         请严格遵守此格式!!! 1. EK363 R1 WE08MAR CANDXB HK7 0015 0515 SEAME 2 3 (注意空格以及多条数据换行)
                     </span>
-                </div>
+                </div> -->
                 <div style="display: flex;">
-                    <div style="width: 60%;">
+                    <div style="width: 100%;">
                         <el-form-item label="航班描述:" prop="flightsDescription" label-width="160px">
-                            <el-input type="textarea" :rows="5" placeholder="航班描述"
+                            <el-input type="textarea" :rows="5" placeholder="请严格遵守此格式!!! 1. EK363 R1 WE08MAR CANDXB HK7 0015 0515 SEAME 2 3 (注意空格以及多条数据换行)"
                                 v-model="airTicketResOpData.flightsDescription"></el-input>
                         </el-form-item>
                     </div>
                 </div>
                 <div style="display: flex;">
-                    <div style="width: 90%;">
+                    <div style="width: 100%;">
                         <el-form-item label="费用描述:" prop="priceDescription" label-width="160px">
                             <el-input type="textarea" :rows="3" placeholder="费用描述"
                                 v-model="airTicketResOpData.priceDescription"></el-input>
@@ -193,7 +192,7 @@
                     </div>
                 </div>
                 <div style="display: flex;">
-                    <div style="width: 90%;">
+                    <div style="width: 100%;">
                         <el-form-item label="备 注:" prop="Remark" label-width="160px">
                             <el-input type="textarea" :rows="3" placeholder="备注"
                                 v-model="airTicketResOpData.remark"></el-input>
@@ -202,7 +201,7 @@
                 </div>
             </el-form>
             <div style="margin-top: 20px;">
-                <span style="color: red;">付款申请</span>
+                <div class="communal-title">付款申请</div>
                 <hr style='background-color:#5555; height:1px; border:none;margin-top: 10px;' />
             </div>
             <el-form :model="cardPaymentOpData" ref="cardPaymentOpData" :rules="cardPaymentRules" label-width="130px"
@@ -350,7 +349,7 @@
                     </div>
                 </div>
                 <div style="display: flex;">
-                    <div style="width: 90%;">
+                    <div style="width: 100%;">
                         <el-form-item label="备 注:" prop="Remark">
                             <el-input type="textarea" :rows="5" placeholder="备注"
                                 v-model="cardPaymentOpData.remark"></el-input>
@@ -420,6 +419,7 @@ export default {
             userId: 0,
             id: '',
             DiId: '',
+            isShow: false,
             DiIdSelect: '',
             delegationInfo: {},
             AirTicketResSelectData: [],//团组下拉框
@@ -536,8 +536,10 @@ export default {
             })
             if (that.DiId != undefined && that.id != undefined) {
                 that.status = 2;
+                that.isShow = true
                 that.AirTicketResById();
             } else {
+                that.isShow = false
                 that.status = 1;
             }
         },

+ 487 - 0
src/components/OP/OpDecreasePayments.vue

@@ -0,0 +1,487 @@
+<template>
+    <div class="car_add">
+        <div>
+            <div class="communal-title">
+                <div>{{ title }}</div>
+            </div>
+        </div>
+        <hr style='background-color:#5555; height:1px; border:none;' />
+        <div>
+            <el-form :model="delegationInfo" label-width="100px" class="demo-ruleForm">
+                <div style="display: flex;">
+                    <div style="width: 25%;">
+                        <el-form-item label="团组名称:" label-width="160px">
+                            <el-select v-model="DiIdSelect" clearable filterable placeholder="团组选择"
+                                @change="DecreasePaymentsChange" :disabled="isShow" style="width: 220px;">
+                                <el-option v-for="item in delegationInfoList" :key="item.id" :label="item.teamName"
+                                    :value="item.id">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div style="width: 25%;">
+                        <el-form-item label="团 号:" prop="tourCode" label-width="160px">
+                            <el-input placeholder="团号" v-model="delegationInfo.tourCode" :disabled="true">
+                            </el-input>
+                        </el-form-item>
+                    </div>
+                    <div style="width: 25%;">
+                        <el-form-item label="客户:" prop="clientName" label-width="160px">
+                            <el-input placeholder="客户" v-model="delegationInfo.clientName" :disabled="true">
+                            </el-input>
+                        </el-form-item>
+                    </div>
+                    <div style="width: 25%;">
+                        <el-form-item label="出访国家:" prop="visitCountry" label-width="160px">
+                            <el-input placeholder="出访国家" v-model="delegationInfo.visitCountry" :disabled="true">
+                            </el-input>
+                        </el-form-item>
+                    </div>
+                </div>
+            </el-form>
+            <el-form :model="DecreasePaymentsData" ref="DecreasePaymentsData" :rules="DecreasePaymentsRules"
+                label-width="100px" class="demo-ruleForm">
+                <div style="display:flex ;">
+                    <div style="width: 33%;">
+                        <el-form-item label="费用名称:" prop="priceName" label-width="160px">
+                            <el-input placeholder="费用名称" v-model="DecreasePaymentsData.priceName">
+                            </el-input>
+                        </el-form-item>
+                    </div>
+                    <div style="width: 33%;">
+                        <el-form-item label="费用金额:" prop="price" label-width="160px">
+                            <el-input placeholder="费用金额" v-model="DecreasePaymentsData.price" style="width: 58%;">
+                            </el-input>
+                            <el-select v-model="DecreasePaymentsData.currency" style="width: 35%;">
+                                <el-option key="48" label="CNY" :value="48"></el-option>
+                                <el-option key="49" label="USD" :value="49"></el-option>
+                                <el-option key="51" label="EUR" :value="51"></el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div style="width: 33%;">
+                        <el-form-item label="收款方:" prop="payee" label-width="160px">
+                            <el-input placeholder="收款方" v-model="DecreasePaymentsData.payee">
+                            </el-input>
+                        </el-form-item>
+                    </div>
+                </div>
+                <div style="display:flex ;">
+                    <div style="width: 33%;">
+                        <el-form-item label="费用标识:" prop="orbitalPrivateTransfer" label-width="160px">
+                            <el-select v-model="DecreasePaymentsData.orbitalPrivateTransfer" placeholder="费用标识"
+                                style="width: 100%;">
+                                <el-option key="0" label="公转" :value=0>
+                                </el-option>
+                                <el-option key="1" label="私转" :value=1>
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                    <div style="width: 33%;">
+                        <el-form-item label="支付方式:" prop="payDId" label-width="160px">
+                            <el-select v-model="DecreasePaymentsData.payDId" placeholder="支付方式" style="width: 100%;">
+                                <el-option v-for="item in payment" :key="item.id" :label="item.name" :value="item.id">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                </div>
+                <div style="display: flex;">
+                    <div style="50;">
+                        <el-form-item label="附件:" prop="fileUrl" label-width="160px">
+                            <el-upload :file-list="uploadFiles" ref="upload" :on-success="upLoadSuccess"
+                                :on-error="upLoadError" :before-remove="beforeRemove" :on-change="onChange" :limit="1"
+                                :on-exceed="exceed" :action="uploadURL" :headers="headers" :auto-upload="false">
+                                <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
+                                <!-- <el-button style="margin-left: 10px;" size="small" type="success"
+                                    @click="submitUpload">上传到服务器</el-button> -->
+                            </el-upload>
+
+
+                        </el-form-item>
+                    </div>
+                </div>
+                <div style="display: flex;">
+                    <div style="width: 90%;">
+                        <el-form-item label="备 注:" prop="remark" label-width="160px">
+                            <el-input type="textarea" :rows="5" placeholder="备注"
+                                v-model="DecreasePaymentsData.remark"></el-input>
+                        </el-form-item>
+                    </div>
+                </div>
+                <el-form-item>
+                    <div style="margin-left: 60%;">
+                        <el-button type="primary" @click="addBtn">保存</el-button>
+                        <router-link to='/home/DecreasePayments'>
+                            <el-button>取消</el-button>
+                        </router-link>
+                    </div>
+                </el-form-item>
+            </el-form>
+
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            projectName: "",
+            //uploadURL: "/project/upload?a=1",
+            uploadFiles: [],//上传的文件列表
+            DelfileName: "",
+            title: "新增团组增减款项费用",
+            token: '',
+            userId: 0,
+            id: '',
+            DiId: '',
+            isShow: false,
+            DiIdSelect: '',
+            delegationInfo: {},
+            delegationInfoList: [],//团组下拉框
+            payment: [],//支付方式下拉框
+            DecreasePaymentsData: {
+                status: 0,
+                payDId: 72,
+                orbitalPrivateTransfer: 0,
+                payee: "",
+                id: 0,
+                diId: 0,
+                priceName: "",
+                price: 0,
+                currency: 48,
+                filePath: "",
+                createUserId: 0,
+                remark: ""
+            },
+            Decrease: {},
+            CreditCard: {},
+            headers: {
+                Authorization: JSON.parse(localStorage.getItem('userinif')).token
+            },
+            DecreasePaymentsRules: {
+                price: [
+                    { required: true, message: '请输入费用金额', trigger: 'change' },
+                    { pattern: /^(([1-9]?\d{0,8}(\.\d{1,2})?)|999999999|999999999\.(0){1,2})$/, message: '请输入正确的金额(最多2位小数)' }
+                ],
+                priceName: [
+                    { required: true, message: '请输入费用名称', trigger: 'change' },
+                ],
+                payee: [
+                    { required: true, message: '请输入收款方姓名', trigger: 'change' },
+                ],
+                orbitalPrivateTransfer: [
+                    { required: true, message: '请选择费用标识', trigger: 'change' },
+                ],
+                payDId: [
+                    { required: true, message: '请选择支付方式', trigger: 'change' }
+                ],
+            }
+
+        }
+    },
+    computed: {
+        //文件的上传路径
+        uploadURL: function () {
+            //var userId = this.$store.state.userId;
+            return "http://132.232.92.186:8888/api/Groups/UploadProject";
+        }
+    },
+
+    methods: {
+        //团组下拉框
+        AirTicketResSelect() {
+            var url = "/api/Groups/DecreasePaymentsSelect"
+            var that = this
+            this.$axios({
+                method: 'post',
+                url: url,
+                headers: {
+                    Authorization: 'Bearer ' + this.token
+                },
+                data: {
+                    userId: that.userId
+                }
+            }).then(function (res) {
+                if (res.data.code == 200) {
+                    that.delegationInfoList = res.data.data.groupName;
+                    that.DiIdSelect = parseInt(that.DiId)
+                    for (let index = 0; index < that.delegationInfoList.length; index++) {
+                        if (that.delegationInfoList[index].id == that.DiIdSelect) {
+                            that.delegationInfo = that.delegationInfoList[index];
+                            break;
+                        }
+                    }
+
+                    that.payment = res.data.data.payment
+                }
+
+            })
+
+
+        },
+        QueryDecreasePaymentsById() {
+            var url = "/api/Groups/QueryDecreasePaymentsById"
+            var that = this
+            this.$axios({
+                method: 'post',
+                url: url,
+                headers: {
+                    Authorization: 'Bearer ' + this.token
+                },
+                data: {
+                    Id: that.id
+                }
+            }).then(function (res) {
+                if (res.data.code == 200) {
+                    that.Decrease = res.data.data._Decrease
+                    that.CreditCard = res.data.data._CreditCard
+                    that.DecreasePaymentsData.payDId = that.CreditCard.payDId
+                    that.DecreasePaymentsData.orbitalPrivateTransfer = that.CreditCard.orbitalPrivateTransfer
+                    that.DecreasePaymentsData.payee = that.CreditCard.payee
+                    that.DecreasePaymentsData.id = that.Decrease.id
+                    that.DecreasePaymentsData.diId = that.Decrease.diId
+                    that.DecreasePaymentsData.priceName = that.Decrease.priceName
+                    that.DecreasePaymentsData.price = that.Decrease.price
+                    that.DecreasePaymentsData.currency = that.Decrease.currency
+                    that.DecreasePaymentsData.filePath = that.Decrease.filePath
+                    that.DecreasePaymentsData.remark = that.Decrease.remark
+                    if (that.Decrease.filePath != null && that.Decrease.filePath != undefined && that.Decrease.filePath != "") {
+                        that.uploadFiles.push({
+                            name: that.Decrease.filePath,
+                            url: 'C:\\Server\\File\\OA2023\\Office\\GrpFile\\',
+                        })
+                    }
+
+                }
+
+            })
+        },
+
+        //点击保存事件
+        addBtn() {
+            const that = this;
+            that.$refs.DecreasePaymentsData.validate((valid) => {
+                if (valid) {
+                    debugger
+                    if (that.projectName == "") {
+                        that.$axios({
+                            method: 'post',
+                            url: "/api/Groups/DelFile",
+                            headers: {
+                                Authorization: 'Bearer ' + that.token
+                            },
+                            data: {
+                                fileName: that.DelfileName,
+                                id: that.id
+                            }
+                        }).then(function (res) {
+                            if (res.data.code == 200) {
+
+                            }
+                        })
+
+                        this.DecreasePaymentsData.filePath = ""
+                        that.DecreasePaymentsData.diId = that.DiIdSelect;
+                        that.DecreasePaymentsData.createUserId = that.userId;
+                        var url = "/api/Groups/OpDecreasePayments"
+                        that.$axios({
+                            method: 'post',
+                            url: url,
+                            headers: {
+                                Authorization: 'Bearer ' + that.token
+                            },
+                            data: that.DecreasePaymentsData
+                        }).then(function (res) {
+                            if (res.data.code == 200) {
+                                that.$message({
+                                    message: res.data.msg,
+                                    type: 'success'
+                                });
+                                that.loading = true;
+                                setTimeout(() => {
+                                    that.$router.push('/home/DecreasePayments')
+                                }, 3000);
+                            } else {
+                                that.$message.error(res.data.msg);
+                            }
+                        })
+                    } else {
+                        that.$refs.upload.submit();//上传文件到服务器
+                    }
+                } else {
+                    this.$message.error('请完善信息在保存!');
+                    return false;
+                }
+            })
+            // 此时必填完成,做保存后的业务操作
+        },
+        DecreasePaymentsChange() {
+            for (let index = 0; index < this.delegationInfoList.length; index++) {
+                if (this.delegationInfoList[index].id == parseInt(this.DiIdSelect)) {
+                    this.delegationInfo = this.delegationInfoList[index];
+                    break;
+                }
+            }
+        },
+
+        //上传
+        // 文件超出限制
+        exceed(files, fileList) {
+            this.$message.warning(
+                `当前限制选择 1个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length
+                } 个文件,请取消要替换的文件`
+            );
+        },
+        //文件上传
+        // submitUpload() {
+
+        // },
+        //文件上传成功时的钩子
+        upLoadSuccess(response, file, fileList) {
+            if (response.code == 200) {
+                var that = this;
+                that.$axios({
+                    method: 'post',
+                    url: "/api/Groups/DelFile",
+                    headers: {
+                        Authorization: 'Bearer ' + that.token
+                    },
+                    data: {
+                        fileName: that.DelfileName,
+                        id: that.id
+                    }
+                }).then(function (res) {
+                    if (res.data.code == 200) {
+
+                    }
+                })
+
+                this.DecreasePaymentsData.filePath = response.data
+                that.DecreasePaymentsData.diId = that.DiIdSelect;
+                that.DecreasePaymentsData.createUserId = that.userId;
+                var url = "/api/Groups/OpDecreasePayments"
+                that.$axios({
+                    method: 'post',
+                    url: url,
+                    headers: {
+                        Authorization: 'Bearer ' + that.token
+                    },
+                    data: that.DecreasePaymentsData
+                }).then(function (res) {
+                    if (res.data.code == 200) {
+                        that.$message({
+                            message: res.data.msg,
+                            type: 'success'
+                        });
+                        that.loading = true;
+                        setTimeout(() => {
+                            that.$router.push('/home/DecreasePayments')
+                        }, 3000);
+                    } else {
+                        that.$message.error(res.data.msg);
+                    }
+                })
+                console.log("上传成功");
+            } else {
+                console.log("保存失败");
+            }
+
+        },
+        //文件上传失败时的钩子
+        upLoadError(response, file, fileList) {
+            console.log("项目添加失败");
+        },
+        beforeRemove(file, fileList) {
+            console.log(file.name)
+            let id1 = this.uploadFiles.findIndex(item => {
+                if (item.name == file.name) {
+                    return true
+                }
+            })
+            this.uploadFiles.splice(id1, 1)
+            this.projectName = ""
+            this.DelfileName = file.name
+        },
+        onChange(file, fileList) {
+            this.projectName = file.name
+        }
+
+    },
+
+    mounted() {
+
+        this.token = JSON.parse(localStorage.getItem('userinif')).token;
+        this.userId = JSON.parse(localStorage.getItem('userinif')).userInfo.userId
+        this.AirTicketResSelect();
+        this.id = this.$route.query.id
+        if (this.id != null && this.id != undefined && this.id != 0) {
+            this.QueryDecreasePaymentsById();
+            this.title = "修改团组增减款项费用";
+            this.DecreasePaymentsData.status = 2
+            this.isShow = true
+        } else {
+            this.DecreasePaymentsData.status = 1
+            this.title = "新增团组增减款项费用"
+            this.isShow = false
+        }
+        this.DiId = this.$route.query.DiId
+    }
+}
+</script>
+<style>
+.communal-list {
+    background-color: #fff;
+    padding: 10px;
+    box-shadow: 0 0 5px #0005;
+    border-radius: 10px;
+}
+
+.car_add .communal-title {
+    display: flex;
+    font-size: 17px;
+    font-weight: 600;
+    color: #555;
+    margin-bottom: 20px;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.appraise-box {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    margin: 50px 0;
+}
+
+.appraise-box>div {
+    width: 30%;
+}
+
+.communal-box {
+    display: flex;
+}
+
+.communal-box>button {
+    margin-left: 10px;
+    padding: 8px 20px;
+}
+
+.car_add {
+    background-color: #fff;
+    padding: 20px;
+    box-shadow: 0 0 5px #0005;
+    border-radius: 10px;
+}
+
+@media screen and (max-width: 1700px) {
+    .appraise-box>div {
+        width: 48%;
+    }
+
+    .appraise-box>div el-form-item__content {
+        width: 260px !important;
+    }
+}
+</style>

+ 18 - 3
src/main.js

@@ -8,15 +8,30 @@ import 'element-ui/lib/theme-chalk/index.css';
 import './assets/icon/iconfont.css'
 import store from './store/index.js';
 import VueTypedJs from 'vue-typed-js'
+//富文本
+import VueQuillEditor from 'vue-quill-editor'
+import 'quill/dist/quill.core.css'
+import 'quill/dist/quill.snow.css'
+import 'quill/dist/quill.bubble.css'
+  Vue.use(VueQuillEditor);
+// import CKEditor from '@ckeditor/ckeditor5-vue2'
+// Vue.use( CKEditor );
+
 Vue.use(VueTypedJs)
 import axios from 'axios';
 axios.defaults.baseURL = 'http://132.232.92.186:8888';
-//  axios.defaults.baseURL = 'http://localhost:5256/';
+//axios.defaults.baseURL = 'http://localhost:5256/';
 import { Message } from "element-ui";
-import common from './assets/js/common'
-Vue.use(common);
+
+import common from './assets/js/common'//全局
+Vue.use(common);//全局
+
+import plugin from './plugin'//全局
+Vue.use(plugin);//全局
+
 Vue.prototype.$message = Message
 Vue.prototype.$axios = axios;
+;
 
 Vue.config.productionTip = false
 Vue.use(ElementUI);

+ 13 - 0
src/plugin.js

@@ -0,0 +1,13 @@
+exports.install = function (Vue, options) {
+    Vue.prototype.test = function (){
+        console.log('test');
+        // this.$confirm('此操作将删除该数据, 是否继续?', '提示', {
+        //     confirmButtonText: '确定',
+        //     cancelButtonText: '取消',
+        //     type: 'warning'
+        // }).then(() => {})
+    };
+    Vue.prototype.goback = function (){//返回上一页
+        window.history.back();
+    };
+};

+ 18 - 0
src/router/index.js

@@ -54,6 +54,9 @@ import FeesPage from '@/components/Finance/FeesPage';
 import AirTicketAgent from '@/components/Resource/AirTicketAgent';
 import AirTicketRes from '@/components/OP/AirTicketRes';
 import OpAirTicketRes from '@/components/OP/OpAirTicketRes';
+import DecreasePayments from '@/components/OP/DecreasePayments';
+import OpDecreasePayments from '@/components/OP/OpDecreasePayments';
+import Richtext from '@/components/GPT/Richtext';
 
 Vue.use(Router)
 
@@ -312,6 +315,21 @@ export default new Router({
           name: 'OpAirTicketRes',
           component: OpAirTicketRes
         },
+        {
+          path: '/home/DecreasePayments',
+          name: 'DecreasePayments',
+          component: DecreasePayments
+        },
+        {
+          path: '/home/OpDecreasePayments',
+          name: 'OpDecreasePayments',
+          component: OpDecreasePayments
+        },
+        {
+          path: '/home/Richtext',
+          name: 'Richtext',
+          component: Richtext
+        }
       ]
     },
     {