From b89c3ac1010de158d04ae096c9e3a3530ae820b6 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Tue, 25 Apr 2023 20:57:38 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20add(db):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Config.vue | 30 +++++++++++++++++------------- src/utils/TGSql.ts | 28 ++++++++-------------------- src/utils/TGSqlite.ts | 19 +++++++++++++++++-- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/src/pages/Config.vue b/src/pages/Config.vue index 63c7bc13..7b6a6dac 100644 --- a/src/pages/Config.vue +++ b/src/pages/Config.vue @@ -61,6 +61,18 @@ {{ osVersion }} + + + 更新于 {{ dbInfo.find(item => item.key === "dataUpdated")?.updated }} + + + + 更新于 {{ dbInfo.find(item => item.key === "appVersion")?.updated }} + 设置 @@ -117,7 +129,6 @@ - 路径 @@ -174,6 +185,7 @@ const buildTime = ref(getBuildTime()); // About OS const osPlatform = ref("" as string); const osVersion = ref("" as string); +const dbInfo = ref([] as { key: string, value: string, updated: string }[]); // loading const loading = ref(true as boolean); @@ -199,9 +211,8 @@ onMounted(async () => { versionTauri.value = await app.getTauriVersion(); osPlatform.value = `${await os.platform()}`; osVersion.value = await os.version(); - setTimeout(() => { - loading.value = false; - }, 1000); + dbInfo.value = await TGSqlite.getAppData(); + loading.value = false; }); // 打开外部链接 @@ -257,11 +268,6 @@ function tryConfirm (oper: string) { confirmOper.value = "checkDB"; confirmShow.value = true; break; - case "resetDB": - confirmText.value = "确认重置 SQlite 数据库吗?"; - confirmOper.value = "resetDB"; - confirmShow.value = true; - break; } } @@ -296,9 +302,6 @@ async function doConfirm (oper: string) { case "checkDB": await checkDB(); break; - case "resetDB": - await resetDB(); - break; default: break; } @@ -430,6 +433,7 @@ async function checkDB () { confirmShow.value = true; } else { loadingTitle.value = "正在更新数据库表单..."; + loading.value = true; await TGSqlite.update(); loading.value = false; snackbarText.value = "数据库已是最新!"; @@ -444,7 +448,7 @@ async function resetDB () { loading.value = true; await TGSqlite.reset(); loading.value = false; - snackbarText.value = "数据库已重置!请载入备份数据。"; + snackbarText.value = "数据库已重置!请进行再次检查。"; snackbarColor.value = "success"; snackbar.value = true; } diff --git a/src/utils/TGSql.ts b/src/utils/TGSql.ts index ba90ec50..fd32200a 100644 --- a/src/utils/TGSql.ts +++ b/src/utils/TGSql.ts @@ -25,16 +25,6 @@ function initAppTable (): string[] { updated TEXT DEFAULT NULL ); `); - // 创建触发器 - sqlRes.push(` - CREATE TRIGGER IF NOT EXISTS updateAppData - AFTER UPDATE OF value ON AppData - FOR EACH ROW - BEGIN - UPDATE BBSPost SET isRead = 1, updated = datetime('now', 'localtime') - WHERE created < NEW.value OR modified < NEW.value AND NEW.key = 'bbsPost'; - END; - `); return sqlRes; } @@ -184,9 +174,8 @@ function initAchievementSeriesData (): string[] { const oriData = TGAppData.achievementSeries; oriData.map((data) => { const sql = ` - INSERT INTO AchievementSeries (id, "order", name, version, icon, nameCard, updated) - VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}', '${data.icon}', '${data.card}', datetime('now', 'localtime')) - ON CONFLICT(id) DO NOTHING; + INSERT OR IGNORE INTO AchievementSeries (id, "order", name, version, icon, nameCard, updated) + VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}', '${data.icon}', '${data.card}', datetime('now', 'localtime')); `; return sqlRes.push(sql); }); @@ -203,9 +192,8 @@ function initAchievementData (): string[] { const oriData = TGAppData.achievements; oriData.map((data) => { const sql = ` - INSERT INTO Achievements (id, series, "order", name, description, reward, version, updated) - VALUES (${data.id}, ${data.series}, ${data.order}, '${data.name}', '${data.description}', ${data.reward}, '${data.version}', datetime('now', 'localtime')) - ON CONFLICT(id) DO NOTHING; + INSERT OR IGNORE INTO Achievements (id, series, "order", name, description, reward, version, updated) + VALUES (${data.id}, ${data.series}, ${data.order}, '${data.name}', '${data.description}', ${data.reward}, '${data.version}', datetime('now', 'localtime')); `; return sqlRes.push(sql); }); @@ -222,9 +210,8 @@ function initNameCardData (): string[] { const oriData = TGAppData.nameCards; oriData.map((data) => { const sql = ` - INSERT INTO NameCard (name, description, icon, bg, profile, type, source, updated) - VALUES ('${data.name}', '${data.description}', '${data.icon}', '${data.bg}', '${data.profile}', ${data.type}, '${data.source}', datetime('now', 'localtime')) - ON CONFLICT(id) DO NOTHING; + INSERT OR IGNORE INTO NameCard (name, description, icon, bg, profile, type, source, updated) + VALUES ('${data.name}', '${data.description}', '${data.icon}', '${data.bg}', '${data.profile}', ${data.type}, '${data.source}', datetime('now', 'localtime')); `; return sqlRes.push(sql); }); @@ -258,7 +245,8 @@ export function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] { // 获取完成状态 const isCompleted = achievement.status === 2 || achievement.status === 3; if (isCompleted) { - const completedTime = new Date(achievement.timestamp * 1000).toISOString().replace("T", " ").replace("Z", ""); + const completedTime = new Date(achievement.timestamp * 1000).toISOString().replace("T", " ").slice(0, 19); + console.log(completedTime); sql = ` UPDATE Achievements SET isCompleted = 1, completedTime = '${completedTime}', progress = ${achievement.current}, updated = datetime('now', 'localtime') diff --git a/src/utils/TGSqlite.ts b/src/utils/TGSqlite.ts index 4f8f3615..c03d33c6 100644 --- a/src/utils/TGSqlite.ts +++ b/src/utils/TGSqlite.ts @@ -53,6 +53,20 @@ class TGSqlite { await db.close(); } + /** + * @description 获取数据库信息 + * @memberof TGSqlite + * @since Alpha v0.1.4 + * @returns {Promise<{ key: string, value: string, updated: string }[]>} + */ + public async getAppData (): Promise> { + const db = await Database.load(this.dbPath); + const sql = "SELECT * FROM AppData;"; + const res: Array<{ key: string, value: string, updated: string }> = await db.select(sql); + await db.close(); + return res; + } + /** * @description 已有数据表跟触发器不变的情况下,更新数据库数据 * @memberof TGSqlite @@ -80,8 +94,9 @@ class TGSqlite { // 检测数据表是否都存在 const sqlT = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"; const res: Array<{ name: string }> = await db.select(sqlT); - if (res.length === this.tables.length) { - if (res.every((item) => this.tables.includes(item.name))) { + // 考虑到 sqlite_sequence 表,所以需要 +1 + if (res.length === this.tables.length + 1) { + if (this.tables.every((item) => res.map((i) => i.name).includes(item))) { isVertified = true; } }