diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 42afa3c6..463e9f15 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -43,8 +43,10 @@ "@vueuse/core": "catalog:", "ant-design-vue": "catalog:", "dayjs": "catalog:", + "highlight.js": "catalog:", "pinia": "catalog:", "vue": "catalog:", + "vue-dompurify-html": "catalog:", "vue-router": "catalog:" } } diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts index 963d1c7f..a465d47b 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-antd/src/bootstrap.ts @@ -1,4 +1,5 @@ import { createApp, watchEffect } from 'vue'; +import VueDomPurifyHTML from 'vue-dompurify-html'; import { registerAccessDirective } from '@vben/access'; import { preferences } from '@vben/preferences'; @@ -32,6 +33,9 @@ async function bootstrap(namespace: string) { // 配置路由及路由守卫 app.use(router); + // 安装 vue-dompurify-html 插件 + app.use(VueDomPurifyHTML); + // 动态更新标题 watchEffect(() => { if (preferences.app.dynamicTitle) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ecc4016..cbc70f5c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,6 +279,9 @@ catalogs: happy-dom: specifier: ^15.11.6 version: 15.11.6 + highlight.js: + specifier: ^11.10.0 + version: 11.10.0 html-minifier-terser: specifier: ^7.2.0 version: 7.2.0 @@ -465,6 +468,9 @@ catalogs: vitest: specifier: ^2.1.6 version: 2.1.6 + vue-dompurify-html: + specifier: ^5.2.0 + version: 5.2.0 vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3 @@ -676,12 +682,18 @@ importers: dayjs: specifier: 'catalog:' version: 1.11.13 + highlight.js: + specifier: 'catalog:' + version: 11.10.0 pinia: specifier: 2.2.2 version: 2.2.2(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) + vue-dompurify-html: + specifier: 'catalog:' + version: 5.2.0(vue@3.5.13(typescript@5.7.2)) vue-router: specifier: 'catalog:' version: 4.5.0(vue@3.5.13(typescript@5.7.2)) @@ -3645,16 +3657,16 @@ packages: resolution: {integrity: sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==} engines: {node: '>= 16'} - '@intlify/message-compiler@11.0.0-beta.1': - resolution: {integrity: sha512-yMXfN4hg/EeSdtWfmoMrwB9X4TXwkBoZlTIpNydQaW9y0tSJHGnUPRoahtkbsyACCm9leSJINLY4jQ0rK6BK0Q==} + '@intlify/message-compiler@11.0.0-beta.2': + resolution: {integrity: sha512-/cJHP1n45Zlf9tbm/hudLrUwXzJZngR9OMTQk32H1S4lBjM2996wzKTHuLbaJJlJZNTTjnfWZUHPb+F6sE6p1Q==} engines: {node: '>= 16'} '@intlify/shared@10.0.4': resolution: {integrity: sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==} engines: {node: '>= 16'} - '@intlify/shared@11.0.0-beta.1': - resolution: {integrity: sha512-Md/4T/QOx7wZ7zqVzSsMx2M/9Mx/1nsgsjXS5SFIowFKydqUhMz7K+y7pMFh781aNYz+rGXYwad8E9/+InK9SA==} + '@intlify/shared@11.0.0-beta.2': + resolution: {integrity: sha512-N6ngJfFaVA0l2iLtx/SymgHOBW4wiS5Pyue7YmY/G+mrGjesi+S+U+u/Xlv6pZa/YIBfeM4QB07lI7rz1YqKLg==} engines: {node: '>= 16'} '@intlify/unplugin-vue-i18n@6.0.0': @@ -5774,6 +5786,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + dompurify@3.2.1: + resolution: {integrity: sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==} + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -9992,6 +10007,11 @@ packages: '@vue/composition-api': optional: true + vue-dompurify-html@5.2.0: + resolution: {integrity: sha512-GX+BStkKEJ8wu/+hU1EK2nu/gzXWhb4XzBu6aowpsuU/3nkvXvZ2jx4nZ9M3jtS/Vu7J7MtFXjc7x3cWQ+zbVQ==} + peerDependencies: + vue: ^3.5.13 + vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -12262,8 +12282,8 @@ snapshots: '@intlify/bundle-utils@10.0.0(vue-i18n@10.0.4(vue@3.5.13(typescript@5.7.2)))': dependencies: - '@intlify/message-compiler': 11.0.0-beta.1 - '@intlify/shared': 11.0.0-beta.1 + '@intlify/message-compiler': 11.0.0-beta.2 + '@intlify/shared': 11.0.0-beta.2 acorn: 8.14.0 escodegen: 2.1.0 estree-walker: 2.0.2 @@ -12284,14 +12304,14 @@ snapshots: '@intlify/shared': 10.0.4 source-map-js: 1.2.1 - '@intlify/message-compiler@11.0.0-beta.1': + '@intlify/message-compiler@11.0.0-beta.2': dependencies: - '@intlify/shared': 11.0.0-beta.1 + '@intlify/shared': 11.0.0-beta.2 source-map-js: 1.2.1 '@intlify/shared@10.0.4': {} - '@intlify/shared@11.0.0-beta.1': {} + '@intlify/shared@11.0.0-beta.2': {} '@intlify/unplugin-vue-i18n@6.0.0(@vue/compiler-dom@3.5.13)(eslint@9.15.0(jiti@2.4.0))(rollup@4.27.4)(typescript@5.7.2)(vue-i18n@10.0.4(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2))': dependencies: @@ -14825,6 +14845,10 @@ snapshots: dependencies: domelementtype: 2.3.0 + dompurify@3.2.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 @@ -19485,6 +19509,11 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.7.2) + vue-dompurify-html@5.2.0(vue@3.5.13(typescript@5.7.2)): + dependencies: + dompurify: 3.2.1 + vue: 3.5.13(typescript@5.7.2) + vue-eslint-parser@9.4.3(eslint@9.15.0(jiti@2.4.0)): dependencies: debug: 4.3.7(supports-color@9.4.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 87eef147..cd2e04fc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -108,6 +108,7 @@ catalog: globals: ^15.12.0 h3: ^1.13.0 happy-dom: ^15.11.6 + highlight.js: ^11.10.0 html-minifier-terser: ^7.2.0 husky: ^9.1.7 is-ci: ^3.0.1 @@ -172,6 +173,7 @@ catalog: vitepress-plugin-group-icons: ^1.3.0 vitest: ^2.1.6 vue: ^3.5.13 + vue-dompurify-html: ^5.2.0 vue-eslint-parser: ^9.4.3 vue-i18n: ^10.0.4 vue-router: ^4.5.0