mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-14 09:38:13 +08:00
🌱 初步迁移非重复数据库操作 #60
This commit is contained in:
@@ -20,7 +20,7 @@
|
|||||||
<!-- 左侧菜单 -->
|
<!-- 左侧菜单 -->
|
||||||
<div class="left-wrap">
|
<div class="left-wrap">
|
||||||
<v-list
|
<v-list
|
||||||
v-for="series in seriesList"
|
v-for="series in allSeriesData"
|
||||||
:key="series.id"
|
:key="series.id"
|
||||||
class="card-left"
|
class="card-left"
|
||||||
@click="selectSeries(series.id)"
|
@click="selectSeries(series.id)"
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
:key="achievement.id"
|
:key="achievement.id"
|
||||||
class="card-right"
|
class="card-right"
|
||||||
:style="{ transform: `translateY(${translateY})` }"
|
:style="{ transform: `translateY(${translateY})` }"
|
||||||
:title="seriesList.find((item) => item.id === achievement.series)?.name ?? ''"
|
:title="allSeriesData.find((item) => item.id === achievement.series)?.name ?? ''"
|
||||||
>
|
>
|
||||||
<div v-if="achievement.progress !== 0" class="achievement-progress">
|
<div v-if="achievement.progress !== 0" class="achievement-progress">
|
||||||
{{ achievement.progress }}
|
{{ achievement.progress }}
|
||||||
@@ -138,7 +138,7 @@ const getCardImg = computed(() => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
// series
|
// series
|
||||||
const seriesList = ref<TGApp.Sqlite.Achievement.SeriesTable[]>([]);
|
const allSeriesData = ref<TGApp.Sqlite.Achievement.SeriesTable[]>([]);
|
||||||
const selectedSeries = ref<number>(-1);
|
const selectedSeries = ref<number>(-1);
|
||||||
const selectedAchievement = ref<TGApp.Sqlite.Achievement.SingleTable[]>([]);
|
const selectedAchievement = ref<TGApp.Sqlite.Achievement.SingleTable[]>([]);
|
||||||
const renderAchievement = computed(() => {
|
const renderAchievement = computed(() => {
|
||||||
@@ -161,7 +161,7 @@ const route = useRoute();
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
const { total, fin } = await TGSqlite.getAchievementsOverview();
|
const { total, fin } = await getAchievementsOverview();
|
||||||
achievementsStore.flushData(total, fin);
|
achievementsStore.flushData(total, fin);
|
||||||
title.value = achievementsStore.title;
|
title.value = achievementsStore.title;
|
||||||
});
|
});
|
||||||
@@ -169,15 +169,11 @@ onBeforeMount(async () => {
|
|||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
loadingTitle.value = "正在获取成就系列数据";
|
loadingTitle.value = "正在获取成就系列数据";
|
||||||
seriesList.value = await TGSqlite.getAchievementSeries();
|
allSeriesData.value = await getAchievementSeries();
|
||||||
achievementsStore.lastVersion = seriesList.value.reduce((prev, curr) => {
|
achievementsStore.lastVersion = await TGSqlite.getLatestAchievementVersion();
|
||||||
return prev.version > curr.version ? prev : curr;
|
|
||||||
}).version;
|
|
||||||
loadingTitle.value = "正在获取成就数据";
|
loadingTitle.value = "正在获取成就数据";
|
||||||
selectedAchievement.value = await TGSqlite.getAchievements();
|
selectedAchievement.value = await getAchievements("all");
|
||||||
await nextTick(() => {
|
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);
|
||||||
}
|
}
|
||||||
@@ -224,16 +220,50 @@ 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) {
|
||||||
showSnackbar({
|
let res, res2;
|
||||||
color: "warn",
|
res = await showConfirm({
|
||||||
text: "已经选中该系列",
|
title: "请输入要执行的批量操作",
|
||||||
|
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 TGSqlite.getAchievements(index);
|
selectedAchievement.value = await getAchievements("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);
|
||||||
@@ -266,7 +296,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 TGSqlite.searchAchievements(search.value);
|
selectedAchievement.value = await getAchievements("search", search.value);
|
||||||
if (selectedAchievement.value.length === 0) {
|
if (selectedAchievement.value.length === 0) {
|
||||||
showSnackbar({
|
showSnackbar({
|
||||||
color: "error",
|
color: "error",
|
||||||
@@ -395,6 +425,64 @@ async function handleImportOuter(app: string): Promise<void> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 以下为数据库操作 */
|
||||||
|
// 获取成就概况
|
||||||
|
async function getAchievementsOverview(): Promise<{
|
||||||
|
total: number;
|
||||||
|
fin: number;
|
||||||
|
}> {
|
||||||
|
const db = await TGSqlite.getDB();
|
||||||
|
const sql = "SELECT SUM(totalCount) AS total, SUM(finCount) AS fin FROM AchievementSeries;";
|
||||||
|
const res: Array<{ total: number; fin: number }> = await db.select(sql);
|
||||||
|
return res[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取成就系列
|
||||||
|
async function getAchievementSeries(): Promise<TGApp.Sqlite.Achievement.SeriesTable[]> {
|
||||||
|
const db = await TGSqlite.getDB();
|
||||||
|
const sql = "SELECT * FROM AchievementSeries ORDER BY `order`;";
|
||||||
|
return await db.select(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取成就(某个系列)
|
||||||
|
async function getAchievements(
|
||||||
|
type: "all" | "series" | "search",
|
||||||
|
value?: string,
|
||||||
|
): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
||||||
|
const db = await TGSqlite.getDB();
|
||||||
|
let sql = "";
|
||||||
|
if (type === "all" || (type == "series" && value === undefined)) {
|
||||||
|
sql = "SELECT * FROM Achievements ORDER BY isCompleted, `order`;";
|
||||||
|
} else if (type === "series") {
|
||||||
|
sql = `SELECT *
|
||||||
|
FROM Achievements
|
||||||
|
WHERE series = ${value}
|
||||||
|
ORDER BY isCompleted, \`order\`;`;
|
||||||
|
} else if (type === "search") {
|
||||||
|
if (value === undefined) {
|
||||||
|
showSnackbar({
|
||||||
|
color: "error",
|
||||||
|
text: "搜索内容不能为空",
|
||||||
|
});
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
if (value.startsWith("v")) {
|
||||||
|
const version = value.replace("v", "");
|
||||||
|
sql = `SELECT *
|
||||||
|
FROM Achievements
|
||||||
|
WHERE version LIKE '%${version}%'
|
||||||
|
ORDER BY isCompleted, \`order\`;`;
|
||||||
|
} else {
|
||||||
|
sql = `SELECT *
|
||||||
|
FROM Achievements
|
||||||
|
WHERE name LIKE '%${value}%'
|
||||||
|
OR description LIKE '%${value}%'
|
||||||
|
ORDER BY isCompleted, \`order\`;`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return await db.select(sql);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="css" scoped>
|
<style lang="css" scoped>
|
||||||
|
|||||||
@@ -198,17 +198,6 @@ class Sqlite {
|
|||||||
await this.initDB();
|
await this.initDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 获取成就系列列表
|
|
||||||
* @since Beta v0.3.3
|
|
||||||
* @returns {Promise<TGApp.Sqlite.Achievement.SeriesTable[]>}
|
|
||||||
*/
|
|
||||||
public async getAchievementSeries(): Promise<TGApp.Sqlite.Achievement.SeriesTable[]> {
|
|
||||||
const db = await this.getDB();
|
|
||||||
const sql = "SELECT * FROM AchievementSeries ORDER BY `order`;";
|
|
||||||
return await db.select(sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取成就系列对应的名片
|
* @description 获取成就系列对应的名片
|
||||||
* @since Beta v0.3.3
|
* @since Beta v0.3.3
|
||||||
@@ -224,41 +213,6 @@ class Sqlite {
|
|||||||
return res[0];
|
return res[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 获取成就列表
|
|
||||||
* @since Beta v0.3.3
|
|
||||||
* @param {number} [seriesId] 系列 ID
|
|
||||||
* @returns {Promise<TGApp.Sqlite.Achievement.SingleTable[]>}
|
|
||||||
*/
|
|
||||||
public async getAchievements(seriesId?: number): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
|
||||||
const db = await this.getDB();
|
|
||||||
let sql;
|
|
||||||
if (seriesId) {
|
|
||||||
sql = `SELECT *
|
|
||||||
FROM Achievements
|
|
||||||
WHERE series = ${seriesId}
|
|
||||||
ORDER BY isCompleted, \`order\`;`;
|
|
||||||
} else {
|
|
||||||
sql = "SELECT * FROM Achievements ORDER BY isCompleted, `order`;";
|
|
||||||
}
|
|
||||||
return await db.select(sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 获取成就概况
|
|
||||||
* @since Beta v0.3.3
|
|
||||||
* @returns {Promise<{total:number,fin:number}>}
|
|
||||||
*/
|
|
||||||
public async getAchievementsOverview(): Promise<{
|
|
||||||
total: number;
|
|
||||||
fin: number;
|
|
||||||
}> {
|
|
||||||
const db = await this.getDB();
|
|
||||||
const sql = "SELECT SUM(totalCount) AS total, SUM(finCount) AS fin FROM AchievementSeries;";
|
|
||||||
const res: Array<{ total: number; fin: number }> = await db.select(sql);
|
|
||||||
return res[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取最新成就版本
|
* @description 获取最新成就版本
|
||||||
* @since Beta v0.3.3
|
* @since Beta v0.3.3
|
||||||
@@ -271,33 +225,6 @@ class Sqlite {
|
|||||||
return res[0].version;
|
return res[0].version;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 查询成就
|
|
||||||
* @since Beta v0.3.3
|
|
||||||
* @param {string} keyword 关键词
|
|
||||||
* @returns {Promise<TGApp.Sqlite.Achievement.SingleTable[]>}
|
|
||||||
*/
|
|
||||||
public async searchAchievements(
|
|
||||||
keyword: string,
|
|
||||||
): Promise<TGApp.Sqlite.Achievement.SingleTable[]> {
|
|
||||||
const db = await this.getDB();
|
|
||||||
let sql;
|
|
||||||
if (keyword.startsWith("v")) {
|
|
||||||
const version = keyword.replace("v", "");
|
|
||||||
sql = `SELECT *
|
|
||||||
FROM Achievements
|
|
||||||
WHERE version LIKE '%${version}%'
|
|
||||||
ORDER BY isCompleted, \`order\`;`;
|
|
||||||
} else {
|
|
||||||
sql = `SELECT *
|
|
||||||
FROM Achievements
|
|
||||||
WHERE name LIKE '%${keyword}%'
|
|
||||||
OR description LIKE '%${keyword}%'
|
|
||||||
ORDER BY isCompleted, \`order\`;`;
|
|
||||||
}
|
|
||||||
return await db.select(sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 合并 UIAF 数据
|
* @description 合并 UIAF 数据
|
||||||
* @since Beta v0.3.3
|
* @since Beta v0.3.3
|
||||||
|
|||||||
Reference in New Issue
Block a user