♻️ 重构成就表格,支持多存档

#126
This commit is contained in:
目棃
2024-09-20 15:57:02 +08:00
parent a8a667871a
commit 1dc5aa0ef8
28 changed files with 1198 additions and 1239 deletions

View File

@@ -1,35 +1,23 @@
-- @file plugins/Sqlite/sql/createTable.sql
-- @brief sqlite数据库创建表语句
-- @since Beta v0.5.5
-- @since Beta v0.6.0
-- @brief 重新创建成就数据表
drop table if exists Achievements;
-- @brief 创建成就数据表
create table if not exists Achievements
(
id integer primary key,
series integer,
`order` integer,
name text,
description text,
reward integer,
id integer not null,
uid integer not null,
isCompleted boolean default false,
completedTime text,
progress integer default 0,
version text,
updated text
updated text,
primary key (id, uid)
);
-- @brief 创建成就系列数据表
create table if not exists AchievementSeries
(
id integer primary key,
`order` integer,
name text,
version text,
totalCount integer default 0,
finCount integer default 0,
nameCard text,
updated text
);
-- @brief 重新创建成就系列数据表
drop table if exists AchievementSeries;
-- @brief 创建角色数据表
create table if not exists AppCharacters
@@ -117,19 +105,19 @@ create table if not exists UserRecord
-- @brief 创建角色数据表
create table if not exists UserCharacters
(
uid integer,
cid integer,
avatar text,
weapon text,
relics text,
constellations text,
costumes text,
skills text,
propSelected text,
propBase text,
propExtra text,
propRecommend text,
updated text,
uid integer,
cid integer,
avatar text,
weapon text,
relics text,
constellations text,
costumes text,
skills text,
propSelected text,
propBase text,
propExtra text,
propRecommend text,
updated text,
primary key (uid, cid)
);

View File

@@ -1,40 +1,9 @@
-- @file plugins Sqlite sql createTrigger.sql
-- @file plugins/Sqlite/sql/createTrigger.sql
-- @brief 创建触发器
-- @author BTMuli <bt-muli@outlook.com>
-- @since Alpha v0.2.0
-- @since Beta v0.6.0
-- @brief 成就表相关
create trigger if not exists insertAchievement
after insert
on Achievements
for each row
begin
update AchievementSeries
set totalCount = totalCount + 1,
updated = datetime('now', 'localtime')
where id = new.series;
update AchievementSeries
set version = new.version,
updated = datetime('now', 'localtime')
where id = new.series
and new.version > version;
end;
-- @brief 重新创建成就表插入触发器
drop trigger if exists insertAchievement;
create trigger if not exists updateAchievement
after update
on Achievements
for each row
begin
update AchievementSeries
set updated = datetime('now', 'localtime'),
finCount = finCount + 1
where id = new.series
and old.isCompleted = 0
and new.isCompleted = 1;
update AchievementSeries
set updated = datetime('now', 'localtime'),
finCount = finCount - 1
where id = new.series
and old.isCompleted = 1
and new.isCompleted = 0;
end;
-- @brief 重新创建成就表更新触发器
drop trigger if exists updateAchievement;

View File

@@ -1,26 +1,16 @@
/**
* @file plugins/Sqlite/sql/initData.ts
* @description Sqlite 初始化数据 sql 语句
* @since Beta v0.4.5
* @since Beta v0.6.0
*/
import { app } from "@tauri-apps/api";
import {
AppAchievementsData,
AppAchievementSeriesData,
AppNameCardsData,
AppCharacterData,
} from "../../../data/index.js";
import { AppNameCardsData, AppCharacterData } from "../../../data/index.js";
import { getBuildTime } from "../../../utils/TGBuild.js";
import initTableSql from "./initTable.js";
import {
insertAchievementData,
insertAchievementSeriesData,
insertNameCardData,
insertCharacterData,
} from "./insertData.js";
import { insertNameCardData, insertCharacterData } from "./insertData.js";
/**
* @description 初始化应用表数据
@@ -51,24 +41,6 @@ async function initAppData(): Promise<string[]> {
return sqlRes;
}
/**
* @description 初始化成就系列数据
* @since Alpha v0.2.0
* @returns {string[]} sql
*/
function initAchievementSeriesData(): string[] {
return AppAchievementSeriesData.map((item) => insertAchievementSeriesData(item));
}
/**
* @description 初始化成就数据
* @since Alpha v0.2.0
* @returns {string[]} sql
*/
function initAchievementData(): string[] {
return AppAchievementsData.map((item) => insertAchievementData(item));
}
/**
* @description 初始化应用名片数据
* @since Alpha v0.2.0
@@ -96,8 +68,6 @@ async function initDataSql(): Promise<string[]> {
const sqlRes: string[] = [];
sqlRes.push(...initTableSql());
sqlRes.push(...(await initAppData()));
sqlRes.push(...initAchievementSeriesData());
sqlRes.push(...initAchievementData());
sqlRes.push(...initNameCardData());
sqlRes.push(...initCharacterData());
return sqlRes;

View File

@@ -1,7 +1,7 @@
/**
* @file plugins/Sqlite/sql/insertData.ts
* @description Sqlite 插入数据 sql 语句
* @since Beta v0.5.3
* @since Beta v0.6.0
*/
import { transCharacterData, transFloorData } from "../utils/transAbyssData.js";
@@ -9,48 +9,6 @@ import { timeToSecond } from "../utils/transTime.js";
import { transUserRecord } from "../utils/transUserRecord.js";
import { transUserRoles } from "../utils/transUserRoles.js";
/**
* @description 插入成就数据
* @since Alpha v0.2.0
* @param {TGApp.App.Achievement.Item} data 成就数据
* @returns {string} sql
*/
export function insertAchievementData(data: TGApp.App.Achievement.Item): string {
return `
INSERT INTO Achievements (id, series, "order", name, description, reward, completedTime, version, updated)
VALUES (${data.id}, ${data.series}, ${data.order}, '${data.name}', '${data.description}', ${data.reward}, '',
'${data.version}', datetime('now', 'localtime'))
ON CONFLICT(id) DO UPDATE
SET series = ${data.series},
"order" = ${data.order},
name = '${data.name}',
description = '${data.description}',
reward = '${data.reward}',
version = '${data.version}',
updated = datetime('now', 'localtime');
`;
}
/**
* @description 插入成就系列数据
* @since Alpha v0.2.0
* @param {TGApp.App.Achievement.Series} data 成就系列数据
* @returns {string} sql
*/
export function insertAchievementSeriesData(data: TGApp.App.Achievement.Series): string {
return `
INSERT INTO AchievementSeries (id, "order", name, version, nameCard, updated)
VALUES (${data.id}, ${data.order}, '${data.name}', '${data.version}', '${data.card}',
datetime('now', 'localtime'))
ON CONFLICT(id) DO UPDATE
SET name = '${data.name}',
"order" = ${data.order},
version = '${data.version}',
nameCard = '${data.card}',
updated = datetime('now', 'localtime');
`;
}
/**
* @description 插入应用数据
* @since Alpha v0.2.0

View File

@@ -1,72 +0,0 @@
/**
* @file plugins/Sqlite/sql/updateData.ts
* @description 更新数据
* @since Beta v0.4.9
*/
import minifySql from "../../../utils/minifySql.js";
/**
* @description 导入UIAF数据-单项
* @since Beta v0.4.9
* @param {TGApp.Plugins.UIAF.Achievement} data
* @returns {string} sql
*/
export function importUIAFData(data: TGApp.Plugins.UIAF.Achievement): string {
let sql;
const isCompleted = data.status === 2 || data.status === 3;
if (isCompleted) {
const completedTime = new Date(data.timestamp * 1000)
.toISOString()
.replace("T", " ")
.slice(0, 19);
sql = `
UPDATE Achievements
SET isCompleted = 1,
completedTime = '${completedTime}',
progress = ${data.current},
updated = datetime('now', 'localtime')
WHERE id = ${data.id}
AND (isCompleted = 0 OR completedTime != '${completedTime}'
OR progress != ${data.current});
`;
} else {
sql = `
UPDATE Achievements
SET progress = ${data.current},
updated = datetime('now', 'localtime')
WHERE id = ${data.id}
AND progress != ${data.current};
`;
}
return minifySql(sql);
}
/**
* @description 导入UIGF数据-单项
* @since Beta v0.4.7
* @param {string} uid - UID
* @param {TGApp.Plugins.UIGF.GachaItem} gacha - UIGF数据
* @returns {string} sql
*/
export function importUIGFData(uid: string, gacha: TGApp.Plugins.UIGF.GachaItem): string {
const sql = `
INSERT INTO GachaRecords (uid, gachaType, itemId, count, time, name, type, rank, id, uigfType, updated)
VALUES ('${uid}', '${gacha.gacha_type}', '${gacha.item_id ?? null}', '${gacha.count ?? null}', '${gacha.time}',
'${gacha.name}', '${gacha.item_type ?? null}', '${gacha.rank_type ?? null}', '${gacha.id}',
'${gacha.uigf_gacha_type}', datetime('now', 'localtime'))
ON CONFLICT (id)
DO UPDATE
SET uid = '${uid}',
gachaType = '${gacha.gacha_type}',
uigfType = '${gacha.uigf_gacha_type}',
time = '${gacha.time}',
itemId = '${gacha.item_id ?? null}',
count = '${gacha.count ?? null}',
name = '${gacha.name}',
type = '${gacha.item_type ?? null}',
rank = '${gacha.rank_type ?? null}',
updated = datetime('now', 'localtime');
`;
return minifySql(sql);
}