一、地理位置授权实现
1. 前端授权流程
- 触发授权:在用户首次进入小程序或需要定位时,调用`wx.getLocation`并设置`type: gcj02`(国测局坐标系,适配国内地图)。
```javascript
wx.getLocation({
type: gcj02,
success(res) {
const { latitude, longitude } = res;
// 调用后端接口保存坐标
saveUserLocation(latitude, longitude);
},
fail(err) {
if (err.errMsg === getLocation:fail auth denied) {
// 引导用户开启权限
wx.showModal({
title: 位置服务未开启,
content: 需要获取您的位置以提供精准配送服务,
success(modalRes) {
if (modalRes.confirm) {
wx.openSetting({}); // 跳转至设置页
}
}
});
}
}
});
```
- 权限管理:通过`wx.openSetting`引导用户手动开启权限,避免因拒绝授权导致功能失效。
2. 后端存储
- 将用户坐标(`latitude, longitude`)与用户ID关联存储至数据库(如MySQL或MongoDB),供后续配送计算使用。
二、万象地理服务集成(以腾讯云万象优图为例)
1. 地址解析(Geocoding)
- 坐标转地址:使用万象优图的逆地理编码API,将用户坐标转换为详细地址(如省市区、街道)。
```javascript
// 示例:调用腾讯云逆地理编码API
const axios = require(axios);
async function reverseGeocode(lat, lng) {
const url = `https://apis.map.qq.com/ws/geocoder/v1/?location=${lat},${lng}&key=YOUR_TENCENT_MAP_KEY`;
const response = await axios.get(url);
return response.data.result.address; // 返回详细地址
}
```
- 地址转坐标:用户输入地址时,调用正地理编码API获取坐标,确保配送点准确性。
2. 距离计算与路径规划
- 直线距离:使用Haversine公式计算用户与门店的直线距离(适用于简单筛选)。
```javascript
function haversineDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // 地球半径(km)
const dLat = (lat2 - lat1) * Math.PI / 180;
const dLon = (lon2 - lon1) * Math.PI / 180;
const a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return R * c;
}
```
- 路径规划:集成高德/腾讯地图SDK的路径规划API,计算实际配送路线及时间。
三、精准配送逻辑实现
1. 门店匹配
- 根据用户坐标,筛选附近门店(如3公里内),按距离排序。
- 结合门店库存、营业时间等条件进一步过滤。
2. 配送费计算
- 阶梯计价:按距离分段计费(如0-3km免费,3-5km 5元,5km以上每公里+2元)。
- 动态调整:高峰期或恶劣天气时,通过后端接口动态调整配送费。
3. 配送员分配
- 集成第三方配送平台(如达达、美团配送)API,实时分配订单。
- 或自建配送系统,使用贪心算法或遗传算法优化配送路径。
四、源码部署要点
1. 后端架构
- 技术栈:Node.js(Express/Koa)+ MySQL/MongoDB。
- 关键接口:
- `POST /api/location`:保存用户坐标。
- `GET /api/stores`:查询附近门店及配送信息。
- `POST /api/orders`:创建订单并触发配送逻辑。
2. 部署优化
- CDN加速:静态资源(如地图瓦片)通过CDN分发。
- 负载均衡:使用Nginx或云服务商的负载均衡服务应对高并发。
- 监控告警:集成Prometheus+Grafana监控系统性能。
五、合规与安全
1. 隐私保护
- 明确告知用户位置信息用途,遵守《个人信息保护法》。
- 提供“匿名模式”选项,允许用户隐藏精确位置。
2. 数据加密
- 传输层使用HTTPS,数据库存储时对敏感字段加密(如AES-256)。
六、测试与迭代
1. 灰度发布:先在小范围用户中测试地理位置功能,收集反馈。
2. A/B测试:对比不同配送费策略对订单量的影响。
示例代码结构:
```
/生鲜小程序项目
├── client/ 小程序前端
│ ├── pages/
│ │ ├── index/ 首页(含定位按钮)
│ │ └── order/ 订单页(显示配送信息)
│ └── utils/ 工具函数(如坐标转换)
└── server/ 后端服务
├── controllers/ 业务逻辑
├── models/ 数据库模型
└── routes/ API路由
```
通过以上方案,可实现生鲜小程序的精准地理位置服务及高效配送系统。实际开发中需根据具体业务需求调整算法和接口设计。