guoyu/_已清理文件备份_周六 22512/md/监控学习界面功能问题分析报告.md

157 lines
5.5 KiB
Markdown
Raw Normal View History

2025-12-06 20:11:36 +08:00
# 监控学习终端的学习界面功能问题分析报告
## 问题概述
用户反馈"监控学习终端的学习界面"功能无法看到界面,经过代码分析发现了几个关键问题。
## 发现的问题
### 1. **菜单配置缺失** ⚠️ 关键问题
**问题描述:**
- 项目使用动态路由机制,路由从后端数据库的 `sys_menu` 表获取
- `screenStream` 页面(实时监控界面)没有在数据库菜单表中配置
- 因此无法在侧边栏看到菜单项,无法访问该页面
**影响:**
- 教师端无法通过菜单访问实时监控界面
- 功能虽然已实现,但无法使用
**解决方案:**
需要在数据库 `sys_menu` 表中添加菜单配置,包括:
1. 主菜单项实时监控screenStream
2. 相关权限按钮:控制监控、查看列表等
### 2. **学生端实现缺失** ⚠️ 关键问题
**问题描述:**
- 代码中只有教师端的监控界面实现
- **缺少学生端的实现**,学生端需要:
- 连接 WebSocket (`/ws/screenStream/{userId}`)
- 接收监控控制指令start_capture/stop_capture
- 捕获屏幕截图
- 将截图以 base64 格式通过 WebSocket 发送给服务器
**当前状态:**
- 后端 WebSocket 处理器已实现,可以接收学生端连接
- 后端控制器可以发送控制指令
- 但**没有学生端代码**来执行屏幕捕获和发送
**影响:**
- 即使菜单配置好了,也无法真正监控学生屏幕
- 学生端无法响应监控指令
**解决方案:**
需要开发学生端功能:
1. 学生端 WebSocket 客户端连接
2. 屏幕截图捕获功能(可能需要使用浏览器 API 或第三方库)
3. 定时发送截图数据
### 3. **监控记录页面可能也有菜单问题**
**问题描述:**
- `study-ui/src/views/study/monitor/index.vue` 是监控记录管理页面
- 该页面可能也没有在菜单中配置
**解决方案:**
同样需要在菜单表中配置该页面的菜单项
## 技术架构分析
### 已实现的部分 ✅
1. **后端 WebSocket 处理器** (`ScreenStreamWebSocketHandler.java`)
- 支持学生端和监控端连接
- 支持屏幕帧数据转发
- 支持控制指令发送
2. **后端 REST API** (`ScreenStreamController.java`)
- 启动/停止屏幕流捕获
- 检查学生在线状态
- 获取在线学生数
3. **前端监控界面** (`study-ui/src/views/study/screenStream/index.vue`)
- 学生列表显示
- 实时屏幕画面显示
- WebSocket 连接管理
- 监控控制功能
4. **监控记录管理** (`StudyScreenMonitorController.java`)
- 截图上传接口(供 App 端使用)
- 监控记录查询
- 监控记录删除
### 缺失的部分 ❌
1. **菜单配置** - 数据库菜单表配置
2. **学生端实现** - 屏幕捕获和 WebSocket 客户端
3. **权限配置** - 相关权限标识可能未配置到角色
## 建议的修复步骤
### 第一步:添加菜单配置
执行 SQL 添加菜单项(需要先查询"学习管理"菜单的 parent_id
```sql
-- 1. 添加"实时监控"菜单假设学习管理菜单ID为 XXXX
INSERT INTO sys_menu (
menu_name, parent_id, order_num, path, component,
is_frame, is_cache, menu_type, visible, status,
perms, icon, create_by, create_time, remark
) VALUES (
'实时监控', XXXX, 10, 'screenStream', 'study/screenStream/index',
1, 0, 'C', '0', '0',
'study:monitor:control', 'monitor', 'admin', sysdate(), '监控学习终端的学习界面'
);
-- 获取刚插入的菜单ID
SELECT @menuId := LAST_INSERT_ID();
-- 2. 添加权限按钮
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) VALUES
('监控控制', @menuId, 1, '#', '', 1, 0, 'F', '0', '0', 'study:monitor:control', '#', 'admin', sysdate()),
('监控查询', @menuId, 2, '#', '', 1, 0, 'F', '0', '0', 'study:monitor:list', '#', 'admin', sysdate());
-- 3. 添加"监控记录"菜单(如果还没有)
INSERT INTO sys_menu (
menu_name, parent_id, order_num, path, component,
is_frame, is_cache, menu_type, visible, status,
perms, icon, create_by, create_time, remark
) VALUES (
'监控记录', XXXX, 11, 'monitor', 'study/monitor/index',
1, 0, 'C', '0', '0',
'study:monitor:list', 'log', 'admin', sysdate(), '学习监控记录管理'
);
```
### 第二步:开发学生端功能
需要创建学生端页面或组件,实现:
1. WebSocket 连接管理
2. 屏幕截图捕获(使用 `html2canvas` 或类似库)
3. 定时发送截图数据
### 第三步:配置角色权限
在系统管理 -> 角色管理中,为相应角色分配:
- `study:monitor:control` - 监控控制权限
- `study:monitor:list` - 监控查询权限
- `study:monitor:query` - 监控详情查询权限
- `study:monitor:remove` - 监控记录删除权限
## 总结
**核心问题:**
1. ✅ 功能代码已实现
2. ❌ 菜单配置缺失(无法访问)
3. ❌ 学生端实现缺失(无法真正监控)
**优先级:**
1. **高优先级**:添加菜单配置(让界面可见)
2. **高优先级**:开发学生端功能(让功能可用)
3. **中优先级**:配置角色权限(让权限正确)
## 备注
- 学生端屏幕捕获在浏览器中有限制,可能需要:
- 使用 `html2canvas` 库捕获当前页面
- 或使用浏览器扩展/桌面应用进行全屏捕获
- 或使用 Electron 等桌面应用框架
- WebSocket 配置看起来是正确的,`WebSocketConfig.java` 已正确配置
- 数据库表 `monitor_record` 应该已存在(从 Mapper 文件可以看出)