按 Dioxus 0.7 custom hooks 范式,把后台分页列表页反复出现的 use_effect + spawn + (loading/items/total/error) 三件套收口到 use_paginated 组合式 hook。统一非 wasm cfg 处理(SSR 不发请求、 loading 立即置 false),调用方只关心 fetch 闭包与页码依赖。 迁移范围(按降级预案,只做最规整的两处): - pages/admin/posts.rs:顺手补 error signal(原先吞掉 Err),向 trash 看齐,消除一致性债。 - pages/admin/trash.rs:直接替换,error 已有。 保留手写的形态(强行套 hook 反而更复杂): - comments.rs:依赖 (page, status) 双 signal,status 是额外维度, 套不进 (page, per_page) 模型;改 hook 会为单一调用点变复杂。 - system.rs 三个 tab:load_once + use_future 轮询形态,与 hook 的 单次加载模型不契合。 - dashboard.rs:多源聚合(3 个并发 spawn 分别 set 不同 signal)。 list_posts / list_deleted_posts 是 server function,两端都生成 (wasm 端 client stub、server 端真实实现),故去掉原 cfg import。
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_URL、
COOKIE_SECURE=true、TRUSTED_PROXY_COUNT=1。详见 部署指南。
Description
Languages
Rust
77.4%
TypeScript
17.2%
CSS
3.3%
Dockerfile
0.9%
Makefile
0.6%
Other
0.6%