2
0
Просмотр исходного кода

✨ feat(classroom): 实现老师端课堂学生列表加载功能

- 添加老师角色进入课堂时获取现有群组成员的功能
- 解析用户扩展信息获取学生昵称,优化学生列表显示
- 添加加载成功提示和错误处理机制

♻️ refactor(classroom): 优化群组管理器代码结构

- 统一使用gm变量代替groupManager提高代码一致性
- 简化课堂创建流程中的变量引用和错误处理
- 整合群组事件监听逻辑,提高代码可读性
yourname 6 месяцев назад
Родитель
Сommit
84031f6f16
1 измененных файлов с 55 добавлено и 27 удалено
  1. 55 27
      src/client/mobile/components/Classroom/useClassroom.ts

+ 55 - 27
src/client/mobile/components/Classroom/useClassroom.ts

@@ -535,6 +535,37 @@ export const useClassroom = ({ user }:{ user : User }) => {
       listenGroupEvents();
       listenMessageEvents();
 
+      // 只有老师角色需要获取现有的群组成员列表
+      if (role === Role.Teacher) {
+        try {
+          const membersResponse = await gm!.listRecentGroupUser(classId);
+          if (membersResponse && membersResponse.userList) {
+            const existingMembers = membersResponse.userList
+              .filter(member => member.userId !== userId) // 排除老师自己
+              .map(member => {
+                try {
+                  const userExtension = member.userExtension ? JSON.parse(member.userExtension) : {};
+                  return {
+                    id: member.userId,
+                    name: userExtension.nickname || userExtension.username || member.userId
+                  };
+                } catch {
+                  return {
+                    id: member.userId,
+                    name: member.userId
+                  };
+                }
+              });
+            
+            setStudents(existingMembers);
+            showMessage(`已加载 ${existingMembers.length} 名现有学生`);
+          }
+        } catch (err) {
+          console.error('获取群组成员失败:', err);
+          showMessage('获取现有学生列表失败,将只显示新加入的学生');
+        }
+      }
+
       await joinRtcChannel(classId);
 
       buildShareLink(classId)
@@ -674,14 +705,14 @@ export const useClassroom = ({ user }:{ user : User }) => {
     }
     
     try {
-      const groupManager = imEngine.current.getGroupManager();
-      if (!groupManager) {
+      const gm = imEngine.current.getGroupManager();
+      if (!gm) {
         throw new Error('群组管理器未初始化');
       }
 
       showToast('info', '正在创建课堂...');
       
-      const response = await groupManager.createGroup({
+      const response = await gm.createGroup({
         groupName: className,
         groupMeta: JSON.stringify({
           classType: 'interactive',
@@ -695,31 +726,28 @@ export const useClassroom = ({ user }:{ user : User }) => {
         throw new Error('创建群组失败: 未返回群组ID');
       }
 
-      try {
-        await groupManager.joinGroup(response.groupId);
-        
-        showToast('success', '课堂创建并加入成功');
-        showMessage(`课堂 ${className} 创建成功,ID: ${response.groupId}`);
-        
-        setClassId(response.groupId);
-        setIsJoinedClass(true);
-        
-        const messageManager = imEngine.current.getMessageManager();
-        if (messageManager) {
-          imMessageManager.current = messageManager;
-          listenMessageEvents();
-        }
-        
-        await joinRtcChannel(response.groupId);
-        
-        // const baseUrl = window.location.href.split('?')[0].replace(/\/[^/]*$/, '');
-        // setShareLink(`${baseUrl}/mobile/classroom/${response.groupId}/student`);
-        buildShareLink(response.groupId)
-        
-        return response.groupId;
-      } catch (joinErr: any) {
-        throw new Error(`创建成功但加入失败: ${joinErr.message}`);
+      const mm = imEngine.current.getMessageManager();
+      
+      await gm.joinGroup(response.groupId);
+      
+      showToast('success', '课堂创建并加入成功');
+      showMessage(`课堂 ${className} 创建成功,ID: ${response.groupId}`);
+      
+      setClassId(response.groupId);
+      setIsJoinedClass(true);
+      
+      imGroupManager.current = gm;
+      listenGroupEvents();
+      
+      if (mm) {
+        imMessageManager.current = mm;
+        listenMessageEvents();
       }
+      
+      await joinRtcChannel(response.groupId);
+      buildShareLink(response.groupId);
+      
+      return response.groupId;
     } catch (err: any) {
       const errorMsg = err.message.includes('alreadyExist')
         ? '课堂已存在'