docs: annotate remaining routes layouts and view boundaries

This commit is contained in:
cieanyau committed 2026-11-06 00:34:17 +08:00
1 parent 408f8e5c98
commit ab22d406c0
56 files changed
+403

No files matched your search

+15
View File
@@ -1,4 +1,7 @@
<script>
/**
* 域名白名单:按主机及审核状态查询记录;提交前必须加载可用主机、实名认证状态和当前主机对应的动态表单。
*/
import "~/assets/styles/domains.GiD6NSti.css";
definePageMeta({
alias: [`/security/domain-whitelist`],
@@ -128,6 +131,7 @@ var ve = {
}),
}),
k = computed(() => x.value !== null || S.value !== null);
// 清除主机和状态筛选后重新查询记录。
function Re() {
((x.value = null), (S.value = null), O());
}
@@ -171,6 +175,7 @@ var ve = {
value: -1,
},
];
// 独立加载可申请白名单的主机列表,并校验响应为数组;旧请求或离页响应不回写。
async function Ve() {
let e = ++L;
((P.value = !0), (M.value = ``));
@@ -187,6 +192,7 @@ var ve = {
!I && e === L && (P.value = !1);
}
}
// 明确验证服务端实名标记的允许格式,不能把未知响应默认为已实名。
async function He() {
let e = ++R;
((F.value = !0), (N.value = ``));
@@ -204,6 +210,7 @@ var ve = {
!I && e === R && (F.value = !1);
}
}
// 用户文案区分已通过、已驳回、人工审核与自动处理中。
function Ue(e) {
return e.status === 1
? `已通过`
@@ -213,6 +220,7 @@ var ve = {
? `等待人工审核`
: `处理中`;
}
// 状态颜色与审核结果保持对应,不以有记录就表示已生效。
function We(e) {
return e.status === 1
? `success`
@@ -224,6 +232,7 @@ var ve = {
}
let z = ref(``),
Ge = ref(`success`);
// 统一设置操作反馈与级别,避免撤销失败仍显示成功样式。
function B(e, t = `success`) {
((z.value = e), (Ge.value = t));
}
@@ -236,6 +245,7 @@ var ve = {
q = ref(!1),
J = ref(null),
Y = 0;
// 打开申请并选定主机,表单字段必须重新按该主机加载。
function X(e) {
if (!q.value)
return (
@@ -245,6 +255,7 @@ var ve = {
Ke()
);
}
// 每次切换主机先清空旧字段,响应必须同时匹配请求序号与主机 ID 才可提交。
async function Ke() {
let e = ++Y,
t = H.value;
@@ -273,6 +284,7 @@ var ve = {
e === Y && (W.value = !1);
}
}
// 只提交当前已加载主机表单,且实名/主机前置查询无错误;校验动态必填项后创建记录。
async function qe() {
if (!(
q.value ||
@@ -311,9 +323,11 @@ var ve = {
let Z = ref(!1),
Q = ref(null),
$ = ref(!1);
// 打开撤销确认并保存目标,不立即删除。
function Je(e) {
((Q.value = e), (Z.value = !0));
}
// 仅对服务端允许撤销的记录发送删除,完成后刷新列表。
async function Ye() {
if (!Q.value || $.value || !Q.value.can_remove) return;
let e = Q.value;
@@ -334,6 +348,7 @@ var ve = {
onMounted(async () => {
(He(), await Ve(), x.value && X(x.value));
}),
// 记录列表、主机实名前置状态和申请动态字段分别展示;申请字段必须属于当前选择主机。
(n, r) => {
let a = NuxtLink,
c = message,
+27
View File
@@ -1,4 +1,7 @@
<script>
/**
* 安全组:组列表、出入站规则与实例关联共用页面;主列表、规则、已关联和可关联主机分别用请求代次隔离,批量关联保留失败目标供重试。
*/
import "~/assets/styles/PageInfoNotice._16xRFrB.css";
import "~/assets/styles/groups.Buw8nwl1.css";
definePageMeta({
@@ -244,6 +247,7 @@ var Te = {
},
],
k = ref([]);
// 常用端口快捷选择仅生成待确认的文本规则;默认 IP 为全网范围,生成并不立即下发。
function dt() {
$.value = ut
.filter((e) => k.value.includes(e.port))
@@ -253,9 +257,11 @@ var Te = {
).join(`
`);
}
// 打开新增规则弹窗,方向取当前入站/出站标签。
function ft() {
((R.value = null), (L.direction = D.value), (O.value = !0));
}
// 把已选规则复制到草稿后编辑,避免未保存时改动列表。
function pt(e) {
((R.value = e),
Object.assign(L, {
@@ -293,6 +299,7 @@ var Te = {
}),
R = ref(null),
bt = computed(() => ht.value.filter((e) => e.direction === D.value));
// 按关键词分页查询安全组,组件离开或新请求发起后废弃旧响应。
async function z() {
let e = ++x;
((st.value = !0), (T.value = ``));
@@ -313,6 +320,7 @@ var Te = {
e === x && !b && (st.value = !1);
}
}
// 新建组前清空上一次编辑目标和名称描述。
function xt() {
((j.value = null),
(M.name = ``),
@@ -320,6 +328,7 @@ var Te = {
(T.value = ``),
(A.value = !0));
}
// 编辑组时回填现有名称描述,保留原对象用于更新 ID。
function St(e) {
((j.value = e),
(M.name = e.name),
@@ -327,6 +336,7 @@ var Te = {
(T.value = ``),
(A.value = !0));
}
// 名称必填且同一时间只提交一次;新增/更新后重新读取组列表。
async function Ct() {
if (!mt.value) {
if (((T.value = ``), !M.name.trim())) {
@@ -352,6 +362,7 @@ var Te = {
}
}
}
// 删除组后刷新列表,失败保留页面错误。
async function wt(e) {
try {
(await y.del(`/security_group/${e.id}`), await z());
@@ -359,6 +370,7 @@ var Te = {
T.value = e instanceof Error ? e.message : `删除失败`;
}
}
// 进入组详情时重置规则页码、草稿与当前标签,再加载该组规则。
async function Tt(e) {
((P.value = e),
(N.value = !0),
@@ -375,6 +387,7 @@ var Te = {
}),
await B());
}
// 规则响应必须匹配组 ID 与请求代次,避免切组后展示上一组规则。
async function B() {
if (!P.value) return;
let e = ++tt,
@@ -429,6 +442,7 @@ var Te = {
G.value ||
Ot.value,
);
// 读取当前组全部关联主机用于搜索与去重,而不是只拿关联列表第一页。
async function Z() {
if (!P.value) return;
let e = P.value.id,
@@ -453,6 +467,7 @@ var Te = {
n() && (H.value = !1);
}
}
// 分页收集可用主机,失败时清空旧候选,避免沿用已失效的关联资格。
async function jt() {
let e = ++rt,
t = () => !b && e === rt;
@@ -492,6 +507,7 @@ var Te = {
value: e.id,
})),
);
// 批量提交前核对所有选择仍可关联;解析部分成功结果后保留失败 ID,刷新已关联列表及组计数。
async function Pt() {
if (!P.value || !W.value.length || X.value) return;
let e = P.value.id,
@@ -524,6 +540,7 @@ var Te = {
Ot.value = !1;
}
}
// 单主机关联仅接受当前候选项,提交后刷新关联及组列表。
async function Ft() {
if (
P.value &&
@@ -544,6 +561,7 @@ var Te = {
}
}
}
// 解除实例与组的关联后刷新状态,不在本地假定服务端已删除关系。
async function It(e) {
if (P.value && !X.value) {
((G.value = !0), (T.value = ``));
@@ -561,6 +579,7 @@ var Te = {
let Q = ref(!1),
$ = ref(``),
Lt = ref(!1);
// 每行按方向、协议、端口、IP 和可选描述解析;空行忽略,不足四列明确报格式错误。
function Rt(e) {
let t = [];
for (let n of e.split(`
@@ -580,6 +599,7 @@ var Te = {
}
return t;
}
// 批量规则先完整解析再提交,至少需要一条;成功后清空文本并刷新规则和组计数。
async function zt() {
if (!P.value || Lt.value) return;
T.value = ``;
@@ -617,6 +637,7 @@ var Te = {
watch(V, (e) => {
e === `host` && (Z(), jt());
});
// 单条规则按是否有编辑目标选择 PUT/POST;端口必填,成功后重置编辑器并刷新。
async function Vt() {
if (!yt.value) {
if (((T.value = ``), !P.value)) {
@@ -654,6 +675,7 @@ var Te = {
}
}
}
// 删除规则后同步规则列表与安全组统计。
async function Ht(e) {
try {
(await y.del(`/security_group/rule/${e.id}`), await B(), await z());
@@ -661,6 +683,7 @@ var Te = {
T.value = e instanceof Error ? e.message : `删除规则失败`;
}
}
// 把已知协议枚举转换为可读名称,未知协议保留大写标识。
function Ut(e) {
return (
{
@@ -678,12 +701,15 @@ var Te = {
function Wt(e) {
((C.value = e.page + 1), (w.value = e.rows), z());
}
// 确认搜索词后回到第一页查询组列表。
function Gt() {
((ct.value = E.value.trim()), (C.value = 1), z());
}
// 清空搜索草稿及已应用词,并恢复第一页。
function Kt() {
((E.value = ``), (ct.value = ``), (C.value = 1), z());
}
// 切换规则方向时恢复规则第一页,再按服务端方向筛选读取。
function qt(e) {
((V.value = `rule`), (D.value = e), (F.value = 1), B());
}
@@ -704,6 +730,7 @@ var Te = {
},
));
}),
// 组列表、规则详情、主机关联和批量规则各自使用独立草稿与提交锁,避免一个弹窗改变另一操作目标。
(n, r) => {
let i = button,
te = PageInfoNotice,
+15
View File
@@ -1,4 +1,7 @@
<script setup>
/**
* SSH 公钥管理:普通列表使用服务端分页,搜索先读取完整列表再在本地过滤/分页;requestGeneration 与 disposed 共同阻止旧请求回写。只管理公钥,不接收私钥。
*/
import {
computed,
onBeforeUnmount,
@@ -48,10 +51,12 @@ const visibleRows = computed(() =>
: rows.value,
);
// 仅允许当前加载代次且组件尚未卸载时修改列表反馈。
function isCurrentLoad(generation) {
return !disposed && generation === requestGeneration;
}
// 删除或搜索后夹紧页码;返回是否变化,供服务端分页决定是否重读修正后的页。
function clampPage() {
const lastPage = Math.max(1, Math.ceil(totalRows.value / pageSize.value));
const nextPage = Math.max(1, Math.min(currentPage.value, lastPage));
@@ -60,6 +65,7 @@ function clampPage() {
return true;
}
// 非搜索模式请求当前服务端页,删除末页最后一条时先修正页码再重读。
async function loadKeys() {
if (disposed) return;
if (appliedSearch.value) return loadSearchResults();
@@ -90,6 +96,7 @@ async function loadKeys() {
}
}
// 搜索拥有全量过滤结果,visibleRows 才做本地分页;不能只在服务端某一页上搜索全部密钥。
async function loadSearchResults() {
const query = appliedSearch.value;
const generation = ++requestGeneration;
@@ -124,12 +131,14 @@ async function loadSearchResults() {
}
}
// 关键词确认后才应用,并从第一页重新查询。
async function submitSearch() {
appliedSearch.value = draftSearch.value.trim().toLowerCase();
currentPage.value = 1;
await loadKeys();
}
// 清除草稿与已应用关键词,恢复服务端分页。
async function clearSearch() {
draftSearch.value = "";
appliedSearch.value = "";
@@ -137,6 +146,7 @@ async function clearSearch() {
await loadKeys();
}
// 每页条数变化回到第一页;搜索只调整本地页,普通模式重新读接口。
function changePage(event) {
currentPage.value = event.rows === pageSize.value ? event.page + 1 : 1;
pageSize.value = event.rows;
@@ -144,6 +154,7 @@ function changePage(event) {
else void loadKeys();
}
// 新建前清空上次编辑对象和表单,避免把旧 ID 带入创建。
function openCreateDialog() {
editingKey.value = null;
keyForm.name = "";
@@ -152,6 +163,7 @@ function openCreateDialog() {
editorVisible.value = true;
}
// 复制行中的名称与公钥到草稿,不直接改表格对象。
function openEditDialog(key) {
editingKey.value = key;
keyForm.name = key.name;
@@ -160,6 +172,7 @@ function openEditDialog(key) {
editorVisible.value = true;
}
// 校验名称非空、字符数上限和公钥非空;按编辑对象选择创建/更新,成功后刷新当前模式列表。
async function saveKey() {
if (saving.value || disposed) return;
actionError.value = "";
@@ -196,6 +209,7 @@ async function saveKey() {
}
}
// 删除后复用加载逻辑;末页恢复由 loadKeys/clampPage 统一处理。
async function deleteKey(key) {
if (disposed) return;
try {
@@ -207,6 +221,7 @@ async function deleteKey(key) {
}
}
// 剪贴板成功后短暂标记当前行;离页时清除反馈计时器,复制失败仍可手工选择公钥。
async function copyPublicKey(key) {
try {
await navigator.clipboard.writeText(key.public_key);