diff --git a/src/components/userRecord/tur-overview-grid.vue b/src/components/userRecord/tur-overview-grid.vue index d631ed48..6aa51a5a 100644 --- a/src/components/userRecord/tur-overview-grid.vue +++ b/src/components/userRecord/tur-overview-grid.vue @@ -5,6 +5,7 @@ + diff --git a/src/pages/User/Record.vue b/src/pages/User/Record.vue index e2128ebe..381fe12e 100644 --- a/src/pages/User/Record.vue +++ b/src/pages/User/Record.vue @@ -104,6 +104,8 @@ async function refresh(): Promise { const res = await TGRequest.User.getRecord(cookie, user); if (!("retcode" in res)) { await TGLogger.Info(`[UserRecord][refresh][${user.gameUid}] 获取战绩数据成功`); + await TGLogger.Info(`[UserRecord][refresh][${user.gameUid}]`, false); + await TGLogger.Info(JSON.stringify(res), false); loadingTitle.value = "正在保存战绩数据"; await TGSqlite.saveUserRecord(res, user.gameUid); await initUserRecordData(); diff --git a/src/plugins/Sqlite/sql/initData.ts b/src/plugins/Sqlite/sql/initData.ts index b2b6e613..6d804571 100644 --- a/src/plugins/Sqlite/sql/initData.ts +++ b/src/plugins/Sqlite/sql/initData.ts @@ -11,16 +11,16 @@ import { AppAchievementSeriesData, AppNameCardsData, AppCharacterData, -} from "../../../data"; -import { getBuildTime } from "../../../utils/TGBuild"; +} from "../../../data/index.js"; +import { getBuildTime } from "../../../utils/TGBuild.js"; -import initTableSql from "./initTable"; +import initTableSql from "./initTable.js"; import { insertAchievementData, insertAchievementSeriesData, insertNameCardData, insertCharacterData, -} from "./insertData"; +} from "./insertData.js"; /** * @description 初始化应用表数据 diff --git a/src/plugins/Sqlite/sql/insertData.ts b/src/plugins/Sqlite/sql/insertData.ts index f7f8428d..5cfc408f 100644 --- a/src/plugins/Sqlite/sql/insertData.ts +++ b/src/plugins/Sqlite/sql/insertData.ts @@ -4,10 +4,10 @@ * @since Beta v0.3.3 */ -import { transCharacterData, transFloorData } from "../utils/transAbyssData"; -import { timeToSecond } from "../utils/transTime"; -import { transUserRecord } from "../utils/transUserRecord"; -import { transUserRoles } from "../utils/transUserRoles"; +import { transCharacterData, transFloorData } from "../utils/transAbyssData.js"; +import { timeToSecond } from "../utils/transTime.js"; +import { transUserRecord } from "../utils/transUserRecord.js"; +import { transUserRoles } from "../utils/transUserRoles.js"; /** * @description 插入成就数据 diff --git a/src/plugins/Sqlite/utils/transAbyssData.ts b/src/plugins/Sqlite/utils/transAbyssData.ts index a70dc0a6..4d183cbd 100644 --- a/src/plugins/Sqlite/utils/transAbyssData.ts +++ b/src/plugins/Sqlite/utils/transAbyssData.ts @@ -4,7 +4,7 @@ * @since Beta v0.3.9 */ -import { timeToSecond } from "./transTime"; +import { timeToSecond } from "./transTime.js"; /** * @description 将通过 api 获取到的深渊数据转换为数据库中的数据 diff --git a/src/plugins/Sqlite/utils/transUserRecord.ts b/src/plugins/Sqlite/utils/transUserRecord.ts index 77d70e00..3986ded6 100644 --- a/src/plugins/Sqlite/utils/transUserRecord.ts +++ b/src/plugins/Sqlite/utils/transUserRecord.ts @@ -1,7 +1,7 @@ /** * @file plugins/Sqlite/utils/transUserRecord.ts * @description Sqlite 数据转换 用户战绩数据转换模块 - * @since Beta v0.4.3 + * @since Beta v0.4.10 */ /** @@ -79,11 +79,17 @@ function transAvatar(data: TGApp.Game.Record.Avatar[]): string { /** * @description 将统计信息转换为数据库中的数据 - * @since Alpha v0.2.2 + * @since Beta v0.4.10 * @param {TGApp.Game.Record.Stats} data 统计信息 * @return {string} 转换后的统计信息 */ function transStat(data: TGApp.Game.Record.Stats): string { + let combatRole: string; + if (!data.role_combat.is_unlock) { + combatRole = "未解锁"; + } else { + combatRole = `第 ${data.role_combat.max_round_id} 幕`; + } const stats: TGApp.Sqlite.Record.Stats = { activeDays: data.active_day_number, achievementNumber: data.achievement_number, @@ -96,6 +102,7 @@ function transStat(data: TGApp.Game.Record.Stats): string { dendroCulus: data.dendroculus_number, hydroCulus: data.hydroculus_number, sprialAbyss: data.spiral_abyss, + combatRole: combatRole, luxuriousChest: data.luxurious_chest_number, preciousChest: data.precious_chest_number, exquisiteChest: data.exquisite_chest_number, diff --git a/src/types/Game/Record.d.ts b/src/types/Game/Record.d.ts index 216b4882..f5241395 100644 --- a/src/types/Game/Record.d.ts +++ b/src/types/Game/Record.d.ts @@ -1,12 +1,12 @@ /** * @file types/Game/Record.d.ts * @description 原神战绩相关类型定义文件 - * @since Alpha v0.2.2 + * @since Beta v0.4.10 */ /** * @description 原神战绩相关类型定义命名空间 - * @since Alpha v0.2.2 + * @since Beta v0.4.10 * @namespace TGApp.Game.Record * @memberof TGApp.Game */ @@ -47,11 +47,12 @@ declare namespace TGApp.Game.Record { /** * @description 角色信息类型 * @interface Role - * @since Alpha v0.2.0 + * @since Beta v0.4.10 * @property {string} AvatarUrl - 角色头像 // 通常为 "" * @property {string} nickname - 角色昵称 * @property {string} region - 区域 * @property {number} level - 等级 + * @property {string} game_head_icon - 游戏头像 * @return Role */ interface Role { @@ -59,6 +60,7 @@ declare namespace TGApp.Game.Record { nickname: string; region: string; level: number; + game_head_icon: string; } /** @@ -93,7 +95,7 @@ declare namespace TGApp.Game.Record { /** * @description 统计信息类型 * @interface Stats - * @since Alpha v0.2.2 + * @since Beta v0.4.10 * @property {number} active_day_number - 活跃天数 * @property {number} achievement_number - 成就数量 * @property {number} anemoculus_number - 风神瞳数量 @@ -110,6 +112,8 @@ declare namespace TGApp.Game.Record { * @property {number} magic_chest_number - 奇馈宝箱数量 * @property {number} dendroculus_number - 草神瞳数量 * @property {number} hydroculus_number - 水神瞳数量 + * @property {unknown} field_ext_map - 数据对应链接的map,用不到设为 unknown + * @property {CombatStats} role_combat - 幻想真境剧诗数据 * @return Stats */ interface Stats { @@ -129,6 +133,25 @@ declare namespace TGApp.Game.Record { magic_chest_number: number; dendroculus_number: number; hydroculus_number: number; + field_ext_map: unknown; + role_combat: CombatStats; + } + + /** + * @description 幻想真境剧诗数据类型 + * @interface CombatStats + * @since Beta v0.4.10 + * @property {boolean} is_unlock - 是否解锁 + * @property {number} max_round_id - 最大报幕数 + * @property {boolean} has_data - 是否有数据 + * @property {boolean} has_detail_data - 是否有详细数据 + * @return CombatStats + */ + interface CombatStats { + is_unlock: boolean; + max_round_id: number; + has_data: boolean; + has_detail_data: boolean; } /** diff --git a/src/types/Sqlite/Record.d.ts b/src/types/Sqlite/Record.d.ts index c71712b8..85c50ef4 100644 --- a/src/types/Sqlite/Record.d.ts +++ b/src/types/Sqlite/Record.d.ts @@ -1,12 +1,12 @@ /** * @file types/Sqlite/Record.d.ts * @description Sqlite 原神战绩相关类型定义文件 - * @since Beta v0.4.3 + * @since Beta v0.4.10 */ /** * @description Sqlite 原神战绩相关类型定义命名空间 - * @since Beta v0.4.3 + * @since Beta v0.4.10 * @namespace Record * @memberof TGApp.Sqlite */ @@ -78,7 +78,7 @@ declare namespace TGApp.Sqlite.Record { /** * @description 统计信息类型 * @interface Stats - * @since Alpha v0.2.2 + * @since Beta v0.4.10 * @property {number} activeDays - 活跃天数 * @property {number} achievementNumber - 成就达成数 * @property {number} avatarNumber - 获得角色数 @@ -90,6 +90,7 @@ declare namespace TGApp.Sqlite.Record { * @property {number} dendroCulus - 草神瞳数 * @property {number} hydroCulus - 水神瞳数 * @property {string} sprialAbyss - 深境螺旋信息 + * @property {string} combatRole - 幻想真境剧诗 * @property {number} luxuriousChest - 华丽宝箱数 * @property {number} preciousChest - 珍贵宝箱数 * @property {number} exquisiteChest - 精致宝箱数 @@ -109,6 +110,7 @@ declare namespace TGApp.Sqlite.Record { dendroCulus: number; hydroCulus: number; sprialAbyss: string; + combatRole: string; luxuriousChest: number; preciousChest: number; exquisiteChest: number; diff --git a/src/utils/TGShare.ts b/src/utils/TGShare.ts index b0d65f59..3ac7be4a 100644 --- a/src/utils/TGShare.ts +++ b/src/utils/TGShare.ts @@ -1,10 +1,11 @@ /** * @file utils/TGShare.ts * @description 生成分享截图并保存到本地 - * @since Beta v0.4.4 + * @since Beta v0.4.10 */ import { dialog, fs, http, path } from "@tauri-apps/api"; +import type { Response } from "@tauri-apps/api/http"; import html2canvas from "html2canvas"; import showConfirm from "../components/func/confirm.js"; @@ -15,7 +16,7 @@ import { bytesToSize } from "./toolFunc.js"; /** * @description 保存图片-canvas - * @since Beta v0.4.4 + * @since Beta v0.4.10 * @param {Uint8Array} buffer - 图片数据 * @param {string} filename - 文件名 * @param {string} format - 文件格式 @@ -27,54 +28,47 @@ export async function saveCanvasImg( format?: string, ): Promise { if (format === undefined) format = "png"; - await dialog - .save({ - title: "保存图片", - filters: [{ name: "图片", extensions: [format] }], - defaultPath: `${await path.downloadDir()}${path.sep}${filename}.${format}`, - }) - .then(async (res) => { - if (res === null) return; - await fs.writeBinaryFile({ - path: res, - contents: buffer, - }); - }); + const res = await dialog.save({ + title: "保存图片", + filters: [{ name: "图片", extensions: [format] }], + defaultPath: `${await path.downloadDir()}${path.sep}${filename}.${format}`, + }); + if (res === null) { + await TGLogger.Info(`[saveCanvasImg][${filename}] 未选择保存路径`); + return; + } + await fs.writeBinaryFile({ path: res, contents: buffer }); await TGLogger.Info(`[saveCanvasImg][${filename}] 已将图像保存到本地`); } /** * @description 将图片保存到本地 - * @since Alpha v0.2.0 + * @since Beta v0.4.10 * @param {string} url - 图片链接 * @returns {Promise} 图片元素 */ export async function saveImgLocal(url: string): Promise { - return await http - .fetch(url, { - method: "GET", - responseType: http.ResponseType.Binary, - }) - .then(async (res) => { - const buffer = new Uint8Array(res.data); - const blob = new Blob([buffer], { type: "image/png" }); - return URL.createObjectURL(blob); - }); + const res: Response = await http.fetch(url, { + method: "GET", + responseType: http.ResponseType.Binary, + }); + const buffer = new Uint8Array(res.data); + const blob = new Blob([buffer], { type: "image/png" }); + return URL.createObjectURL(blob); } /** * @description 返回图片 buffer - * @since Beta v0.4.4 + * @since Beta v0.4.10 * @param {string} url - 图片链接 * @returns {Promise} 图片 buffer */ export async function getImageBuffer(url: string): Promise { - return await http - .fetch(url, { - method: "GET", - responseType: http.ResponseType.Binary, - }) - .then((res) => new Uint8Array(res.data)); + const res: Response = await http.fetch(url, { + method: "GET", + responseType: http.ResponseType.Binary, + }); + return new Uint8Array(res.data); } /** diff --git a/src/web/request/getGameRecord.ts b/src/web/request/getGameRecord.ts index 46739f4d..dcd3f143 100644 --- a/src/web/request/getGameRecord.ts +++ b/src/web/request/getGameRecord.ts @@ -1,17 +1,18 @@ /** * @file core/utils/getGameRecord.ts * @description 获取游戏数据的函数 - * @since Beta v0.3.8 + * @since Beta v0.4.10 */ import { http } from "@tauri-apps/api"; +import type { Response } from "@tauri-apps/api/http"; -import TGApi from "../api/TGApi"; -import TGUtils from "../utils/TGUtils"; +import TGApi from "../api/TGApi.js"; +import TGUtils from "../utils/TGUtils.js"; /** * @description 获取用户游戏数据 - * @since Beta v0.3.8 + * @since Beta v0.4.10 * @description 这边的 ck 可以是 cookie_token 和 account_id * @description 也可以是 ltoken 和 ltuid * @param {Record} cookie cookie @@ -26,12 +27,8 @@ export async function getGameRecord( const params = { role_id: user.gameUid, server: user.region }; const header = TGUtils.User.getHeader(cookie, "GET", params, "common"); return await http - .fetch(url, { - method: "GET", - headers: header, - query: params, - }) - .then((res) => { + .fetch(url, { method: "GET", headers: header, query: params }) + .then((res: Response) => { if (res.data.retcode !== 0) { return res.data; }