app.js
4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
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([])
// 初始化应用数据
async function fetchInitialData() {
try {
loading.value = true
// 获取用户数据
const usersResponse = await fetch('/data/users.json')
const usersData = await usersResponse.json()
currentUser.value = usersData[0]
// 获取活动数据
const activitiesResponse = await fetch('/data/activities.json')
const activitiesData = await activitiesResponse.json()
activities.value = activitiesData
// 获取报名数据
const registrationsResponse = await fetch('/data/registrations.json')
const registrationsData = await registrationsResponse.json()
registrations.value = registrationsData
// 获取消息数据
const messagesResponse = await fetch('/data/messages.json')
const messagesData = await messagesResponse.json()
userMessages.value = messagesData
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
}
})