From 9492585fc228881c2f099762e2dc05f09d2c4729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=B0=8F=E5=95=8A=E7=99=BD?= <2053890199@qq.com> Date: Tue, 18 Nov 2025 09:42:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9B=86=E6=88=90vant=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=BA=93=E5=B9=B6=E6=9B=BF=E6=8D=A2=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89message=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加vant依赖及unplugin-vue-components插件 - 移除自定义message组件及相关逻辑 - 使用vant的Dialog组件替代原有message功能 - 更新相关页面调用方式 --- components.d.ts | 22 ++++ package.json | 2 + pnpm-lock.yaml | 193 +++++++++++++++++++++++++++++++++ src/components/Message.vue | 213 ------------------------------------- src/components/message.ts | 176 ------------------------------ src/pages/home/index.vue | 63 +++++++---- vite.config.ts | 6 +- 7 files changed, 265 insertions(+), 410 deletions(-) create mode 100644 components.d.ts delete mode 100644 src/components/Message.vue delete mode 100644 src/components/message.ts diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..1202f55 --- /dev/null +++ b/components.d.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +// @ts-nocheck +// biome-ignore lint: disable +// oxlint-disable +// ------ +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 + +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ImageViewer: typeof import('./src/components/ImageViewer.vue')['default'] + Loading: typeof import('./src/components/Loading.vue')['default'] + Message: typeof import('./src/components/Message.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + VanButton: typeof import('vant/es')['Button'] + VanDialog: typeof import('vant/es')['Dialog'] + } +} diff --git a/package.json b/package.json index 507f108..160d9a2 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dayjs": "^1.11.19", "qrcode.vue": "^3.6.0", "tailwindcss": "^4.1.17", + "vant": "^4.9.21", "vue": "^3.5.24", "vue-router": "^4.6.3" }, @@ -22,6 +23,7 @@ "@vitejs/plugin-vue": "^6.0.1", "@vue/tsconfig": "^0.8.1", "typescript": "~5.9.3", + "unplugin-vue-components": "^30.0.0", "vite": "^7.2.2", "vue-tsc": "^3.1.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 084c574..a901b7a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: tailwindcss: specifier: ^4.1.17 version: 4.1.17 + vant: + specifier: ^4.9.21 + version: 4.9.21(vue@3.5.24(typescript@5.9.3)) vue: specifier: ^3.5.24 version: 3.5.24(typescript@5.9.3) @@ -42,6 +45,9 @@ importers: typescript: specifier: ~5.9.3 version: 5.9.3 + unplugin-vue-components: + specifier: ^30.0.0 + version: 30.0.0(@babel/parser@7.28.5)(vue@3.5.24(typescript@5.9.3)) vite: specifier: ^7.2.2 version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2) @@ -449,6 +455,14 @@ packages: '@types/node@24.10.1': resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@vant/popperjs@1.3.0': + resolution: {integrity: sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==} + + '@vant/use@1.6.0': + resolution: {integrity: sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==} + peerDependencies: + vue: ^3.0.0 + '@vitejs/plugin-vue@6.0.1': resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -516,6 +530,11 @@ packages: vue: optional: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + alien-signals@3.1.0: resolution: {integrity: sha512-yufC6VpSy8tK3I0lO67pjumo5JvDQVQyr38+3OHqe6CHl1t2VZekKZ7EKKZSqk0cRmE7U7tfZbpXiKNzuc+ckg==} @@ -529,16 +548,35 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -583,6 +621,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -714,6 +755,10 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -729,6 +774,12 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -740,6 +791,9 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -747,6 +801,12 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -759,6 +819,13 @@ packages: peerDependencies: vue: ^3.0.0 + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + rollup@4.53.2: resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -784,9 +851,38 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin-vue-components@30.0.0: + resolution: {integrity: sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + + vant@4.9.21: + resolution: {integrity: sha512-hXUoZMrLLjykimFRLDlGNd+K2iYSRh9YwLMKnsVdVZ+9inUKxpqnjhOqlZwocbnYkvJlS+febf9u9aJpDol4Pw==} + peerDependencies: + vue: ^3.0.0 + vite@7.2.2: resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -849,6 +945,9 @@ packages: typescript: optional: true + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + snapshots: '@babel/helper-string-parser@7.27.1': {} @@ -1103,6 +1202,12 @@ snapshots: dependencies: undici-types: 7.16.0 + '@vant/popperjs@1.3.0': {} + + '@vant/use@1.6.0(vue@3.5.24(typescript@5.9.3))': + dependencies: + vue: 3.5.24(typescript@5.9.3) + '@vitejs/plugin-vue@6.0.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.24(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 @@ -1194,6 +1299,8 @@ snapshots: typescript: 5.9.3 vue: 3.5.24(typescript@5.9.3) + acorn@8.15.0: {} + alien-signals@3.1.0: {} asynckit@0.4.0: {} @@ -1211,14 +1318,26 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 + confbox@0.1.8: {} + + confbox@0.2.2: {} + csstype@3.1.3: {} dayjs@1.11.19: {} + debug@4.4.3: + dependencies: + ms: 2.1.3 + delayed-stream@1.0.0: {} detect-libc@2.1.2: {} @@ -1282,6 +1401,8 @@ snapshots: estree-walker@2.0.2: {} + exsolve@1.0.8: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -1384,6 +1505,12 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -1396,16 +1523,39 @@ snapshots: dependencies: mime-db: 1.52.0 + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + ms@2.1.3: {} + muggle-string@0.4.1: {} nanoid@3.3.11: {} path-browserify@1.0.1: {} + pathe@2.0.3: {} + picocolors@1.1.1: {} picomatch@4.0.3: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -1418,6 +1568,10 @@ snapshots: dependencies: vue: 3.5.24(typescript@5.9.3) + quansync@0.2.11: {} + + readdirp@4.1.2: {} + rollup@4.53.2: dependencies: '@types/estree': 1.0.8 @@ -1459,8 +1613,45 @@ snapshots: typescript@5.9.3: {} + ufo@1.6.1: {} + undici-types@7.16.0: {} + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-components@30.0.0(@babel/parser@7.28.5)(vue@3.5.24(typescript@5.9.3)): + dependencies: + chokidar: 4.0.3 + debug: 4.4.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.1 + vue: 3.5.24(typescript@5.9.3) + optionalDependencies: + '@babel/parser': 7.28.5 + transitivePeerDependencies: + - supports-color + + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + vant@4.9.21(vue@3.5.24(typescript@5.9.3)): + dependencies: + '@vant/popperjs': 1.3.0 + '@vant/use': 1.6.0(vue@3.5.24(typescript@5.9.3)) + '@vue/shared': 3.5.24 + vue: 3.5.24(typescript@5.9.3) + vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.25.12 @@ -1497,3 +1688,5 @@ snapshots: '@vue/shared': 3.5.24 optionalDependencies: typescript: 5.9.3 + + webpack-virtual-modules@0.6.2: {} diff --git a/src/components/Message.vue b/src/components/Message.vue deleted file mode 100644 index c8b5e60..0000000 --- a/src/components/Message.vue +++ /dev/null @@ -1,213 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/message.ts b/src/components/message.ts deleted file mode 100644 index 3b0cfe3..0000000 --- a/src/components/message.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { createApp, h } from 'vue' -import Message from './Message.vue' - -// 消息配置接口 -export interface MessageOptions { - message: string - type?: 'success' | 'error' | 'warning' | 'info' - duration?: number - showIcon?: boolean - closable?: boolean - customClass?: string - offset?: number - center?: boolean - onClose?: () => void -} - -// 消息实例接口 -interface MessageInstance { - close: () => void -} - -// 消息容器 -const messageContainer = document.createElement('div') -messageContainer.className = 'message-container-wrapper' -document.body.appendChild(messageContainer) - -// 默认配置 -const defaultOptions: Partial = { - duration: 3000, - showIcon: true, - closable: false, - offset: 20, - center: false -} - -// 消息管理类 -class MessageService { - private instances: MessageInstance[] = [] - - // 创建消息实例 - private createMessage(options: string | MessageOptions): MessageInstance { - // 标准化配置 - const finalOptions = typeof options === 'string' - ? { message: options, ...defaultOptions } - : { ...defaultOptions, ...options } - - // 创建容器元素 - const container = document.createElement('div') - messageContainer.appendChild(container) - - // 创建应用实例 - // 保存对this的引用以避免上下文问题 - const self = this - const app = createApp({ - render: () => { - return h(Message, { - ...finalOptions, - onClose: () => { - self.closeInstance(instance) - finalOptions.onClose?.() - } - }) - } - }) - - // 挂载组件 - app.mount(container) - - // 计算垂直偏移 - const verticalOffset = this.calculateOffset(finalOptions.offset ?? 0) - container.style.cssText = ` - position: fixed; - top: ${verticalOffset}px; - left: 50%; - transform: translateX(-50%); - z-index: 9999; - ` - - // 创建实例对象 - const instance: MessageInstance = { - close: () => { - this.closeInstance(instance) - } - } - - // 保存实例 - this.instances.push(instance) - - return instance - } - - // 计算垂直偏移 - private calculateOffset(baseOffset: number): number { - if (this.instances.length === 0) { - return baseOffset - } - - let offset = baseOffset - this.instances.forEach(() => { - // 假设每个消息高度约为60px,间距为12px - offset += 60 + 12 - }) - - return offset - } - - // 关闭指定实例 - private closeInstance(instance: MessageInstance): void { - const index = this.instances.indexOf(instance) - if (index !== -1) { - this.instances.splice(index, 1) - - // 重新计算所有消息的位置 - this.updateOffsets() - } - } - - // 更新所有消息的位置 - private updateOffsets(): void { - let offset = defaultOptions.offset || 20 - const messageElements = messageContainer.querySelectorAll('div > div') - - messageElements.forEach((element, index) => { - if (index < this.instances.length) { - (element.parentElement as HTMLElement).style.top = `${offset}px` - offset += 60 + 12 - } - }) - } - - // 显示普通消息 - info(options: string | MessageOptions): MessageInstance { - return this.createMessage(typeof options === 'string' - ? { message: options, type: 'info' } - : { ...options, type: 'info' } - ) - } - - // 显示成功消息 - success(options: string | MessageOptions): MessageInstance { - return this.createMessage(typeof options === 'string' - ? { message: options, type: 'success' } - : { ...options, type: 'success' } - ) - } - - // 显示错误消息 - error(options: string | MessageOptions): MessageInstance { - return this.createMessage(typeof options === 'string' - ? { message: options, type: 'error' } - : { ...options, type: 'error' } - ) - } - - // 显示警告消息 - warning(options: string | MessageOptions): MessageInstance { - return this.createMessage(typeof options === 'string' - ? { message: options, type: 'warning' } - : { ...options, type: 'warning' } - ) - } - - // 关闭所有消息 - closeAll(): void { - this.instances.forEach(instance => { - instance.close() - }) - this.instances = [] - } -} - -// 导出消息服务实例 -export const message = new MessageService() - -// 提供默认导出 -export default message \ No newline at end of file diff --git a/src/pages/home/index.vue b/src/pages/home/index.vue index 917c94f..b8eda37 100644 --- a/src/pages/home/index.vue +++ b/src/pages/home/index.vue @@ -35,7 +35,7 @@ @@ -45,7 +45,7 @@ @@ -87,7 +87,7 @@ @@ -133,12 +133,13 @@