diff --git a/src/components/common/HoverPreview.vue b/src/components/common/HoverPreview.vue
new file mode 100644
index 0000000..480820c
--- /dev/null
+++ b/src/components/common/HoverPreview.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/dashboard/LogPanel.vue b/src/components/dashboard/LogPanel.vue
index db92a40..fd4ec21 100644
--- a/src/components/dashboard/LogPanel.vue
+++ b/src/components/dashboard/LogPanel.vue
@@ -3,6 +3,7 @@ import { ref, computed, watch, nextTick } from 'vue'
import { useLogs } from '../../stores/useLogs'
import { mqttGetLogDir } from '../../stores/useMqttBridge'
import { prettyJson } from '../../utils/format'
+import HoverPreview from '../common/HoverPreview.vue'
import { ElMessage } from 'element-plus'
const { logs, clear } = useLogs()
@@ -122,7 +123,7 @@ function eventIcon(event: string): string {
{{ expandedDetails.has(log.id) ? '收起' : '详情' }}
- {{ prettyJson(log.details) }}
+ {{ prettyJson(log.details) }}
diff --git a/src/components/dashboard/MessageStream.vue b/src/components/dashboard/MessageStream.vue
index 13959c9..cdeddd5 100644
--- a/src/components/dashboard/MessageStream.vue
+++ b/src/components/dashboard/MessageStream.vue
@@ -2,6 +2,7 @@
import { ref, watch, nextTick } from 'vue'
import type { MqttMessage } from '../../types/mqtt'
import { prettyJson, isJson, truncate } from '../../utils/format'
+import HoverPreview from '../common/HoverPreview.vue'
const props = defineProps<{
messages: MqttMessage[]
@@ -168,8 +169,10 @@ function formatTime(ts: number): string {
{{ formatPayload(msg) }}
- {{ truncate(prettyJson(msg.payload), 200) }}
+ >{{ formatPayload(msg) }}
+
+ {{ truncate(prettyJson(msg.payload), 200) }}
+
diff --git a/src/components/presets/PresetList.vue b/src/components/presets/PresetList.vue
index a1bcd55..616e39f 100644
--- a/src/components/presets/PresetList.vue
+++ b/src/components/presets/PresetList.vue
@@ -4,6 +4,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import type { Preset } from '../../types/mqtt'
import { usePresets } from '../../stores/usePresets'
import { prettyJson, truncate } from '../../utils/format'
+import HoverPreview from '../common/HoverPreview.vue'
import PresetForm from './PresetForm.vue'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -77,7 +78,9 @@ const qosLabel = (qos: number) => `QoS ${qos}`
- {{ truncate(prettyJson(row.payloadTemplate), 50) }}
+
+ {{ truncate(prettyJson(row.payloadTemplate), 50) }}
+