fix(GCG): 数据结构优化

This commit is contained in:
BTMuli
2023-03-22 20:02:57 +08:00
parent 0de26a03ff
commit 9f0ffa7dc2
3 changed files with 642 additions and 217 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,9 @@ export enum BaseCardType {
* @property {string} name 卡牌名称 * @property {string} name 卡牌名称
* @property {int} id 卡牌 ID // TODO: 用于短期外链跳转 * @property {int} id 卡牌 ID // TODO: 用于短期外链跳转
* @property {string} type 卡牌类型 * @property {string} type 卡牌类型
* @property {unknown} icon 卡牌图标 * @property icon 卡牌图标
* @property {string} icon.normal 正常图标
* @property {string} icon.special 特殊图标
* @property {unknown} info 卡牌信息 * @property {unknown} info 卡牌信息
* @property {unknown} skills 卡牌技能,仅角色卡与魔物卡有 * @property {unknown} skills 卡牌技能,仅角色卡与魔物卡有
* @property {unknown} affect 卡牌效果,仅行动卡有 * @property {unknown} affect 卡牌效果,仅行动卡有
@@ -42,7 +44,7 @@ export interface BaseCard {
name: string; name: string;
id: number; id: number;
type: BaseCardType; type: BaseCardType;
icon: unknown; icon: { normal: string; special?: string };
info: unknown; info: unknown;
skills?: unknown; skills?: unknown;
affect?: unknown; affect?: unknown;
@@ -54,8 +56,6 @@ export interface BaseCard {
* @since Alpha * @since Alpha
* @see BaseCard * @see BaseCard
* @see CharacterCardType * @see CharacterCardType
* @property {string} icon.normal 正常图标
* @property {string} icon.special 特殊图标
* @property {EnumElement} info.element 元素 * @property {EnumElement} info.element 元素
* @property {EnumWeapon} info.weapon 武器 * @property {EnumWeapon} info.weapon 武器
* @property {EnumCamp} info.camp 阵营 * @property {EnumCamp} info.camp 阵营
@@ -74,10 +74,6 @@ export interface BaseCard {
*/ */
export interface CharacterCard extends BaseCard { export interface CharacterCard extends BaseCard {
type: BaseCardType.characterCard; type: BaseCardType.characterCard;
icon: {
normal: string;
special?: string;
};
info: { info: {
element: EnumElement; element: EnumElement;
weapon: EnumWeapon; weapon: EnumWeapon;
@@ -104,8 +100,6 @@ export interface CharacterCard extends BaseCard {
* @since Alpha * @since Alpha
* @see BaseCard * @see BaseCard
* @see ActionCardType * @see ActionCardType
* @property {string} icon.normal 正常图标
* @property {string} icon.special 特殊图标
* @property {EnumActionType} info.actionType 类型 * @property {EnumActionType} info.actionType 类型
* @property {EnumActionTag} info.actionTag 标签 * @property {EnumActionTag} info.actionTag 标签
* @property {EnumActionCost} info.actionCost 花费 * @property {EnumActionCost} info.actionCost 花费
@@ -119,10 +113,6 @@ export interface CharacterCard extends BaseCard {
*/ */
export interface ActionCard extends BaseCard { export interface ActionCard extends BaseCard {
type: BaseCardType.actionCard; type: BaseCardType.actionCard;
icon: {
normal: string;
special?: string;
};
info: { info: {
actionType: EnumActionType; actionType: EnumActionType;
actionTag: EnumActionTag; actionTag: EnumActionTag;
@@ -142,7 +132,6 @@ export interface ActionCard extends BaseCard {
* @since Alpha * @since Alpha
* @see BaseCard * @see BaseCard
* @see CharacterCardType * @see CharacterCardType
* @property {string} icon 卡牌图标
* @property {EnumElement} info.element 元素 * @property {EnumElement} info.element 元素
* @property {EnumWeapon} info.weapon 武器 * @property {EnumWeapon} info.weapon 武器
* @property {EnumCamp} info.camp 阵营 * @property {EnumCamp} info.camp 阵营
@@ -159,7 +148,6 @@ export interface ActionCard extends BaseCard {
*/ */
export interface MonsterCard extends BaseCard { export interface MonsterCard extends BaseCard {
type: BaseCardType.monsterCard; type: BaseCardType.monsterCard;
icon: string;
info: { info: {
element: EnumElement; element: EnumElement;
weapon: EnumWeapon; weapon: EnumWeapon;

View File

@@ -1,5 +1,4 @@
<template> <template>
<!-- todo 顶部筛选栏 -->
<div v-if="loading" class="loading-bar"> <div v-if="loading" class="loading-bar">
<v-progress-circular indeterminate color="primary" /> <v-progress-circular indeterminate color="primary" />
</div> </div>
@@ -16,15 +15,78 @@
@click:append="searchCard" @click:append="searchCard"
></v-text-field> ></v-text-field>
</v-app-bar> </v-app-bar>
<div class="GCG-grid"> <div v-if="!doSearch">
<v-card v-for="item in CardsInfo" :key="item.id" class="card-cls" @click="toOuter(item)"> <v-tabs v-model="tab" align-tabs="start" class="global-font">
<!-- 外部卡牌边框 --> <v-tab value="character" title="角色牌" />
<v-img src="/source/GCG/base/bg-normal.webp" class="GCG-border"></v-img> <v-tab value="action" title="行动牌" />
<v-img :src="item.icon" class="GCG-cover"></v-img> <v-tab value="monster" title="魔物牌" />
<div class="GCG-content"> </v-tabs>
<span>{{ item.name }}</span> <v-window v-model="tab">
</div> <v-window-item value="character">
</v-card> <div class="GCG-grid">
<v-card
v-for="item in CardsInfoC"
:key="item.id"
class="card-cls"
@click="toOuter(item.name, item.id)"
>
<v-img src="/source/GCG/base/bg-normal.webp" class="GCG-border"></v-img>
<v-img :src="item.icon.normal" class="GCG-cover"></v-img>
<div class="GCG-content">
<span>{{ item.name }}</span>
</div>
</v-card>
</div>
</v-window-item>
<v-window-item value="action">
<div class="GCG-grid">
<v-card
v-for="item in CardsInfoA"
:key="item.id"
class="card-cls"
@click="toOuter(item.name, item.id)"
>
<v-img src="/source/GCG/base/bg-normal.webp" class="GCG-border"></v-img>
<v-img :src="item.icon.normal" class="GCG-cover"></v-img>
<div class="GCG-content">
<span>{{ item.name }}</span>
</div>
</v-card>
</div>
</v-window-item>
<v-window-item value="monster">
<div class="GCG-grid">
<v-card
v-for="item in CardsInfoM"
:key="item.id"
class="card-cls"
@click="toOuter(item.name, item.id)"
>
<v-img src="/source/GCG/base/bg-normal.webp" class="GCG-border"></v-img>
<v-img :src="item.icon.normal" class="GCG-cover"></v-img>
<div class="GCG-content">
<span>{{ item.name }}</span>
</div>
</v-card>
</div>
</v-window-item>
</v-window>
</div>
<div v-else>
<div class="GCG-grid">
<v-card
v-for="item in CardsInfoS"
:key="item.id"
class="card-cls"
@click="toOuter(item.name, item.id)"
>
<v-img src="/source/GCG/base/bg-normal.webp" class="GCG-border"></v-img>
<v-img :src="item.icon.normal" class="GCG-cover"></v-img>
<div class="GCG-content">
<span>{{ item.name }}</span>
</div>
</v-card>
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -32,37 +94,46 @@
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { createTGWindow } from "../utils/TGWindow"; import { createTGWindow } from "../utils/TGWindow";
import { ReadAllTGData } from "../utils/TGIndex"; import { ReadAllTGData } from "../utils/TGIndex";
import { BaseCard } from "../interface/GCG"; import { BaseCard, ActionCard, CharacterCard, MonsterCard } from "../interface/GCG";
import { MysContent } from "../interface/MysPost"; import { MysContent } from "../interface/MysPost";
import { dialog } from "@tauri-apps/api"; import { dialog } from "@tauri-apps/api";
const loading = ref(true); const loading = ref(true);
const doSearch = ref(false);
const search = ref(""); const search = ref("");
const CardsInfo = ref([] as BaseCard[]); const tab = ref("character");
const CardsInfoC = ref([] as CharacterCard[]);
const CardsInfoA = ref([] as ActionCard[]);
const CardsInfoM = ref([] as MonsterCard[]);
const CardsInfoS = ref([] as BaseCard[]);
onMounted(async () => { onMounted(async () => {
await loadData(); await loadData();
}); });
async function loadData() { async function loadData() {
CardsInfo.value = await ReadAllTGData("GCG"); const CardsInfo = await ReadAllTGData("GCG");
CardsInfoC.value = CardsInfo.filter(item => item.type == "角色牌") as CharacterCard[];
CardsInfoA.value = CardsInfo.filter(item => item.type == "行动牌") as ActionCard[];
CardsInfoM.value = CardsInfo.filter(item => item.type == "魔物牌") as MonsterCard[];
loading.value = false; loading.value = false;
} }
function toOuter(card: BaseCard) { function toOuter(card_name: string, card_id: number) {
const url = MysContent.replace("content_id", card.id.toString()); const url = MysContent.replace("content_id", card_id.toString());
createTGWindow(url, "GCG", card.name, 1600, 900, true); createTGWindow(url, "GCG", card_name, 1600, 900, true);
} }
async function searchCard() { async function searchCard() {
loading.value = true; loading.value = true;
doSearch.value = true;
const res: BaseCard[] = []; const res: BaseCard[] = [];
const allCardsInfo = await ReadAllTGData("GCG"); const allCardsInfo = await ReadAllTGData("GCG");
allCardsInfo.map(item => (item.name.includes(search.value) ? res.push(item) : null)); allCardsInfo.map(item => (item.name.includes(search.value) ? res.push(item) : null));
loading.value = false; loading.value = false;
if (res.length == 0) { if (res.length == 0) {
await dialog.message("未找到相关卡牌"); await dialog.message("未找到相关卡牌");
CardsInfo.value = allCardsInfo; doSearch.value = false;
} else { } else {
CardsInfo.value = res; CardsInfoS.value = res;
} }
} }
</script> </script>