You need to sign in or sign up before continuing.
app.js 4 KB
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import usersData from '../data/users.json'
import activitiesData from '../data/activities.json'
import registrationsData from '../data/registrations.json'
import messagesData from '../data/messages.json'

export const useAppStore = defineStore('app', () => {
  const currentUser = ref(null)
  const activities = ref([])
  const loading = ref(true)
  const error = ref(null)
  const registrations = ref([])
  const userMessages = ref([])

  // 初始化应用数据
  function fetchInitialData() {
    try {
      loading.value = true

      // 获取用户数据
      currentUser.value = usersData.users[0]

      // 获取活动数据
      activities.value = activitiesData.activities

      // 获取报名数据
      registrations.value = registrationsData.registrations

      // 获取消息数据
      userMessages.value = messagesData.messages

      loading.value = false
    } catch (err) {
      console.error('Failed to fetch initial data:', err)
      error.value = '加载应用数据失败,请稍后重试。'
      loading.value = false
    }
  }

  // 根据ID获取活动
  const getActivityById = computed(() => {
    return (activityId) => activities.value.find(activity => activity.id === activityId) || null
  })

  // 获取用户的报名记录
  const getUserRegistrations = computed(() => {
    return () => currentUser.value ? registrations.value.filter(reg => reg.user_id === currentUser.value.id) : []
  })

  // 报名活动
  function registerForActivity(activityId, formData) {
    if (!currentUser.value) return { success: false, error: '用户未登录' }

    const newRegistration = {
      id: `R${Math.floor(Math.random() * 10000).toString().padStart(4, '0')}`,
      activity_id: activityId,
      user_id: currentUser.value.id,
      registration_time: new Date().toISOString().replace('T', ' ').substring(0, 19),
      status: 'pending',
      custom_fields: formData.fields,
      custom_answers: formData.answers
    }

    registrations.value.push(newRegistration)
    return { success: true, registrationId: newRegistration.id }
  }

  // 创建新活动
  function createActivity(activityData) {
    if (!currentUser.value) return { success: false, error: '用户未登录' }

    const newActivity = {
      id: `A${Math.floor(Math.random() * 10000).toString().padStart(4, '0')}`,
      organizer_id: currentUser.value.id,
      organizer_name: currentUser.value.name,
      ...activityData,
      participant_count: 0,
      is_published: activityData.is_published || true,
      is_public: activityData.is_public || true,
    }

    activities.value.push(newActivity)
    return { success: true, activityId: newActivity.id }
  }

  // 活动签到
  function checkInForActivity(activityId, registrationId, method = 'manual') {
    if (!currentUser.value) return { success: false, error: '用户未登录' }

    const checkinData = {
      id: `C${Math.floor(Math.random() * 10000).toString().padStart(4, '0')}`,
      activity_id: activityId,
      user_id: currentUser.value.id,
      registration_id: registrationId,
      checkin_time: new Date().toISOString().replace('T', ' ').substring(0, 19),
      checkin_type: method,
      status: 'successful',
      is_late: false
    }

    return { success: true, checkin: checkinData }
  }

  // 获取用户消息
  const getUserMessages = computed(() => {
    return () => currentUser.value ? userMessages.value.filter(msg => msg.recipient_id === currentUser.value.id) : []
  })

  // 切换消息已读状态
  function toggleMessageReadStatus(messageId) {
    userMessages.value = userMessages.value.map(msg =>
      msg.id === messageId
        ? { ...msg, read_status: !msg.read_status }
        : msg
    )
  }

  return {
    currentUser,
    activities,
    loading,
    error,
    registrations,
    userMessages,
    fetchInitialData,
    getActivityById,
    getUserRegistrations,
    registerForActivity,
    createActivity,
    checkInForActivity,
    getUserMessages,
    toggleMessageReadStatus
  }
})