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 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);