1. 海报

This commit is contained in:
李琦
2026-08-03 10:22:04 +08:00
parent 807adbc6a4
commit 211305c10c
5 changed files with 137 additions and 41 deletions

View File

@@ -1,8 +1,9 @@
/** 海报 side1=男方(/hb-n)2=女方(/hb-nv) */
/** 海报 side1=男方(/hb-n)2=女方(/hb-nv)3=回门宴(/hb-hm) */
export const POSTER_SIDES = [
{ key: 1, keyStr: '1', route: '/hb-n', label: '男方', short: 'n' },
{ key: 2, keyStr: '2', route: '/hb-nv', label: '女方', short: 'nv' },
{ key: 3, keyStr: '3', route: '/hb-hm', label: '回门宴', short: 'hm' },
]
export const POSTER_TEMPLATES = [
@@ -17,11 +18,13 @@ export const MOBILE_LAYOUTS = [
{ value: 'landscape', label: '横屏展示', desc: '手机端强制左右分栏' },
]
/** 解析为 1 | 2无法识别返回 0 */
/** 解析为 1 | 2 | 3,无法识别返回 0 */
export function resolvePosterSide(input) {
if (input === 1 || input === '1') return 1
if (input === 2 || input === '2') return 2
if (input === 3 || input === '3') return 3
const v = String(input || '').trim().toLowerCase()
if (v === 'hm' || v === 'hmy' || v === 'return' || v === 'huimen') return 3
if (v === 'female' || v === 'nv' || v === 'f' || v === 'bride') return 2
if (v === 'male' || v === 'n' || v === 'm' || v === 'groom') return 1
return 0
@@ -32,6 +35,11 @@ export function sideKey(side) {
return String(s)
}
export function posterSideMeta(side) {
const s = resolvePosterSide(side) || 1
return POSTER_SIDES.find((x) => x.key === s) || POSTER_SIDES[0]
}
function baseFields(side) {
return {
side: resolvePosterSide(side) || 1,
@@ -42,6 +50,9 @@ function baseFields(side) {
/** 二维码中心图;空则显示圆圈大囍 */
qrCenterImg: '',
title: '婚礼邀请函',
/** 浏览器标签 / 分享用页面标题与描述(可与海报主标题不同) */
pageTitle: '',
pageDescription: '',
footer: '—诚挚邀请 ♥ 恭请光临—',
loadingEffect: 'redSeal',
enterEffect: 'fadeUp',
@@ -68,22 +79,25 @@ export function defaultSide1PosterConfig() {
...baseFields(1),
side: 1,
sonLabel: '儿子:',
sonName: '张浩强',
sonName: '李琦',
daughterInLawLabel: '儿媳:',
daughterInLawName: '刘佳怡',
groomName: '张浩强',
brideName: '刘佳怡',
daughterInLawName: '李逸烁',
groomName: '李琦',
brideName: '李逸烁',
verticalSlogan: '吾家有喜',
dateText: '2026年9月4日 星期五',
lunarText: '农历七月廿三',
venueText: '山西省 阳泉市 芙蓉酒楼(阳泉店) 太行国际新城B区10号楼 二楼',
lines: [
'各位亲朋好友',
'吾家有喜 儿子结婚',
'良辰已定 吉日待访',
'兹定于2026年10月3日 星期',
'农历九月初八 中午11:08分',
'兹定于2026年9月4日 星期',
'农历七月廿三 中午11:08分',
'为儿子儿媳举办结婚典礼',
'敬备喜宴 诚邀您携家人光临',
'地址:幸福大酒店二楼宴会厅',
'张国栋 & 陈晓玲 夫 妇 敬邀',
'地址:山西省 阳泉市 芙蓉酒楼(阳泉店) 二楼',
'李国贞 & 赵红燕 夫 妇 敬邀',
],
}
}
@@ -93,27 +107,68 @@ export function defaultSide2PosterConfig() {
return {
...baseFields(2),
side: 2,
template: 'split',
mobileLayout: 'landscape',
sonLabel: '女儿:',
sonName: '刘佳怡',
sonName: '李逸烁',
daughterInLawLabel: '女婿:',
daughterInLawName: '张浩强',
groomName: '张浩强',
brideName: '刘佳怡',
daughterInLawName: '李琦',
groomName: '李琦',
brideName: '李逸烁',
verticalSlogan: '小女出阁',
dateText: '2026年9月4日 星期五',
lunarText: '农历七月廿三',
venueText: '山西省 阳泉市 芙蓉酒楼(阳泉店) 太行国际新城B区10号楼 二楼',
lines: [
'各位亲朋好友',
'吾家有喜 女儿出嫁',
'良辰已定 吉日待访',
'兹定于2026年10月3日 星期',
'农历九月初八 中午11:08分',
'兹定于2026年9月4日 星期',
'农历七月廿三 中午11:08分',
'为女儿女婿举办结婚典礼',
'敬备喜宴 诚邀您携家人光临',
'地址:幸福大酒店二楼宴会厅',
'地址:山西省 阳泉市 芙蓉酒楼(阳泉店) 太行国际新城B区10号楼 二楼',
'刘建国 & 王秀兰 夫 妇 敬邀',
],
}
}
/** 回门宴(3) 默认9月7日 */
export function defaultSide3PosterConfig() {
return {
...baseFields(3),
side: 3,
template: 'classic',
title: '回门宴邀请函',
footer: '—回门宴请 ♥ 恭请光临—',
sonLabel: '新郎:',
sonName: '李琦',
daughterInLawLabel: '新娘:',
daughterInLawName: '李逸烁',
groomName: '李琦',
brideName: '李逸烁',
verticalSlogan: '回门之喜',
subSlogan1: '琴瑟和鸣',
subSlogan2: '永结同心',
dateText: '2026年9月7日 星期一',
lunarText: '农历七月廿六',
venueText: '山西省 阳泉市 芙蓉酒楼(阳泉店) 太行国际新城B区10号楼 二楼',
enterEffect: 'curtain',
loadingEffect: 'redSeal',
lines: [
'各位亲朋好友',
'新婚燕尔 回门宴请',
'良辰已定 吉日待访',
'兹定于2026年9月7日 星期一',
'农历七月廿六 中午11:08分',
'为新婚夫妇举办回门宴',
'敬备薄酒 诚邀您携家人光临',
'地址:山西省 阳泉市 芙蓉酒楼(阳泉店) 太行国际新城B区10号楼 二楼',
'李琦 & 李逸烁 敬邀',
],
}
}
export function defaultMalePosterConfig() {
return defaultSide1PosterConfig()
}
@@ -128,9 +183,17 @@ export function defaultPosterBundle() {
return {
'1': defaultSide1PosterConfig(),
'2': defaultSide2PosterConfig(),
'3': defaultSide3PosterConfig(),
}
}
export function defaultPosterForSide(side) {
const s = resolvePosterSide(side) || 1
if (s === 3) return defaultSide3PosterConfig()
if (s === 2) return defaultSide2PosterConfig()
return defaultSide1PosterConfig()
}
export const LOADING_EFFECTS = [
{ value: 'fade', label: '淡入加载' },
{ value: 'redSeal', label: '红印囍字' },
@@ -145,7 +208,7 @@ export const ENTER_EFFECTS = [
function isLegacyFlatPoster(raw) {
if (!raw || typeof raw !== 'object') return false
if (raw['1'] || raw['2'] || raw[1] || raw[2] || raw.male || raw.female) return false
if (raw['1'] || raw['2'] || raw['3'] || raw[1] || raw[2] || raw[3] || raw.male || raw.female) return false
return 'title' in raw || 'lines' in raw || 'heroImg' in raw || 'sonName' in raw || 'template' in raw
}
@@ -154,12 +217,13 @@ function pickSideSource(loaded, side) {
if (loaded[k] && typeof loaded[k] === 'object') return loaded[k]
if (side === 1 && loaded.male && typeof loaded.male === 'object') return loaded.male
if (side === 2 && loaded.female && typeof loaded.female === 'object') return loaded.female
if (side === 3 && loaded.hm && typeof loaded.hm === 'object') return loaded.hm
return null
}
export function normalizePosterConfig(raw, side = 1) {
const s = resolvePosterSide(side) || 1
const base = s === 2 ? defaultSide2PosterConfig() : defaultSide1PosterConfig()
const base = defaultPosterForSide(s)
const loaded = raw && typeof raw === 'object' ? raw : {}
const lines = Array.isArray(loaded.lines)
? loaded.lines.map((l) => String(l ?? ''))
@@ -205,18 +269,20 @@ export function normalizePosterConfig(raw, side = 1) {
}
}
/** 归一化为 { 1, 2 };兼容旧 male/female 与扁平数据 */
/** 归一化为 { 1, 2, 3 };兼容旧 male/female 与扁平数据 */
export function normalizePosterBundle(raw) {
const loaded = raw && typeof raw === 'object' ? raw : {}
if (isLegacyFlatPoster(loaded)) {
return {
'1': normalizePosterConfig(loaded, 1),
'2': defaultSide2PosterConfig(),
'3': defaultSide3PosterConfig(),
}
}
return {
'1': normalizePosterConfig(pickSideSource(loaded, 1) || {}, 1),
'2': normalizePosterConfig(pickSideSource(loaded, 2) || {}, 2),
'3': normalizePosterConfig(pickSideSource(loaded, 3) || {}, 3),
}
}