From ddb1c367b5f5d83479c5cbbc88c7b22a27c3d09e Mon Sep 17 00:00:00 2001 From: WangLeo <690854599@qq.com> Date: Fri, 20 Mar 2026 18:57:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 1 + src/components/Popover/index.vue | 213 ++++++++++++++++++ src/components/Select/index.vue | 90 ++++++-- .../dialogBox/imageUploader/index.vue | 7 +- src/components/dialogBox/index.vue | 19 +- src/components/dialogBox/model/index.vue | 174 +++++--------- src/components/dialogBox/proportion/index.vue | 7 +- src/components/dialogBox/quantity/index.vue | 96 ++++---- src/views/home/index.vue | 5 +- 9 files changed, 416 insertions(+), 196 deletions(-) create mode 100644 src/components/Popover/index.vue diff --git a/components.d.ts b/components.d.ts index 8fdf315..5aa1fbb 100644 --- a/components.d.ts +++ b/components.d.ts @@ -26,6 +26,7 @@ declare module 'vue' { ImageUploader: typeof import('./src/components/dialogBox/imageUploader/index.vue')['default'] Img: typeof import('./src/components/Img/index.vue')['default'] Model: typeof import('./src/components/dialogBox/model/index.vue')['default'] + Popover: typeof import('./src/components/Popover/index.vue')['default'] Proportion: typeof import('./src/components/dialogBox/proportion/index.vue')['default'] Quantity: typeof import('./src/components/dialogBox/quantity/index.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/src/components/Popover/index.vue b/src/components/Popover/index.vue new file mode 100644 index 0000000..9b53d34 --- /dev/null +++ b/src/components/Popover/index.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/components/Select/index.vue b/src/components/Select/index.vue index 2d53a00..022e468 100644 --- a/src/components/Select/index.vue +++ b/src/components/Select/index.vue @@ -9,7 +9,6 @@ > {{ selectedOption || placeholder }} -
- @@ -53,6 +77,10 @@ const props = defineProps({ type: Array, default: () => [] }, + groupedOptions: { + type: Array, + default: () => [] + }, placeholder: { type: String, default: '请选择' @@ -96,7 +124,13 @@ const headerWidth = computed(() => { }) const selectedOption = computed(() => { - const option = props.options.find((opt) => opt.value === selectedValue.value) + let option = props.options.find((opt) => opt.value === selectedValue.value) + if (!option && props.groupedOptions.length > 0) { + for (const group of props.groupedOptions) { + option = group.options.find((opt) => opt.value === selectedValue.value) + if (option) break + } + } return option ? option.label : '' }) @@ -108,6 +142,9 @@ const toggleDropdown = async () => { if (window.__currentOpenSelectId__ && window.__currentOpenSelectId__ !== selectId.value) { window.dispatchEvent(new CustomEvent('close-other-selects', { detail: { excludeId: selectId.value } })) } + if (window.__currentOpenPopoverId__) { + window.dispatchEvent(new CustomEvent('close-other-popovers', { detail: { excludeId: null } })) + } isOpen.value = true window.__currentOpenSelectId__ = selectId.value await nextTick() @@ -141,12 +178,19 @@ const handleCloseOtherSelects = (e) => { } } +const handleCloseOtherPopovers = () => { + isOpen.value = false + window.__currentOpenSelectId__ = null +} + document.addEventListener('click', handleClickOutside) window.addEventListener('close-other-selects', handleCloseOtherSelects) +window.addEventListener('close-other-popovers', handleCloseOtherPopovers) onBeforeUnmount(() => { document.removeEventListener('click', handleClickOutside) window.removeEventListener('close-other-selects', handleCloseOtherSelects) + window.removeEventListener('close-other-popovers', handleCloseOtherPopovers) }) @@ -317,4 +361,20 @@ onBeforeUnmount(() => { transform: scale(1); } } + +.option-group { + margin-bottom: 10px; + + &:last-child { + margin-bottom: 0; + } +} + +.group-title { + font-size: 12px; + font-weight: 600; + color: #666; + padding: 5px 20px 8px; + margin-bottom: 4px; +} diff --git a/src/components/dialogBox/imageUploader/index.vue b/src/components/dialogBox/imageUploader/index.vue index e4d674a..01cf740 100644 --- a/src/components/dialogBox/imageUploader/index.vue +++ b/src/components/dialogBox/imageUploader/index.vue @@ -14,7 +14,7 @@
- + 参考内容
@@ -219,7 +219,8 @@ defineExpose({ width: 56px; height: 56px; // border: 2px dashed #d1d5db; - background-color: #F8F9FA; + background: rgba(0, 15, 51, 0.04); + backdrop-filter: blur(5px); border-radius: 8px; display: flex; align-items: center; @@ -231,7 +232,7 @@ defineExpose({ transition: all 0.3s ease; span { - color: #999; + color: #333; font-family: "Microsoft YaHei"; font-size: 12px; font-style: normal; diff --git a/src/components/dialogBox/index.vue b/src/components/dialogBox/index.vue index 0550c3c..b07ddeb 100644 --- a/src/components/dialogBox/index.vue +++ b/src/components/dialogBox/index.vue @@ -1,7 +1,8 @@