import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate } from 'vue/server-renderer'; import { u as useApi } from './useApi-B-E5eLsI.mjs'; import { u as useToast } from './useToast-CS21XT61.mjs'; import './server.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 './useLoading-D4zrSa2m.mjs'; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "appconfig", __ssrInlineRender: true, setup(__props) { useApi(); useToast(); const view = ref("list"); const apps = ref([]); const envs = ref([]); const curAppName = ref(""); const curApp = ref(0); const items = ref([]); const loading = ref(false); const submitting = ref(false); const isEditing = ref(false); const keyword = ref(""); const form = reactive({ id: 0, group: "", key: "", value: "", description: "" }); const appNames = computed( () => [...new Set(apps.value.map((a) => a.app_name || a.name).filter(Boolean))].sort() ); const appDeployments = computed( () => apps.value.filter((a) => (a.app_name || a.name) === curAppName.value) ); function deployLabel(d) { const e = envs.value.find((x) => x.id === d.env_id); const envName = e ? e.name || e.code : d.env_id ? `环境#${d.env_id}` : "未关联环境"; const suffix = d.status === "pending" ? "(待部署)" : ""; return d.region ? `${envName} · ${d.region}${suffix}` : `${envName}${suffix}`; } const curAppLabel = computed(() => { const a = apps.value.find((x) => x.id === curApp.value); return a ? `${a.app_name || a.name} · ${deployLabel(a)}` : ""; }); const filteredRows = computed(() => { const kw = keyword.value.trim().toLowerCase(); if (!kw) return items.value; return items.value.filter((c) => ((c.group || "") + (c.key || "")).toLowerCase().includes(kw)); }); const groupedRows = computed(() => { const groups = {}; filteredRows.value.forEach((c) => { const g = c.group || ""; (groups[g] = groups[g] || []).push(c); }); const names = Object.keys(groups).sort((a, b) => { if (a === "") return -1; if (b === "") return 1; return a < b ? -1 : 1; }); return names.map((g) => ({ key: g, label: g || "未分组", items: groups[g] })); }); return (_ctx, _push, _parent, _attrs) => { _push(`
应用自有的 key/value 配置(音乐、OSS 等),直接读写所选应用的业务库。结构同「全局环境配置」但不分区域。
${ssrInterpolate(curAppName.value ? "该应用还没有部署环境,请先在「应用中心」为它部署一个环境" : "请先在上方选择应用和部署环境")}
| 键 | 值 | 描述 | 操作 |
|---|---|---|---|
| 暂无配置 | |||
| ▸ ${ssrInterpolate(grp.label)}${ssrInterpolate(grp.items.length)} 项 | |||
| ${ssrInterpolate(c.key || "")} | ${ssrInterpolate(c.value || "")} | ${ssrInterpolate(c.description || "")} | |