mirror of
https://github.com/Powerful-517/yys-editor.git
synced 2026-03-05 15:05:27 +00:00
fix: normalize asset urls for subpath deployment
This commit is contained in:
@@ -52,7 +52,7 @@
|
||||
<el-dialog v-if="!props.isEmbed" v-model="state.showFeedbackFormDialog" title="更新日志" width="60%">
|
||||
<span style="font-size: 24px;">备注阴阳师</span>
|
||||
<br/>
|
||||
<img src="/assets/Other/Contact.png"
|
||||
<img :src="contactImageUrl"
|
||||
style="cursor: pointer; vertical-align: bottom; width: 200px; height: auto;"/>
|
||||
</el-dialog>
|
||||
|
||||
@@ -124,6 +124,7 @@ import { getLogicFlowInstance } from "@/ts/useLogicFlow";
|
||||
import { useCanvasSettings } from '@/ts/useCanvasSettings';
|
||||
import { useSafeI18n } from '@/ts/useSafeI18n';
|
||||
import type { Pinia } from 'pinia';
|
||||
import { resolveAssetUrl } from '@/utils/assetUrl';
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
isEmbed?: boolean;
|
||||
@@ -133,6 +134,7 @@ const props = withDefaults(defineProps<{
|
||||
});
|
||||
|
||||
const filesStore = props.piniaInstance ? useFilesStore(props.piniaInstance) : useFilesStore();
|
||||
const contactImageUrl = resolveAssetUrl('/assets/Other/Contact.png') as string;
|
||||
const { showMessage } = useGlobalMessage();
|
||||
const { selectionEnabled, snapGridEnabled, snaplineEnabled } = useCanvasSettings();
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
>
|
||||
<span
|
||||
class="selector-image-frame"
|
||||
:style="`width: ${imageSize - 1}px; height: ${imageSize - 1}px; background-image: url('${item[config.itemRender.imageField]}');`"
|
||||
:style="`width: ${imageSize - 1}px; height: ${imageSize - 1}px; background-image: url('${getItemImageUrl(item)}');`"
|
||||
/>
|
||||
</el-button>
|
||||
<span style="text-align: center; display: block;">
|
||||
@@ -56,6 +56,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, computed } from 'vue'
|
||||
import type { SelectorConfig, GroupConfig } from '@/types/selector'
|
||||
import { resolveAssetUrl } from '@/utils/assetUrl'
|
||||
|
||||
const props = defineProps<{
|
||||
config: SelectorConfig
|
||||
@@ -75,6 +76,7 @@ const show = computed({
|
||||
const searchText = ref('')
|
||||
const activeTab = ref('ALL')
|
||||
const imageSize = computed(() => props.config.itemRender.imageSize || 100)
|
||||
const imageField = computed(() => props.config.itemRender.imageField)
|
||||
|
||||
// 过滤逻辑
|
||||
const filteredItems = (group: GroupConfig) => {
|
||||
@@ -107,10 +109,17 @@ const filteredItems = (group: GroupConfig) => {
|
||||
}
|
||||
|
||||
const handleSelect = (item: any) => {
|
||||
emit('select', item)
|
||||
const field = imageField.value
|
||||
const normalizedItem = {
|
||||
...item,
|
||||
[field]: resolveAssetUrl(item?.[field])
|
||||
}
|
||||
emit('select', normalizedItem)
|
||||
searchText.value = ''
|
||||
activeTab.value = 'ALL'
|
||||
}
|
||||
|
||||
const getItemImageUrl = (item: any) => resolveAssetUrl(item?.[imageField.value]) as string
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import { computed, ref, inject, onMounted, onBeforeUnmount } from 'vue';
|
||||
import { toTextStyle } from '@/ts/nodeStyle';
|
||||
import { useNodeAppearance } from '@/ts/useNodeAppearance';
|
||||
import { resolveAssetUrl } from '@/utils/assetUrl';
|
||||
|
||||
const currentAsset = ref({ name: '未选择资产', avatar: '', library: 'shikigami' });
|
||||
const getNode = inject('getNode') as (() => any) | undefined;
|
||||
@@ -47,6 +48,7 @@ const { containerStyle, textStyle } = useNodeAppearance({
|
||||
});
|
||||
|
||||
const mergedContainerStyle = computed(() => ({ ...containerStyle.value, boxSizing: 'border-box' }));
|
||||
const normalizedAvatar = computed(() => resolveAssetUrl(currentAsset.value.avatar) as string);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -54,7 +56,7 @@ const mergedContainerStyle = computed(() => ({ ...containerStyle.value, boxSizin
|
||||
<div class="zindex-badge">{{ zIndex }}</div>
|
||||
<img
|
||||
v-if="currentAsset.avatar"
|
||||
:src="currentAsset.avatar"
|
||||
:src="normalizedAvatar"
|
||||
:alt="currentAsset.name"
|
||||
class="asset-image"
|
||||
draggable="false"
|
||||
|
||||
@@ -4,6 +4,7 @@ import { useDialogs } from '@/ts/useDialogs';
|
||||
import { getLogicFlowInstance } from '@/ts/useLogicFlow';
|
||||
import { SELECTOR_PRESETS } from '@/configs/selectorPresets';
|
||||
import type { SelectorConfig } from '@/types/selector';
|
||||
import { resolveAssetUrl, resolveAssetUrlsInDataSource } from '@/utils/assetUrl';
|
||||
|
||||
const props = defineProps<{
|
||||
node: any;
|
||||
@@ -30,15 +31,32 @@ const handleOpenSelector = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
const imageField = preset.itemRender.imageField;
|
||||
const selectedAsset = node.properties?.selectedAsset || null;
|
||||
const normalizedSelectedAsset = selectedAsset && typeof selectedAsset === 'object'
|
||||
? {
|
||||
...selectedAsset,
|
||||
[imageField]: resolveAssetUrl(selectedAsset?.[imageField])
|
||||
}
|
||||
: selectedAsset;
|
||||
|
||||
const config: SelectorConfig = {
|
||||
...preset,
|
||||
currentItem: node.properties?.selectedAsset || null
|
||||
dataSource: resolveAssetUrlsInDataSource(preset.dataSource as any[], imageField),
|
||||
currentItem: normalizedSelectedAsset
|
||||
};
|
||||
|
||||
openGenericSelector(config, (selectedItem) => {
|
||||
const normalizedSelected = selectedItem && typeof selectedItem === 'object'
|
||||
? {
|
||||
...selectedItem,
|
||||
[imageField]: resolveAssetUrl(selectedItem?.[imageField])
|
||||
}
|
||||
: selectedItem;
|
||||
|
||||
lf.setProperties(node.id, {
|
||||
...node.properties,
|
||||
selectedAsset: selectedItem,
|
||||
selectedAsset: normalizedSelected,
|
||||
assetLibrary: library
|
||||
});
|
||||
});
|
||||
@@ -80,4 +98,4 @@ const handleOpenSelector = () => {
|
||||
color: #606266;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user