mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-15 09:48:14 +08:00
@@ -76,10 +76,20 @@
|
|||||||
</div>
|
</div>
|
||||||
<v-list-item>
|
<v-list-item>
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<v-icon v-if="!achievement.isCompleted" color="var(--tgc-blue-3)">
|
<v-icon
|
||||||
|
v-if="!achievement.isCompleted"
|
||||||
|
color="var(--tgc-blue-3)"
|
||||||
|
@click="setAchi(achievement, true)"
|
||||||
|
style="cursor: pointer"
|
||||||
|
>
|
||||||
mdi-circle
|
mdi-circle
|
||||||
</v-icon>
|
</v-icon>
|
||||||
<v-icon v-else class="achievement-finish">
|
<v-icon
|
||||||
|
v-else
|
||||||
|
class="achievement-finish"
|
||||||
|
style="cursor: pointer"
|
||||||
|
@click="setAchi(achievement, false)"
|
||||||
|
>
|
||||||
<img alt="finish" src="/source/UI/finish.webp" />
|
<img alt="finish" src="/source/UI/finish.webp" />
|
||||||
</v-icon>
|
</v-icon>
|
||||||
</template>
|
</template>
|
||||||
@@ -118,6 +128,7 @@ import { AppAchievementSeriesData } from "../../data";
|
|||||||
import TGSqlite from "../../plugins/Sqlite";
|
import TGSqlite from "../../plugins/Sqlite";
|
||||||
import { useAchievementsStore } from "../../store/modules/achievements";
|
import { useAchievementsStore } from "../../store/modules/achievements";
|
||||||
import { createTGWindow } from "../../utils/TGWindow";
|
import { createTGWindow } from "../../utils/TGWindow";
|
||||||
|
import { getNowStr } from "../../utils/toolFunc";
|
||||||
import { getUiafHeader, readUiafData, verifyUiafData } from "../../utils/UIAF";
|
import { getUiafHeader, readUiafData, verifyUiafData } from "../../utils/UIAF";
|
||||||
|
|
||||||
// Store
|
// Store
|
||||||
@@ -161,18 +172,23 @@ const route = useRoute();
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
const { total, fin } = await getAchievementsOverview();
|
await flushOverview();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 刷新概况
|
||||||
|
async function flushOverview(): Promise<void> {
|
||||||
|
const { total, fin } = await getAchiOverview();
|
||||||
achievementsStore.flushData(total, fin);
|
achievementsStore.flushData(total, fin);
|
||||||
title.value = achievementsStore.title;
|
title.value = achievementsStore.title;
|
||||||
});
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
loadingTitle.value = "正在获取成就系列数据";
|
loadingTitle.value = "正在获取成就系列数据";
|
||||||
allSeriesData.value = await getAchievementSeries();
|
allSeriesData.value = await getSeriesData();
|
||||||
achievementsStore.lastVersion = await TGSqlite.getLatestAchievementVersion();
|
achievementsStore.lastVersion = await TGSqlite.getLatestAchievementVersion();
|
||||||
loadingTitle.value = "正在获取成就数据";
|
loadingTitle.value = "正在获取成就数据";
|
||||||
selectedAchievement.value = await getAchievements("all");
|
selectedAchievement.value = await getAchiData("all");
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
if (route.query.app && typeof route.query.app === "string") {
|
if (route.query.app && typeof route.query.app === "string") {
|
||||||
await handleImportOuter(route.query.app);
|
await handleImportOuter(route.query.app);
|
||||||
@@ -220,50 +236,16 @@ function handleScroll(e: Event): void {
|
|||||||
async function selectSeries(index: number): Promise<void> {
|
async function selectSeries(index: number): Promise<void> {
|
||||||
// 如果选中的是已经选中的系列,则不进行操作
|
// 如果选中的是已经选中的系列,则不进行操作
|
||||||
if (selectedSeries.value === index) {
|
if (selectedSeries.value === index) {
|
||||||
let res, res2;
|
showSnackbar({
|
||||||
res = await showConfirm({
|
color: "warn",
|
||||||
title: "请输入要执行的批量操作",
|
text: "已经选中该系列",
|
||||||
text: "全部完成(1)/全部未完成(2)",
|
|
||||||
mode: "input",
|
|
||||||
});
|
});
|
||||||
if (res !== false) {
|
|
||||||
if (res === "1") {
|
|
||||||
res2 = await showConfirm({
|
|
||||||
title: "是否确认全部完成?",
|
|
||||||
text: "此操作不可逆",
|
|
||||||
});
|
|
||||||
} else if (res === "2") {
|
|
||||||
res2 = await showConfirm({
|
|
||||||
title: "是否确认全部未完成?",
|
|
||||||
text: "此操作不可逆",
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
showSnackbar({
|
|
||||||
text: "请输入数字 1 或 2",
|
|
||||||
color: "error",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(res && res2)) {
|
|
||||||
showSnackbar({
|
|
||||||
text: "已取消操作",
|
|
||||||
color: "cancel",
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// todo
|
|
||||||
// await setAchievements("series", index, res === "1" ? true : false);
|
|
||||||
showSnackbar({
|
|
||||||
text: "操作成功",
|
|
||||||
color: "success",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
loadingTitle.value = "正在获取对应的成就数据";
|
loadingTitle.value = "正在获取对应的成就数据";
|
||||||
selectedSeries.value = index;
|
selectedSeries.value = index;
|
||||||
selectedAchievement.value = await getAchievements("series", index.toString());
|
selectedAchievement.value = await getAchiData("series", index.toString());
|
||||||
loadingTitle.value = "正在查找对应的成就名片";
|
loadingTitle.value = "正在查找对应的成就名片";
|
||||||
if (selectedSeries.value !== 0 && selectedSeries.value !== 17) {
|
if (selectedSeries.value !== 0 && selectedSeries.value !== 17) {
|
||||||
getCardInfo.value = await TGSqlite.getNameCard(index);
|
getCardInfo.value = await TGSqlite.getNameCard(index);
|
||||||
@@ -296,7 +278,7 @@ async function searchCard(): Promise<void> {
|
|||||||
selectedSeries.value = -1;
|
selectedSeries.value = -1;
|
||||||
loadingTitle.value = "正在搜索";
|
loadingTitle.value = "正在搜索";
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
selectedAchievement.value = await getAchievements("search", search.value);
|
selectedAchievement.value = await getAchiData("search", search.value);
|
||||||
if (selectedAchievement.value.length === 0) {
|
if (selectedAchievement.value.length === 0) {
|
||||||
showSnackbar({
|
showSnackbar({
|
||||||
color: "error",
|
color: "error",
|
||||||
@@ -426,9 +408,31 @@ async function handleImportOuter(app: string): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 改变成就状态
|
||||||
|
async function setAchi(
|
||||||
|
achievement: TGApp.Sqlite.Achievement.SingleTable,
|
||||||
|
target: boolean,
|
||||||
|
): Promise<void> {
|
||||||
|
const newAchievement = achievement;
|
||||||
|
if (target) {
|
||||||
|
// 取消已完成
|
||||||
|
newAchievement.isCompleted = 1;
|
||||||
|
newAchievement.completedTime = getNowStr();
|
||||||
|
} else {
|
||||||
|
newAchievement.isCompleted = 0;
|
||||||
|
newAchievement.completedTime = "";
|
||||||
|
}
|
||||||
|
renderAchievement.value[renderAchievement.value.findIndex((item) => item.id === achievement.id)] =
|
||||||
|
newAchievement;
|
||||||
|
await setAchiDB(newAchievement);
|
||||||
|
await flushOverview();
|
||||||
|
allSeriesData.value[allSeriesData.value.findIndex((item) => item.id === newAchievement.series)] =
|
||||||
|
(await getSeriesData(newAchievement.series))[0];
|
||||||
|
}
|
||||||
|
|
||||||
/* 以下为数据库操作 */
|
/* 以下为数据库操作 */
|
||||||
// 获取成就概况
|
// 获取成就概况
|
||||||
async function getAchievementsOverview(): Promise<{
|
async function getAchiOverview(): Promise<{
|
||||||
total: number;
|
total: number;
|
||||||
fin: number;
|
fin: number;
|
||||||
}> {
|
}> {
|
||||||
@@ -439,14 +443,19 @@ async function getAchievementsOverview(): Promise<{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取成就系列
|
// 获取成就系列
|
||||||
async function getAchievementSeries(): Promise<TGApp.Sqlite.Achievement.SeriesTable[]> {
|
async function getSeriesData(series?: number): Promise<TGApp.Sqlite.Achievement.SeriesTable[]> {
|
||||||
const db = await TGSqlite.getDB();
|
const db = await TGSqlite.getDB();
|
||||||
const sql = "SELECT * FROM AchievementSeries ORDER BY `order`;";
|
let sql = "SELECT * FROM AchievementSeries ORDER BY `order`;";
|
||||||
|
if (series) {
|
||||||
|
sql = `SELECT *
|
||||||
|
FROM AchievementSeries
|
||||||
|
WHERE id = ${series};`;
|
||||||
|
}
|
||||||
return await db.select(sql);
|
return await db.select(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取成就(某个系列)
|
// 获取成就(某个系列)
|
||||||
async function getAchievements(
|
async function getAchiData(
|
||||||
type: "all" | "series" | "search",
|
type: "all" | "series" | "search",
|
||||||
value?: string,
|
value?: string,
|
||||||
): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
||||||
@@ -483,6 +492,16 @@ async function getAchievements(
|
|||||||
}
|
}
|
||||||
return await db.select(sql);
|
return await db.select(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新成就数据
|
||||||
|
async function setAchiDB(achievement: TGApp.Sqlite.Achievement.SingleTable): Promise<void> {
|
||||||
|
const db = await TGSqlite.getDB();
|
||||||
|
const sql = `UPDATE Achievements
|
||||||
|
SET isCompleted = ${achievement.isCompleted},
|
||||||
|
completedTime = '${achievement.completedTime}'
|
||||||
|
WHERE id = ${achievement.id};`;
|
||||||
|
await db.execute(sql);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="css" scoped>
|
<style lang="css" scoped>
|
||||||
|
|||||||
@@ -39,6 +39,22 @@ export function timestampToDate(timestamp: number): string {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 获取当前时间, YY-MM-DD HH:MM:SS
|
||||||
|
* @since Beta v0.3.6
|
||||||
|
* @returns {string} 当前时间
|
||||||
|
*/
|
||||||
|
export function getNowStr(): string {
|
||||||
|
const now = new Date();
|
||||||
|
const year = now.getFullYear();
|
||||||
|
const month = (now.getMonth() + 1).toString().padStart(2, "0");
|
||||||
|
const date = now.getDate().toString().padStart(2, "0");
|
||||||
|
const hour = now.getHours().toString().padStart(2, "0");
|
||||||
|
const minute = now.getMinutes().toString().padStart(2, "0");
|
||||||
|
const second = now.getSeconds().toString().padStart(2, "0");
|
||||||
|
return `${year}-${month}-${date} ${hour}:${minute}:${second}`;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取设备信息(初始化时)
|
* @description 获取设备信息(初始化时)
|
||||||
* @since Beta v0.3.6
|
* @since Beta v0.3.6
|
||||||
|
|||||||
Reference in New Issue
Block a user