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.
205 lines
23 KiB
205 lines
23 KiB
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
|
|
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate, 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 backendReady = ref(true);
|
|
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-97419e3c>`);
|
|
if (!backendReady.value) {
|
|
_push(`<div class="mb-4 rounded-lg px-4 py-3 text-sm" style="${ssrRenderStyle({ "background": "#fffbeb", "border": "1px solid #fde68a", "color": "#92400e" })}" data-v-97419e3c> ⚠ 「依赖服务配置」的后端接口尚未迁移到当前 console 服务,功能暂不可用。 </div>`);
|
|
} else {
|
|
_push(`<!---->`);
|
|
}
|
|
_push(`<div class="flex items-center justify-between mb-5" data-v-97419e3c><div data-v-97419e3c><h2 class="text-lg font-semibold text-slate-800" data-v-97419e3c>依赖服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-97419e3c>配置火山引擎、阿里云等第三方服务;字段支持加密存储。默认配置全区域共用,可按区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-97419e3c><select class="select select-bordered select-sm" data-v-97419e3c><option${ssrRenderAttr("value", 0)} data-v-97419e3c${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-97419e3c${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-97419e3c>+ 新增服务</button></div></div><div class="flex gap-4" style="${ssrRenderStyle({ "align-items": "flex-start" })}" data-v-97419e3c><div style="${ssrRenderStyle({ "width": "248px", "flex-shrink": "0" })}" data-v-97419e3c><div class="flex flex-col gap-2" data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(allSvcs.value, (s) => {
|
|
_push(`<div class="${ssrRenderClass([{ active: curSvc.value && curSvc.value.id === s.id }, "svc-item"])}" data-v-97419e3c><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-97419e3c>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-97419e3c><div class="flex items-center gap-2" data-v-97419e3c><span class="font-semibold text-slate-800 text-sm truncate" data-v-97419e3c>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "badge-success" : "badge-ghost", "badge badge-xs"])}" data-v-97419e3c>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><div class="flex flex-wrap gap-1 mt-1" data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(parseCats(s.categories), (v) => {
|
|
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(v).color, background: scatInfo(v).bg })}" data-v-97419e3c>${ssrInterpolate(scatInfo(v).short)}</span>`);
|
|
});
|
|
_push(`<!--]-->`);
|
|
if (encCount(s)) {
|
|
_push(`<span class="lock-badge" data-v-97419e3c>🔒${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-97419e3c>暂无服务</p>`);
|
|
} else {
|
|
_push(`<!---->`);
|
|
}
|
|
_push(`</div></div><div class="flex-1 min-w-0" data-v-97419e3c><div class="bg-white rounded-2xl border border-slate-100 shadow-sm p-6" data-v-97419e3c>`);
|
|
if (detailMode.value === "empty") {
|
|
_push(`<div class="text-center text-slate-300 py-20" data-v-97419e3c><div class="text-5xl mb-3" data-v-97419e3c>⚙️</div><p class="text-sm" data-v-97419e3c>从左侧选择一个服务开始配置</p></div>`);
|
|
} else if (detailMode.value === "default" && curSvc.value) {
|
|
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-97419e3c><div class="flex items-center gap-3" data-v-97419e3c><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-97419e3c>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-97419e3c><h3 class="text-base font-semibold text-slate-800" data-v-97419e3c>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-97419e3c>${ssrInterpolate(curSvc.value.id)}</p></div></div><div class="flex gap-2" data-v-97419e3c><button class="btn btn-error btn-sm btn-outline" data-v-97419e3c>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-97419e3c>保存</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-97419e3c>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-97419e3c><div class="form-control" data-v-97419e3c><label class="label" data-v-97419e3c><span class="label-text" data-v-97419e3c>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-97419e3c></div><div class="form-control" data-v-97419e3c><label class="label" data-v-97419e3c><span class="label-text" data-v-97419e3c>启用</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-97419e3c></div></div><div class="form-control mb-4" data-v-97419e3c><label class="label" data-v-97419e3c><span class="label-text" data-v-97419e3c>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-97419e3c></div><div class="mb-4" data-v-97419e3c><p class="text-sm font-medium text-slate-700 mb-2" data-v-97419e3c>服务类别 <span class="text-slate-400 text-xs" data-v-97419e3c>(可多选)</span></p><div class="flex flex-wrap gap-3" data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(SCAT, (sc) => {
|
|
_push(`<label class="flex items-center gap-2 cursor-pointer" data-v-97419e3c><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-97419e3c><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-97419e3c>${ssrInterpolate(sc.short)}</span><span class="text-xs text-slate-600" data-v-97419e3c>${ssrInterpolate(sc.label)}</span></label>`);
|
|
});
|
|
_push(`<!--]--></div></div><div class="divider text-xs text-slate-400 my-3" data-v-97419e3c>自定义字段</div><div data-v-97419e3c>`);
|
|
if (!editFields.value.length) {
|
|
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-97419e3c>尚无自定义字段,点击下方添加</p>`);
|
|
} else {
|
|
_push(`<div class="overflow-x-auto" data-v-97419e3c><table class="table text-xs" data-v-97419e3c><thead data-v-97419e3c><tr data-v-97419e3c><th class="w-32" data-v-97419e3c>字段名</th><th data-v-97419e3c>字段描述</th><th class="w-16 text-center" data-v-97419e3c>加密</th><th data-v-97419e3c>默认值</th><th class="w-12" data-v-97419e3c></th></tr></thead><tbody data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(editFields.value, (f, i) => {
|
|
_push(`<tr data-v-97419e3c><td data-v-97419e3c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key" data-v-97419e3c></td><td data-v-97419e3c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-97419e3c></td><td class="text-center" data-v-97419e3c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-97419e3c></td><td data-v-97419e3c>`);
|
|
if (f.encrypted) {
|
|
_push(`<!--[--><div class="relative" data-v-97419e3c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-97419e3c><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-97419e3c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-97419e3c>🔒 加密</span><!--]-->`);
|
|
} else {
|
|
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-97419e3c>`);
|
|
}
|
|
_push(`</td><td data-v-97419e3c><button class="btn btn-ghost btn-xs text-error" data-v-97419e3c>×</button></td></tr>`);
|
|
});
|
|
_push(`<!--]--></tbody></table></div>`);
|
|
}
|
|
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-97419e3c>+ 添加字段</button></div><!--]-->`);
|
|
} else if (detailMode.value === "new") {
|
|
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-97419e3c><h3 class="text-base font-semibold text-slate-800" data-v-97419e3c>新增依赖服务</h3><div class="flex gap-2" data-v-97419e3c><button class="btn btn-ghost btn-sm" data-v-97419e3c>取消</button><button class="btn btn-primary btn-sm text-white" data-v-97419e3c>创建</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-97419e3c>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-97419e3c><div class="form-control" data-v-97419e3c><label class="label" data-v-97419e3c><span class="label-text" data-v-97419e3c>服务ID * <span class="text-slate-400 text-xs" data-v-97419e3c>(唯一,如 volcengine)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="volcengine" data-v-97419e3c></div><div class="form-control" data-v-97419e3c><label class="label" data-v-97419e3c><span class="label-text" data-v-97419e3c>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="火山引擎" data-v-97419e3c></div></div><div class="form-control mb-4" data-v-97419e3c><label class="label" data-v-97419e3c><span class="label-text" data-v-97419e3c>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-97419e3c></div><div class="mb-4" data-v-97419e3c><p class="text-sm font-medium text-slate-700 mb-2" data-v-97419e3c>服务类别</p><div class="flex flex-wrap gap-3" data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(SCAT, (sc) => {
|
|
_push(`<label class="flex items-center gap-2 cursor-pointer" data-v-97419e3c><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-97419e3c><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-97419e3c>${ssrInterpolate(sc.short)}</span><span class="text-xs text-slate-600" data-v-97419e3c>${ssrInterpolate(sc.label)}</span></label>`);
|
|
});
|
|
_push(`<!--]--></div></div><div class="divider text-xs text-slate-400 my-3" data-v-97419e3c>自定义字段</div><div data-v-97419e3c>`);
|
|
if (!editFields.value.length) {
|
|
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-97419e3c>尚无自定义字段,点击下方添加</p>`);
|
|
} else {
|
|
_push(`<div class="overflow-x-auto" data-v-97419e3c><table class="table text-xs" data-v-97419e3c><thead data-v-97419e3c><tr data-v-97419e3c><th class="w-32" data-v-97419e3c>字段名</th><th data-v-97419e3c>字段描述</th><th class="w-16 text-center" data-v-97419e3c>加密</th><th data-v-97419e3c>默认值</th><th class="w-12" data-v-97419e3c></th></tr></thead><tbody data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(editFields.value, (f, i) => {
|
|
_push(`<tr data-v-97419e3c><td data-v-97419e3c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key" data-v-97419e3c></td><td data-v-97419e3c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-97419e3c></td><td class="text-center" data-v-97419e3c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-97419e3c></td><td data-v-97419e3c>`);
|
|
if (f.encrypted) {
|
|
_push(`<!--[--><div class="relative" data-v-97419e3c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-97419e3c><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-97419e3c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-97419e3c>🔒 加密</span><!--]-->`);
|
|
} else {
|
|
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-97419e3c>`);
|
|
}
|
|
_push(`</td><td data-v-97419e3c><button class="btn btn-ghost btn-xs text-error" data-v-97419e3c>×</button></td></tr>`);
|
|
});
|
|
_push(`<!--]--></tbody></table></div>`);
|
|
}
|
|
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-97419e3c>+ 添加字段</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-97419e3c>加载中...</div>`);
|
|
} else {
|
|
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-97419e3c><div class="flex items-center gap-3" data-v-97419e3c><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-97419e3c>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-97419e3c><h3 class="text-base font-semibold text-slate-800" data-v-97419e3c>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-97419e3c>${ssrInterpolate(curRegionLabel.value)} 覆盖模式</span></div></div><button class="btn btn-primary btn-sm text-white" data-v-97419e3c>保存覆盖</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-97419e3c> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段覆盖值。留空的字段将继承默认值。加密字段留空保留已存储密文。 </div><div class="overflow-x-auto" data-v-97419e3c><table class="table text-xs" data-v-97419e3c><thead data-v-97419e3c><tr data-v-97419e3c><th class="w-32" data-v-97419e3c>字段名</th><th data-v-97419e3c>字段描述</th><th class="w-24 text-center" data-v-97419e3c>状态</th><th data-v-97419e3c>有效值</th></tr></thead><tbody data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(overrideFields.value, (f, i) => {
|
|
_push(`<tr data-v-97419e3c><td class="font-mono text-slate-700" data-v-97419e3c>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-97419e3c>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-97419e3c>`);
|
|
if (f.is_overridden) {
|
|
_push(`<span class="override-badge" data-v-97419e3c>覆盖</span>`);
|
|
} else {
|
|
_push(`<span class="inherit-badge" data-v-97419e3c>继承</span>`);
|
|
}
|
|
_push(`</td><td data-v-97419e3c>`);
|
|
if (f.encrypted) {
|
|
_push(`<!--[--><div class="relative" data-v-97419e3c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空继承默认" data-v-97419e3c><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-97419e3c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-97419e3c>🔒</span><!--]-->`);
|
|
} else {
|
|
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-97419e3c>`);
|
|
}
|
|
_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-97419e3c><div class="sync-box" data-v-97419e3c><div class="flex items-start gap-3 mb-4" data-v-97419e3c><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-97419e3c><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-97419e3c><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-97419e3c></path></svg></div><div data-v-97419e3c><h3 class="text-base font-semibold text-slate-800" data-v-97419e3c>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-97419e3c>${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-97419e3c>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-97419e3c><span class="text-xs font-semibold text-slate-500" data-v-97419e3c>选择目标区域</span><div class="flex gap-2" data-v-97419e3c><button class="btn btn-ghost btn-xs" data-v-97419e3c>全选</button><button class="btn btn-ghost btn-xs" data-v-97419e3c>清空</button></div></div><div class="sync-region-grid" data-v-97419e3c><!--[-->`);
|
|
ssrRenderList(syncRegionList.value, (r) => {
|
|
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-97419e3c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-97419e3c><span data-v-97419e3c>${ssrInterpolate(r.label)}</span></label>`);
|
|
});
|
|
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-97419e3c>⚠ 已勾选区域中与当前配置相同的字段将被覆盖;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-97419e3c><button class="btn btn-ghost" data-v-97419e3c>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-97419e3c>保存并同步</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-97419e3c"]]);
|
|
|
|
export { serviceconfig as default };
|
|
//# sourceMappingURL=serviceconfig-BTX37VDF.mjs.map
|
|
|