From a094901b7292f7d23933fee5423a88d8253b2d55 Mon Sep 17 00:00:00 2001 From: yml Date: Tue, 2 Jun 2026 08:49:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0awm=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/mobile/MobileHomeView.vue | 8 + frontend/src/views/public/HomeView.vue | 161 +++++++++++++++---- frontend/src/views/public/ListingsView.vue | 8 + 3 files changed, 145 insertions(+), 32 deletions(-) diff --git a/frontend/src/views/mobile/MobileHomeView.vue b/frontend/src/views/mobile/MobileHomeView.vue index 5729bf2..a3036f5 100644 --- a/frontend/src/views/mobile/MobileHomeView.vue +++ b/frontend/src/views/mobile/MobileHomeView.vue @@ -59,6 +59,7 @@ const supportLoading = ref(false); const sortOptions = [ { key: "comprehensive", label: "综合排序" }, { key: "published", label: "发布时间" }, + { key: "awmDesc", label: "AWM数量" }, { key: "priceAsc", label: "价格最低" }, { key: "priceDesc", label: "价格最高" }, ]; @@ -251,6 +252,13 @@ function sortListings(items: Listing[]) { (a, b) => getListingDisplayPrice(b) - getListingDisplayPrice(a) ); } + if (activeSort.value === "awmDesc") { + return sorted.sort( + (a, b) => + getResourceQuantity(b, "awmAmmo") - getResourceQuantity(a, "awmAmmo") || + getCoinWan(b) - getCoinWan(a) + ); + } return sorted.sort((a, b) => { const bTime = Date.parse(b.published_at || b.created_at || "") || 0; const aTime = Date.parse(a.published_at || a.created_at || "") || 0; diff --git a/frontend/src/views/public/HomeView.vue b/frontend/src/views/public/HomeView.vue index 9fb74c5..a95e7d9 100644 --- a/frontend/src/views/public/HomeView.vue +++ b/frontend/src/views/public/HomeView.vue @@ -69,6 +69,35 @@ const filters = reactive({ }); const sortBy = ref("recommended"); const activeZone = ref("all"); +type FilterPopoverKey = + | "insurance" + | "stamina" + | "load" + | "region" + | "coin" + | "price" + | "deposit" + | "total" + | "skin" + | "rank" + | "fireLevel" + | "loginMethod"; +type StringFilterKey = + | "insurance" + | "stamina" + | "load" + | "region" + | "rank" + | "loginMethod"; +const activeFilterPopover = ref(""); +const filterPopoverBaseProps = { + placement: "bottom-start", + popperClass: "home-filter-popover", + trigger: "click", + showAfter: 0, + hideAfter: 0, + transition: "none", +} as const; const coinRangeOptions = [ { label: "全部区间", min: undefined, max: undefined }, @@ -189,6 +218,12 @@ const visibleListings = computed(() => { if (sortBy.value === "coinDesc") { return getCoinWan(b) - getCoinWan(a); } + if (sortBy.value === "awmDesc") { + return ( + getResourceQuantity(b, "awmAmmo") - getResourceQuantity(a, "awmAmmo") || + getCoinWan(b) - getCoinWan(a) + ); + } const bTime = Date.parse(b.published_at || b.created_at || "") || 0; const aTime = Date.parse(a.published_at || a.created_at || "") || 0; return getCoinWan(b) - getCoinWan(a) || bTime - aTime; @@ -293,6 +328,7 @@ function resetFilters() { filters.maxFireLevel = undefined; activeZone.value = "all"; sortBy.value = "recommended"; + closeFilterPopover(); } function setActiveZone(zoneKey: string) { @@ -344,16 +380,76 @@ function setFireLevelRange(min: number | undefined, max: number | undefined) { filters.maxFireLevel = max; } +function setFilterPopover(key: FilterPopoverKey, visible: boolean) { + if (visible) { + activeFilterPopover.value = key; + return; + } + if (activeFilterPopover.value === key) activeFilterPopover.value = ""; +} + +function filterPopoverProps(key: FilterPopoverKey) { + return { + ...filterPopoverBaseProps, + visible: activeFilterPopover.value === key, + "onUpdate:visible": (visible: boolean) => setFilterPopover(key, visible), + }; +} + +function closeFilterPopover() { + activeFilterPopover.value = ""; +} + +function setStringFilter(key: StringFilterKey, value: string) { + filters[key] = value; + closeFilterPopover(); +} + +function setCoinRangeAndClose(min: number | undefined, max: number | undefined) { + setCoinRange(min, max); + closeFilterPopover(); +} + +function setPriceRangeAndClose(min: number | undefined, max: number | undefined) { + setPriceRange(min, max); + closeFilterPopover(); +} + +function setDepositRangeAndClose(min: number | undefined, max: number | undefined) { + setDepositRange(min, max); + closeFilterPopover(); +} + +function setTotalRangeAndClose(min: number | undefined, max: number | undefined) { + setTotalRange(min, max); + closeFilterPopover(); +} + +function setFireLevelRangeAndClose(min: number | undefined, max: number | undefined) { + setFireLevelRange(min, max); + closeFilterPopover(); +} + function setSkinFilter(groupKey: string, skinName = "") { filters.skinGroup = groupKey; filters.skinName = skinName; } +function setSkinFilterAndClose(groupKey: string, skinName = "") { + setSkinFilter(groupKey, skinName); + closeFilterPopover(); +} + function resetSkinFilter() { filters.skinGroup = ""; filters.skinName = ""; } +function resetSkinFilterAndClose() { + resetSkinFilter(); + closeFilterPopover(); +} + function matchesZone(item: Listing, zoneKey: string) { if (zoneKey === "all") return true; if (zoneKey === "sale") return hasAcceleratedSaleRatio(item); @@ -456,7 +552,7 @@ function timeRangeCoversHour(start: number, end: number, hour: number) {
- +
- +
- +
- +
- +
- +
- +
- +
- +