🎨 fix(db): 调整结构,将名片数据也写到数据库里

This commit is contained in:
BTMuli
2023-04-25 20:02:51 +08:00
parent f40d9e61d4
commit c9bef8927b
6 changed files with 1534 additions and 1560 deletions

View File

@@ -37,7 +37,7 @@ export const AppDataList = [
}, },
{ {
name: "nameCards.json", name: "nameCards.json",
data: nameCards as Record<number, BTMuli.Genshin.NameCard[]>, data: nameCards as BTMuli.Genshin.NameCard[],
}, },
{ {
name: "weapon.json", name: "weapon.json",
@@ -46,11 +46,11 @@ export const AppDataList = [
]; ];
export const AppData = { export const AppData = {
achievements: achievements as Record<number, BTMuli.Genshin.Achievement>, achievements: achievements as BTMuli.Genshin.Achievement[],
achievementSeries: achievementSeries as Record<number, BTMuli.Genshin.AchievementSeries>, achievementSeries: achievementSeries as BTMuli.Genshin.AchievementSeries[],
calendar: calendar as Record<number, BTMuli.Genshin.Calendar.Data>, calendar: calendar as Record<number, BTMuli.Genshin.Calendar.Data>,
character: character as BTMuli.Genshin.Wiki.Character.BriefInfo[], character: character as BTMuli.Genshin.Wiki.Character.BriefInfo[],
GCG: GCG as BTMuli.Genshin.Wiki.GCG.BriefInfo[], GCG: GCG as BTMuli.Genshin.Wiki.GCG.BriefInfo[],
nameCards: nameCards as Record<number, BTMuli.Genshin.NameCard[]>, nameCards: nameCards as BTMuli.Genshin.NameCard[],
weapon: weapon as BTMuli.Genshin.Wiki.Weapon.BriefInfo[], weapon: weapon as BTMuli.Genshin.Wiki.Weapon.BriefInfo[],
}; };

View File

@@ -1,5 +1,4 @@
{ [
"0": [
{ {
"name": "稻妻·雷电之纹", "name": "稻妻·雷电之纹",
"description": "名片纹饰。 大御所将军的纹样,亦即麾下军势之旗印,「雷之三重巴」。", "description": "名片纹饰。 大御所将军的纹样,亦即麾下军势之旗印,「雷之三重巴」。",
@@ -125,9 +124,7 @@
"profile": "/source/nameCard/profile/原神·印象.webp", "profile": "/source/nameCard/profile/原神·印象.webp",
"type": 0, "type": 0,
"source": "初次登录游戏获取。 " "source": "初次登录游戏获取。 "
} },
],
"1": [
{ {
"name": "成就·遍历", "name": "成就·遍历",
"description": "名片纹饰。 旅人将遍历的一万个故事,都将成为旅人灵魂的一部分。", "description": "名片纹饰。 旅人将遍历的一万个故事,都将成为旅人灵魂的一部分。",
@@ -478,9 +475,7 @@
"profile": "/source/nameCard/profile/须弥·瑶林.webp", "profile": "/source/nameCard/profile/须弥·瑶林.webp",
"type": 1, "type": 1,
"source": "达成「须弥·玄识深藏的雨林」下所有成就时获取。 " "source": "达成「须弥·玄识深藏的雨林」下所有成就时获取。 "
} },
],
"2": [
{ {
"name": "阿贝多·阳花", "name": "阿贝多·阳花",
"description": "名片纹饰。 请让我来当这项奇迹的见证者吧。", "description": "名片纹饰。 请让我来当这项奇迹的见证者吧。",
@@ -1074,9 +1069,7 @@
"profile": "/source/nameCard/profile/重云·灵刃.webp", "profile": "/source/nameCard/profile/重云·灵刃.webp",
"type": 2, "type": 2,
"source": "重云的好感等级达到10级时获取。 " "source": "重云的好感等级达到10级时获取。 "
} },
],
"3": [
{ {
"name": "纪行·白垩", "name": "纪行·白垩",
"description": "名片纹饰。 踏足雪山,注意保暖。", "description": "名片纹饰。 踏足雪山,注意保暖。",
@@ -1283,9 +1276,7 @@
"profile": "/source/nameCard/profile/纪行·逐月.webp", "profile": "/source/nameCard/profile/纪行·逐月.webp",
"type": 3, "type": 3,
"source": "纪行系统奖励获取。 " "source": "纪行系统奖励获取。 "
} },
],
"4": [
{ {
"name": "庆典·灯昼", "name": "庆典·灯昼",
"description": "名片纹饰。 年年今日,灯明如昼。愿火不灭,愿人依旧。", "description": "名片纹饰。 年年今日,灯明如昼。愿火不灭,愿人依旧。",
@@ -1383,7 +1374,7 @@
"bg": "/source/nameCard/bg/庆典·倾耳.webp", "bg": "/source/nameCard/bg/庆典·倾耳.webp",
"profile": "/source/nameCard/profile/庆典·倾耳.webp", "profile": "/source/nameCard/profile/庆典·倾耳.webp",
"type": 4, "type": 4,
"source": "「万籁协奏」礼包获得" "source": ""
}, },
{ {
"name": "庆典·盛宴", "name": "庆典·盛宴",
@@ -1422,4 +1413,3 @@
"source": "「百人一揆」活动获取。 " "source": "「百人一揆」活动获取。 "
} }
] ]
}

View File

@@ -110,7 +110,6 @@ import { dialog, fs } from "@tauri-apps/api";
// Store // Store
import { useAchievementsStore } from "../store/modules/achievements"; import { useAchievementsStore } from "../store/modules/achievements";
// Utils // Utils
import { TGAppData } from "../data";
import { createTGWindow } from "../utils/TGWindow"; import { createTGWindow } from "../utils/TGWindow";
import { getUiafHeader, readUiafData, verifyUiafData } from "../utils/UIAF"; import { getUiafHeader, readUiafData, verifyUiafData } from "../utils/UIAF";
import TGSqlite from "../utils/TGSqlite"; import TGSqlite from "../utils/TGSqlite";
@@ -124,8 +123,7 @@ const loadingTitle = ref("正在加载数据" as string);
// data // data
const title = ref(achievementsStore.title as string); const title = ref(achievementsStore.title as string);
const CardsInfo = ref([] as BTMuli.Genshin.NameCard[]); const getCardInfo = ref({} as BTMuli.SQLite.NameCard);
const getCardInfo = ref({} as BTMuli.Genshin.NameCard);
// series // series
const seriesList = ref([] as BTMuli.SQLite.AchievementSeries[]); const seriesList = ref([] as BTMuli.SQLite.AchievementSeries[]);
const selectedIndex = ref(-1 as number); const selectedIndex = ref(-1 as number);
@@ -147,18 +145,9 @@ async function loadData () {
const { total, fin } = await TGSqlite.getAchievementsOverview(); const { total, fin } = await TGSqlite.getAchievementsOverview();
achievementsStore.flushData(total, fin); achievementsStore.flushData(total, fin);
loadingTitle.value = "正在获取成就系列数据"; loadingTitle.value = "正在获取成就系列数据";
CardsInfo.value = TGAppData.nameCards[1];
seriesList.value = await TGSqlite.getAchievementSeries(); seriesList.value = await TGSqlite.getAchievementSeries();
loadingTitle.value = "正在获取成就数据"; loadingTitle.value = "正在获取成就数据";
const getAchievements = await TGSqlite.getAchievements(); selectedAchievement.value = await TGSqlite.getAchievements();
getAchievements.sort((a, b) => {
if (a.isCompleted === b.isCompleted) {
return a.id - b.id;
} else {
return a.isCompleted ? 1 : -1;
}
});
selectedAchievement.value = getAchievements;
title.value = achievementsStore.title; title.value = achievementsStore.title;
loading.value = false; loading.value = false;
} }
@@ -174,16 +163,11 @@ async function selectSeries (index: number) {
loadingTitle.value = "正在获取对应的成就数据"; loadingTitle.value = "正在获取对应的成就数据";
selectedIndex.value = index; selectedIndex.value = index;
selectedSeries.value = seriesList.value[index].id; selectedSeries.value = seriesList.value[index].id;
const getAchievements = await TGSqlite.getAchievements(selectedSeries.value); selectedAchievement.value = await TGSqlite.getAchievements(selectedSeries.value);
loadingTitle.value = "正在查找对应的成就名片"; loadingTitle.value = "正在查找对应的成就名片";
let getCard: BTMuli.Genshin.NameCard;
if (selectedSeries.value !== 0 && selectedSeries.value !== 17) { if (selectedSeries.value !== 0 && selectedSeries.value !== 17) {
getCard = CardsInfo.value.find((card) => card.name === seriesList.value[index].nameCard)!; getCardInfo.value = await TGSqlite.getNameCard(selectedSeries.value);
} else {
getCard = {} as BTMuli.Genshin.NameCard;
} }
selectedAchievement.value = getAchievements;
getCardInfo.value = getCard;
loading.value = false; loading.value = false;
} }
// 打开图片 // 打开图片
@@ -202,18 +186,13 @@ async function searchCard () {
} }
loadingTitle.value = "正在搜索"; loadingTitle.value = "正在搜索";
loading.value = true; loading.value = true;
const res = await TGSqlite.searchAchievements(search.value); selectedAchievement.value = await TGSqlite.searchAchievements(search.value);
selectedIndex.value = -1; selectedIndex.value = -1;
setTimeout(() => {
loading.value = false; loading.value = false;
}, 500); if (selectedAchievement.value.length === 0) {
if (res.length === 0) {
snackbarColor.value = "#F5810A"; snackbarColor.value = "#F5810A";
snackbarText.value = "没有找到对应的成就"; snackbarText.value = "没有找到对应的成就";
snackbar.value = true; snackbar.value = true;
selectedAchievement.value = await TGSqlite.getAchievements();
} else {
selectedAchievement.value = res;
} }
} }
// 导入 UIAF 数据,进行数据合并、刷新 // 导入 UIAF 数据,进行数据合并、刷新
@@ -236,12 +215,9 @@ async function importJson () {
} }
loadingTitle.value = "正在解析数据"; loadingTitle.value = "正在解析数据";
loading.value = true; loading.value = true;
const remoteData: TGPlugin.UIAF.BaseData = JSON.parse(remoteRaw);
loadingTitle.value = "正在合并成就数据"; loadingTitle.value = "正在合并成就数据";
await TGSqlite.mergeUIAF(remoteData.list); await TGSqlite.mergeUIAF(JSON.parse(remoteRaw).list);
loadingTitle.value = "正在刷新数据"; loadingTitle.value = "正在刷新数据";
const overview = await TGSqlite.getAchievementsOverview();
achievementsStore.flushData(overview.total, overview.fin);
// 刷新数据 // 刷新数据
await loadData(); await loadData();
selectedIndex.value = -1; selectedIndex.value = -1;

View File

@@ -2,7 +2,7 @@
* @file core types TGNameCard.d.ts * @file core types TGNameCard.d.ts
* @description 本应用的名片类型定义 * @description 本应用的名片类型定义
* @author BTMuli<bt-muli@outlook.com> * @author BTMuli<bt-muli@outlook.com>
* @since Alpha v0.1.2 * @since Alpha v0.1.4
*/ */
declare namespace BTMuli.Genshin { declare namespace BTMuli.Genshin {
@@ -29,3 +29,32 @@ declare namespace BTMuli.Genshin {
source: string source: string
} }
} }
declare namespace BTMuli.SQLite {
/**
* @description 数据库内的名片类型
* @since Alpha v0.1.4
* @interface NameCard
* @property {number} id - 名片 ID
* @property {string} name - 名片名称
* @property {string} description - 名片描述
* @property {string} icon - 名片图标路径
* @property {string} bg - 名片背景图路径
* @property {string} profile - 名片 Profile 图路径
* @property {number} type - 名片类型 (0: 其他1: 成就2角色3纪行4活动)
* @property {string} source - 名片来源
* @property {string} updated - 名片更新时间
* @returns {NameCard}
*/
export interface NameCard {
id: number
name: string
description: string
icon: string
bg: string
profile: string
type: number
source: string
updated: string
}
}

View File

@@ -9,29 +9,6 @@ import { app } from "@tauri-apps/api";
import { getBuildTime } from "./TGBuild"; import { getBuildTime } from "./TGBuild";
import { TGAppData } from "../data"; import { TGAppData } from "../data";
const TGSql = {
initTable: {
all: initSQLiteTable(),
app: initAppTable(),
achievement: initAchievementTable(),
achievementSeries: initAchievementSeriesTable(),
},
initData: {
all: initSQLiteData(),
app: initAppData(),
achievement: initAchievementData(),
achievementSeries: initAchievementSeriesData(),
},
insert: {
achievement: insertAchievementData,
achievementSeries: insertAchievementSeriesData,
UIAF: importUIAFData,
},
update: {
achievement: updateAchievementData,
},
};
/** /**
* @description 初始化应用数据表 * @description 初始化应用数据表
* @since Alpha v0.1.4 * @since Alpha v0.1.4
@@ -79,7 +56,7 @@ function initAchievementSeriesTable (): string[] {
totalCount INTEGER DEFAULT 0, totalCount INTEGER DEFAULT 0,
finCount INTEGER DEFAULT 0, finCount INTEGER DEFAULT 0,
icon TEXT NOT NULL, icon TEXT NOT NULL,
nameCard TEXT DEFAULT NULL, nameCard TEXT NOT NULL,
updated TEXT DEFAULT NULL updated TEXT DEFAULT NULL
); );
`); `);
@@ -133,16 +110,42 @@ function initAchievementTable (): string[] {
`); `);
return sqlRes; return sqlRes;
} }
/**
* @description 初始化名片数据表
* @since Alpha v0.1.4
* @returns {string[]} sql
*/
function initNameCardTable (): string[] {
const sqlRes = [];
// 创建名片数据表
sqlRes.push(`
CREATE TABLE IF NOT EXISTS NameCard
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT DEFAULT NULL,
description TEXT DEFAULT NULL,
icon TEXT NOT NULL,
bg TEXT NOT NULL,
profile TEXT NOT NULL,
type INTEGER DEFAULT 0,
source TEXT DEFAULT NULL,
updated TEXT DEFAULT NULL
);
`);
return sqlRes;
}
/** /**
* @description 初始化数据库表 * @description 初始化数据库表
* @since Alpha v0.1.4 * @since Alpha v0.1.4
* @returns {string[]} sql * @returns {string[]} sql
*/ */
function initSQLiteTable (): string[] { export function initSQLiteTable (): string[] {
const sqlRes = []; const sqlRes = [];
sqlRes.push(...initAppTable()); sqlRes.push(...initAppTable());
sqlRes.push(...initAchievementSeriesTable()); sqlRes.push(...initAchievementSeriesTable());
sqlRes.push(...initAchievementTable()); sqlRes.push(...initAchievementTable());
sqlRes.push(...initNameCardTable());
return sqlRes; return sqlRes;
} }
@@ -177,8 +180,11 @@ async function initAppData (): Promise<string[]> {
function initAchievementSeriesData (): string[] { function initAchievementSeriesData (): string[] {
const sqlRes: string[] = []; const sqlRes: string[] = [];
const oriData = TGAppData.achievementSeries; const oriData = TGAppData.achievementSeries;
Object.values(oriData).map((series) => { oriData.map((data) => {
const sql = insertAchievementSeriesData(series); 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'));
`;
return sqlRes.push(sql); return sqlRes.push(sql);
}); });
return sqlRes; return sqlRes;
@@ -192,8 +198,29 @@ function initAchievementSeriesData (): string[] {
function initAchievementData (): string[] { function initAchievementData (): string[] {
const sqlRes: string[] = []; const sqlRes: string[] = [];
const oriData = TGAppData.achievements; const oriData = TGAppData.achievements;
Object.values(oriData).map((achievement) => { oriData.map((data) => {
const sql = insertAchievementData(achievement); 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'));
`;
return sqlRes.push(sql);
});
return sqlRes;
}
/**
* @description 初始化名片数据
* @since Alpha v0.1.4
* @returns {string[]} sql
*/
function initNameCardData (): string[] {
const sqlRes: 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'));
`;
return sqlRes.push(sql); return sqlRes.push(sql);
}); });
return sqlRes; return sqlRes;
@@ -204,82 +231,22 @@ function initAchievementData (): string[] {
* @since Alpha v0.1.4 * @since Alpha v0.1.4
* @returns {Promise<string[]>} sql * @returns {Promise<string[]>} sql
*/ */
async function initSQLiteData (): Promise<string[]> { export async function initSQLiteData (): Promise<string[]> {
const sqlRes = []; const sqlRes = [];
sqlRes.push(...initAchievementSeriesData()); sqlRes.push(...initAchievementSeriesData());
sqlRes.push(...initAchievementData()); sqlRes.push(...initAchievementData());
sqlRes.push(...initNameCardData());
sqlRes.push(...await initAppData()); sqlRes.push(...await initAppData());
return sqlRes; return sqlRes;
} }
/**
* @description 插入数据-成就系列
* @since Alpha v0.1.4
* @param {BTMuli.Genshin.AchievementSeries} data
* @returns {string} sql
*/
function insertAchievementSeriesData (data: BTMuli.Genshin.AchievementSeries): string {
let sql;
if (data.card) {
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'));
`;
} else {
sql = `
INSERT INTO AchievementSeries (id, "order", name, version, icon, updated)
VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}', '${data.icon}', datetime('now', 'localtime'));
`;
}
return sql;
}
/**
* @description 插入数据-成就
* @since Alpha v0.1.4
* @param {BTMuli.Genshin.Achievement} data
* @returns {string} sql
*/
function insertAchievementData (data: BTMuli.Genshin.Achievement): string {
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'));
`;
return sql;
}
/**
* @description 更新数据-成就
* @since Alpha v0.1.4
* @param {BTMuli.Genshin.Achievement} data
* @returns {string} sql
*/
function updateAchievementData (data: BTMuli.Genshin.Achievement): string {
let sql;
const isCompleted = data.completed ? 1 : 0;
if (data.completed && data.completed_time) {
sql = `
UPDATE Achievements
SET completed = ${isCompleted}, completedTime = '${data.completed_time}', progress = ${data.progress}, updated = datetime('now', 'localtime')
WHERE id = ${data.id};
`;
} else {
sql = `
UPDATE Achievements
SET completed = ${isCompleted}, progress = ${data.progress}, updated = datetime('now', 'localtime')
WHERE id = ${data.id};
`;
}
return sql;
}
/** /**
* @description 导入UIAF数据 * @description 导入UIAF数据
* @since Alpha v0.1.4 * @since Alpha v0.1.4
* @param {TGPlugin.UIAF.Achievement[]} data * @param {TGPlugin.UIAF.Achievement[]} data
* @returns {string[]} sql * @returns {string[]} sql
*/ */
function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] { export function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
const sqlRes: string[] = []; const sqlRes: string[] = [];
data.map((achievement) => { data.map((achievement) => {
let sql; let sql;
@@ -303,5 +270,3 @@ function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
}); });
return sqlRes; return sqlRes;
} }
export default TGSql;

View File

@@ -6,7 +6,7 @@
*/ */
import Database from "tauri-plugin-sql-api"; import Database from "tauri-plugin-sql-api";
import TGSql from "./TGSql"; import { importUIAFData, initSQLiteData, initSQLiteTable } from "./TGSql";
import { getUiafStatus } from "./UIAF"; import { getUiafStatus } from "./UIAF";
const dbLink = await Database.load("sqlite:tauri-genshin.db"); const dbLink = await Database.load("sqlite:tauri-genshin.db");
@@ -39,6 +39,7 @@ class TGSqlite {
"AppData", "AppData",
"Achievements", "Achievements",
"AchievementSeries", "AchievementSeries",
"NameCard",
]; ];
/** /**
@@ -60,11 +61,11 @@ class TGSqlite {
* @memberof TGSqlite * @memberof TGSqlite
*/ */
public async init (): Promise<void> { public async init (): Promise<void> {
const sqlT = TGSql.initTable.all; const sqlT = initSQLiteTable();
for (const item of sqlT) { for (const item of sqlT) {
await this.db.execute(item); await this.db.execute(item);
} }
const sqlD = await TGSql.initData.all; const sqlD = await initSQLiteData();
for (const item of sqlD) { for (const item of sqlD) {
await this.db.execute(item); await this.db.execute(item);
} }
@@ -127,6 +128,19 @@ class TGSqlite {
return res; return res;
} }
/**
* @description 获取成就系列对应的名片
* @memberof TGSqlite
* @since Alpha v0.1.4
* @param {number} seriesId 系列 ID
* @returns {Promise<BTMuli.SQLite.NameCard>}
*/
public async getNameCard (seriesId: number): Promise<BTMuli.SQLite.NameCard> {
const sql = `SELECT * FROM NameCard WHERE name=(SELECT nameCard FROM AchievementSeries WHERE id=${seriesId});`;
const res: BTMuli.SQLite.NameCard[] = await this.db.select(sql);
return res[0];
}
/** /**
* @description 获取成就列表 * @description 获取成就列表
* @memberof TGSqlite * @memberof TGSqlite
@@ -184,7 +198,7 @@ class TGSqlite {
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
public async mergeUIAF (achievements: TGPlugin.UIAF.Achievement[]): Promise<void> { public async mergeUIAF (achievements: TGPlugin.UIAF.Achievement[]): Promise<void> {
const sql = TGSql.insert.UIAF(achievements); const sql = importUIAFData(achievements);
for (const item of sql) { for (const item of sql) {
await this.db.execute(item); await this.db.execute(item);
} }