Phase 0: 知识库
- docs/knowledge-base/loco-rs-patterns.md — loco-rs 10 个可借鉴模式研究
Phase 1: 数据层重构
- crates/zclaw-saas/src/models/ — 15 个 FromRow 类型化模型
- Login 3 次查询合并为 1 次 AccountLoginRow 查询
- 所有 service 文件从元组解构迁移到 FromRow 结构体
Phase 2: Worker + Scheduler 系统
- crates/zclaw-saas/src/workers/ — Worker trait + 5 个具体实现
- crates/zclaw-saas/src/scheduler.rs — TOML 声明式调度器
- crates/zclaw-saas/src/tasks/ — CLI 任务系统
Phase 3: 性能修复
- Relay N+1 查询 → 精准 SQL (relay/handlers.rs)
- Config RwLock → AtomicU32 无锁 rate limit (state.rs, middleware.rs)
- SSE std::sync::Mutex → tokio::sync::Mutex (relay/service.rs)
- /auth/refresh 阻塞清理 → Scheduler 定期执行
Phase 4: 多环境配置
- config/saas-{development,production,test}.toml
- ZCLAW_ENV 环境选择 + ZCLAW_SAAS_CONFIG 精确覆盖
- scheduler 配置集成到 TOML
51 lines
1.2 KiB
TOML
51 lines
1.2 KiB
TOML
[package]
|
|
name = "zclaw-saas"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
description = "ZCLAW SaaS backend - account, API config, relay, migration"
|
|
|
|
[[bin]]
|
|
name = "zclaw-saas"
|
|
path = "src/main.rs"
|
|
|
|
[dependencies]
|
|
zclaw-types = { workspace = true }
|
|
|
|
tokio = { workspace = true }
|
|
tokio-stream = { workspace = true }
|
|
futures = { workspace = true }
|
|
async-trait = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
toml = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
anyhow = { workspace = true }
|
|
uuid = { workspace = true }
|
|
chrono = { workspace = true }
|
|
tracing = { workspace = true }
|
|
tracing-subscriber = { workspace = true }
|
|
sqlx = { workspace = true }
|
|
reqwest = { workspace = true }
|
|
secrecy = { workspace = true }
|
|
sha2 = { workspace = true }
|
|
rand = { workspace = true }
|
|
dashmap = { workspace = true }
|
|
hex = { workspace = true }
|
|
url = "2"
|
|
|
|
axum = { workspace = true }
|
|
axum-extra = { workspace = true }
|
|
tower = { workspace = true }
|
|
tower-http = { workspace = true }
|
|
jsonwebtoken = { workspace = true }
|
|
argon2 = { workspace = true }
|
|
totp-rs = { workspace = true }
|
|
urlencoding = "2"
|
|
data-encoding = "2"
|
|
regex = "1"
|
|
aes-gcm = "0.10"
|
|
bytes = "1"
|
|
|
|
[dev-dependencies]
|
|
tempfile = { workspace = true }
|