mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-12 09:18:14 +08:00
🎨 fix(db): 调整结构,将名片数据也写到数据库里
This commit is contained in:
@@ -37,7 +37,7 @@ export const AppDataList = [
|
||||
},
|
||||
{
|
||||
name: "nameCards.json",
|
||||
data: nameCards as Record<number, BTMuli.Genshin.NameCard[]>,
|
||||
data: nameCards as BTMuli.Genshin.NameCard[],
|
||||
},
|
||||
{
|
||||
name: "weapon.json",
|
||||
@@ -46,11 +46,11 @@ export const AppDataList = [
|
||||
];
|
||||
|
||||
export const AppData = {
|
||||
achievements: achievements as Record<number, BTMuli.Genshin.Achievement>,
|
||||
achievementSeries: achievementSeries as Record<number, BTMuli.Genshin.AchievementSeries>,
|
||||
achievements: achievements as BTMuli.Genshin.Achievement[],
|
||||
achievementSeries: achievementSeries as BTMuli.Genshin.AchievementSeries[],
|
||||
calendar: calendar as Record<number, BTMuli.Genshin.Calendar.Data>,
|
||||
character: character as BTMuli.Genshin.Wiki.Character.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[],
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -110,7 +110,6 @@ import { dialog, fs } from "@tauri-apps/api";
|
||||
// Store
|
||||
import { useAchievementsStore } from "../store/modules/achievements";
|
||||
// Utils
|
||||
import { TGAppData } from "../data";
|
||||
import { createTGWindow } from "../utils/TGWindow";
|
||||
import { getUiafHeader, readUiafData, verifyUiafData } from "../utils/UIAF";
|
||||
import TGSqlite from "../utils/TGSqlite";
|
||||
@@ -124,8 +123,7 @@ const loadingTitle = ref("正在加载数据" as string);
|
||||
|
||||
// data
|
||||
const title = ref(achievementsStore.title as string);
|
||||
const CardsInfo = ref([] as BTMuli.Genshin.NameCard[]);
|
||||
const getCardInfo = ref({} as BTMuli.Genshin.NameCard);
|
||||
const getCardInfo = ref({} as BTMuli.SQLite.NameCard);
|
||||
// series
|
||||
const seriesList = ref([] as BTMuli.SQLite.AchievementSeries[]);
|
||||
const selectedIndex = ref(-1 as number);
|
||||
@@ -147,18 +145,9 @@ async function loadData () {
|
||||
const { total, fin } = await TGSqlite.getAchievementsOverview();
|
||||
achievementsStore.flushData(total, fin);
|
||||
loadingTitle.value = "正在获取成就系列数据";
|
||||
CardsInfo.value = TGAppData.nameCards[1];
|
||||
seriesList.value = await TGSqlite.getAchievementSeries();
|
||||
loadingTitle.value = "正在获取成就数据";
|
||||
const getAchievements = 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;
|
||||
selectedAchievement.value = await TGSqlite.getAchievements();
|
||||
title.value = achievementsStore.title;
|
||||
loading.value = false;
|
||||
}
|
||||
@@ -174,16 +163,11 @@ async function selectSeries (index: number) {
|
||||
loadingTitle.value = "正在获取对应的成就数据";
|
||||
selectedIndex.value = index;
|
||||
selectedSeries.value = seriesList.value[index].id;
|
||||
const getAchievements = await TGSqlite.getAchievements(selectedSeries.value);
|
||||
selectedAchievement.value = await TGSqlite.getAchievements(selectedSeries.value);
|
||||
loadingTitle.value = "正在查找对应的成就名片";
|
||||
let getCard: BTMuli.Genshin.NameCard;
|
||||
if (selectedSeries.value !== 0 && selectedSeries.value !== 17) {
|
||||
getCard = CardsInfo.value.find((card) => card.name === seriesList.value[index].nameCard)!;
|
||||
} else {
|
||||
getCard = {} as BTMuli.Genshin.NameCard;
|
||||
getCardInfo.value = await TGSqlite.getNameCard(selectedSeries.value);
|
||||
}
|
||||
selectedAchievement.value = getAchievements;
|
||||
getCardInfo.value = getCard;
|
||||
loading.value = false;
|
||||
}
|
||||
// 打开图片
|
||||
@@ -202,18 +186,13 @@ async function searchCard () {
|
||||
}
|
||||
loadingTitle.value = "正在搜索";
|
||||
loading.value = true;
|
||||
const res = await TGSqlite.searchAchievements(search.value);
|
||||
selectedAchievement.value = await TGSqlite.searchAchievements(search.value);
|
||||
selectedIndex.value = -1;
|
||||
setTimeout(() => {
|
||||
loading.value = false;
|
||||
}, 500);
|
||||
if (res.length === 0) {
|
||||
loading.value = false;
|
||||
if (selectedAchievement.value.length === 0) {
|
||||
snackbarColor.value = "#F5810A";
|
||||
snackbarText.value = "没有找到对应的成就";
|
||||
snackbar.value = true;
|
||||
selectedAchievement.value = await TGSqlite.getAchievements();
|
||||
} else {
|
||||
selectedAchievement.value = res;
|
||||
}
|
||||
}
|
||||
// 导入 UIAF 数据,进行数据合并、刷新
|
||||
@@ -236,12 +215,9 @@ async function importJson () {
|
||||
}
|
||||
loadingTitle.value = "正在解析数据";
|
||||
loading.value = true;
|
||||
const remoteData: TGPlugin.UIAF.BaseData = JSON.parse(remoteRaw);
|
||||
loadingTitle.value = "正在合并成就数据";
|
||||
await TGSqlite.mergeUIAF(remoteData.list);
|
||||
await TGSqlite.mergeUIAF(JSON.parse(remoteRaw).list);
|
||||
loadingTitle.value = "正在刷新数据";
|
||||
const overview = await TGSqlite.getAchievementsOverview();
|
||||
achievementsStore.flushData(overview.total, overview.fin);
|
||||
// 刷新数据
|
||||
await loadData();
|
||||
selectedIndex.value = -1;
|
||||
|
||||
31
src/types/NameCard.d.ts
vendored
31
src/types/NameCard.d.ts
vendored
@@ -2,7 +2,7 @@
|
||||
* @file core types TGNameCard.d.ts
|
||||
* @description 本应用的名片类型定义
|
||||
* @author BTMuli<bt-muli@outlook.com>
|
||||
* @since Alpha v0.1.2
|
||||
* @since Alpha v0.1.4
|
||||
*/
|
||||
|
||||
declare namespace BTMuli.Genshin {
|
||||
@@ -29,3 +29,32 @@ declare namespace BTMuli.Genshin {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,29 +9,6 @@ import { app } from "@tauri-apps/api";
|
||||
import { getBuildTime } from "./TGBuild";
|
||||
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 初始化应用数据表
|
||||
* @since Alpha v0.1.4
|
||||
@@ -79,7 +56,7 @@ function initAchievementSeriesTable (): string[] {
|
||||
totalCount INTEGER DEFAULT 0,
|
||||
finCount INTEGER DEFAULT 0,
|
||||
icon TEXT NOT NULL,
|
||||
nameCard TEXT DEFAULT NULL,
|
||||
nameCard TEXT NOT NULL,
|
||||
updated TEXT DEFAULT NULL
|
||||
);
|
||||
`);
|
||||
@@ -133,16 +110,42 @@ function initAchievementTable (): string[] {
|
||||
`);
|
||||
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 初始化数据库表
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function initSQLiteTable (): string[] {
|
||||
export function initSQLiteTable (): string[] {
|
||||
const sqlRes = [];
|
||||
sqlRes.push(...initAppTable());
|
||||
sqlRes.push(...initAchievementSeriesTable());
|
||||
sqlRes.push(...initAchievementTable());
|
||||
sqlRes.push(...initNameCardTable());
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
@@ -177,8 +180,11 @@ async function initAppData (): Promise<string[]> {
|
||||
function initAchievementSeriesData (): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
const oriData = TGAppData.achievementSeries;
|
||||
Object.values(oriData).map((series) => {
|
||||
const sql = insertAchievementSeriesData(series);
|
||||
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'));
|
||||
`;
|
||||
return sqlRes.push(sql);
|
||||
});
|
||||
return sqlRes;
|
||||
@@ -192,8 +198,29 @@ function initAchievementSeriesData (): string[] {
|
||||
function initAchievementData (): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
const oriData = TGAppData.achievements;
|
||||
Object.values(oriData).map((achievement) => {
|
||||
const sql = insertAchievementData(achievement);
|
||||
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'));
|
||||
`;
|
||||
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;
|
||||
@@ -204,82 +231,22 @@ function initAchievementData (): string[] {
|
||||
* @since Alpha v0.1.4
|
||||
* @returns {Promise<string[]>} sql
|
||||
*/
|
||||
async function initSQLiteData (): Promise<string[]> {
|
||||
export async function initSQLiteData (): Promise<string[]> {
|
||||
const sqlRes = [];
|
||||
sqlRes.push(...initAchievementSeriesData());
|
||||
sqlRes.push(...initAchievementData());
|
||||
sqlRes.push(...initNameCardData());
|
||||
sqlRes.push(...await initAppData());
|
||||
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数据
|
||||
* @since Alpha v0.1.4
|
||||
* @param {TGPlugin.UIAF.Achievement[]} data
|
||||
* @returns {string[]} sql
|
||||
*/
|
||||
function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
|
||||
export function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
|
||||
const sqlRes: string[] = [];
|
||||
data.map((achievement) => {
|
||||
let sql;
|
||||
@@ -303,5 +270,3 @@ function importUIAFData (data: TGPlugin.UIAF.Achievement[]): string[] {
|
||||
});
|
||||
return sqlRes;
|
||||
}
|
||||
|
||||
export default TGSql;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
import Database from "tauri-plugin-sql-api";
|
||||
import TGSql from "./TGSql";
|
||||
import { importUIAFData, initSQLiteData, initSQLiteTable } from "./TGSql";
|
||||
import { getUiafStatus } from "./UIAF";
|
||||
|
||||
const dbLink = await Database.load("sqlite:tauri-genshin.db");
|
||||
@@ -39,6 +39,7 @@ class TGSqlite {
|
||||
"AppData",
|
||||
"Achievements",
|
||||
"AchievementSeries",
|
||||
"NameCard",
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -60,11 +61,11 @@ class TGSqlite {
|
||||
* @memberof TGSqlite
|
||||
*/
|
||||
public async init (): Promise<void> {
|
||||
const sqlT = TGSql.initTable.all;
|
||||
const sqlT = initSQLiteTable();
|
||||
for (const item of sqlT) {
|
||||
await this.db.execute(item);
|
||||
}
|
||||
const sqlD = await TGSql.initData.all;
|
||||
const sqlD = await initSQLiteData();
|
||||
for (const item of sqlD) {
|
||||
await this.db.execute(item);
|
||||
}
|
||||
@@ -127,6 +128,19 @@ class TGSqlite {
|
||||
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 获取成就列表
|
||||
* @memberof TGSqlite
|
||||
@@ -184,7 +198,7 @@ class TGSqlite {
|
||||
* @returns {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) {
|
||||
await this.db.execute(item);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user