@@ -1441,6 +1446,7 @@ import {
import { useAdminStore } from '@/stores/admin'
import ImageField from '@/components/ImageField.vue'
import MediaPickerModal from '@/components/MediaPickerModal.vue'
+import HotelWelcomePosterAdmin from '@/views/admin/HotelWelcomePosterAdmin.vue'
import { BORDER_STYLES, borderClass } from '@/composables/borderStyles'
import { resolveDanmakuSwatch } from '@/utils/danmakuColors'
import { GIFT_TYPES, GIFT_LABEL_MAP, emptyGiftCosts, DEFAULT_GIFT_COSTS } from '@/utils/giftTypes'
@@ -1466,7 +1472,7 @@ const adminStore = useAdminStore()
const TAB_KEY = 'wedding_admin_active_tab'
const MENU_LAYOUT_KEY = 'wedding_admin_menu_layout'
const CONFIG_SECTIONS = ['basic', 'copy', 'visual', 'music', 'photos', 'schedule']
-const VALID_TABS = ['overview', 'gifts', 'visits', ...CONFIG_SECTIONS, 'upload', 'poster', 'rsvp', 'cash', 'danmaku']
+const VALID_TABS = ['overview', 'gifts', 'visits', ...CONFIG_SECTIONS, 'upload', 'poster', 'hotelWelcome', 'rsvp', 'cash', 'danmaku']
/** 后台菜单分组 */
const adminMenuGroups = [
@@ -1505,6 +1511,7 @@ const adminMenuGroups = [
label: '海报与系统',
items: [
{ key: 'poster', label: '海报', icon: 'fa-solid fa-scroll' },
+ { key: 'hotelWelcome', label: '迎宾易拉宝', icon: 'fa-solid fa-hotel' },
{ key: 'upload', label: '上传设置', icon: 'fa-solid fa-cloud-arrow-up' },
],
},
@@ -1549,6 +1556,7 @@ function readStoredMenuLayout() {
const activeTab = ref(readStoredTab())
const menuLayout = ref(readStoredMenuLayout())
+const hotelWelcomeRef = ref(null)
watch(menuLayout, (v) => {
try { localStorage.setItem(MENU_LAYOUT_KEY, v) } catch { /* ignore */ }
})
@@ -2790,6 +2798,10 @@ async function onTabActivate(tab) {
await Promise.all([loadPosterConfig(), loadPosterMusicOptions()])
return
}
+ if (tab === 'hotelWelcome') {
+ hotelWelcomeRef.value?.refresh?.()
+ return
+ }
if (tab === 'rsvp') {
await loadRsvp()
return
diff --git a/vite-tailwindcss/src/views/admin/HotelWelcomePosterAdmin.vue b/vite-tailwindcss/src/views/admin/HotelWelcomePosterAdmin.vue
new file mode 100644
index 0000000..8d19627
--- /dev/null
+++ b/vite-tailwindcss/src/views/admin/HotelWelcomePosterAdmin.vue
@@ -0,0 +1,988 @@
+
+
+
+
+
+
+
婚礼迎宾易拉宝
+
+ 共 {{ list.length }} 张 · 酒店门口欢迎海报(新人姓名 / 日期 / WEDDING),非按贵宾制
+
+
+
+
+
+
+
+
+ {{ templateLabel(record.template) }}
+
+
+ {{ formatTime(record.updated_at) }}
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+ 返回列表
+
+
+
{{ detail?.name || '迎宾易拉宝' }}
+
改新人姓名与日期 · 拖拽排版 · 导出酒店门口立牌 PNG
+
+
+
+
+
+
+
加载中…
+
+
+
+
+
![]()
+
暂无原图
+
+
+ {{ t.content || ' ' }}
+
+
+
点击文字选中并拖拽;点击空白取消选中
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
文字图层({{ texts.length }})
+
+ 添加文字
+
+
+
+ 暂无文字,可切换模板或手动添加
+
+
+
+
{{ t.content || '(空)' }}
+
删除
+
+
+
+
+
+
位置 X {{ Math.round(t.x) }}% · Y {{ Math.round(t.y) }}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 创建后改新人姓名、日期,并拖拽排版后导出
+
+
+
+
+
+
+
+ 每个卡片展示文字落点区域,点击即可选用;之后仍可在画布上拖拽微调
+
+
+
{{ group.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+