Browse Source

平台样式、标牌样式存redis

mh
menghao 1 month ago
parent
commit
46b77da38b
  1. 39
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/RoutesController.java
  2. 26
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
  3. 18
      ruoyi-ui/src/api/system/routes.js
  4. 208
      ruoyi-ui/src/views/cesiumMap/index.vue

39
ruoyi-admin/src/main/java/com/ruoyi/web/controller/RoutesController.java

@ -20,6 +20,9 @@ import com.ruoyi.system.domain.Routes;
import com.ruoyi.system.service.IRoutesService; import com.ruoyi.system.service.IRoutesService;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.domain.dto.PlatformStyleDTO;
import com.alibaba.fastjson2.JSON;
import org.springframework.data.redis.core.RedisTemplate;
/** /**
* 实体部署与航线Controller * 实体部署与航线Controller
@ -34,6 +37,42 @@ public class RoutesController extends BaseController
@Autowired @Autowired
private IRoutesService routesService; private IRoutesService routesService;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 保存平台样式到 Redis
*/
@PreAuthorize("@ss.hasPermi('system:routes:edit')")
@PostMapping("/savePlatformStyle")
public AjaxResult savePlatformStyle(@RequestBody PlatformStyleDTO dto)
{
if (dto.getRoomId() == null || dto.getRouteId() == null || dto.getPlatformId() == null) {
return AjaxResult.error("参数不完整");
}
String key = "room:" + dto.getRoomId() + ":route:" + dto.getRouteId() + ":platforms";
redisTemplate.opsForHash().put(key, String.valueOf(dto.getPlatformId()), JSON.toJSONString(dto));
return success();
}
/**
* Redis 获取平台样式
*/
@PreAuthorize("@ss.hasPermi('system:routes:query')")
@GetMapping("/getPlatformStyle")
public AjaxResult getPlatformStyle(PlatformStyleDTO dto)
{
if (dto.getRoomId() == null || dto.getRouteId() == null || dto.getPlatformId() == null) {
return AjaxResult.error("参数不完整");
}
String key = "room:" + dto.getRoomId() + ":route:" + dto.getRouteId() + ":platforms";
Object val = redisTemplate.opsForHash().get(key, String.valueOf(dto.getPlatformId()));
if (val != null) {
return success(JSON.parseObject(val.toString(), PlatformStyleDTO.class));
}
return success();
}
/** /**
* 查询实体部署与航线列表 * 查询实体部署与航线列表
*/ */

26
ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java

@ -25,7 +25,31 @@ public class RedisConfig extends CachingConfigurerSupport
RedisTemplate<Object, Object> template = new RedisTemplate<>(); RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory); template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); FastJson2JsonRedisSerializer<Object> serializer = new FastJson2JsonRedisSerializer<>(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
/**
* 配置 RedisTemplate<String, Object>
* 解决 RoutesController 中注入 RedisTemplate<String, Object> 失败的问题
*/
@Bean
public RedisTemplate<String, Object> stringObjectRedisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer<Object> serializer = new FastJson2JsonRedisSerializer<>(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值 // 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer()); template.setKeySerializer(new StringRedisSerializer());

18
ruoyi-ui/src/api/system/routes.js

@ -42,3 +42,21 @@ export function delRoutes(id) {
method: 'delete' method: 'delete'
}) })
} }
// 保存平台样式
export function savePlatformStyle(data) {
return request({
url: '/system/routes/savePlatformStyle',
method: 'post',
data: data
})
}
// 获取平台样式
export function getPlatformStyle(query) {
return request({
url: '/system/routes/getPlatformStyle',
method: 'get',
params: query
})
}

208
ruoyi-ui/src/views/cesiumMap/index.vue

@ -169,6 +169,8 @@ import RadiusDialog from '../dialogs/RadiusDialog.vue'
import axios from 'axios' import axios from 'axios'
import request from '@/utils/request' import request from '@/utils/request'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { savePlatformStyle, getRoutes, getPlatformStyle } from '@/api/system/routes'
export default { export default {
name: 'CesiumMap', name: 'CesiumMap',
props: { props: {
@ -295,6 +297,8 @@ export default {
// 线 prop routeLocked // 线 prop routeLocked
// 线{ platformInfo: { platformId, platform }, mode: 'before'|'after' } // 线{ platformInfo: { platformId, platform }, mode: 'before'|'after' }
platformRouteDrawing: null, platformRouteDrawing: null,
// 线routeId -> { labelFontSize, labelFontColor, platformSize, platformColor }
platformCustomStyles: {},
// //
defaultStyles: { defaultStyles: {
point: { color: '#FF0000', size: 12 }, point: { color: '#FF0000', size: 12 },
@ -367,6 +371,27 @@ export default {
LocateDialog, LocateDialog,
RadiusDialog RadiusDialog
}, },
watch: {
// routeLabelVisible 线
//
routeLabelVisible: {
handler(newVal) {
// 使 debounce setTimeout
if (this.applyStylesTimer) clearTimeout(this.applyStylesTimer);
this.applyStylesTimer = setTimeout(() => {
this.applyRedisPlatformStyles();
}, 300);
},
deep: true
},
// allEntities
allEntities(newVal) {
if (this.applyStylesTimer) clearTimeout(this.applyStylesTimer);
this.applyStylesTimer = setTimeout(() => {
this.applyRedisPlatformStyles();
}, 500);
}
},
mounted() { mounted() {
console.log(this.drawDomClick,999999) console.log(this.drawDomClick,999999)
// this.initMap() // this.initMap()
@ -1616,7 +1641,10 @@ export default {
id: platformBillboardId, id: platformBillboardId,
name: (platform && platform.name) || '平台', name: (platform && platform.name) || '平台',
position: originalPositions[0], position: originalPositions[0],
properties: { routeId: routeId }, properties: {
routeId: routeId,
platformId: (platform && platform.id) || 0
},
billboard: { billboard: {
image: fullUrl, image: fullUrl,
width: 144, width: 144,
@ -1636,6 +1664,15 @@ export default {
if (target && target.billboard) { if (target && target.billboard) {
target.billboard.image = whiteImage; target.billboard.image = whiteImage;
// target.billboard.color BLACK线 // target.billboard.color BLACK线
// Redis applyRedisPlatformStyles
if (this.platformCustomStyles && this.platformCustomStyles[routeId]) {
const style = this.platformCustomStyles[routeId];
if (style.platformColor) {
target.billboard.color = Cesium.Color.fromCssColorString(style.platformColor);
}
}
// //
if (this.viewer.scene.requestRenderMode) { if (this.viewer.scene.requestRenderMode) {
@ -2327,9 +2364,18 @@ export default {
if (!labelEntity.labelDataCache) labelEntity.labelDataCache = {}; if (!labelEntity.labelDataCache) labelEntity.labelDataCache = {};
Object.assign(labelEntity.labelDataCache, labelData); Object.assign(labelEntity.labelDataCache, labelData);
if (labelEntity.billboard) { // 使 Redis 使 routeLabelStyles
const style = this.routeLabelStyles[routeId] || { fontSize: 16, fontColor: '#000000' }; const customStyle = this.platformCustomStyles[routeId];
let style = { fontSize: 16, fontColor: '#000000' };
if (customStyle) {
style.fontSize = customStyle.labelFontSize || 16;
style.fontColor = customStyle.labelFontColor || '#000000';
} else if (this.routeLabelStyles[routeId]) {
style = this.routeLabelStyles[routeId];
}
if (labelEntity.billboard) {
// //
const displayData = { const displayData = {
name: labelData.name || '平台', name: labelData.name || '平台',
@ -2720,12 +2766,29 @@ export default {
const idStr = typeof pickedEntity.id === 'string' ? pickedEntity.id : (pickedEntity.id || '') const idStr = typeof pickedEntity.id === 'string' ? pickedEntity.id : (pickedEntity.id || '')
let entityData = null let entityData = null
// 线/ // 线/
if (idStr.startsWith('route-platform-') && !idStr.startsWith('route-platform-label-')) { if (idStr.startsWith('route-platform-')) {
const routeId = idStr.replace('route-platform-', '') const routeId = idStr.replace('route-platform-', '').replace('route-platform-label-', '')
// platformId platformName
// entity.properties
let platformId = 0
let platformName = '平台'
if (pickedEntity.properties) {
const now = Cesium.JulianDate.now();
//
if (pickedEntity.properties.platformId) {
platformId = pickedEntity.properties.platformId.getValue ? pickedEntity.properties.platformId.getValue(now) : pickedEntity.properties.platformId
}
if (pickedEntity.properties.platformName) {
platformName = pickedEntity.properties.platformName.getValue ? pickedEntity.properties.platformName.getValue(now) : pickedEntity.properties.platformName
}
}
entityData = { entityData = {
type: 'routePlatform', type: 'routePlatform',
routeId, routeId,
entity: pickedEntity, entity: pickedEntity,
platformId,
platformName,
labelVisible: this.routeLabelVisible[routeId] !== false labelVisible: this.routeLabelVisible[routeId] !== false
} }
} }
@ -5274,6 +5337,17 @@ export default {
const platformEntity = this.viewer.entities.getById(`route-platform-${routeId}`) const platformEntity = this.viewer.entities.getById(`route-platform-${routeId}`)
let iconSize = 144 let iconSize = 144
let iconColor = '#ffffff' let iconColor = '#ffffff'
let platformName = '平台' //
//
if (labelEntity && labelEntity.label && labelEntity.label.text) {
const now = Cesium.JulianDate.now()
const text = labelEntity.label.text.getValue ? labelEntity.label.text.getValue(now) : labelEntity.label.text
if (text) platformName = text
} else if (ed.platformName) {
platformName = ed.platformName
}
if (platformEntity && platformEntity.billboard) { if (platformEntity && platformEntity.billboard) {
const now = Cesium.JulianDate.now() const now = Cesium.JulianDate.now()
const widthValue = platformEntity.billboard.width && platformEntity.billboard.width.getValue const widthValue = platformEntity.billboard.width && platformEntity.billboard.width.getValue
@ -5294,6 +5368,23 @@ export default {
this.editPlatformForm.fontColor = fontColor this.editPlatformForm.fontColor = fontColor
this.editPlatformForm.iconSize = iconSize this.editPlatformForm.iconSize = iconSize
this.editPlatformForm.iconColor = iconColor this.editPlatformForm.iconColor = iconColor
this.editPlatformForm.platformName = platformName
this.editPlatformForm.platformId = ed.platformId || 0
// 线 platformId platformName
if (routeId) {
getRoutes(routeId).then(response => {
const route = response.data;
if (route && route.platformId) {
this.editPlatformForm.platformId = route.platformId;
if (route.platform && route.platform.name) {
this.editPlatformForm.platformName = route.platform.name;
}
}
}).catch(err => {
console.error("获取航线信息失败", err);
});
}
this.contextMenu.visible = false this.contextMenu.visible = false
this.editPlatformDialogVisible = true this.editPlatformDialogVisible = true
@ -5352,6 +5443,35 @@ export default {
platformEntity.billboard.height = size platformEntity.billboard.height = size
platformEntity.billboard.color = Cesium.Color.fromCssColorString(color) platformEntity.billboard.color = Cesium.Color.fromCssColorString(color)
} }
//
this.$set(this.platformCustomStyles, routeId, {
labelFontSize: fontSize,
labelFontColor: fontColor,
platformSize: Math.max(48, Math.min(256, Number(this.editPlatformForm.iconSize) || 144)),
platformColor: this.editPlatformForm.iconColor || '#ffffff'
});
// Redis
const currentRoomId = this.$route.query.roomId || (this.$parent && this.$parent.currentRoomId);
if (currentRoomId) {
const styleData = {
roomId: String(currentRoomId),
routeId: routeId,
platformId: this.editPlatformForm.platformId, // openEditPlatformDialog platformId
platformName: this.editPlatformForm.platformName, // openEditPlatformDialog platformName
labelFontSize: fontSize,
labelFontColor: fontColor,
platformSize: Math.max(48, Math.min(256, Number(this.editPlatformForm.iconSize) || 144)),
platformColor: this.editPlatformForm.iconColor || '#ffffff'
};
savePlatformStyle(styleData).then(() => {
// console.log("");
}).catch(err => {
console.error("样式保存失败", err);
});
}
if (this.viewer.scene && this.viewer.scene.requestRenderMode) { if (this.viewer.scene && this.viewer.scene.requestRenderMode) {
this.viewer.scene.requestRender() this.viewer.scene.requestRender()
@ -5434,6 +5554,84 @@ export default {
this.contextMenu.visible = false this.contextMenu.visible = false
} }
}, },
/**
* 批量获取并应用航线平台样式Redis
* 遍历 allEntities 中的所有航线平台调用 getPlatformStyle
*/
applyRedisPlatformStyles() {
// roomId
const currentRoomId = this.$route.query.roomId || (this.$parent && this.$parent.currentRoomId);
if (!currentRoomId) return;
// 线
const entities = this.viewer.entities.values;
for (const entity of entities) {
const idStr = entity.id || '';
if (idStr.startsWith('route-platform-') && !idStr.startsWith('route-platform-label-')) {
const routeId = idStr.replace('route-platform-', '');
// platformId
let platformId = 0;
if (entity.properties && entity.properties.platformId) {
const now = Cesium.JulianDate.now();
platformId = entity.properties.platformId.getValue ? entity.properties.platformId.getValue(now) : entity.properties.platformId;
}
// platformId
if (Number(platformId) > 0) {
getPlatformStyle({
roomId: currentRoomId,
routeId: routeId,
platformId: platformId
}).then(res => {
if (res.data) {
const style = res.data;
//
this.$set(this.platformCustomStyles, routeId, {
labelFontSize: style.labelFontSize,
labelFontColor: style.labelFontColor,
platformSize: style.platformSize,
platformColor: style.platformColor
});
//
const labelEntity = this.viewer.entities.getById(`route-platform-label-${routeId}`);
if (labelEntity) {
// updatePlatformPosition
// updatePlatformPosition 使
this.$set(this.routeLabelStyles, routeId, {
fontSize: style.labelFontSize || 16,
fontColor: style.labelFontColor || '#333333'
});
//
if (labelEntity.labelDataCache) {
//
labelEntity._lastUpdateTime = 0;
this.updatePlatformPosition(routeId, entity.position.getValue(Cesium.JulianDate.now()), null, labelEntity.labelDataCache);
}
}
//
if (entity.billboard) {
const size = Math.max(48, Math.min(256, Number(style.platformSize) || 144));
const color = style.platformColor || '#ffffff';
entity.billboard.width = size;
entity.billboard.height = size;
entity.billboard.color = Cesium.Color.fromCssColorString(color);
}
if (this.viewer.scene.requestRenderMode) {
this.viewer.scene.requestRender();
}
}
});
}
}
}
},
// //
updateEntityProperty(property, value) { updateEntityProperty(property, value) {
if (this.contextMenu.entityData) { if (this.contextMenu.entityData) {

Loading…
Cancel
Save