mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-18 10:18:14 +08:00
@@ -21,7 +21,7 @@
|
|||||||
<v-list-item
|
<v-list-item
|
||||||
v-for="account in gameAccounts"
|
v-for="account in gameAccounts"
|
||||||
:key="account.gameUid"
|
:key="account.gameUid"
|
||||||
@click="switchGameAccount(account)"
|
@click="useUserStore().switchGameAccount(account.gameUid)"
|
||||||
>
|
>
|
||||||
<v-list-item-title>{{ account.nickname }}</v-list-item-title>
|
<v-list-item-title>{{ account.nickname }}</v-list-item-title>
|
||||||
<v-list-item-subtitle>
|
<v-list-item-subtitle>
|
||||||
@@ -406,23 +406,15 @@ async function showMenu(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function showAccounts(): Promise<void> {
|
async function showAccounts(): Promise<void> {
|
||||||
if (!userStore.uid.value) return;
|
if (!userStore.uid.value) {
|
||||||
|
showSnackbar({ text: "未登录!", color: "error" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
gameAccounts.value = await TSUserAccount.game.getAccount(userStore.uid.value);
|
gameAccounts.value = await TSUserAccount.game.getAccount(userStore.uid.value);
|
||||||
}
|
if (gameAccounts.value.length === 0) {
|
||||||
|
showSnackbar({ text: "未找到账户的游戏数据,请尝试刷新!", color: "warn" });
|
||||||
async function switchGameAccount(account: TGApp.Sqlite.Account.Game): Promise<void> {
|
|
||||||
if (account.gameUid === userStore.account.value.gameUid) {
|
|
||||||
showSnackbar({ text: "已经登录,无需切换!", color: "warn" });
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TSUserAccount.game.switchAccount(account.uid, account.gameUid);
|
|
||||||
const gameAccount = await TSUserAccount.game.getCurAccount(account.uid);
|
|
||||||
if (!gameAccount) {
|
|
||||||
showSnackbar({ text: `无法获取${account.uid}的游戏信息`, color: "warn" });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
userStore.account.value = gameAccount;
|
|
||||||
showSnackbar({ text: "成功切换游戏账户!", color: "success" });
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="css" scoped>
|
<style lang="css" scoped>
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ import { nextTick, onMounted, reactive, ref, watch, useTemplateRef } from "vue";
|
|||||||
interface ConfirmProps {
|
interface ConfirmProps {
|
||||||
title: string;
|
title: string;
|
||||||
text?: string;
|
text?: string;
|
||||||
mode: "confirm" | "input";
|
mode?: "confirm" | "input";
|
||||||
otcancel?: boolean;
|
otcancel?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="tua-abl-mid">
|
<div class="tua-abl-mid">
|
||||||
<div class="tua-abl-bg">
|
<div class="tua-abl-bg">
|
||||||
<img v-if="nameCard !== false && isFetterMax" :src="nameCard" alt="nameCard" />
|
<img v-if="isFetterMax" :src="nameCard" alt="nameCard" />
|
||||||
</div>
|
</div>
|
||||||
<div class="tua-abl-skills">
|
<div class="tua-abl-skills">
|
||||||
<div v-for="skill in skills" :key="skill.skill_id" class="tua-abl-skill">
|
<div v-for="skill in skills" :key="skill.skill_id" class="tua-abl-skill">
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, onMounted, ref } from "vue";
|
import { computed } from "vue";
|
||||||
|
|
||||||
import TSUserAvatar from "../../plugins/Sqlite/modules/userAvatar.js";
|
import TSUserAvatar from "../../plugins/Sqlite/modules/userAvatar.js";
|
||||||
import { useUserStore } from "../../store/modules/user.js";
|
import { useUserStore } from "../../store/modules/user.js";
|
||||||
@@ -118,12 +118,9 @@ const skills = computed<TGApp.Game.Avatar.Skill[]>(() => {
|
|||||||
return props.modelValue.skills.filter((skill) => skill.skill_type === 1);
|
return props.modelValue.skills.filter((skill) => skill.skill_type === 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
const nameCard = ref<string | false>(false);
|
const nameCard = computed<string>(() => {
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
if (!props.modelValue) return;
|
|
||||||
const cardFind = TSUserAvatar.getAvatarCard(props.modelValue.avatar.id);
|
const cardFind = TSUserAvatar.getAvatarCard(props.modelValue.avatar.id);
|
||||||
nameCard.value = `/source/nameCard/profile/${cardFind}.webp`;
|
return `/source/nameCard/profile/${cardFind}.webp`;
|
||||||
});
|
});
|
||||||
|
|
||||||
function getWeaponTitle(): string {
|
function getWeaponTitle(): string {
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
<span>第</span>
|
<span>第</span>
|
||||||
<span>{{ item.id }}</span>
|
<span>{{ item.id }}</span>
|
||||||
<span>期 UID</span>
|
<span>期 UID</span>
|
||||||
<span>{{ user.gameUid }}</span>
|
<span>{{ uidCur }}</span>
|
||||||
<span>更新于</span>
|
<span>更新于</span>
|
||||||
<span>{{ item.updated }}</span>
|
<span>{{ item.updated }}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -116,7 +116,7 @@ const loadingSub = ref<string>();
|
|||||||
|
|
||||||
// data
|
// data
|
||||||
const userTab = ref<number>(0);
|
const userTab = ref<number>(0);
|
||||||
const user = ref<TGApp.Sqlite.Account.Game>(userStore.account.value);
|
const user = computed<TGApp.Sqlite.Account.Game>(() => userStore.account.value);
|
||||||
|
|
||||||
const localAbyss = ref<TGApp.Sqlite.Abyss.SingleTable[]>([]);
|
const localAbyss = ref<TGApp.Sqlite.Abyss.SingleTable[]>([]);
|
||||||
const abyssRef = ref<HTMLElement>(<HTMLElement>{});
|
const abyssRef = ref<HTMLElement>(<HTMLElement>{});
|
||||||
@@ -152,17 +152,23 @@ async function loadAbyss(): Promise<void> {
|
|||||||
|
|
||||||
async function refreshAbyss(): Promise<void> {
|
async function refreshAbyss(): Promise<void> {
|
||||||
if (!userStore.cookie.value) {
|
if (!userStore.cookie.value) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "未登录", color: "error" });
|
||||||
text: "未登录",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Warn("[UserAbyss][getAbyssData] 未登录");
|
await TGLogger.Warn("[UserAbyss][getAbyssData] 未登录");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (uidCur.value && uidCur.value !== user.value.gameUid) {
|
if (uidCur.value && uidCur.value !== user.value.gameUid) {
|
||||||
|
const confirmSwitch = await showConfirm({
|
||||||
|
title: "是否切换游戏账户",
|
||||||
|
text: `确认则尝试切换至 ${uidCur.value}`,
|
||||||
|
});
|
||||||
|
if (confirmSwitch) {
|
||||||
|
await useUserStore().switchGameAccount(uidCur.value);
|
||||||
|
await refreshAbyss();
|
||||||
|
return;
|
||||||
|
}
|
||||||
const confirm = await showConfirm({
|
const confirm = await showConfirm({
|
||||||
title: "确定刷新?",
|
title: "确定刷新?",
|
||||||
text: `用户UID-${user.value.gameUid}与当前深渊UID-${uidCur.value}不一致`,
|
text: `用户${user.value.gameUid}与当前UID${uidCur.value}不一致`,
|
||||||
});
|
});
|
||||||
if (!confirm) {
|
if (!confirm) {
|
||||||
showSnackbar({ text: "已取消深渊数据刷新", color: "cancel" });
|
showSnackbar({ text: "已取消深渊数据刷新", color: "cancel" });
|
||||||
@@ -228,19 +234,13 @@ async function uploadAbyss(): Promise<void> {
|
|||||||
await TGLogger.Info("[UserAbyss][uploadAbyss] 上传深渊数据");
|
await TGLogger.Info("[UserAbyss][uploadAbyss] 上传深渊数据");
|
||||||
const abyssData = localAbyss.value.find((item) => item.id === Math.max(...abyssIdList.value));
|
const abyssData = localAbyss.value.find((item) => item.id === Math.max(...abyssIdList.value));
|
||||||
if (!abyssData) {
|
if (!abyssData) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "未找到深渊数据", color: "error" });
|
||||||
text: "未找到深渊数据",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Warn("[UserAbyss][uploadAbyss] 未找到深渊数据");
|
await TGLogger.Warn("[UserAbyss][uploadAbyss] 未找到深渊数据");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const maxFloor = Number(abyssData.maxFloor.split("-")[0]);
|
const maxFloor = Number(abyssData.maxFloor.split("-")[0]);
|
||||||
if (isNaN(maxFloor) || maxFloor <= 9) {
|
if (isNaN(maxFloor) || maxFloor <= 9) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "尚未完成深渊,请完成深渊后重试!", color: "error" });
|
||||||
text: "尚未完成深渊,请完成深渊后重试!",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Warn(`[UserAbyss][uploadAbyss] 尚未完成深渊 ${abyssData.maxFloor}`);
|
await TGLogger.Warn(`[UserAbyss][uploadAbyss] 尚未完成深渊 ${abyssData.maxFloor}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -248,10 +248,7 @@ async function uploadAbyss(): Promise<void> {
|
|||||||
const endTime = new Date(abyssData.endTime).getTime();
|
const endTime = new Date(abyssData.endTime).getTime();
|
||||||
const nowTime = new Date().getTime();
|
const nowTime = new Date().getTime();
|
||||||
if (nowTime < startTime || nowTime > endTime) {
|
if (nowTime < startTime || nowTime > endTime) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "非最新深渊数据,请刷新深渊数据后重试!", color: "error" });
|
||||||
text: "非最新深渊数据,请刷新深渊数据后重试!",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Warn("[UserAbyss][uploadAbyss] 非最新深渊数据");
|
await TGLogger.Warn("[UserAbyss][uploadAbyss] 非最新深渊数据");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -274,19 +271,13 @@ async function uploadAbyss(): Promise<void> {
|
|||||||
showSnackbar({ text: res.message ?? "上传深渊数据成功" });
|
showSnackbar({ text: res.message ?? "上传深渊数据成功" });
|
||||||
await TGLogger.Info("[UserAbyss][uploadAbyss] 上传深渊数据成功");
|
await TGLogger.Info("[UserAbyss][uploadAbyss] 上传深渊数据成功");
|
||||||
} else {
|
} else {
|
||||||
showSnackbar({
|
showSnackbar({ text: `[${res.retcode}]${res.message}`, color: "error" });
|
||||||
text: `[${res.retcode}]${res.message}`,
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Error("[UserAbyss][uploadAbyss] 上传深渊数据失败");
|
await TGLogger.Error("[UserAbyss][uploadAbyss] 上传深渊数据失败");
|
||||||
await TGLogger.Error(`[UserAbyss][uploadAbyss] ${res.retcode} ${res.message}`);
|
await TGLogger.Error(`[UserAbyss][uploadAbyss] ${res.retcode} ${res.message}`);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof Error) {
|
if (e instanceof Error) {
|
||||||
showSnackbar({
|
showSnackbar({ text: e.message, color: "error" });
|
||||||
text: e.message,
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Error("[UserAbyss][uploadAbyss] 上传深渊数据失败");
|
await TGLogger.Error("[UserAbyss][uploadAbyss] 上传深渊数据失败");
|
||||||
await TGLogger.Error(`[UserAbyss][uploadAbyss] ${e.message}`);
|
await TGLogger.Error(`[UserAbyss][uploadAbyss] ${e.message}`);
|
||||||
}
|
}
|
||||||
@@ -301,7 +292,7 @@ async function deleteAbyss(): Promise<void> {
|
|||||||
}
|
}
|
||||||
const confirm = await showConfirm({
|
const confirm = await showConfirm({
|
||||||
title: "确定删除数据?",
|
title: "确定删除数据?",
|
||||||
text: `将清除 ${uidCur.value} 的所有深渊数据`,
|
text: `将清除${uidCur.value}的所有深渊数据`,
|
||||||
});
|
});
|
||||||
if (!confirm) {
|
if (!confirm) {
|
||||||
showSnackbar({ text: "已取消删除", color: "cancel" });
|
showSnackbar({ text: "已取消删除", color: "cancel" });
|
||||||
@@ -312,7 +303,7 @@ async function deleteAbyss(): Promise<void> {
|
|||||||
await TSUserAbyss.delAbyss(uidCur.value);
|
await TSUserAbyss.delAbyss(uidCur.value);
|
||||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
showSnackbar({ text: `已清除 ${uidCur.value} 的深渊数据,即将刷新`, color: "success" });
|
showSnackbar({ text: `已清除 ${uidCur.value} 的深渊数据`, color: "success" });
|
||||||
uidList.value = await TSUserAbyss.getAllUid();
|
uidList.value = await TSUserAbyss.getAllUid();
|
||||||
if (uidList.value.length > 0) uidCur.value = uidList.value[0];
|
if (uidList.value.length > 0) uidCur.value = uidList.value[0];
|
||||||
else uidCur.value = undefined;
|
else uidCur.value = undefined;
|
||||||
|
|||||||
@@ -1,36 +1,49 @@
|
|||||||
<template>
|
<template>
|
||||||
<ToLoading v-model="loading" :title="loadingTitle" :subtitle="loadingSub" />
|
<ToLoading v-model="loading" :title="loadingTitle" :subtitle="loadingSub" />
|
||||||
<v-app-bar>
|
<v-app-bar>
|
||||||
<template #title>
|
<template #prepend>
|
||||||
<span v-if="user"> {{ user.nickname }}({{ user.gameUid }})</span>
|
<div class="uc-top-title">
|
||||||
<span v-else> 暂无数据 </span>
|
<img alt="icon" src="/source/UI/userAvatar.webp" />
|
||||||
|
<span>原神战绩</span>
|
||||||
|
<v-btn variant="outlined" @click="showSelect = true">筛选角色</v-btn>
|
||||||
|
<v-btn variant="outlined" @click="resetSelect = true">重置筛选</v-btn>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #append>
|
<template #append>
|
||||||
<div class="uc-top-btns">
|
<div class="uc-top-btns">
|
||||||
<v-btn @click="refresh()" :rounded="true" variant="outlined" v-model:loading="loadData">
|
<v-btn
|
||||||
<template #prepend>
|
prepend-icon="mdi-refresh"
|
||||||
<v-icon>mdi-refresh</v-icon>
|
@click="refresh()"
|
||||||
</template>
|
:rounded="true"
|
||||||
|
variant="outlined"
|
||||||
|
v-model:loading="loadData"
|
||||||
|
>
|
||||||
刷新
|
刷新
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn
|
<v-btn
|
||||||
|
prepend-icon="mdi-share"
|
||||||
:disabled="enableShare"
|
:disabled="enableShare"
|
||||||
@click="share()"
|
@click="share()"
|
||||||
:rounded="true"
|
:rounded="true"
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
v-model:loading="loadShare"
|
v-model:loading="loadShare"
|
||||||
>
|
>
|
||||||
<template #prepend>
|
|
||||||
<v-icon>mdi-share</v-icon>
|
|
||||||
</template>
|
|
||||||
分享
|
分享
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
<v-btn
|
||||||
|
prepend-icon="mdi-delete"
|
||||||
|
@click="deleteUid()"
|
||||||
|
:rounded="true"
|
||||||
|
variant="outlined"
|
||||||
|
:disabled="uidCur === undefined"
|
||||||
|
v-model:loading="loadDel"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</v-btn>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #extension>
|
<template #extension>
|
||||||
<div class="uc-select">
|
<div class="uc-select">
|
||||||
<v-btn variant="outlined" @click="showSelect = true">筛选角色</v-btn>
|
|
||||||
<v-btn variant="outlined" @click="resetSelect = true">重置筛选</v-btn>
|
|
||||||
<v-select
|
<v-select
|
||||||
v-model="showMode"
|
v-model="showMode"
|
||||||
:items="modeList"
|
:items="modeList"
|
||||||
@@ -39,7 +52,16 @@
|
|||||||
item-title="label"
|
item-title="label"
|
||||||
item-value="value"
|
item-value="value"
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
class="uc-select-mode"
|
class="uc-select-btn"
|
||||||
|
density="compact"
|
||||||
|
/>
|
||||||
|
<v-select
|
||||||
|
v-model="uidCur"
|
||||||
|
:items="uidList"
|
||||||
|
label="当前UID"
|
||||||
|
:hide-details="true"
|
||||||
|
variant="outlined"
|
||||||
|
class="uc-select-btn"
|
||||||
density="compact"
|
density="compact"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -48,11 +70,10 @@
|
|||||||
<div class="uc-box">
|
<div class="uc-box">
|
||||||
<div class="uc-top">
|
<div class="uc-top">
|
||||||
<div class="uc-top-title">
|
<div class="uc-top-title">
|
||||||
<span v-if="user">
|
<span v-if="uidCur">UID:{{ uidCur }} 更新于 {{ getUpdateTime() }}</span>
|
||||||
{{ user.nickname }} UID:{{ user.gameUid }} 更新于 {{ getUpdateTime() }}
|
|
||||||
</span>
|
|
||||||
<span v-else> 暂无数据 </span>
|
<span v-else> 暂无数据 </span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="uc-top-info">Render by TeyvatGuide v{{ version }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="uc-grid" v-if="!isEmpty">
|
<div class="uc-grid" v-if="!isEmpty">
|
||||||
<TuaAvatarBox
|
<TuaAvatarBox
|
||||||
@@ -66,7 +87,7 @@
|
|||||||
<img src="/source/UI/empty.webp" alt="empty" />
|
<img src="/source/UI/empty.webp" alt="empty" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<suspense>
|
<suspense v-if="dataVal">
|
||||||
<TuaDetailOverlay
|
<TuaDetailOverlay
|
||||||
v-model="showOverlay"
|
v-model="showOverlay"
|
||||||
:avatar="dataVal"
|
:avatar="dataVal"
|
||||||
@@ -79,9 +100,11 @@
|
|||||||
<TwoSelectC v-model="showSelect" @select-c="handleSelect" v-model:reset="resetSelect" />
|
<TwoSelectC v-model="showSelect" @select-c="handleSelect" v-model:reset="resetSelect" />
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { getVersion } from "@tauri-apps/api/app";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { onBeforeMount, onMounted, ref, watch, computed } from "vue";
|
import { onMounted, ref, watch, computed } from "vue";
|
||||||
|
|
||||||
|
import showConfirm from "../../components/func/confirm.js";
|
||||||
import showSnackbar from "../../components/func/snackbar.js";
|
import showSnackbar from "../../components/func/snackbar.js";
|
||||||
import ToLoading from "../../components/overlay/to-loading.vue";
|
import ToLoading from "../../components/overlay/to-loading.vue";
|
||||||
import TuaAvatarBox from "../../components/userAvatar/tua-avatar-box.vue";
|
import TuaAvatarBox from "../../components/userAvatar/tua-avatar-box.vue";
|
||||||
@@ -92,18 +115,21 @@ import TSUserAvatar from "../../plugins/Sqlite/modules/userAvatar.js";
|
|||||||
import { useUserStore } from "../../store/modules/user.js";
|
import { useUserStore } from "../../store/modules/user.js";
|
||||||
import TGLogger from "../../utils/TGLogger.js";
|
import TGLogger from "../../utils/TGLogger.js";
|
||||||
import { generateShareImg } from "../../utils/TGShare.js";
|
import { generateShareImg } from "../../utils/TGShare.js";
|
||||||
|
import { timestampToDate } from "../../utils/toolFunc.js";
|
||||||
import TGRequest from "../../web/request/TGRequest.js";
|
import TGRequest from "../../web/request/TGRequest.js";
|
||||||
|
|
||||||
// store
|
// store
|
||||||
const userStore = storeToRefs(useUserStore());
|
const userStore = storeToRefs(useUserStore());
|
||||||
const user = ref<TGApp.Sqlite.Account.Game>();
|
const user = computed<TGApp.Sqlite.Account.Game>(() => userStore.account.value);
|
||||||
|
|
||||||
// loading
|
// loading
|
||||||
const loading = ref<boolean>(false);
|
const loading = ref<boolean>(false);
|
||||||
const loadData = ref<boolean>(false);
|
const loadData = ref<boolean>(false);
|
||||||
const loadShare = ref<boolean>(false);
|
const loadShare = ref<boolean>(false);
|
||||||
|
const loadDel = ref<boolean>(false);
|
||||||
const loadingTitle = ref<string>();
|
const loadingTitle = ref<string>();
|
||||||
const loadingSub = ref<string>();
|
const loadingSub = ref<string>();
|
||||||
|
const version = ref<string>();
|
||||||
|
|
||||||
// data
|
// data
|
||||||
const isEmpty = ref<boolean>(true);
|
const isEmpty = ref<boolean>(true);
|
||||||
@@ -111,7 +137,7 @@ const roleList = ref<TGApp.Sqlite.Character.UserRole[]>([]);
|
|||||||
const selectedList = ref<TGApp.Sqlite.Character.UserRole[]>([]);
|
const selectedList = ref<TGApp.Sqlite.Character.UserRole[]>([]);
|
||||||
|
|
||||||
// overlay
|
// overlay
|
||||||
const dataVal = ref<TGApp.Sqlite.Character.UserRole>(<TGApp.Sqlite.Character.UserRole>{});
|
const dataVal = ref<TGApp.Sqlite.Character.UserRole>();
|
||||||
const showOverlay = ref<boolean>(false);
|
const showOverlay = ref<boolean>(false);
|
||||||
const selectIndex = ref<number>(0);
|
const selectIndex = ref<number>(0);
|
||||||
|
|
||||||
@@ -129,52 +155,54 @@ const enableShare = computed<boolean>(() => {
|
|||||||
return showSelect.value;
|
return showSelect.value;
|
||||||
});
|
});
|
||||||
|
|
||||||
onBeforeMount(() => {
|
const uidCur = ref<string>();
|
||||||
if (userStore.account.value) user.value = userStore.account.value;
|
const uidList = ref<string[]>([]);
|
||||||
});
|
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await TGLogger.Info("[Character][onMounted] 进入角色页面");
|
await TGLogger.Info("[Character][onMounted] 进入角色页面");
|
||||||
loadingTitle.value = "正在获取角色数据";
|
loadingTitle.value = "正在获取角色数据";
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
loadData.value = true;
|
version.value = await getVersion();
|
||||||
await load();
|
await loadUid();
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
loadData.value = false;
|
loadData.value = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(resetSelect, (val) => {
|
watch(
|
||||||
if (val) {
|
() => resetSelect.value,
|
||||||
selectedList.value = getOrderedList(roleList.value);
|
(val) => {
|
||||||
showSnackbar({
|
if (val) {
|
||||||
text: "已重置筛选条件",
|
selectedList.value = getOrderedList(roleList.value);
|
||||||
color: "success",
|
showSnackbar({ text: "已重置筛选条件", color: "success" });
|
||||||
});
|
if (!dataVal.value) return;
|
||||||
selectIndex.value = selectedList.value.indexOf(dataVal.value);
|
selectIndex.value = selectedList.value.indexOf(dataVal.value);
|
||||||
if (selectIndex.value === -1) {
|
if (selectIndex.value === -1) {
|
||||||
dataVal.value = selectedList.value[0];
|
dataVal.value = selectedList.value[0];
|
||||||
selectIndex.value = 0;
|
selectIndex.value = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
});
|
);
|
||||||
watch(showMode, (val) => {
|
watch(
|
||||||
if (val === "classic") {
|
() => showMode.value,
|
||||||
showSnackbar({
|
(val) => {
|
||||||
text: "已切换至经典视图",
|
switch (val) {
|
||||||
color: "success",
|
case "classic":
|
||||||
});
|
showSnackbar({ text: "已切换至经典视图", color: "success" });
|
||||||
} else if (val === "card") {
|
break;
|
||||||
showSnackbar({
|
case "card":
|
||||||
text: "已切换至卡片视图(简略)",
|
showSnackbar({ text: "已切换至卡片视图(简略)", color: "success" });
|
||||||
color: "success",
|
break;
|
||||||
});
|
case "dev":
|
||||||
} else {
|
showSnackbar({ text: "已切换至卡片视图(详细)", color: "success" });
|
||||||
showSnackbar({
|
break;
|
||||||
text: "已切换至卡片视图(详细)",
|
}
|
||||||
color: "success",
|
},
|
||||||
});
|
);
|
||||||
}
|
watch(
|
||||||
});
|
() => uidCur.value,
|
||||||
|
async () => await loadRole(),
|
||||||
|
);
|
||||||
|
|
||||||
function getOrderedList(
|
function getOrderedList(
|
||||||
data: TGApp.Sqlite.Character.UserRole[],
|
data: TGApp.Sqlite.Character.UserRole[],
|
||||||
@@ -188,21 +216,30 @@ function getOrderedList(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function load(): Promise<void> {
|
async function loadUid(): Promise<void> {
|
||||||
if (!user.value) return;
|
uidList.value = await TSUserAvatar.getAllUid();
|
||||||
const roleData = await TSUserAvatar.getAvatars(user.value.gameUid);
|
if (uidList.value.length === 0) uidList.value = [user.value.gameUid];
|
||||||
|
if (uidList.value.includes(user.value.gameUid)) {
|
||||||
|
uidCur.value = user.value.gameUid;
|
||||||
|
} else {
|
||||||
|
uidCur.value = uidList.value[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadRole(): Promise<void> {
|
||||||
|
if (!uidCur.value) {
|
||||||
|
isEmpty.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
roleList.value = [];
|
||||||
|
const roleData = await TSUserAvatar.getAvatars(uidCur.value);
|
||||||
roleList.value = getOrderedList(roleData);
|
roleList.value = getOrderedList(roleData);
|
||||||
selectedList.value = roleList.value;
|
selectedList.value = roleList.value;
|
||||||
dataVal.value = roleData[selectIndex.value];
|
dataVal.value = roleData[selectIndex.value];
|
||||||
isEmpty.value = false;
|
isEmpty.value = roleList.value.length === 0;
|
||||||
await TGLogger.Info(`[Character][loadRole][${user.value.gameUid}] 成功加载角色数据`);
|
await TGLogger.Info(`[Character][loadRole][${uidCur.value}] 成功加载角色数据`);
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(`[Character][loadRole][${uidCur.value}] 共获取到${roleData.length}个角色`);
|
||||||
`[Character][loadRole][${user.value.gameUid}] 共获取到${roleData.length}个角色`,
|
showSnackbar({ text: `成功加载${roleData.length}个角色`, color: "success" });
|
||||||
);
|
|
||||||
showSnackbar({
|
|
||||||
text: `成功加载${roleData.length}个角色`,
|
|
||||||
color: "success",
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function refresh(): Promise<void> {
|
async function refresh(): Promise<void> {
|
||||||
@@ -215,15 +252,31 @@ async function refresh(): Promise<void> {
|
|||||||
showOverlay.value = false;
|
showOverlay.value = false;
|
||||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||||
}
|
}
|
||||||
|
if (uidCur.value && uidCur.value !== user.value.gameUid) {
|
||||||
|
const switchConfirm = await showConfirm({
|
||||||
|
title: "是否切换游戏账户",
|
||||||
|
text: `确认则尝试切换至${uidCur.value}`,
|
||||||
|
});
|
||||||
|
if (switchConfirm) {
|
||||||
|
await useUserStore().switchGameAccount(uidCur.value);
|
||||||
|
await refresh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const confirm = await showConfirm({
|
||||||
|
title: "确定刷新?",
|
||||||
|
text: `用户${user.value.gameUid}与当前UID${uidCur.value}不一致`,
|
||||||
|
});
|
||||||
|
if (!confirm) {
|
||||||
|
showSnackbar({ text: "已取消角色数据刷新", color: "cancel" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
await TGLogger.Info(`[Character][refreshRoles][${user.value.gameUid}] 正在更新角色数据`);
|
await TGLogger.Info(`[Character][refreshRoles][${user.value.gameUid}] 正在更新角色数据`);
|
||||||
loadingTitle.value = "正在获取角色列表";
|
loadingTitle.value = "正在获取角色列表";
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
loadData.value = true;
|
loadData.value = true;
|
||||||
if (!userStore.cookie.value) {
|
if (!userStore.cookie.value) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "请先登录", color: "error" });
|
||||||
text: "请先登录",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
loadData.value = false;
|
loadData.value = false;
|
||||||
return;
|
return;
|
||||||
@@ -234,10 +287,7 @@ async function refresh(): Promise<void> {
|
|||||||
};
|
};
|
||||||
const listRes = await TGRequest.User.byCookie.getAvatarList(cookie, user.value.gameUid);
|
const listRes = await TGRequest.User.byCookie.getAvatarList(cookie, user.value.gameUid);
|
||||||
if (!Array.isArray(listRes)) {
|
if (!Array.isArray(listRes)) {
|
||||||
showSnackbar({
|
showSnackbar({ text: `[${listRes.retcode}] ${listRes.message}`, color: "error" });
|
||||||
text: `[${listRes.retcode}] ${listRes.message}`,
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Error(`[Character][refreshRoles][${user.value.gameUid}] 获取角色列表失败`);
|
await TGLogger.Error(`[Character][refreshRoles][${user.value.gameUid}] 获取角色列表失败`);
|
||||||
await TGLogger.Error(
|
await TGLogger.Error(
|
||||||
`[Character][refreshRoles][${user.value.gameUid}] ${listRes.retcode} ${listRes.message}`,
|
`[Character][refreshRoles][${user.value.gameUid}] ${listRes.retcode} ${listRes.message}`,
|
||||||
@@ -251,10 +301,7 @@ async function refresh(): Promise<void> {
|
|||||||
loadingSub.value = `共${idList.length}个角色`;
|
loadingSub.value = `共${idList.length}个角色`;
|
||||||
const res = await TGRequest.User.byCookie.getAvatarDetail(cookie, user.value.gameUid, idList);
|
const res = await TGRequest.User.byCookie.getAvatarDetail(cookie, user.value.gameUid, idList);
|
||||||
if ("retcode" in res) {
|
if ("retcode" in res) {
|
||||||
showSnackbar({
|
showSnackbar({ text: `[${res.retcode}] ${res.message}`, color: "error" });
|
||||||
text: `[${res.retcode}] ${res.message}`,
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
await TGLogger.Error(`[Character][refreshRoles][${user.value.gameUid}] 获取角色数据失败`);
|
await TGLogger.Error(`[Character][refreshRoles][${user.value.gameUid}] 获取角色数据失败`);
|
||||||
await TGLogger.Error(
|
await TGLogger.Error(
|
||||||
`[Character][refreshRoles][${user.value.gameUid}] ${res.retcode} ${res.message}`,
|
`[Character][refreshRoles][${user.value.gameUid}] ${res.retcode} ${res.message}`,
|
||||||
@@ -270,17 +317,14 @@ async function refresh(): Promise<void> {
|
|||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
`[Character][refreshRoles][${user.value.gameUid}] 共更新${res.list.length}个角色`,
|
`[Character][refreshRoles][${user.value.gameUid}] 共更新${res.list.length}个角色`,
|
||||||
);
|
);
|
||||||
await load();
|
await loadRole();
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
loadData.value = false;
|
loadData.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function share(): Promise<void> {
|
async function share(): Promise<void> {
|
||||||
if (!user.value || isEmpty.value) {
|
if (!user.value || isEmpty.value) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "暂无数据", color: "error" });
|
||||||
text: "暂无数据",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TGLogger.Info(`[Character][shareRoles][${user.value.gameUid}] 正在生成分享图片`);
|
await TGLogger.Info(`[Character][shareRoles][${user.value.gameUid}] 正在生成分享图片`);
|
||||||
@@ -297,7 +341,26 @@ async function share(): Promise<void> {
|
|||||||
await TGLogger.Info(`[Character][shareRoles][${user.value.gameUid}] 生成分享图片成功`);
|
await TGLogger.Info(`[Character][shareRoles][${user.value.gameUid}] 生成分享图片成功`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function deleteUid(): Promise<void> {
|
||||||
|
if (!uidCur.value) {
|
||||||
|
showSnackbar({ text: "未找到当前UID", color: "error" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const confirm = await showConfirm({
|
||||||
|
title: "确定删除?",
|
||||||
|
text: `将删除${uidCur.value}对应的角色数据`,
|
||||||
|
});
|
||||||
|
if (!confirm) {
|
||||||
|
showSnackbar({ text: "已取消删除", color: "cancel" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await TSUserAvatar.deleteUid(uidCur.value);
|
||||||
|
showSnackbar({ text: `成功删除${uidCur.value}的角色数据` });
|
||||||
|
await loadUid();
|
||||||
|
}
|
||||||
|
|
||||||
function getUpdateTime(): string {
|
function getUpdateTime(): string {
|
||||||
|
if (roleList.value.length === 0) return "";
|
||||||
let lastUpdateTime = 0;
|
let lastUpdateTime = 0;
|
||||||
roleList.value.forEach((role) => {
|
roleList.value.forEach((role) => {
|
||||||
const updateTime = new Date(role.updated).getTime();
|
const updateTime = new Date(role.updated).getTime();
|
||||||
@@ -305,7 +368,7 @@ function getUpdateTime(): string {
|
|||||||
lastUpdateTime = updateTime;
|
lastUpdateTime = updateTime;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return new Date(lastUpdateTime).toLocaleString().replace(/\//g, "-");
|
return timestampToDate(lastUpdateTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectRole(role: TGApp.Sqlite.Character.UserRole): void {
|
function selectRole(role: TGApp.Sqlite.Character.UserRole): void {
|
||||||
@@ -326,18 +389,13 @@ function handleSelect(val: SelectedCValue) {
|
|||||||
return val.area.includes(avatar.area);
|
return val.area.includes(avatar.area);
|
||||||
});
|
});
|
||||||
if (filterC.length === 0) {
|
if (filterC.length === 0) {
|
||||||
showSnackbar({
|
showSnackbar({ text: "未找到符合条件的角色", color: "warn" });
|
||||||
text: "未找到符合条件的角色",
|
|
||||||
color: "warn",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showSnackbar({
|
showSnackbar({ text: `筛选出符合条件的角色 ${filterC.length} 个`, color: "success" });
|
||||||
text: `筛选出符合条件的角色 ${filterC.length} 个`,
|
|
||||||
color: "success",
|
|
||||||
});
|
|
||||||
const selectedId = filterC.map((item) => item.id);
|
const selectedId = filterC.map((item) => item.id);
|
||||||
selectedList.value = roleList.value.filter((role) => selectedId.includes(role.cid));
|
selectedList.value = roleList.value.filter((role) => selectedId.includes(role.cid));
|
||||||
|
if (!dataVal.value) return;
|
||||||
if (!selectedList.value.includes(dataVal.value)) {
|
if (!selectedList.value.includes(dataVal.value)) {
|
||||||
dataVal.value = selectedList.value[0];
|
dataVal.value = selectedList.value[0];
|
||||||
selectIndex.value = 0;
|
selectIndex.value = 0;
|
||||||
@@ -366,7 +424,8 @@ function handleSwitch(next: boolean): void {
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.uc-select-mode {
|
.uc-select-btn {
|
||||||
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
@@ -396,9 +455,28 @@ function handleSwitch(next: boolean): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.uc-top-title {
|
.uc-top-title {
|
||||||
color: var(--common-text-title);
|
display: flex;
|
||||||
font-family: var(--font-title);
|
align-items: center;
|
||||||
font-size: 20px;
|
justify-content: center;
|
||||||
|
padding: 10px;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: var(--common-text-title);
|
||||||
|
font-family: var(--font-title);
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.uc-top-info {
|
||||||
|
z-index: -1;
|
||||||
|
font-size: 14px;
|
||||||
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.uc-top-btns {
|
.uc-top-btns {
|
||||||
|
|||||||
@@ -1,24 +1,27 @@
|
|||||||
<template>
|
<template>
|
||||||
<ToLoading v-model="loading" :title="loadingTitle" :subtitle="loadingSub" />
|
<ToLoading v-model="loading" :title="loadingTitle" :subtitle="loadingSub" />
|
||||||
<div class="gacha-top-bar">
|
<div class="gacha-top-bar">
|
||||||
<div class="gacha-top-title">祈愿记录</div>
|
<div class="gacha-top-title">
|
||||||
|
<img src="/source/UI/userGacha.webp" alt="gacha" />
|
||||||
|
<span>祈愿记录</span>
|
||||||
|
</div>
|
||||||
<v-select v-model="uidCur" class="gacha-top-select" :items="selectItem" variant="outlined" />
|
<v-select v-model="uidCur" class="gacha-top-select" :items="selectItem" variant="outlined" />
|
||||||
<div class="gacha-top-btns">
|
<div class="gacha-top-btns">
|
||||||
<v-btn prepend-icon="mdi-refresh" class="gacha-top-btn" @click="confirmRefresh(false)"
|
<v-btn prepend-icon="mdi-refresh" class="gacha-top-btn" @click="confirmRefresh(false)">
|
||||||
>增量刷新
|
增量刷新
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn prepend-icon="mdi-refresh" class="gacha-top-btn" @click="confirmRefresh(true)"
|
<v-btn prepend-icon="mdi-refresh" class="gacha-top-btn" @click="confirmRefresh(true)">
|
||||||
>全量刷新
|
全量刷新
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn prepend-icon="mdi-import" class="gacha-top-btn" @click="handleImportBtn(false)"
|
<v-btn prepend-icon="mdi-import" class="gacha-top-btn" @click="handleImportBtn(false)">
|
||||||
>导入
|
导入
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn prepend-icon="mdi-import" class="gacha-top-btn" @click="handleImportBtn(true)"
|
<v-btn prepend-icon="mdi-import" class="gacha-top-btn" @click="handleImportBtn(true)">
|
||||||
>导入(v4)
|
导入(v4)
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn prepend-icon="mdi-export" class="gacha-top-btn" @click="exportUigf()">导出</v-btn>
|
<v-btn prepend-icon="mdi-export" class="gacha-top-btn" @click="exportUigf()">导出</v-btn>
|
||||||
<v-btn prepend-icon="mdi-export" class="gacha-top-btn" @click="exportUigf4()"
|
<v-btn prepend-icon="mdi-export" class="gacha-top-btn" @click="exportUigf4()">
|
||||||
>导出(v4)
|
导出(v4)
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn prepend-icon="mdi-delete" class="gacha-top-btn" @click="deleteGacha()">删除</v-btn>
|
<v-btn prepend-icon="mdi-delete" class="gacha-top-btn" @click="deleteGacha()">删除</v-btn>
|
||||||
</div>
|
</div>
|
||||||
@@ -50,7 +53,7 @@
|
|||||||
import { path } from "@tauri-apps/api";
|
import { path } from "@tauri-apps/api";
|
||||||
import { open, save } from "@tauri-apps/plugin-dialog";
|
import { open, save } from "@tauri-apps/plugin-dialog";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { onMounted, ref, watch } from "vue";
|
import { onMounted, ref, watch, computed } from "vue";
|
||||||
|
|
||||||
import showConfirm from "../../components/func/confirm.js";
|
import showConfirm from "../../components/func/confirm.js";
|
||||||
import showSnackbar from "../../components/func/snackbar.js";
|
import showSnackbar from "../../components/func/snackbar.js";
|
||||||
@@ -74,7 +77,7 @@ import TGRequest from "../../web/request/TGRequest.js";
|
|||||||
|
|
||||||
// store
|
// store
|
||||||
const userStore = storeToRefs(useUserStore());
|
const userStore = storeToRefs(useUserStore());
|
||||||
const account = userStore.account.value;
|
const account = computed<TGApp.Sqlite.Account.Game>(() => userStore.account.value);
|
||||||
const authkey = ref<string>("");
|
const authkey = ref<string>("");
|
||||||
|
|
||||||
// loading
|
// loading
|
||||||
@@ -84,10 +87,23 @@ const loadingSub = ref<string>();
|
|||||||
|
|
||||||
// data
|
// data
|
||||||
const selectItem = ref<string[]>([]);
|
const selectItem = ref<string[]>([]);
|
||||||
const uidCur = ref<string>("");
|
const uidCur = ref<string>();
|
||||||
const gachaListCur = ref<TGApp.Sqlite.GachaRecords.SingleTable[]>([]);
|
const gachaListCur = ref<TGApp.Sqlite.GachaRecords.SingleTable[]>([]);
|
||||||
const tab = ref<string>("overview");
|
const tab = ref<string>("overview");
|
||||||
|
|
||||||
|
// 监听 UID 变化
|
||||||
|
watch(
|
||||||
|
() => uidCur.value,
|
||||||
|
async (newUid) => {
|
||||||
|
if (!newUid) return;
|
||||||
|
gachaListCur.value = await TSUserGacha.getGachaRecords(newUid);
|
||||||
|
showSnackbar({ text: `成功获取 ${gachaListCur.value.length} 条祈愿数据` });
|
||||||
|
await TGLogger.Info(
|
||||||
|
`[UserGacha][${newUid}][watch] 成功获取 ${gachaListCur.value.length} 条祈愿数据`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await TGLogger.Info("[UserGacha][onMounted] 进入角色祈愿页面");
|
await TGLogger.Info("[UserGacha][onMounted] 进入角色祈愿页面");
|
||||||
loadingTitle.value = "正在获取祈愿 UID 列表";
|
loadingTitle.value = "正在获取祈愿 UID 列表";
|
||||||
@@ -116,26 +132,30 @@ onMounted(async () => {
|
|||||||
|
|
||||||
// 刷新按钮点击事件
|
// 刷新按钮点击事件
|
||||||
async function confirmRefresh(force: boolean): Promise<void> {
|
async function confirmRefresh(force: boolean): Promise<void> {
|
||||||
await TGLogger.Info(`[UserGacha][${account.gameUid}][confirmRefresh] 刷新祈愿数据`);
|
await TGLogger.Info(`[UserGacha][${account.value.gameUid}][confirmRefresh] 刷新祈愿数据`);
|
||||||
const confirmRes = await showConfirm({
|
if (uidCur.value && uidCur.value !== account.value.gameUid) {
|
||||||
title: "是否刷新祈愿数据?",
|
const confirmSwitch = await showConfirm({
|
||||||
text: `将刷新 UID:${account.gameUid} 的祈愿数据`,
|
title: "是否切换游戏账户",
|
||||||
});
|
text: `确认则尝试切换至 ${uidCur.value}`,
|
||||||
if (!confirmRes) {
|
|
||||||
showSnackbar({
|
|
||||||
color: "cancel",
|
|
||||||
text: "已取消刷新祈愿数据",
|
|
||||||
});
|
});
|
||||||
await TGLogger.Warn("[UserGacha][${account.gameUid}][confirmRefresh] 已取消刷新祈愿数据");
|
if (confirmSwitch) {
|
||||||
return;
|
await useUserStore().switchGameAccount(uidCur.value);
|
||||||
|
await confirmRefresh(force);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const confirm = await showConfirm({
|
||||||
|
title: "确定刷新?",
|
||||||
|
text: `用户${account.value.gameUid}与当前UID${uidCur.value}不一致`,
|
||||||
|
});
|
||||||
|
if (!confirm) {
|
||||||
|
showSnackbar({ text: "已取消祈愿数据刷新", color: "cancel" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
loadingTitle.value = "正在获取 authkey";
|
loadingTitle.value = "正在获取 authkey";
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
if (!userStore.cookie.value) {
|
if (!userStore.cookie.value) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: "请先登录" });
|
||||||
color: "error",
|
|
||||||
text: "请先登录",
|
|
||||||
});
|
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
await TGLogger.Warn("[UserGacha][${account.gameUid}][confirmRefresh] 未检测到 cookie");
|
await TGLogger.Warn("[UserGacha][${account.gameUid}][confirmRefresh] 未检测到 cookie");
|
||||||
return;
|
return;
|
||||||
@@ -144,19 +164,16 @@ async function confirmRefresh(force: boolean): Promise<void> {
|
|||||||
stoken: userStore.cookie.value.stoken,
|
stoken: userStore.cookie.value.stoken,
|
||||||
mid: userStore.cookie.value.mid,
|
mid: userStore.cookie.value.mid,
|
||||||
};
|
};
|
||||||
const gameUid = account.gameUid;
|
const gameUid = account.value.gameUid;
|
||||||
const authkeyRes = await TGRequest.User.getAuthkey(cookie, gameUid);
|
const authkeyRes = await TGRequest.User.getAuthkey(cookie, gameUid);
|
||||||
if (typeof authkeyRes === "string") {
|
if (typeof authkeyRes === "string") {
|
||||||
authkey.value = authkeyRes;
|
authkey.value = authkeyRes;
|
||||||
await TGLogger.Info(`[UserGacha][${account.gameUid}][confirmRefresh] 成功获取 authkey`);
|
await TGLogger.Info(`[UserGacha][${account.value.gameUid}][confirmRefresh] 成功获取 authkey`);
|
||||||
} else {
|
} else {
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: "获取 authkey 失败" });
|
||||||
color: "error",
|
await TGLogger.Error(`[UserGacha][${account.value.gameUid}][confirmRefresh] 获取 authkey 失败`);
|
||||||
text: "获取 authkey 失败",
|
|
||||||
});
|
|
||||||
await TGLogger.Error(`[UserGacha][${account.gameUid}][confirmRefresh] 获取 authkey 失败`);
|
|
||||||
await TGLogger.Error(
|
await TGLogger.Error(
|
||||||
`[UserGacha][${account.gameUid}][confirmRefresh] ${authkeyRes.retcode} ${authkeyRes.message}`,
|
`[UserGacha][${account.value.gameUid}][confirmRefresh] ${authkeyRes.retcode} ${authkeyRes.message}`,
|
||||||
);
|
);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
return;
|
return;
|
||||||
@@ -170,11 +187,11 @@ async function confirmRefresh(force: boolean): Promise<void> {
|
|||||||
];
|
];
|
||||||
if (!force) {
|
if (!force) {
|
||||||
loadingTitle.value = "正在获取数据库祈愿最新 ID";
|
loadingTitle.value = "正在获取数据库祈愿最新 ID";
|
||||||
checkList[0] = await TSUserGacha.getGachaCheck(account.gameUid, "200");
|
checkList[0] = await TSUserGacha.getGachaCheck(account.value.gameUid, "200");
|
||||||
checkList[1] = await TSUserGacha.getGachaCheck(account.gameUid, "301");
|
checkList[1] = await TSUserGacha.getGachaCheck(account.value.gameUid, "301");
|
||||||
checkList[2] = await TSUserGacha.getGachaCheck(account.gameUid, "400");
|
checkList[2] = await TSUserGacha.getGachaCheck(account.value.gameUid, "400");
|
||||||
checkList[3] = await TSUserGacha.getGachaCheck(account.gameUid, "302");
|
checkList[3] = await TSUserGacha.getGachaCheck(account.value.gameUid, "302");
|
||||||
checkList[4] = await TSUserGacha.getGachaCheck(account.gameUid, "500");
|
checkList[4] = await TSUserGacha.getGachaCheck(account.value.gameUid, "500");
|
||||||
}
|
}
|
||||||
console.log(checkList);
|
console.log(checkList);
|
||||||
loadingTitle.value = "正在刷新新手祈愿数据";
|
loadingTitle.value = "正在刷新新手祈愿数据";
|
||||||
@@ -197,19 +214,20 @@ async function confirmRefresh(force: boolean): Promise<void> {
|
|||||||
resolve("");
|
resolve("");
|
||||||
}, 1000);
|
}, 1000);
|
||||||
});
|
});
|
||||||
await TGLogger.Info(`[UserGacha][${account.gameUid}][confirmRefresh] 刷新祈愿数据完成`);
|
await TGLogger.Info(`[UserGacha][${account.value.gameUid}][confirmRefresh] 刷新祈愿数据完成`);
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getGachaLogs(pool: string, endId: string = "0", check?: string): Promise<void> {
|
async function getGachaLogs(pool: string, endId: string = "0", check?: string): Promise<void> {
|
||||||
|
const uid = account.value.gameUid;
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
`[UserGacha][${account.gameUid}][getGachaLogs] 获取祈愿数据,pool:${pool},endId:${endId}`,
|
`[UserGacha][${uid}][getGachaLogs] 获取祈愿数据,pool:${pool},endId:${endId}`,
|
||||||
);
|
);
|
||||||
const gachaRes = await TGRequest.User.getGachaLog(authkey.value, pool, endId);
|
const gachaRes = await TGRequest.User.getGachaLog(authkey.value, pool, endId);
|
||||||
console.log(pool, endId, gachaRes);
|
console.log(pool, endId, gachaRes);
|
||||||
if (Array.isArray(gachaRes)) {
|
if (Array.isArray(gachaRes)) {
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
`[UserGacha][${account.gameUid}][getGachaLogs] 成功获取到 ${gachaRes.length} 条祈愿数据`,
|
`[UserGacha][${uid}][getGachaLogs] 成功获取到 ${gachaRes.length} 条祈愿数据`,
|
||||||
);
|
);
|
||||||
if (gachaRes.length === 0) {
|
if (gachaRes.length === 0) {
|
||||||
await new Promise((resolve) => {
|
await new Promise((resolve) => {
|
||||||
@@ -242,7 +260,7 @@ async function getGachaLogs(pool: string, endId: string = "0", check?: string):
|
|||||||
}
|
}
|
||||||
uigfList.push(tempItem);
|
uigfList.push(tempItem);
|
||||||
});
|
});
|
||||||
await TSUserGacha.mergeUIGF(account.gameUid, uigfList);
|
await TSUserGacha.mergeUIGF(uid, uigfList);
|
||||||
if (check !== undefined && gachaRes.some((i) => i.id === check)) {
|
if (check !== undefined && gachaRes.some((i) => i.id === check)) {
|
||||||
await new Promise((resolve) => {
|
await new Promise((resolve) => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -260,13 +278,10 @@ async function getGachaLogs(pool: string, endId: string = "0", check?: string):
|
|||||||
await getGachaLogs(pool, gachaRes[gachaRes.length - 1].id, check);
|
await getGachaLogs(pool, gachaRes[gachaRes.length - 1].id, check);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: `[${pool}][${gachaRes.retcode}] ${gachaRes.message}` });
|
||||||
color: "error",
|
await TGLogger.Error(`[UserGacha][${uid}][getGachaLogs] 获取祈愿数据失败`);
|
||||||
text: `[${pool}][${gachaRes.retcode}] ${gachaRes.message}`,
|
|
||||||
});
|
|
||||||
await TGLogger.Error(`[UserGacha][${account.gameUid}][getGachaLogs] 获取祈愿数据失败`);
|
|
||||||
await TGLogger.Error(
|
await TGLogger.Error(
|
||||||
`[UserGacha][${account.gameUid}][getGachaLogs] ${gachaRes.retcode} ${gachaRes.message}`,
|
`[UserGacha][${uid}][getGachaLogs] ${gachaRes.retcode} ${gachaRes.message}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -276,10 +291,7 @@ async function handleImportBtn(isV4: boolean): Promise<void> {
|
|||||||
if (isV4) {
|
if (isV4) {
|
||||||
const checkConfirm = await showConfirm({ title: "确定导入UIGFv4格式的祈愿数据?" });
|
const checkConfirm = await showConfirm({ title: "确定导入UIGFv4格式的祈愿数据?" });
|
||||||
if (!checkConfirm) {
|
if (!checkConfirm) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消 UIGF v4 格式导入" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消 UIGF v4 格式导入",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TGLogger.Info("[UserGacha][handleImportBtn] 导入祈愿数据(v4)");
|
await TGLogger.Info("[UserGacha][handleImportBtn] 导入祈愿数据(v4)");
|
||||||
@@ -299,10 +311,7 @@ async function handleImportBtn(isV4: boolean): Promise<void> {
|
|||||||
directory: false,
|
directory: false,
|
||||||
});
|
});
|
||||||
if (selectedFile === null) {
|
if (selectedFile === null) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消文件选择" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消文件选择",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const check = await verifyUigfData(selectedFile, isV4);
|
const check = await verifyUigfData(selectedFile, isV4);
|
||||||
@@ -324,10 +333,7 @@ async function importUigf4(filePath: string): Promise<void> {
|
|||||||
text: `共 ${uidCount} 个 UID,${dataCount} 条数据`,
|
text: `共 ${uidCount} 个 UID,${dataCount} 条数据`,
|
||||||
});
|
});
|
||||||
if (!res) {
|
if (!res) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消祈愿数据导入" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消祈愿数据导入",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loadingTitle.value = "正在导入祈愿数据(v4)";
|
loadingTitle.value = "正在导入祈愿数据(v4)";
|
||||||
@@ -337,9 +343,7 @@ async function importUigf4(filePath: string): Promise<void> {
|
|||||||
await TSUserGacha.mergeUIGF4(account);
|
await TSUserGacha.mergeUIGF4(account);
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
showSnackbar({
|
showSnackbar({ text: `成功导入 ${uidCount} 个 UID 的 ${dataCount} 条祈愿数据` });
|
||||||
text: `成功导入 ${uidCount} 个 UID 的 ${dataCount} 条祈愿数据`,
|
|
||||||
});
|
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
`[UserGacha][importUigf4] 成功导入 ${uidCount} 个 UID,${dataCount} 条祈愿数据`,
|
`[UserGacha][importUigf4] 成功导入 ${uidCount} 个 UID,${dataCount} 条祈愿数据`,
|
||||||
);
|
);
|
||||||
@@ -355,27 +359,19 @@ async function importUigf(filePath: string): Promise<void> {
|
|||||||
text: `UID:${remoteData.info.uid},共 ${remoteData.list.length} 条数据`,
|
text: `UID:${remoteData.info.uid},共 ${remoteData.list.length} 条数据`,
|
||||||
});
|
});
|
||||||
if (!confirm) {
|
if (!confirm) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消祈愿数据导入" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消祈愿数据导入",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loadingTitle.value = "正在导入祈愿数据";
|
loadingTitle.value = "正在导入祈愿数据";
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
if (remoteData.list.length === 0) {
|
if (remoteData.list.length === 0) {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: "导入的祈愿数据为空" });
|
||||||
color: "error",
|
|
||||||
text: "导入的祈愿数据为空",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TSUserGacha.mergeUIGF(remoteData.info.uid, remoteData.list);
|
await TSUserGacha.mergeUIGF(remoteData.info.uid, remoteData.list);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
showSnackbar({
|
showSnackbar({ text: `成功导入 ${remoteData.list.length} 条祈愿数据` });
|
||||||
text: `成功导入 ${remoteData.list.length} 条祈愿数据`,
|
|
||||||
});
|
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
`[UserGacha][importUigf] 成功导入 ${remoteData.info.uid} 的 ${remoteData.list.length} 条祈愿数据`,
|
`[UserGacha][importUigf] 成功导入 ${remoteData.info.uid} 的 ${remoteData.list.length} 条祈愿数据`,
|
||||||
);
|
);
|
||||||
@@ -386,13 +382,11 @@ async function importUigf(filePath: string): Promise<void> {
|
|||||||
|
|
||||||
// 导出当前UID的祈愿数据
|
// 导出当前UID的祈愿数据
|
||||||
async function exportUigf(): Promise<void> {
|
async function exportUigf(): Promise<void> {
|
||||||
|
if (!uidCur.value) return;
|
||||||
await TGLogger.Info(`[UserGacha][${uidCur.value}][exportUigf] 导出祈愿数据`);
|
await TGLogger.Info(`[UserGacha][${uidCur.value}][exportUigf] 导出祈愿数据`);
|
||||||
const gachaList = await TSUserGacha.getGachaRecords(uidCur.value);
|
const gachaList = await TSUserGacha.getGachaRecords(uidCur.value);
|
||||||
if (gachaList.length === 0) {
|
if (gachaList.length === 0) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: `UID ${uidCur.value} 暂无祈愿数据` });
|
||||||
color: "error",
|
|
||||||
text: `UID ${uidCur.value} 暂无祈愿数据`,
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const res = await showConfirm({
|
const res = await showConfirm({
|
||||||
@@ -400,10 +394,7 @@ async function exportUigf(): Promise<void> {
|
|||||||
text: `UID:${uidCur.value},共 ${gachaList.length} 条数据`,
|
text: `UID:${uidCur.value},共 ${gachaList.length} 条数据`,
|
||||||
});
|
});
|
||||||
if (!res) {
|
if (!res) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: `已取消 UID ${uidCur.value} 的祈愿数据导出` });
|
||||||
color: "cancel",
|
|
||||||
text: `已取消 UID ${uidCur.value} 的祈愿数据导出`,
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const file = await save({
|
const file = await save({
|
||||||
@@ -417,10 +408,7 @@ async function exportUigf(): Promise<void> {
|
|||||||
defaultPath: `${await path.downloadDir()}${path.sep()}UIGF_${uidCur.value}.json`,
|
defaultPath: `${await path.downloadDir()}${path.sep()}UIGF_${uidCur.value}.json`,
|
||||||
});
|
});
|
||||||
if (!file) {
|
if (!file) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消文件保存" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消文件保存",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
@@ -436,12 +424,10 @@ async function exportUigf(): Promise<void> {
|
|||||||
|
|
||||||
// 导出 UIGF v4 版本的祈愿数据
|
// 导出 UIGF v4 版本的祈愿数据
|
||||||
async function exportUigf4(): Promise<void> {
|
async function exportUigf4(): Promise<void> {
|
||||||
|
if (!uidCur.value) return;
|
||||||
const checkConfirm = await showConfirm({ title: "确定导出UIGFv4格式的祈愿数据?" });
|
const checkConfirm = await showConfirm({ title: "确定导出UIGFv4格式的祈愿数据?" });
|
||||||
if (!checkConfirm) {
|
if (!checkConfirm) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消 UIGF v4 格式导出" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消 UIGF v4 格式导出",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TGLogger.Info(`[UserGacha][${uidCur.value}][exportUigf4] 导出祈愿数据(v4)`);
|
await TGLogger.Info(`[UserGacha][${uidCur.value}][exportUigf4] 导出祈愿数据(v4)`);
|
||||||
@@ -451,19 +437,13 @@ async function exportUigf4(): Promise<void> {
|
|||||||
text: "取消则只导出当前 UID 的祈愿数据",
|
text: "取消则只导出当前 UID 的祈愿数据",
|
||||||
});
|
});
|
||||||
if (allConfirm === undefined) {
|
if (allConfirm === undefined) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消祈愿数据导出" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消祈愿数据导出",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (allConfirm === false) {
|
if (!allConfirm) {
|
||||||
const gachaList = await TSUserGacha.getGachaRecords(uidCur.value);
|
const gachaList = await TSUserGacha.getGachaRecords(uidCur.value);
|
||||||
if (gachaList.length === 0) {
|
if (gachaList.length === 0) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: `UID ${uidCur.value} 暂无祈愿数据` });
|
||||||
color: "error",
|
|
||||||
text: `UID ${uidCur.value} 暂无祈愿数据`,
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -478,33 +458,25 @@ async function exportUigf4(): Promise<void> {
|
|||||||
defaultPath: `${await path.downloadDir()}${path.sep()}UIGF4.json`,
|
defaultPath: `${await path.downloadDir()}${path.sep()}UIGF4.json`,
|
||||||
});
|
});
|
||||||
if (!file) {
|
if (!file) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消文件保存" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消文件保存",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loadingTitle.value = "正在导出祈愿数据";
|
loadingTitle.value = "正在导出祈愿数据";
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
if (allConfirm === false) {
|
if (!allConfirm) {
|
||||||
await exportUigf4Data(file, uidCur.value);
|
await exportUigf4Data(file, uidCur.value);
|
||||||
} else {
|
} else {
|
||||||
await exportUigf4Data(file);
|
await exportUigf4Data(file);
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
showSnackbar({
|
showSnackbar({ text: "祈愿数据已成功导出" });
|
||||||
text: "祈愿数据已成功导出",
|
|
||||||
});
|
|
||||||
await TGLogger.Info(`[UserGacha][${uidCur.value}][exportUigf4] 导出祈愿数据完成`);
|
await TGLogger.Info(`[UserGacha][${uidCur.value}][exportUigf4] 导出祈愿数据完成`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除当前 UID 的祈愿数据
|
// 删除当前 UID 的祈愿数据
|
||||||
async function deleteGacha(): Promise<void> {
|
async function deleteGacha(): Promise<void> {
|
||||||
if (gachaListCur.value.length === 0) {
|
if (gachaListCur.value.length === 0 || !uidCur.value) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "error", text: "暂无祈愿数据" });
|
||||||
color: "error",
|
|
||||||
text: "暂无祈愿数据",
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await TGLogger.Info(`[UserGacha][${uidCur.value}][deleteGacha] 删除祈愿数据`);
|
await TGLogger.Info(`[UserGacha][${uidCur.value}][deleteGacha] 删除祈愿数据`);
|
||||||
@@ -513,10 +485,7 @@ async function deleteGacha(): Promise<void> {
|
|||||||
text: `UID:${uidCur.value},共 ${gachaListCur.value.length} 条数据`,
|
text: `UID:${uidCur.value},共 ${gachaListCur.value.length} 条数据`,
|
||||||
});
|
});
|
||||||
if (!firstConfirm) {
|
if (!firstConfirm) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消祈愿数据删除" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消祈愿数据删除",
|
|
||||||
});
|
|
||||||
await TGLogger.Info(`[UserGacha][${uidCur.value}][deleteGacha] 已取消祈愿数据删除`);
|
await TGLogger.Info(`[UserGacha][${uidCur.value}][deleteGacha] 已取消祈愿数据删除`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -528,10 +497,7 @@ async function deleteGacha(): Promise<void> {
|
|||||||
text: `UID:${uidCur.value},共 ${gachaListCur.value.length} 条数据`,
|
text: `UID:${uidCur.value},共 ${gachaListCur.value.length} 条数据`,
|
||||||
});
|
});
|
||||||
if (!secondConfirm) {
|
if (!secondConfirm) {
|
||||||
showSnackbar({
|
showSnackbar({ color: "cancel", text: "已取消祈愿数据删除" });
|
||||||
color: "cancel",
|
|
||||||
text: "已取消祈愿数据删除",
|
|
||||||
});
|
|
||||||
await TGLogger.Info(`[UserGacha][${uidCur.value}][deleteGacha] 已取消祈愿数据删除`);
|
await TGLogger.Info(`[UserGacha][${uidCur.value}][deleteGacha] 已取消祈愿数据删除`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -540,9 +506,7 @@ async function deleteGacha(): Promise<void> {
|
|||||||
loading.value = true;
|
loading.value = true;
|
||||||
await TSUserGacha.deleteGachaRecords(uidCur.value);
|
await TSUserGacha.deleteGachaRecords(uidCur.value);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
showSnackbar({
|
showSnackbar({ text: `已成功删除 ${uidCur.value} 的祈愿数据` });
|
||||||
text: `已成功删除 ${uidCur.value} 的祈愿数据`,
|
|
||||||
});
|
|
||||||
await TGLogger.Info(
|
await TGLogger.Info(
|
||||||
`[UserGacha][${uidCur.value}][deleteGacha] 成功删除 ${gachaListCur.value.length} 条祈愿数据`,
|
`[UserGacha][${uidCur.value}][deleteGacha] 成功删除 ${gachaListCur.value.length} 条祈愿数据`,
|
||||||
);
|
);
|
||||||
@@ -550,17 +514,6 @@ async function deleteGacha(): Promise<void> {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 监听 UID 变化
|
|
||||||
watch(uidCur, async (newUid) => {
|
|
||||||
gachaListCur.value = await TSUserGacha.getGachaRecords(newUid);
|
|
||||||
showSnackbar({
|
|
||||||
text: `成功获取 ${gachaListCur.value.length} 条祈愿数据`,
|
|
||||||
});
|
|
||||||
await TGLogger.Info(
|
|
||||||
`[UserGacha][${newUid}][watch] 成功获取 ${gachaListCur.value.length} 条祈愿数据`,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="css" scoped>
|
<style lang="css" scoped>
|
||||||
.gacha-top-bar {
|
.gacha-top-bar {
|
||||||
@@ -569,6 +522,7 @@ watch(uidCur, async (newUid) => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
|
border: 1px solid var(--common-shadow-1);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
background: var(--box-bg-1);
|
background: var(--box-bg-1);
|
||||||
@@ -578,7 +532,22 @@ watch(uidCur, async (newUid) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.gacha-top-title {
|
.gacha-top-title {
|
||||||
color: var(--common-text-title);
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 10px;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: var(--common-text-title);
|
||||||
|
font-family: var(--font-title);
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.gacha-top-select {
|
.gacha-top-select {
|
||||||
|
|||||||
@@ -53,14 +53,14 @@ function getInsertSql(uid: string, data: TGApp.Game.Avatar.DetailList): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取用户角色id列表
|
* @description 获取用户UID列表
|
||||||
* @since Beta v0.5.3
|
* @since Beta v0.6.0
|
||||||
* @returns {Promise<string[]>} 角色id列表
|
* @returns {Promise<string[]>} 角色id列表
|
||||||
*/
|
*/
|
||||||
async function getAllUid(): Promise<string[]> {
|
async function getAllUid(): Promise<string[]> {
|
||||||
const db = await TGSqlite.getDB();
|
const db = await TGSqlite.getDB();
|
||||||
type resType = Array<{ uid: string }>;
|
type resType = Array<{ uid: string }>;
|
||||||
const res = await db.select<resType>("SELECT DISTINCT cid FROM UserCharacters;");
|
const res = await db.select<resType>("SELECT DISTINCT uid FROM UserCharacters;");
|
||||||
return res.map((i) => i.uid);
|
return res.map((i) => i.uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,15 +115,27 @@ async function saveAvatars(uid: string, data: TGApp.Game.Avatar.DetailList[]): P
|
|||||||
*/
|
*/
|
||||||
function getAvatarCard(id: number): string {
|
function getAvatarCard(id: number): string {
|
||||||
const find = AppCharacterData.find((c) => c.id === id);
|
const find = AppCharacterData.find((c) => c.id === id);
|
||||||
if (!find) return "原神·印象";
|
if (find === undefined || find.nameCard === "") return "原神·印象";
|
||||||
return find.nameCard;
|
return find.nameCard;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 删除指定UID的数据
|
||||||
|
* @since Beta v0.6.0
|
||||||
|
* @param {string} uid - 游戏UID
|
||||||
|
* @return {Promise<void>}
|
||||||
|
*/
|
||||||
|
async function deleteUid(uid: string): Promise<void> {
|
||||||
|
const db = await TGSqlite.getDB();
|
||||||
|
await db.execute("DELETE FROM UserCharacters WHERE uid = ?;", [uid]);
|
||||||
|
}
|
||||||
|
|
||||||
const TSUserAvatar = {
|
const TSUserAvatar = {
|
||||||
getAllUid,
|
getAllUid,
|
||||||
getAvatars,
|
getAvatars,
|
||||||
saveAvatars,
|
saveAvatars,
|
||||||
getAvatarCard,
|
getAvatarCard,
|
||||||
|
deleteUid,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default TSUserAvatar;
|
export default TSUserAvatar;
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
import showSnackbar from "../../components/func/snackbar.js";
|
||||||
|
import TSUserAccount from "../../plugins/Sqlite/modules/userAccount.js";
|
||||||
|
|
||||||
export const useUserStore = defineStore(
|
export const useUserStore = defineStore(
|
||||||
"user",
|
"user",
|
||||||
() => {
|
() => {
|
||||||
@@ -37,6 +40,27 @@ export const useUserStore = defineStore(
|
|||||||
return propMap.value[prop.toString()] || false;
|
return propMap.value[prop.toString()] || false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function switchGameAccount(uidG: string): Promise<boolean> {
|
||||||
|
if (!uid.value) {
|
||||||
|
showSnackbar({ text: "未找到登录用户", color: "error" });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (uidG === account.value.gameUid) {
|
||||||
|
showSnackbar({ text: "该账户已经选中", color: "warn" });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const gameAccounts = await TSUserAccount.game.getAccount(uid.value);
|
||||||
|
const accountFind = gameAccounts.find((a) => a.gameUid === uidG);
|
||||||
|
if (!accountFind) {
|
||||||
|
showSnackbar({ text: "未找到账户绑定的游戏账户", color: "error" });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
account.value = accountFind;
|
||||||
|
await TSUserAccount.game.switchAccount(uid.value, uidG);
|
||||||
|
showSnackbar({ text: `成功切换游戏账户为${uidG}` });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
uid,
|
uid,
|
||||||
cookie,
|
cookie,
|
||||||
@@ -44,6 +68,7 @@ export const useUserStore = defineStore(
|
|||||||
account,
|
account,
|
||||||
propMap,
|
propMap,
|
||||||
getProp,
|
getProp,
|
||||||
|
switchGameAccount,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user