一、地理位置授权实现
1. 前端授权流程
- 触发授权:在用户首次进入小程序或点击“配送地址”时,调用`wx.getLocation`或`wx.chooseLocation`。
- 动态权限申请:
```javascript
wx.authorize({
scope: scope.userLocation,
success() {
// 授权成功,获取位置
wx.getLocation({
type: gcj02, // 高德/腾讯地图坐标系
success(res) {
const { latitude, longitude } = res;
// 调用后端接口保存坐标
}
});
},
fail() {
// 引导用户手动授权
wx.openSetting({
success(res) {
if (res.authSetting[scope.userLocation]) {
// 用户重新授权后获取位置
}
}
});
}
});
```
- 备用方案:若用户拒绝授权,提供手动输入地址的入口,或通过IP定位(精度较低)。
2. 后端存储与处理
- 将用户坐标(`latitude, longitude`)存储在数据库中,关联用户ID。
- 调用第三方地图API(如高德、腾讯地图)将坐标转换为详细地址(逆地理编码):
```javascript
// 示例:高德逆地理编码API
const address = await axios.get(`https://restapi.amap.com/v3/geocode/regeo`, {
params: {
key: 你的高德Key,
location: `${longitude},${latitude}`
}
});
```
二、万象源码部署与精准配送
1. 万象物流系统集成
- 源码部署:
- 获取万象物流的开源或商业源码(需确认授权)。
- 部署到自有服务器(如Nginx + Docker),配置数据库(MySQL/MongoDB)。
- 修改配置文件,对接生鲜小程序的API接口。
2. 配送逻辑实现
- 订单分配:
- 根据用户坐标和商家坐标,计算距离(使用Haversine公式或地图API的路径规划)。
- 结合骑手位置、配送范围、预计时间(ETA)分配最优骑手。
- 路径规划:
- 调用地图API(如高德路径规划)生成最优路线,计算配送时间。
- 示例请求:
```javascript
const route = await axios.get(`https://restapi.amap.com/v3/direction/driving`, {
params: {
key: 你的高德Key,
origin: `${商家经度},${商家纬度}`,
destination: `${用户经度},${用户纬度}`
}
});
```
3. 实时追踪
- 骑手APP或小程序端定时上报位置到后端。
- 前端通过WebSocket或轮询获取骑手实时位置,在地图上展示轨迹。
三、系统对接与优化
1. API接口设计
- 用户端:
- `POST /api/location`:上传用户坐标。
- `GET /api/address`:获取逆地理编码地址。
- 配送端:
- `POST /api/orders`:创建订单并分配骑手。
- `GET /api/orders/{id}/status`:查询订单状态和骑手位置。
2. 性能优化
- 缓存策略:对频繁查询的地址和路线结果进行Redis缓存。
- 异步处理:使用消息队列(如RabbitMQ)处理订单分配和路径规划,避免阻塞。
- 负载均衡:对高并发场景(如促销活动)部署多台服务器。
3. 安全与合规
- 用户位置数据加密存储,遵守《个人信息保护法》。
- 骑手位置上报需验证身份(如Token校验)。
四、测试与上线
1. 功能测试
- 模拟不同场景(授权/拒绝授权、地址变更、骑手延迟)。
- 验证配送时间计算和路径规划的准确性。
2. 压力测试
- 使用JMeter模拟1000+并发订单,检查系统响应时间。
3. 监控与日志
- 部署Prometheus + Grafana监控服务器性能。
- 记录关键操作日志(如订单分配、位置上报)。
五、示例代码片段
1. 小程序端获取位置
```javascript
// pages/address/address.js
Page({
getLocation() {
wx.getLocation({
type: gcj02,
success: (res) => {
const { latitude, longitude } = res;
wx.request({
url: https://your-api.com/api/location,
method: POST,
data: { latitude, longitude },
success: () => {
wx.showToast({ title: 位置已更新 });
}
});
}
});
}
});
```
2. 后端订单分配逻辑(Node.js示例)
```javascript
app.post(/api/orders, async (req, res) => {
const { userId, latitude, longitude } = req.body;
// 1. 查询附近骑手
const riders = await Rider.find({
location: { $near: { $geometry: { type: Point, coordinates: [longitude, latitude] } } }
});
// 2. 分配最优骑手(简化逻辑)
const bestRider = riders[0];
// 3. 创建订单
const order = await Order.create({ userId, riderId: bestRider.id, status: assigned });
res.json(order);
});
```
六、注意事项
- 地图API选择:高德/腾讯地图对国内地址支持更好,Google Maps需备案。
- 配送范围:在商家设置中定义可配送区域(多边形坐标)。
- 费用计算:根据距离或时段动态调整配送费。
通过以上步骤,可实现生鲜小程序的精准地理位置授权与配送系统集成。如需进一步优化,可考虑引入AI算法(如动态定价、骑手路径优化)。