xiangyixiangqin/miniapp/store/config.js
2026-01-24 20:20:09 +08:00

210 lines
5.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 配置状态管理模块
* 小程序启动时一次性加载所有配置
*/
import { defineStore } from 'pinia'
import {
getLastPopupDate, setLastPopupDate,
getMemberAdClosedDate, setMemberAdClosedDate,
getMemberAdClosedForever, setMemberAdClosedForever,
getDefaultAvatar, setDefaultAvatar
} from '../utils/storage.js'
import { getAppConfig } from '../api/config.js'
/**
* 获取今天的日期字符串 (YYYY-MM-DD)
* @returns {string}
*/
export function getTodayDateString() {
const now = new Date()
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`
}
export const useConfigStore = defineStore('config', {
state: () => ({
// 是否已加载配置
isLoaded: false,
// 首页配置
banners: [],
kingKongs: [],
// 系统配置
defaultAvatar: getDefaultAvatar() || '/static/logo.png',
searchBanner: '',
butlerQrcode: '', // 管家指导二维码
// 会员图标配置
memberIcons: {
unlimitedMemberIcon: '', // 不限时会员图标
sincereMemberIcon: '', // 诚意会员图标
familyMemberIcon: '' // 家庭版会员图标
},
// 弹窗配置
dailyPopup: null,
memberAdConfig: null,
lastPopupDate: getLastPopupDate() || '',
memberAdClosedDate: getMemberAdClosedDate() || '',
memberAdClosedForever: getMemberAdClosedForever() || false,
// 弹窗显示状态
showGenderPopup: false,
showDailyPopup: false,
showMemberAd: false
}),
getters: {
hasBanners: (state) => state.banners.length > 0,
hasKingKongs: (state) => state.kingKongs.length > 0,
hasDailyPopup: (state) => state.dailyPopup !== null,
hasMemberAdConfig: (state) => state.memberAdConfig !== null && state.memberAdConfig.status === 1,
getDefaultAvatar: (state) => state.defaultAvatar || '/static/logo.png',
/**
* 根据会员等级获取对应的图标URL
* @param {number} memberLevel - 会员等级1不限时会员 2诚意会员 3家庭版会员
* @returns {string} 图标URL
*/
getMemberIcon: (state) => (memberLevel) => {
switch (memberLevel) {
case 1:
return state.memberIcons.unlimitedMemberIcon || ''
case 2:
return state.memberIcons.sincereMemberIcon || ''
case 3:
return state.memberIcons.familyMemberIcon || ''
default:
return ''
}
}
},
actions: {
/**
* 加载所有配置(小程序启动时调用一次)
*/
async loadAppConfig() {
if (this.isLoaded) return
try {
const res = await getAppConfig()
if (res && res.data) {
const config = res.data
// 首页配置
this.banners = config.banners || []
this.kingKongs = config.kingKongs || []
// 系统配置
if (config.defaultAvatar) {
this.defaultAvatar = config.defaultAvatar
setDefaultAvatar(config.defaultAvatar)
}
this.searchBanner = config.searchBanner || ''
this.butlerQrcode = config.butlerQrcode || ''
// 会员图标配置
if (config.memberIcons) {
this.memberIcons = {
unlimitedMemberIcon: config.memberIcons.unlimitedMemberIcon || '',
sincereMemberIcon: config.memberIcons.sincereMemberIcon || '',
familyMemberIcon: config.memberIcons.familyMemberIcon || ''
}
}
// 弹窗配置
this.dailyPopup = config.dailyPopup || null
this.memberAdConfig = config.memberAdPopup || null
this.isLoaded = true
}
} catch (error) {
console.error('加载配置失败:', error)
}
},
/**
* 检查并决定显示哪个弹窗
* @param {Object} userState - 用户状态
*/
checkPopupDisplay(userState) {
const today = getTodayDateString()
const { genderPreference, isProfileCompleted, isMember } = userState
// 重置所有弹窗状态
this.showGenderPopup = false
this.showDailyPopup = false
this.showMemberAd = false
// 性别选择弹窗优先级最高
if (genderPreference === 0 && !isProfileCompleted) {
this.showGenderPopup = true
return
}
// 每日弹窗
if (this.lastPopupDate !== today && this.dailyPopup) {
this.showDailyPopup = true
return
}
// 会员广告
if (!isMember && this.memberAdConfig && this.memberAdConfig.status === 1) {
const displayMode = this.memberAdConfig.displayMode || 2
if (displayMode === 1) {
this.showMemberAd = true
} else if (displayMode === 2) {
if (this.memberAdClosedDate !== today) {
this.showMemberAd = true
}
} else if (displayMode === 3) {
if (!this.memberAdClosedForever) {
this.showMemberAd = true
}
}
}
},
closeGenderPopup() {
this.showGenderPopup = false
},
closeDailyPopup() {
const today = getTodayDateString()
this.showDailyPopup = false
this.lastPopupDate = today
setLastPopupDate(today)
},
closeMemberAd() {
const today = getTodayDateString()
this.showMemberAd = false
const displayMode = this.memberAdConfig?.displayMode || 2
if (displayMode === 2) {
this.memberAdClosedDate = today
setMemberAdClosedDate(today)
} else if (displayMode === 3) {
this.memberAdClosedForever = true
setMemberAdClosedForever(true)
}
},
reset() {
this.isLoaded = false
this.banners = []
this.kingKongs = []
this.searchBanner = ''
this.dailyPopup = null
this.memberAdConfig = null
this.showGenderPopup = false
this.showDailyPopup = false
this.showMemberAd = false
}
}
})