diff --git a/src/api/database/backup.rs b/src/api/database/backup.rs index d0112bb..ffd09a9 100644 --- a/src/api/database/backup.rs +++ b/src/api/database/backup.rs @@ -5,7 +5,7 @@ //! 备份:探测 pg_dump 可用性——可用则子进程生成完整 .sql,不可用则回退纯 SQL //! (仅数据)。备份文件含签名头。 //! 恢复:仅接受本系统生成的备份(签名校验)+ 二次确认 + 路径穿越防护。 -//! 长耗时操作走后台任务 + 进度轮询(见 [`super::tasks`])。 +//! 长耗时操作走后台任务 + 进度轮询(见 [`crate::api::database::tasks`])。 // Component/PathBuf/chrono::Utc 仅 server 构建的备份逻辑用到。 #[cfg(feature = "server")] @@ -24,11 +24,17 @@ use crate::api::database::tasks::{self, TaskKind, TaskStatus}; #[cfg(feature = "server")] use crate::api::error::AppError; +// 以下常量仅被 server 构建的备份/恢复逻辑引用(WASM 构建里相关函数体被 cfg 剥掉, +// 故常量也需 gate,否则非 server 构建会报 dead_code)。 + /// 备份目录(项目根,与 uploads/ 平级,gitignored)。 +#[cfg(feature = "server")] const BACKUP_DIR: &str = "backups"; /// 文件名白名单正则:仅字母数字下划线点连字符(防路径穿越)。 +#[cfg(feature = "server")] const FILENAME_RE: &str = r"^[a-zA-Z0-9_.\-]+$"; /// 备份文件签名头(恢复时校验,拒绝非本系统文件)。 +#[cfg(feature = "server")] const BACKUP_SIGNATURE: &str = "-- YGGDRASIL BACKUP v1"; /// 备份文件元信息(列表展示用)。 diff --git a/src/api/database/mod.rs b/src/api/database/mod.rs index 6f17d51..827a7b5 100644 --- a/src/api/database/mod.rs +++ b/src/api/database/mod.rs @@ -1,7 +1,7 @@ //! 数据库管理 server functions 与 Axum 处理器。 //! //! 按功能拆分子模块: -//! - [`status`]:数据库运行状态聚合(表/连接/死元组/迁移版本)。 +//! - [`crate::api::database::status`]:数据库运行状态聚合(表/连接/死元组/迁移版本)。 //! //! 后续 task 会新增:`system_status`(服务器状态)、`sql_console`(SQL 执行+护栏)、 //! `schema`(SQL 补全数据)、`export`(流式导出)、`backup`/`tasks`(备份恢复+进度)。 diff --git a/src/api/database/sql_console.rs b/src/api/database/sql_console.rs index 72ec6f5..5fc6a97 100644 --- a/src/api/database/sql_console.rs +++ b/src/api/database/sql_console.rs @@ -46,14 +46,20 @@ pub struct SqlResult { pub truncated: bool, } +// 以下常量/枚举仅被 server function 体引用(WASM 构建里 server fn 体被 cfg 剥掉, +// 故这些符号也需 gate,否则非 server 构建会报 dead_code)。 + /// 结果行数上限(超出截断 + 提示)。 +#[cfg(feature = "server")] const MAX_ROWS: usize = 500; /// 绝对禁止的语句关键词(字符串预检,sqlparser 无 ObjectType::Database/Schema)。 /// 命中即拒,不可放行。 +#[cfg(feature = "server")] const ABSOLUTELY_FORBIDDEN: &[&str] = &["drop database", "drop schema", "create database"]; /// 护栏检查返回值。 +#[cfg(feature = "server")] #[derive(Debug)] enum GuardResult { Allowed, diff --git a/src/api/database/status.rs b/src/api/database/status.rs index 85d471d..c752e93 100644 --- a/src/api/database/status.rs +++ b/src/api/database/status.rs @@ -3,7 +3,7 @@ //! 数据库运行状态聚合查询(只读)。 //! //! 全部查询走 `pg_catalog` / `pg_stat_*` / `schema_migrations`,零写、零风险。 -//! [`get_db_status`] 在一次 server function 调用里聚合多组数据返回。 +//! [`get_db_status`][crate::api::database::status::get_db_status] 在一次 server function 调用里聚合多组数据返回。 use chrono::{DateTime, Utc}; use dioxus::prelude::*; diff --git a/src/api/database/system_status.rs b/src/api/database/system_status.rs index cff4d35..bf72674 100644 --- a/src/api/database/system_status.rs +++ b/src/api/database/system_status.rs @@ -3,7 +3,7 @@ //! 服务器状态聚合查询(只读):应用内指标 + 主机层指标。 //! //! 应用内:DB 连接池、moka 缓存命中率、活跃会话数、进程运行时间。 -//! 主机层:sysinfo 后台采样快照(CPU/内存/磁盘/load),由 [`sysinfo_sampler`] 维护。 +//! 主机层:sysinfo 后台采样快照(CPU/内存/磁盘/load),由 [`crate::sysinfo_sampler`] 维护。 use dioxus::prelude::*; use serde::{Deserialize, Serialize}; diff --git a/src/api/database/tasks.rs b/src/api/database/tasks.rs index c09ffea..81130a1 100644 --- a/src/api/database/tasks.rs +++ b/src/api/database/tasks.rs @@ -3,7 +3,7 @@ //! 备份/恢复的异步任务进度表(DashMap)。 //! //! create_backup/restore_backup 立即返回 task_id,后台任务跑时通过 -//! [`update`] 更新进度,前端轮询 [`get_task_progress`]。 +//! `update` 更新进度,前端轮询 [`get_task_progress`][crate::api::database::tasks::get_task_progress]。 //! 已完成超过 1 小时的任务惰性清理,避免内存累积。 use chrono::{DateTime, Utc}; diff --git a/src/codemirror_bridge.rs b/src/codemirror_bridge.rs index ad3500e..3310d76 100644 --- a/src/codemirror_bridge.rs +++ b/src/codemirror_bridge.rs @@ -2,7 +2,7 @@ //! //! 封装与 `window.CodeMirrorEditor`(IIFE 暴露的全局对象字面量)的全部交互, //! 严格镜像 [`crate::tiptap_bridge`] 的结构:共享纯数据类型双目标编译, -//! wasm-bindgen extern + [`EditorHandle`] 仅在 WASM 前端编译(server 构建无 window)。 +//! wasm-bindgen extern + `EditorHandle` 仅在 WASM 前端编译(server 构建无 window)。 //! //! 与 tiptap 一样,`CodeMirrorEditor` 是 IIFE 挂在 window 上的**对象字面量** //! (`{ create }`),不是函数——因此用 `js_sys::Reflect::get` 做属性访问拿到, diff --git a/src/sysinfo_sampler.rs b/src/sysinfo_sampler.rs index f0ad772..a945d90 100644 --- a/src/sysinfo_sampler.rs +++ b/src/sysinfo_sampler.rs @@ -1,7 +1,7 @@ //! sysinfo 主机指标后台采样。 //! //! sysinfo 的 CPU% **不是即时值**,需要两次采样间的 delta。因此用后台任务周期 -//! 刷新,server function 只读 [`RwLock`] 快照(毫秒级返回,零采样成本)。 +//! 刷新,server function 只读 [`tokio::sync::RwLock`] 快照(毫秒级返回,零采样成本)。 //! //! 采样间隔由环境变量 `SYSINFO_SAMPLE_SECS` 配置(默认 0.5 秒,支持小数如 0.1)。 @@ -101,6 +101,7 @@ pub async fn read_snapshot() -> SystemSnapshot { } #[cfg(not(feature = "server"))] +#[allow(dead_code)] pub async fn read_snapshot() -> SystemSnapshot { SystemSnapshot::default() }