1
This commit is contained in:
@@ -5,6 +5,12 @@ import { useConfigStore, useInfoStore } from "@/stores";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import {
|
||||
Accordion,
|
||||
AccordionContent,
|
||||
AccordionItem,
|
||||
AccordionTrigger,
|
||||
} from "@/components/ui/accordion";
|
||||
import ResultPanel from "@/pages/Dcalc/Character/Result/Index.vue";
|
||||
|
||||
const configStore = useConfigStore();
|
||||
@@ -369,7 +375,10 @@ const resetAllForge = () => {
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<div v-if="forgeViewTab === 'config'" class="inline-flex flex-wrap rounded-md border p-1">
|
||||
<div
|
||||
v-if="forgeViewTab === 'config'"
|
||||
class="hidden inline-flex flex-wrap rounded-md border p-1 sm:inline-flex"
|
||||
>
|
||||
<Button
|
||||
size="sm"
|
||||
:variant="moduleMode === 'equip' ? 'default' : 'ghost'"
|
||||
@@ -400,6 +409,39 @@ const resetAllForge = () => {
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<div v-if="forgeViewTab === 'config'" class="sm:hidden">
|
||||
<Accordion
|
||||
type="single"
|
||||
:default-value="moduleMode"
|
||||
class="w-full rounded-md border px-2"
|
||||
>
|
||||
<AccordionItem value="equip">
|
||||
<AccordionTrigger @click="moduleMode = 'equip'">装备打造</AccordionTrigger>
|
||||
<AccordionContent class="text-xs text-muted-foreground"
|
||||
>强化、锻造、品级等参数编辑。</AccordionContent
|
||||
>
|
||||
</AccordionItem>
|
||||
<AccordionItem value="oath">
|
||||
<AccordionTrigger @click="moduleMode = 'oath'">誓约</AccordionTrigger>
|
||||
<AccordionContent class="text-xs text-muted-foreground"
|
||||
>誓约槽位适配值编辑。</AccordionContent
|
||||
>
|
||||
</AccordionItem>
|
||||
<AccordionItem value="avatar">
|
||||
<AccordionTrigger @click="moduleMode = 'avatar'">时装徽章</AccordionTrigger>
|
||||
<AccordionContent class="text-xs text-muted-foreground"
|
||||
>时装、徽章、等级与条目配置。</AccordionContent
|
||||
>
|
||||
</AccordionItem>
|
||||
<AccordionItem value="global">
|
||||
<AccordionTrigger @click="moduleMode = 'global'">全局</AccordionTrigger>
|
||||
<AccordionContent class="text-xs text-muted-foreground"
|
||||
>系统奶与组队开关等全局参数。</AccordionContent
|
||||
>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<Button size="sm" variant="outline" @click="resetAllForge">快速重置打造</Button>
|
||||
<router-link to="/dcalc/dnfhelper">
|
||||
@@ -432,336 +474,350 @@ const resetAllForge = () => {
|
||||
v-if="forgeViewTab === 'config' && moduleMode === 'equip'"
|
||||
class="grid grid-cols-1 gap-4"
|
||||
>
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<Hammer class="size-4" />
|
||||
装备打造编辑器
|
||||
</CardTitle>
|
||||
<CardDescription>强化、锻造、品级编辑并即时回写配置。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-3">
|
||||
<div
|
||||
v-for="part in parts"
|
||||
:key="part"
|
||||
class="grid grid-cols-1 gap-2 rounded-md border p-3 text-sm md:grid-cols-[7rem_1fr_6rem_6rem_6rem_auto] md:items-center"
|
||||
>
|
||||
<div class="font-medium">{{ part }}</div>
|
||||
<div class="truncate text-muted-foreground">
|
||||
{{ equipNameById.get(equipCfg(part).id) || "未选择装备(可在装备页选择)" }}
|
||||
</div>
|
||||
<Input
|
||||
:model-value="String(equipCfg(part).reinforce)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8"
|
||||
placeholder="强化"
|
||||
@update:model-value="(value) => setNumberField(part, 'reinforce', String(value))"
|
||||
/>
|
||||
<Input
|
||||
:model-value="String(equipCfg(part).refine)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8"
|
||||
placeholder="锻造"
|
||||
@update:model-value="(value) => setNumberField(part, 'refine', String(value))"
|
||||
/>
|
||||
<Input
|
||||
:model-value="String(equipCfg(part).adaptation)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8"
|
||||
placeholder="品级"
|
||||
@update:model-value="(value) => setNumberField(part, 'adaptation', String(value))"
|
||||
/>
|
||||
<Button size="sm" variant="ghost" @click="resetEquipPart(part)">重置</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div v-if="forgeViewTab === 'config' && moduleMode === 'oath'" class="grid grid-cols-1 gap-4">
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<ShieldCheck class="size-4" />
|
||||
誓约子模块
|
||||
</CardTitle>
|
||||
<CardDescription>编辑誓约槽位适配值。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-3">
|
||||
<div
|
||||
v-for="part in oathParts"
|
||||
:key="part"
|
||||
class="grid grid-cols-1 gap-2 rounded-md border p-3 text-sm md:grid-cols-[6rem_1fr_7rem_auto] md:items-center"
|
||||
>
|
||||
<div class="font-medium">槽位 {{ part }}</div>
|
||||
<div class="truncate text-muted-foreground">
|
||||
{{ oathNameById.get(oathCfg(part).id) || "未选择誓约(可在装备页选择)" }}
|
||||
</div>
|
||||
<Input
|
||||
:model-value="String(oathCfg(part).adaptation)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8"
|
||||
placeholder="适配"
|
||||
@update:model-value="(value) => setOathAdaptation(part, String(value))"
|
||||
/>
|
||||
<Button size="sm" variant="ghost" @click="resetOathPart(part)">重置</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="forgeViewTab === 'config' && moduleMode === 'avatar'"
|
||||
class="grid grid-cols-1 gap-4 xl:grid-cols-2"
|
||||
>
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<Sparkles class="size-4" />
|
||||
时装编辑
|
||||
</CardTitle>
|
||||
<CardDescription>支持附魔、徽章项、品级和属性值编辑。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-3 text-sm">
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">筛选</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<Input v-model="avatarOptionKeyword" class="h-8" placeholder="搜索附魔/徽章可选项" />
|
||||
<label class="inline-flex items-center gap-1 text-xs whitespace-nowrap">
|
||||
<input v-model="onlyConfiguredAvatarParts" type="checkbox" class="size-3.5" />
|
||||
仅已配置部位
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">部位</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
v-model="avatarPart"
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<Hammer class="size-4" />
|
||||
装备打造编辑器
|
||||
</CardTitle>
|
||||
<CardDescription>强化、锻造、品级编辑并即时回写配置。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-xs sm:space-y-3 sm:text-sm">
|
||||
<div
|
||||
v-for="part in parts"
|
||||
:key="part"
|
||||
class="grid grid-cols-1 gap-2 rounded-md border p-2 md:grid-cols-[7rem_1fr_6rem_6rem_6rem_auto] md:items-center md:p-3"
|
||||
>
|
||||
<option v-for="part in avatarParts" :key="part" :value="part">{{ part }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="font-medium">{{ part }}</div>
|
||||
<div class="truncate text-muted-foreground">
|
||||
{{ equipNameById.get(equipCfg(part).id) || "未选择装备(可在装备页选择)" }}
|
||||
</div>
|
||||
<Input
|
||||
:model-value="String(equipCfg(part).reinforce)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8 text-xs"
|
||||
placeholder="强化"
|
||||
@update:model-value="(value) => setNumberField(part, 'reinforce', String(value))"
|
||||
/>
|
||||
<Input
|
||||
:model-value="String(equipCfg(part).refine)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8 text-xs"
|
||||
placeholder="锻造"
|
||||
@update:model-value="(value) => setNumberField(part, 'refine', String(value))"
|
||||
/>
|
||||
<Input
|
||||
:model-value="String(equipCfg(part).adaptation)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8 text-xs"
|
||||
placeholder="品级"
|
||||
@update:model-value="(value) => setNumberField(part, 'adaptation', String(value))"
|
||||
/>
|
||||
<Button size="sm" variant="ghost" @click="resetEquipPart(part)">重置</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="hasAvatarEnchant"
|
||||
class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center"
|
||||
>
|
||||
<div class="text-muted-foreground">附魔</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).enchant"
|
||||
@change="
|
||||
(event) => setAvatarField('enchant', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
<div v-if="forgeViewTab === 'config' && moduleMode === 'oath'" class="grid grid-cols-1 gap-4">
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<ShieldCheck class="size-4" />
|
||||
誓约子模块
|
||||
</CardTitle>
|
||||
<CardDescription>编辑誓约槽位适配值。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-xs sm:space-y-3 sm:text-sm">
|
||||
<div
|
||||
v-for="part in oathParts"
|
||||
:key="part"
|
||||
class="grid grid-cols-1 gap-2 rounded-md border p-2 md:grid-cols-[6rem_1fr_7rem_auto] md:items-center md:p-3"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in avatarEnchantOptions" :key="item.id" :value="String(item.id)">
|
||||
{{ item.detail }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="font-medium">槽位 {{ part }}</div>
|
||||
<div class="truncate text-muted-foreground">
|
||||
{{ oathNameById.get(oathCfg(part).id) || "未选择誓约(可在装备页选择)" }}
|
||||
</div>
|
||||
<Input
|
||||
:model-value="String(oathCfg(part).adaptation)"
|
||||
type="number"
|
||||
min="0"
|
||||
class="h-8 text-xs"
|
||||
placeholder="适配"
|
||||
@update:model-value="(value) => setOathAdaptation(part, String(value))"
|
||||
/>
|
||||
<Button size="sm" variant="ghost" @click="resetOathPart(part)">重置</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<template v-else>
|
||||
<div
|
||||
v-if="forgeViewTab === 'config' && moduleMode === 'avatar'"
|
||||
class="grid grid-cols-1 gap-4 xl:grid-cols-2"
|
||||
>
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<Sparkles class="size-4" />
|
||||
时装编辑
|
||||
</CardTitle>
|
||||
<CardDescription>支持附魔、徽章项、品级和属性值编辑。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-xs sm:space-y-3 sm:text-sm">
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">品级</div>
|
||||
<div class="text-muted-foreground">筛选</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<Input
|
||||
v-model="avatarOptionKeyword"
|
||||
class="h-8 text-xs"
|
||||
placeholder="搜索附魔/徽章可选项"
|
||||
/>
|
||||
<label class="inline-flex items-center gap-1 text-xs whitespace-nowrap">
|
||||
<input v-model="onlyConfiguredAvatarParts" type="checkbox" class="size-3.5" />
|
||||
仅已配置部位
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">部位</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).id"
|
||||
@change="(event) => setAvatarField('id', (event.target as HTMLSelectElement).value)"
|
||||
v-model="avatarPart"
|
||||
>
|
||||
<option value="">未选择</option>
|
||||
<option v-for="item in avatarSuitOptions" :key="item.id" :value="String(item.id)">
|
||||
{{ item.suit || item.rarity || item.name }}
|
||||
</option>
|
||||
<option v-for="part in avatarParts" :key="part" :value="part">{{ part }}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">属性</div>
|
||||
<div
|
||||
v-if="hasAvatarEnchant"
|
||||
class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center"
|
||||
>
|
||||
<div class="text-muted-foreground">附魔</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).option"
|
||||
:value="avatarCfg(avatarPart).enchant"
|
||||
@change="
|
||||
(event) => setAvatarField('option', (event.target as HTMLSelectElement).value)
|
||||
(event) => setAvatarField('enchant', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="0">无</option>
|
||||
<option value="">无</option>
|
||||
<option
|
||||
v-for="opt in avatarSuitOptions.find(
|
||||
(x) => String(x.id) === avatarCfg(avatarPart).id,
|
||||
)?.options || []"
|
||||
:key="opt"
|
||||
:value="opt"
|
||||
v-for="item in avatarEnchantOptions"
|
||||
:key="item.id"
|
||||
:value="String(item.id)"
|
||||
>
|
||||
{{ opt }}
|
||||
{{ item.detail }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">徽章一</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).emblem_0"
|
||||
@change="
|
||||
(event) => setAvatarField('emblem_0', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in avatarEmblemOptions" :key="item.id" :value="String(item.id)">
|
||||
[{{ item.rarity }}] {{ item.value }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">徽章二</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).emblem_1"
|
||||
@change="
|
||||
(event) => setAvatarField('emblem_1', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in avatarEmblemOptions" :key="item.id" :value="String(item.id)">
|
||||
[{{ item.rarity }}] {{ item.value }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<Button size="sm" variant="outline" @click="resetAvatarPart">重置当前部位</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<Sparkles class="size-4" />
|
||||
徽章编辑
|
||||
</CardTitle>
|
||||
<CardDescription>支持等级、徽章条目与槽位数量规则。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-3 text-sm">
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">筛选</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<Input v-model="emblemOptionKeyword" class="h-8" placeholder="搜索徽章可选项" />
|
||||
<label class="inline-flex items-center gap-1 text-xs whitespace-nowrap">
|
||||
<input v-model="onlyConfiguredEmblemSlots" type="checkbox" class="size-3.5" />
|
||||
仅已配置项
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">槽位类型</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
v-model="emblemPart"
|
||||
>
|
||||
<option v-for="part in infoStore.emblemParts" :key="part" :value="part">
|
||||
{{ part }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="emblemPart !== '白金'"
|
||||
class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center"
|
||||
>
|
||||
<div class="text-muted-foreground">等级</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="String(emblemCfg.lv ?? 0)"
|
||||
@change="(event) => setEmblemLv((event.target as HTMLSelectElement).value)"
|
||||
>
|
||||
<option v-for="(label, index) in emblemLevels" :key="label" :value="String(index)">
|
||||
{{ label }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="space-y-2">
|
||||
<div class="text-muted-foreground">徽章条目</div>
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-2">
|
||||
<div
|
||||
v-for="index in emblemMaxCount"
|
||||
:key="index"
|
||||
v-show="!onlyConfiguredEmblemSlots || !!(emblemCfg.items[index - 1] || '')"
|
||||
class="space-y-1"
|
||||
>
|
||||
<div class="text-xs text-muted-foreground">槽位 {{ index }}</div>
|
||||
<template v-else>
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">品级</div>
|
||||
<select
|
||||
class="h-8 w-full rounded-md border border-input bg-background px-2"
|
||||
:value="emblemCfg.items[index - 1] || ''"
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).id"
|
||||
@change="
|
||||
(event) => setEmblemItem(index - 1, (event.target as HTMLSelectElement).value)
|
||||
(event) => setAvatarField('id', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in emblemOptions" :key="item.id" :value="String(item.id)">
|
||||
[{{ item.rarity }}] {{ item.value }}
|
||||
<option value="">未选择</option>
|
||||
<option v-for="item in avatarSuitOptions" :key="item.id" :value="String(item.id)">
|
||||
{{ item.suit || item.rarity || item.name }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">属性</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).option"
|
||||
@change="
|
||||
(event) => setAvatarField('option', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="0">无</option>
|
||||
<option
|
||||
v-for="opt in avatarSuitOptions.find(
|
||||
(x) => String(x.id) === avatarCfg(avatarPart).id,
|
||||
)?.options || []"
|
||||
:key="opt"
|
||||
:value="opt"
|
||||
>
|
||||
{{ opt }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">徽章一</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).emblem_0"
|
||||
@change="
|
||||
(event) => setAvatarField('emblem_0', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in avatarEmblemOptions" :key="item.id" :value="String(item.id)">
|
||||
[{{ item.rarity }}] {{ item.value }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<Button size="sm" variant="outline" @click="resetEmblemPart">重置当前徽章槽</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">徽章二</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="avatarCfg(avatarPart).emblem_1"
|
||||
@change="
|
||||
(event) => setAvatarField('emblem_1', (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in avatarEmblemOptions" :key="item.id" :value="String(item.id)">
|
||||
[{{ item.rarity }}] {{ item.value }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="forgeViewTab === 'config' && moduleMode === 'global'"
|
||||
class="grid grid-cols-1 gap-4 lg:grid-cols-2"
|
||||
>
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<ShieldCheck class="size-4" />
|
||||
计算开关
|
||||
</CardTitle>
|
||||
<CardDescription>从旧版 Character 页底部迁移的全局参数。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-sm text-muted-foreground">
|
||||
<label class="flex items-center justify-between rounded-md border p-2">
|
||||
<span>系统奶 DSB</span>
|
||||
<input v-model="configStore.config.DSB" type="checkbox" class="size-4" />
|
||||
</label>
|
||||
<label class="flex items-center justify-between rounded-md border p-2">
|
||||
<span>组队 BUFF</span>
|
||||
<input v-model="configStore.config.BUFF" type="checkbox" class="size-4" />
|
||||
</label>
|
||||
</CardContent>
|
||||
</Card>
|
||||
<div class="flex justify-end">
|
||||
<Button size="sm" variant="outline" @click="resetAvatarPart">重置当前部位</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<ShieldCheck class="size-4" />
|
||||
当前统计
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-sm text-muted-foreground">
|
||||
<div>已配置装备: {{ summary.equipCount }}</div>
|
||||
<div>誓约槽位: {{ summary.oathCount }}</div>
|
||||
<div>已配置时装: {{ summary.avatarCount }}</div>
|
||||
<div>已配置徽章条目: {{ summary.emblemCount }}</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<Sparkles class="size-4" />
|
||||
徽章编辑
|
||||
</CardTitle>
|
||||
<CardDescription>支持等级、徽章条目与槽位数量规则。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-xs sm:space-y-3 sm:text-sm">
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">筛选</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<Input
|
||||
v-model="emblemOptionKeyword"
|
||||
class="h-8 text-xs"
|
||||
placeholder="搜索徽章可选项"
|
||||
/>
|
||||
<label class="inline-flex items-center gap-1 text-xs whitespace-nowrap">
|
||||
<input v-model="onlyConfiguredEmblemSlots" type="checkbox" class="size-3.5" />
|
||||
仅已配置项
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center">
|
||||
<div class="text-muted-foreground">槽位类型</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
v-model="emblemPart"
|
||||
>
|
||||
<option v-for="part in infoStore.emblemParts" :key="part" :value="part">
|
||||
{{ part }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="emblemPart !== '白金'"
|
||||
class="grid grid-cols-1 gap-2 md:grid-cols-[7rem_1fr] md:items-center"
|
||||
>
|
||||
<div class="text-muted-foreground">等级</div>
|
||||
<select
|
||||
class="h-8 rounded-md border border-input bg-background px-2"
|
||||
:value="String(emblemCfg.lv ?? 0)"
|
||||
@change="(event) => setEmblemLv((event.target as HTMLSelectElement).value)"
|
||||
>
|
||||
<option v-for="(label, index) in emblemLevels" :key="label" :value="String(index)">
|
||||
{{ label }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="space-y-2">
|
||||
<div class="text-muted-foreground">徽章条目</div>
|
||||
<div class="grid grid-cols-1 gap-2 md:grid-cols-2">
|
||||
<div
|
||||
v-for="index in emblemMaxCount"
|
||||
:key="index"
|
||||
v-show="!onlyConfiguredEmblemSlots || !!(emblemCfg.items[index - 1] || '')"
|
||||
class="space-y-1"
|
||||
>
|
||||
<div class="text-xs text-muted-foreground">槽位 {{ index }}</div>
|
||||
<select
|
||||
class="h-8 w-full rounded-md border border-input bg-background px-2"
|
||||
:value="emblemCfg.items[index - 1] || ''"
|
||||
@change="
|
||||
(event) => setEmblemItem(index - 1, (event.target as HTMLSelectElement).value)
|
||||
"
|
||||
>
|
||||
<option value="">无</option>
|
||||
<option v-for="item in emblemOptions" :key="item.id" :value="String(item.id)">
|
||||
[{{ item.rarity }}] {{ item.value }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end">
|
||||
<Button size="sm" variant="outline" @click="resetEmblemPart">重置当前徽章槽</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="forgeViewTab === 'config' && moduleMode === 'global'"
|
||||
class="grid grid-cols-1 gap-4 lg:grid-cols-2"
|
||||
>
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<ShieldCheck class="size-4" />
|
||||
计算开关
|
||||
</CardTitle>
|
||||
<CardDescription>从旧版 Character 页底部迁移的全局参数。</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-sm text-muted-foreground">
|
||||
<label class="flex items-center justify-between rounded-md border p-2">
|
||||
<span>系统奶 DSB</span>
|
||||
<input v-model="configStore.config.DSB" type="checkbox" class="size-4" />
|
||||
</label>
|
||||
<label class="flex items-center justify-between rounded-md border p-2">
|
||||
<span>组队 BUFF</span>
|
||||
<input v-model="configStore.config.BUFF" type="checkbox" class="size-4" />
|
||||
</label>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card class="border-border/60 bg-card/90">
|
||||
<CardHeader>
|
||||
<CardTitle class="flex items-center gap-2">
|
||||
<ShieldCheck class="size-4" />
|
||||
当前统计
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-2 text-sm text-muted-foreground">
|
||||
<div>已配置装备: {{ summary.equipCount }}</div>
|
||||
<div>誓约槽位: {{ summary.oathCount }}</div>
|
||||
<div>已配置时装: {{ summary.avatarCount }}</div>
|
||||
<div>已配置徽章条目: {{ summary.emblemCount }}</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
Reference in New Issue
Block a user