feat: 页面配置+风险规则右侧改为可编辑表格双向同步JSON编辑器

This commit is contained in:
mediabot-pt
2026-07-05 22:50:23 +08:00
parent eafdf7278a
commit b286f733dc
2 changed files with 46 additions and 20 deletions

View File

@@ -42,15 +42,25 @@
</div>
</div>
<div style="flex:1;overflow:auto;min-height:0">
<div v-if="!parsed.length" style="text-align:center;padding:40px;color:#909399">暂无页面入口</div>
<el-table v-else :data="parsed" stripe border style="font-size:13px" :row-style="{height:'42px'}">
<el-table-column prop="key" label="标识" width="100" />
<el-table-column prop="label" label="名称" width="110" />
<el-table-column prop="method" label="方法" width="70" />
<el-table-column label="完整URL" min-width="250">
<template #default="s">{{ resolveUrl(s.row.url) }}</template>
<div style="font-size:13px;font-weight:500;margin-bottom:4px">双向可视化</div>
<el-table :data="parsed" stripe border style="font-size:13px" :row-style="{height:'42px'}" v-if="parsed.length">
<el-table-column prop="key" label="key" width="100">
<template #default="s"><el-input v-model="s.row.key" size="small" @input="syncToJson"/></template>
</el-table-column>
<el-table-column prop="label" label="名称" width="110">
<template #default="s"><el-input v-model="s.row.label" size="small" @input="syncToJson"/></template>
</el-table-column>
<el-table-column prop="method" label="方法" width="80">
<template #default="s"><el-select v-model="s.row.method" size="small" @change="syncToJson"><el-option label="GET" value="GET"/><el-option label="POST" value="POST"/></el-select></template>
</el-table-column>
<el-table-column label="URL" min-width="200">
<template #default="s"><el-input v-model="s.row.url" size="small" @input="syncToJson"/></template>
</el-table-column>
<el-table-column width="50">
<template #default="s"><el-button size="small" type="danger" text @click="remove(s.$index)">×</el-button></template>
</el-table-column>
</el-table>
<div v-else style="text-align:center;padding:40px;color:#909399">暂无页面入口</div>
<div style="margin-top:8px"><el-button size="small" @click="addEntry">+ 添加</el-button></div>
</div>
</div>
@@ -93,7 +103,9 @@ const editPage = async (row) => {
catch { editorJson.value = '[]' }
}
const addEntry = () => { parsed.value.push({key:'',label:'',url:'{base}',method:'GET'}); editorJson.value = JSON.stringify(parsed.value, null, 2) }
const syncToJson = () => { editorJson.value = JSON.stringify(parsed.value, null, 2) }
const remove = (idx) => { parsed.value.splice(idx,1); syncToJson() }
const addEntry = () => { parsed.value.push({key:'',label:'',url:'{base}',method:'GET'}); syncToJson() }
const savePages = async () => {
saving.value = true
try { await api.raw.put('/sites/'+editSiteId.value+'/pages', { entries: parsed.value }); ElMessage.success('已保存'); editSiteId.value=''; fetchAll() }