xiangyixiangqin/miniapp/store/config.js
2026-01-21 19:36:36 +08:00

176 lines
4.8 KiB
JavaScript

/**
* 配置状态管理模块
* 小程序启动时一次性加载所有配置
*/
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: '', // 管家指导二维码
// 弹窗配置
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'
},
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 || ''
// 弹窗配置
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
}
}
})