♻️ 活动奖励支持预览角色/武器

This commit is contained in:
BTMuli
2025-12-19 19:00:45 +08:00
parent 8493635cca
commit 0b94bfc01f
5 changed files with 82 additions and 132 deletions

View File

@@ -1,71 +0,0 @@
<template>
<div class="tcm-box">
<div class="tcm-left">
<div class="tcm-bg"><img :src="`/icon/bg/${item.star}-Star.webp`" alt="bg" /></div>
<div class="tcm-icon"><img :src="`/icon/material/${item.id}.webp`" alt="icon" /></div>
<div class="tcm-star" v-if="item.star !== 0">
<img :src="`/icon/star/${item.star}.webp`" alt="element" />
</div>
</div>
<div class="tcm-right">{{ item.name }}</div>
</div>
</template>
<script lang="ts" setup>
defineProps<{ item: TGApp.App.Calendar.Material }>();
</script>
<style lang="css" scoped>
.tcm-box {
position: relative;
display: flex;
height: 45px;
border: 1px solid var(--common-shadow-1);
border-radius: 5px;
background: var(--box-bg-1);
gap: 10px;
}
.tcm-left {
width: 45px;
height: 45px;
border-bottom-left-radius: 5px;
border-top-left-radius: 5px;
}
.tcm-bg,
.tcm-icon {
position: absolute;
top: 0;
width: 45px;
height: 45px;
border-bottom-left-radius: 5px;
border-top-left-radius: 5px;
}
.tcm-bg img,
.tcm-icon img {
width: 100%;
height: 100%;
border-bottom-left-radius: 5px;
border-top-left-radius: 5px;
object-fit: cover;
}
.tcm-star {
position: absolute;
bottom: -8px;
width: 45px;
height: auto;
}
.tcm-star img {
width: 100%;
}
.tcm-right {
display: flex;
align-items: center;
justify-content: center;
color: var(--box-text-2);
font-size: 14px;
}
</style>

View File

@@ -1,3 +1,4 @@
<!-- 素材日历项浮窗 -->
<template>
<TOverlay v-model="visible">
<div class="toc-box">
@@ -5,23 +6,19 @@
<div class="toc-top">
<TItemBox :model-value="boxData" />
<div class="toc-material-grid">
<TibCalendarMaterial
v-for="(item, index) in props.dataVal.materials"
:key="index"
:item="item"
/>
<PwMaterialItem v-for="(material, index) in materialList" :key="index" :material />
</div>
</div>
<img alt="line" class="toc-line" src="/source/UI/item-line.webp" />
<div class="toc-bottom">
<div class="toc-src-box">
<div class="toc-src-text">来源</div>
<img :src="`/icon/nation/${props.dataVal.source.area}.webp`" alt="icon" />
<img :src="`/icon/nation/${props.item.source.area}.webp`" alt="icon" />
<div class="toc-src-text">
{{ props.dataVal.source.area }} - {{ props.dataVal.source.name }}
{{ props.item.source.area }} - {{ props.item.source.name }}
</div>
</div>
<v-btn variant="outlined" @click="toDetail(props.dataVal)">详情</v-btn>
<v-btn variant="outlined" @click="toDetail(props.item)">详情</v-btn>
</div>
</div>
</div>
@@ -31,33 +28,44 @@
import TItemBox, { type TItemBoxData } from "@comp/app/t-itemBox.vue";
import TOverlay from "@comp/app/t-overlay.vue";
import showSnackbar from "@comp/func/snackbar.js";
import PwMaterialItem from "@comp/pageWiki/pw-material-item.vue";
import { computed } from "vue";
import { useRouter } from "vue-router";
import TibCalendarMaterial from "./ph-calendar-material.vue";
import { WikiMaterialData } from "@/data/index.js";
type ToCalendarProps = { dataType: "weapon" | "character"; dataVal: TGApp.App.Calendar.Item };
type ToCalendarProps = { item: TGApp.App.Calendar.Item };
const router = useRouter();
const props = defineProps<ToCalendarProps>();
const visible = defineModel<boolean>();
const materialList = computed<Array<TGApp.App.Material.WikiItem>>(() => loadData());
const boxData = computed<TItemBoxData>(() => ({
bg: `/icon/bg/${props.dataVal.star}-Star.webp`,
icon: `/WIKI/${props.dataType}/${props.dataVal.id}.webp`,
bg: `/icon/bg/${props.item.star}-Star.webp`,
icon: `/WIKI/${props.item.itemType}/${props.item.id}.webp`,
size: "100px",
height: "100px",
display: "inner",
clickable: false,
lt: props.dataVal.element
? `/icon/element/${props.dataVal.element}元素.webp`
: `/icon/weapon/${props.dataVal.weapon}.webp`,
lt: props.item.element
? `/icon/element/${props.item.element}元素.webp`
: `/icon/weapon/${props.item.weapon}.webp`,
ltSize: "20px",
innerHeight: 25,
innerIcon: props.dataVal.element ? `/icon/weapon/${props.dataVal.weapon}.webp` : undefined,
innerText: props.dataVal.name,
innerIcon: props.item.element ? `/icon/weapon/${props.item.weapon}.webp` : undefined,
innerText: props.item.name,
}));
function loadData(): Array<TGApp.App.Material.WikiItem> {
const tmp: Array<TGApp.App.Material.WikiItem> = [];
for (const d of props.item.materials) {
const material = WikiMaterialData.find((m) => m.id === d.id);
if (material) tmp.push(material);
}
return tmp;
}
async function toDetail(item: TGApp.App.Calendar.Item): Promise<void> {
if (!["character", "weapon"].includes(item.itemType)) {
showSnackbar.error("未知类型");
@@ -96,7 +104,7 @@ async function toDetail(item: TGApp.App.Calendar.Item): Promise<void> {
display: grid;
width: 100%;
font-family: var(--font-title);
grid-gap: 10px;
gap: 10px;
grid-template-columns: repeat(2, 1fr);
}

View File

@@ -34,7 +34,7 @@
</div>
</template>
</THomeCard>
<ToCalendar v-model="showItem" :data-type="selectedType" :data-val="selectedItem" />
<ToCalendar v-model="showItem" :item="selectedItem" />
</template>
<script lang="ts" setup>
import TItemBox, { type TItemBoxData } from "@comp/app/t-itemBox.vue";

View File

@@ -20,10 +20,12 @@
</template>
</THomeCard>
<TwoMaterial v-model="showMaterial" :data="curMaterial" />
<ToCalendar v-model="showCalendar" :item="curItemC" />
</template>
<script lang="ts" setup>
import showLoading from "@comp/func/loading.js";
import showSnackbar from "@comp/func/snackbar.js";
import ToCalendar from "@comp/pageHome/ph-calendar-overlay.vue";
import PhPosObc from "@comp/pageHome/ph-pos-obc.vue";
import PhPosUser from "@comp/pageHome/ph-pos-user.vue";
import TwoMaterial from "@comp/pageWiki/two-material.vue";
@@ -38,7 +40,7 @@ import { onMounted, ref, shallowRef, watch } from "vue";
import THomeCard from "./ph-comp-card.vue";
import { WikiMaterialData } from "@/data/index.js";
import { AppCalendarData, WikiMaterialData } from "@/data/index.js";
type TPositionEmits = (e: "success") => void;
@@ -50,7 +52,10 @@ const emits = defineEmits<TPositionEmits>();
const isInit = ref<boolean>(false);
const isUserPos = ref<boolean>(isLogin.value);
const showMaterial = ref<boolean>(false);
const showCalendar = ref<boolean>(false);
const curMaterial = shallowRef<TGApp.App.Material.WikiItem>(WikiMaterialData[0]);
const curTypeC = ref<"character" | "weapon">("character");
const curItemC = shallowRef<TGApp.App.Calendar.Item>(AppCalendarData[0]);
const obsPos = shallowRef<Array<TGApp.BBS.Obc.PositionItem>>([]);
const userPos = shallowRef<Array<TGApp.Game.ActCalendar.ActItem>>([]);
@@ -115,13 +120,21 @@ async function loadWikiPosition(): Promise<void> {
}
async function handleMaterial(cur: TGApp.Game.ActCalendar.ActReward): Promise<void> {
const find = WikiMaterialData.find((i) => i.id === cur.item_id);
if (!find) {
await openUrl(cur.wiki_url);
const findM = WikiMaterialData.find((i) => i.id === cur.item_id);
if (findM) {
curMaterial.value = findM;
showMaterial.value = true;
return;
}
curMaterial.value = find;
showMaterial.value = true;
// 尝试查找角色&武器
const findC = AppCalendarData.find((i) => i.id === cur.item_id);
if (findC) {
curTypeC.value = findC.itemType === "weapon" ? "weapon" : "character";
curItemC.value = findC;
showCalendar.value = true;
return;
}
await openUrl(cur.wiki_url);
}
</script>
<style lang="scss" scoped>

View File

@@ -28,23 +28,23 @@ function getRestoreSql(tableData: TGApp.Sqlite.Abyss.TableData): string {
${data.totalWinTimes}, '${data.maxFloor}', ${data.totalStar},
${data.isUnlock}, '${data.revealRank}', '${data.defeatRank}', '${data.damageRank}',
'${data.takeDamageRank}', '${data.normalSkillRank}', '${data.energySkillRank}', '${data.floors}',
'${timeNow}') ON CONFLICT(uid, id) DO
UPDATE
SET startTime = '${data.startTime}',
endTime = '${data.endTime}',
totalBattleTimes = ${data.totalBattleTimes},
totalWinTimes = ${data.totalWinTimes},
maxFloor = '${data.maxFloor}',
totalStar = ${data.totalStar},
isUnlock = ${data.isUnlock},
revealRank = '${data.revealRank}',
defeatRank = '${data.defeatRank}',
damageRank = '${data.damageRank}',
takeDamageRank = '${data.takeDamageRank}',
normalSkillRank = '${data.normalSkillRank}',
energySkillRank = '${data.energySkillRank}',
floors = '${data.floors}',
updated = '${timeNow}';
'${timeNow}')
ON CONFLICT(uid, id) DO UPDATE
SET startTime = '${data.startTime}',
endTime = '${data.endTime}',
totalBattleTimes = ${data.totalBattleTimes},
totalWinTimes = ${data.totalWinTimes},
maxFloor = '${data.maxFloor}',
totalStar = ${data.totalStar},
isUnlock = ${data.isUnlock},
revealRank = '${data.revealRank}',
defeatRank = '${data.defeatRank}',
damageRank = '${data.damageRank}',
takeDamageRank = '${data.takeDamageRank}',
normalSkillRank = '${data.normalSkillRank}',
energySkillRank = '${data.energySkillRank}',
floors = '${data.floors}',
updated = '${timeNow}';
`;
}
@@ -75,24 +75,24 @@ function getInsertSql(uid: string, data: TGApp.Game.Abyss.FullData): string {
VALUES ('${uid}', ${data.schedule_id}, '${startTime}', '${endTime}', ${data.total_battle_times},
${data.total_win_times}, '${data.max_floor}', ${data.total_star}, ${isUnlock},
'${revealRank}', '${defeatRank}', '${damageRank}', '${takeDamageRank}', '${normalSkillRank}',
'${energySkillRank}', '${floors}', '${skippedFloor}', '${timeNow}') ON CONFLICT(uid, id) DO
UPDATE
SET startTime = '${startTime}',
endTime = '${endTime}',
totalBattleTimes = ${data.total_battle_times},
totalWinTimes = ${data.total_win_times},
maxFloor = '${data.max_floor}',
totalStar = ${data.total_star},
isUnlock = ${isUnlock},
revealRank = '${revealRank}',
defeatRank = '${defeatRank}',
damageRank = '${damageRank}',
takeDamageRank = '${takeDamageRank}',
normalSkillRank = '${normalSkillRank}',
energySkillRank = '${energySkillRank}',
floors = '${floors}',
skippedFloor = '${skippedFloor}',
updated = '${timeNow}';
'${energySkillRank}', '${floors}', '${skippedFloor}', '${timeNow}')
ON CONFLICT(uid, id) DO UPDATE
SET startTime = '${startTime}',
endTime = '${endTime}',
totalBattleTimes = ${data.total_battle_times},
totalWinTimes = ${data.total_win_times},
maxFloor = '${data.max_floor}',
totalStar = ${data.total_star},
isUnlock = ${isUnlock},
revealRank = '${revealRank}',
defeatRank = '${defeatRank}',
damageRank = '${damageRank}',
takeDamageRank = '${takeDamageRank}',
normalSkillRank = '${normalSkillRank}',
energySkillRank = '${energySkillRank}',
floors = '${floors}',
skippedFloor = '${skippedFloor}',
updated = '${timeNow}';
`;
}
@@ -223,7 +223,7 @@ async function backupAbyss(dir: string): Promise<void> {
await TGLogger.Warn(`未检测到备份目录,已创建`);
}
const data = await getAbyss();
await writeTextFile(`${dir}${path.sep()}abyss.json`, JSON.stringify(data));
await writeTextFile(`${dir}${path.sep()}abyss.json`, JSON.stringify(data, null, 2));
}
/**