增加预览url

This commit is contained in:
zhx 2026-05-15 12:06:27 +08:00
parent f46a95df79
commit b1bb7a2267

View File

@ -43,6 +43,7 @@ type LevelRow = {
id?: number | string;
level: number;
needEnergy: number;
previewRocketUrl: string;
rocketAnimationUrl: string;
rocketIconUrl: string;
shakeThresholdPercent: string;
@ -75,6 +76,11 @@ type ResourceOption = {
type: string;
};
type LevelResourceField =
| 'previewRocketUrl'
| 'rocketAnimationUrl'
| 'rocketIconUrl';
const accessStore = useAccessStore();
const sysOriginOptions = computed(() => {
const options = getAllowedSysOrigins(accessStore.accessCodes || []);
@ -116,7 +122,7 @@ const resourcePickerDefaultType = ref('ALL_PROPS');
const resourcePickerFixedType = ref(false);
const resourcePickerTarget = ref<
| {
field: 'rocketAnimationUrl' | 'rocketIconUrl';
field: LevelResourceField;
kind: 'level';
row: Record<string, any>;
}
@ -169,6 +175,12 @@ const statusMeta = computed(() => {
const levelColumns = [
{ dataIndex: 'level', key: 'level', title: '等级', width: 90 },
{ dataIndex: 'needEnergy', key: 'needEnergy', title: '所需能量', width: 160 },
{
dataIndex: 'previewRocketUrl',
key: 'previewRocketUrl',
title: '预览火箭',
width: 260,
},
{ dataIndex: 'rocketIconUrl', key: 'rocketIconUrl', title: '火箭图标', width: 260 },
{
dataIndex: 'rocketAnimationUrl',
@ -200,6 +212,7 @@ function createDefaultLevel(level: number): LevelRow {
enabled: true,
level,
needEnergy: level * 100,
previewRocketUrl: '',
rocketAnimationUrl: '',
rocketIconUrl: '',
shakeThresholdPercent: '95.0000',
@ -284,6 +297,7 @@ function normalizeLevelRows(rows: Array<Record<string, any>> | undefined) {
enabled: row.enabled === undefined ? true : Boolean(row.enabled),
id: row.id,
needEnergy: toNumber(row.needEnergy, level * 100),
previewRocketUrl: String(row.previewRocketUrl || ''),
rocketAnimationUrl: String(row.rocketAnimationUrl || ''),
rocketIconUrl: String(row.rocketIconUrl || ''),
shakeThresholdPercent: String(row.shakeThresholdPercent || '95.0000'),
@ -337,15 +351,19 @@ function isRewardResourceDisabled(row: Record<string, any>) {
function openLevelResourcePicker(
row: Record<string, any>,
field: 'rocketAnimationUrl' | 'rocketIconUrl',
field: LevelResourceField,
) {
resourcePickerTarget.value = {
field,
kind: 'level',
row,
};
resourcePickerTitle.value =
field === 'rocketIconUrl' ? '选择火箭图标资源' : '选择发射动画资源';
const titleMap: Record<LevelResourceField, string> = {
previewRocketUrl: '选择预览火箭资源',
rocketAnimationUrl: '选择发射动画资源',
rocketIconUrl: '选择火箭图标资源',
};
resourcePickerTitle.value = titleMap[field];
resourcePickerDefaultType.value = 'ALL_PROPS';
resourcePickerFixedType.value = false;
resourcePickerOpen.value = true;
@ -371,7 +389,7 @@ function openRewardResourcePicker(row: Record<string, any>) {
function clearLevelResource(
row: Record<string, any>,
field: 'rocketAnimationUrl' | 'rocketIconUrl',
field: LevelResourceField,
) {
row[field] = '';
}
@ -398,9 +416,9 @@ function handleResourceSelect(item: ResourceOption) {
}
if (target.kind === 'level') {
const value =
target.field === 'rocketIconUrl'
? String(item.cover || item.sourceUrl || '')
: String(item.sourceUrl || item.cover || '');
target.field === 'rocketAnimationUrl'
? String(item.sourceUrl || item.cover || '')
: String(item.cover || item.sourceUrl || '');
target.row[target.field] = value;
} else {
target.row.rewardItemId = item.id;
@ -507,6 +525,7 @@ async function saveLevels() {
id: row.id,
level: row.level,
needEnergy: toNumber(row.needEnergy, row.level * 100),
previewRocketUrl: row.previewRocketUrl,
rocketAnimationUrl: row.rocketAnimationUrl,
rocketIconUrl: row.rocketIconUrl,
shakeThresholdPercent: row.shakeThresholdPercent,
@ -783,7 +802,7 @@ watch(rewardLevel, () => {
:data-source="levelRows"
:loading="levelLoading"
:pagination="false"
:scroll="{ x: 1240 }"
:scroll="{ x: 1500 }"
row-key="level"
>
<template #bodyCell="{ column, record }">
@ -798,6 +817,36 @@ watch(rewardLevel, () => {
class="table-number"
/>
</template>
<template v-else-if="column.key === 'previewRocketUrl'">
<div class="resource-cell">
<div class="resource-cell__preview">
<img
v-if="record.previewRocketUrl"
:src="record.previewRocketUrl"
alt=""
/>
<span>{{ resourceUrlName(record.previewRocketUrl) }}</span>
</div>
<Space>
<Button
size="small"
type="primary"
@click="
openLevelResourcePicker(record, 'previewRocketUrl')
"
>
{{ record.previewRocketUrl ? '更换资源' : '选择资源' }}
</Button>
<Button
v-if="record.previewRocketUrl"
size="small"
@click="clearLevelResource(record, 'previewRocketUrl')"
>
清除
</Button>
</Space>
</div>
</template>
<template v-else-if="column.key === 'rocketIconUrl'">
<div class="resource-cell">
<div class="resource-cell__preview">