From 7189b65f3cbd94d7f658d4e04aaf586da1d19f5b Mon Sep 17 00:00:00 2001 From: BTMuli Date: Sat, 6 May 2023 01:40:07 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20feat(sqlite):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20GameAccount=20=E8=A1=A8=E7=94=A8=E4=BA=8E=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E6=B8=B8=E6=88=8F=E8=B4=A6=E5=8F=B7=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Config.vue | 7 ++++- src/pages/User.vue | 59 ++++++++++++++++++++++++++++++++++++++----- src/utils/TGSql.ts | 33 ++++++++++++++++++++++-- src/utils/TGSqlite.ts | 44 +++++++++++++++++--------------- 4 files changed, 112 insertions(+), 31 deletions(-) diff --git a/src/pages/Config.vue b/src/pages/Config.vue index bba07ce3..26ffd05f 100644 --- a/src/pages/Config.vue +++ b/src/pages/Config.vue @@ -450,7 +450,12 @@ async function inputCookie () { // 获取 Cookie async function readCookie () { - const cookie = JSON.parse(await TGSqlite.getCookie()); + const getCookie = await TGSqlite.getDataByKey("AppData", "key", "cookie") as Array<{ + key: string; + value: string; + updated: string; + }>; + const cookie = JSON.parse(getCookie[0].value); if (cookie) { confirmShow.value = false; let cookieStr = ""; diff --git a/src/pages/User.vue b/src/pages/User.vue index 2e8d41b2..ceb5ec22 100644 --- a/src/pages/User.vue +++ b/src/pages/User.vue @@ -46,7 +46,12 @@ export interface tokenRes { } onMounted(async () => { - cookie.value = JSON.parse(await TGSqlite.getCookie()) as BTMuli.User.Base.Cookie; + const getCookie = await TGSqlite.getDataByKey("AppData", "key", "cookie") as Array<{ + key: string; + value: string; + updated: string; + }>; + cookie.value = JSON.parse(getCookie[0].value) as BTMuli.User.Base.Cookie; }); // 根据获取到的 cookie.login_ticket 获取 stoken 和 ltoken @@ -80,7 +85,10 @@ async function saveToken () { // 验证 stoken 的有效性 async function vertifyStoken () { // 获取 stoken - const stoken = await TGSqlite.getAppDataItem("stoken"); + const stoken = (await TGSqlite.getDataByKey("AppData", "key", "stoken") as unknown as Array<{ + key: string; + value: string; + }>)[0].value as string; console.log("stoken", stoken); const vertifyRes = await TGRequest.User.vetifyStoken(cookie.value, stoken); console.log(vertifyRes); @@ -88,7 +96,10 @@ async function vertifyStoken () { // 获取 ltoken async function getLToken () { - const stoken = await TGSqlite.getAppDataItem("stoken"); + const stoken = (await TGSqlite.getDataByKey("AppData", "key", "stoken") as unknown as Array<{ + key: string; + value: string; + }>)[0].value as string; console.log("stoken", stoken); const tokenRes = await TGRequest.User.getLToken(cookie.value, stoken); console.log(tokenRes); @@ -96,7 +107,10 @@ async function getLToken () { // 获取 cookieToken, done, 但是登录失效 async function getCookieToken () { - const stoken = await TGSqlite.getAppDataItem("stoken"); + const stoken = (await TGSqlite.getDataByKey("AppData", "key", "stoken") as unknown as Array<{ + key: string; + value: string; + }>)[0].value as string; console.log("stoken", stoken); const cookieRes = await TGRequest.User.byStoken.getCookieToken(cookie.value, stoken); console.log(cookieRes); @@ -108,19 +122,50 @@ async function getUserGameCard () { console.log(gameCard); } -// 获取绑定角色 done,但是登录失效 +// 通过 stoken 获取绑定角色,但是登录失效 async function getBindRole () { const ck = TGUtils.Tools.cookieToString(cookie.value); - const stoken = await TGSqlite.getAppDataItem("stoken"); + const stoken = (await TGSqlite.getDataByKey("AppData", "key", "stoken") as unknown as Array<{ + key: string; + value: string; + }>)[0].value as string; const bindRole = await TGRequest.User.byStoken.getAccounts(ck, stoken); console.log(bindRole); } -// 获取绑定角色 v2, done,但是登录失效 +// 通过 cookie 获取绑定角色 async function getBindRoleV2 () { const ck = TGUtils.Tools.cookieToString(cookie.value); const bindRole = await TGRequest.User.byCookie.getAccounts(ck); console.log(bindRole); + // 如果是数组,说明数据获取成功 + if (Array.isArray(bindRole)) { + bindRole.map(async (role: BTMuli.User.Game.Account) => { + const sql = ` + INSERT INTO GameAccount (gameBiz, gameUid, isChosen, isOfficial, level, nickname, region, regionName, updated) + Values ('${role.game_biz}', '${role.game_uid}', ${role.is_chosen ? 1 : 0}, ${role.is_official ? 1 : 0}, '${role.level}', '${role.nickname}', '${role.region}', '${role.region_name}', datetime('now', 'localtime') + ON CONFILCT (gameBiz, gameUid) DO UPDATE SET + isChosen = ${role.is_chosen ? 1 : 0}, + isOfficial = ${role.is_official ? 1 : 0}, + level = '${role.level}', + nickname = '${role.nickname}', + region = '${role.region}', + regionName = '${role.region_name}', + updated = datetime('now', 'localtime'); + `; + // 保存到数据库 + await TGSqlite.saveData(sql); + }); + console.log("保存成功"); + } else { + await dialog.message( + bindRole.message, + { + type: "error", + title: `获取绑定角色失败,retcode: ${bindRole.retcode}`, + }, + ); + } } diff --git a/src/utils/TGSql.ts b/src/utils/TGSql.ts index 155516ba..98a1fd06 100644 --- a/src/utils/TGSql.ts +++ b/src/utils/TGSql.ts @@ -2,7 +2,7 @@ * @file utils TGSql.ts * @description 数据库sql语句 * @author BTMuli - * @since Alpha v0.1.4 + * @since Alpha v0.2.0 */ import { app } from "@tauri-apps/api"; @@ -28,6 +28,33 @@ function initAppTable (): string[] { return sqlRes; } +/** + * @description 初始化游戏账号数据表 + * @since Alpha v0.2.0 + * @see BTMuli.User.Game.Account + * @returns {string[]} sql + */ +function initGameAccountTable (): string[] { + const sqlRes = []; + // 创建游戏账号数据表 + sqlRes.push(` + CREATE TABLE IF NOT EXISTS GameAccount + ( + gameBiz TEXT PRIMARY KEY, + gameUid TEXT DEFAULT NULL, + isChosen BOOLEAN DEFAULT 0, + isOfficial BOOLEAN DEFAULT 0, + level INTEGER DEFAULT 0, + nickname TEXT DEFAULT NULL, + region TEXT DEFAULT NULL, + regionName TEXT DEFAULT NULL, + updated TEXT DEFAULT NULL, + PRIMARY KEY (gameBiz, gameUid) + ); + `); + return sqlRes; +} + /** * @description 初始化成就系列数据表 * @since Alpha v0.1.4 @@ -126,14 +153,16 @@ function initNameCardTable (): string[] { `); return sqlRes; } + /** * @description 初始化数据库表 - * @since Alpha v0.1.4 + * @since Alpha v0.2.0 * @returns {string[]} sql */ export function initSQLiteTable (): string[] { const sqlRes = []; sqlRes.push(...initAppTable()); + sqlRes.push(...initGameAccountTable()); sqlRes.push(...initAchievementSeriesTable()); sqlRes.push(...initAchievementTable()); sqlRes.push(...initNameCardTable()); diff --git a/src/utils/TGSqlite.ts b/src/utils/TGSqlite.ts index b3bb5df3..2e8aad92 100644 --- a/src/utils/TGSqlite.ts +++ b/src/utils/TGSqlite.ts @@ -30,6 +30,7 @@ class TGSqlite { "AppData", "Achievements", "AchievementSeries", + "GameAccount", "NameCard", ]; @@ -68,18 +69,33 @@ class TGSqlite { } /** - * @description 获取应用数据某一项 + * @description 封装-根据 table keys 获取数据 * @memberof TGSqlite * @since Alpha v0.2.0 - * @param {string} key - * @returns {Promise} + * @param {string} table 表名 + * @param {string} keyName 键名 + * @param {string} keyValue 键值 + * @returns {Promise} 数据 */ - public async getAppDataItem (key: string): Promise { + public async getDataByKey (table: string, keyName: string, keyValue: string): Promise { const db = await Database.load(this.dbPath); - const sql = `SELECT value FROM AppData WHERE key='${key}';`; - const res: Array<{ value: string }> = await db.select(sql); + const sql = `SELECT * FROM ${table} WHERE ${keyName}='${keyValue}';`; + const res: unknown[] = await db.select(sql); + await db.close(); + return res; + } + + /** + * @description 封装-保存数据 + * @memberof TGSqlite + * @since Alpha v0.2.0 + * @param {string} sql sql语句 + * @returns {Promise} + */ + public async saveData (sql: string): Promise { + const db = await Database.load(this.dbPath); + await db.execute(sql); await db.close(); - return res[0].value; } /** @@ -99,20 +115,6 @@ class TGSqlite { await db.close(); } - /** - * @description 获取 cookie - * @memberof TGSqlite - * @since Alpha v0.2.0 - * @returns {Promise} - */ - public async getCookie (): Promise { - const db = await Database.load(this.dbPath); - const sql = "SELECT value FROM AppData WHERE key='cookie';"; - const res: Array<{ value: string }> = await db.select(sql); - await db.close(); - return res[0].value; - } - /** * @description 保存 appData * @memberof TGSqlite