+
+ 站点: {{ viewing.siteId }}
+ 版本: {{ viewing.version }}
+ 提交者: {{ viewing.submitterId || '-' }}
+
+
+
+ 关闭
+
+
@@ -27,6 +42,9 @@ import api from '../api'
const pendingConfigs = ref([])
const loading = ref(false)
+const viewVisible = ref(false)
+const viewing = ref({})
+const configContent = ref('')
const fetchPending = async () => {
loading.value = true
@@ -40,6 +58,48 @@ const fetchPending = async () => {
}
}
+const handleView = async (row) => {
+ viewing.value = row
+ configContent.value = ''
+ viewVisible.value = true
+ try {
+ const res = await api.configs.download(row.siteId, row.version)
+ configContent.value = typeof res === 'string' ? res : JSON.stringify(res, null, 2)
+ } catch {
+ configContent.value = '(加载失败)'
+ }
+}
+
+const highlightedJson = computed(() => {
+ try {
+ const obj = JSON.parse(configContent.value)
+ return syntaxHighlight(JSON.stringify(obj, null, 2))
+ } catch {
+ return escapeHtml(configContent.value)
+ }
+})
+
+const syntaxHighlight = (json) => {
+ return escapeHtml(json).replace(
+ /("(\\u[a-fA-F0-9]{4}|\\[^u]|[^"\\])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,
+ (match) => {
+ let cls = 'number'
+ if (/^"/.test(match)) {
+ cls = /:$/.test(match) ? 'key' : 'string'
+ } else if (/true|false/.test(match)) {
+ cls = 'boolean'
+ } else if (/null/.test(match)) {
+ cls = 'null'
+ }
+ return `