docs: explain instance access, monitoring and resource management

This commit is contained in:
cieanyau committed 2026-11-06 00:34:17 +08:00
1 parent ab22d406c0
commit 7f54cae497
10 files changed
+48

No files matched your search

+5
View File
@@ -1,4 +1,5 @@
<script>
/** 通用模块实例管理:服务端按钮能力、图表、扩展展示与日志,升级/支付由子组件和父级协作。 */
import "~/assets/styles/CommonUpgrade.C8sZ-ExM.css";
import "~/assets/styles/LegacyProductUpgrade.dzWGwGgY.css";
import "~/assets/styles/RemfUpgrade.4stQ5ASH.css";
@@ -52,6 +53,7 @@ import { r as CommonUpgrade_r } from "~/components/instance/CommonUpgrade.vue";
import { s as CommonUpgrade_s } from "~/components/instance/CommonUpgrade.vue";
import CommonUpgrade from "~/components/instance/CommonUpgrade.vue";
function pe(e, t = () => {}) {
// 操作适配器只接受当前 Active 实例中明确 supported 的按钮,动作绑定模块/实例/状态快照。
let n = useApi(),
r = computed(() => e().module === `remf_finance_common`),
o = computed(() =>
@@ -105,6 +107,7 @@ function pe(e, t = () => {}) {
(l.value = e));
}
async function te() {
// 敏感动作先校验密码/镜像/重装知情确认;自定义动作与内置 provision 使用不同接口。
let i = l.value;
if (
!i ||
@@ -415,6 +418,7 @@ var me = {
X = 0,
Z = 0;
async function Q() {
// 每张图表独立请求并记录错误;请求身份已变化时整轮结果不再回写。
let e = ++X;
((G.value = !0), (W.value = {}), (U.value = {}));
let t = Math.floor(Date.now() / 1e3) - K.value;
@@ -451,6 +455,7 @@ var me = {
Y && e === X && (G.value = !1));
}
async function $() {
// 日志按接口分页读取;未获得数组时视为协议错误,而非显示一个误导性的空列表。
let e = ++Z;
((q.value = !0), (J.value = ``));
try {
+6
View File
@@ -1,4 +1,5 @@
<script>
/** 物理实例管理外壳:分区展示概要、监控、访问、IP、防护、域名、账务和日志,按需加载子面板。 */
import "~/assets/styles/ConfigBandwidth.CWSH1WJZ.css";
import "~/assets/styles/DcimUpgrade.DaLApYFa.css";
import "~/assets/styles/DcimReinstallStatus.CuXeXmZ3.css";
@@ -68,6 +69,7 @@ import progressbar from "primevue/progressbar";
import tablist from "primevue/tablist";
import tab from "primevue/tab";
function Ee(e, t) {
// 主信息、远程信息、流量和电源状态独立加载/报错;任一附属接口失败不抹掉其他成功结果。
let n = useApi(),
i = ref(null),
a = ref(null),
@@ -98,6 +100,7 @@ function Ee(e, t) {
(_.value = v.value = y.value = !1));
}
async function ee() {
// 电源查询独立序号 + 主刷新代次双重校验,防止较慢的旧状态覆盖手动刷新结果。
let r = t.value;
if (!r || !e || S) return;
let i = ++x,
@@ -119,6 +122,7 @@ function Ee(e, t) {
}
}
async function w() {
// 并行发起互不依赖的详情读取,响应必须仍属于当前模块及本轮刷新。
let r = t.value;
if (!r || !e || S) {
C();
@@ -633,6 +637,7 @@ var De = publicAssetsURL(`/images/reference/firewall.png`),
Z = 0,
Q = !1;
async function $() {
// IP 分页从界面零基索引换成接口一基页码,切换实例后旧页结果作废。
let e = ++Z,
t = C.hostId,
n = C.module;
@@ -677,6 +682,7 @@ var De = publicAssetsURL(`/images/reference/firewall.png`),
}),
watch(
[A, L, Bt, I],
// 汇总给父级标题区的数据不暴露原始供应商字段;电源状态失败时明确给空值。
() =>
w(`presentation`, {
region: G.value.region,
@@ -1,4 +1,8 @@
<script>
/**
* 实例访问控制:展示登录信息并编排重置密码、救援、重装及付费镜像确认。
* info/caps/detail 来自实例详情适配层;refresh 要求父级回读状态,action-consumed 确认消费外部动作。
*/
import "~/assets/styles/GeetestField.DiieTibK.css";
import "~/assets/styles/CaptchaField.BSN3ZbsD.css";
import "~/assets/styles/InstanceSmsCode.CsITfIEU.css";
@@ -284,6 +288,7 @@ var xe = {
(M.value = !0));
}
async function Rt() {
// 站点要求短信时必须带当前验证码;“指令已下发”只表示接口接受,不代表密码已即时生效。
if (!N.value) {
if (Ft.value && !F.value.trim()) {
T.value = `请输入账户手机验证码`;
@@ -346,6 +351,7 @@ var xe = {
(R.value = !0));
}
async function Ht(e) {
// 财务模块的救援密码字段和退出路径不同,必须保留模块差异,不能统一拼一个接口。
if (!Bt.value || L.value) return;
let t = q;
((L.value = !0), D());
@@ -416,6 +422,7 @@ var xe = {
Q = computed(() => x.module === `kky_ecs`),
$ = computed(() => x.module === `remf_finance`);
async function qt() {
// 镜像来源随模块变化:财务模块读取详情内嵌列表,智简模块需要当前节点参数。
if (!x.caps.reinstall || V.value.length) return;
let e = q;
Ut.value = !0;
@@ -486,6 +493,7 @@ var xe = {
}
}
async function Jt() {
// SSH 密钥需要读取全部分页并去重;服务端分页无进展时报告错误,不能静默截断选项。
if (!x.caps.reinstall || Wt.value.length || K.value) return;
let e = q;
((K.value = !0), (Gt.value = ``));
@@ -540,6 +548,7 @@ var xe = {
immediate: !0,
});
function Qt() {
// 重装前确认验证码、系统及密码/密钥,再打开二次确认,避免单次点击直接破坏实例数据。
if (It.value && !I.value.trim()) {
T.value = `请输入账户手机验证码`;
return;
@@ -570,6 +579,8 @@ var xe = {
S(`refresh`)));
}
async function en() {
// 重装提交绑定实例和镜像快照;支持的模块先检查镜像价格,付费镜像进入购买确认。
// 财务、快快云与其他云模块的重装字段不同,保留既有协议而非按显示文案猜字段。
if (!x.caps.reinstall || H.value || J) return;
if (It.value && !I.value.trim()) {
T.value = `请输入账户手机验证码`;
@@ -1,4 +1,5 @@
<script>
/** 实例磁盘管理:能力允许时挂卸载、扩容和新增数据盘;需要付款的操作发 pay 交给父级处理。 */
import "~/assets/styles/InstanceDisks.Ca7NZxYd.css";
import { toDisplayString } from "vue";
import { onMounted } from "vue";
@@ -151,6 +152,7 @@ var ge = [`aria-busy`],
k = 0,
He = 0;
async function Ue(e) {
// 操作对象必须仍在当前磁盘列表;挂/卸载按现有状态决定,不支持状态不发请求。
if (
E ||
w.value ||
@@ -280,6 +282,7 @@ var ge = [`aria-busy`],
}
}
function Ke() {
// 只允许普通数据盘扩容,目标容量必须为大于当前值的安全整数,赠送盘不可扩容。
let e = N.value,
t = y.disks.find((t) => t.ident === e?.ident);
if (
@@ -350,6 +353,7 @@ var ge = [`aria-busy`],
((B.value = q.value?.min ?? 0), $());
}
async function Ze(e) {
// 新增/扩容询价都绑定完整输入快照,磁盘、实例或权限变化即清空报价。
if (
(We(),
!T.value ||
@@ -389,6 +393,7 @@ var ge = [`aria-busy`],
let Q = () => Ze(`resize`),
$ = () => Ze(`add`);
async function Qe(e) {
// 只有当前有效报价可创建磁盘订单;订单 ID 归一化后通知父级接续支付。
if (!Z.value || !T.value || !(e === `resize` ? A.value : L.value))
return;
let t = e === `resize` ? M : z,
@@ -1,4 +1,5 @@
<script>
/** 云实例标签页编排层:detail 提供统一详情与能力,tab 双向绑定当前面板,子面板按需加载。 */
import "~/assets/styles/InstanceTraffic.CyyEAXl3.css";
import "~/assets/styles/RingProgress.CVwR7il5.css";
import "~/assets/styles/OsIcon.CAi4Iz2S.css";
@@ -213,6 +214,7 @@ var oe = defineAsyncComponent(() =>
J.value = Y.value.some((t) => t.value === e) ? e : `overview`;
}
function ce(e) {
// 顶部重装/救援入口先确认实例状态与能力,再用唯一动作号交给访问面板消费。
q.value &&
(e !== `rescue` || H.value.rescue) &&
(e !== `reinstall` || H.value.reinstall) &&
@@ -227,6 +229,7 @@ var oe = defineAsyncComponent(() =>
}
watch(
[Y, J],
// 模块能力变化可能移除当前标签;始终回到有效概要页而不是停留在不存在的面板。
([e, t]) => {
e.some((e) => e.value === t) || (J.value = `overview`);
},
@@ -1,4 +1,5 @@
<script>
/** 多模块监控图表:统一 CPU/内存/带宽/磁盘系列,保留各模块时间单位与指标口径差异。 */
import "~/assets/styles/InstanceMonitor.B0X15iQt.css";
import { toDisplayString } from "vue";
import { renderList } from "vue";
@@ -128,6 +129,7 @@ var O = defineAsyncComponent(() =>
return `${String(t.getHours()).padStart(2, `0`)}:${String(t.getMinutes()).padStart(2, `0`)}`;
};
async function te(e, t, n = `mf_cloud`) {
// 云模块各指标并行读取并分别展示失败;物理智简只请求实际支持的带宽图。
let r = [
{
type: `cpu`,
@@ -254,6 +256,7 @@ var O = defineAsyncComponent(() =>
});
}
async function ne(e, t, n) {
// 财务接口使用毫秒起止时间,CPU/内存交给专用转换器,其他系列保留服务端单位。
let r = [
{
type: `cpu`,
@@ -336,6 +339,7 @@ var O = defineAsyncComponent(() =>
});
}
async function re(e) {
// 快快云监控时间范围由接口决定,带宽值按其既有口径从千分单位转换为 Mbps。
let t = await y.get(`/kky_ecs/monitor/${e}`),
n = (t.sample_info ?? []).map((e) =>
String(e.timestamp ?? ``).slice(11, 16),
@@ -361,6 +365,7 @@ var O = defineAsyncComponent(() =>
];
}
async function $() {
// 请求绑定模块、实例和所选时间窗;相同窗口刷新可留旧图,不同窗口先清空避免误读。
if (J) return;
let e = ++q,
t = g.hostId,
@@ -401,6 +406,7 @@ var O = defineAsyncComponent(() =>
}
let ae = (e) => e.series.some((e) => e.data.some((e) => e !== null));
function oe(e) {
// 缺测点保持 null,不插值连接;百分比轴上限和单位来自归一化指标定义。
let t = S.isDark.value ? `#a1a1aa` : `#94a3b8`,
n = S.isDark.value ? `rgba(255,255,255,.08)` : `rgba(0,0,0,.06)`;
return {
@@ -1,4 +1,5 @@
<script>
/** 实例网络与安全面板:合并 IP 展示、模块流量、域名白名单能力及快快云内网 IP 分配。 */
import "~/assets/styles/MfCloudDefence.B2vl5Yip.css";
import "~/assets/styles/MfCloudVpc.CpOEbuWs.css";
import "~/assets/styles/MfCloudIps.jhFnuvcs.css";
@@ -205,6 +206,7 @@ var ce = {
(N.value = ``));
}
async function Ve() {
// 仅无内网 IP 且电源状态允许的快快云实例可申请;接口未返回地址时显示处理中而非重复申请。
if (z || j.value || !L.value) return;
let e = T.hostId,
t = ++R,
@@ -265,6 +267,7 @@ var ce = {
);
}
async function Z(e) {
// 先确认白名单能力,再读最新记录;明确“不支持”与网络/协议错误必须分别展示。
let t = ++X,
n = () => t === X && T.hostId === e;
((G.value = `loading`),
@@ -1,4 +1,5 @@
<script>
/** 云实例概要:展示规范化配置、流量和近 24 小时资源趋势,并向父级发出切换标签/操作意图。 */
import "~/assets/styles/InstanceTraffic.CyyEAXl3.css";
import "~/assets/styles/FlowPacketPanel.-RJSx13z.css";
import "~/assets/styles/RingProgress.CVwR7il5.css";
@@ -301,6 +302,7 @@ var le = defineAsyncComponent(() =>
let xt = (e) => (e.status === `fulfilled` ? e.value : null),
St = (e) => (e instanceof Error ? e.message : `网络监控加载失败`);
async function Y() {
// 不同模块的监控时间单位和返回结构不同,分支完成协议转换;实例切换后拒绝旧响应。
if (q) return;
let e = ++K,
t = x.hostId,
@@ -563,6 +565,7 @@ var le = defineAsyncComponent(() =>
: 0,
);
function Tt(e) {
// CPU/内存趋势以百分比绘制;null 表示缺测,禁止连接缺失点伪造连续数据。
return {
grid: {
left: 7,
@@ -1,4 +1,5 @@
<script>
/** 流量展示适配层:一般模块使用父级 flow,快快云按实例独立请求并经 instance-data 统一口径。 */
import "~/assets/styles/InstanceTraffic.CyyEAXl3.css";
import { toDisplayString } from "vue";
import { onMounted } from "vue";
@@ -133,6 +134,7 @@ var w = [`aria-busy`],
X = 0,
Z = !1;
async function Q() {
// unavailable 是统计不可用,不等同于“未用流量”;请求响应绑定模块、实例和代次。
if (Z) return;
let e = ++X,
t = y.hostId,
@@ -1,4 +1,5 @@
<script>
/** 旧财务独立服务器详情的展示适配层;原始 data/加载状态由父级提供,不据此宣称支持统一电源控制。 */
import "~/assets/styles/LegacyDcimActions.DcIrQby6.css";
import "~/assets/styles/InstanceLoadingShell.CwfiUwdU.css";
import "~/assets/styles/LegacyProductUpgrade.dzWGwGgY.css";
@@ -82,6 +83,8 @@ function k(e) {
return Number.isFinite(t) && t >= 0 ? t : null;
}
function A(e) {
// 旧协议可能把对象/数组包成 JSON 文本,归一化后提取 IP、系统、可见自定义字段与流量。
// 总流量为 0 明确表示不限量,缺少字段则保留 null,不能混成“已用 0”。
let t = T(e),
n = T(t.host_data),
r = T(t.dcim),
@@ -373,6 +376,7 @@ var j = defineAsyncComponent(() =>
let Y = 0,
X = !1;
async function Z(e, t) {
// 剪贴板异步完成时核对实例与请求序号,避免在切换详情后显示上一实例复制成功。
if (!e) return;
let n = ++Y,
r = v.hostId;