fix(achievements): 精简代码,完成 IndexedDB 的接轨,删去 dev 相关页面

This commit is contained in:
BTMuli
2023-03-16 00:55:36 +08:00
parent e2e82a2fd9
commit e2211b513f
14 changed files with 124 additions and 383 deletions

View File

@@ -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>

View File

@@ -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)
);
});
}
}
// 删除临时数据

View File

@@ -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>

View File

@@ -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