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.
 
 
 
 
 
 

488 lines
45 KiB

import { defineComponent, ref, reactive, computed, mergeProps, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderClass, ssrRenderComponent, ssrRenderDynamicModel } from 'vue/server-renderer';
import { _ as _export_sfc } from './server.mjs';
import { u as useApi } from './useApi-DMQewX5_.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
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 'pinia';
import 'perfect-debounce';
import './auth-QFkCoU1C.mjs';
import './useLoading-D4zrSa2m.mjs';
const LANG_OPTIONS = [
{ code: "zh-CN", name: "中文(简体)" },
{ code: "zh-TW", name: "中文(繁体)" },
{ code: "zh-HK", name: "中文(香港)" },
{ code: "yue-HK", name: "粤语" },
{ code: "en-US", name: "英语(美国)" },
{ code: "en-GB", name: "英语(英国)" },
{ code: "ja-JP", name: "日语" },
{ code: "ko-KR", name: "韩语" },
{ code: "id-ID", name: "印尼语" },
{ code: "es-ES", name: "西班牙语(西)" },
{ code: "es-MX", name: "西班牙语(墨)" },
{ code: "pt-BR", name: "葡萄牙语(巴西)" },
{ code: "pt-PT", name: "葡萄牙语(葡)" },
{ code: "de-DE", name: "德语" },
{ code: "fr-FR", name: "法语" },
{ code: "it-IT", name: "意大利语" },
{ code: "nl-NL", name: "荷兰语" },
{ code: "pl-PL", name: "波兰语" },
{ code: "ru-RU", name: "俄语" },
{ code: "uk-UA", name: "乌克兰语" },
{ code: "tr-TR", name: "土耳其语" },
{ code: "vi-VN", name: "越南语" },
{ code: "th-TH", name: "泰语" },
{ code: "ms-MY", name: "马来语" },
{ code: "fil-PH", name: "菲律宾语" },
{ code: "ar-SA", name: "阿拉伯语" }
];
function langName(code) {
const o = LANG_OPTIONS.find((x) => x.code === code);
return o ? o.name : code;
}
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "LangSelect",
__ssrInlineRender: true,
props: {
modelValue: {},
multiple: { type: Boolean, default: false },
disabled: { type: Boolean, default: false },
options: { default: void 0 }
},
emits: ["update:modelValue"],
setup(__props, { emit: __emit }) {
const props = __props;
const opts = computed(() => props.options && props.options.length ? props.options : LANG_OPTIONS);
const selected = computed(
() => (props.modelValue || "").split(",").map((s) => s.trim()).filter(Boolean)
);
function nameOf(code) {
return langName(code);
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "lang-select" }, _attrs))} data-v-4903af59>`);
if (__props.multiple) {
_push(`<!--[--><div class="${ssrRenderClass([{ "lang-disabled": __props.disabled }, "lang-chips"])}" data-v-4903af59><!--[-->`);
ssrRenderList(selected.value, (code) => {
_push(`<span class="lang-chip" data-v-4903af59>${ssrInterpolate(code)}<span class="lang-chip-name" data-v-4903af59>${ssrInterpolate(nameOf(code))}</span><button type="button" class="lang-x" data-v-4903af59>×</button></span>`);
});
_push(`<!--]-->`);
if (!selected.value.length) {
_push(`<span class="lang-empty" data-v-4903af59>未选择语言</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
if (!__props.disabled) {
_push(`<details class="lang-dd" data-v-4903af59><summary class="lang-dd-sum" data-v-4903af59>+ 选择语言(已选 ${ssrInterpolate(selected.value.length)})</summary><div class="lang-dd-panel" data-v-4903af59><!--[-->`);
ssrRenderList(opts.value, (o) => {
_push(`<label class="lang-opt" data-v-4903af59><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(selected.value.includes(o.code)) ? " checked" : ""} data-v-4903af59><span class="lang-opt-code" data-v-4903af59>${ssrInterpolate(o.code)}</span><span class="lang-opt-name" data-v-4903af59>${ssrInterpolate(o.name)}</span></label>`);
});
_push(`<!--]--></div></details>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<select class="select select-bordered select-sm w-full text-xs"${ssrRenderAttr("value", __props.modelValue)}${ssrIncludeBooleanAttr(__props.disabled) ? " disabled" : ""} data-v-4903af59><option value="" data-v-4903af59>(未设置)</option><!--[-->`);
ssrRenderList(opts.value, (o) => {
_push(`<option${ssrRenderAttr("value", o.code)} data-v-4903af59>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`);
});
_push(`<!--]--></select>`);
}
_push(`</div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/LangSelect.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const __nuxt_component_0 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main$1, [["__scopeId", "data-v-4903af59"]]), { __name: "LangSelect" });
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: 7, label: "STS 端到端对话", short: "STS", color: "#be185d", bg: "#fce7f3" },
{ v: 6, label: "存储 OSS/COS", short: "存储", color: "#475569", bg: "#f1f5f9" }
];
useApi();
useToast();
const scopeApp = ref("");
const scopeApps = ref([]);
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: "", provider: "", description: "", enable: false });
const editType = ref(0);
const editFields = ref([]);
const selectedTemplateId = ref("");
const wizardStep = ref(1);
const overrideFields = ref([]);
const extraRegionFields = ref([]);
const regionLoading = ref(false);
const templates = ref([]);
const curRegionLabel = computed(() => {
const r = REGIONS.find((x) => x.value === curRegion.value);
return r ? r.label : "区域" + curRegion.value;
});
const templatesByCat = computed(() => {
return SCAT.map((sc) => ({
cat: sc.v,
label: sc.label,
items: templates.value.filter((t) => t.category === sc.v)
})).filter((g) => g.items.length);
});
const templatesForType = computed(() => templates.value.filter((t) => t.category === editType.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));
const tplModalVisible = ref(false);
const tplView = ref("list");
const tplEditing = ref(false);
const tplForm = reactive({ id: "", category: 2, provider: "", name: "", description: "" });
const tplFields = ref([]);
return (_ctx, _push, _parent, _attrs) => {
const _component_LangSelect = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-04ce4a7d>`);
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-04ce4a7d> ⚠ 「第三方服务配置」后端接口暂不可用(连接失败),请检查 console 服务是否运行。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex items-center justify-between mb-5" data-v-04ce4a7d><div data-v-04ce4a7d><h2 class="text-lg font-semibold text-slate-800" data-v-04ce4a7d>第三方服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-04ce4a7d>按服务类型分组管理已接入的第三方服务(火山引擎、阿里云、Azure 等)。默认展示<b data-v-04ce4a7d>全局默认</b>配置,可切换到具体应用;区域默认<b data-v-04ce4a7d>中国</b>,切换区域可为该区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-04ce4a7d><select class="select select-bordered select-sm" data-v-04ce4a7d><option value="" data-v-04ce4a7d${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-04ce4a7d${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>应用:${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-sm" data-v-04ce4a7d><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-04ce4a7d${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--><option${ssrRenderAttr("value", 0)} data-v-04ce4a7d${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, 0) : ssrLooseEqual(curRegion.value, 0)) ? " selected" : ""}>默认(全区域)</option></select><button class="btn btn-primary btn-sm text-white" data-v-04ce4a7d>+ 添加服务</button></div></div><div class="flex gap-4" style="${ssrRenderStyle({ "align-items": "flex-start" })}" data-v-04ce4a7d><div style="${ssrRenderStyle({ "width": "248px", "flex-shrink": "0" })}" data-v-04ce4a7d><div class="flex flex-col gap-2" data-v-04ce4a7d><!--[-->`);
ssrRenderList(allSvcs.value, (s) => {
_push(`<div class="${ssrRenderClass([{ active: curSvc.value && curSvc.value.id === s.id }, "svc-item"])}" data-v-04ce4a7d><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-04ce4a7d>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-04ce4a7d><div class="flex items-center gap-2" data-v-04ce4a7d><span class="font-semibold text-slate-800 text-sm truncate" data-v-04ce4a7d>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "badge-success" : "badge-ghost", "badge badge-xs"])}" data-v-04ce4a7d>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><div class="flex flex-wrap gap-1 mt-1 items-center" data-v-04ce4a7d>`);
if (s.provider) {
_push(`<span class="provider-chip" data-v-04ce4a7d>${ssrInterpolate(s.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(parseCats(s.categories), (v) => {
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(v).color, background: scatInfo(v).bg })}" data-v-04ce4a7d>${ssrInterpolate(scatInfo(v).short)}</span>`);
});
_push(`<!--]-->`);
if (encCount(s)) {
_push(`<span class="lock-badge" data-v-04ce4a7d>🔒${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-04ce4a7d>暂无服务</p>`);
} else {
_push(`<!---->`);
}
_push(`</div></div><div class="flex-1 min-w-0" data-v-04ce4a7d><div class="bg-white rounded-2xl border border-slate-100 shadow-sm p-6" data-v-04ce4a7d>`);
if (detailMode.value === "empty") {
_push(`<div class="text-center text-slate-300 py-20" data-v-04ce4a7d><div class="text-5xl mb-3" data-v-04ce4a7d>⚙️</div><p class="text-sm" data-v-04ce4a7d>从左侧选择一个服务开始配置</p></div>`);
} else if (detailMode.value === "default" && curSvc.value) {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-04ce4a7d><div class="flex items-center gap-3" data-v-04ce4a7d><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-04ce4a7d>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-04ce4a7d><h3 class="text-base font-semibold text-slate-800" data-v-04ce4a7d>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-04ce4a7d>${ssrInterpolate(curSvc.value.id)}`);
if (editForm.provider) {
_push(`<span data-v-04ce4a7d> · 服务商 ${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</p></div></div><div class="flex gap-2" data-v-04ce4a7d><button class="btn btn-error btn-sm btn-outline" data-v-04ce4a7d>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-04ce4a7d>保存</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-04ce4a7d>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-04ce4a7d><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-04ce4a7d></div><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>启用</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-04ce4a7d></div></div><div class="form-control mb-4" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-04ce4a7d></div><div class="mb-4" data-v-04ce4a7d><p class="text-sm font-medium text-slate-700 mb-2" data-v-04ce4a7d>服务类型</p>`);
if (editType.value) {
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-04ce4a7d>${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="text-xs text-slate-500 ml-2" data-v-04ce4a7d>${ssrInterpolate(editType.value ? scatInfo(editType.value).label : "未设置")}</span><span class="text-[11px] text-slate-400 ml-2" data-v-04ce4a7d>(类型在创建时确定,不可更改)</span></div><div class="divider text-xs text-slate-400 my-3" data-v-04ce4a7d>配置字段(全区域共用)</div><div data-v-04ce4a7d>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-04ce4a7d>尚无字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-04ce4a7d><table class="table text-xs" data-v-04ce4a7d><thead data-v-04ce4a7d><tr data-v-04ce4a7d><th class="w-44" data-v-04ce4a7d>字段名</th><th data-v-04ce4a7d>字段描述</th><th class="w-16 text-center" data-v-04ce4a7d>加密</th><th data-v-04ce4a7d>默认值</th><th class="w-12" data-v-04ce4a7d></th></tr></thead><tbody data-v-04ce4a7d><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-04ce4a7d><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-04ce4a7d></td><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-04ce4a7d></td><td class="text-center" data-v-04ce4a7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-04ce4a7d></td><td data-v-04ce4a7d>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-04ce4a7d><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-04ce4a7d><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-04ce4a7d>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-04ce4a7d>🔒 加密</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-04ce4a7d>`);
}
_push(`</td><td data-v-04ce4a7d><button class="btn btn-ghost btn-xs text-error" data-v-04ce4a7d>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-04ce4a7d>+ 添加字段</button></div><!--]-->`);
} else if (detailMode.value === "new") {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-04ce4a7d><h3 class="text-base font-semibold text-slate-800" data-v-04ce4a7d>新增第三方服务</h3><button class="btn btn-ghost btn-sm" data-v-04ce4a7d>取消</button></div><div class="wizard-steps mb-5" data-v-04ce4a7d><div class="${ssrRenderClass([{ on: wizardStep.value >= 1, cur: wizardStep.value === 1 }, "wstep"])}" data-v-04ce4a7d>① 服务类型`);
if (editType.value) {
_push(`<span data-v-04ce4a7d> · ${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="wline" data-v-04ce4a7d></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 2, cur: wizardStep.value === 2, disabled: !editType.value }, "wstep"])}" data-v-04ce4a7d>② 服务商`);
if (editForm.provider) {
_push(`<span data-v-04ce4a7d> · ${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="wline" data-v-04ce4a7d></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 3, cur: wizardStep.value === 3, disabled: wizardStep.value < 3 }, "wstep"])}" data-v-04ce4a7d>③ 配置</div></div>`);
if (wizardStep.value === 1) {
_push(`<!--[--><p class="text-sm text-slate-500 mb-3" data-v-04ce4a7d>请选择要接入的服务类型(每个服务归属单一类型,独立配置):</p><div class="type-grid" data-v-04ce4a7d><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<div class="${ssrRenderClass([{ on: editType.value === sc.v }, "type-card"])}" data-v-04ce4a7d><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-04ce4a7d>${ssrInterpolate(sc.short)}</span><span class="text-sm text-slate-700 mt-2" data-v-04ce4a7d>${ssrInterpolate(sc.label)}</span></div>`);
});
_push(`<!--]--></div><!--]-->`);
} else if (wizardStep.value === 2) {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-04ce4a7d><p class="text-sm text-slate-500" data-v-04ce4a7d>为「${ssrInterpolate(scatInfo(editType.value).label)}」选择服务商:</p><button class="btn btn-ghost btn-xs" data-v-04ce4a7d>← 上一步</button></div><div class="type-grid" data-v-04ce4a7d><!--[-->`);
ssrRenderList(templatesForType.value, (t) => {
_push(`<div class="${ssrRenderClass([{ on: selectedTemplateId.value === t.id }, "type-card"])}" data-v-04ce4a7d><span class="provider-chip" data-v-04ce4a7d>${ssrInterpolate(t.provider)}</span><span class="text-sm text-slate-700 mt-2" data-v-04ce4a7d>${ssrInterpolate(t.name)}</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-04ce4a7d>${ssrInterpolate((t.fields || []).length)} 字段</span></div>`);
});
_push(`<!--]--><div class="type-card" data-v-04ce4a7d><span class="provider-chip" style="${ssrRenderStyle({ "background": "#f1f5f9", "color": "#475569" })}" data-v-04ce4a7d>自定义</span><span class="text-sm text-slate-700 mt-2" data-v-04ce4a7d>空白自定义</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-04ce4a7d>手动添加字段</span></div></div>`);
if (!templatesForType.value.length) {
_push(`<p class="text-xs text-slate-400 mt-2" data-v-04ce4a7d>该类型暂无内置模板,可选「空白自定义」,或到「服务商模板」新增。</p>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-04ce4a7d><div class="flex items-center gap-2" data-v-04ce4a7d><span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-04ce4a7d>${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
if (editForm.provider) {
_push(`<span class="provider-chip" data-v-04ce4a7d>${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex gap-2" data-v-04ce4a7d><button class="btn btn-ghost btn-xs" data-v-04ce4a7d>← 上一步</button><button class="btn btn-primary btn-sm text-white" data-v-04ce4a7d>创建</button></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-04ce4a7d><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>服务ID * <span class="text-slate-400 text-xs" data-v-04ce4a7d>(唯一,如 tts_azure)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="tts_azure" data-v-04ce4a7d></div><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="微软 Azure TTS" data-v-04ce4a7d></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-04ce4a7d><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>服务商标识 <span class="text-slate-400 text-xs" data-v-04ce4a7d>(如 azure/alibaba)</span></span></label><input${ssrRenderAttr("value", editForm.provider)} class="input input-bordered font-mono" placeholder="azure" data-v-04ce4a7d></div><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>启用</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-04ce4a7d></div></div><div class="form-control mb-4" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text" data-v-04ce4a7d>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-04ce4a7d></div><div class="divider text-xs text-slate-400 my-3" data-v-04ce4a7d>配置字段</div><div data-v-04ce4a7d>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-04ce4a7d>尚无字段,选模板自动带出或点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-04ce4a7d><table class="table text-xs" data-v-04ce4a7d><thead data-v-04ce4a7d><tr data-v-04ce4a7d><th class="w-44" data-v-04ce4a7d>字段名</th><th data-v-04ce4a7d>字段描述</th><th class="w-16 text-center" data-v-04ce4a7d>加密</th><th data-v-04ce4a7d>默认值</th><th class="w-12" data-v-04ce4a7d></th></tr></thead><tbody data-v-04ce4a7d><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-04ce4a7d><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-04ce4a7d></td><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-04ce4a7d></td><td class="text-center" data-v-04ce4a7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-04ce4a7d></td><td data-v-04ce4a7d>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-04ce4a7d><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-04ce4a7d><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-04ce4a7d>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-04ce4a7d>🔒 加密</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-04ce4a7d>`);
}
_push(`</td><td data-v-04ce4a7d><button class="btn btn-ghost btn-xs text-error" data-v-04ce4a7d>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-04ce4a7d>+ 添加字段</button></div><!--]-->`);
}
_push(`<!--]-->`);
} else if (detailMode.value === "region" && curSvc.value) {
_push(`<!--[-->`);
if (regionLoading.value) {
_push(`<div class="text-center py-10 text-slate-400" data-v-04ce4a7d>加载中...</div>`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-04ce4a7d><div class="flex items-center gap-3" data-v-04ce4a7d><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-04ce4a7d>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-04ce4a7d><h3 class="text-base font-semibold text-slate-800" data-v-04ce4a7d>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-04ce4a7d>${ssrInterpolate(curRegionLabel.value)} 分叉模式</span></div></div><button class="btn btn-primary btn-sm text-white" data-v-04ce4a7d>保存分叉</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-04ce4a7d> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段分叉:默认字段可覆盖值或勾选「不适用」停用;也可新增本区域专属字段。留空的覆盖字段继承默认值,加密字段留空保留已存储密文。 </div><p class="text-sm font-medium text-slate-700 mb-2" data-v-04ce4a7d>默认字段</p><div class="overflow-x-auto" data-v-04ce4a7d><table class="table text-xs" data-v-04ce4a7d><thead data-v-04ce4a7d><tr data-v-04ce4a7d><th class="w-44" data-v-04ce4a7d>字段名</th><th data-v-04ce4a7d>字段描述</th><th class="w-24 text-center" data-v-04ce4a7d>状态</th><th class="w-20 text-center" data-v-04ce4a7d>本区域不适用</th><th data-v-04ce4a7d>有效值</th></tr></thead><tbody data-v-04ce4a7d><!--[-->`);
ssrRenderList(overrideFields.value, (f, i) => {
_push(`<tr class="${ssrRenderClass({ "opacity-50": f.disabled })}" data-v-04ce4a7d><td class="font-mono text-slate-700 break-all"${ssrRenderAttr("title", f.key)} data-v-04ce4a7d>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-04ce4a7d>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-04ce4a7d>`);
if (f.disabled) {
_push(`<span class="disabled-badge" data-v-04ce4a7d>停用</span>`);
} else if (f.is_overridden) {
_push(`<span class="override-badge" data-v-04ce4a7d>覆盖</span>`);
} else {
_push(`<span class="inherit-badge" data-v-04ce4a7d>继承</span>`);
}
_push(`</td><td class="text-center" data-v-04ce4a7d><input type="checkbox" class="checkbox checkbox-xs"${ssrIncludeBooleanAttr(Array.isArray(f.disabled) ? ssrLooseContain(f.disabled, null) : f.disabled) ? " checked" : ""} data-v-04ce4a7d></td><td data-v-04ce4a7d>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f._input,
"onUpdate:modelValue": ($event) => f._input = $event,
multiple: true,
disabled: f.disabled
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f._input,
"onUpdate:modelValue": ($event) => f._input = $event,
disabled: f.disabled
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-04ce4a7d><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} placeholder="留空继承默认" data-v-04ce4a7d><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-04ce4a7d>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-04ce4a7d>🔒</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-04ce4a7d>`);
}
_push(`</td></tr>`);
});
_push(`<!--]-->`);
if (!overrideFields.value.length) {
_push(`<tr data-v-04ce4a7d><td colspan="5" class="text-center text-slate-400 py-3" data-v-04ce4a7d>该服务尚无默认字段</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div><div class="divider text-xs text-slate-400 my-3" data-v-04ce4a7d>${ssrInterpolate(curRegionLabel.value)} 专属字段</div><div data-v-04ce4a7d>`);
if (!extraRegionFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-2 text-center" data-v-04ce4a7d>尚无区域专属字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-04ce4a7d><table class="table text-xs" data-v-04ce4a7d><thead data-v-04ce4a7d><tr data-v-04ce4a7d><th class="w-44" data-v-04ce4a7d>字段名</th><th data-v-04ce4a7d>字段描述</th><th class="w-16 text-center" data-v-04ce4a7d>加密</th><th data-v-04ce4a7d>值</th><th class="w-12" data-v-04ce4a7d></th></tr></thead><tbody data-v-04ce4a7d><!--[-->`);
ssrRenderList(extraRegionFields.value, (f, i) => {
_push(`<tr data-v-04ce4a7d><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-04ce4a7d></td><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-04ce4a7d></td><td class="text-center" data-v-04ce4a7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-04ce4a7d></td><td data-v-04ce4a7d>`);
if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-04ce4a7d><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空保留原值" data-v-04ce4a7d><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-04ce4a7d>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-04ce4a7d>🔒</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)} data-v-04ce4a7d>`);
}
_push(`</td><td data-v-04ce4a7d><button class="btn btn-ghost btn-xs text-error" data-v-04ce4a7d>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-04ce4a7d>+ 添加区域专属字段</button></div><!--]-->`);
}
_push(`<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</div></div></div><div class="sync-overlay" style="${ssrRenderStyle(syncVisible.value ? null : { display: "none" })}" data-v-04ce4a7d><div class="sync-box" data-v-04ce4a7d><div class="flex items-start gap-3 mb-4" data-v-04ce4a7d><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-04ce4a7d><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-04ce4a7d><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-04ce4a7d></path></svg></div><div data-v-04ce4a7d><h3 class="text-base font-semibold text-slate-800" data-v-04ce4a7d>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-04ce4a7d>${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-04ce4a7d>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-04ce4a7d><span class="text-xs font-semibold text-slate-500" data-v-04ce4a7d>选择目标区域</span><div class="flex gap-2" data-v-04ce4a7d><button class="btn btn-ghost btn-xs" data-v-04ce4a7d>全选</button><button class="btn btn-ghost btn-xs" data-v-04ce4a7d>清空</button></div></div><div class="sync-region-grid" data-v-04ce4a7d><!--[-->`);
ssrRenderList(syncRegionList.value, (r) => {
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-04ce4a7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-04ce4a7d><span data-v-04ce4a7d>${ssrInterpolate(r.label)}</span></label>`);
});
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-04ce4a7d>⚠ 已勾选区域将被当前配置(值覆盖 / 区域专属字段 / 停用字段)整体替换;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-04ce4a7d><button class="btn btn-ghost" data-v-04ce4a7d>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-04ce4a7d>保存并同步</button></div></div></div><div class="sync-overlay" style="${ssrRenderStyle(tplModalVisible.value ? null : { display: "none" })}" data-v-04ce4a7d><div class="tpl-box" data-v-04ce4a7d>`);
if (tplView.value === "list") {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-04ce4a7d><div data-v-04ce4a7d><h3 class="text-base font-semibold text-slate-800" data-v-04ce4a7d>服务商模板</h3><p class="text-xs text-slate-400 mt-1" data-v-04ce4a7d>模板是字段预设,新增服务时可一键带出。内置模板可编辑;删除后重启会被重新补回。</p></div><div class="flex gap-2" data-v-04ce4a7d><button class="btn btn-primary btn-sm text-white" data-v-04ce4a7d>+ 新增模板</button><button class="btn btn-ghost btn-sm" data-v-04ce4a7d>关闭</button></div></div><div class="tpl-list" data-v-04ce4a7d><!--[-->`);
ssrRenderList(templatesByCat.value, (g) => {
_push(`<div class="mb-3" data-v-04ce4a7d><p class="text-xs font-semibold text-slate-500 mb-1" data-v-04ce4a7d>${ssrInterpolate(g.label)}</p><!--[-->`);
ssrRenderList(g.items, (t) => {
_push(`<div class="tpl-row" data-v-04ce4a7d><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-04ce4a7d><div class="flex items-center gap-2" data-v-04ce4a7d><span class="font-semibold text-sm text-slate-800 truncate" data-v-04ce4a7d>${ssrInterpolate(t.name)}</span><span class="provider-chip" data-v-04ce4a7d>${ssrInterpolate(t.provider)}</span>`);
if (t.builtin) {
_push(`<span class="badge badge-xs badge-ghost" data-v-04ce4a7d>内置</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><p class="text-xs text-slate-400 mt-0.5" data-v-04ce4a7d>${ssrInterpolate(t.id)} · ${ssrInterpolate((t.fields || []).length)} 字段</p></div><div class="flex gap-1" data-v-04ce4a7d><button class="btn btn-ghost btn-xs" data-v-04ce4a7d>编辑</button><button class="btn btn-ghost btn-xs text-error" data-v-04ce4a7d>删除</button></div></div>`);
});
_push(`<!--]--></div>`);
});
_push(`<!--]-->`);
if (!templates.value.length) {
_push(`<p class="text-xs text-slate-400 text-center py-6" data-v-04ce4a7d>暂无模板</p>`);
} else {
_push(`<!---->`);
}
_push(`</div><!--]-->`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-04ce4a7d><h3 class="text-base font-semibold text-slate-800" data-v-04ce4a7d>${ssrInterpolate(tplEditing.value ? "编辑模板" : "新增模板")}</h3><div class="flex gap-2" data-v-04ce4a7d><button class="btn btn-ghost btn-sm" data-v-04ce4a7d>返回</button><button class="btn btn-primary btn-sm text-white" data-v-04ce4a7d>保存</button></div></div><div class="grid grid-cols-2 gap-3 mb-3" data-v-04ce4a7d><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text text-xs" data-v-04ce4a7d>模板ID *</span></label><input${ssrRenderAttr("value", tplForm.id)}${ssrIncludeBooleanAttr(tplEditing.value) ? " disabled" : ""} class="input input-bordered input-sm font-mono" placeholder="tts_azure" data-v-04ce4a7d></div><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text text-xs" data-v-04ce4a7d>类别 *</span></label><select class="select select-bordered select-sm" data-v-04ce4a7d><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<option${ssrRenderAttr("value", sc.v)} data-v-04ce4a7d${ssrIncludeBooleanAttr(Array.isArray(tplForm.category) ? ssrLooseContain(tplForm.category, sc.v) : ssrLooseEqual(tplForm.category, sc.v)) ? " selected" : ""}>${ssrInterpolate(sc.label)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text text-xs" data-v-04ce4a7d>服务商标识 *</span></label><input${ssrRenderAttr("value", tplForm.provider)} class="input input-bordered input-sm font-mono" placeholder="azure" data-v-04ce4a7d></div><div class="form-control" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text text-xs" data-v-04ce4a7d>展示名 *</span></label><input${ssrRenderAttr("value", tplForm.name)} class="input input-bordered input-sm" placeholder="微软 Azure TTS" data-v-04ce4a7d></div></div><div class="form-control mb-3" data-v-04ce4a7d><label class="label" data-v-04ce4a7d><span class="label-text text-xs" data-v-04ce4a7d>描述</span></label><input${ssrRenderAttr("value", tplForm.description)} class="input input-bordered input-sm" data-v-04ce4a7d></div><p class="text-sm font-medium text-slate-700 mb-1" data-v-04ce4a7d>字段</p><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "34vh" })}" data-v-04ce4a7d><table class="table text-xs" data-v-04ce4a7d><thead data-v-04ce4a7d><tr data-v-04ce4a7d><th class="w-44" data-v-04ce4a7d>字段名</th><th data-v-04ce4a7d>字段描述</th><th class="w-16 text-center" data-v-04ce4a7d>加密</th><th data-v-04ce4a7d>默认/提示值</th><th class="w-12" data-v-04ce4a7d></th></tr></thead><tbody data-v-04ce4a7d><!--[-->`);
ssrRenderList(tplFields.value, (f, i) => {
_push(`<tr data-v-04ce4a7d><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-04ce4a7d></td><td data-v-04ce4a7d><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-04ce4a7d></td><td class="text-center" data-v-04ce4a7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-04ce4a7d></td><td data-v-04ce4a7d>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} placeholder="可留空" data-v-04ce4a7d>`);
}
_push(`</td><td data-v-04ce4a7d><button class="btn btn-ghost btn-xs text-error" data-v-04ce4a7d>×</button></td></tr>`);
});
_push(`<!--]-->`);
if (!tplFields.value.length) {
_push(`<tr data-v-04ce4a7d><td colspan="5" class="text-center text-slate-400 py-2" data-v-04ce4a7d>尚无字段</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div><button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-04ce4a7d>+ 添加字段</button><!--]-->`);
}
_push(`</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-04ce4a7d"]]);
export { serviceconfig as default };
//# sourceMappingURL=serviceconfig-PSQWGwHl.mjs.map