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