This commit is contained in:
yj 2024-11-21 15:47:10 +08:00
parent dd589f646c
commit 1bd7658f45
12 changed files with 186 additions and 68 deletions

File diff suppressed because one or more lines are too long

View File

@ -4,7 +4,7 @@ var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexport
var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; };
var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
__DEFINE__(1731653753937, function(require, module, exports) { __DEFINE__(1732151585866, function(require, module, exports) {
// do not edit .js files directly - edit src/index.jst // do not edit .js files directly - edit src/index.jst
@ -53,7 +53,7 @@ module.exports = function equal(a, b) {
}; };
}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); }) }, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); })
return __REQUIRE__(1731653753937); return __REQUIRE__(1732151585866);
})() })()
//miniprogram-npm-outsideDeps=[] //miniprogram-npm-outsideDeps=[]
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map

View File

@ -4,7 +4,7 @@ var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexport
var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; };
var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
__DEFINE__(1731653753938, function(require, module, exports) { __DEFINE__(1732151585867, function(require, module, exports) {
module.exports = rfdc module.exports = rfdc
@ -205,7 +205,7 @@ function rfdcCircles (opts) {
} }
}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); }) }, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); })
return __REQUIRE__(1731653753938); return __REQUIRE__(1732151585867);
})() })()
//miniprogram-npm-outsideDeps=[] //miniprogram-npm-outsideDeps=[]
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map

View File

@ -4,7 +4,7 @@ var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexport
var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; };
var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
__DEFINE__(1731653753939, function(require, module, exports) { __DEFINE__(1732151585868, function(require, module, exports) {
// This file is autogenerated. It's used to publish CJS to npm. // This file is autogenerated. It's used to publish CJS to npm.
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@ -1195,7 +1195,7 @@ __DEFINE__(1731653753939, function(require, module, exports) {
})); }));
}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); }) }, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); })
return __REQUIRE__(1731653753939); return __REQUIRE__(1732151585868);
})() })()
//miniprogram-npm-outsideDeps=[] //miniprogram-npm-outsideDeps=[]
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map

1
package-lock.json generated
View File

@ -9,6 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"dayjs": "^1.11.13",
"miniprogram-computed": "^5.1.0", "miniprogram-computed": "^5.1.0",
"signalr-for-wx": "^1.1.6", "signalr-for-wx": "^1.1.6",
"tdesign-miniprogram": "^1.7.1" "tdesign-miniprogram": "^1.7.1"

View File

@ -10,6 +10,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"dayjs": "^1.11.13",
"miniprogram-computed": "^5.1.0", "miniprogram-computed": "^5.1.0",
"signalr-for-wx": "^1.1.6", "signalr-for-wx": "^1.1.6",
"tdesign-miniprogram": "^1.7.1" "tdesign-miniprogram": "^1.7.1"

View File

@ -6,7 +6,7 @@ import { agora } from '../../utils/agora'
Page({ Page({
data: { data: {
meetingForm: { meetingForm: {
roomNum: '27413452', roomNum: '34351300',
roomName: '杨杨', roomName: '杨杨',
}, },
isRecord: false, isRecord: false,

View File

@ -4,7 +4,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
position: absolute; position: absolute;
z-index: 1; z-index: 3;
left: 6rpx; left: 6rpx;
background-color: rgba(0, 0, 0, 0.4); background-color: rgba(0, 0, 0, 0.4);
border-radius: 4rpx; border-radius: 4rpx;
@ -56,7 +56,7 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: black; background-color: black;
z-index: 2; z-index: 4;
&-image { &-image {
position: absolute; position: absolute;
@ -71,6 +71,7 @@
&-video { &-video {
flex-grow: 1; flex-grow: 1;
position: relative; position: relative;
background-color: black;
&-avatar { &-avatar {
position: absolute; position: absolute;
@ -82,6 +83,16 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: black; background-color: black;
z-index: 2;
}
&-fullscreen {
position: absolute;
right: 2%;
top: 2%;
color: white;
z-index: 2;
background-color: rgba(0, 0, 0, 0.4);
} }
&-canvas { &-canvas {
@ -100,7 +111,6 @@
} }
&-smallvideo { &-smallvideo {
width: 20%;
overflow-y: auto; overflow-y: auto;
&-box { &-box {
@ -117,10 +127,17 @@
box-sizing: border-box; box-sizing: border-box;
&-avatar { &-avatar {
border: 1px solid #7B96FF;
position: absolute; position: absolute;
left: 50%; left: 4rpx;
top: 50%; top: 2rpx;
transform: translate(-50%, -50%) scale(0.4); width: calc(100% - 8rpx);
height: calc(100% - 4rpx);
z-index: 2;
background-color: black;
display: flex;
align-items: center;
justify-content: center;
} }
&-canvas { &-canvas {
@ -175,16 +192,16 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
padding: 4rpx 0; padding: 4rpx 0;
width: 70rpx; width: 60rpx;
box-sizing: border-box; box-sizing: border-box;
&-image { &-image {
width: 32rpx; width: 22rpx;
height: 32rpx; height: 22rpx;
} }
&-text { &-text {
font-size: 12rpx; font-size: 10rpx;
color: white; color: white;
} }
} }
@ -202,15 +219,26 @@
width: 30vw; width: 30vw;
height: 100vh; height: 100vh;
background-color: #16191E; background-color: #16191E;
padding: 10rpx; padding: 10rpx 0;
box-sizing: border-box; box-sizing: border-box;
overflow-y: auto; display: flex;
flex-direction: column;
&-title {
color: white;
text-align: center;
font-size: 16rpx;
flex-shrink: 0;
border-bottom: 1px rgb(59, 59, 59) solid;
padding-bottom: 10rpx;
}
&-view { &-view {
overflow-y: auto;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 4rpx 0; padding: 4rpx 10rpx;
&-avatar { &-avatar {
display: flex; display: flex;
@ -246,19 +274,43 @@
width: 40vw; width: 40vw;
height: 100vh; height: 100vh;
background-color: #16191E; background-color: #16191E;
padding: 10rpx; padding: 10rpx 0;
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
&-title {
color: white;
text-align: center;
border-bottom: 1px rgb(59, 59, 59) solid;
padding-bottom: 10rpx;
font-size: 16rpx;
}
&-list { &-list {
flex-grow: 1; flex-grow: 1;
overflow-y: auto; overflow-y: auto;
padding: 0 10rpx;
&-view { &-view {
color: white; color: white;
font-size: 14rpx; font-size: 14rpx;
margin-bottom: 4rpx; margin-bottom: 6rpx;
}
}
&-button {
padding: 0 10rpx;
display: flex;
flex-wrap: wrap;
&-view {
margin: 0 0 4rpx 4rpx;
color: white;
font-size: 12rpx;
background-color: #5575F2;
padding: 4rpx 8rpx;
border-radius: 4rpx;
} }
} }
@ -266,7 +318,8 @@
flex-shrink: 0; flex-shrink: 0;
display: flex; display: flex;
align-items: center; align-items: center;
margin-top: 10rpx; padding: 10rpx 10rpx 0;
border-top: 1px rgb(59, 59, 59) solid;
&-text { &-text {
flex-grow: 1; flex-grow: 1;

View File

@ -3,6 +3,7 @@ import { agora } from '../../utils/agora'
import { onInvoke, onSignalr } from '../../utils/singlr' import { onInvoke, onSignalr } from '../../utils/singlr'
import { role, getStorage } from '../../utils/utils' import { role, getStorage } from '../../utils/utils'
import { Message } from 'tdesign-miniprogram'; import { Message } from 'tdesign-miniprogram';
import dayjs from 'dayjs';
const computedBehavior = require('miniprogram-computed').behavior; const computedBehavior = require('miniprogram-computed').behavior;
Page({ Page({
behaviors: [computedBehavior], behaviors: [computedBehavior],
@ -14,6 +15,7 @@ Page({
active: true, active: true,
icon: '/assets/icon1.png', icon: '/assets/icon1.png',
iconActive: '/assets/icon1-active.png', iconActive: '/assets/icon1-active.png',
show: false,
}, },
{ {
title: '静音', title: '静音',
@ -21,6 +23,7 @@ Page({
active: false, active: false,
icon: '/assets/icon2.png', icon: '/assets/icon2.png',
iconActive: '/assets/icon2-active.png', iconActive: '/assets/icon2-active.png',
show: true,
}, },
{ {
title: '关闭视频', title: '关闭视频',
@ -28,6 +31,7 @@ Page({
active: false, active: false,
icon: '/assets/icon3.png', icon: '/assets/icon3.png',
iconActive: '/assets/icon3-active.png', iconActive: '/assets/icon3-active.png',
show: true,
}, },
{ {
title: '翻转', title: '翻转',
@ -35,6 +39,7 @@ Page({
active: true, active: true,
icon: '/assets/icon4.png', icon: '/assets/icon4.png',
iconActive: '/assets/icon4.png', iconActive: '/assets/icon4.png',
show: false,
}, },
{ {
title: '聊天', title: '聊天',
@ -42,6 +47,7 @@ Page({
active: true, active: true,
icon: '/assets/icon5.png', icon: '/assets/icon5.png',
iconActive: '/assets/icon5.png', iconActive: '/assets/icon5.png',
show: true,
}, },
{ {
title: '成员', title: '成员',
@ -49,6 +55,7 @@ Page({
active: true, active: true,
icon: '/assets/icon6.png', icon: '/assets/icon6.png',
iconActive: '/assets/icon6.png', iconActive: '/assets/icon6.png',
show: true,
}, },
{ {
title: '申请发言', title: '申请发言',
@ -56,6 +63,7 @@ Page({
active: true, active: true,
icon: '/assets/icon7.png', icon: '/assets/icon7.png',
iconActive: '/assets/icon7-active.png', iconActive: '/assets/icon7-active.png',
show: true,
}, },
], ],
channelId: '', channelId: '',
@ -68,13 +76,20 @@ Page({
userNumer: 0, userNumer: 0,
noViewChatList: 0, noViewChatList: 0,
applySpeakDialog: false, applySpeakDialog: false,
leaveDialog: false,
userPopupVisible: false, userPopupVisible: false,
chatPopupVisible: false, chatPopupVisible: false,
devicePosition: true, isFullscreen: false,
muted: false, muted: false,
currentRequestSpeakType: '', currentRequestSpeakType: '',
user: '', user: '',
messageStr: '' messageStr: '',
commonlyChatList: [
'能听到我说话吗?',
'听得到',
'听不到',
'我要发言',
]
}, },
watch: { watch: {
'roomUserList.**': function (roomUserList) { 'roomUserList.**': function (roomUserList) {
@ -83,6 +98,13 @@ Page({
userNumer: roomUserList.filter((item: any) => item.isRoom).length, userNumer: roomUserList.filter((item: any) => item.isRoom).length,
}) })
}, },
'footerList.**': function (footerList) {
const footerListTemplate = [...footerList];
footerListTemplate[3].show = !footerListTemplate[6].active
this.setData({
footerList: footerListTemplate
})
},
'isClicked': function (isClicked) { 'isClicked': function (isClicked) {
if (isClicked) { if (isClicked) {
let timer = setTimeout(() => { let timer = setTimeout(() => {
@ -99,6 +121,8 @@ Page({
channelId: option.roomNum, channelId: option.roomNum,
user: await getStorage('user') user: await getStorage('user')
}) })
},
async onReady() {
await this.joinChannel() await this.joinChannel()
await this.getRoomUser() await this.getRoomUser()
await this.getShowUser() await this.getShowUser()
@ -117,6 +141,7 @@ Page({
noViewChatList: this.data.noViewChatList += 1 noViewChatList: this.data.noViewChatList += 1
}) })
} }
item.timestamp = dayjs(item.timestamp).format('HH:mm:ss')
this.setData({ this.setData({
chatList: [...this.data.chatList, item] chatList: [...this.data.chatList, item]
}) })
@ -128,12 +153,12 @@ Page({
// 全员离开房间 // 全员离开房间
case 'AllLeave': case 'AllLeave':
this.message('管理员已结束会议!').success() this.message('管理员已结束会议!').success()
this.back() wx.navigateBack()
break; break;
// 移出会议 // 移出会议
case 'ForceExitRoom': case 'ForceExitRoom':
this.message('管理员已将你移出会议!').success() this.message('管理员已将你移出会议!').success()
this.back() wx.navigateBack()
break; break;
// 更新视图模式 // 更新视图模式
case 'RefreshView': case 'RefreshView':
@ -498,9 +523,6 @@ Page({
case '翻转': case '翻转':
await this.getUserRoomInfo().then(async (res) => { await this.getUserRoomInfo().then(async (res) => {
if (res) { if (res) {
this.setData({
devicePosition: !this.data.devicePosition
})
wx.createLivePusherContext().switchCamera() wx.createLivePusherContext().switchCamera()
} else { } else {
this.message('暂无权限').error(); this.message('暂无权限').error();
@ -552,13 +574,13 @@ Page({
this.message('操作成功').success() this.message('操作成功').success()
} }
}, },
closeDialog(e) { async closeDialog(e) {
const { type } = e.currentTarget.dataset; const { type } = e.currentTarget.dataset;
switch (e.type) { switch (e.type) {
case "confirm": case "confirm":
switch (type) { switch (type) {
case "applySpeakDialog": case "applySpeakDialog":
GetApplySpeak(this.data.channelId).then(res => { await GetApplySpeak(this.data.channelId).then(res => {
if (res.code === 200) { if (res.code === 200) {
this.setData({ this.setData({
isClicked: true, isClicked: true,
@ -568,6 +590,9 @@ Page({
} }
}) })
break; break;
case "leaveDialog":
wx.navigateBack()
break;
} }
break; break;
case "cancel": case "cancel":
@ -639,8 +664,10 @@ Page({
} }
}); });
}, },
back() { async back() {
wx.navigateBack() this.setData({
leaveDialog: true
})
}, },
onVisibleChange() { onVisibleChange() {
this.setData({ this.setData({
@ -653,18 +680,28 @@ Page({
messageStr: e.detail.value messageStr: e.detail.value
}) })
}, },
async sendMeg() { async sendMeg(e) {
await onInvoke('sendChannelMsg', { if (this.data.messageStr || e.target.dataset.item) {
roomNum: this.data.channelId, await onInvoke('sendChannelMsg', {
msg: this.data.messageStr roomNum: this.data.channelId,
}) msg: e.target.dataset.item || this.data.messageStr
})
this.setData({
chatList: [...this.data.chatList, {
userName: this.data.user.userName,
message: e.target.dataset.item || this.data.messageStr,
timestamp: dayjs(+new Date()).format('HH:mm:ss'),
me: true
}],
messageStr: ''
})
} else {
this.message('请输入文字!').error()
}
},
changeFullscreen() {
this.setData({ this.setData({
chatList: [...this.data.chatList, { isFullscreen: !this.data.isFullscreen
userName: this.data.user.userName,
message: this.data.messageStr,
me: true
}],
messageStr: ''
}) })
} }
}) })

View File

@ -1,18 +1,22 @@
<!--pages/meeting/index.wxml--> <!--pages/meeting/index.wxml-->
<view class="meeting"> <view class="meeting">
<header-tab title='会议' backGround='rgb(35,36,38)' iconSize='24' color="white" titleStyle='padding:12rpx 0;' isStatusBarHeight="{{false}}"></header-tab> <header-tab title='会议' backGround='rgb(35,36,38)' iconSize='24' color="white" titleStyle='padding:12rpx 0;' isStatusBarHeight="{{false}}" isBack='{{false}}'></header-tab>
<view class="meeting-content"> <view class="meeting-content">
<view class="meeting-content-noAdmin" wx:if="{{isAdmin === 0}}"> <view class="meeting-content-noAdmin" wx:if="{{isAdmin === 0}}">
<image class="meeting-content-noAdmin-image" src="/assets/icon8.png" /> <image class="meeting-content-noAdmin-image" src="/assets/icon8.png" />
</view> </view>
<view class="meeting-content-video"> <view class="meeting-content-video">
<view class="meeting-content-video-avatar"> <view class="meeting-content-video-avatar" wx:if="{{!currentUser.enableCamera && !currentUser.shareSrc}}">
<t-avatar size="small">{{currentUser.avatarName}}</t-avatar> <t-avatar size="small">{{currentUser.avatarName}}</t-avatar>
</view> </view>
<view class="meeting-content-video-fullscreen" bind:tap="changeFullscreen">
<t-icon name="fullscreen-exit" size="24rpx" data-name="fullscreen-exit" wx:if="{{isFullscreen}}" />
<t-icon name="fullscreen-2" size="24rpx" data-name="fullscreen-2" wx:else />
</view>
<view class="meeting-content-video-canvas" wx:if="{{currentUser.shareSrc}}"> <view class="meeting-content-video-canvas" wx:if="{{currentUser.shareSrc}}">
<live-player id="player" src="{{currentUser.shareSrc}}" mode="RTC" autoplay="true" bindstatechange="playerStateChange" object-fit="contain" muted="{{muted}}" /> <live-player id="player" src="{{currentUser.shareSrc}}" mode="RTC" autoplay="true" bindstatechange="playerStateChange" object-fit="contain" muted="{{muted}}" />
</view> </view>
<view class="meeting-content-video-canvas" wx:elif="{{currentUser.enableCamera && currentUser.src}}"> <view class="meeting-content-video-canvas" wx:elif="{{currentUser.src}}">
<live-player id="player" src="{{currentUser.src}}" mode="RTC" autoplay="true" bindstatechange="playerStateChange" object-fit="fillCrop" muted="{{muted}}" /> <live-player id="player" src="{{currentUser.src}}" mode="RTC" autoplay="true" bindstatechange="playerStateChange" object-fit="fillCrop" muted="{{muted}}" />
</view> </view>
<view class="meeting-content-video-user"> <view class="meeting-content-video-user">
@ -23,14 +27,16 @@
<text class="meeting-content-video-user-text">{{currentUser.userName}}</text> <text class="meeting-content-video-user-text">{{currentUser.userName}}</text>
</view> </view>
</view> </view>
<view class="meeting-content-smallvideo"> <view class="meeting-content-smallvideo" style="width: {{isFullscreen ? '0' :'20%'}}">
<view class="meeting-content-smallvideo-box" wx:for="{{roomUserList}}" data-item="{{item}}" wx:key="index" bind:tap="clickChangeVideo" wx:if="{{item.isRoom && item.isAdmin}}"> <view class="meeting-content-smallvideo-box" id="video-{{item.uid}}" wx:for="{{roomUserList}}" data-item="{{item}}" wx:key="index" bind:tap="clickChangeVideo" wx:if="{{item.isRoom && item.isAdmin}}">
<view class="meeting-content-smallvideo-box-view {{item.uid == currentUid || item.screenShareId == currentUid ? 'active' : ''}}"> <view class="meeting-content-smallvideo-box-view {{item.uid == currentUid || item.screenShareId == currentUid ? 'active' : ''}}">
<view class="meeting-content-smallvideo-box-view-avatar"> <view class="meeting-content-smallvideo-box-view-avatar {{item.uid == currentUid || item.screenShareId == currentUid ? 'active' : ''}}" wx:if="{{!item.enableCamera}}">
<t-avatar size="small">{{item.avatarName}}</t-avatar> <view style="transform:scale(0.4);">
<t-avatar size="small">{{item.avatarName}}</t-avatar>
</view>
</view> </view>
<view class="meeting-content-smallvideo-box-view-canvas" wx:if="{{item.enableCamera && item.src}}"> <view class="meeting-content-smallvideo-box-view-canvas" wx:if="{{item.src}}">
<live-pusher wx:if="{{user.uid === item.uid}}" url="{{item.src}}" mode="RTC" bindstatechange="recorderStateChange" background-mute enable-mic enable-camera max-bitrate="500" min-bitrate="200" autopush device-position="front" class="meeting-content-smallvideo-box-view-canvas-play" /> <live-pusher wx:if="{{user.uid === item.uid}}" url="{{item.src}}" mode="RTC" bindstatechange="recorderStateChange" background-mute enable-mic enable-camera max-bitrate="500" min-bitrate="200" autopush enable-agc enable-ans device-position="front" class="meeting-content-smallvideo-box-view-canvas-play" />
<live-player src="{{item.src}}" class="meeting-content-smallvideo-box-view-canvas-play" mode="RTC" autoplay="true" bindstatechange="playerStateChange" object-fit="fillCrop" muted="{{muted}}" wx:else /> <live-player src="{{item.src}}" class="meeting-content-smallvideo-box-view-canvas-play" mode="RTC" autoplay="true" bindstatechange="playerStateChange" object-fit="fillCrop" muted="{{muted}}" wx:else />
</view> </view>
<view class="meeting-content-smallvideo-box-view-user"> <view class="meeting-content-smallvideo-box-view-user">
@ -47,12 +53,12 @@
</view> </view>
</view> </view>
</view> </view>
<view class="meeting-footer"> <view class="meeting-footer" wx:if="{{!isFullscreen}}">
<view class="meeting-footer-left"> <view class="meeting-footer-left">
<view class="meeting-footer-left-view" wx:for="{{footerList}}" wx:for-index="index" wx:for-item="item" wx:key="index" bind:tap="changeFooterList" data-index='{{index}}'> <view class="meeting-footer-left-view" wx:for="{{footerList}}" wx:for-index="index" wx:for-item="item" wx:key="index" bind:tap="changeFooterList" data-index='{{index}}' wx:if="{{item.show}}">
<image class="meeting-footer-left-view-image" src="{{item.active ? item.icon : item.iconActive}}" /> <image class="meeting-footer-left-view-image" src="{{item.active ? item.icon : item.iconActive}}" />
<text class="meeting-footer-left-view-text" wx:if="{{item.title === '成员'}}">{{item.title}}({{userNumer}}) </text> <text class="meeting-footer-left-view-text" wx:if="{{item.title === '成员'}}">{{item.title}}({{userNumer}}) </text>
<text class="meeting-footer-left-view-text" wx:elif="{{item.title === '翻转'}}">{{item.title}}({{devicePosition ? '前置' : '后置'}}) </text> <text class="meeting-footer-left-view-text" wx:elif="{{item.title === '翻转'}}">{{item.title}}</text>
<text class="meeting-footer-left-view-text" wx:elif="{{item.title === '聊天'}}">{{item.title}}{{noViewChatList ? '('+noViewChatList+')' : '' }} <text class="meeting-footer-left-view-text" wx:elif="{{item.title === '聊天'}}">{{item.title}}{{noViewChatList ? '('+noViewChatList+')' : '' }}
</text> </text>
<text class="meeting-footer-left-view-text" wx:else>{{item.active ? item.title : item.titleActive}}</text> <text class="meeting-footer-left-view-text" wx:else>{{item.active ? item.title : item.titleActive}}</text>
@ -65,31 +71,45 @@
</view> </view>
<t-message id="t-message" /> <t-message id="t-message" />
<t-dialog visible="{{applySpeakDialog}}" content="该操作需向管理员申请发言权限" confirm-btn="{{ { content: '确定', variant: 'base', theme: 'primary' } }}" cancel-btn="取消" data-type="applySpeakDialog" bind:confirm="closeDialog" bind:cancel="closeDialog" style="transform: scale(0.5) translate3d(-50%, -50%, 0);" close-btn="{{false}}" /> <t-dialog visible="{{applySpeakDialog}}" content="该操作需向管理员申请发言权限" confirm-btn="{{ { content: '确定', variant: 'base', theme: 'primary' } }}" cancel-btn="取消" data-type="applySpeakDialog" bind:confirm="closeDialog" bind:cancel="closeDialog" style="transform: scale(0.5) translate3d(-50%, -50%, 0);" close-btn="{{false}}" />
<t-dialog visible="{{leaveDialog}}" content="确定离开房间吗?" confirm-btn="{{ { content: '确定', variant: 'base', theme: 'primary' } }}" cancel-btn="取消" data-type="leaveDialog" bind:confirm="closeDialog" bind:cancel="closeDialog" style="transform: scale(0.5) translate3d(-50%, -50%, 0);" close-btn="{{false}}" />
<t-popup visible="{{userPopupVisible}}" bind:visible-change="onVisibleChange" placement="right" prevent-scroll-through='{{false}}'> <t-popup visible="{{userPopupVisible}}" bind:visible-change="onVisibleChange" placement="right" prevent-scroll-through='{{false}}'>
<view class="user-popup"> <view class="user-popup">
<view class="user-popup-title">
聊天
</view>
<view class="user-popup-view" wx:for="{{roomUserList}}" data-item="{{item}}" wx:key="index" wx:if="{{item.isRoom}}"> <view class="user-popup-view" wx:for="{{roomUserList}}" data-item="{{item}}" wx:key="index" wx:if="{{item.isRoom}}">
<view class="user-popup-view-avatar"> <view class="user-popup-view-avatar">
<t-avatar size="36rpx">{{item.avatarName}}</t-avatar> <t-avatar size="36rpx">{{item.avatarName}}</t-avatar>
<text class="user-popup-view-avatar-text">{{item.userName}}</text> <text class="user-popup-view-avatar-text">{{item.userName}}</text>
</view> </view>
<view class="user-popup-view-image"> <view class="user-popup-view-image">
<image src="/assets/{{currentUser.enableMicr ? 'icon2' : 'icon2-active'}}.png" class="user-popup-view-image-icon" /> <image src="/assets/{{item.enableMicr ? 'icon2' : 'icon2-active'}}.png" class="user-popup-view-image-icon" />
<image src="/assets/{{currentUser.enableCamera ? 'icon3' : 'icon3-active'}}.png" class="user-popup-view-image-icon" /> <image src="/assets/{{item.enableCamera ? 'icon3' : 'icon3-active'}}.png" class="user-popup-view-image-icon" />
</view> </view>
</view> </view>
</view> </view>
</t-popup> </t-popup>
<t-popup visible="{{chatPopupVisible}}" bind:visible-change="onVisibleChange" placement="right" prevent-scroll-through='{{false}}'> <t-popup visible="{{chatPopupVisible}}" bind:visible-change="onVisibleChange" placement="right" prevent-scroll-through='{{false}}'>
<view class="chat-popup"> <view class="chat-popup">
<view class="chat-popup-title">
聊天
</view>
<view class="chat-popup-list" id="chatView"> <view class="chat-popup-list" id="chatView">
<view class="chat-popup-list-view" wx:for="{{chatList}}" data-item="{{item}}" wx:key="index" style="text-align: {{item.me ? 'right' : 'left'}}"> <view class="chat-popup-list-view" wx:for="{{chatList}}" data-item="{{item}}" wx:key="index" style="text-align: {{item.me ? 'right' : 'left'}}">
<text class="chat-popup-list-view-text">{{item.me ? item.message : item.userName}}</text> <text style="color: #666;font-size: 10rpx;margin-right: 4rpx;" wx:if="{{item.me}}">({{item.timestamp}})</text>
<text class="chat-popup-list-view-text"></text> <text>{{item.me ? item.message : item.userName}}</text>
<text class="chat-popup-list-view-text">{{item.me ? item.userName : item.message}}</text> <text></text>
<text>{{item.me ? item.userName : item.message}}</text>
<text style="color: #666;font-size: 10rpx;margin-left: 4rpx;" wx:if="{{!item.me}}">({{item.timestamp}})</text>
</view>
</view>
<view class="chat-popup-button">
<view wx:for="{{commonlyChatList}}" data-item="{{item}}" wx:key="index" class="chat-popup-button-view" bind:tap="sendMeg">
{{item}}
</view> </view>
</view> </view>
<view class="chat-popup-input"> <view class="chat-popup-input">
<input type="text" placeholder="请输入文字" class="chat-popup-input-text" value="{{messageStr}}" bind:change="changeMessageStr" /> <input type="text" placeholder="请输入文字" class="chat-popup-input-text" value="{{messageStr}}" bind:input="changeMessageStr" />
<view class="chat-popup-input-submit" bind:tap="sendMeg">发送</view> <view class="chat-popup-input-submit" bind:tap="sendMeg">发送</view>
</view> </view>
</view> </view>

View File

@ -4,5 +4,6 @@
"setting": { "setting": {
"compileHotReLoad": true, "compileHotReLoad": true,
"urlCheck": true "urlCheck": true
} },
"libVersion": "3.6.5"
} }

View File

@ -17,6 +17,7 @@ export const agora = {
// 销毁 // 销毁
destroy: async () => { destroy: async () => {
if (client) { if (client) {
await client.leave()
await client.destroy() await client.destroy()
client = ''; client = '';
} }
@ -46,6 +47,7 @@ export const agora = {
agora.setRole(false) agora.setRole(false)
}) })
}, },
// 监听
clientEvent: ({ streamAdded, streamRemoved }) => { clientEvent: ({ streamAdded, streamRemoved }) => {
client.on("stream-added", async e => { client.on("stream-added", async e => {
await agora.subscribe(e.uid, (url: string, uid: number | string) => { await agora.subscribe(e.uid, (url: string, uid: number | string) => {
@ -56,14 +58,17 @@ export const agora = {
streamRemoved(e.uid) streamRemoved(e.uid)
}); });
}, },
// 订阅远端音视频流
subscribe: async (uid: number | string, callBack: Function) => { subscribe: async (uid: number | string, callBack: Function) => {
const { url, rotation } = await client.subscribe(uid) const { url, rotation } = await client.subscribe(uid)
callBack(url, uid) callBack(url, uid)
}, },
// 停止发送本地音视频流
muteLocal: async (target: string) => { muteLocal: async (target: string) => {
client.muteLocal(target) await client.muteLocal(target)
}, },
// 恢复发送本地音视频流
unmuteLocal: async (target: string) => { unmuteLocal: async (target: string) => {
client.unmuteLocal(target) await client.unmuteLocal(target)
}, },
} }