From 9f7763afd9984f987a1d466b237d27ac1ded2aad Mon Sep 17 00:00:00 2001 From: BTMuli Date: Sun, 18 Jan 2026 01:05:17 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=88=90=E5=B0=B1=E6=8E=92=E5=BA=8F&=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/userAchi/tua-achi-list.vue | 16 +++++---- src/plugins/Sqlite/modules/userAchi.ts | 41 ++++++++++++++++------- src/utils/TGGame.ts | 3 +- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/components/userAchi/tua-achi-list.vue b/src/components/userAchi/tua-achi-list.vue index 487db8e3..d8c9b002 100644 --- a/src/components/userAchi/tua-achi-list.vue +++ b/src/components/userAchi/tua-achi-list.vue @@ -36,7 +36,7 @@ import TopNameCard from "@comp/app/top-nameCard.vue"; import showSnackbar from "@comp/func/snackbar.js"; import VpOverlaySearch from "@comp/viewPost/vp-overlay-search.vue"; import TSUserAchi from "@Sqlm/userAchi.js"; -import { computed, onMounted, ref, shallowRef, watch } from "vue"; +import { computed, nextTick, onMounted, ref, shallowRef, watch } from "vue"; import TuaAchiOverlay from "./tua-achi-overlay.vue"; import TuaAchi from "./tua-achi.vue"; @@ -51,7 +51,7 @@ type TuaAchiListProps = { isSearch: boolean; }; type TuaAchiListEmits = { - (e: "update:series", v: number | undefined): void; + (e: "update:series", v: number): void; (e: "update:isSearch", v: boolean): false; }; @@ -93,17 +93,21 @@ async function searchAchi(): Promise { } nameCard.value = undefined; ncData.value = undefined; - achievements.value = await TSUserAchi.searchAchi(props.uid, props.search); + const searchRes = await TSUserAchi.searchAchi(props.uid, props.search); if (showOverlay.value) showOverlay.value = false; - if (achievements.value.length > 0) { + if (searchRes.length > 0) { + achievements.value = searchRes; showSnackbar.success(`成功获取${achievements.value.length}条成就`); - emits("update:series", undefined); + emits("update:series", -1); + await nextTick(); + } else { + showSnackbar.warn("未搜索到相关成就"); } emits("update:isSearch", false); } async function loadAchi(): Promise { - if (props.isSearch || props.series === undefined) return; + if (props.isSearch) return; achievements.value = await TSUserAchi.getAchievements(props.uid, props.series); const ov = await TSUserAchi.getOverview(props.uid, props.series); isFinish.value = ov.fin === ov.total; diff --git a/src/plugins/Sqlite/modules/userAchi.ts b/src/plugins/Sqlite/modules/userAchi.ts index 9bc8d991..108dd33a 100644 --- a/src/plugins/Sqlite/modules/userAchi.ts +++ b/src/plugins/Sqlite/modules/userAchi.ts @@ -123,6 +123,27 @@ async function getAchi( return res[0]; } +/** + * 对混合系列成就数据进行排序 + * @since Beta v0.9.2 + * @param data - 成旧数据 + * @returns 排序后的成就数据 + */ +function sortMixAchi( + data: Array, +): Array { + return data.sort((a, b) => { + if (a.isCompleted !== b.isCompleted) return Number(a.isCompleted) - Number(b.isCompleted); + if (!a.isCompleted) { + if (a.version !== b.version) return Number(b.version) - Number(a.version); + return a.order - b.order; + } + if (b.completedTime !== a.completedTime) return b.completedTime.localeCompare(a.completedTime); + if (a.version !== b.version) return Number(b.version) - Number(a.version); + return b.order - a.order; + }); +} + /** * 获取成就数据 * @since Beta v0.9.2 @@ -135,7 +156,7 @@ async function getAchievements( series?: number, ): Promise> { const db = await TGSqlite.getDB(); - const res: Array = []; + let res: Array = []; const userData = await db.select>( "SELECT * FROM Achievements WHERE uid = ?;", [uid], @@ -148,13 +169,11 @@ async function getAchievements( const achievement = getRenderAchi(achi, uid, achiFind); res.push(achievement); } - res.sort( - (a, b) => - Number(a.isCompleted) - Number(b.isCompleted) || - b.version.localeCompare(a.version) || - b.series - a.series || - b.order - a.order, - ); + if (series && series !== -1) { + res.sort((a, b) => Number(a.isCompleted) - Number(b.isCompleted) || a.order - b.order); + } else { + res = sortMixAchi(res); + } return res; } @@ -177,7 +196,7 @@ async function searchAchi( const versionReg = /^v\d+(\.\d+)?$/; const idReg = /^i\d+$/; let rawData: Array; - const res: Array = []; + let res: Array = []; if (versionReg.test(keyword)) { const version = keyword.replace("v", ""); rawData = AppAchievementsData.filter((i) => i.version.includes(version)); @@ -197,9 +216,7 @@ async function searchAchi( else achievement = getRenderAchi(data, uid, achiFind); res.push(achievement); } - res.sort( - (a, b) => a.isCompleted.toString().localeCompare(b.isCompleted.toString()) || a.order - b.order, - ); + res = sortMixAchi(res); return res; } diff --git a/src/utils/TGGame.ts b/src/utils/TGGame.ts index 0e6a835f..4d3173d5 100644 --- a/src/utils/TGGame.ts +++ b/src/utils/TGGame.ts @@ -78,7 +78,8 @@ export async function tryCopyYae(): Promise { await copyFile(srcDllPath, targetPath); const check2 = await exists(targetPath); if (!check2) { - showSnackbar.warn("移动 dll 失败"); + showSnackbar.warn("移动 dll 失败,请手动移动"); + // TODO: 跳转手动移动说明站点 return false; } return true;