diff --git a/src/api/auth.rs b/src/api/auth.rs index 9ea5799..89845c2 100644 --- a/src/api/auth.rs +++ b/src/api/auth.rs @@ -417,26 +417,6 @@ pub async fn get_user_by_token(token: &str) -> Result, Serve Ok(user) } -#[cfg(feature = "server")] -/// 使指定用户的所有 session 立即失效:bump `session_generation`。 -/// -/// 用于角色降级、封禁、密码修改等场景。bump 后该用户所有已签发 session 在下次 -/// `get_user_by_token` 时因世代不匹配被逐出缓存并视为未登录。内存缓存无需主动清, -/// 惰性逐出即可。当前仓库无运行时角色变更入口,本函数是为未来「用户管理」功能 -/// 预备的基础设施,一旦引入降级/封禁的 server function,必须在 UPDATE 后调用。 -#[allow(dead_code)] // 预留给未来的用户管理功能(角色变更/封禁触发全量 session 失效) -pub async fn invalidate_user_sessions(user_id: i32) -> Result<(), ServerFnError> { - let client = get_conn().await.map_err(AppError::db_conn)?; - client - .execute( - "UPDATE users SET session_generation = session_generation + 1 WHERE id = $1", - &[&user_id], - ) - .await - .map_err(AppError::query)?; - Ok(()) -} - /// 获取当前登录用户的公开信息。 /// /// Dioxus server function,注册在 `/api` 路径下。 diff --git a/src/api/mhchem.rs b/src/api/mhchem.rs index f685de3..f7a5dd7 100755 --- a/src/api/mhchem.rs +++ b/src/api/mhchem.rs @@ -51,16 +51,8 @@ enum Field { Nodes(Vec), } -impl Field { - fn empty(&self) -> bool { - match self { - Field::Str(s) => s.is_empty(), - Field::Nodes(v) => v.is_empty(), - } - } -} - /// 解析中间表示:字面字符串或节点。 +#[allow(clippy::large_enum_variant)] // 机械移植:镜像 mhchemParser 上游结构,Parsed 经 Vec 进堆,非栈热路径 #[derive(Clone, Debug)] enum Parsed { S(String), @@ -398,11 +390,11 @@ fn match_pattern(name: &str, input: &str) -> Option { "x" => re_match(re!("^x")), "x$" => re_match(re!("^x$")), "i$" => re_match(re!("^i$")), - "letters" => re_match(&*LETTERS_RE), - "\\greek" => re_match(&*GREEK_RE), + "letters" => re_match(&LETTERS_RE), + "\\greek" => re_match(&GREEK_RE), "one lowercase latin letter $" => re_match(re!("^(?:([a-z])(?:$|[^a-zA-Z]))$")), "$one lowercase latin letter$ $" => re_match(re!("^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$")), - "one lowercase greek letter $" => re_match(&*ONE_GREEK_RE), + "one lowercase greek letter $" => re_match(&ONE_GREEK_RE), "digits" => re_match(re!("^[0-9]+")), "-9.,9" => re_match(re!("^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))")), "-9.,9 no missing 0" => re_match(re!("^[+\\-]?[0-9]+(?:[.,][0-9]+)?")), @@ -596,6 +588,7 @@ fn mval_str(m: &MVal) -> String { // 状态机主循环(对应 `_mhchemParser.go`) // ========================================================================= +#[allow(clippy::large_enum_variant)] // 同上:Out 为动作返回值,瞬态使用 enum Out { None, One(Parsed), @@ -622,8 +615,10 @@ fn go(input: &str, machine: &str) -> Vec { let transitions = transitions_for(machine); let mut state = String::from("0"); - let mut buffer = Buffer::default(); - buffer.parenthesis_level = 0; + let mut buffer = Buffer { + parenthesis_level: 0, + ..Default::default() + }; let mut output: Vec = Vec::new(); let mut last_input: Option = None; let mut watchdog = 10i32; @@ -753,7 +748,7 @@ fn generic_action(buf: &mut Buffer, m: &MVal, opt: &Option, type_: &str) if let (Some(a), MVal::V(v)) = (opt, m) { Out::One(Parsed::N(NodeData { type_: a.clone(), - p1: Some(Field::Str(v.get(0).cloned().unwrap_or_default())), + p1: Some(Field::Str(v.first().cloned().unwrap_or_default())), p2: Some(Field::Str(v.get(1).cloned().unwrap_or_default())), ..Default::default() })) diff --git a/src/api/mhchem_tables.rs b/src/api/mhchem_tables.rs index 2ed9f54..b69270d 100644 --- a/src/api/mhchem_tables.rs +++ b/src/api/mhchem_tables.rs @@ -2,10 +2,6 @@ // 数据机械移植自 mhchemParser 4.2.2 的 `stateMachines`。 // (被 include 进 mhchem.rs 中部,故不能用 `//!` 内部文档注释。) -#[allow(clippy::needless_pass_by_value)] - -use super::*; - // ── Task 构造器 ────────────────────────────────────────────────────────── fn task(acts: &[(&str, Option<&str>)], next: Option<&str>, revisit: bool, cont: bool) -> Task { @@ -1220,7 +1216,7 @@ fn text_action(buf: &mut Buffer, type_: &str) -> Option { } } -fn pq_action(buf: &mut Buffer, m: &MVal, type_: &str) -> Option { +fn pq_action(_buf: &mut Buffer, m: &MVal, type_: &str) -> Option { match type_ { "state of aggregation" => Some(Out::One(Parsed::N(NodeData { type_: "state of aggregation subscript".into(), @@ -1307,7 +1303,7 @@ fn pu_action(buf: &mut Buffer, m: &MVal, opt: &Option, type_: &str) -> O MVal::S(s) => vec![s.clone()], }; let mut ret: Vec = Vec::new(); - let g0 = v.get(0).map(|s| s.as_str()).unwrap_or(""); + let g0 = v.first().map(|s| s.as_str()).unwrap_or(""); if g0 == "+-" || g0 == "+/-" { ret.push(Parsed::S("\\pm ".into())); } else if !g0.is_empty() { @@ -1352,7 +1348,7 @@ fn pu_action(buf: &mut Buffer, m: &MVal, opt: &Option, type_: &str) -> O MVal::S(s) => vec![s.clone()], }; let mut ret: Vec = Vec::new(); - let g0 = v.get(0).map(|s| s.as_str()).unwrap_or(""); + let g0 = v.first().map(|s| s.as_str()).unwrap_or(""); if g0 == "+-" || g0 == "+/-" { ret.push(Parsed::S("\\pm ".into())); } else if !g0.is_empty() { diff --git a/src/codemirror_bridge.rs b/src/codemirror_bridge.rs index c4d495d..4174718 100644 --- a/src/codemirror_bridge.rs +++ b/src/codemirror_bridge.rs @@ -11,15 +11,12 @@ use serde::{Deserialize, Serialize}; /// SQL 补全用 schema 数据,由 `get_db_schema` server function 填充。 -// 暂未被消费(Task 5 的 get_db_schema 会用到),先 allow dead_code 避免 -D warnings 阻断 clippy。 -#[allow(dead_code)] #[derive(Serialize, Deserialize, Clone, Default, Debug)] pub struct SqlSchema { pub tables: Vec, } /// 单张表的补全数据:表名 + 列名列表。 -#[allow(dead_code)] #[derive(Serialize, Deserialize, Clone, Debug)] pub struct SqlTable { pub name: String, diff --git a/src/ssr_cache.rs b/src/ssr_cache.rs index 5a50019..bebfe68 100644 --- a/src/ssr_cache.rs +++ b/src/ssr_cache.rs @@ -50,7 +50,7 @@ fn route_cache_dir(route: &str) -> Option { path.push(seg); } if path.as_path() == std::path::Path::new(SSR_CACHE_ROOT) { - None // 根路由("/")单独由 invalidate_ssr_home 处理 + None // 根路由("/")无目录段;首页缓存由 invalidate_ssr_all_public 覆盖删除 } else { Some(path) } @@ -72,19 +72,6 @@ pub fn invalidate_ssr_route(route: &str) { } } -/// 失效首页 SSR 缓存(路由 `/`,落盘在 `static/index/`)。 -/// -/// 通常 [`invalidate_ssr_all_public`] 已覆盖首页;本函数留作只需刷新首页的细粒度场景。 -#[allow(dead_code)] -pub fn invalidate_ssr_home() { - let dir = PathBuf::from(SSR_CACHE_ROOT).join("index"); - match std::fs::remove_dir_all(&dir) { - Ok(()) => tracing::debug!("SSR 首页缓存已删除"), - Err(e) if e.kind() == std::io::ErrorKind::NotFound => {} - Err(e) => tracing::warn!(error = %e, "删除 SSR 首页缓存失败"), - } -} - /// 失效所有公开页 SSR 缓存(删除 `static/` 下除 `.well-known`、`admin` 外的全部)。 /// /// 用于批量重建等影响面广的写入。保留 `.well-known`(浏览器/PWA 元数据, @@ -112,7 +99,7 @@ pub fn invalidate_ssr_all_public() { /// 原子递增并返回新的全局世代号。 /// /// 仅作可观测性用途(注入 `X-SSR-Generation` 响应头)。实际 SSR 缓存失效由 -/// [`invalidate_ssr_route`] / [`invalidate_ssr_home`] 物理删文件完成。 +/// [`invalidate_ssr_route`] 物理删文件完成(首页由 [`invalidate_ssr_all_public`] 覆盖)。 pub fn bump_global_generation() -> u64 { let new = GLOBAL_GENERATION .fetch_add(1, Ordering::SeqCst) @@ -164,7 +151,7 @@ mod tests { #[test] fn route_cache_dir_none_for_root() { - // 根路由 "/" 无目录段,由 invalidate_ssr_home 单独处理。 + // 根路由 "/" 无目录段(首页缓存由 invalidate_ssr_all_public 覆盖)。 assert!(route_cache_dir("/").is_none()); assert!(route_cache_dir("").is_none()); } @@ -195,6 +182,5 @@ mod tests { // (若真实环境已有 static/,本测试不会误删——read_dir 对每个条目单独删, // 这里仅验证根缺失分支。) invalidate_ssr_all_public(); - invalidate_ssr_home(); } }