
1) 【一句话结论】
核心是通过RESTful API结合WebSocket实现实时库存数据获取与地图展示,前端采用标记聚类、本地缓存、心跳机制优化低延迟与性能,并考虑权限控制与断线重连保障数据一致性。
2) 【原理/概念讲解】
老师:我们来拆解每个环节的关键点。
/api/inventory,GET请求需携带product(如“豆油”)、location(仓库ID)和userId(用户ID)参数,后端通过JWT验证userId权限(如管理员可查全量数据,普通用户仅查自身权限内仓库),并验证参数格式(如product非空)。返回JSON包含id、product、quantity(库存量)、location(坐标)、updateTime、version(缓存版本号)等字段。ws://api.9377.com/ws/inventory?userId=123),后端推送变化数据(如{"id":1,"quantity":520,"version":2}),前端监听消息实时更新标记。/api/inventory/{id}请求获取单点库存详情(优化加载性能,仅请求必要数据)。localStorage),存储数据时带版本号,当版本号变化时触发缓存失效,减少重复请求。3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 轮询 | 定期向服务器发送请求(如每秒一次) | 单向请求,服务器响应 | 库存更新频率低(如每分钟一次) | 可能造成服务器压力,实时性差 |
| WebSocket | 双向通信通道,持久连接 | 实时双向,低延迟 | 库存更新频繁(如秒级) | 需要服务器支持,连接管理复杂 |
| Server-Sent Events (SSE) | 单向从服务器推送数据 | 服务器主动推送,客户端接收 | 需要服务器主动推送,如库存实时更新 | 仅支持单向,不支持客户端主动请求 |
4) 【示例】
GET /api/inventory?product=豆油&location=仓库A&userId=123(假设JWT已验证userId=123权限){
"id": 1,
"product": "豆油",
"quantity": 500,
"location": {"lat": 30.5, "lng": 120.1},
"updateTime": "2024-01-15T10:30:00Z",
"version": 1
}
inventory_豆油_仓库A_1(版本1,5分钟后失效)。{"id":1,"product":"豆油","quantity":520,"version":2}// 注册Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => {
console.log('Service Worker registered');
});
}
// sw.js内容:缓存静态资源
self.addEventListener('install', event => {
event.waitUntil(
caches.open('inventory-cache').then(cache => {
return cache.addAll([
'/api/inventory',
'/map.css',
'/marker.png'
]);
})
);
});
5) 【面试口播版答案】
面试官您好,针对农产品加工系统的库存地图展示需求,我的思路是:
首先,API用RESTful设计,比如GET /api/inventory?product=豆油&location=仓库A&userId=123(通过JWT验证权限),返回库存量、位置等数据。然后实时更新用WebSocket,建立持久连接,后端推送变化数据,前端实时更新地图标记。数据展示用地图组件,标记显示库存量,位置对应仓库,点击标记时通过单点API请求获取详情(优化加载)。低延迟通过WebSocket,缓存5分钟(带版本号),标记聚类减少渲染。性能优化包括离线缓存(Service Worker)、心跳机制(检测连接状态),并实现断线重连(指数退避策略)。
6) 【追问清单】
location参数)或用户权限动态获取对应仓库的库存数据。7) 【常见坑/雷区】