🌱 初步迁移非重复数据库操作 #60

This commit is contained in:
BTMuli
2023-11-17 23:47:31 +08:00
parent ff649c2426
commit 6ca5de28ac
2 changed files with 105 additions and 90 deletions

View File

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

View File

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