位置逻辑更新,代码修改
All checks were successful
构建并部署 Spring Boot 应用 / build-and-deploy (push) Successful in 52m56s

This commit is contained in:
2025-10-18 22:20:07 +08:00
parent c173c480b2
commit 74c0908b58
6 changed files with 805 additions and 158 deletions

171
README.md
View File

@@ -86,6 +86,93 @@ src
位置信息现在存储在服务器内存缓存中,而不是持久化到数据库,以提高访问速度和减少数据库负载。
#### WebSocket接口和交互逻辑
系统通过WebSocket实现实时位置同步端点为`/ws/location`
##### 连接建立
客户端通过WebSocket连接到`/ws/location`端点建立连接。
##### 消息格式
所有消息都使用JSON格式。
###### 1. 客户端发送的消息类型
1. **updateLocation位置更新** - 更新用户位置
```json
{
"type": "updateLocation",
"userId": 123,
"latitude": 25.0342,
"longitude": 102.7057,
"timestamp": 1634567890000
}
```
###### 2. 服务器发送的消息类型
1. **subscribed订阅成功响应** - 服务器确认订阅成功
```json
{
"type": "subscribed",
"userId": 123
}
```
2. **onlineUserList在线用户列表** - 服务器发送当前在线用户列表
```json
{
"type": "onlineUserList",
"users": [
{
"userId": 123,
"name": "张三",
"role": "DELIVERY_PERSON"
},
{
"userId": 456,
"name": "李四",
"role": "ADMIN"
}
]
}
```
3. **updateLocation位置更新** - 服务器向所有已签到用户广播位置更新
```json
{
"type": "updateLocation",
"userId": 123,
"userRole": "DELIVERY_PERSON",
"latitude": 25.0342,
"longitude": 102.7057,
"timestamp": 1634567890000
}
```
##### 交互流程
```
用户签到] --> B{签到成功?}
B -->|是| C[建立WebSocket连接]
B -->|否| D[签到失败]
C --> E[自动订阅位置更新]
E --> F[接收subscribed确认]
F --> G[接收在线用户列表]
G --> H[开始位置更新循环]
H --> I[发送位置更新]
I --> J[接收位置广播]
J --> H
K[用户签退] --> L{签退成功?}
L -->|是| M[自动取消订阅并关闭WebSocket连接]
L -->|否| N[签退失败]
```
##### 角色区分
- 管理员ADMIN和配送员DELIVERY_PERSON都可以接收位置更新
- 位置广播消息中包含用户角色信息,便于客户端区分显示
- 只有已签到用户才会收到位置更新广播
### 数据模型
主要实体包括:
@@ -167,6 +254,12 @@ java -jar target/light-delivery-1.0.0.jar --spring.profiles.active=local
java -jar target/light-delivery-1.0.0.jar --spring.profiles.active=test
```
在PowerShell中也可以使用以下命令运行本地环境
```powershell
$env:SPRING_PROFILES_ACTIVE = "local"
mvn spring-boot:run
```
### 运行Docker容器
```bash
@@ -258,9 +351,83 @@ deploy.bat
### 位置同步相关
- `GET /location-sync/delivery-persons/locations` - 获取所有配送员位置
- WebSocket端点: `/ws/location` - 实时位置同步
### WebSocket消息格式
客户端和服务器通过WebSocket发送JSON格式的消息。
#### 客户端发送的消息类型
1. **updateLocation位置更新** - 更新用户位置
```json
{
"type": "updateLocation",
"userId": 123,
"latitude": 25.0342,
"longitude": 102.7057,
"timestamp": 1634567890000
}
```
#### 服务器发送的消息类型
1. **subscribed订阅成功响应** - 服务器确认订阅成功
```json
{
"type": "subscribed",
"userId": 123
}
```
2. **onlineUserList在线用户列表** - 服务器发送当前在线用户列表
```json
{
"type": "onlineUserList",
"users": [
{
"userId": 123,
"name": "张三",
"role": "DELIVERY_PERSON"
},
{
"userId": 456,
"name": "李四",
"role": "ADMIN"
}
]
}
```
3. **updateLocation位置更新** - 服务器向所有已签到用户广播位置更新
```json
{
"type": "updateLocation",
"userId": 123,
"userRole": "DELIVERY_PERSON",
"latitude": 25.0342,
"longitude": 102.7057,
"timestamp": 1634567890000
}
```
## 最近更新
### WebSocket使用方式变更重要变更
为了更好地分离关注点和提高系统安全性我们对WebSocket使用方式进行了重要变更
- 移除了WebSocket中的签到/签退功能这些操作现在完全通过REST API进行
- WebSocket现在仅用于位置同步不再处理用户状态变更
- 用户需要先通过REST API签到然后才能建立WebSocket连接并接收位置更新
- 用户签退时服务器会自动取消订阅并关闭WebSocket连接
- 客户端不再需要发送subscribe/unsubscribe消息这些操作由服务器自动处理
### WebSocket位置同步增强新增
为了支持管理员和配送员都能接收位置更新信息我们对WebSocket位置同步功能进行了增强
- 修改了LocationWebSocketHandler使其支持所有用户类型包括管理员和配送员
- 在位置消息中添加了用户角色信息,便于客户端区分并使用不同图标显示
- 重构了WebSocket处理逻辑使其更加通用和可扩展
- 实现了在线用户列表管理和广播机制
### 用户角色管理优化(新增)
为解决数据一致性问题,我们优化了用户角色管理机制:
- 移除了User表中的role字段
@@ -292,4 +459,6 @@ deploy.bat
3. 配送员位置信息具有时效性默认5分钟内有效
4. 位置历史记录功能已被移除,如有需要可使用第三方服务进行位置追踪
5. 员工管理接口仅限管理员角色访问
6. 用户角色信息现在通过员工表动态获取,确保数据一致性
6. 用户角色信息现在通过员工表动态获取,确保数据一致性
7. WebSocket位置同步现在支持所有已签到用户包括管理员和配送员
8. WebSocket仅用于位置同步签到/签退操作需通过REST API完成