first commit
This commit is contained in:
234
miniprogram/pages/index/index.js
Normal file
234
miniprogram/pages/index/index.js
Normal file
@@ -0,0 +1,234 @@
|
||||
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' })
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user