mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-15 09:48:14 +08:00
fix(achievements): 精简代码,完成 IndexedDB 的接轨,删去 dev 相关页面
This commit is contained in:
@@ -102,7 +102,7 @@ import { onMounted, ref } from "vue";
|
||||
// Store
|
||||
import useAchievementsStore from "../store/modules/achievements";
|
||||
// Interface
|
||||
import { Achievements } from "../plugins/UIAF/interface/UIAF";
|
||||
import { Achievements, UIAF_Info, UIAF_Achievement } from "../plugins/UIAF/interface/UIAF";
|
||||
import {
|
||||
Achievement as TGAchievement,
|
||||
AchievementSeries as TGSeries,
|
||||
@@ -112,7 +112,12 @@ import { NameCard } from "../interface/NameCard";
|
||||
import UIAF_Oper from "../plugins/UIAF";
|
||||
// Utils
|
||||
import { createTGWindow } from "../utils/TGWindow";
|
||||
import { ReadAllTGData, ReadTGData, UpdateTGData } from "../utils/TGIndex";
|
||||
import {
|
||||
ReadAllTGData,
|
||||
ReadTGDataByIndex,
|
||||
ReadTGDataByKey,
|
||||
UpdateTGDataByKey,
|
||||
} from "../utils/TGIndex";
|
||||
|
||||
// Store
|
||||
const achievementsStore = useAchievementsStore();
|
||||
@@ -133,7 +138,7 @@ onMounted(() => {
|
||||
// 加载数据,数据源:合并后的本地数据
|
||||
async function loadData() {
|
||||
const seriesDB: TGSeries[] = await ReadAllTGData("AchievementSeries");
|
||||
CardsInfo.value = await ReadTGData("NameCard", "type", 1);
|
||||
CardsInfo.value = await ReadTGDataByIndex("NameCard", "type", 1);
|
||||
// 按照 order 排序
|
||||
seriesList.value = seriesDB.sort((a, b) => a.order - b.order);
|
||||
selectedAchievement.value = await ReadAllTGData("Achievements");
|
||||
@@ -143,7 +148,11 @@ async function loadData() {
|
||||
async function selectSeries(index: number) {
|
||||
selectedIndex.value = index;
|
||||
selectedSeries.value = seriesList.value[index].id;
|
||||
selectedAchievement.value = await ReadTGData("Achievements", "series", selectedSeries.value);
|
||||
selectedAchievement.value = await ReadTGDataByIndex(
|
||||
"Achievements",
|
||||
"series",
|
||||
selectedSeries.value
|
||||
);
|
||||
if (selectedSeries.value !== 0 && selectedSeries.value !== 17) {
|
||||
getCardInfo.value = CardsInfo.value.find(card => card.name === seriesList.value[index].card)!;
|
||||
} else {
|
||||
@@ -174,8 +183,8 @@ async function importJson() {
|
||||
},
|
||||
],
|
||||
});
|
||||
if (selectedFile && (await UIAF_Oper.importOper.checkUIAFData(<string>selectedFile))) {
|
||||
const remoteRaw: string | false = await UIAF_Oper.importOper.readUIAFData(<string>selectedFile);
|
||||
if (selectedFile && (await UIAF_Oper.checkUIAFData(<string>selectedFile))) {
|
||||
const remoteRaw: string | false = await UIAF_Oper.readUIAFData(<string>selectedFile);
|
||||
if (remoteRaw === false) {
|
||||
await dialog.message("文件格式不正确,导入失败");
|
||||
return;
|
||||
@@ -185,7 +194,7 @@ async function importJson() {
|
||||
remoteData.list.map(async data => {
|
||||
// 获取 id
|
||||
const id = data.id;
|
||||
let localData: TGAchievement = (await ReadTGData("Achievements", "id", id))[0];
|
||||
let localData: TGAchievement = (await ReadTGDataByKey("Achievements", [id]))[0];
|
||||
// 获取 timeStamp 2023-03-15 00:00:00
|
||||
const localTime = localData.completed_time;
|
||||
// 如果本地数据不存在,或者本地数据的 timeStamp 小于远程数据的 timeStamp,更新数据
|
||||
@@ -203,21 +212,46 @@ async function importJson() {
|
||||
localData.completed = data.status === 3;
|
||||
}
|
||||
// 更新数据
|
||||
await UpdateTGData("Achievements", "id", id, localData);
|
||||
await UpdateTGDataByKey("Achievements", localData);
|
||||
});
|
||||
const fin_achievements = (await ReadTGData("Achievements", "completed", true)).length;
|
||||
const total_achievements = (await ReadAllTGData("Achievements")).length;
|
||||
await achievementsStore.flushData(fin_achievements, total_achievements);
|
||||
// 更新成就系列的完成数
|
||||
const seriesDB = await ReadAllTGData("AchievementSeries");
|
||||
seriesDB.map(async data => {
|
||||
const seriesId = data.id;
|
||||
const achievementsDB = await ReadTGDataByIndex("Achievements", "series", seriesId);
|
||||
data.completed_count = achievementsDB.filter(data => {
|
||||
return data.completed === true;
|
||||
}).length;
|
||||
await UpdateTGDataByKey("AchievementSeries", data);
|
||||
});
|
||||
const achievementsDB = await ReadAllTGData("Achievements");
|
||||
const fin_achievements = achievementsDB.filter(data => {
|
||||
return data.completed === true;
|
||||
}).length;
|
||||
const total_achievements = achievementsDB.length;
|
||||
console.log(fin_achievements, total_achievements);
|
||||
achievementsStore.flushData(total_achievements, fin_achievements);
|
||||
// 刷新数据
|
||||
await loadData();
|
||||
}
|
||||
}
|
||||
// 导出
|
||||
async function exportJson() {
|
||||
// 判断是否有数据
|
||||
if (achievementsStore.fin_achievements === 0) {
|
||||
await dialog.message("没有数据可以导出");
|
||||
return;
|
||||
}
|
||||
// 获取本地数据
|
||||
const achievements = await ReadTGData("Achievements", "completed", true);
|
||||
const achievements = (await ReadAllTGData("Achievements")).filter(data => {
|
||||
return data.progress !== 0 || data.completed === true;
|
||||
});
|
||||
let UIAF_DATA = {
|
||||
info: {} as UIAF_Info,
|
||||
list: [] as UIAF_Achievement[],
|
||||
};
|
||||
// 转换数据
|
||||
let achievementsList = achievements.map(data => {
|
||||
UIAF_DATA.list = achievements.map(data => {
|
||||
let status;
|
||||
// 计算点数但是没有完成
|
||||
if (data.progress !== 0 && data.completed === false) {
|
||||
@@ -238,6 +272,7 @@ async function exportJson() {
|
||||
status: status,
|
||||
};
|
||||
});
|
||||
UIAF_DATA.info = await UIAF_Oper.getUIAFInfo();
|
||||
const is_save = await dialog.save({
|
||||
filters: [
|
||||
{
|
||||
@@ -247,7 +282,7 @@ async function exportJson() {
|
||||
],
|
||||
});
|
||||
if (is_save) {
|
||||
await fs.writeTextFile(is_save, JSON.stringify(achievementsList, null, 4));
|
||||
await fs.writeTextFile(is_save, JSON.stringify(UIAF_DATA));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -57,7 +57,6 @@ import useAppStore from "../store/modules/app";
|
||||
import useAchievementsStore from "../store/modules/achievements";
|
||||
import { dialog, fs } from "@tauri-apps/api";
|
||||
import { BaseDirectory } from "@tauri-apps/api/fs";
|
||||
import { TGAppDataList } from "../data";
|
||||
|
||||
// Store
|
||||
const appStore = useAppStore();
|
||||
@@ -77,7 +76,7 @@ function changeRenderMode() {
|
||||
// 打开用户数据目录
|
||||
async function openMergeData() {
|
||||
await dialog.open({
|
||||
defaultPath: appStore.dataPath.merge,
|
||||
defaultPath: appStore.dataPath.user,
|
||||
filters: [],
|
||||
});
|
||||
}
|
||||
@@ -100,14 +99,7 @@ async function deleteData() {
|
||||
await dialog.message("用户数据已删除!");
|
||||
await achievementsStore.init();
|
||||
await fs.createDir("userData", { dir: BaseDirectory.AppLocalData });
|
||||
await fs.createDir("mergeData", { dir: BaseDirectory.AppLocalData });
|
||||
await fs.createDir("tempData", { dir: BaseDirectory.AppLocalData });
|
||||
TGAppDataList.MergeData.map(async item => {
|
||||
await fs.writeFile(
|
||||
`${appStore.dataPath.merge}\\${item.name}`,
|
||||
JSON.stringify(item.data, null, 4)
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
// 删除临时数据
|
||||
|
||||
@@ -1,203 +0,0 @@
|
||||
<template>
|
||||
<h1>开发</h1>
|
||||
<v-card class="common-card">
|
||||
<v-list>
|
||||
<v-list-item @click="devInit" prepend-icon="mdi-refresh">
|
||||
<v-list-item-title>初始化开发</v-list-item-title>
|
||||
</v-list-item>
|
||||
<v-list-item @click="parseAchievement" prepend-icon="mdi-export">
|
||||
<v-list-item-title>解析成就数据</v-list-item-title>
|
||||
</v-list-item>
|
||||
<v-list-item @click="mergeAchievement" prepend-icon="mdi-export">
|
||||
<v-list-item-title>合并成就数据</v-list-item-title>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import useDevStore from "../store/modules/dev";
|
||||
import useAppStore from "../store/modules/app";
|
||||
import { useRouter } from "vue-router";
|
||||
import { dialog, fs } from "@tauri-apps/api";
|
||||
import { SnapHutaoData } from "../plugins/Snap.Hutao";
|
||||
import {
|
||||
Achievement as HutaoAchievement,
|
||||
AchievementGoal as HutaoGoal,
|
||||
} from "../plugins/Snap.Hutao/interface/achievement";
|
||||
import { PaimonMoeData } from "../plugins/Paimon.moe";
|
||||
import { AchievementSeries as PaimonSeries } from "../plugins/Paimon.moe/interface/achievement";
|
||||
import {
|
||||
Achievement as TGAchievement,
|
||||
AchievementMap as TGAchievementMap,
|
||||
AchievementSeries as TGSeries,
|
||||
SeriesMap as TGSeriesMap,
|
||||
} from "../interface/achievements";
|
||||
import TGMap from "../utils/TGMap";
|
||||
import { TGAppData } from "../data";
|
||||
|
||||
// Store
|
||||
const appStore = useAppStore();
|
||||
const devStore = useDevStore();
|
||||
|
||||
async function devInit() {
|
||||
await devStore.init();
|
||||
await dialog.message("初始化完成!");
|
||||
// 跳转到首页
|
||||
const router = useRouter();
|
||||
await router.push({ path: "/", replace: true });
|
||||
}
|
||||
|
||||
async function parseAchievement() {
|
||||
const appDataDir = appStore.devPath.app;
|
||||
// 读取原始数据
|
||||
const hutaoAchievementData: HutaoAchievement[] = SnapHutaoData.Achievement.data;
|
||||
const hutaoGoalData: HutaoGoal[] = SnapHutaoData.AchievementGoal.data;
|
||||
const paimonSeriesMap: TGMap<PaimonSeries> = new TGMap<PaimonSeries>(
|
||||
PaimonMoeData.Achievement.data
|
||||
);
|
||||
// 新建目标数据
|
||||
const achievementSeries: TGSeries[] = [];
|
||||
const achievement: TGAchievement[] = [];
|
||||
// 先解析 Hutao 的成就数据
|
||||
hutaoGoalData.map(hutaoGoalItem => {
|
||||
const achievementSeriesItem: TGSeries = {
|
||||
id: hutaoGoalItem.Id,
|
||||
order: hutaoGoalItem.Order,
|
||||
name: hutaoGoalItem.Name,
|
||||
version: "",
|
||||
card: undefined,
|
||||
icon: `/source/achievementSeries/${hutaoGoalItem.Id}.webp`,
|
||||
};
|
||||
achievementSeries.push(achievementSeriesItem);
|
||||
});
|
||||
hutaoAchievementData.map(hutaoAchievementItem => {
|
||||
const achievementItem: TGAchievement = {
|
||||
id: hutaoAchievementItem.Id,
|
||||
series: hutaoAchievementItem.Goal,
|
||||
order: hutaoAchievementItem.Order,
|
||||
name: hutaoAchievementItem.Title,
|
||||
description: hutaoAchievementItem.Description,
|
||||
reward: hutaoAchievementItem.FinishReward.ID,
|
||||
version: "",
|
||||
progress: hutaoAchievementItem.Progress,
|
||||
};
|
||||
achievement.push(achievementItem);
|
||||
});
|
||||
// 再解析 Paimon.moe 的成就数据
|
||||
paimonSeriesMap.forEach(paimonSeries => {
|
||||
const seriesItem: TGSeries | undefined = achievementSeries.find(
|
||||
achievementSeriesItem => achievementSeriesItem.name === paimonSeries.name
|
||||
);
|
||||
// 成就版本-暂存
|
||||
let achievementVersion: string = "";
|
||||
paimonSeries.achievements.map(paimonAchievementItem => {
|
||||
if (Array.isArray(paimonAchievementItem)) {
|
||||
paimonAchievementItem.map(paimonAchievement => {
|
||||
// 查找成就中 id 相同的成就
|
||||
const achievementItem: TGAchievement | undefined = achievement.find(
|
||||
achievementItem => achievementItem.id === paimonAchievement.id
|
||||
);
|
||||
if (achievementItem) {
|
||||
// 更新数据
|
||||
achievementItem.version = paimonAchievement.ver;
|
||||
if (seriesItem) {
|
||||
if (achievementVersion === "") {
|
||||
achievementVersion = paimonAchievement.ver;
|
||||
} else {
|
||||
// 比较 v1.1 和 v1.2 的大小
|
||||
if (achievementVersion < paimonAchievement.ver) {
|
||||
achievementVersion = paimonAchievement.ver;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// 查找成就中 id 相同的成就
|
||||
const achievementItem: TGAchievement | undefined = achievement.find(
|
||||
achievementItem => achievementItem.id === paimonAchievementItem.id
|
||||
);
|
||||
if (achievementItem) {
|
||||
// 更新数据
|
||||
achievementItem.version = paimonAchievementItem.ver;
|
||||
if (seriesItem) {
|
||||
if (achievementVersion === "") {
|
||||
achievementVersion = paimonAchievementItem.ver;
|
||||
} else {
|
||||
// 比较 v1.1 和 v1.2 的大小
|
||||
if (achievementVersion < paimonAchievementItem.ver) {
|
||||
achievementVersion = paimonAchievementItem.ver;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
// 更新成就系列版本
|
||||
if (seriesItem && achievementVersion !== "") {
|
||||
seriesItem.version = achievementVersion;
|
||||
}
|
||||
});
|
||||
// 输出数据
|
||||
await fs.writeFile(
|
||||
`${appDataDir}\\achievementSeries.json`,
|
||||
JSON.stringify(achievementSeries, null, 4)
|
||||
);
|
||||
await fs.writeFile(`${appDataDir}\\achievements.json`, JSON.stringify(achievement, null, 4));
|
||||
await dialog.message("文件已导出至 " + appDataDir);
|
||||
}
|
||||
async function mergeAchievement() {
|
||||
const mergeDataDir = appStore.devPath.merge;
|
||||
// 读取原始数据
|
||||
const oriAchievement = TGAppData.AppData.achievements;
|
||||
const oriSeries = TGAppData.AppData.achievementSeries;
|
||||
// 读取合并数据
|
||||
const transSeries: TGMap<TGSeriesMap> = new TGMap<TGSeriesMap>();
|
||||
const transAchievement: TGMap<TGAchievementMap> = new TGMap<TGAchievementMap>();
|
||||
// 先遍历成就系列生成成就系列数据
|
||||
oriSeries.map(oriSeriesItem => {
|
||||
transSeries.set(oriSeriesItem.id, {
|
||||
id: oriSeriesItem.id,
|
||||
order: oriSeriesItem.order,
|
||||
name: oriSeriesItem.name,
|
||||
card: oriSeriesItem.card,
|
||||
icon: oriSeriesItem.icon,
|
||||
achievements: [],
|
||||
total_count: 0,
|
||||
completed_count: 0,
|
||||
});
|
||||
});
|
||||
// 遍历成就
|
||||
oriAchievement.map(oriAchievementItem => {
|
||||
// 生成成就数据
|
||||
transAchievement.set(oriAchievementItem.id, {
|
||||
id: oriAchievementItem.id,
|
||||
series: oriAchievementItem.series,
|
||||
order: oriAchievementItem.order,
|
||||
name: oriAchievementItem.name,
|
||||
description: oriAchievementItem.description,
|
||||
reward: oriAchievementItem.reward,
|
||||
completed: false,
|
||||
});
|
||||
// 默认成就系列是完备的,所以不需要判断成就系列是否存在
|
||||
// 更新成就系列数据的 achievements 跟 total_count
|
||||
const seriesItem = transSeries.get(oriAchievementItem.series);
|
||||
seriesItem.achievements.push(oriAchievementItem.id);
|
||||
seriesItem.total_count += 1;
|
||||
transSeries.set(oriAchievementItem.series, seriesItem);
|
||||
});
|
||||
// 写入文件
|
||||
await fs.writeTextFile(
|
||||
`${mergeDataDir}\\achievementSeries.json`,
|
||||
JSON.stringify(transSeries.getMap(), null, 4)
|
||||
);
|
||||
await fs.writeTextFile(
|
||||
`${mergeDataDir}\\achievements.json`,
|
||||
JSON.stringify(transAchievement.getMap(), null, 4)
|
||||
);
|
||||
await dialog.message("文件已导出至 " + mergeDataDir);
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="css"></style>
|
||||
@@ -22,13 +22,6 @@
|
||||
>查看</v-btn
|
||||
>
|
||||
<v-card-subtitle>id:{{ item.post_id }}</v-card-subtitle>
|
||||
<v-btn
|
||||
v-show="showLog"
|
||||
@click="logPost(item.post_id)"
|
||||
prepend-icon="mdi-arrow-right-circle"
|
||||
class="ms-2 card-btn"
|
||||
>原始数据</v-btn
|
||||
>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</div>
|
||||
@@ -50,16 +43,10 @@
|
||||
class="ms-2 card-btn"
|
||||
>查看</v-btn
|
||||
>
|
||||
<v-card-subtitle>id:{{ item.post_id }}</v-card-subtitle>
|
||||
<v-btn v-if="item.status === 1" color="ms-2 card-btn-0">进行中</v-btn>
|
||||
<v-btn v-else-if="item.status === 2" color="ms-2 card-btn-2">已结束</v-btn>
|
||||
<v-btn v-else color="ms-2 card-btn-1">评选中</v-btn>
|
||||
<v-btn
|
||||
v-show="showLog"
|
||||
@click="logPost(item.post_id)"
|
||||
prepend-icon="mdi-arrow-right-circle"
|
||||
class="ms-2 card-btn"
|
||||
>原始数据</v-btn
|
||||
>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</div>
|
||||
@@ -77,13 +64,6 @@
|
||||
>查看</v-btn
|
||||
>
|
||||
<v-card-subtitle>id:{{ item.post_id }}</v-card-subtitle>
|
||||
<v-btn
|
||||
v-show="showLog"
|
||||
@click="logPost(item.post_id)"
|
||||
prepend-icon="mdi-arrow-right-circle"
|
||||
class="ms-2 card-btn"
|
||||
>原始数据</v-btn
|
||||
>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</div>
|
||||
@@ -93,7 +73,6 @@
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
import useDevStore from "../store/modules/dev";
|
||||
import useAppStore from "../store/modules/app";
|
||||
import {
|
||||
MysPostType,
|
||||
@@ -109,7 +88,6 @@ import { createTGWindow } from "../utils/TGWindow";
|
||||
import { parseMys } from "../utils/MysParse";
|
||||
|
||||
// Store
|
||||
const devStore = useDevStore();
|
||||
const appStore = useAppStore();
|
||||
|
||||
// 渲染模式
|
||||
@@ -131,7 +109,6 @@ const postData = ref({
|
||||
activity: [] as CardDataType[],
|
||||
news: [] as CardDataType[],
|
||||
});
|
||||
const showLog = ref(devStore.showDev);
|
||||
|
||||
onMounted(async () => {
|
||||
const noticeRaw: ResponseNewsList = await http
|
||||
|
||||
Reference in New Issue
Block a user