You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
22 KiB

import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate, ssrRenderStyle, ssrRenderClass, ssrRenderDynamicModel } from 'vue/server-renderer';
import { u as useApi } from './useApi-B7CB0Cnn.mjs';
import { u as useToast } from './useToast-BwtTR9dH.mjs';
import { _ as _export_sfc } from './server.mjs';
import './auth-QFkCoU1C.mjs';
import 'pinia';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'perfect-debounce';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "serviceconfig",
__ssrInlineRender: true,
setup(__props) {
const REGIONS = [
{ value: 1, label: "中国" },
{ value: 2, label: "美国" },
{ value: 3, label: "东亚" },
{ value: 4, label: "东南亚" },
{ value: 5, label: "南亚" },
{ value: 6, label: "中东" },
{ value: 7, label: "欧洲" },
{ value: 8, label: "俄罗斯" },
{ value: 9, label: "非洲" },
{ value: 10, label: "南美" },
{ value: 11, label: "北美" },
{ value: 12, label: "大洋洲" },
{ value: 13, label: "巴西" },
{ value: 14, label: "印度" }
];
const SCAT = [
{ v: 1, label: "STT 语音识别", short: "STT", color: "#0369a1", bg: "#dbeafe" },
{ v: 2, label: "TTS 语音合成", short: "TTS", color: "#7c3aed", bg: "#ede9fe" },
{ v: 3, label: "MT 机器翻译", short: "MT", color: "#059669", bg: "#dcfce7" },
{ v: 4, label: "AST 端到端", short: "AST", color: "#c2410c", bg: "#fff7ed" },
{ v: 5, label: "LLM 大语言", short: "LLM", color: "#b45309", bg: "#fef9c3" },
{ v: 6, label: "存储 OSS/COS", short: "存储", color: "#475569", bg: "#f1f5f9" }
];
useApi();
useToast();
function scatInfo(v) {
return SCAT.find((s) => s.v === v) || { short: "?", color: "#999", bg: "#eee", v: 0, label: "" };
}
function parseCats(s) {
return (s || "").split(",").map((x) => parseInt(x) || 0).filter((x) => x > 0);
}
function encCount(s) {
return (s.fields || []).filter((f) => f.encrypted).length;
}
const allSvcs = ref([]);
const curSvc = ref(null);
const curRegion = ref(0);
const detailMode = ref("empty");
const editForm = reactive({ id: "", name: "", description: "", enable: false });
const editCats = ref([]);
const editFields = ref([]);
const overrideFields = ref([]);
const regionLoading = ref(false);
const curRegionLabel = computed(() => {
const r = REGIONS.find((x) => x.value === curRegion.value);
return r ? r.label : "区域" + curRegion.value;
});
const syncVisible = ref(false);
ref(false);
const syncDesc = ref("");
const syncScopeNote = ref("");
const syncTargets = ref([]);
const syncRegionList = computed(() => REGIONS.filter((r) => r.value !== curRegion.value));
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-8f55f9ae><div class="flex items-center justify-between mb-5" data-v-8f55f9ae><div data-v-8f55f9ae><h2 class="text-lg font-semibold text-slate-800" data-v-8f55f9ae>依赖服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-8f55f9ae>配置火山引擎、阿里云等第三方服务;字段支持加密存储。默认配置全区域共用,可按区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-8f55f9ae><select class="select select-bordered select-sm" data-v-8f55f9ae><option${ssrRenderAttr("value", 0)} data-v-8f55f9ae${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, 0) : ssrLooseEqual(curRegion.value, 0)) ? " selected" : ""}>默认(全区域)</option><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-8f55f9ae${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" style="${ssrRenderStyle(curRegion.value === 0 ? null : { display: "none" })}" data-v-8f55f9ae>+ 新增服务</button></div></div><div class="flex gap-4" style="${ssrRenderStyle({ "align-items": "flex-start" })}" data-v-8f55f9ae><div style="${ssrRenderStyle({ "width": "248px", "flex-shrink": "0" })}" data-v-8f55f9ae><div class="flex flex-col gap-2" data-v-8f55f9ae><!--[-->`);
ssrRenderList(allSvcs.value, (s) => {
_push(`<div class="${ssrRenderClass([{ active: curSvc.value && curSvc.value.id === s.id }, "svc-item"])}" data-v-8f55f9ae><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-8f55f9ae>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-8f55f9ae><div class="flex items-center gap-2" data-v-8f55f9ae><span class="font-semibold text-slate-800 text-sm truncate" data-v-8f55f9ae>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "badge-success" : "badge-ghost", "badge badge-xs"])}" data-v-8f55f9ae>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><div class="flex flex-wrap gap-1 mt-1" data-v-8f55f9ae><!--[-->`);
ssrRenderList(parseCats(s.categories), (v) => {
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(v).color, background: scatInfo(v).bg })}" data-v-8f55f9ae>${ssrInterpolate(scatInfo(v).short)}</span>`);
});
_push(`<!--]-->`);
if (encCount(s)) {
_push(`<span class="lock-badge" data-v-8f55f9ae>🔒${ssrInterpolate(encCount(s))}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div></div></div>`);
});
_push(`<!--]-->`);
if (!allSvcs.value.length) {
_push(`<p class="text-xs text-slate-400 text-center py-8" data-v-8f55f9ae>暂无服务</p>`);
} else {
_push(`<!---->`);
}
_push(`</div></div><div class="flex-1 min-w-0" data-v-8f55f9ae><div class="bg-white rounded-2xl border border-slate-100 shadow-sm p-6" data-v-8f55f9ae>`);
if (detailMode.value === "empty") {
_push(`<div class="text-center text-slate-300 py-20" data-v-8f55f9ae><div class="text-5xl mb-3" data-v-8f55f9ae>⚙️</div><p class="text-sm" data-v-8f55f9ae>从左侧选择一个服务开始配置</p></div>`);
} else if (detailMode.value === "default" && curSvc.value) {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8f55f9ae><div class="flex items-center gap-3" data-v-8f55f9ae><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-8f55f9ae>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-8f55f9ae><h3 class="text-base font-semibold text-slate-800" data-v-8f55f9ae>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-8f55f9ae>${ssrInterpolate(curSvc.value.id)}</p></div></div><div class="flex gap-2" data-v-8f55f9ae><button class="btn btn-error btn-sm btn-outline" data-v-8f55f9ae>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-8f55f9ae>保存</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-8f55f9ae>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8f55f9ae><div class="form-control" data-v-8f55f9ae><label class="label" data-v-8f55f9ae><span class="label-text" data-v-8f55f9ae>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-8f55f9ae></div><div class="form-control" data-v-8f55f9ae><label class="label" data-v-8f55f9ae><span class="label-text" data-v-8f55f9ae>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-8f55f9ae></div></div><div class="form-control mb-4" data-v-8f55f9ae><label class="label" data-v-8f55f9ae><span class="label-text" data-v-8f55f9ae>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-8f55f9ae></div><div class="mb-4" data-v-8f55f9ae><p class="text-sm font-medium text-slate-700 mb-2" data-v-8f55f9ae>服务类别 <span class="text-slate-400 text-xs" data-v-8f55f9ae>(可多选)</span></p><div class="flex flex-wrap gap-3" data-v-8f55f9ae><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<label class="flex items-center gap-2 cursor-pointer" data-v-8f55f9ae><input type="checkbox" class="checkbox checkbox-sm checkbox-primary"${ssrRenderAttr("value", sc.v)}${ssrIncludeBooleanAttr(Array.isArray(editCats.value) ? ssrLooseContain(editCats.value, sc.v) : editCats.value) ? " checked" : ""} data-v-8f55f9ae><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-8f55f9ae>${ssrInterpolate(sc.short)}</span><span class="text-xs text-slate-600" data-v-8f55f9ae>${ssrInterpolate(sc.label)}</span></label>`);
});
_push(`<!--]--></div></div><div class="divider text-xs text-slate-400 my-3" data-v-8f55f9ae>自定义字段</div><div data-v-8f55f9ae>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-8f55f9ae>尚无自定义字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-8f55f9ae><table class="table text-xs" data-v-8f55f9ae><thead data-v-8f55f9ae><tr data-v-8f55f9ae><th class="w-32" data-v-8f55f9ae>字段名</th><th data-v-8f55f9ae>字段描述</th><th class="w-16 text-center" data-v-8f55f9ae>加密</th><th data-v-8f55f9ae>默认值</th><th class="w-12" data-v-8f55f9ae></th></tr></thead><tbody data-v-8f55f9ae><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-8f55f9ae><td data-v-8f55f9ae><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key" data-v-8f55f9ae></td><td data-v-8f55f9ae><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8f55f9ae></td><td class="text-center" data-v-8f55f9ae><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8f55f9ae></td><td data-v-8f55f9ae>`);
if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8f55f9ae><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-8f55f9ae><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8f55f9ae>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8f55f9ae>🔒 加密</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-8f55f9ae>`);
}
_push(`</td><td data-v-8f55f9ae><button class="btn btn-ghost btn-xs text-error" data-v-8f55f9ae>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8f55f9ae>+ 添加字段</button></div><!--]-->`);
} else if (detailMode.value === "new") {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8f55f9ae><h3 class="text-base font-semibold text-slate-800" data-v-8f55f9ae>新增依赖服务</h3><div class="flex gap-2" data-v-8f55f9ae><button class="btn btn-ghost btn-sm" data-v-8f55f9ae>取消</button><button class="btn btn-primary btn-sm text-white" data-v-8f55f9ae>创建</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-8f55f9ae>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8f55f9ae><div class="form-control" data-v-8f55f9ae><label class="label" data-v-8f55f9ae><span class="label-text" data-v-8f55f9ae>服务ID * <span class="text-slate-400 text-xs" data-v-8f55f9ae>(唯一,如 volcengine)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="volcengine" data-v-8f55f9ae></div><div class="form-control" data-v-8f55f9ae><label class="label" data-v-8f55f9ae><span class="label-text" data-v-8f55f9ae>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="火山引擎" data-v-8f55f9ae></div></div><div class="form-control mb-4" data-v-8f55f9ae><label class="label" data-v-8f55f9ae><span class="label-text" data-v-8f55f9ae>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-8f55f9ae></div><div class="mb-4" data-v-8f55f9ae><p class="text-sm font-medium text-slate-700 mb-2" data-v-8f55f9ae>服务类别</p><div class="flex flex-wrap gap-3" data-v-8f55f9ae><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<label class="flex items-center gap-2 cursor-pointer" data-v-8f55f9ae><input type="checkbox" class="checkbox checkbox-sm checkbox-primary"${ssrRenderAttr("value", sc.v)}${ssrIncludeBooleanAttr(Array.isArray(editCats.value) ? ssrLooseContain(editCats.value, sc.v) : editCats.value) ? " checked" : ""} data-v-8f55f9ae><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-8f55f9ae>${ssrInterpolate(sc.short)}</span><span class="text-xs text-slate-600" data-v-8f55f9ae>${ssrInterpolate(sc.label)}</span></label>`);
});
_push(`<!--]--></div></div><div class="divider text-xs text-slate-400 my-3" data-v-8f55f9ae>自定义字段</div><div data-v-8f55f9ae>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-8f55f9ae>尚无自定义字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-8f55f9ae><table class="table text-xs" data-v-8f55f9ae><thead data-v-8f55f9ae><tr data-v-8f55f9ae><th class="w-32" data-v-8f55f9ae>字段名</th><th data-v-8f55f9ae>字段描述</th><th class="w-16 text-center" data-v-8f55f9ae>加密</th><th data-v-8f55f9ae>默认值</th><th class="w-12" data-v-8f55f9ae></th></tr></thead><tbody data-v-8f55f9ae><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-8f55f9ae><td data-v-8f55f9ae><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key" data-v-8f55f9ae></td><td data-v-8f55f9ae><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8f55f9ae></td><td class="text-center" data-v-8f55f9ae><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8f55f9ae></td><td data-v-8f55f9ae>`);
if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8f55f9ae><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-8f55f9ae><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8f55f9ae>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8f55f9ae>🔒 加密</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-8f55f9ae>`);
}
_push(`</td><td data-v-8f55f9ae><button class="btn btn-ghost btn-xs text-error" data-v-8f55f9ae>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8f55f9ae>+ 添加字段</button></div><!--]-->`);
} else if (detailMode.value === "region" && curSvc.value) {
_push(`<!--[-->`);
if (regionLoading.value) {
_push(`<div class="text-center py-10 text-slate-400" data-v-8f55f9ae>加载中...</div>`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8f55f9ae><div class="flex items-center gap-3" data-v-8f55f9ae><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-8f55f9ae>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-8f55f9ae><h3 class="text-base font-semibold text-slate-800" data-v-8f55f9ae>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-8f55f9ae>${ssrInterpolate(curRegionLabel.value)} 覆盖模式</span></div></div><button class="btn btn-primary btn-sm text-white" data-v-8f55f9ae>保存覆盖</button></div><div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-8f55f9ae> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段覆盖值。留空的字段将继承默认值。加密字段留空保留已存储密文。 </div><div class="overflow-x-auto" data-v-8f55f9ae><table class="table text-xs" data-v-8f55f9ae><thead data-v-8f55f9ae><tr data-v-8f55f9ae><th class="w-32" data-v-8f55f9ae>字段名</th><th data-v-8f55f9ae>字段描述</th><th class="w-24 text-center" data-v-8f55f9ae>状态</th><th data-v-8f55f9ae>有效值</th></tr></thead><tbody data-v-8f55f9ae><!--[-->`);
ssrRenderList(overrideFields.value, (f, i) => {
_push(`<tr data-v-8f55f9ae><td class="font-mono text-slate-700" data-v-8f55f9ae>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-8f55f9ae>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-8f55f9ae>`);
if (f.is_overridden) {
_push(`<span class="override-badge" data-v-8f55f9ae>覆盖</span>`);
} else {
_push(`<span class="inherit-badge" data-v-8f55f9ae>继承</span>`);
}
_push(`</td><td data-v-8f55f9ae>`);
if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8f55f9ae><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空继承默认" data-v-8f55f9ae><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8f55f9ae>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8f55f9ae>🔒</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-8f55f9ae>`);
}
_push(`</td></tr>`);
});
_push(`<!--]--></tbody></table></div><!--]-->`);
}
_push(`<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</div></div></div><div class="sync-overlay" style="${ssrRenderStyle(syncVisible.value ? null : { display: "none" })}" data-v-8f55f9ae><div class="sync-box" data-v-8f55f9ae><div class="flex items-start gap-3 mb-4" data-v-8f55f9ae><div style="${ssrRenderStyle({ "width": "42px", "height": "42px", "background": "linear-gradient(135deg,#4f46e5,#7c3aed)", "border-radius": "13px", "display": "flex", "align-items": "center", "justify-content": "center", "flex-shrink": "0" })}" data-v-8f55f9ae><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-8f55f9ae><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" data-v-8f55f9ae></path></svg></div><div data-v-8f55f9ae><h3 class="text-base font-semibold text-slate-800" data-v-8f55f9ae>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-8f55f9ae>${ssrInterpolate(syncDesc.value)}</p></div></div><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-8f55f9ae>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-8f55f9ae><span class="text-xs font-semibold text-slate-500" data-v-8f55f9ae>选择目标区域</span><div class="flex gap-2" data-v-8f55f9ae><button class="btn btn-ghost btn-xs" data-v-8f55f9ae>全选</button><button class="btn btn-ghost btn-xs" data-v-8f55f9ae>清空</button></div></div><div class="sync-region-grid" data-v-8f55f9ae><!--[-->`);
ssrRenderList(syncRegionList.value, (r) => {
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-8f55f9ae><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-8f55f9ae><span data-v-8f55f9ae>${ssrInterpolate(r.label)}</span></label>`);
});
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-8f55f9ae>⚠ 已勾选区域中与当前配置相同的字段将被覆盖;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-8f55f9ae><button class="btn btn-ghost" data-v-8f55f9ae>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-8f55f9ae>保存并同步</button></div></div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/serviceconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const serviceconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8f55f9ae"]]);
export { serviceconfig as default };
//# sourceMappingURL=serviceconfig-qwLggDKS.mjs.map