docs: annotate remaining routes layouts and view boundaries
This commit is contained in:
1 parent
408f8e5c98
commit
ab22d406c0
56 files changed
+403
No files matched your search
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user