位置逻辑更新,代码修改
All checks were successful
构建并部署 Spring Boot 应用 / build-and-deploy (push) Successful in 52m56s
All checks were successful
构建并部署 Spring Boot 应用 / build-and-deploy (push) Successful in 52m56s
This commit is contained in:
171
README.md
171
README.md
@@ -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完成
|
Reference in New Issue
Block a user