mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-09 08:48:21 +08:00
♻️ 调整目录结构
This commit is contained in:
@@ -22,7 +22,8 @@ import { createPost } from "../../utils/TGWindow.js";
|
||||
import OtherApi from "../../web/request/otherReq.js";
|
||||
import showDialog from "../func/dialog.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import ToLivecode from "../overlay/to-livecode.vue";
|
||||
|
||||
import ToLivecode from "./to-livecode.vue";
|
||||
|
||||
interface TGameNavProps {
|
||||
modelValue: number;
|
||||
@@ -72,7 +72,7 @@ import { computed, onMounted, onUnmounted, ref, watch } from "vue";
|
||||
|
||||
import { generateShareImg, saveImgLocal } from "../../utils/TGShare.js";
|
||||
import { createPost } from "../../utils/TGWindow.js";
|
||||
import TpAvatar from "../post/tp-avatar.vue";
|
||||
import TpAvatar from "../viewPost/tp-avatar.vue";
|
||||
|
||||
interface TPostCardProps {
|
||||
modelValue: TGApp.Plugins.Mys.Post.FullData;
|
||||
@@ -55,7 +55,8 @@ import { computed } from "vue";
|
||||
import { generateShareImg } from "../../utils/TGShare.js";
|
||||
import { timestampToDate } from "../../utils/toolFunc.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
import TOverlay from "./t-overlay.vue";
|
||||
|
||||
interface ToLiveCodeProps {
|
||||
data: TGApp.BBS.Navigator.CodeData[];
|
||||
@@ -29,7 +29,8 @@
|
||||
import { computed, ref } from "vue";
|
||||
|
||||
import { generateShareImg } from "../../utils/TGShare.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
import TOverlay from "./t-overlay.vue";
|
||||
|
||||
interface ToNamecardProps {
|
||||
modelValue: boolean;
|
||||
@@ -58,7 +58,7 @@ import { computed, ref } from "vue";
|
||||
import { AbyssDataItem } from "../../pages/WIKI/Abyss.vue";
|
||||
import { generateShareImg } from "../../utils/TGShare.js";
|
||||
import { timestampToDate } from "../../utils/toolFunc.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
|
||||
import HtaOverviewLine from "./hta-overview-line.vue";
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<template v-slot:item="{ item }">
|
||||
<tr class="hta-th-tr">
|
||||
<td class="hta-th-icon">
|
||||
<TibWikiAbyss2 v-model="item.AvatarId" />
|
||||
<TItemBox :model-value="getBoxData(item.AvatarId)" />
|
||||
</td>
|
||||
<td>
|
||||
<span>{{ (item.HoldingRate.cur * 100).toFixed(3) }}%</span>
|
||||
@@ -31,8 +31,9 @@
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import { AbyssDataItem } from "../../pages/WIKI/Abyss.vue";
|
||||
import TibWikiAbyss2 from "../itembox/tib-wiki-abyss-2.vue";
|
||||
import TItemBox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface HtaTabHoldProps {
|
||||
data: AbyssDataItem<TGApp.Plugins.Hutao.Abyss.AvatarHold[]>;
|
||||
@@ -101,6 +102,29 @@ function getRateStr(cur: number, last: number): string {
|
||||
const diff = Math.abs(cur - last) * 100;
|
||||
return `(${cur > last ? "↑" : "↓"}${diff.toFixed(3)}%)`;
|
||||
}
|
||||
|
||||
function getBoxData(id: number): TItemBoxData {
|
||||
const avatar = AppCharacterData.find((a) => a.id === id);
|
||||
return {
|
||||
bg: `/icon/bg/${avatar?.star ?? 5}-Star.webp`,
|
||||
clickable: false,
|
||||
display: "inner",
|
||||
height: "80px",
|
||||
icon: `/WIKI/character/${id}.webp`,
|
||||
innerHeight: 20,
|
||||
innerText: avatar?.name ?? "旅行者",
|
||||
lt:
|
||||
avatar === undefined
|
||||
? ""
|
||||
: avatar.element !== ""
|
||||
? `/icon/element/${avatar.element}元素.webp`
|
||||
: `/icon/weapon/${avatar.weapon}.webp`,
|
||||
ltSize: "20px",
|
||||
size: "80px",
|
||||
innerIcon: `/icon/weapon/${avatar?.weapon ?? "单手剑"}.webp`,
|
||||
innerBlur: "5px",
|
||||
};
|
||||
}
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
.hta-th-tr {
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import { AbyssDataItem } from "../../pages/WIKI/Abyss.vue";
|
||||
import TibWikiAbyss from "../itembox/tib-wiki-abyss.vue";
|
||||
|
||||
import TibWikiAbyss from "./tib-wiki-abyss.vue";
|
||||
|
||||
interface HtaTabUpProps {
|
||||
data: AbyssDataItem<TGApp.Plugins.Hutao.Abyss.AvatarUse[]>;
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import { AbyssDataItem } from "../../pages/WIKI/Abyss.vue";
|
||||
import TibWikiAbyss from "../itembox/tib-wiki-abyss.vue";
|
||||
|
||||
import TibWikiAbyss from "./tib-wiki-abyss.vue";
|
||||
|
||||
interface HtaTabUseProps {
|
||||
data: AbyssDataItem<TGApp.Plugins.Hutao.Abyss.AvatarUse[]>;
|
||||
|
||||
@@ -1,23 +1,47 @@
|
||||
<template>
|
||||
<div class="hta-tl-box">
|
||||
<div class="hta-tl-item">
|
||||
<TibWikiAbyss2
|
||||
<TItemBox
|
||||
v-for="item in props.modelValue.Item.split(',')"
|
||||
:key="item"
|
||||
:model-value="item"
|
||||
:model-value="getBoxData(item)"
|
||||
/>
|
||||
</div>
|
||||
<div class="hta-tl-rate">上场{{ props.modelValue.Rate }}次</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import TibWikiAbyss2 from "../itembox/tib-wiki-abyss-2.vue";
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TItemBox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface HtaTeamLineProps {
|
||||
modelValue: { Item: string; Rate: number };
|
||||
}
|
||||
|
||||
const props = defineProps<HtaTeamLineProps>();
|
||||
|
||||
function getBoxData(id: string): TItemBoxData {
|
||||
const avatar = AppCharacterData.find((i) => i.id.toString() === id);
|
||||
return {
|
||||
bg: `/icon/bg/${avatar?.star ?? 5}-Star.webp`,
|
||||
clickable: false,
|
||||
display: "inner",
|
||||
height: "80px",
|
||||
icon: `/WIKI/character/${id}.webp`,
|
||||
innerHeight: 20,
|
||||
innerText: avatar?.name ?? "旅行者",
|
||||
lt:
|
||||
avatar === undefined
|
||||
? ""
|
||||
: avatar.element !== ""
|
||||
? `/icon/element/${avatar.element}元素.webp`
|
||||
: `/icon/weapon/${avatar.weapon}.webp`,
|
||||
ltSize: "20px",
|
||||
size: "80px",
|
||||
innerIcon: `/icon/weapon/${avatar?.weapon ?? "单手剑"}.webp`,
|
||||
innerBlur: "5px",
|
||||
};
|
||||
}
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
.hta-tl-box {
|
||||
|
||||
@@ -13,7 +13,7 @@ import { ref, onMounted, computed } from "vue";
|
||||
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import { AbyssDataItem } from "../../pages/WIKI/Abyss.vue";
|
||||
import TItemBox, { type TItemBoxData } from "../main/t-itembox.vue";
|
||||
import TItemBox, { type TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface TibWikiAbyssProps {
|
||||
modelValue: AbyssDataItem<{ Item: number; Rate: number }>;
|
||||
@@ -1,49 +0,0 @@
|
||||
<template>
|
||||
<TItemBox :model-value="box" v-if="box" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TItemBox from "../main/t-itembox.vue";
|
||||
import type { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
interface TibAbyssDetailProps {
|
||||
modelValue: TGApp.Sqlite.Abyss.CharacterInfo;
|
||||
}
|
||||
|
||||
const props = defineProps<TibAbyssDetailProps>();
|
||||
const box = ref<TItemBoxData>();
|
||||
|
||||
onMounted(async () => {
|
||||
const res = AppCharacterData.find((a) => a.id === props.modelValue.id);
|
||||
if (res === undefined) return;
|
||||
if (props.modelValue.id === 10000005 || props.modelValue.id === 10000007) {
|
||||
box.value = {
|
||||
clickable: false,
|
||||
height: "70px",
|
||||
ltSize: "20px",
|
||||
bg: `/icon/bg/${props.modelValue.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${props.modelValue.id}.webp`,
|
||||
lt: `/icon/weapon/${res.weapon}.webp`,
|
||||
innerText: `Lv.${props.modelValue.level}`,
|
||||
innerHeight: 20,
|
||||
display: "inner",
|
||||
size: "70px",
|
||||
};
|
||||
} else {
|
||||
box.value = {
|
||||
clickable: false,
|
||||
height: "70px",
|
||||
ltSize: "20px",
|
||||
bg: `/icon/bg/${props.modelValue.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${props.modelValue.id}.webp`,
|
||||
lt: `/icon/element/${res.element}元素.webp`,
|
||||
innerText: `Lv.${props.modelValue.level}`,
|
||||
innerHeight: 20,
|
||||
display: "inner",
|
||||
size: "70px",
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -1,34 +0,0 @@
|
||||
<template>
|
||||
<TItemBox v-model="box" v-if="box" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TItemBox from "../main/t-itembox.vue";
|
||||
import type { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
interface TibAbyssOverviewProps {
|
||||
modelValue: TGApp.Sqlite.Abyss.Character;
|
||||
}
|
||||
|
||||
const props = defineProps<TibAbyssOverviewProps>();
|
||||
const box = ref<TItemBoxData>();
|
||||
|
||||
onMounted(() => {
|
||||
const res = AppCharacterData.find((a) => a.id === props.modelValue.id);
|
||||
if (res === undefined) return;
|
||||
box.value = {
|
||||
height: "80px",
|
||||
ltSize: "20px",
|
||||
clickable: false,
|
||||
bg: `/icon/bg/${props.modelValue.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${props.modelValue.id}.webp`,
|
||||
lt: `/icon/element/${res.element}元素.webp`,
|
||||
innerText: props.modelValue.value.toString(),
|
||||
display: "inner",
|
||||
size: "80px",
|
||||
innerHeight: 20,
|
||||
};
|
||||
});
|
||||
</script>
|
||||
@@ -1,61 +0,0 @@
|
||||
<template>
|
||||
<TItemBox :model-value="box" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import TItemBox from "../main/t-itembox.vue";
|
||||
import type { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
interface TibCalendarItemProps {
|
||||
model: "avatar" | "weapon";
|
||||
data: TGApp.App.Calendar.Item;
|
||||
clickable: boolean;
|
||||
}
|
||||
|
||||
const props = defineProps<TibCalendarItemProps>();
|
||||
const box = ref<TItemBoxData>({
|
||||
bg: "",
|
||||
icon: "",
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: false,
|
||||
lt: "",
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerIcon: "",
|
||||
innerText: "",
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
if (props.model === "avatar") {
|
||||
box.value = {
|
||||
bg: props.data.bg,
|
||||
icon: props.data.icon,
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: props.clickable,
|
||||
lt: props.data.elementIcon ?? "",
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerIcon: props.data.weaponIcon,
|
||||
innerText: props.data.name,
|
||||
};
|
||||
} else {
|
||||
box.value = {
|
||||
bg: props.data.bg,
|
||||
icon: props.data.icon,
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: props.clickable,
|
||||
lt: props.data.weaponIcon,
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerText: props.data.name,
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -1,44 +0,0 @@
|
||||
<template>
|
||||
<TItemBox :model-value="getBox()" :title="hoverTitle" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
import TItemBox from "../main/t-itembox.vue";
|
||||
import type { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
interface TibUrAvatarProps {
|
||||
modelValue: TGApp.Sqlite.Record.Avatar;
|
||||
}
|
||||
|
||||
const props = defineProps<TibUrAvatarProps>();
|
||||
const hoverTitle = ref<string>("点击查看详情");
|
||||
const getName = (): string => {
|
||||
return props.modelValue.id === 10000005
|
||||
? "旅行者-空"
|
||||
: props.modelValue.id === 10000007
|
||||
? "旅行者-荧"
|
||||
: props.modelValue.name;
|
||||
};
|
||||
|
||||
function getBox(): TItemBoxData {
|
||||
return {
|
||||
size: "80px",
|
||||
height: "80px",
|
||||
ltSize: "20px",
|
||||
clickable: false,
|
||||
bg: `/icon/bg/${props.modelValue.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${props.modelValue.id}.webp`,
|
||||
lt: `/icon/element/${props.modelValue.element}元素.webp`,
|
||||
rt: props.modelValue.constellation.toString() || "0",
|
||||
rtSize: "20px",
|
||||
innerText: `${getName()}`,
|
||||
innerHeight: 20,
|
||||
display: "inner",
|
||||
};
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
hoverTitle.value = `等级:${props.modelValue.level}\n好感:${props.modelValue.fetter}\n角色ID:${props.modelValue.id}`;
|
||||
});
|
||||
</script>
|
||||
@@ -1,43 +0,0 @@
|
||||
<template>
|
||||
<TItemBox :model-value="box" />
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, computed } from "vue";
|
||||
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TItemBox, { type TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
interface TibWikiAbyssProps {
|
||||
modelValue: string | number;
|
||||
}
|
||||
|
||||
const props = defineProps<TibWikiAbyssProps>();
|
||||
|
||||
const avatar = ref<TGApp.App.Character.WikiBriefInfo>();
|
||||
|
||||
const box = computed<TItemBoxData>(() => {
|
||||
return {
|
||||
bg: `/icon/bg/${avatar.value?.star ?? 5}-Star.webp`,
|
||||
clickable: false,
|
||||
display: "inner",
|
||||
height: "80px",
|
||||
icon: `/WIKI/character/${props.modelValue}.webp`,
|
||||
innerHeight: 20,
|
||||
innerText: avatar.value?.name ?? "旅行者",
|
||||
lt:
|
||||
avatar.value === undefined
|
||||
? ""
|
||||
: avatar.value.element !== ""
|
||||
? `/icon/element/${avatar.value.element}元素.webp`
|
||||
: `/icon/weapon/${avatar.value.weapon}.webp`,
|
||||
ltSize: "20px",
|
||||
size: "80px",
|
||||
innerIcon: `/icon/weapon/${avatar.value?.weapon}.webp`,
|
||||
innerBlur: "5px",
|
||||
};
|
||||
});
|
||||
|
||||
onMounted(async () => {
|
||||
avatar.value = AppCharacterData.find((a) => a.id.toString() === props.modelValue.toString())!;
|
||||
});
|
||||
</script>
|
||||
@@ -8,11 +8,11 @@
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { parseAnnoContent } from "../../web/utils/annoParser.js";
|
||||
import TpBackupText from "../post/tp-backupText.vue";
|
||||
import TpImage from "../post/tp-image.vue";
|
||||
import TpText from "../post/tp-text.vue";
|
||||
import TpTexts from "../post/tp-texts.vue";
|
||||
import TpUnknown from "../post/tp-unknown.vue";
|
||||
import TpBackupText from "../viewPost/tp-backupText.vue";
|
||||
import TpImage from "../viewPost/tp-image.vue";
|
||||
import TpText from "../viewPost/tp-text.vue";
|
||||
import TpTexts from "../viewPost/tp-texts.vue";
|
||||
import TpUnknown from "../viewPost/tp-unknown.vue";
|
||||
|
||||
import TaTable from "./ta-table.vue";
|
||||
|
||||
@@ -34,8 +34,8 @@ import { xml2json } from "xml-js";
|
||||
|
||||
import { copyToClipboard, getImageBuffer, saveCanvasImg } from "../../utils/TGShare.js";
|
||||
import { bytesToSize } from "../../utils/toolFunc.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
interface ToArcBirthProps {
|
||||
modelValue: boolean;
|
||||
@@ -25,9 +25,9 @@
|
||||
import { computed, ref, watch } from "vue";
|
||||
|
||||
import TSUserCollection from "../../plugins/Sqlite/modules/userCollect.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showDialog from "../func/dialog.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
interface ToPostCollectProps {
|
||||
modelValue: boolean;
|
||||
@@ -1,19 +1,13 @@
|
||||
<template>
|
||||
<div class="tcm-box">
|
||||
<div class="tcm-left">
|
||||
<div class="tcm-bg">
|
||||
<img :src="props.item.bg" alt="bg" />
|
||||
</div>
|
||||
<div class="tcm-icon">
|
||||
<img :src="props.item.icon" alt="icon" />
|
||||
</div>
|
||||
<div class="tcm-bg"><img :src="props.item.bg" alt="bg" /></div>
|
||||
<div class="tcm-icon"><img :src="props.item.icon" alt="icon" /></div>
|
||||
<div class="tcm-star" v-if="props.item.star !== 0">
|
||||
<img :src="props.item.starIcon" alt="element" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="tcm-right">
|
||||
{{ props.item.name }}
|
||||
</div>
|
||||
<div class="tcm-right">{{ props.item.name }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
@@ -1,13 +1,9 @@
|
||||
<template>
|
||||
<TOverlay v-model="visible" hide :to-click="onCancel" blur-val="20px">
|
||||
<TOverlay v-model="visible" :to-click="onCancel" blur-val="20px" hide>
|
||||
<div class="toc-box">
|
||||
<div class="box-div">
|
||||
<div class="toc-top">
|
||||
<TibCalendarItem
|
||||
:model="itemType"
|
||||
:data="<TGApp.App.Calendar.Item>itemVal"
|
||||
:clickable="false"
|
||||
/>
|
||||
<TItemBox :model-value="getBoxData()" />
|
||||
<div class="toc-material-grid">
|
||||
<TibCalendarMaterial
|
||||
v-for="(item, index) in itemVal.materials"
|
||||
@@ -16,7 +12,7 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<img src="/source/UI/item-line.webp" alt="line" class="toc-line" />
|
||||
<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>
|
||||
@@ -29,13 +25,14 @@
|
||||
</div>
|
||||
</TOverlay>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
<script lang="ts" setup>
|
||||
import { computed } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
import TibCalendarItem from "../itembox/tib-calendar-item.vue";
|
||||
import TibCalendarMaterial from "../itembox/tib-calendar-material.vue";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TItemBox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
|
||||
import TibCalendarMaterial from "./ph-calendar-material.vue";
|
||||
|
||||
interface ToCalendarProps {
|
||||
modelValue: boolean;
|
||||
@@ -60,7 +57,6 @@ const visible = computed({
|
||||
emits("update:modelValue", value);
|
||||
},
|
||||
});
|
||||
const itemType = computed(() => props.dataType);
|
||||
const itemVal = computed<TGApp.App.Calendar.Item>(() => props.dataVal);
|
||||
|
||||
const onCancel = (): void => {
|
||||
@@ -75,9 +71,39 @@ async function toDetail(item: TGApp.App.Calendar.Item): Promise<void> {
|
||||
await router.push(`/wiki/weapon/${item.id}`);
|
||||
}
|
||||
}
|
||||
|
||||
function getBoxData(): TItemBoxData {
|
||||
if (props.dataType === "avatar") {
|
||||
return {
|
||||
bg: props.dataVal.bg,
|
||||
icon: props.dataVal.icon,
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: false,
|
||||
lt: props.dataVal.elementIcon ?? "",
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerIcon: props.dataVal.weaponIcon,
|
||||
innerText: props.dataVal.name,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
bg: props.dataVal.bg,
|
||||
icon: props.dataVal.icon,
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: false,
|
||||
lt: props.dataVal.weaponIcon,
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerText: props.dataVal.name,
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
/* overlay 盒子 */
|
||||
<style lang="css" scoped>
|
||||
.toc-box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -10,7 +10,7 @@
|
||||
</template>
|
||||
<template #default>
|
||||
<div class="tc-top">
|
||||
<div class="tc-btns">
|
||||
<div class="tc-btn-list">
|
||||
<v-btn
|
||||
v-for="text of btnText"
|
||||
:key="text.week"
|
||||
@@ -31,7 +31,8 @@
|
||||
: 'var(--btn-text)',
|
||||
}"
|
||||
@click="getContents(text.week)"
|
||||
>{{ text.text }}
|
||||
>
|
||||
{{ text.text }}
|
||||
</v-btn>
|
||||
</div>
|
||||
<v-pagination class="tc-page" v-model="page" :total-visible="visible" :length="length" />
|
||||
@@ -39,13 +40,12 @@
|
||||
<div class="tc-content">
|
||||
<TCalendarBirth />
|
||||
<div class="calendar-grid">
|
||||
<div v-for="item in renderItems" :key="item.id" @click="selectItem(item)">
|
||||
<TibCalendarItem
|
||||
:data="<TGApp.App.Calendar.Item>item"
|
||||
:model="switchType"
|
||||
:clickable="true"
|
||||
/>
|
||||
</div>
|
||||
<TItemBoxData
|
||||
v-for="item in renderItems"
|
||||
:key="item.id"
|
||||
@click="selectItem(item)"
|
||||
:model-value="getBoxData(item)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -56,11 +56,12 @@
|
||||
import { onMounted, ref, watch } from "vue";
|
||||
|
||||
import { AppCalendarData } from "../../data/index.js";
|
||||
import TibCalendarItem from "../itembox/tib-calendar-item.vue";
|
||||
import ToCalendar from "../overlay/to-calendar.vue";
|
||||
import { timestampToDate } from "../../utils/toolFunc.js";
|
||||
import type { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
import TCalendarBirth from "./t-calendar-birth.vue";
|
||||
import THomeCard from "./t-homecard.vue";
|
||||
import TCalendarBirth from "./ph-calendar-birth.vue";
|
||||
import ToCalendar from "./ph-calendar-overlay.vue";
|
||||
import THomeCard from "./ph-comp-card.vue";
|
||||
|
||||
const weekNow = ref<number>(0);
|
||||
const btnNow = ref<number>(0);
|
||||
@@ -84,34 +85,13 @@ const selectedType = ref<"avatar" | "weapon">("avatar");
|
||||
const renderItems = ref<TGApp.App.Calendar.Item[]>([]);
|
||||
|
||||
const btnText = [
|
||||
{
|
||||
week: 7,
|
||||
text: "周日",
|
||||
},
|
||||
{
|
||||
week: 1,
|
||||
text: "周一",
|
||||
},
|
||||
{
|
||||
week: 2,
|
||||
text: "周二",
|
||||
},
|
||||
{
|
||||
week: 3,
|
||||
text: "周三",
|
||||
},
|
||||
{
|
||||
week: 4,
|
||||
text: "周四",
|
||||
},
|
||||
{
|
||||
week: 5,
|
||||
text: "周五",
|
||||
},
|
||||
{
|
||||
week: 6,
|
||||
text: "周六",
|
||||
},
|
||||
{ week: 7, text: "周日" },
|
||||
{ week: 1, text: "周一" },
|
||||
{ week: 2, text: "周二" },
|
||||
{ week: 3, text: "周三" },
|
||||
{ week: 4, text: "周四" },
|
||||
{ week: 5, text: "周五" },
|
||||
{ week: 6, text: "周六" },
|
||||
];
|
||||
|
||||
interface TCalendarEmits {
|
||||
@@ -123,14 +103,7 @@ const emits = defineEmits<TCalendarEmits>();
|
||||
onMounted(async () => {
|
||||
const dayNow = new Date().getDay() === 0 ? 7 : new Date().getDay();
|
||||
const week = <{ week: number; text: string }>btnText.find((item) => item.week === dayNow);
|
||||
dateNow.value =
|
||||
new Date()
|
||||
.toLocaleDateString("zh-CN", {
|
||||
year: "numeric",
|
||||
month: "2-digit",
|
||||
day: "2-digit",
|
||||
})
|
||||
.replace(/\//g, "-") + ` ${week.text}`;
|
||||
dateNow.value = `${timestampToDate(new Date().getTime())} ${week.text}`;
|
||||
weekNow.value = dayNow;
|
||||
btnNow.value = dayNow;
|
||||
calendarNow.value = getCalendar(dayNow);
|
||||
@@ -150,11 +123,8 @@ watch(
|
||||
watch(
|
||||
() => switchType.value,
|
||||
() => {
|
||||
if (page.value !== 1) {
|
||||
page.value = 1;
|
||||
} else {
|
||||
renderItems.value = getGrid();
|
||||
}
|
||||
if (page.value !== 1) page.value = 1;
|
||||
else renderItems.value = getGrid();
|
||||
},
|
||||
);
|
||||
|
||||
@@ -165,11 +135,8 @@ function getCalendar(day: number): TGApp.App.Calendar.Item[] {
|
||||
|
||||
function getGrid(): TGApp.App.Calendar.Item[] {
|
||||
let selectedCards: TGApp.App.Calendar.Item[];
|
||||
if (switchType.value === "avatar") {
|
||||
selectedCards = characterCards.value;
|
||||
} else {
|
||||
selectedCards = weaponCards.value;
|
||||
}
|
||||
if (switchType.value === "avatar") selectedCards = characterCards.value;
|
||||
else selectedCards = weaponCards.value;
|
||||
length.value = Math.ceil(selectedCards.length / visible);
|
||||
return selectedCards.slice((page.value - 1) * visible, page.value * visible);
|
||||
}
|
||||
@@ -185,10 +152,38 @@ function getContents(day: number): void {
|
||||
calendarNow.value = getCalendar(day);
|
||||
characterCards.value = calendarNow.value.filter((item) => item.itemType === "character");
|
||||
weaponCards.value = calendarNow.value.filter((item) => item.itemType === "weapon");
|
||||
if (page.value !== 1) {
|
||||
page.value = 1;
|
||||
if (page.value !== 1) page.value = 1;
|
||||
else renderItems.value = getGrid();
|
||||
}
|
||||
|
||||
function getBoxData(item: TGApp.App.Calendar.Item): TItemBoxData {
|
||||
if (switchType.value === "avatar") {
|
||||
return {
|
||||
bg: item.bg,
|
||||
icon: item.icon,
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: true,
|
||||
lt: item.elementIcon ?? "",
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerIcon: item.weaponIcon,
|
||||
innerText: item.name,
|
||||
};
|
||||
} else {
|
||||
renderItems.value = getGrid();
|
||||
return {
|
||||
bg: item.bg,
|
||||
icon: item.icon,
|
||||
size: "100px",
|
||||
height: "100px",
|
||||
display: "inner",
|
||||
clickable: true,
|
||||
lt: item.weaponIcon,
|
||||
ltSize: "20px",
|
||||
innerHeight: 25,
|
||||
innerText: item.name,
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -210,7 +205,7 @@ function getContents(day: number): void {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.tc-btns {
|
||||
.tc-btn-list {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="thc-title">
|
||||
<slot name="title"></slot>
|
||||
</div>
|
||||
<div class="thc-append" v-if="props.append">
|
||||
<div v-if="props.append" class="thc-append">
|
||||
<slot name="title-append"></slot>
|
||||
</div>
|
||||
<div class="thc-box">
|
||||
@@ -61,10 +61,10 @@ import Mys from "../../plugins/Mys/index.js";
|
||||
import { useHomeStore } from "../../store/modules/home.js";
|
||||
import { createPost, createTGWindow } from "../../utils/TGWindow.js";
|
||||
import { stamp2LastTime } from "../../utils/toolFunc.js";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
import THomeCard from "./t-homecard.vue";
|
||||
import THomeCard from "./ph-comp-card.vue";
|
||||
|
||||
// store
|
||||
const homeStore = storeToRefs(useHomeStore());
|
||||
@@ -3,9 +3,9 @@
|
||||
<template #title>近期活动</template>
|
||||
<template #default>
|
||||
<div class="position-grid">
|
||||
<v-card v-for="(card, index) in positionCards" :key="index" rounded class="position-card">
|
||||
<v-card v-for="(card, index) in positionCards" :key="index" class="position-card" rounded>
|
||||
<v-list class="position-list">
|
||||
<v-list-item :title="card.title" :subtitle="card.abstract">
|
||||
<v-list-item :subtitle="card.abstract" :title="card.title">
|
||||
<template #prepend>
|
||||
<v-avatar rounded="0" @click="openPosition(card)">
|
||||
<v-img :src="card.icon" class="position-icon" />
|
||||
@@ -36,7 +36,7 @@
|
||||
</THomeCard>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref, onMounted, onUnmounted } from "vue";
|
||||
import { onMounted, onUnmounted, ref } from "vue";
|
||||
|
||||
import Mys from "../../plugins/Mys/index.js";
|
||||
import { parseLink } from "../../utils/linkParser.js";
|
||||
@@ -44,7 +44,7 @@ import { createPost } from "../../utils/TGWindow.js";
|
||||
import { stamp2LastTime } from "../../utils/toolFunc.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
|
||||
import THomeCard from "./t-homecard.vue";
|
||||
import THomeCard from "./ph-comp-card.vue";
|
||||
|
||||
// data
|
||||
const positionCards = ref<TGApp.Plugins.Mys.Position.RenderCard[]>([]);
|
||||
@@ -32,8 +32,8 @@ import { useRouter } from "vue-router";
|
||||
import { useAppStore } from "../../store/modules/app.js";
|
||||
import { ToChannelItem } from "../../web/constant/bbs.js";
|
||||
import TGConstant from "../../web/constant/TGConstant.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
interface ToChannelProps {
|
||||
gid?: string;
|
||||
@@ -103,10 +103,10 @@ import { useRouter } from "vue-router";
|
||||
import { WikiCharacterData, AppNameCardsData, AppCharacterData } from "../../data/index.js";
|
||||
import { createObc } from "../../utils/TGWindow.js";
|
||||
import { parseHtmlText } from "../../utils/toolFunc.js";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
import ToNamecard from "../app/to-namecard.vue";
|
||||
import TopNamecard from "../app/top-namecard.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
import ToNamecard from "../overlay/to-namecard.vue";
|
||||
import TopNamecard from "../overlay/top-namecard.vue";
|
||||
|
||||
import TwcConstellations from "./twc-constellations.vue";
|
||||
import TwcMaterials from "./twc-materials.vue";
|
||||
@@ -56,8 +56,8 @@ import { computed, onMounted, ref, watch } from "vue";
|
||||
import { WikiWeaponData } from "../../data/index.js";
|
||||
import { createObc } from "../../utils/TGWindow.js";
|
||||
import { parseHtmlText } from "../../utils/toolFunc.js";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
import TwcMaterials from "./twc-materials.vue";
|
||||
|
||||
@@ -31,7 +31,7 @@ import { computed } from "vue";
|
||||
|
||||
import { generateShareImg } from "../../utils/TGShare.js";
|
||||
import { parseHtmlText } from "../../utils/toolFunc.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
|
||||
import TwoConvert from "./two-convert.vue";
|
||||
import TwoSource from "./two-source.vue";
|
||||
@@ -67,7 +67,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from "vue";
|
||||
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
|
||||
// 一些数据
|
||||
const selectStarList = [4, 5];
|
||||
@@ -37,7 +37,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from "vue";
|
||||
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
|
||||
// 一些数据
|
||||
const selectStarList = [4, 5];
|
||||
@@ -2,16 +2,17 @@
|
||||
<div class="tud-db-box">
|
||||
<div class="tud-db-time">{{ props.title }} {{ props.modelValue.time }}</div>
|
||||
<div class="tud-db-icons-grid">
|
||||
<TibAbyssDetail
|
||||
<TItemBox
|
||||
v-for="avatar in props.modelValue.characters"
|
||||
:key="avatar.id"
|
||||
:model-value="avatar"
|
||||
:model-value="getBoxData(avatar)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import TibAbyssDetail from "../itembox/tib-abyss-detail.vue";
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TItemBox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface TuaDetailBattleProps {
|
||||
title: string;
|
||||
@@ -19,6 +20,36 @@ interface TuaDetailBattleProps {
|
||||
}
|
||||
|
||||
const props = defineProps<TuaDetailBattleProps>();
|
||||
|
||||
function getBoxData(avatar: TGApp.Sqlite.Abyss.CharacterInfo): TItemBoxData {
|
||||
const res = AppCharacterData.find((i) => i.id === avatar.id);
|
||||
if (avatar.id === 10000005 || avatar.id === 10000007) {
|
||||
return {
|
||||
clickable: false,
|
||||
height: "70px",
|
||||
ltSize: "20px",
|
||||
bg: `/icon/bg/${avatar.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${avatar.id}.webp`,
|
||||
lt: `/icon/weapon/${res?.weapon ?? "单手剑"}.webp`,
|
||||
innerText: `Lv.${avatar.level}`,
|
||||
innerHeight: 20,
|
||||
display: "inner",
|
||||
size: "70px",
|
||||
};
|
||||
}
|
||||
return {
|
||||
clickable: false,
|
||||
height: "70px",
|
||||
ltSize: "20px",
|
||||
bg: `/icon/bg/${avatar.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${avatar.id}.webp`,
|
||||
lt: `/icon/element/${res?.element ?? "风"}元素.webp`,
|
||||
innerText: `Lv.${avatar.level}`,
|
||||
innerHeight: 20,
|
||||
display: "inner",
|
||||
size: "70px",
|
||||
};
|
||||
}
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
.tud-db-icons-grid {
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
</div>
|
||||
<div v-if="props.valIcons" class="tuao-val-icons">
|
||||
<slot name="val-icons">
|
||||
<TibAbyssOverview
|
||||
v-for="avatar in JSON.parse(props.valIcons) as TGApp.Sqlite.Abyss.Character[]"
|
||||
<TItemBox
|
||||
v-for="avatar in props.valIcons"
|
||||
:key="avatar.id"
|
||||
:model-value="avatar"
|
||||
:model-value="getBoxData(avatar)"
|
||||
/>
|
||||
</slot>
|
||||
</div>
|
||||
@@ -24,17 +24,34 @@
|
||||
<script lang="ts" setup>
|
||||
import { computed } from "vue";
|
||||
|
||||
import TibAbyssOverview from "../itembox/tib-abyss-overview.vue";
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TItemBox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface TAOProps {
|
||||
title: string;
|
||||
valText?: string | number;
|
||||
valIcons?: string;
|
||||
valIcons?: TGApp.Sqlite.Abyss.Character[];
|
||||
multi4?: boolean;
|
||||
}
|
||||
|
||||
const props = defineProps<TAOProps>();
|
||||
const getIconNum = computed(() => (props.multi4 ? 4 : 1));
|
||||
|
||||
function getBoxData(avatar: TGApp.Sqlite.Abyss.Character): TItemBoxData {
|
||||
const res = AppCharacterData.find((a) => a.id === avatar.id);
|
||||
return {
|
||||
height: "80px",
|
||||
ltSize: "20px",
|
||||
clickable: false,
|
||||
bg: `/icon/bg/${avatar.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${avatar.id}.webp`,
|
||||
lt: `/icon/element/${res?.element ?? "风"}元素.webp`,
|
||||
innerText: avatar.value.toString(),
|
||||
display: "inner",
|
||||
size: "80px",
|
||||
innerHeight: 20,
|
||||
};
|
||||
}
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
.tuao-box {
|
||||
|
||||
@@ -34,9 +34,9 @@ import { ref, computed, watch, onMounted } from "vue";
|
||||
|
||||
import { AppAchievementSeriesData, AppNameCardsData } from "../../data/index.js";
|
||||
import TSUserAchi from "../../plugins/Sqlite/modules/userAchi.js";
|
||||
import ToNameCard from "../app/to-namecard.vue";
|
||||
import TopNameCard from "../app/top-namecard.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import ToNameCard from "../overlay/to-namecard.vue";
|
||||
import TopNameCard from "../overlay/top-namecard.vue";
|
||||
|
||||
import ToAchiInfo from "./tua-achi-overlay.vue";
|
||||
import TuaAchi from "./tua-achi.vue";
|
||||
|
||||
@@ -49,15 +49,15 @@
|
||||
<slot name="right"></slot>
|
||||
</div>
|
||||
</TOverlay>
|
||||
<ToPostSearch gid="2" v-model="showSearch" :keyword="search" />
|
||||
<VpOverlaySearch gid="2" v-model="showSearch" :keyword="search" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref } from "vue";
|
||||
|
||||
import { AppAchievementSeriesData } from "../../data/index.js";
|
||||
import TGLogger from "../../utils/TGLogger.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import ToPostSearch from "../post/to-postSearch.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import VpOverlaySearch from "../viewPost/vp-overlay-search.vue";
|
||||
|
||||
interface ToAchiInfoProps {
|
||||
modelValue: boolean;
|
||||
|
||||
@@ -50,7 +50,7 @@ import { computed } from "vue";
|
||||
import TSUserAvatar from "../../plugins/Sqlite/modules/userAvatar.js";
|
||||
import { useUserStore } from "../../store/modules/user.js";
|
||||
import { getZhElement } from "../../utils/toolFunc.js";
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
import TuaRelicBox from "./tua-relic-box.vue";
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref, watch } from "vue";
|
||||
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import TucDetailCard from "../userAvatarCard/tuc-detail-card.vue";
|
||||
import TucDetailOld from "../userAvatarOld/tuc-detail-old.vue";
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
import { computed } from "vue";
|
||||
|
||||
import { getZhElement } from "../../utils/toolFunc.js";
|
||||
import TItemBox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
import TItemBox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
type DucDetailOltProps =
|
||||
| {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
import { computed } from "vue";
|
||||
|
||||
import { getZhElement } from "../../utils/toolFunc.js";
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface TucAvatarsProps {
|
||||
modelValue: TGApp.Game.Combat.Avatar[];
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface TucFightProps {
|
||||
label: string;
|
||||
|
||||
@@ -57,9 +57,9 @@ import { useRouter } from "vue-router";
|
||||
import { AppGachaData, AppCharacterData, AppWeaponData } from "../../data/index.js";
|
||||
import { createPost } from "../../utils/TGWindow.js";
|
||||
import { timestampToDate } from "../../utils/toolFunc.js";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
import showDialog from "../func/dialog.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TItembox, { TItemBoxData } from "../main/t-itembox.vue";
|
||||
|
||||
interface GroHistoryMap {
|
||||
tab: string;
|
||||
@@ -1,18 +1,46 @@
|
||||
<template>
|
||||
<div v-if="props.modelValue.length === 0">暂无数据</div>
|
||||
<div v-else class="tur-ag-box">
|
||||
<TibUrAvatar v-for="avatar in props.modelValue" :key="avatar.id" :model-value="avatar" />
|
||||
<TItembox
|
||||
v-for="avatar in props.modelValue"
|
||||
:key="avatar.id"
|
||||
:model-value="getBoxData(avatar)"
|
||||
:title="getTitle(avatar)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import TibUrAvatar from "../itembox/tib-ur-avatar.vue";
|
||||
import TItembox, { TItemBoxData } from "../app/t-item-box.vue";
|
||||
|
||||
interface TurAvatarGridProps {
|
||||
modelValue: TGApp.Sqlite.Record.Avatar[];
|
||||
}
|
||||
|
||||
const props = defineProps<TurAvatarGridProps>();
|
||||
|
||||
function getBoxData(avatar: TGApp.Sqlite.Record.Avatar): TItemBoxData {
|
||||
let name = avatar.name;
|
||||
if (avatar.id === 10000005) name = "旅行者-空";
|
||||
if (avatar.id === 10000007) name = "旅行者-荧";
|
||||
return {
|
||||
size: "80px",
|
||||
height: "80px",
|
||||
ltSize: "20px",
|
||||
clickable: false,
|
||||
bg: `/icon/bg/${avatar.star}-Star.webp`,
|
||||
icon: `/WIKI/character/${avatar.id}.webp`,
|
||||
lt: `/icon/element/${avatar.element}元素.webp`,
|
||||
rt: avatar.constellation.toString() || "0",
|
||||
rtSize: "20px",
|
||||
innerText: name,
|
||||
innerHeight: 20,
|
||||
display: "inner",
|
||||
};
|
||||
}
|
||||
|
||||
function getTitle(avatar: TGApp.Sqlite.Record.Avatar): string {
|
||||
return `等级:${avatar.level}\n好感:${avatar.fetter}\n角色ID:${avatar.id}`;
|
||||
}
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
.tur-ag-box {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<div
|
||||
class="tur-hs-box"
|
||||
:style="{
|
||||
backgroundImage: 'url(' + getUrl.bg + ')',
|
||||
backgroundSize: 'cover',
|
||||
}"
|
||||
class="tur-hs-box"
|
||||
>
|
||||
<div class="tur-hs-name">
|
||||
{{ data.name }}
|
||||
|
||||
@@ -3,83 +3,83 @@
|
||||
<div v-else>
|
||||
<div class="tur-og-box-3">
|
||||
<TurOverviewSub
|
||||
title="活跃天数"
|
||||
:text="props.modelValue.activeDays"
|
||||
icon="/source/UI/userRecord.webp"
|
||||
title="活跃天数"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="深境螺旋"
|
||||
:text="props.modelValue.sprialAbyss"
|
||||
icon="/source/UI/userAbyss.webp"
|
||||
title="深境螺旋"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="幻想真境剧诗"
|
||||
:text="props.modelValue.combatRole"
|
||||
icon="/icon/material/201.webp"
|
||||
title="幻想真境剧诗"
|
||||
/>
|
||||
</div>
|
||||
<div class="tur-og-box">
|
||||
<TurOverviewSub
|
||||
title="获得角色数"
|
||||
:text="props.modelValue.avatarNumber"
|
||||
icon="/source/UI/userAvatar.webp"
|
||||
title="获得角色数"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="满好感角色数"
|
||||
:text="props.modelValue.avatarFetter"
|
||||
icon="/icon/material/105.webp"
|
||||
title="满好感角色数"
|
||||
/>
|
||||
<TurOverviewSub title="成就达成数" :text="props.modelValue.achievementNumber" icon="icon">
|
||||
<TurOverviewSub :text="props.modelValue.achievementNumber" icon="icon" title="成就达成数">
|
||||
<template #icon>
|
||||
<img
|
||||
src="../../assets/icons/achievements.svg"
|
||||
alt="achievement-icon"
|
||||
width="25px"
|
||||
height="25px"
|
||||
src="../../assets/icons/achievements.svg"
|
||||
width="25px"
|
||||
/>
|
||||
</template>
|
||||
</TurOverviewSub>
|
||||
<TurOverviewSub
|
||||
title="解锁传送点"
|
||||
:text="props.modelValue.wayPoints"
|
||||
icon="/icon/material/220005.webp"
|
||||
title="解锁传送点"
|
||||
/>
|
||||
<TurOverviewSub title="解锁秘境" :text="props.modelValue.domainNumber" />
|
||||
<TurOverviewSub :text="props.modelValue.domainNumber" title="解锁秘境" />
|
||||
<TurOverviewSub
|
||||
title="火神瞳"
|
||||
:text="props.modelValue.pyroCulus"
|
||||
icon="/icon/material/107028.webp"
|
||||
title="火神瞳"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="风神瞳"
|
||||
:text="props.modelValue.anemoCulus"
|
||||
icon="/icon/material/107001.webp"
|
||||
title="风神瞳"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="岩神瞳"
|
||||
:text="props.modelValue.geoCulus"
|
||||
icon="/icon/material/107003.webp"
|
||||
title="岩神瞳"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="雷神瞳"
|
||||
:text="props.modelValue.electroCulus"
|
||||
icon="/icon/material/107014.webp"
|
||||
title="雷神瞳"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="草神瞳"
|
||||
:text="props.modelValue.dendroCulus"
|
||||
icon="/icon/material/107017.webp"
|
||||
title="草神瞳"
|
||||
/>
|
||||
<TurOverviewSub
|
||||
title="水神瞳"
|
||||
:text="props.modelValue.hydroCulus"
|
||||
icon="/icon/material/107023.webp"
|
||||
title="水神瞳"
|
||||
/>
|
||||
<TurOverviewSub title="华丽宝箱数" :text="props.modelValue.luxuriousChest" />
|
||||
<TurOverviewSub title="珍贵宝箱数" :text="props.modelValue.preciousChest" />
|
||||
<TurOverviewSub title="精致宝箱数" :text="props.modelValue.exquisiteChest" />
|
||||
<TurOverviewSub title="普通宝箱数" :text="props.modelValue.commonChest" />
|
||||
<TurOverviewSub title="奇馈宝箱数" :text="props.modelValue.magicChest" />
|
||||
<TurOverviewSub :text="props.modelValue.luxuriousChest" title="华丽宝箱数" />
|
||||
<TurOverviewSub :text="props.modelValue.preciousChest" title="珍贵宝箱数" />
|
||||
<TurOverviewSub :text="props.modelValue.exquisiteChest" title="精致宝箱数" />
|
||||
<TurOverviewSub :text="props.modelValue.commonChest" title="普通宝箱数" />
|
||||
<TurOverviewSub :text="props.modelValue.magicChest" title="奇馈宝箱数" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="tur-ri-box">
|
||||
<div class="tur-ri-avatar">
|
||||
<img alt="avatar" :src="props.modelValue.avatar" />
|
||||
<img :src="props.modelValue.avatar" alt="avatar" />
|
||||
</div>
|
||||
<div class="tur-ri-content">
|
||||
<div class="tur-ri-title">
|
||||
|
||||
@@ -13,18 +13,18 @@
|
||||
<span>级</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="tur-ws-sub" v-if="data.children.length === 0">
|
||||
<div v-if="data.children.length === 0" class="tur-ws-sub">
|
||||
<span>探索度:</span>
|
||||
<span>{{ data.exploration / 10 }}</span>
|
||||
<span>%</span>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div class="tur-ws-sub" v-if="data.exploration !== 0">
|
||||
<div v-if="data.exploration !== 0" class="tur-ws-sub">
|
||||
<span>{{ data.name }}探索度:</span>
|
||||
<span>{{ data.exploration / 10 }}</span>
|
||||
<span>%</span>
|
||||
</div>
|
||||
<div class="tur-ws-sub" v-for="item in data.children" :key="item.id">
|
||||
<div v-for="item in data.children" :key="item.id" class="tur-ws-sub">
|
||||
<span>{{ item.name }}探索度:</span>
|
||||
<span>{{ item.exploration / 10 }}</span>
|
||||
<span>%</span>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<v-icon size="small">mdi-gift</v-icon>
|
||||
<span>{{ props.data.insert.lottery.toast }}</span>
|
||||
</div>
|
||||
<TpoLottery
|
||||
<VpOverlayLottery
|
||||
v-if="props.data.insert.lottery"
|
||||
v-model="showLottery"
|
||||
:lottery="props.data.insert.lottery.id"
|
||||
@@ -29,7 +29,7 @@ import { ref, toRaw } from "vue";
|
||||
|
||||
import TpParser from "./tp-parser.vue";
|
||||
import TpUnknown from "./tp-unknown.vue";
|
||||
import TpoLottery from "./tpo-lottery.vue";
|
||||
import VpOverlayLottery from "./vp-overlay-lottery.vue";
|
||||
|
||||
interface TpBackupText {
|
||||
insert: {
|
||||
@@ -6,7 +6,7 @@
|
||||
<v-progress-circular :indeterminate="true" color="primary" size="small" />
|
||||
<span>加载中...</span>
|
||||
</div>
|
||||
<TpoImage :image="props.data" v-model="showOverlay" />
|
||||
<VpOverlayImage :image="props.data" v-model="showOverlay" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref, onMounted, onUnmounted } from "vue";
|
||||
@@ -14,7 +14,7 @@ import { computed, ref, onMounted, onUnmounted } from "vue";
|
||||
import { saveImgLocal } from "../../utils/TGShare.js";
|
||||
import { bytesToSize } from "../../utils/toolFunc.js";
|
||||
|
||||
import TpoImage from "./tpo-image.vue";
|
||||
import VpOverlayImage from "./vp-overlay-image.vue";
|
||||
|
||||
export interface TpImage {
|
||||
insert: {
|
||||
@@ -1,3 +1,4 @@
|
||||
<!-- 收藏按钮 -->
|
||||
<template>
|
||||
<div class="tbc-box" data-html2canvas-ignore>
|
||||
<div class="tbc-btn" @click="switchCollect()" :title="isCollected ? '取消收藏' : '收藏'">
|
||||
@@ -9,7 +10,7 @@
|
||||
<v-icon size="small">mdi-pencil</v-icon>
|
||||
</div>
|
||||
</div>
|
||||
<ToPostCollect v-model="showEdit" :post="props.data" @submit="refresh()" />
|
||||
<VpOverlayCollect v-model="showEdit" :post="props.data" @submit="refresh()" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { event } from "@tauri-apps/api";
|
||||
@@ -19,7 +20,8 @@ import TSUserCollection from "../../plugins/Sqlite/modules/userCollect.js";
|
||||
import TGLogger from "../../utils/TGLogger.js";
|
||||
import showDialog from "../func/dialog.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import ToPostCollect from "../overlay/to-postCollect.vue";
|
||||
|
||||
import VpOverlayCollect from "./vp-overlay-collect.vue";
|
||||
|
||||
const isCollected = ref(false);
|
||||
const collect = ref<Array<TGApp.Sqlite.UserCollection.UFMap>>([]);
|
||||
@@ -1,3 +1,4 @@
|
||||
<!-- 查看回复按钮 -->
|
||||
<template>
|
||||
<div class="tpr-main-box" title="查看回复">
|
||||
<v-menu
|
||||
@@ -42,7 +43,7 @@
|
||||
<v-btn @click="showOverlay = false" icon="mdi-close" class="tpr-btn-close" size="small" />
|
||||
</div>
|
||||
<v-list class="tpr-reply-list">
|
||||
<TprReply
|
||||
<VpReplyItem
|
||||
v-for="(item, index) in reply"
|
||||
:key="index"
|
||||
:modelValue="item"
|
||||
@@ -59,7 +60,7 @@
|
||||
</div>
|
||||
</v-menu>
|
||||
</div>
|
||||
<TprDebug v-if="appStore.devMode" v-model="showDebug" />
|
||||
<VpReplyDebug v-if="appStore.devMode" v-model="showDebug" />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref, watch } from "vue";
|
||||
@@ -68,8 +69,8 @@ import Mys from "../../plugins/Mys/index.js";
|
||||
import { useAppStore } from "../../store/modules/app.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
|
||||
import TprDebug from "./tpr-debug.vue";
|
||||
import TprReply from "./tpr-reply.vue";
|
||||
import VpReplyDebug from "./vp-reply-debug.vue";
|
||||
import VpReplyItem from "./vp-reply-item.vue";
|
||||
|
||||
interface TprMainProps {
|
||||
gid: number;
|
||||
@@ -37,9 +37,9 @@
|
||||
import { computed, ref, watch } from "vue";
|
||||
|
||||
import TSUserCollection from "../../plugins/Sqlite/modules/userCollect.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showDialog from "../func/dialog.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
interface ToPostCollectProps {
|
||||
modelValue: boolean;
|
||||
@@ -51,8 +51,8 @@ import { computed, onMounted, ref, useTemplateRef, watch } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
import Mys from "../../plugins/Mys/index.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
interface TpoCollectionProps {
|
||||
collection: TGApp.Plugins.Mys.Post.Collection;
|
||||
@@ -27,8 +27,8 @@ import { computed, onUnmounted, ref } from "vue";
|
||||
|
||||
import { copyToClipboard, getImageBuffer, saveCanvasImg } from "../../utils/TGShare.js";
|
||||
import { bytesToSize } from "../../utils/toolFunc.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
import { TpImage } from "./tp-image.vue";
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
import { computed, ref, watch } from "vue";
|
||||
|
||||
import Mys from "../../plugins/Mys/index.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
interface TpoLotteryProps {
|
||||
modelValue: boolean;
|
||||
@@ -20,9 +20,9 @@
|
||||
import { computed, onMounted, ref, watch } from "vue";
|
||||
|
||||
import Mys from "../../plugins/Mys/index.js";
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import TPostCard from "../app/t-postcard.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
import TPostCard from "../main/t-postcard.vue";
|
||||
|
||||
// data
|
||||
const search = ref("");
|
||||
@@ -17,10 +17,10 @@ import { open } from "@tauri-apps/plugin-dialog";
|
||||
import { readTextFile } from "@tauri-apps/plugin-fs";
|
||||
import { computed, ref } from "vue";
|
||||
|
||||
import TOverlay from "../app/t-overlay.vue";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TOverlay from "../main/t-overlay.vue";
|
||||
|
||||
import TprReply from "./tpr-reply.vue";
|
||||
import TprReply from "./vp-reply-item.vue";
|
||||
|
||||
interface TprDebugProps {
|
||||
modelValue: boolean;
|
||||
@@ -110,7 +110,8 @@ import Mys from "../../plugins/Mys/index.js";
|
||||
import { generateShareImg } from "../../utils/TGShare.js";
|
||||
import showDialog from "../func/dialog.js";
|
||||
import showSnackbar from "../func/snackbar.js";
|
||||
import TpParser from "../post/tp-parser.vue";
|
||||
|
||||
import TpParser from "./tp-parser.vue";
|
||||
|
||||
type TprReplyProps =
|
||||
| {
|
||||
@@ -37,7 +37,7 @@
|
||||
import { onMounted, ref, watch } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
import ToArcBrith from "../../components/overlay/to-arcBrith.vue";
|
||||
import ToArcBrith from "../../components/pageArchive/to-arcBrith.vue";
|
||||
import { ArcBirDraw, ArcBirRole } from "../../data/index.js";
|
||||
import TGClient from "../../utils/TGClient.js";
|
||||
|
||||
|
||||
@@ -93,11 +93,7 @@
|
||||
</div>
|
||||
<TSubLine>详情</TSubLine>
|
||||
<div class="uaw-d-box">
|
||||
<TuaDetail
|
||||
v-for="floor in JSON.parse(item.floors) as TGApp.Sqlite.Abyss.Floor[]"
|
||||
:key="floor.id"
|
||||
:model-value="floor"
|
||||
/>
|
||||
<TuaDetail v-for="floor in item.floors" :key="floor.id" :model-value="floor" />
|
||||
</div>
|
||||
</div>
|
||||
</v-window-item>
|
||||
@@ -111,13 +107,13 @@
|
||||
<script lang="ts" setup>
|
||||
import { getVersion } from "@tauri-apps/api/app";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { onMounted, ref, watch, computed } from "vue";
|
||||
import { computed, onMounted, ref, watch } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
import TSubLine from "../../components/app/t-subline.vue";
|
||||
import showDialog from "../../components/func/dialog.js";
|
||||
import showLoading from "../../components/func/loading.js";
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
import TSubLine from "../../components/main/t-subline.vue";
|
||||
import TuaDetail from "../../components/userAbyss/tua-detail.vue";
|
||||
import TuaOverview from "../../components/userAbyss/tua-overview.vue";
|
||||
import Hutao from "../../plugins/Hutao/index.js";
|
||||
@@ -136,7 +132,7 @@ const userStore = storeToRefs(useUserStore());
|
||||
const userTab = ref<number>(0);
|
||||
const user = computed<TGApp.Sqlite.Account.Game>(() => userStore.account.value);
|
||||
|
||||
const localAbyss = ref<TGApp.Sqlite.Abyss.SingleTable[]>([]);
|
||||
const localAbyss = ref<TGApp.Sqlite.Abyss.TableData[]>([]);
|
||||
const abyssRef = ref<HTMLElement>(<HTMLElement>{});
|
||||
const version = ref<string>();
|
||||
const router = useRouter();
|
||||
|
||||
@@ -107,9 +107,9 @@ import { onMounted, ref, watch, computed } from "vue";
|
||||
import showDialog from "../../components/func/dialog.js";
|
||||
import showLoading from "../../components/func/loading.js";
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
import TwoSelectC, { SelectedCValue } from "../../components/pageWiki/two-select-c.vue";
|
||||
import TuaAvatarBox from "../../components/userAvatar/tua-avatar-box.vue";
|
||||
import TuaDetailOverlay from "../../components/userAvatar/tua-detail-overlay.vue";
|
||||
import TwoSelectC, { SelectedCValue } from "../../components/wiki/two-select-c.vue";
|
||||
import { AppCharacterData } from "../../data/index.js";
|
||||
import TSUserAvatar from "../../plugins/Sqlite/modules/userAvatar.js";
|
||||
import TSUserRecord from "../../plugins/Sqlite/modules/userRecord.js";
|
||||
|
||||
@@ -95,10 +95,10 @@ import { storeToRefs } from "pinia";
|
||||
import { onMounted, ref, watch, computed } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
import TSubLine from "../../components/app/t-subline.vue";
|
||||
import showDialog from "../../components/func/dialog.js";
|
||||
import showLoading from "../../components/func/loading.js";
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
import TSubLine from "../../components/main/t-subline.vue";
|
||||
import TucAvatars from "../../components/userCombat/tuc-avatars.vue";
|
||||
import TucOverview from "../../components/userCombat/tuc-overview.vue";
|
||||
import TucRound from "../../components/userCombat/tuc-round.vue";
|
||||
|
||||
@@ -57,10 +57,10 @@ import { onMounted, ref, watch, computed } from "vue";
|
||||
import showDialog from "../../components/func/dialog.js";
|
||||
import showLoading from "../../components/func/loading.js";
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
import GroEcharts from "../../components/gachaRecord/gro-echarts.vue";
|
||||
import GroHistory from "../../components/gachaRecord/gro-history.vue";
|
||||
import GroOverview from "../../components/gachaRecord/gro-overview.vue";
|
||||
import GroTable from "../../components/gachaRecord/gro-table.vue";
|
||||
import GroEcharts from "../../components/userGacha/gro-echarts.vue";
|
||||
import GroHistory from "../../components/userGacha/gro-history.vue";
|
||||
import GroOverview from "../../components/userGacha/gro-overview.vue";
|
||||
import GroTable from "../../components/userGacha/gro-table.vue";
|
||||
import { AppCharacterData, AppWeaponData } from "../../data/index.js";
|
||||
import TSUserGacha from "../../plugins/Sqlite/modules/userGacha.js";
|
||||
import { useUserStore } from "../../store/modules/user.js";
|
||||
|
||||
@@ -59,10 +59,10 @@ import { getVersion } from "@tauri-apps/api/app";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { computed, onMounted, ref, watch } from "vue";
|
||||
|
||||
import TSubLine from "../../components/app/t-subline.vue";
|
||||
import showDialog from "../../components/func/dialog.js";
|
||||
import showLoading from "../../components/func/loading.js";
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
import TSubLine from "../../components/main/t-subline.vue";
|
||||
import TurAvatarGrid from "../../components/userRecord/tur-avatar-grid.vue";
|
||||
import TurHomeGrid from "../../components/userRecord/tur-home-grid.vue";
|
||||
import TurOverviewGrid from "../../components/userRecord/tur-overview-grid.vue";
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user