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