明白了!让我重新整理接口设计: ## 后端接口设计文档(最终版) ### 1. 获取链接状态接口 **接口:** `GET /api/link/status?code={code}` **业务逻辑:** 1. 解密和验证code参数(包含linkId、签发时间、过期时间等) 2. 检查链接是否过期(默认24小时) 3. 从数据库查询链接当前状态 4. **如果状态不是NEW,后端自动执行刷新逻辑:** - 调用脚本端刷新:`POST http://36.138.184.60:1234/yijianwan_netfile/saveMsg?文件名=判断刷新&编号=刷新` - 设置need_refresh=true,记录refresh_time - 等待10秒(或配置的刷新等待时间) - 执行完毕后继续下面的逻辑 5. **如果状态为USING,重新获取二维码:** - 调用:`http://36.138.184.60:12345/{编号}/二维码.png?t={timestamp}` - 更新qr_created_at和qr_expire_at 6. 返回链接状态和相关信息 **前端调用方式:** ```javascript // 前端只需要调用一次,后端会自动处理刷新逻辑 const statusResponse = await fetch('/api/link/status?code=' + code); const status = await statusResponse.json(); // 根据返回的状态直接渲染对应页面 ``` **数据库操作:** - 如果状态不是NEW,设置need_refresh=true,记录refresh_time - 如果状态为USING,更新qr_created_at和qr_expire_at ### 2. 刷新接口(保留,供手动刷新使用) **接口:** `POST /api/link/refresh` **请求体:** `{ code: string }` **业务逻辑:** 1. 验证code参数 2. 调用脚本端刷新 3. 设置need_refresh=true,记录refresh_time 4. 返回等待时间 **使用时机:** - 用户在扫码页面手动点击"刷新"按钮时 ### 3. 选区接口 **接口:** `POST /api/link/select-region` **请求体:** `{ code: string, region: "Q" | "V" }` **业务逻辑:** 1. 验证code和region参数 2. 检查链接状态,只有NEW状态才能选区 3. **如果need_refresh=true,检查是否已等待10秒,否则返回423错误** 4. 调用脚本端分配空闲设备 5. 调用脚本端选区 6. 等待脚本端生成二维码 7. 更新数据库状态为USING 8. 返回二维码信息 ### 4. 轮询上号接口 **接口:** `GET /api/link/poll-login?code={code}` **业务逻辑:** 1. 验证code参数 2. 检查链接状态,只有USING状态才能轮询 3. 调用脚本端检查上号状态 4. 如果返回"已上号",更新状态为LOGGED_IN 5. 返回上号结果和资源信息 ### 5. 核心改动说明 **获取状态接口的核心逻辑:** ```java @GetMapping("/status") public ResponseEntity getStatus(@RequestParam String code) { // 1. 验证code LinkTask linkTask = validateAndGetLinkTask(code); // 2. 如果状态不是NEW,自动执行刷新 if (!"NEW".equals(linkTask.getStatus())) { // 调用脚本端刷新 scriptClient.refresh(linkTask.getCodeNo()); // 设置刷新标记和时间 linkTask.setNeedRefresh(true); linkTask.setRefreshTime(new Date()); linkTaskMapper.updateById(linkTask); // 等待10秒 try { Thread.sleep(10000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } // 3. 如果状态为USING,重新获取二维码 if ("USING".equals(linkTask.getStatus())) { long timestamp = System.currentTimeMillis(); String qrUrl = String.format("http://36.138.184.60:12345/%s/二维码.png?t=%d", linkTask.getCodeNo(), timestamp); linkTask.setQrCreatedAt(new Date()); linkTask.setQrExpireAt(new Date(System.currentTimeMillis() + 60000)); linkTaskMapper.updateById(linkTask); } // 4. 返回状态信息 return ResponseEntity.ok(buildStatusResponse(linkTask)); } ``` 这样的设计是否符合你的需求?前端只需要调用一次获取状态接口,后端会自动处理所有刷新逻辑。