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