xfy 690e00e194 refactor(unwrap): 消除非测试代码中的裸 .unwrap(),改为带不变量说明的 .expect()
panic="abort" 下任何 panic 直接杀进程,与 unwrap 的「稍后处理」语义冲突。
本轮把所有可证不变量的裸 unwrap 改写为带说明的 expect,并修复 time.rs 中
u32→i32 转换在大 ms 值下的潜在溢出 panic(clamp 到 i32::MAX)。

- src/utils/time.rs: sleep_ms 的 ms.try_into().unwrap() 改为 clamp 到
  i32::MAX,避免超大延时值溢出;window/set_timeout 的 expect 补充上下文说明
- src/utils/text.rs: 6 个静态正则的 unwrap 改为 expect,统一说明「编译期校验」
- src/api/{auth,comments/helpers}.rs: EMAIL_REGEX 同上
- src/api/markdown.rs: IMG_RE / TABLE_RE 同上
- src/api/rate_limit.rs: NonZeroU32::new(val.max(1)) 与 Quota::with_period
  补充不变量说明
- src/api/image.rs: HeaderValue::from_str(&etag).unwrap() 改为 expect 说明
  etag 仅含 ASCII hex;复用 etag_value 避免 clone
- src/middleware.rs: 静态 302 重定向响应的 unwrap 改为 expect
- src/components/post/post_content.rs、src/theme.rs: WASM 上下文 window().unwrap()
  改为 expect 说明仅浏览器执行

保留的 unwrap/expect(合理不变量,已在注释中说明):
- DB_POOL LazyLock 闭包(已有详细注释 + validate_database_url 前置校验)
- csrf.rs 静态 forbidden 响应
- highlight.rs syntect 内置 Plain Text 语法
- bin/generate_highlight_css 构建工具
- comments/* 的 #[cfg(not(server))] unreachable!() WASM stub
2026-07-23 18:26:19 +08:00
2026-07-23 13:34:27 +08:00
2026-07-23 16:33:07 +08:00
2026-07-23 16:33:07 +08:00
2026-07-23 16:33:07 +08:00

Yggdrasil

基于 Dioxus 0.7 的全栈博客系统Rust 单一代码库同时编译为 WASM 前端和原生服务端。

技术栈

  • 框架: Dioxus 0.7 (fullstack)
  • 数据库: PostgreSQL + tokio-postgres
  • 样式: Tailwind CSS v4
  • 密码: Argon2
  • 会话: UUID token + cookie

功能

  • 邮箱注册 / 登录(单管理员模式,首次注册后关闭)
  • 会话管理与自动过期清理
  • 暗色 / 亮色主题切换
  • 后台文章撰写Tiptap Markdown 编辑器)
  • 文章归档与标签浏览

开发

依赖 Rust 1.95+、wasm32 目标、dx CLI、tailwindcss CLI v4 和 PostgreSQL。

# 配置数据库
DATABASE_URL=postgres://postgres:postgres@localhost:5432/yggdrasil

# 运行迁移(自动创建数据库并按顺序执行 migrations/ 下所有 SQL
./migrate.sh

# 启动开发服务器
make dev

构建

make build

生产部署

生产环境必须前置反向代理nginx/Caddy做 TLS 终结,并设置 APP_BASE_URLCOOKIE_SECURE=trueTRUSTED_PROXY_COUNT=1。详见 部署指南

Description
No description provided
Readme 9.4 MiB
Languages
Rust 77.4%
TypeScript 17.2%
CSS 3.3%
Dockerfile 0.9%
Makefile 0.6%
Other 0.6%