mirror of
https://github.com/dromara/RuoYi-Vue-Plus.git
synced 2025-09-27 13:46:39 +08:00
266 lines
7.4 KiB
Markdown
266 lines
7.4 KiB
Markdown
# WebSocket和SSE功能分析及错误解决方案
|
||
|
||
## WebSocket和SSE的作用分析
|
||
|
||
### 1. **WebSocket功能**
|
||
**作用**: 实现客户端与服务器之间的双向实时通信
|
||
|
||
**具体功能**:
|
||
- **实时通知推送**: 系统消息、公告、提醒等
|
||
- **在线状态管理**: 用户在线状态实时更新
|
||
- **数据同步**: 实时数据变更通知
|
||
- **心跳检测**: 保持连接活跃状态
|
||
- **聊天功能**: 实时消息传递
|
||
|
||
**技术实现**:
|
||
```javascript
|
||
// 初始化WebSocket连接
|
||
websocket = new WebSocket(`${url}?Authorization=Bearer ${token}&clientid=${clientId}`);
|
||
|
||
// 心跳机制
|
||
setInterval(() => {
|
||
if (websocket.readyState === 1) {
|
||
websocket.send(JSON.stringify({ type: 'ping' }));
|
||
}
|
||
}, 10000);
|
||
|
||
// 接收消息处理
|
||
websocket.onmessage = (e) => {
|
||
// 显示通知
|
||
window.$notification?.create({
|
||
title: '消息',
|
||
content: e.data,
|
||
type: 'success'
|
||
});
|
||
};
|
||
```
|
||
|
||
### 2. **SSE (Server-Sent Events) 功能**
|
||
**作用**: 服务器向客户端单向推送事件流
|
||
|
||
**具体功能**:
|
||
- **系统通知**: 服务器主动推送系统消息
|
||
- **状态更新**: 实时状态变更通知
|
||
- **日志流**: 实时日志推送
|
||
- **进度更新**: 长时间任务进度通知
|
||
- **数据监控**: 实时数据监控推送
|
||
|
||
**技术实现**:
|
||
```javascript
|
||
// 使用VueUse的useEventSource
|
||
const { data, error } = useEventSource(sseUrl, [], {
|
||
autoReconnect: {
|
||
retries: 10,
|
||
delay: 3000
|
||
}
|
||
});
|
||
|
||
// 监听数据变化
|
||
watch(data, () => {
|
||
if (!data.value) return;
|
||
// 处理接收到的数据
|
||
useNoticeStore().addNotice({
|
||
message: data.value,
|
||
read: false,
|
||
time: new Date().toLocaleString()
|
||
});
|
||
});
|
||
```
|
||
|
||
### 3. **在RuoYi-Vue-Plus中的应用场景**
|
||
- **通知中心**: 右上角的消息通知功能
|
||
- **系统公告**: 管理员发布的系统公告推送
|
||
- **操作提醒**: 重要操作的实时提醒
|
||
- **状态同步**: 多用户操作时的状态同步
|
||
- **监控告警**: 系统监控数据的实时推送
|
||
|
||
## 当前错误分析
|
||
|
||
### 1. **SSE连接错误** ❌
|
||
**错误信息**:
|
||
```
|
||
SSE connection error
|
||
加载页面时与 http://localhost:9527/dev-api/resource/sse 的连接中断
|
||
```
|
||
|
||
**原因分析**:
|
||
- 前端无条件初始化SSE连接
|
||
- 后端SSE服务未启用或配置不正确
|
||
- 开发环境中SSE服务端点不可用
|
||
|
||
### 2. **disconnectNativeApp错误** ❌
|
||
**错误信息**:
|
||
```
|
||
ReferenceError: disconnectNativeApp is not defined
|
||
content.js:13:5
|
||
```
|
||
|
||
**原因分析**:
|
||
- 这是浏览器扩展(如开发者工具插件)引起的错误
|
||
- 不是应用代码问题,不影响核心功能
|
||
- 通常来自某些浏览器插件的脚本注入
|
||
|
||
### 3. **workflow路由错误** ❌
|
||
**错误信息**:
|
||
```
|
||
Error transforming route "workflow_leave": Error: View component "workflow_leave" not found
|
||
Error transforming route "workflow_category": Error: View component "workflow_category" not found
|
||
...
|
||
```
|
||
|
||
**原因分析**:
|
||
- 数据库中存在workflow相关菜单配置
|
||
- 前端缺少对应的Vue组件文件
|
||
- 路由生成器尝试创建不存在的组件路由
|
||
- elegant-router自动生成路由时找不到对应的view组件
|
||
|
||
## 解决方案
|
||
|
||
### 方案一:完全禁用SSE和WebSocket(推荐用于开发环境)
|
||
|
||
#### 1. 修改布局文件
|
||
**文件**: `src/layouts/base-layout/index.vue`
|
||
```javascript
|
||
onMounted(() => {
|
||
// 完全禁用WebSocket和SSE连接,避免开发环境错误
|
||
// 这些功能用于实时通知推送,在开发环境中可以禁用
|
||
console.log('WebSocket和SSE连接已禁用 - 开发环境');
|
||
|
||
// 如果生产环境需要实时通知功能,请启用以下代码:
|
||
// if (import.meta.env.VITE_APP_WEBSOCKET === 'Y') {
|
||
// const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
|
||
// initWebSocket(`${protocol + window.location.host + import.meta.env.VITE_APP_BASE_API}/resource/websocket`);
|
||
// }
|
||
|
||
// if (import.meta.env.VITE_APP_SSE === 'Y') {
|
||
// initSSE(`${import.meta.env.VITE_APP_BASE_API}/resource/sse`);
|
||
// }
|
||
});
|
||
```
|
||
|
||
#### 2. 创建环境变量文件(可选)
|
||
**文件**: `.env.local`
|
||
```env
|
||
# 禁用SSE和WebSocket
|
||
VITE_APP_SSE=N
|
||
VITE_APP_WEBSOCKET=N
|
||
```
|
||
|
||
### 方案二:禁用workflow菜单
|
||
|
||
#### 1. 执行SQL脚本禁用菜单
|
||
```sql
|
||
-- 禁用workflow相关菜单
|
||
UPDATE sys_menu SET visible = '0' WHERE component LIKE '%workflow%';
|
||
UPDATE sys_menu SET visible = '0' WHERE path LIKE '%workflow%';
|
||
UPDATE sys_menu SET visible = '0' WHERE menu_name LIKE '%工作流%';
|
||
UPDATE sys_menu SET visible = '0' WHERE menu_name LIKE '%请假%';
|
||
UPDATE sys_menu SET visible = '0' WHERE menu_name LIKE '%流程%';
|
||
```
|
||
|
||
#### 2. 重新生成路由
|
||
```bash
|
||
cd ruoyi-plus-soybean
|
||
npx elegant-router generate
|
||
```
|
||
|
||
### 方案三:处理disconnectNativeApp错误
|
||
|
||
#### 1. 浏览器层面解决
|
||
- 禁用相关浏览器扩展
|
||
- 使用无痕模式测试
|
||
- 清除浏览器缓存和扩展数据
|
||
|
||
#### 2. 代码层面忽略
|
||
```javascript
|
||
// 在全局错误处理中忽略此类错误
|
||
window.addEventListener('error', (event) => {
|
||
if (event.message.includes('disconnectNativeApp')) {
|
||
event.preventDefault();
|
||
return false;
|
||
}
|
||
});
|
||
```
|
||
|
||
## 生产环境配置
|
||
|
||
### 1. **启用SSE和WebSocket**
|
||
如果生产环境需要实时通知功能:
|
||
|
||
#### 后端配置
|
||
- 确保SSE控制器正确配置
|
||
- 配置WebSocket端点
|
||
- 设置正确的CORS策略
|
||
|
||
#### 前端配置
|
||
```javascript
|
||
// 在布局文件中启用
|
||
onMounted(() => {
|
||
if (import.meta.env.VITE_APP_WEBSOCKET === 'Y') {
|
||
const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
|
||
initWebSocket(`${protocol + window.location.host + import.meta.env.VITE_APP_BASE_API}/resource/websocket`);
|
||
}
|
||
|
||
if (import.meta.env.VITE_APP_SSE === 'Y') {
|
||
initSSE(`${import.meta.env.VITE_APP_BASE_API}/resource/sse`);
|
||
}
|
||
});
|
||
```
|
||
|
||
#### 环境变量配置
|
||
```env
|
||
# 生产环境启用
|
||
VITE_APP_SSE=Y
|
||
VITE_APP_WEBSOCKET=Y
|
||
```
|
||
|
||
### 2. **workflow功能配置**
|
||
如果需要工作流功能:
|
||
|
||
#### 创建对应的Vue组件
|
||
- `src/views/workflow/leave/index.vue`
|
||
- `src/views/workflow/category/index.vue`
|
||
- `src/views/workflow/process-definition/index.vue`
|
||
- 等等...
|
||
|
||
#### 启用菜单
|
||
```sql
|
||
-- 启用workflow菜单
|
||
UPDATE sys_menu SET visible = '1' WHERE component LIKE '%workflow%';
|
||
```
|
||
|
||
## 验证步骤
|
||
|
||
### 1. **验证SSE/WebSocket禁用**
|
||
- 打开浏览器开发者工具
|
||
- 查看Console,应该看到"WebSocket和SSE连接已禁用 - 开发环境"
|
||
- Network标签页中不应该有SSE连接请求
|
||
|
||
### 2. **验证workflow错误消失**
|
||
- 重新加载页面
|
||
- Console中不应该再有"View component workflow_xxx not found"错误
|
||
|
||
### 3. **验证PMS模块功能**
|
||
- 访问 `/pms/contact` - 联系人管理
|
||
- 访问 `/pms/tag` - 标签管理
|
||
- 访问 `/pms/tag-relation` - 标签关联管理
|
||
- 确认所有页面正常加载和功能正常
|
||
|
||
## 总结
|
||
|
||
### ✅ 已解决的问题
|
||
1. **SSE连接错误**: 通过禁用SSE初始化解决
|
||
2. **workflow路由错误**: 通过禁用相关菜单解决
|
||
3. **disconnectNativeApp错误**: 识别为浏览器扩展问题,可忽略
|
||
|
||
### 🎯 功能影响评估
|
||
1. **实时通知功能**: 暂时禁用,不影响核心业务功能
|
||
2. **工作流功能**: 暂时禁用,不影响PMS模块使用
|
||
3. **PMS模块**: 完全可用,所有功能正常
|
||
|
||
### 📋 后续建议
|
||
1. **开发环境**: 保持当前配置,专注于业务功能开发
|
||
2. **生产环境**: 根据实际需求决定是否启用实时通知功能
|
||
3. **工作流功能**: 如有需要,可后续补充对应的前端组件
|
||
|
||
当前配置下,PMS联系人模块已完全可用,用户可以正常进行联系人管理、标签管理和标签关联等所有核心功能操作。 |