{{item.roomTitle}}
观看人数: {{item.viewerCount}}
.room-list {
padding: 10px;
}
.room-item {
display: flex;
align-items: center;
margin-bottom: 10px;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.room-item image {
width: 50px;
height: 50px;
margin-right: 10px;
}
.room-info {
flex: 1;
}
Page({
data: {
roomList: []
},
onLoad: function() {
this.fetchRoomList();
},
fetchRoomList: function() {
wx.request({
url: 'https://your-backend-server.com/api/rooms',
success: (res) => {
this.setData({
roomList : res.data
});
},
fail: (err) => {
console.error('获取直播间列表失败', err);
}
});
},
enterRoom: function (e) {
const roomId = e.currentTarget.dataset.roomid;
wx.navigateTo({
url: `/pages/liveRoom/liveRoom?roomId=${roomId}`
});
}
});
wx:for
指令循环渲染每个直播间的信息,包括主播头像、直播间标题和观看人数。每个直播间项绑定了 enterRoom
点击事件,用于进入直播间。onLoad
生命周期函数在页面加载时调用 fetchRoomList
方法从后端获取直播间列表数据。fetchRoomList
方法使用 wx.request
发起 HTTP 请求到后端获取直播间列表数据,并在成功时更新页面数据。enterRoom
方法获取点击的直播间 roomId
,并使用 wx.navigateTo
跳转到直播间页面。
.live-room {
position: relative;
}
video {
width: 100%;
height: auto;
}
.interact-area {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 10px;
background-color: rgba(0, 0, 0, 0.5);
color: white;
}
.chat-window {
height: 150px;
overflow-y: scroll;
margin-bottom: 10px;
}
.chat-message {
margin-bottom: 5px;
}
.interact-area button {
margin-right: 10px;
padding: 5px 10px;
}
.interact-area input {
padding: 5px;
margin-right: 10px;
}
Page({
data: {
liveStreamUrl: '',
chatMessages: [],
inputValue: '',
socketOpen: false,
socketMsgQueue: []
},
onLoad: function (options) {
const roomId = options.roomId;
this.fetchLiveStreamUrl(roomId);
this.connectSocket(roomId);
},
fetchLiveStreamUrl: function (roomId) {
wx.request({
url: `https://your-backend-server.com/api/rooms/${roomId}/stream`,
success: (res) => {
this.setData({
liveStreamUrl: res.data.streamUrl
});
},
fail: (err) => {
console.error('获取直播流地址失败', err);
}
});
},
connectSocket: function (roomId) {
wx.connectSocket({
url: `wss://your-backend-server.com/socket/room/${roomId}`,
success: (res) => {
this.setData({ socketOpen: true });
},
fail: (err) => {
console.error('连接WebSocket失败', err);
}
});
wx.onSocketOpen(() => { this.setData({ socketOpen: true });
this.sendQueuedMessages();
});
wx.onSocketMessage((res) => {
const message = JSON.parse(res.data);
this.setData({
chatMessages: [...this.data.chatMessages, message]
});
});
wx.onSocketClose(() => {
this.setData({ socketOpen: false });
});
},
onInput: function (e) {
this.setData({ inputValue: e.detail.value });
},
sendLike: function () {
if (!this.data.socketOpen) {
this.data.socketMsgQueue.push({ type: 'like' });
return;
}
wx.sendSocketMessage({
data: JSON.stringify({ type: 'like' }),
success: () => {
// 可以在这里添加点赞成功的提示或其他逻辑
},
fail: (err) => {
console.error('发送点赞消息失败', err);
}
});
},
sendGift: function () {
if (!this.data.socketOpen) {
this.data.socketMsgQueue.push({ type: 'gift' });
return;
}
wx.sendSocketMessage({
data: JSON.stringify({ type: 'gift' }),
success: () => {
// 可以在这里添加送礼物成功的提示或其他逻辑
},
fail: (err) => {
console.error('发送送礼物消息失败', err);
}
});
},
sendChatMessage: function () {
if (!this.data.socketOpen) {
this.data.socketMsgQueue.push({ type: 'chat', content: this.data.inputValue });
return;
}
const message = { type: 'chat', content: this.data.inputValue };
wx.sendSocketMessage({
data: JSON.stringify(message),
success: () => {
this.setData({
chatMessages: [...this.data.chatMessages, message],
inputValue: ''
});
},
fail: (err) => {
console.error('发送聊天消息失败', err);
}
});
},
sendQueuedMessages: function () {
while (this.data.socketMsgQueue.length > 0 && this.data.socketOpen) {
const message = this.data.socketMsgQueue.shift();
wx.sendSocketMessage({
data: JSON.stringify(message),
success: () => {
// 可以根据消息类型做不同的处理
},
fail: (err) => {
console.error('发送队列消息失败', err);
}
});
}
}
});
onLoad
方法根据传入的 roomId
获取直播流地址并连接到 WebSocket 服务器。fetchLiveStreamUrl
方法通过 HTTP 请求从后端获取直播流地址。connectSocket
方法连接 WebSocket,并监听 open
、message
和 close
事件。sendLike
、sendGift
和 sendChatMessage
方法分别处理点赞、送礼物和发送聊天消息的功能,若 WebSocket 未打开则将消息存入队列。sendQueuedMessages
方法在 WebSocket 打开时发送队列中的消息。const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const port = 3000;
// 模拟直播间数据
const rooms = [];
// 创建直播间
app.post('/api/rooms', (req, res) => {
const newRoom = {
id: Date.now().toString(),
anchor: req.body.anchor,
title: req.body.title
};
rooms.push(newRoom);
res.json(newRoom);
});
// 获取直播间列表
app.get('/api/rooms', (req, res) => {
res.json(rooms);
});
// 获取直播间直播流地址
app.get('/api/rooms/:roomId/stream', (req, res) => {
const room = rooms.find(r => r.id === req.params.roomId);
if (!room) {
return res.status(404).json({ error: '直播间未找到' });
}
// 这里假设直播流地址是固定的示例地址,实际应用中需要根据具体的流媒体服务来生成
const streamUrl = 'https://example.com/live/' + room.id;
res.json({ streamUrl });
});
io.on('connection', (socket) => {
let currentRoom;
socket.on('joinRoom', (roomId) => {
if (rooms.some(r => r.id === roomId)) {
socket.join(roomId);
currentRoom = roomId;
console.log('用户加入直播间:', roomId);
} else {
socket.emit('roomNotFound', '直播间未找到');
}
});
socket.on('sendMessage', (message) => {
if (currentRoom) {
io.to(currentRoom).emit('newMessage', message);
}
});
socket.on('sendLike', () => {
if (currentRoom) {
io.to(currentRoom).emit('newLike');
}
});
socket.on('sendGift', () => {
if (currentRoom) {
io.to(currentRoom).emit('newGift');
}
});
socket.on('disconnect', () => {
if (currentRoom) {
console.log('用户离开直播间:', currentRoom);
socket.leave(currentRoom);
}
});
});
http.listen(port, () => {
console.log(`服务器运行在端口 ${port}`);
});
express
创建 Web 服务器,http
模块创建 HTTP 服务器,并使用 socket.io
实现实时通信功能。app.post('/api/rooms')
:用于创建新的直播间,将新的直播间信息存储在 rooms
数组中并返回给客户端。app.get('/api/rooms')
:获取所有直播间列表并返回给客户端。app.get('/api/rooms/:roomId/stream')
:根据传入的 roomId
获取对应的直播流地址,这里返回的是一个示例地址,实际应用中需要与流媒体服务集成来获取真实地址。io.on('connection', (socket) => {})
:监听客户端连接事件,每当有新的客户端连接时,会执行此回调函数。socket.on('joinRoom', (roomId) => {})
:处理客户端加入直播间的请求,检查直播间是否存在,若存在则让客户端加入该直播间。socket.on('sendMessage', (message) => {})
:处理客户端发送的聊天消息,将消息广播到当前直播间的所有客户端。socket.on('sendLike', () => {})
和 socket.on('sendGift', () => {})
:分别处理客户端发送的点赞和送礼物请求,将相应事件广播到当前直播间的所有客户端。socket.on('disconnect', () => {})
:处理客户端断开连接事件,让客户端离开当前所在的直播间。以上前端和后端代码示例共同构建了一个简单的婚恋小程序直播系统框架。前端负责用户界面的展示和与用户的交互,通过小程序提供的 API 与后端进行通信。后端则负责处理业务逻辑,如直播间的创建、管理,直播流地址的提供以及实时通信的处理。在实际开发中,还需要进一步完善功能,如用户认证、直播录制存储与回放、礼物系统的详细实现等,并考虑性能优化、安全性等方面的问题 。