From d67e853223b79fea7c0075a31d007d1368eaae78 Mon Sep 17 00:00:00 2001 From: cuitw <1051735452@qq.com> Date: Wed, 11 Mar 2026 13:18:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AD=E6=AD=A5=E6=B3=95=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E5=8A=A0=E7=A9=BA=E5=9F=9F=E8=BE=85=E5=8A=A9?= =?UTF-8?q?=E7=BA=BF=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/web/controller/RoutesController.java | 39 +++ ruoyi-ui/src/api/system/routes.js | 19 + ruoyi-ui/src/utils/imageUrl.js | 14 + ruoyi-ui/src/utils/request.js | 4 + ruoyi-ui/src/views/cesiumMap/ContextMenu.vue | 42 ++- ruoyi-ui/src/views/cesiumMap/DrawingToolbar.vue | 1 + ruoyi-ui/src/views/cesiumMap/index.vue | 198 ++++++++++- ruoyi-ui/src/views/childRoom/BottomLeftPanel.vue | 82 ++++- ruoyi-ui/src/views/childRoom/SixStepsOverlay.vue | 218 +++++++++++- ruoyi-ui/src/views/childRoom/StepCanvasContent.vue | 292 ++++++++++++++-- ruoyi-ui/src/views/childRoom/TaskPageContent.vue | 157 ++++----- .../views/childRoom/UnderstandingStepContent.vue | 381 +++++++++++++++++++-- ruoyi-ui/src/views/childRoom/rollCallTemplate.js | 34 +- 13 files changed, 1310 insertions(+), 171 deletions(-) create mode 100644 ruoyi-ui/src/utils/imageUrl.js diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/RoutesController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/RoutesController.java index 5ce71d7..ff6fbc4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/RoutesController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/RoutesController.java @@ -163,6 +163,45 @@ public class RoutesController extends BaseController } /** + * 保存六步法全部数据到 Redis(任务页、理解、后五步、背景、多页等) + */ + @PreAuthorize("@ss.hasPermi('system:routes:edit')") + @PostMapping("/saveSixStepsData") + public AjaxResult saveSixStepsData(@RequestBody java.util.Map params) + { + Object roomId = params.get("roomId"); + Object data = params.get("data"); + if (roomId == null || data == null) { + return AjaxResult.error("参数不完整"); + } + String key = "room:" + String.valueOf(roomId) + ":six_steps"; + fourTRedisTemplate.opsForValue().set(key, data.toString()); + return success(); + } + + /** + * 从 Redis 获取六步法全部数据 + */ + @PreAuthorize("@ss.hasPermi('system:routes:query')") + @GetMapping("/getSixStepsData") + public AjaxResult getSixStepsData(Long roomId) + { + if (roomId == null) { + return AjaxResult.error("房间ID不能为空"); + } + String key = "room:" + String.valueOf(roomId) + ":six_steps"; + String val = fourTRedisTemplate.opsForValue().get(key); + if (val != null && !val.isEmpty()) { + try { + return success(JSON.parseObject(val)); + } catch (Exception e) { + return success(val); + } + } + return success(); + } + + /** * 获取导弹发射参数列表(Redis,房间+航线+平台为 key,值为数组,每项含 angle/distance/launchTimeMinutesFromK/startLng/startLat/platformHeadingDeg) */ @PreAuthorize("@ss.hasPermi('system:routes:query')") diff --git a/ruoyi-ui/src/api/system/routes.js b/ruoyi-ui/src/api/system/routes.js index 4a1853b..afcb27f 100644 --- a/ruoyi-ui/src/api/system/routes.js +++ b/ruoyi-ui/src/api/system/routes.js @@ -100,6 +100,25 @@ export function getTaskPageData(params) { }) } +// 保存六步法全部数据到 Redis(任务页、理解、后五步、背景、多页等) +export function saveSixStepsData(data) { + return request({ + url: '/system/routes/saveSixStepsData', + method: 'post', + data, + headers: { repeatSubmit: false } + }) +} + +// 从 Redis 获取六步法全部数据 +export function getSixStepsData(params) { + return request({ + url: '/system/routes/getSixStepsData', + method: 'get', + params + }) +} + // 获取导弹发射参数(Redis:房间+航线+平台为 key) export function getMissileParams(params) { return request({ diff --git a/ruoyi-ui/src/utils/imageUrl.js b/ruoyi-ui/src/utils/imageUrl.js new file mode 100644 index 0000000..dbd9402 --- /dev/null +++ b/ruoyi-ui/src/utils/imageUrl.js @@ -0,0 +1,14 @@ +/** + * 解析背景图/图片 URL + * - data:image/... (base64) 或 http(s):// 开头:原样返回 + * - 否则视为若依 profile 路径,拼接 base API + */ +export function resolveImageUrl(img) { + if (!img) return '' + if (img.startsWith('data:') || img.startsWith('http://') || img.startsWith('https://')) { + return img + } + const base = process.env.VUE_APP_BASE_API || '' + const path = img.startsWith('/') ? img : '/' + img + return base + path +} diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 892176c..bd92ba7 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -66,6 +66,10 @@ service.interceptors.request.use(config => { } } } + // FormData 上传时移除 Content-Type,让浏览器自动设置 multipart/form-data; boundary=... + if (config.data instanceof FormData) { + delete config.headers['Content-Type'] + } return config }, error => { console.log(error) diff --git a/ruoyi-ui/src/views/cesiumMap/ContextMenu.vue b/ruoyi-ui/src/views/cesiumMap/ContextMenu.vue index 77a7f8b..a3c4508 100644 --- a/ruoyi-ui/src/views/cesiumMap/ContextMenu.vue +++ b/ruoyi-ui/src/views/cesiumMap/ContextMenu.vue @@ -173,7 +173,7 @@ -