测试消息发送,修复已知问题
This commit is contained in:
parent
5d78bb86a3
commit
582343c437
2
.hvigor/cache/task-cache.json
vendored
2
.hvigor/cache/task-cache.json
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -6,8 +6,7 @@
|
||||
"API_TYPE": "stageMode"
|
||||
}
|
||||
],
|
||||
"BUILD_MODE": "debug",
|
||||
"USE_NORMALIZED_OHMURL": true
|
||||
"BUILD_MODE": "debug"
|
||||
},
|
||||
"HVIGOR": {
|
||||
"IS_INCREMENTAL": true,
|
||||
@ -16,19 +15,19 @@
|
||||
"IS_HVIGORFILE_TYPE_CHECK": false,
|
||||
"TASK_TIME": {
|
||||
"1043bfc77febe75fafec0c4309faccf1": {
|
||||
"ConfigureCmake": 144333,
|
||||
"PreCheckSyscap": 397584,
|
||||
"ProcessIntegratedHsp": 716042,
|
||||
"BuildNativeWithCmake": 153583,
|
||||
"SyscapTransform": 1068125,
|
||||
"BuildNativeWithNinja": 633209,
|
||||
"BuildJS": 912000,
|
||||
"SignHap": 450709,
|
||||
"CollectDebugSymbol": 1302500,
|
||||
"assembleHap": 71000
|
||||
"ConfigureCmake": 198417,
|
||||
"PreCheckSyscap": 366291,
|
||||
"ProcessIntegratedHsp": 7834000,
|
||||
"BuildNativeWithCmake": 2433792,
|
||||
"SyscapTransform": 4341084,
|
||||
"BuildNativeWithNinja": 2475333,
|
||||
"BuildJS": 2653334,
|
||||
"SignHap": 1709458,
|
||||
"CollectDebugSymbol": 3067292,
|
||||
"assembleHap": 169292
|
||||
}
|
||||
},
|
||||
"TOTAL_TIME": 214114959,
|
||||
"BUILD_ID": "202504022245222400"
|
||||
"TOTAL_TIME": 748077750,
|
||||
"BUILD_ID": "202504031317266900"
|
||||
}
|
||||
}
|
@ -247,7 +247,7 @@ export type EventCallback = (data: EventData) => void;
|
||||
// API配置
|
||||
const CHANNEL_API_CONFIG: ApiConfig = {
|
||||
baseUrl: 'http://139.155.155.67:5243', // Change this to your computer's IP address
|
||||
pollInterval: 2000, // 轮询间隔(毫秒)
|
||||
pollInterval: 1000, // 轮询间隔(毫秒) - 降低到1秒以提高同步速度
|
||||
timeout: 10000 // 请求超时(毫秒)
|
||||
};
|
||||
|
||||
@ -439,12 +439,20 @@ export class ClassRoomService {
|
||||
// 将消息添加到当前会话
|
||||
if (this.currentSession) {
|
||||
messages.forEach(message => {
|
||||
// 避免添加自己发送的消息(已在本地添加)
|
||||
const isDuplicate = this.currentSession?.messages.some(m => m.id === message.id);
|
||||
if (!isDuplicate) {
|
||||
this.currentSession?.messages.push(message);
|
||||
// 确保消息被添加后立即通知UI
|
||||
this.notifyEvent(WebSocketEventType.SEND_MESSAGE, message);
|
||||
// 避免添加自己发送的消息(通过发送者ID比较而不是消息ID)
|
||||
if (message.senderId !== settingsService.getCurrentAccount()) {
|
||||
// 检查消息是否已存在(防止重复)
|
||||
const isDuplicate = this.currentSession?.messages.some(m => m.id === message.id);
|
||||
if (!isDuplicate) {
|
||||
// 添加到消息列表
|
||||
this.currentSession?.messages.push(message);
|
||||
// 确保消息被添加后立即通知UI
|
||||
this.notifyEvent(WebSocketEventType.SEND_MESSAGE, message);
|
||||
|
||||
// 记录接收到的新消息(来自他人)
|
||||
logManager.info(LogCategory.CLASS, LogEventType.SYSTEM_INFO,
|
||||
`收到新消息 - ID: ${message.id}, 发送者: ${message.senderName}, 内容: ${message.content}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -714,11 +722,15 @@ export class ClassRoomService {
|
||||
logManager.info(LogCategory.CLASS, LogEventType.SYSTEM_INFO, `[DEBUG] Server response received - Success: ${response.success}, Message: ${response.message || 'No message'}`);
|
||||
|
||||
if (response.success) {
|
||||
// 添加到当前会话
|
||||
this.currentSession.messages.push(message);
|
||||
// 不再将消息添加到currentSession,因为UI层已经添加了本地消息
|
||||
// (已删除): this.currentSession.messages.push(message);
|
||||
|
||||
// 不需要再次通知UI,因为UI层已经添加了本地消息
|
||||
// (已删除): this.notifyEvent(WebSocketEventType.SEND_MESSAGE, message);
|
||||
|
||||
// 只添加到lastMessageId,确保轮询时不重复获取
|
||||
this.lastMessageId = message.id;
|
||||
|
||||
// 通知消息发送
|
||||
this.notifyEvent(WebSocketEventType.SEND_MESSAGE, message);
|
||||
logManager.info(LogCategory.CLASS, LogEventType.SYSTEM_INFO, `Message sent successfully: ${message.id}`);
|
||||
|
||||
return true;
|
||||
@ -941,6 +953,67 @@ export class ClassRoomService {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 获取连接状态
|
||||
public isConnected(): boolean {
|
||||
return this.connected;
|
||||
}
|
||||
|
||||
// 重新连接方法
|
||||
public async reconnect(): Promise<boolean> {
|
||||
// 先断开连接
|
||||
this.stopPolling();
|
||||
|
||||
// 记录重连尝试
|
||||
logManager.info(LogCategory.NETWORK, LogEventType.SYSTEM_INFO,
|
||||
`尝试重新连接 - 当前状态: ${this.connected}, 课堂码: ${this.currentClassCode}`);
|
||||
|
||||
// 保存当前课堂码
|
||||
const classCode = this.currentClassCode;
|
||||
|
||||
if (!classCode) {
|
||||
logManager.error(LogCategory.NETWORK, `重连失败: 无课堂码`);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 重置连接状态
|
||||
this.connected = false;
|
||||
|
||||
// 尝试重新连接
|
||||
try {
|
||||
// 验证服务器连接
|
||||
const response = await this.getRequest('ping');
|
||||
|
||||
if (response.success) {
|
||||
this.connected = true;
|
||||
|
||||
// 重新获取课堂数据
|
||||
const sessionResponse = await this.getRequest(`session/${classCode}`);
|
||||
if (sessionResponse.success && sessionResponse.data) {
|
||||
this.currentSession = sessionResponse.data as ClassSessionModel;
|
||||
this.currentClassCode = classCode;
|
||||
|
||||
// 重新开始轮询
|
||||
this.startPolling();
|
||||
|
||||
const connectionEvent: EventConnection = { status: 'reconnected' };
|
||||
this.notifyEvent('connection', connectionEvent);
|
||||
|
||||
logManager.info(LogCategory.NETWORK, LogEventType.SYSTEM_INFO, '课堂服务重连成功');
|
||||
return true;
|
||||
} else {
|
||||
logManager.error(LogCategory.NETWORK, `重新获取课堂数据失败: ${sessionResponse.message}`);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
logManager.error(LogCategory.NETWORK, `重连失败: ${response.message}`);
|
||||
return false;
|
||||
}
|
||||
} catch (error) {
|
||||
logManager.error(LogCategory.NETWORK, `重连出错: ${error}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 导出单例实例
|
||||
|
@ -156,7 +156,8 @@ export class LogManager {
|
||||
new VersionLogItem("1.1.0", "2025-3-31", ["添加用户信息编辑功能", "增加版本日志功能", "改进主题颜色切换效果","添加公告栏","修复已知问题"]),
|
||||
new VersionLogItem("1.1.5","2025-4-1",["增加远程测试数据库","优化登录页面","优化用户信息设置","增加退出按钮"]),
|
||||
new VersionLogItem("1.1.7","2025-4-1",["添加测试按钮","修复已知问题"]),
|
||||
new VersionLogItem("1.2.0","2025-4-2",["添加课堂功能","修改上课页面逻辑"])
|
||||
new VersionLogItem("1.2.0","2025-4-2",["添加课堂功能","修改上课页面逻辑"]),
|
||||
new VersionLogItem("1.2.0 beta","2025-4-3",["测试消息发送","修复已知问题"])
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -183,14 +183,17 @@ struct ClassLivePage {
|
||||
// 检查消息是否已经存在(防止重复)
|
||||
const existingMessage = this.messages.find(m => m.id === message.id);
|
||||
if (!existingMessage) {
|
||||
// 输出调试信息
|
||||
console.info(`收到新消息事件: ID=${message.id}, 发送者=${message.senderName}, 内容=${message.content}`);
|
||||
|
||||
// 使用新数组方式更新消息列表,确保 UI 刷新
|
||||
this.messages = [...this.messages, message];
|
||||
|
||||
// 新消息到达时自动滚动到底部
|
||||
this.scrollToLatestMessage();
|
||||
|
||||
// 添加日志以便调试
|
||||
console.info(`收到新消息: ${message.content} from ${message.senderName}`);
|
||||
} else {
|
||||
// 记录重复消息(不常见,但可能发生)
|
||||
console.info(`收到重复消息,已忽略: ID=${message.id}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -398,6 +401,12 @@ struct ClassLivePage {
|
||||
}
|
||||
|
||||
try {
|
||||
// 防止重复点击、重复发送
|
||||
if (this.isLoading) {
|
||||
return;
|
||||
}
|
||||
this.isLoading = true;
|
||||
|
||||
// 保存消息内容,因为后面会清空输入框
|
||||
const messageContent = this.messageText.trim();
|
||||
|
||||
@ -409,12 +418,16 @@ struct ClassLivePage {
|
||||
messageContent
|
||||
);
|
||||
|
||||
// 先在本地添加消息,让用户立即看到
|
||||
this.messages = [...this.messages, localMessage];
|
||||
// 保存消息ID,以便后续可以在发送失败时移除
|
||||
const localMessageId = localMessage.id;
|
||||
|
||||
// 清空消息输入框
|
||||
// 清空消息输入框 - 提前清空避免用户重复点击
|
||||
this.messageText = '';
|
||||
|
||||
// 先在本地添加消息,让用户立即看到
|
||||
console.info(`添加本地消息: ID=${localMessageId}, 内容=${messageContent}`);
|
||||
this.messages = [...this.messages, localMessage];
|
||||
|
||||
// 自动滚动到最新消息
|
||||
this.scrollToLatestMessage();
|
||||
|
||||
@ -422,13 +435,17 @@ struct ClassLivePage {
|
||||
const result = await this.classRoomService.sendMessage(messageContent);
|
||||
|
||||
if (!result) {
|
||||
// 如果发送失败,显示错误提示
|
||||
// 如果发送失败,从消息列表中移除本地消息
|
||||
console.error(`消息发送失败,移除本地消息: ${localMessageId}`);
|
||||
this.messages = this.messages.filter(msg => msg.id !== localMessageId);
|
||||
|
||||
// 显示错误提示
|
||||
promptAction.showToast({
|
||||
message: '消息发送失败,请重试',
|
||||
duration: 2000
|
||||
});
|
||||
|
||||
// 可以选择在此处将刚才添加的本地消息移除,或者标记为发送失败
|
||||
} else {
|
||||
console.info(`消息发送成功: ${localMessageId}`);
|
||||
}
|
||||
} catch (error) {
|
||||
// 处理错误
|
||||
@ -438,6 +455,8 @@ struct ClassLivePage {
|
||||
message: '消息发送失败,请重试',
|
||||
duration: 2000
|
||||
});
|
||||
} finally {
|
||||
this.isLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -569,13 +588,8 @@ struct ClassLivePage {
|
||||
try {
|
||||
const result = await this.classRoomService.endClassSession();
|
||||
|
||||
if (result) {
|
||||
// 返回上课页面 - 使用明确的导航而不是back()
|
||||
router.pushUrl({
|
||||
url: 'pages/ClassPage'
|
||||
} as RouterUrlOptions);
|
||||
} else {
|
||||
// 显示错误提示
|
||||
if (!result) {
|
||||
// 只在失败时显示错误提示,成功时不跳转,等待服务器通知
|
||||
const primaryButton: DialogButton = {
|
||||
value: '确定',
|
||||
action: () => {}
|
||||
@ -588,6 +602,7 @@ struct ClassLivePage {
|
||||
};
|
||||
AlertDialog.show(alertConfig);
|
||||
}
|
||||
// 成功时不做任何操作,等待endClassCallback处理跳转
|
||||
} catch (error) {
|
||||
// 显示错误提示
|
||||
const primaryButton: DialogButton = {
|
||||
@ -742,18 +757,33 @@ struct ClassLivePage {
|
||||
.fontColor(Color.White)
|
||||
}
|
||||
|
||||
// 教师端显示结束课堂按钮
|
||||
if (this.mode === ClassLiveMode.TEACHER) {
|
||||
Button("结束课堂")
|
||||
Row() {
|
||||
// 添加连接检查按钮
|
||||
Button("检查")
|
||||
.fontSize(14)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
.backgroundColor('rgba(255,255,255,0.2)')
|
||||
.borderRadius(16)
|
||||
.fontColor(Color.White)
|
||||
.padding({ left: 12, right: 12, top: 6, bottom: 6 })
|
||||
.margin({ right: 8 })
|
||||
.onClick(() => {
|
||||
this.endClass();
|
||||
this.checkConnectionStatus();
|
||||
})
|
||||
|
||||
// 教师端显示结束课堂按钮
|
||||
if (this.mode === ClassLiveMode.TEACHER) {
|
||||
Button("结束课堂")
|
||||
.fontSize(14)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
.backgroundColor('rgba(255,255,255,0.2)')
|
||||
.borderRadius(16)
|
||||
.fontColor(Color.White)
|
||||
.padding({ left: 12, right: 12, top: 6, bottom: 6 })
|
||||
.onClick(() => {
|
||||
this.endClass();
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
@ -762,54 +792,58 @@ struct ClassLivePage {
|
||||
.justifyContent(FlexAlign.SpaceBetween)
|
||||
.padding({ left: 16, right: 16 })
|
||||
|
||||
// 课堂内容区域,包含聊天功能
|
||||
Column() {
|
||||
// 课堂信息区域
|
||||
// 使用Flex布局来确保页面元素适应不同屏幕尺寸
|
||||
Flex({ direction: FlexDirection.Column }) {
|
||||
// 顶部固定区域(课堂信息和通知)
|
||||
Column() {
|
||||
Text(`课堂名称: ${this.classSession?.className || '-'}`)
|
||||
.fontSize(16)
|
||||
.margin({ bottom: 5 })
|
||||
|
||||
Text(`授课教师: ${this.classSession?.teacherName || '-'}`)
|
||||
.fontSize(16)
|
||||
.margin({ bottom: 5 })
|
||||
|
||||
Text(`角色: ${this.mode === ClassLiveMode.TEACHER ? '教师' : '学生'}`)
|
||||
.fontSize(16)
|
||||
}
|
||||
.width('100%')
|
||||
.padding(10)
|
||||
.backgroundColor('#f5f5f5')
|
||||
.borderRadius(8)
|
||||
.margin({ top: 10, bottom: 10 })
|
||||
|
||||
// 通知消息
|
||||
if (this.currentQuestion) {
|
||||
// 课堂信息区域
|
||||
Column() {
|
||||
Text("当前有一个正在进行的题目")
|
||||
Text(`课堂名称: ${this.classSession?.className || '-'}`)
|
||||
.fontSize(16)
|
||||
.fontWeight(FontWeight.Bold)
|
||||
.margin({ bottom: 10 })
|
||||
.margin({ bottom: 5 })
|
||||
|
||||
Text(`题目: ${this.currentQuestion.title}`)
|
||||
Text(`授课教师: ${this.classSession?.teacherName || '-'}`)
|
||||
.fontSize(16)
|
||||
.margin({ bottom: 10 })
|
||||
.margin({ bottom: 5 })
|
||||
|
||||
if (this.countdownSeconds > 0) {
|
||||
Text(`剩余时间: ${this.countdownSeconds}秒`)
|
||||
.fontSize(16)
|
||||
.fontColor(this.countdownSeconds > 10 ? '#333' : '#F56C6C')
|
||||
.margin({ bottom: 10 })
|
||||
}
|
||||
Text(`角色: ${this.mode === ClassLiveMode.TEACHER ? '教师' : '学生'}`)
|
||||
.fontSize(16)
|
||||
}
|
||||
.width('100%')
|
||||
.padding(16)
|
||||
.backgroundColor('#f0f0f0')
|
||||
.padding(10)
|
||||
.backgroundColor('#f5f5f5')
|
||||
.borderRadius(8)
|
||||
.margin({ bottom: 10 })
|
||||
|
||||
// 通知消息
|
||||
if (this.currentQuestion) {
|
||||
Column() {
|
||||
Text("当前有一个正在进行的题目")
|
||||
.fontSize(16)
|
||||
.fontWeight(FontWeight.Bold)
|
||||
.margin({ bottom: 10 })
|
||||
|
||||
Text(`题目: ${this.currentQuestion.title}`)
|
||||
.fontSize(16)
|
||||
.margin({ bottom: 10 })
|
||||
|
||||
if (this.countdownSeconds > 0) {
|
||||
Text(`剩余时间: ${this.countdownSeconds}秒`)
|
||||
.fontSize(16)
|
||||
.fontColor(this.countdownSeconds > 10 ? '#333' : '#F56C6C')
|
||||
.margin({ bottom: 10 })
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
.padding(16)
|
||||
.backgroundColor('#f0f0f0')
|
||||
.borderRadius(8)
|
||||
.margin({ bottom: 10 })
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
|
||||
// 聊天历史记录区域
|
||||
// 聊天历史记录区域(可伸缩)
|
||||
Column() {
|
||||
Text("聊天记录")
|
||||
.fontSize(18)
|
||||
@ -871,63 +905,66 @@ struct ClassLivePage {
|
||||
this.scrollToLatestMessage();
|
||||
})
|
||||
}
|
||||
.flexGrow(1) // 使聊天记录区域占用所有可用空间
|
||||
.width('100%')
|
||||
.layoutWeight(1)
|
||||
.margin({ bottom: 10 })
|
||||
|
||||
// 消息输入区域
|
||||
Row() {
|
||||
TextInput({ placeholder: '输入消息...', text: this.messageText })
|
||||
.layoutWeight(1)
|
||||
.height(44)
|
||||
.borderRadius(22)
|
||||
.backgroundColor('#f5f5f5')
|
||||
.padding({ left: 20, right: 20 })
|
||||
.onChange((value: string) => {
|
||||
this.messageText = value;
|
||||
})
|
||||
|
||||
Button("发送")
|
||||
.height(44)
|
||||
.width(80)
|
||||
.margin({ left: 10 })
|
||||
.borderRadius(22)
|
||||
.backgroundColor(this.settings.themeColor)
|
||||
.onClick(() => {
|
||||
this.sendMessage();
|
||||
})
|
||||
}
|
||||
.width('100%')
|
||||
.margin({ top: 10 })
|
||||
|
||||
// 错误消息和加载状态
|
||||
if (this.errorMessage) {
|
||||
Text(this.errorMessage)
|
||||
.fontSize(14)
|
||||
.fontColor('#F56C6C')
|
||||
.width('100%')
|
||||
.textAlign(TextAlign.Center)
|
||||
.margin({ top: 10 })
|
||||
}
|
||||
|
||||
if (this.isLoading) {
|
||||
Row() {
|
||||
LoadingProgress()
|
||||
.width(24)
|
||||
.height(24)
|
||||
.margin({ right: 10 })
|
||||
|
||||
Text("处理中...")
|
||||
// 底部固定区域 (错误消息、加载状态和输入框)
|
||||
Column() {
|
||||
// 错误消息和加载状态
|
||||
if (this.errorMessage) {
|
||||
Text(this.errorMessage)
|
||||
.fontSize(14)
|
||||
.fontColor('#666')
|
||||
.fontColor('#F56C6C')
|
||||
.width('100%')
|
||||
.textAlign(TextAlign.Center)
|
||||
.margin({ top: 8, bottom: 8 })
|
||||
}
|
||||
|
||||
if (this.isLoading) {
|
||||
Row() {
|
||||
LoadingProgress()
|
||||
.width(24)
|
||||
.height(24)
|
||||
.margin({ right: 10 })
|
||||
|
||||
Text("处理中...")
|
||||
.fontSize(14)
|
||||
.fontColor('#666')
|
||||
}
|
||||
.justifyContent(FlexAlign.Center)
|
||||
.width('100%')
|
||||
.margin({ top: 8, bottom: 8 })
|
||||
}
|
||||
|
||||
// 消息输入区域
|
||||
Row() {
|
||||
TextInput({ placeholder: '输入消息...', text: this.messageText })
|
||||
.layoutWeight(1)
|
||||
.height(44)
|
||||
.borderRadius(22)
|
||||
.backgroundColor('#f5f5f5')
|
||||
.padding({ left: 20, right: 20 })
|
||||
.onChange((value: string) => {
|
||||
this.messageText = value;
|
||||
})
|
||||
|
||||
Button("发送")
|
||||
.height(44)
|
||||
.width(80)
|
||||
.margin({ left: 10 })
|
||||
.borderRadius(22)
|
||||
.backgroundColor(this.settings.themeColor)
|
||||
.onClick(() => {
|
||||
this.sendMessage();
|
||||
})
|
||||
}
|
||||
.justifyContent(FlexAlign.Center)
|
||||
.width('100%')
|
||||
.margin({ top: 10 })
|
||||
.padding({ top: 8, bottom: 8 })
|
||||
}
|
||||
.width('100%')
|
||||
}
|
||||
.width('100%')
|
||||
.height('100%')
|
||||
.layoutWeight(1) // 确保Flex容器占据全部可用空间
|
||||
.padding(16)
|
||||
}
|
||||
.width('100%')
|
||||
@ -1355,52 +1392,65 @@ struct ClassLivePage {
|
||||
ForEach(this.currentQuestion.options, (option: QuestionOption, index: number) => {
|
||||
Column() {
|
||||
Row() {
|
||||
Text(`选项 ${String.fromCharCode(65 + index)}: ${option.content}`)
|
||||
Text(`选项 ${String.fromCharCode(65 + index)}`)
|
||||
.fontSize(16)
|
||||
.fontWeight(index === this.currentQuestion?.correctOption ? FontWeight.Bold : FontWeight.Normal)
|
||||
.fontColor(index === this.currentQuestion?.correctOption ? '#67C23A' : '#333')
|
||||
}
|
||||
.width('100%')
|
||||
.margin({ bottom: 4 })
|
||||
|
||||
Row() {
|
||||
// 进度条
|
||||
Column() {
|
||||
Stack({ alignContent: Alignment.Start }) {
|
||||
Row()
|
||||
.width('100%')
|
||||
.height(20)
|
||||
.backgroundColor('#f0f0f0')
|
||||
.borderRadius(10)
|
||||
|
||||
Row()
|
||||
.width(`${this.getOptionStats(index).percentage}%`)
|
||||
.height(20)
|
||||
.backgroundColor(index === this.currentQuestion?.correctOption ? '#67C23A' : '#409EFF')
|
||||
.borderRadius(10)
|
||||
}
|
||||
}
|
||||
.layoutWeight(1)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
|
||||
// 百分比和人数
|
||||
Text(`${this.getOptionStats(index).percentage}% (${this.getOptionStats(index).count}人)`)
|
||||
.fontSize(14)
|
||||
.fontColor('#666')
|
||||
.margin({ left: 8 })
|
||||
.width(100)
|
||||
.textAlign(TextAlign.End)
|
||||
Text(`${this.getOptionStats(index).count}票`)
|
||||
.fontSize(16)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
|
||||
Text(`${this.getOptionStats(index).percentage}%`)
|
||||
.fontSize(16)
|
||||
.fontColor(this.getOptionStats(index).percentage > 50 ? '#67C23A' : '#F56C6C')
|
||||
.fontWeight(FontWeight.Medium)
|
||||
}
|
||||
.width('100%')
|
||||
.padding(10)
|
||||
.borderRadius(8)
|
||||
.backgroundColor('#f5f5f5')
|
||||
.margin({ bottom: 8 })
|
||||
}
|
||||
.width('100%')
|
||||
.margin({ bottom: 12 })
|
||||
.padding(10)
|
||||
.borderRadius(8)
|
||||
.backgroundColor(index === this.currentQuestion?.correctOption ? '#f0f9eb' : '#f9f9f9')
|
||||
})
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
}
|
||||
|
||||
// 增加检查连接状态方法
|
||||
private checkConnectionStatus() {
|
||||
try {
|
||||
const connectionStatus = this.classRoomService.isConnected() ? '已连接' : '未连接';
|
||||
const messageCount = this.messages.length;
|
||||
const lastMessageId = this.messages.length > 0 ? this.messages[this.messages.length - 1].id : '无消息';
|
||||
|
||||
// 显示状态对话框
|
||||
const primaryButton: DialogButton = {
|
||||
value: '确定',
|
||||
action: () => {}
|
||||
};
|
||||
|
||||
const secondaryButton: DialogButton = {
|
||||
value: '重新连接',
|
||||
action: () => {
|
||||
// 尝试重新连接
|
||||
this.classRoomService.reconnect();
|
||||
}
|
||||
};
|
||||
|
||||
const alertConfig: AlertDialogConfig = {
|
||||
title: '连接状态检查',
|
||||
message: `连接状态: ${connectionStatus}\n消息数量: ${messageCount}\n最新消息ID: ${lastMessageId}`,
|
||||
primaryButton: primaryButton,
|
||||
secondaryButton: secondaryButton
|
||||
};
|
||||
AlertDialog.show(alertConfig);
|
||||
|
||||
// 记录日志
|
||||
logManager.info(LogCategory.CLASS, LogEventType.SYSTEM_INFO,
|
||||
`连接状态: ${connectionStatus}, 消息数量: ${messageCount}, 最新消息ID: ${lastMessageId}`);
|
||||
} catch (error) {
|
||||
console.error(`检查连接状态出错: ${error}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 题目统计窗口
|
||||
@ -1527,4 +1577,4 @@ struct ClassLivePage {
|
||||
// 点击遮罩不关闭对话框
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user