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