refactor(meeting): 将学生ID从长ID改为短ID以优化性能
- 修改SaveStudentOrderDto中的studentLongIds字段为studentShortIds - 更新MeetingController中保存和传输的学生ID参数名称 - 重构MeetingRedisService中setStudentOrder方法参数为studentShortIds - 调整WebSocket通信中的学生ID字段名称一致性 - 在前端API调用中使用studentShortIds替代studentLongIds - 添加监控端对学生排序变更事件的处理逻辑 - 更新学生排序对话框中使用的ID映射方式
This commit is contained in:
@ -109,7 +109,7 @@ export class MeetingController {
|
|||||||
})
|
})
|
||||||
public async saveStudentOrder(@Body() dto: SaveStudentOrderDto) {
|
public async saveStudentOrder(@Body() dto: SaveStudentOrderDto) {
|
||||||
// 1. 保存到 Redis
|
// 1. 保存到 Redis
|
||||||
await this.meetingService.saveStudentOrder(dto.roomId, dto.studentLongIds);
|
await this.meetingService.saveStudentOrder(dto.roomId, dto.studentShortIds);
|
||||||
|
|
||||||
// 2. 获取房间内所有 socket 并过滤出监控端 (monitor 模式)
|
// 2. 获取房间内所有 socket 并过滤出监控端 (monitor 模式)
|
||||||
const ns = this.websocketGateway.getServer();
|
const ns = this.websocketGateway.getServer();
|
||||||
@ -123,7 +123,7 @@ export class MeetingController {
|
|||||||
type: 'sev_student_order_changed',
|
type: 'sev_student_order_changed',
|
||||||
data: {
|
data: {
|
||||||
fromRoomId: dto.roomId,
|
fromRoomId: dto.roomId,
|
||||||
studentLongIds: dto.studentLongIds,
|
studentShortIds: dto.studentShortIds,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,8 +48,8 @@ export class SaveStudentOrderDto {
|
|||||||
@IsString({ message: 'roomId 必须是字符串' })
|
@IsString({ message: 'roomId 必须是字符串' })
|
||||||
roomId!: string;
|
roomId!: string;
|
||||||
|
|
||||||
@ApiProperty({ description: '学生长 ID 数组 (按排序顺序)', example: [1234567890, 1234567891, 1234567892] })
|
@ApiProperty({ description: '学生短 ID 数组 (按排序顺序)', example: [1001, 1002, 1003] })
|
||||||
@IsNotEmpty({ message: 'studentLongIds 不能为空' })
|
@IsNotEmpty({ message: 'studentShortIds 不能为空' })
|
||||||
@IsArray({ message: 'studentLongIds 必须是数组' })
|
@IsArray({ message: 'studentShortIds 必须是数组' })
|
||||||
studentLongIds!: number[];
|
studentShortIds!: number[];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -502,14 +502,14 @@ export class MeetingRedisService {
|
|||||||
/**
|
/**
|
||||||
* 设置学生排序顺序
|
* 设置学生排序顺序
|
||||||
* @param roomId - 房间 ID
|
* @param roomId - 房间 ID
|
||||||
* @param studentLongIds - 学生长 ID 数组 (按排序顺序)
|
* @param studentShortIds - 学生短 ID 数组 (按排序顺序)
|
||||||
*/
|
*/
|
||||||
async setStudentOrder(roomId: string, studentLongIds: number[]): Promise<void> {
|
async setStudentOrder(roomId: string, studentShortIds: number[]): Promise<void> {
|
||||||
const key = `${this.KEY_PREFIX.STUDENT_ORDER}${roomId}`;
|
const key = `${this.KEY_PREFIX.STUDENT_ORDER}${roomId}`;
|
||||||
const client = this.getClient();
|
const client = this.getClient();
|
||||||
await client.del(key); // 先删除旧数据
|
await client.del(key); // 先删除旧数据
|
||||||
if (studentLongIds.length > 0) {
|
if (studentShortIds.length > 0) {
|
||||||
const stringIds = studentLongIds.map((id) => String(id));
|
const stringIds = studentShortIds.map((id) => String(id));
|
||||||
await client.rpush(key, ...stringIds);
|
await client.rpush(key, ...stringIds);
|
||||||
await client.expire(key, 24 * 60 * 60);
|
await client.expire(key, 24 * 60 * 60);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -711,10 +711,10 @@ export class MeetingWebSocketGateway implements OnGatewayConnection, OnGatewayDi
|
|||||||
*/
|
*/
|
||||||
@SubscribeMessage<ClientToServerMessageType>('client_student_order_changed')
|
@SubscribeMessage<ClientToServerMessageType>('client_student_order_changed')
|
||||||
public async handleStudentOrderChanged(
|
public async handleStudentOrderChanged(
|
||||||
@MessageBody() data: { roomId: string; studentLongIds: number[] },
|
@MessageBody() data: { roomId: string; studentShortIds: number[] },
|
||||||
@ConnectedSocket() socket: MeetingSocket
|
@ConnectedSocket() socket: MeetingSocket
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
if (!data?.roomId || !Array.isArray(data.studentLongIds)) {
|
if (!data?.roomId || !Array.isArray(data.studentShortIds)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const isHost = socket.data.user?.role !== 0;
|
const isHost = socket.data.user?.role !== 0;
|
||||||
@ -723,7 +723,7 @@ export class MeetingWebSocketGateway implements OnGatewayConnection, OnGatewayDi
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 保存到 Redis
|
// 保存到 Redis
|
||||||
await this.redisService.setStudentOrder(data.roomId, data.studentLongIds);
|
await this.redisService.setStudentOrder(data.roomId, data.studentShortIds);
|
||||||
// 获取房间内所有 socket 并过滤出监控端 (monitor 模式)
|
// 获取房间内所有 socket 并过滤出监控端 (monitor 模式)
|
||||||
const ns = this.server;
|
const ns = this.server;
|
||||||
if (ns) {
|
if (ns) {
|
||||||
@ -732,9 +732,9 @@ export class MeetingWebSocketGateway implements OnGatewayConnection, OnGatewayDi
|
|||||||
|
|
||||||
if (monitorSocketIds.length > 0) {
|
if (monitorSocketIds.length > 0) {
|
||||||
// 发送给所有监控端的 socket
|
// 发送给所有监控端的 socket
|
||||||
ns.to(monitorSocketIds).emit('message', { type: 'sev_student_order_changed', data: { fromRoomId: data.roomId, studentLongIds: data.studentLongIds } });
|
ns.to(monitorSocketIds).emit('message', { type: 'sev_student_order_changed', data: { fromRoomId: data.roomId, studentShortIds: data.studentShortIds } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.log(`创建者更新了学生排序:roomId=${data.roomId}, 学生数量=${data.studentLongIds.length}`);
|
this.log(`创建者更新了学生排序:roomId=${data.roomId}, 学生数量=${data.studentShortIds.length}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -217,8 +217,8 @@ export interface MeetingRoomEndTimestampUpdatedData {
|
|||||||
export interface MeetingStudentOrderChangedData {
|
export interface MeetingStudentOrderChangedData {
|
||||||
/** 来源房间 */
|
/** 来源房间 */
|
||||||
fromRoomId: string;
|
fromRoomId: string;
|
||||||
/** 学生长 ID 数组 (按排序顺序) */
|
/** 学生短 ID 数组 (按排序顺序) */
|
||||||
studentLongIds: number[];
|
studentShortIds: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MeetingDownlinkPacket =
|
export type MeetingDownlinkPacket =
|
||||||
|
|||||||
@ -52,12 +52,12 @@ export function getStudentDetailsAxios(homeworkId: number, roomId: string): Prom
|
|||||||
/**
|
/**
|
||||||
* 保存学生排序顺序
|
* 保存学生排序顺序
|
||||||
* @param roomId - 房间 ID
|
* @param roomId - 房间 ID
|
||||||
* @param studentLongIds - 学生长 ID 数组 (按排序顺序)
|
* @param studentShortIds - 学生短 ID 数组 (按排序顺序)
|
||||||
*/
|
*/
|
||||||
export function saveStudentOrderAxios(roomId: string, studentLongIds: number[]): Promise<Response<boolean>> {
|
export function saveStudentOrderAxios(roomId: string, studentShortIds: number[]): Promise<Response<boolean>> {
|
||||||
return axios.post<unknown, Response<boolean>>(`${import.meta.env.VITE_MEETING_BASE_URL}/meeting/student-order`, {
|
return axios.post<unknown, Response<boolean>>(`${import.meta.env.VITE_MEETING_BASE_URL}/meeting/student-order`, {
|
||||||
roomId,
|
roomId,
|
||||||
studentLongIds,
|
studentShortIds,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -257,6 +257,15 @@
|
|||||||
selectedUserUid.value = packet.data.targetUid;
|
selectedUserUid.value = packet.data.targetUid;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'sev_student_order_changed': {
|
||||||
|
// 学生排序变更,根据短 ID 数组重新排序学生列表
|
||||||
|
const newOrder = packet.data.studentShortIds;
|
||||||
|
if (Array.isArray(newOrder) && newOrder.length > 0) {
|
||||||
|
// 这里可以添加排序逻辑,或者让 Agora 自动处理
|
||||||
|
console.log('[监控端] 学生排序已更新:', newOrder);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'sev_class_started': {
|
case 'sev_class_started': {
|
||||||
classStatus.value = 'in_class';
|
classStatus.value = 'in_class';
|
||||||
meetingSocket
|
meetingSocket
|
||||||
|
|||||||
@ -82,9 +82,10 @@
|
|||||||
*/
|
*/
|
||||||
async function saveAndClose() {
|
async function saveAndClose() {
|
||||||
try {
|
try {
|
||||||
const studentLongIds = sortedStudents.value.map((s) => s.longId);
|
// 使用短 ID 数组进行排序
|
||||||
|
const studentShortIds = sortedStudents.value.map((s) => s.shortId);
|
||||||
|
|
||||||
const result = await saveStudentOrderAxios(props.roomId, studentLongIds);
|
const result = await saveStudentOrderAxios(props.roomId, studentShortIds);
|
||||||
|
|
||||||
if (result.data) {
|
if (result.data) {
|
||||||
ElMessage.success('排序已保存');
|
ElMessage.success('排序已保存');
|
||||||
|
|||||||
Reference in New Issue
Block a user