1. 海报
This commit is contained in:
@@ -1,19 +1,34 @@
|
||||
/** 海报 side:male=/hb-n 男方,female=/hb-nv 女方 */
|
||||
/** 海报 side:1=男方(/hb-n),2=女方(/hb-nv) */
|
||||
|
||||
export const POSTER_SIDES = [
|
||||
{ key: 'male', route: '/hb-n', label: '男方', short: 'n' },
|
||||
{ key: 'female', route: '/hb-nv', label: '女方', short: 'nv' },
|
||||
{ key: 1, keyStr: '1', route: '/hb-n', label: '男方', short: 'n' },
|
||||
{ key: 2, keyStr: '2', route: '/hb-nv', label: '女方', short: 'nv' },
|
||||
]
|
||||
|
||||
export const POSTER_TEMPLATES = [
|
||||
{ value: 'classic', label: '经典竖版', desc: '顶图 + 正文逐行出现' },
|
||||
{ value: 'split', label: '左图右文', desc: '竖排书法 + 右侧宴席信息' },
|
||||
]
|
||||
|
||||
/** 解析为 1 | 2,无法识别返回 0 */
|
||||
export function resolvePosterSide(input) {
|
||||
if (input === 1 || input === '1') return 1
|
||||
if (input === 2 || input === '2') return 2
|
||||
const v = String(input || '').trim().toLowerCase()
|
||||
if (v === 'female' || v === 'nv' || v === 'f' || v === 'bride') return 'female'
|
||||
if (v === 'male' || v === 'n' || v === 'm' || v === 'groom') return 'male'
|
||||
return ''
|
||||
if (v === 'female' || v === 'nv' || v === 'f' || v === 'bride') return 2
|
||||
if (v === 'male' || v === 'n' || v === 'm' || v === 'groom') return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
function baseFields() {
|
||||
export function sideKey(side) {
|
||||
const s = resolvePosterSide(side) || 1
|
||||
return String(s)
|
||||
}
|
||||
|
||||
function baseFields(side) {
|
||||
return {
|
||||
side: resolvePosterSide(side) || 1,
|
||||
template: 'classic',
|
||||
enabled: true,
|
||||
heroImg: '',
|
||||
title: '婚礼邀请函',
|
||||
@@ -23,17 +38,32 @@ function baseFields() {
|
||||
showInviteButton: true,
|
||||
inviteButtonText: '打开请柬',
|
||||
invitePath: '/',
|
||||
// split 模板字段
|
||||
verticalSlogan: '吾家有喜',
|
||||
subSlogan1: '佳偶天成',
|
||||
subSlogan2: '百年好合',
|
||||
greeting: '尊敬的各位亲朋好友',
|
||||
groomName: '',
|
||||
brideName: '',
|
||||
dateText: '2026年10月3日 星期日',
|
||||
lunarText: '农历九月初八',
|
||||
venueText: '幸福大酒店二楼宴会厅',
|
||||
loveFooter: 'Love you',
|
||||
}
|
||||
}
|
||||
|
||||
/** 男方默认文案 */
|
||||
export function defaultMalePosterConfig() {
|
||||
/** 男方(1) 默认 */
|
||||
export function defaultSide1PosterConfig() {
|
||||
return {
|
||||
...baseFields(),
|
||||
...baseFields(1),
|
||||
side: 1,
|
||||
sonLabel: '儿子:',
|
||||
sonName: '张浩强',
|
||||
daughterInLawLabel: '儿媳:',
|
||||
daughterInLawName: '刘佳怡',
|
||||
groomName: '张浩强',
|
||||
brideName: '刘佳怡',
|
||||
verticalSlogan: '吾家有喜',
|
||||
lines: [
|
||||
'各位亲朋好友',
|
||||
'吾家有喜 儿子结婚',
|
||||
@@ -48,14 +78,18 @@ export function defaultMalePosterConfig() {
|
||||
}
|
||||
}
|
||||
|
||||
/** 女方默认文案 */
|
||||
export function defaultFemalePosterConfig() {
|
||||
/** 女方(2) 默认 */
|
||||
export function defaultSide2PosterConfig() {
|
||||
return {
|
||||
...baseFields(),
|
||||
...baseFields(2),
|
||||
side: 2,
|
||||
sonLabel: '女儿:',
|
||||
sonName: '刘佳怡',
|
||||
daughterInLawLabel: '女婿:',
|
||||
daughterInLawName: '张浩强',
|
||||
groomName: '张浩强',
|
||||
brideName: '刘佳怡',
|
||||
verticalSlogan: '小女出阁',
|
||||
lines: [
|
||||
'各位亲朋好友',
|
||||
'吾家有喜 女儿出嫁',
|
||||
@@ -70,15 +104,20 @@ export function defaultFemalePosterConfig() {
|
||||
}
|
||||
}
|
||||
|
||||
/** @deprecated 兼容旧调用,等同男方默认 */
|
||||
export function defaultMalePosterConfig() {
|
||||
return defaultSide1PosterConfig()
|
||||
}
|
||||
export function defaultFemalePosterConfig() {
|
||||
return defaultSide2PosterConfig()
|
||||
}
|
||||
export function defaultPosterConfig() {
|
||||
return defaultMalePosterConfig()
|
||||
return defaultSide1PosterConfig()
|
||||
}
|
||||
|
||||
export function defaultPosterBundle() {
|
||||
return {
|
||||
male: defaultMalePosterConfig(),
|
||||
female: defaultFemalePosterConfig(),
|
||||
'1': defaultSide1PosterConfig(),
|
||||
'2': defaultSide2PosterConfig(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,24 +133,42 @@ export const ENTER_EFFECTS = [
|
||||
{ value: 'curtain', label: '金幕拉开' },
|
||||
]
|
||||
|
||||
/** 是否为旧版扁平配置(未分男女方) */
|
||||
function isLegacyFlatPoster(raw) {
|
||||
if (!raw || typeof raw !== 'object') return false
|
||||
if (raw.male || raw.female) return false
|
||||
return 'title' in raw || 'lines' in raw || 'heroImg' in raw || 'sonName' in raw
|
||||
if (raw['1'] || raw['2'] || raw[1] || raw[2] || raw.male || raw.female) return false
|
||||
return 'title' in raw || 'lines' in raw || 'heroImg' in raw || 'sonName' in raw || 'template' in raw
|
||||
}
|
||||
|
||||
export function normalizePosterConfig(raw, side = 'male') {
|
||||
const s = resolvePosterSide(side) || 'male'
|
||||
const base = s === 'female' ? defaultFemalePosterConfig() : defaultMalePosterConfig()
|
||||
function pickSideSource(loaded, side) {
|
||||
const k = sideKey(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
|
||||
return null
|
||||
}
|
||||
|
||||
export function normalizePosterConfig(raw, side = 1) {
|
||||
const s = resolvePosterSide(side) || 1
|
||||
const base = s === 2 ? defaultSide2PosterConfig() : defaultSide1PosterConfig()
|
||||
const loaded = raw && typeof raw === 'object' ? raw : {}
|
||||
const lines = Array.isArray(loaded.lines)
|
||||
? loaded.lines.map((l) => String(l ?? ''))
|
||||
: base.lines
|
||||
const template = POSTER_TEMPLATES.some((t) => t.value === loaded.template)
|
||||
? loaded.template
|
||||
: base.template
|
||||
|
||||
const groomName = loaded.groomName || loaded.sonName || base.groomName
|
||||
const brideName = loaded.brideName || loaded.daughterInLawName || base.brideName
|
||||
|
||||
return {
|
||||
...base,
|
||||
...loaded,
|
||||
side: s,
|
||||
template,
|
||||
lines: lines.length ? lines : base.lines,
|
||||
groomName,
|
||||
brideName,
|
||||
enabled: loaded.enabled !== false,
|
||||
showInviteButton: loaded.showInviteButton !== false,
|
||||
loadingEffect: LOADING_EFFECTS.some((e) => e.value === loaded.loadingEffect)
|
||||
@@ -122,26 +179,34 @@ export function normalizePosterConfig(raw, side = 'male') {
|
||||
: base.enterEffect,
|
||||
invitePath: loaded.invitePath || '/',
|
||||
inviteButtonText: loaded.inviteButtonText || base.inviteButtonText,
|
||||
verticalSlogan: loaded.verticalSlogan || base.verticalSlogan,
|
||||
subSlogan1: loaded.subSlogan1 || base.subSlogan1,
|
||||
subSlogan2: loaded.subSlogan2 || base.subSlogan2,
|
||||
greeting: loaded.greeting || base.greeting,
|
||||
dateText: loaded.dateText || base.dateText,
|
||||
lunarText: loaded.lunarText || base.lunarText,
|
||||
venueText: loaded.venueText || base.venueText,
|
||||
loveFooter: loaded.loveFooter || base.loveFooter,
|
||||
}
|
||||
}
|
||||
|
||||
/** 归一化整包 { male, female };兼容旧扁平数据迁入 male */
|
||||
/** 归一化为 { 1, 2 };兼容旧 male/female 与扁平数据 */
|
||||
export function normalizePosterBundle(raw) {
|
||||
const loaded = raw && typeof raw === 'object' ? raw : {}
|
||||
if (isLegacyFlatPoster(loaded)) {
|
||||
return {
|
||||
male: normalizePosterConfig(loaded, 'male'),
|
||||
female: defaultFemalePosterConfig(),
|
||||
'1': normalizePosterConfig(loaded, 1),
|
||||
'2': defaultSide2PosterConfig(),
|
||||
}
|
||||
}
|
||||
return {
|
||||
male: normalizePosterConfig(loaded.male, 'male'),
|
||||
female: normalizePosterConfig(loaded.female, 'female'),
|
||||
'1': normalizePosterConfig(pickSideSource(loaded, 1) || {}, 1),
|
||||
'2': normalizePosterConfig(pickSideSource(loaded, 2) || {}, 2),
|
||||
}
|
||||
}
|
||||
|
||||
export function pickPosterSide(bundle, side) {
|
||||
const normalized = normalizePosterBundle(bundle)
|
||||
const s = resolvePosterSide(side) || 'male'
|
||||
const s = sideKey(side)
|
||||
return normalized[s]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user