perf: 优化打开会议

This commit is contained in:
kuaifan 2024-11-10 09:29:16 +08:00
parent d5bc7d4051
commit c6c735bbe8
8 changed files with 224 additions and 123 deletions

View File

@ -1175,6 +1175,7 @@ class UsersController extends AbstractController
* @apiParam {String} [name] 会话ID * @apiParam {String} [name] 会话ID
* @apiParam {String} [sharekey] 分享的key * @apiParam {String} [sharekey] 分享的key
* @apiParam {String} [username] 用户名称 * @apiParam {String} [username] 用户名称
* @apiParam {String} [userimg] 用户头像
* @apiParam {Array} [userids] 邀请成员 * @apiParam {Array} [userids] 邀请成员
* *
* @apiSuccess {Number} ret 返回状态码1正确、0错误 * @apiSuccess {Number} ret 返回状态码1正确、0错误
@ -1189,6 +1190,7 @@ class UsersController extends AbstractController
$userids = Request::input('userids'); $userids = Request::input('userids');
$sharekey = trim(Request::input('sharekey')); $sharekey = trim(Request::input('sharekey'));
$username = trim(Request::input('username')); $username = trim(Request::input('username'));
$userimg = trim(Request::input('userimg')) ?: Base::fillUrl('avatar/' . $username . '.png');
$user = null; $user = null;
if (!empty($sharekey) && $type === 'join') { if (!empty($sharekey) && $type === 'join') {
if (!Meeting::getShareInfo($sharekey)) { if (!Meeting::getShareInfo($sharekey)) {
@ -1266,7 +1268,7 @@ class UsersController extends AbstractController
// //
$data['appid'] = $meetingSetting['appid']; $data['appid'] = $meetingSetting['appid'];
$data['uid'] = $uid; $data['uid'] = $uid;
$data['userimg'] = $sharekey ? Base::fillUrl('avatar/' . $username . '.png') : $user?->userimg; $data['userimg'] = $sharekey ? $userimg : $user?->userimg;
$data['nickname'] = $sharekey ? $username : $user?->nickname; $data['nickname'] = $sharekey ? $username : $user?->nickname;
$data['token'] = $token; $data['token'] = $token;
$data['msgs'] = $msgs; $data['msgs'] = $msgs;

View File

@ -7,6 +7,9 @@
<!--任务操作--> <!--任务操作-->
<TaskOperation/> <TaskOperation/>
<!--会议管理-->
<MeetingManager/>
<!--下拉菜单--> <!--下拉菜单-->
<DropdownMenu/> <DropdownMenu/>
@ -43,11 +46,13 @@ import PreviewImageState from "./components/PreviewImage/state";
import NetworkException from "./components/NetworkException"; import NetworkException from "./components/NetworkException";
import GuidePage from "./components/GuidePage"; import GuidePage from "./components/GuidePage";
import TaskOperation from "./pages/manage/components/TaskOperation"; import TaskOperation from "./pages/manage/components/TaskOperation";
import MeetingManager from "./pages/manage/components/MeetingManager";
import DropdownMenu from "./components/DropdownMenu"; import DropdownMenu from "./components/DropdownMenu";
import {mapState} from "vuex"; import {mapState} from "vuex";
export default { export default {
components: { components: {
MeetingManager,
DropdownMenu, DropdownMenu,
TaskOperation, TaskOperation,
NetworkException, NetworkException,

View File

@ -326,9 +326,6 @@
<ProjectArchived v-if="archivedProjectShow"/> <ProjectArchived v-if="archivedProjectShow"/>
</DrawerOverlay> </DrawerOverlay>
<!--会议管理-->
<MeetingManager/>
<!--移动端选项卡--> <!--移动端选项卡-->
<transition name="mobile-slide"> <transition name="mobile-slide">
<MobileTabbar v-if="showMobileTabbar" @on-click="onTabbarClick"/> <MobileTabbar v-if="showMobileTabbar" @on-click="onTabbarClick"/>
@ -357,7 +354,6 @@ import TaskAdd from "./manage/components/TaskAdd";
import Report from "./manage/components/Report"; import Report from "./manage/components/Report";
import MobileBack from "../components/Mobile/Back"; import MobileBack from "../components/Mobile/Back";
import MobileNotification from "../components/Mobile/Notification"; import MobileNotification from "../components/Mobile/Notification";
import MeetingManager from "./manage/components/MeetingManager";
import longpress from "../directives/longpress"; import longpress from "../directives/longpress";
import DialogModal from "./manage/components/DialogModal"; import DialogModal from "./manage/components/DialogModal";
import TaskModal from "./manage/components/TaskModal"; import TaskModal from "./manage/components/TaskModal";
@ -366,12 +362,11 @@ import TaskExport from "./manage/components/TaskExport";
import ApproveExport from "./manage/components/ApproveExport"; import ApproveExport from "./manage/components/ApproveExport";
import ComplaintManagement from "./manage/components/ComplaintManagement"; import ComplaintManagement from "./manage/components/ComplaintManagement";
import MicroApps from "../components/MicroApps.vue"; import MicroApps from "../components/MicroApps.vue";
import notificationKoro from "notification-koro1";
import {Store} from "le5le-store";
import {MarkdownPreview} from "../store/markdown";
import UserSelect from "../components/UserSelect.vue"; import UserSelect from "../components/UserSelect.vue";
import ImgUpload from "../components/ImgUpload.vue"; import ImgUpload from "../components/ImgUpload.vue";
import ApproveDetails from "./manage/approve/details.vue"; import ApproveDetails from "./manage/approve/details.vue";
import notificationKoro from "notification-koro1";
import {Store} from "le5le-store";
export default { export default {
components: { components: {
@ -383,7 +378,6 @@ export default {
ApproveExport, ApproveExport,
TaskModal, TaskModal,
DialogModal, DialogModal,
MeetingManager,
MobileNotification, MobileNotification,
MobileBack, MobileBack,
MobileTabbar, MobileTabbar,

View File

@ -179,7 +179,7 @@ export default {
}, },
computed: { computed: {
...mapState(['meetingWindow', 'formOptions']), ...mapState(['meetingWindow', 'formOptions', 'userToken']),
}, },
mounted() { mounted() {
@ -200,31 +200,54 @@ export default {
} }
}, },
meetingWindow: { meetingWindow: {
handler(val) { handler(data) {
switch (val.type) { switch (data.type) {
//
case 'add': case 'add':
this.addShow = val.show; this.addShow = data.show;
this.loadIng = 0; this.loadIng = 0;
break; break;
//
case 'join': case 'join':
this.addShow = val.show; case 'direct':
this.addShow = data.show;
this.loadIng = 0; this.loadIng = 0;
this.addData.type = 'join'; this.addData.type = 'join';
if(val.meetingSharekey){ if (data.meetingNickname) {
this.addData.sharekey = val.meetingSharekey; this.addData.username = data.meetingNickname;
this.addData.meetingid = val.meetingid || ''; }
this.addData.meetingdisabled = val.meetingSharekey ? true : false; if (data.meetingAvatar) {
this.addData.userimg = data.meetingAvatar;
}
if ($A.runNum(data.meetingAudio) && !this.addData.tracks.includes('audio')) {
this.addData.tracks.push('audio')
}
if ($A.runNum(data.meetingVideo) && !this.addData.tracks.includes('video')) {
this.addData.tracks.push('video')
}
if (data.meetingSharekey) {
this.addData.sharekey = data.meetingSharekey;
this.addData.meetingid = data.meetingid || '';
this.addData.meetingdisabled = !!data.meetingSharekey;
}
if (data.type === 'direct') {
this.onOpen(true);
} }
break; break;
//
case 'invitation': case 'invitation':
this.invitationShow = val.show; this.invitationShow = data.show;
this.invitationLoad = false; this.invitationLoad = false;
this.invitationData.meetingid = val.meetingid; this.invitationData.meetingid = data.meetingid;
break; break;
//
case 'error': case 'error':
this.addShow = val.show; this.addShow = data.show;
this.loadIng = 0; this.loadIng = 0;
this.invitationShow = val.show; this.invitationShow = data.show;
this.invitationLoad = false; this.invitationLoad = false;
$A.modalError('加入会议失败'); $A.modalError('加入会议失败');
break; break;
@ -254,8 +277,9 @@ export default {
} }
// //
if (!$A.isArray(data.userids)) { if (!$A.isArray(data.userids)) {
data.userids = [this.userId] data.userids = []
} else if (!data.userids.includes(this.userId)) { }
if (this.userId && !data.userids.includes(this.userId)) {
data.userids.push(this.userId) data.userids.push(this.userId)
} }
// //
@ -269,13 +293,34 @@ export default {
}, },
onSubmit() { onSubmit() {
this.$refs.addForm.validate((valid) => {
if (valid) {
this.onOpen()
}
});
},
onOpen(isDirect = false) {
if (this.meetingShow) { if (this.meetingShow) {
$A.modalWarning("正在会议中,无法进入其他会议室"); $A.modalWarning("正在会议中,无法进入其他会议室");
return; return;
} }
this.$refs.addForm.validate((valid) => { const loader = (add) => {
if (valid) { if (isDirect) {
if (add) {
this.$store.dispatch('showSpinner');
} else {
this.$store.dispatch('hiddenSpinner', 600);
}
} else {
if (add) {
this.loadIng++; this.loadIng++;
} else {
this.loadIng--;
}
}
}
loader(true);
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'users/meeting/open', url: 'users/meeting/open',
data: this.addData data: this.addData
@ -288,7 +333,7 @@ export default {
this.$store.dispatch("updateDialogLastMsg", data.msgs); this.$store.dispatch("updateDialogLastMsg", data.msgs);
delete data.name; delete data.name;
delete data.msgs; delete data.msgs;
// // App 使
if ($A.isEEUiApp) { if ($A.isEEUiApp) {
$A.eeuiAppSendMessage({ $A.eeuiAppSendMessage({
action: 'startMeeting', action: 'startMeeting',
@ -312,21 +357,61 @@ export default {
} }
} }
}); });
} else { return
}
// 使
if ($A.Electron && !this.addData.sharekey) {
loader(true);
this.$store.dispatch("call", {
url: 'users/meeting/link',
data: {
meetingid: data.meetingid,
},
}).then(linkRes => {
// 使
const config = {
title: this.addData.name,
titleFixed: true,
parent: null,
width: Math.min(window.screen.availWidth, 1440),
height: Math.min(window.screen.availHeight, 900),
}
const meetingPath = $A.urlAddParams(linkRes.data, {
type: 'direct',
nickname: encodeURIComponent(data.nickname),
avatar: encodeURIComponent(data.userimg),
audio: this.addData.tracks.includes("audio") ? 1 : 0,
video: this.addData.tracks.includes("video") ? 1 : 0,
token: this.userToken,
});
this.$store.dispatch('openChildWindow', {
name: `meeting-window`,
path: meetingPath,
force: false,
config
});
//
this.addShow = false;
}).catch(({ msg }) => {
$A.modalError(msg);
}).finally(_ => {
loader(false);
});
return;
}
// Web
loader(true);
$A.loadScript('js/AgoraRTC_N-4.17.0.js').then(_ => { $A.loadScript('js/AgoraRTC_N-4.17.0.js').then(_ => {
this.join(data) this.join(data)
}).catch(_ => { }).catch(_ => {
$A.modalError("会议组件加载失败!"); $A.modalError("会议组件加载失败!");
}).finally(_ => { }).finally(_ => {
this.loadIng--; loader(false);
}) })
}
}).catch(({msg}) => { }).catch(({msg}) => {
this.loadIng--;
$A.modalError(msg); $A.modalError(msg);
}); }).finally(_ => {
} loader(false);
}); });
}, },
@ -348,7 +433,7 @@ export default {
onInvitation(type) { onInvitation(type) {
if (type === 'open') { if (type === 'open') {
if(this.addData.sharekey){ if (this.addData.sharekey && !this.userId) {
this.linkCopy(); this.linkCopy();
return; return;
} }
@ -358,6 +443,10 @@ export default {
}; };
this.invitationShow = true; this.invitationShow = true;
} else if (type === 'submit') { } else if (type === 'submit') {
if (this.invitationData.userids.length === 0) {
$A.modalWarning("请选择邀请成员");
return;
}
this.invitationLoad = true; this.invitationLoad = true;
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'users/meeting/invitation', url: 'users/meeting/invitation',
@ -383,9 +472,10 @@ export default {
okText: '退出', okText: '退出',
onOk: async _ => { onOk: async _ => {
await this.leave() await this.leave()
if(this.addData.sharekey){ if ($A.isSubElectron) {
this.$Electron.sendMessage('windowDestroy');
} else if (this.addData.sharekey) {
this.addShow = true; this.addShow = true;
this.loadIng = 0;
} }
resolve() resolve()
} }
@ -393,6 +483,28 @@ export default {
}) })
}, },
linkCopy() {
this.linkCopyLoad = true;
this.$store.dispatch("call", {
url: 'users/meeting/link',
data: {
meetingid: this.addData.meetingid || this.invitationData.meetingid,
sharekey: this.addData.sharekey
},
}).then(({ data }) => {
this.copyText({
text: data,
success: '已复制会议邀请链接',
error: "复制失败"
});
this.invitationShow = false;
}).catch(({ msg }) => {
$A.modalError(msg);
}).finally(_ => {
this.linkCopyLoad = false;
});
},
async join(options) { async join(options) {
this.loadIng++; this.loadIng++;
// //
@ -451,8 +563,8 @@ export default {
console.error(error) console.error(error)
$A.modalError("会议组件加载失败!"); $A.modalError("会议组件加载失败!");
} }
this.loadIng--;
this.addShow = false; this.addShow = false;
this.loadIng--;
}, },
async leave() { async leave() {
@ -472,8 +584,8 @@ export default {
// //
await this.agoraClient.leave(); await this.agoraClient.leave();
// //
this.loadIng--;
this.meetingShow = false; this.meetingShow = false;
this.loadIng--;
}, },
async openAudio() { async openAudio() {
@ -513,6 +625,9 @@ export default {
}, },
async handleUserJoined(user) { async handleUserJoined(user) {
if (user.uid == this.localUser.uid) {
return;
}
const index = this.remoteUsers.findIndex(item => item.uid == user.uid) const index = this.remoteUsers.findIndex(item => item.uid == user.uid)
if (index > -1) { if (index > -1) {
this.remoteUsers.splice(index, 1, user) this.remoteUsers.splice(index, 1, user)
@ -541,28 +656,6 @@ export default {
await this.agoraClient.unsubscribe(user, mediaType); await this.agoraClient.unsubscribe(user, mediaType);
} }
}, },
linkCopy() {
this.linkCopyLoad = true;
this.$store.dispatch("call", {
url: 'users/meeting/link',
data: {
meetingid: this.addData.meetingid || this.invitationData.meetingid,
sharekey: this.addData.sharekey
},
}).then(({ data }) => {
this.copyText({
text: data,
success: '已复制会议邀请链接',
error: "复制失败"
});
this.invitationShow = false;
}).catch(({ msg }) => {
$A.modalError(msg);
}).finally(_ => {
this.linkCopyLoad = false;
});
},
} }
} }
</script> </script>

View File

@ -90,7 +90,7 @@ export default {
}, },
playerStyle() { playerStyle() {
const user = this.cacheUserBasic.find(({userid}) => userid == this.userid); const user = this.cacheUserBasic.find(({userid}) => userid == this.userid);
if (user) { if (user && user.userimg) {
return { return {
backgroundImage: `url("${user.userimg}")` backgroundImage: `url("${user.userimg}")`
} }

View File

@ -12,10 +12,16 @@ export default {
MeetingManager, MeetingManager,
}, },
mounted() { mounted() {
const {meetingId, sharekey} = this.$route.params;
const {nickname, avatar, audio, video, type} = this.$route.query;
this.$store.dispatch("showMeetingWindow",{ this.$store.dispatch("showMeetingWindow",{
type: "join", type: ['direct', 'join'].includes(type) ? type : 'join',
meetingid: this.$route.params.meetingId, meetingid: meetingId,
meetingSharekey: this.$route.params.sharekey, meetingSharekey: sharekey,
meetingNickname: nickname,
meetingAvatar: avatar,
meetingAudio: audio,
meetingVideo: video,
meetingdisabled: true, meetingdisabled: true,
}) })
}, },

View File

@ -3515,8 +3515,16 @@ export default {
/** /**
* 隐藏全局浮窗加载器 * 隐藏全局浮窗加载器
* @param state * @param state
* @param dispatch
* @param delay
*/ */
hiddenSpinner({state}) { hiddenSpinner({state, dispatch}, delay) {
if (typeof delay === "number") {
setTimeout(_ => {
dispatch("hiddenSpinner")
}, delay)
return
}
const item = state.floatSpinnerTimer.shift() const item = state.floatSpinnerTimer.shift()
if (item) { if (item) {
clearTimeout(item.timer) clearTimeout(item.timer)
@ -4193,19 +4201,12 @@ export default {
/** /**
* 显示会议窗口 * 显示会议窗口
* @param state * @param state
* @param type * @param data
* @param meetingid
* @param meetingdisabled
* @param meetingSharekey
*/ */
showMeetingWindow({state}, {type, meetingid, meetingdisabled, meetingSharekey}) { showMeetingWindow({state}, data) {
state.meetingWindow = { state.meetingWindow = Object.assign(data, {
show: true, show: data.type !== 'direct',
type: type, });
meetingid: meetingid,
meetingdisabled: meetingdisabled,
meetingSharekey: meetingSharekey
};
}, },
/** *****************************************************************************************/ /** *****************************************************************************************/

View File

@ -9,7 +9,7 @@ body {
> ul { > ul {
display: grid; display: grid;
justify-content: space-between; justify-content: space-between;
grid-template-columns: repeat(auto-fill, 220px); grid-template-columns: repeat(auto-fill, 210px);
grid-gap: 24px; grid-gap: 24px;
> li { > li {
list-style: none; list-style: none;
@ -17,8 +17,8 @@ body {
.meeting-player { .meeting-player {
position: relative; position: relative;
.player { .player {
width: 220px; width: 210px;
height: 220px;; height: 210px;;
border-radius: 12px; border-radius: 12px;
position: relative; position: relative;
z-index: 1; z-index: 1;