This commit is contained in:
zhutao
2025-11-21 18:21:47 +08:00
parent 9c94ee31fd
commit 5784a0a5d4
32 changed files with 734 additions and 441 deletions

View File

@@ -1,8 +1,7 @@
class RoomInfoDto {
RoomInfoDto({
required this.teacherBackground,
required this.teacherAvatar,
required this.roomName,
required this.startTime,
required this.teacherName,
@@ -11,6 +10,7 @@ class RoomInfoDto {
});
String teacherBackground;
String teacherAvatar;
String roomName;
String startTime;
String teacherName;
@@ -20,6 +20,7 @@ class RoomInfoDto {
factory RoomInfoDto.fromJson(Map<dynamic, dynamic> json) =>
RoomInfoDto(
teacherBackground: json["teacher_background"],
teacherAvatar: json["teacher_avatar"],
roomName: json["room_name"],
startTime: json["start_time"],
teacherName: json["teacher_name"],
@@ -30,6 +31,7 @@ class RoomInfoDto {
Map<dynamic, dynamic> toJson() =>
{
"teacher_background": teacherBackground,
"teacher_avatar": teacherAvatar,
"room_name": roomName,
"start_time": startTime,
"teacher_name": teacherName,

View File

@@ -1,7 +1,7 @@
class RoomTypeDto {
final int studyRoomId;
final int teacherId;
final String teacherRtcUid;
final int teacherRtcUid;
final String teacherWsClientId;
final int roomStatus;
final String dataType;
@@ -30,7 +30,7 @@ class RoomTypeDto {
return RoomTypeDto(
studyRoomId: json["study_room_id"] ?? 0,
teacherId: json["teacher_id"] ?? 0,
teacherRtcUid: json["teacher_rtc_uid"] ?? "",
teacherRtcUid: json["teacher_rtc_uid"] ?? 0,
teacherWsClientId: json["teacher_ws_client_id"] ?? "",
roomStatus: json["room_status"] ?? 0,
dataType: json["data_type"] ?? "",

View File

@@ -1,20 +1,21 @@
class RoomUserDto {
final int userId;
final String rtcUid;
final int rtcUid;
int microphoneStatus;
int cameraStatus;
int speekerStatus;
final String wsClientId;
final String userName;
final String avatar;
/// 1是学生2是老师
final int userType;
final List<String> filesList;
final String dataType;
int handup;
int handup;
int online; //0离线1在线
RoomUserDto({
RoomUserDto({
required this.userId,
required this.rtcUid,
required this.microphoneStatus,
@@ -65,4 +66,12 @@ class RoomUserDto {
"online": online,
};
}
static List<RoomUserDto> listFromJson(List<dynamic> data) =>
data.map((e) => RoomUserDto.fromJson(e)).toList();
@override
String toString() {
return 'RoomUserDto{userId: $userId, rtcUid: $rtcUid, microphoneStatus: $microphoneStatus, cameraStatus: $cameraStatus, speekerStatus: $speekerStatus, wsClientId: $wsClientId, userName: $userName, avatar: $avatar, userType: $userType, filesList: $filesList, dataType: $dataType, handup: $handup, online: $online,}';
}
}

View File

@@ -6,7 +6,7 @@ class RtcTokenDto {
required this.token,
});
String uid;
int uid;
DateTime expiresAt;
String channel;
String token;

View File

@@ -31,6 +31,7 @@ void onResponse(
error: {'code': 0, 'message': apiResponse.message},
),
);
showError(apiResponse.message);
}
}

View File

@@ -9,7 +9,7 @@ enum RoomCommand {
getRoomInfo("room_data"),
///学生开关扬声器、摄像头、麦克风
switchCamera("mute_self"),
studentActon("mute_self"),
///学生上传文件
uploadFile("upload_file"),
@@ -66,7 +66,7 @@ enum RoomEvent {
handUp("sys_user_handup"),
///自习室以开启,进入自习室(学生用)
openRoom("sys_start_study_room"),
// openRoom("sys_start_study_room"),
///自习室以关闭,退出自习室(学生用)
closeRoom("sys_close_study_room"),
@@ -94,10 +94,10 @@ enum RoomEvent {
const RoomEvent(this.value);
/// 根据 值获取枚举
static RoomEvent fromStr(String value) {
return RoomEvent.values.firstWhere(
(e) => e.value == value,
orElse: () => throw ArgumentError('Invalid weather type value: $value'),
);
static RoomEvent? fromStr(String value) {
for (final e in RoomEvent.values) {
if (e.value == value) return e;
}
return null; // 找不到就返回 null
}
}

View File

@@ -60,7 +60,15 @@ class RoomWebSocket {
(data) {
//监听事件
final jsonMap = jsonDecode(data);
RoomMessage msg = RoomMessage(RoomEvent.fromStr(jsonMap['action']), jsonMap['data']);
final event = RoomEvent.fromStr(jsonMap['action']);
if (event == null) {
print("未识别的 action: ${jsonMap['action']},消息已忽略");
return; // 直接跳过
} else {
logger.i("接收到事件: ${event.value}");
}
final msg = RoomMessage(event, jsonMap['data']);
_msgController.add(msg);
},
onDone: () {},
@@ -68,10 +76,12 @@ class RoomWebSocket {
logger.e("连接异常断开");
},
);
//自动加入房间
send(RoomCommand.joinRoom);
//心跳
_heartbeatTimer?.cancel();
_heartbeatTimer = Timer.periodic(Duration(seconds: 15), (_) {
logger.i("发送心跳");
send(RoomCommand.ping);
});
} catch (e) {
@@ -84,8 +94,12 @@ class RoomWebSocket {
void send(RoomCommand action, [Map<String, dynamic>? params]) {
final msg = {
"action": action.value,
"data": params,
if (params != null) ...params,
};
if(action != RoomCommand.ping){
logger.i("发送指令:$msg");
}
_socket!.add(jsonEncode(msg));
}
@@ -105,7 +119,7 @@ class RoomWebSocket {
//socket取消
_socket?.close();
// 销毁事件流
_msgController.close();
// _msgController.close();
// 错误重连取消
_reconnectTimer?.cancel();
_reconnectTimer = null;