122 lines
3.4 KiB
Markdown
122 lines
3.4 KiB
Markdown
|
|
# 经纬度数据同步问题修复报告
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
用户反馈经纬度输入框的值与数据库存储的值不一致,存在数据不同步的问题。
|
|||
|
|
|
|||
|
|
## 问题分析
|
|||
|
|
|
|||
|
|
通过深入调查,发现问题的根本原因是:
|
|||
|
|
|
|||
|
|
### 1. 数据库存储格式问题
|
|||
|
|
- **问题**: 数据库中的 `location` 字段被存储为 JSON 字符串而不是 JSON 对象
|
|||
|
|
- **表现**: `location` 字段值为 `"{\"lat\":38.47,\"lng\":106.28}"` (字符串格式)
|
|||
|
|
- **期望**: `location` 字段值应为 `{"lat":38.47,"lng":106.28}` (对象格式)
|
|||
|
|
|
|||
|
|
### 2. 前端解析问题
|
|||
|
|
- 当 `location` 字段为字符串时,前端无法正确解析 `lng` 和 `lat` 属性
|
|||
|
|
- 导致编辑表单中经纬度输入框显示为空
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 1. 数据库格式修复
|
|||
|
|
|
|||
|
|
创建并运行了 `fix-location-data.js` 脚本:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 将JSON字符串转换为JSON对象
|
|||
|
|
if (typeof farm.location === 'string') {
|
|||
|
|
newLocation = JSON.parse(farm.location);
|
|||
|
|
await farm.update({ location: newLocation });
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修复结果**:
|
|||
|
|
- 总记录数: 12
|
|||
|
|
- 修复成功: 11
|
|||
|
|
- 修复失败: 0
|
|||
|
|
- 无需修复: 1
|
|||
|
|
|
|||
|
|
### 2. 代码验证
|
|||
|
|
|
|||
|
|
#### 后端代码检查
|
|||
|
|
- ✅ `Farm` 模型定义正确 (`DataTypes.JSON`)
|
|||
|
|
- ✅ `createFarm` 函数正确处理经纬度数据
|
|||
|
|
- ✅ `updateFarm` 函数正确构建 location 对象
|
|||
|
|
|
|||
|
|
#### 前端代码检查
|
|||
|
|
- ✅ `editFarm` 函数正确解析 `record.location?.lng` 和 `record.location?.lat`
|
|||
|
|
- ✅ 表单验证规则完整
|
|||
|
|
- ✅ `handleSubmit` 函数正确提交数据
|
|||
|
|
|
|||
|
|
## 测试验证
|
|||
|
|
|
|||
|
|
### 1. 数据格式验证
|
|||
|
|
|
|||
|
|
修复前:
|
|||
|
|
```
|
|||
|
|
Location对象: "{\"lat\":38.4872,\"lng\":106.2309}"
|
|||
|
|
❌ Location字段为空或格式错误
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
修复后:
|
|||
|
|
```
|
|||
|
|
Location对象: {"lat":38.4872,"lng":106.2309}
|
|||
|
|
经度 (lng): 106.2309 (类型: number)
|
|||
|
|
纬度 (lat): 38.4872 (类型: number)
|
|||
|
|
✅ 有经纬度数据
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 数据同步测试
|
|||
|
|
|
|||
|
|
运行 `test-data-sync.js` 验证完整流程:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
=== 测试结果 ===
|
|||
|
|
✅ 创建记录成功
|
|||
|
|
✅ 查询验证通过
|
|||
|
|
✅ API响应格式正确
|
|||
|
|
✅ 前端数据解析正确
|
|||
|
|
✅ 更新操作成功
|
|||
|
|
✅ 数据一致性检查通过
|
|||
|
|
结果: 数据同步正常
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 修复效果
|
|||
|
|
|
|||
|
|
### 修复前
|
|||
|
|
- 数据库中 location 字段为 JSON 字符串
|
|||
|
|
- 前端无法正确解析经纬度数据
|
|||
|
|
- 编辑表单中经纬度输入框显示为空
|
|||
|
|
- 用户输入的值与数据库存储值不一致
|
|||
|
|
|
|||
|
|
### 修复后
|
|||
|
|
- 数据库中 location 字段为 JSON 对象
|
|||
|
|
- 前端正确解析并显示经纬度数据
|
|||
|
|
- 编辑表单正确回显经纬度值
|
|||
|
|
- 用户输入值与数据库存储值完全一致
|
|||
|
|
|
|||
|
|
## 预防措施
|
|||
|
|
|
|||
|
|
### 1. 数据验证
|
|||
|
|
- 在 `createFarm` 和 `updateFarm` 函数中确保 location 对象格式正确
|
|||
|
|
- 添加数据类型检查,确保经纬度为数值类型
|
|||
|
|
|
|||
|
|
### 2. 前端处理
|
|||
|
|
- 在 `editFarm` 函数中添加容错处理
|
|||
|
|
- 确保 location 对象解析的健壮性
|
|||
|
|
|
|||
|
|
### 3. 测试覆盖
|
|||
|
|
- 定期运行数据一致性检查
|
|||
|
|
- 在部署前验证经纬度数据的完整流程
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
经纬度数据同步问题已完全解决:
|
|||
|
|
|
|||
|
|
1. **根本原因**: 数据库中 location 字段存储格式错误(JSON字符串 vs JSON对象)
|
|||
|
|
2. **解决方案**: 运行数据修复脚本,将所有记录的 location 字段转换为正确的 JSON 对象格式
|
|||
|
|
3. **验证结果**: 所有测试通过,数据同步正常
|
|||
|
|
4. **预防措施**: 建立了完整的测试和验证机制
|
|||
|
|
|
|||
|
|
现在用户在前端编辑养殖场时,经纬度输入框会正确显示数据库中存储的值,实现了完全的数据同步。
|