diff --git a/apps/src/views/resident-activity/voice-room-rocket.vue b/apps/src/views/resident-activity/voice-room-rocket.vue index e254d95..d1d63bb 100644 --- a/apps/src/views/resident-activity/voice-room-rocket.vue +++ b/apps/src/views/resident-activity/voice-room-rocket.vue @@ -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; } @@ -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> | 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) { function openLevelResourcePicker( row: Record, - field: 'rocketAnimationUrl' | 'rocketIconUrl', + field: LevelResourceField, ) { resourcePickerTarget.value = { field, kind: 'level', row, }; - resourcePickerTitle.value = - field === 'rocketIconUrl' ? '选择火箭图标资源' : '选择发射动画资源'; + const titleMap: Record = { + 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) { function clearLevelResource( row: Record, - 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" > +