Files
WoMenQuNaJu/miniprogram/pages/index/index.js
2026-02-04 16:11:55 +08:00

235 lines
7.1 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.
const app = getApp()
const db = wx.cloud.database()
Page({
data: {
myRooms: [],
joinedRooms: [],
userOpenId: ''
},
onLoad: function () {
// 先从本地加载
const myRooms = wx.getStorageSync('myRooms') || []
this.setData({ myRooms })
// 获取用户openid后加载完整数据
this.getUserOpenId()
},
onShow: function () {
// 每次显示页面时重新加载聚会列表
if (this.data.userOpenId) {
this.loadRooms()
} else {
// 先显示本地数据,异步加载完整数据
this.getUserOpenId()
}
},
async getUserOpenId() {
try {
// 调用云函数获取 openid
const res = await wx.cloud.callFunction({
name: 'getOpenId'
})
if (res.result && res.result.openid) {
this.setData({ userOpenId: res.result.openid })
this.loadRooms()
}
} catch (err) {
console.error('获取openid失败', err)
}
},
async loadRooms() {
try {
const userOpenId = this.data.userOpenId
if (!userOpenId) return
const _ = db.command
// 查询我创建的聚会
const myRoomsRes = await db.collection('rooms')
.where({
_openid: userOpenId
})
.orderBy('createdAt', 'desc')
.limit(5)
.get()
// 查询我参与的聚会members中有我但不是我创建的
const joinedRoomsRes = await db.collection('rooms')
.where({
_openid: _.neq(userOpenId),
'members.openid': userOpenId
})
.orderBy('createdAt', 'desc')
.limit(5)
.get()
// 转换数据格式
const myRooms = myRoomsRes.data.map(room => ({
roomId: room._id,
name: room.name,
meetTime: room.meetTime
}))
const joinedRooms = joinedRoomsRes.data.map(room => ({
roomId: room._id,
name: room.name,
meetTime: room.meetTime
}))
// 更新到本地存储
const allRooms = [...myRooms, ...joinedRooms]
const uniqueRooms = this.getUniqueRooms(allRooms)
wx.setStorageSync('roomList', uniqueRooms)
wx.setStorageSync('myRooms', myRooms.slice(0, 2))
this.setData({
myRooms: myRooms.slice(0, 2),
joinedRooms: joinedRooms.slice(0, 2)
})
} catch (err) {
console.error('加载聚会列表失败', err)
}
},
getUniqueRooms(rooms) {
const unique = {}
rooms.forEach(room => {
unique[room.roomId] = room
})
// 使用 Object.keys + map 代替 Object.values
return Object.keys(unique).map(key => unique[key])
},
onJoinRoom(e) {
const roomId = e.currentTarget.dataset.roomid
wx.navigateTo({
url: `/pages/room/room?roomId=${roomId}&isCreator=true`
})
},
onDeleteRoom(e) {
const roomId = e.currentTarget.dataset.roomid
wx.showModal({
title: '删除聚会',
content: '确定要删除这个聚会吗?',
confirmText: '删除',
confirmColor: '#ff4d4f',
success: (res) => {
if (res.confirm) {
this.deleteRoom(roomId)
}
}
})
},
async deleteRoom(roomId) {
wx.showLoading({ title: '删除中...' })
try {
// 调用云函数删除聚会
const res = await wx.cloud.callFunction({
name: 'deleteRoom',
data: { roomId }
})
wx.hideLoading()
if (res.result && res.result.success) {
// 从本地存储中移除
let myRooms = wx.getStorageSync('myRooms') || []
myRooms = myRooms.filter(item => item.roomId !== roomId)
wx.setStorageSync('myRooms', myRooms)
let roomList = wx.getStorageSync('roomList') || []
roomList = roomList.filter(item => item.roomId !== roomId)
wx.setStorageSync('roomList', roomList)
// 更新页面数据
this.setData({
myRooms
})
wx.showToast({ title: '删除成功', icon: 'success' })
} else {
wx.showToast({ title: res.result?.msg || '删除失败', icon: 'none' })
}
} catch (err) {
wx.hideLoading()
console.error('删除聚会失败', err)
wx.showToast({ title: '网络错误', icon: 'none' })
}
},
onCreateRoom() {
wx.navigateTo({
url: '/pages/create-room/create-room'
})
},
createRoom(name, keywords, meetTime) {
wx.showLoading({ title: '创建中...', mask: true })
wx.cloud.callFunction({
name: 'createRoom',
data: {
name,
meetTime,
keywords,
requirements: ''
},
success: res => {
wx.hideLoading()
if (res.result.success) {
const roomId = res.result.roomId
// 保存到本地存储
let myRooms = wx.getStorageSync('myRooms') || []
myRooms = myRooms.filter(item => item.roomId !== roomId)
myRooms.unshift({
roomId,
name,
meetTime,
keywords
})
if (myRooms.length > 2) {
myRooms = myRooms.slice(0, 2)
}
wx.setStorageSync('myRooms', myRooms)
// 更新全局roomList
let roomList = wx.getStorageSync('roomList') || []
roomList = roomList.filter(item => item.roomId !== roomId)
roomList.unshift({
roomId,
name,
meetTime,
keywords
})
if (roomList.length > 5) {
roomList = roomList.slice(0, 5)
}
wx.setStorageSync('roomList', roomList)
wx.navigateTo({
url: `/pages/room/room?roomId=${roomId}&isCreator=true`
})
} else {
wx.showToast({ title: res.result.msg || '创建失败', icon: 'none' })
}
},
fail: err => {
wx.hideLoading()
console.error('云函数调用失败', err)
wx.showToast({ title: '网络错误', icon: 'none' })
}
})
}
})