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 @@ -