feat(canvas): 上传并入图片库,首格为上传入口;隐藏保存中提示

This commit is contained in:
2026-10-12 14:39:42 +08:00
parent 6b4c90f876
commit 3d8c809393
+45 -11
View File
@@ -817,7 +817,7 @@ onBeforeRouteLeave(async () => {
}) })
const saveLabel = computed(() => ({ const saveLabel = computed(() => ({
saved: '', dirty: '', saving: '保存中…', error: '保存失败,重试中', saved: '', dirty: '', saving: '', error: '保存失败,重试中',
}[saveState.value] || '')) }[saveState.value] || ''))
</script> </script>
@@ -853,10 +853,7 @@ const saveLabel = computed(() => ({
<button class="cv-btn" title="适应内容 (1)" @click="stage?.fitToContent?.()">⤢</button> <button class="cv-btn" title="适应内容 (1)" @click="stage?.fitToContent?.()">⤢</button>
<span class="cv-sep" /> <span class="cv-sep" />
<button class="cv-btn cv-btn--accent" @click="addNote">+ 笔记</button> <button class="cv-btn cv-btn--accent" @click="addNote">+ 笔记</button>
<button class="cv-btn cv-btn--accent" @click="openPicker">+ 图片</button> <button class="cv-btn cv-btn--accent" @click="openPicker">🗂 图片库</button>
<button class="cv-btn" :disabled="uploadBusy" title="上传本地图片(也可直接拖入/粘贴)" @click="fileInput?.click()">
{{ uploadBusy ? '上传中…' : '⤒ 上传' }}
</button>
<input ref="fileInput" type="file" accept="image/*" multiple hidden @change="onFilePicked"> <input ref="fileInput" type="file" accept="image/*" multiple hidden @change="onFilePicked">
<span v-if="saveLabel" class="cv-save" :data-state="saveState">{{ saveLabel }}</span> <span v-if="saveLabel" class="cv-save" :data-state="saveState">{{ saveLabel }}</span>
</div> </div>
@@ -972,19 +969,25 @@ const saveLabel = computed(() => ({
<img :src="generatedUrl(previewSrc)" alt="" @click.stop> <img :src="generatedUrl(previewSrc)" alt="" @click.stop>
</div> </div>
<!-- 我的图片选择 --> <!-- 图片库:我的全部作品 + 第一格上传入口 -->
<div v-if="pickerOpen" class="cv-picker" @click.self="pickerOpen = false"> <div v-if="pickerOpen" class="cv-picker" @click.self="pickerOpen = false">
<div class="cv-picker__box"> <div class="cv-picker__box">
<div class="cv-picker__head"> <div class="cv-picker__head">
<span>插入图片(点击放置到画布)</span> <span>图片库(点击插入画布)</span>
<div class="cv-picker__acts">
<button class="cv-btn cv-btn--accent" @click="fileInput?.click()">⤒ 上传本地</button>
<button class="cv-btn" @click="pickerOpen = false">✕</button> <button class="cv-btn" @click="pickerOpen = false">✕</button>
</div> </div>
</div>
<div v-if="pickerLoading" class="cv-loading">加载中…</div> <div v-if="pickerLoading" class="cv-loading">加载中…</div>
<div v-else-if="!pickerItems.length" class="cv-loading">还没有生成过图片</div>
<div v-else class="cv-picker__grid"> <div v-else class="cv-picker__grid">
<button
type="button"
class="cv-picker__up"
:disabled="uploadBusy"
title="上传本地图片"
@click="fileInput?.click()"
>
<span class="cv-picker__up-icon">⤒</span>
<span>{{ uploadBusy ? '上传中…' : '上传图片' }}</span>
</button>
<img <img
v-for="f in pickerItems" v-for="f in pickerItems"
:key="f.name" :key="f.name"
@@ -1468,4 +1471,35 @@ const saveLabel = computed(() => ({
border-color: rgb(124 92 252 / 0.55); border-color: rgb(124 92 252 / 0.55);
box-shadow: 0 8px 20px var(--accent-glow); box-shadow: 0 8px 20px var(--accent-glow);
} }
.cv-picker__up {
width: 100%;
aspect-ratio: 1;
border-radius: 10px;
border: 2px dashed rgb(124 92 252 / 0.45);
background: transparent;
color: var(--m-orange);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 6px;
font-size: 12px;
font-weight: 700;
cursor: pointer;
transition: transform 0.12s ease, border-color 0.12s ease, background 0.12s ease, box-shadow 0.12s ease;
}
.cv-picker__up:hover {
transform: translateY(-2px);
border-color: var(--m-orange);
background: rgb(124 92 252 / 0.08);
box-shadow: 0 8px 20px var(--accent-glow);
}
.cv-picker__up:disabled {
opacity: 0.6;
cursor: wait;
}
.cv-picker__up-icon {
font-size: 22px;
line-height: 1;
}
</style> </style>