---
一、核心功能设计
1. 离线下单能力
- 本地数据库:使用SQLite/IndexedDB存储订单数据(商品ID、数量、用户信息等)。
- 队列机制:将订单请求存入本地队列(如RxJS的`ReplaySubject`或Android的`Room`+`WorkManager`)。
- 状态标记:为订单添加`pending`状态,网络恢复前允许用户浏览但禁止重复提交。
2. 网络恢复检测
- 监听网络状态:
- 前端:通过`navigator.onLine`(Web)或`ConnectivityManager`(Android)监听。
- 后端:部署心跳检测接口,客户端定时调用确认连通性。
- 触发同步:网络恢复时,自动从队列中取出`pending`订单发起请求。
3. 数据同步策略
- 增量同步:仅同步队列中未完成的订单,避免全量数据冲突。
- 冲突处理:
- 乐观锁:后端订单表加`version`字段,更新时校验版本号。
- 客户端优先:若后端订单已变更(如库存不足),返回冲突信息,提示用户确认。
---
二、万象源码部署要点
假设万象源码提供基础离线框架,需按以下步骤扩展:
1. 本地存储集成
- 初始化数据库:
```javascript
// 示例:使用Dexie.js(IndexedDB封装)
const db = new Dexie(OfflineOrders);
db.version(1).stores({
orders: ++id, status, timestamp, // 自增ID、状态、时间戳
items: ++id, orderId, productId, quantity // 订单项关联
});
```
2. 订单队列管理
- 添加订单到队列:
```javascript
async function addToQueue(orderData) {
await db.orders.add({ ...orderData, status: pending });
checkNetworkAndSync();
}
```
3. 网络恢复后同步
- 监听网络事件:
```javascript
window.addEventListener(online, async () => {
const pendingOrders = await db.orders.where(status).equals(pending).toArray();
await Promise.all(pendingOrders.map(syncOrder));
});
```
- 同步单个订单:
```javascript
async function syncOrder(order) {
try {
const response = await fetch(/api/orders, {
method: POST,
body: JSON.stringify(order)
});
if (response.ok) {
await db.orders.update(order.id, { status: completed });
}
} catch (error) {
// 保留在队列中,下次重试
}
}
```
4. 后端接口设计
- 接收离线订单:
```python
Flask示例
@app.route(/api/orders, methods=[POST])
def create_order():
data = request.json
校验库存、用户信息等
if check_inventory(data[items]):
order_id = save_to_db(data)
return jsonify({id: order_id}), 201
else:
return jsonify({error: 库存不足}), 400
```
---
三、部署与测试
1. 环境准备
- 前端:PWA配置(Service Worker缓存静态资源)。
- 后端:部署在支持HTTPS的服务器(如Nginx + Docker)。
- 数据库:确保后端数据库(如MySQL)支持高并发写入。
2. 测试场景
- 离线下单:关闭网络,提交订单,验证本地存储是否成功。
- 网络恢复:重新联网后,检查订单是否自动同步且状态更新。
- 冲突测试:模拟后端库存变化,验证客户端提示逻辑。
---
四、优化建议
1. 批量同步:网络恢复时,合并多个订单为一个请求减少开销。
2. 用户通知:同步成功后通过Toast/Push通知用户。
3. 数据清理:同步完成后删除本地已完成的订单(保留30天备查)。
---
五、参考工具
- 前端:Dexie.js(IndexedDB)、Workbox(Service Worker)。
- 后端:Node.js + Express/Python Flask、Redis缓存库存。
- 移动端:Android Room + WorkManager、iOS Core Data + Background Fetch。
通过以上方案,生鲜App可在离线时正常下单,网络恢复后无缝同步,保障用户体验和数据一致性。