feat: 新增管理后台前端项目及安全加固
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

refactor(saas): 重构认证中间件与限流策略
- 登录限流调整为5次/分钟/IP
- 注册限流调整为3次/小时/IP
- GET请求不计入限流

fix(saas): 修复调度器时间戳处理
- 使用NOW()替代文本时间戳
- 兼容TEXT和TIMESTAMPTZ列类型

feat(saas): 实现环境变量插值
- 支持${ENV_VAR}语法解析
- 数据库密码支持环境变量注入

chore: 新增前端管理界面
- 基于React+Ant Design Pro
- 包含路由守卫/错误边界
- 对接58个API端点

docs: 更新安全加固文档
- 新增密钥管理规范
- 记录P0安全项审计结果
- 补充TLS终止说明

test: 完善配置解析单元测试
- 新增环境变量插值测试用例
This commit is contained in:
iven
2026-03-31 00:11:33 +08:00
parent 6821df5f44
commit eb956d0dce
129 changed files with 11913 additions and 863 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,19 @@
0.868534600s INFO prepare_target{force=false package_id=zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory) target="zclaw_memory"}: cargo::core::compiler::fingerprint: fingerprint error for zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory)/Check { test: true }/TargetInner { name_inferred: true, ..: lib_target("zclaw_memory", ["lib"], "G:\\ZClaw_openfang\\crates\\zclaw-memory\\src\\lib.rs", Edition2021) }
0.868582700s INFO prepare_target{force=false package_id=zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory) target="zclaw_memory"}: cargo::core::compiler::fingerprint: err: failed to read `G:\ZClaw_openfang\target\debug\.fingerprint\zclaw-memory-258e8bafe81b73c9\test-lib-zclaw_memory`
0.703002700s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: stale: changed "G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\pipeline_commands.rs"
0.703037100s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: (vs) "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\desktop-9de72eb73ba28657\\dep-lib-desktop_lib"
0.703043200s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: FileTime { seconds: 13419342972, nanos: 890403700 } < FileTime { seconds: 13419343791, nanos: 278794700 }
0.703868600s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: fingerprint dirty for desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)/Check { test: false }/TargetInner { ..: lib_target("desktop_lib", ["staticlib", "cdylib", "rlib"], "G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\lib.rs", Edition2021) }
0.703911400s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleItem(ChangedFile { reference: "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\desktop-9de72eb73ba28657\\dep-lib-desktop_lib", reference_mtime: FileTime { seconds: 13419342972, nanos: 890403700 }, stale: "G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\pipeline_commands.rs", stale_mtime: FileTime { seconds: 13419343791, nanos: 278794700 } }))
0.828886100s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: stale: changed "G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\pipeline_commands.rs"
0.828907800s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: (vs) "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\desktop-bd0887c4d6a6cac0\\dep-test-lib-desktop_lib"
0.828913300s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: FileTime { seconds: 13419342982, nanos: 718252100 } < FileTime { seconds: 13419343791, nanos: 278794700 }
0.829130700s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: fingerprint dirty for desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)/Check { test: true }/TargetInner { ..: lib_target("desktop_lib", ["staticlib", "cdylib", "rlib"], "G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\lib.rs", Edition2021) }
0.829149000s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop_lib"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleItem(ChangedFile { reference: "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\desktop-bd0887c4d6a6cac0\\dep-test-lib-desktop_lib", reference_mtime: FileTime { seconds: 13419342982, nanos: 718252100 }, stale: "G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\pipeline_commands.rs", stale_mtime: FileTime { seconds: 13419343791, nanos: 278794700 } }))
0.831994800s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop"}: cargo::core::compiler::fingerprint: fingerprint dirty for desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)/Check { test: false }/TargetInner { name: "desktop", doc: true, ..: with_path("G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\main.rs", Edition2021) }
0.832022800s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "desktop_lib" })
0.834119600s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop"}: cargo::core::compiler::fingerprint: fingerprint dirty for desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)/Check { test: true }/TargetInner { name: "desktop", doc: true, ..: with_path("G:\\ZClaw_openfang\\desktop\\src-tauri\\src\\main.rs", Edition2021) }
0.834135500s INFO prepare_target{force=false package_id=desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri) target="desktop"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "desktop_lib" })
0.837900600s INFO prepare_target{force=false package_id=zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory) target="zclaw_memory"}: cargo::core::compiler::fingerprint: fingerprint error for zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory)/Check { test: true }/TargetInner { name_inferred: true, ..: lib_target("zclaw_memory", ["lib"], "G:\\ZClaw_openfang\\crates\\zclaw-memory\\src\\lib.rs", Edition2021) }
0.837922200s INFO prepare_target{force=false package_id=zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory) target="zclaw_memory"}: cargo::core::compiler::fingerprint: err: failed to read `G:\ZClaw_openfang\target\debug\.fingerprint\zclaw-memory-a71a373cefa023be\test-lib-zclaw_memory`
Caused by:
系统找不到指定的文件。 (os error 2)
@@ -26,39 +40,9 @@ Stack backtrace:
18: git_midx_writer_dump
19: BaseThreadInitThunk
20: RtlUserThreadStart
0.891938300s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: stale: changed "G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\model_config\\service.rs"
0.891979400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: (vs) "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\zclaw-saas-72a9fbf3f830e69e\\dep-lib-zclaw_saas"
0.891987700s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: FileTime { seconds: 13419244492, nanos: 580024000 } < FileTime { seconds: 13419244569, nanos: 751721700 }
0.892264600s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: false }/TargetInner { name_inferred: true, ..: lib_target("zclaw_saas", ["lib"], "G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\lib.rs", Edition2021) }
0.892299500s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleItem(ChangedFile { reference: "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\zclaw-saas-72a9fbf3f830e69e\\dep-lib-zclaw_saas", reference_mtime: FileTime { seconds: 13419244492, nanos: 580024000 }, stale: "G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\model_config\\service.rs", stale_mtime: FileTime { seconds: 13419244569, nanos: 751721700 } }))
0.903620200s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: stale: changed "G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\prompt\\service.rs"
0.903645300s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: (vs) "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\zclaw-saas-bdfcbb25abc6c767\\dep-test-lib-zclaw_saas"
0.903652200s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: FileTime { seconds: 13419244492, nanos: 590547500 } < FileTime { seconds: 13419244749, nanos: 30511300 }
0.903823000s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { name_inferred: true, ..: lib_target("zclaw_saas", ["lib"], "G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\lib.rs", Edition2021) }
0.903848300s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw_saas"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleItem(ChangedFile { reference: "G:\\ZClaw_openfang\\target\\debug\\.fingerprint\\zclaw-saas-bdfcbb25abc6c767\\dep-test-lib-zclaw_saas", reference_mtime: FileTime { seconds: 13419244492, nanos: 590547500 }, stale: "G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\prompt\\service.rs", stale_mtime: FileTime { seconds: 13419244749, nanos: 30511300 } }))
0.907258400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw-saas"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: false }/TargetInner { name: "zclaw-saas", doc: true, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\main.rs", Edition2021) }
0.907293400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw-saas"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.909141400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw-saas"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { name: "zclaw-saas", doc: true, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\src\\main.rs", Edition2021) }
0.909162100s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="zclaw-saas"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.910736700s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="account_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "account_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\account_test.rs", Edition2021) }
0.910755600s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="account_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.912894200s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="agent_template_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "agent_template_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\agent_template_test.rs", Edition2021) }
0.912920100s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="agent_template_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.914486400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="auth_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "auth_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\auth_test.rs", Edition2021) }
0.914504700s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="auth_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.917159500s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="migration_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "migration_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\migration_test.rs", Edition2021) }
0.917191300s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="migration_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.919469500s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="model_config_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "model_config_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\model_config_test.rs", Edition2021) }
0.919497700s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="model_config_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.922689500s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="prompt_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "prompt_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\prompt_test.rs", Edition2021) }
0.922771400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="prompt_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.926483800s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="relay_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "relay_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\relay_test.rs", Edition2021) }
0.926528800s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="relay_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.929864100s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="role_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "role_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\role_test.rs", Edition2021) }
0.929898400s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="role_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
0.931901900s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="telemetry_test"}: cargo::core::compiler::fingerprint: fingerprint dirty for zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)/Check { test: true }/TargetInner { kind: "test", name: "telemetry_test", benched: false, ..: with_path("G:\\ZClaw_openfang\\crates\\zclaw-saas\\tests\\telemetry_test.rs", Edition2021) }
0.931925900s INFO prepare_target{force=false package_id=zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas) target="telemetry_test"}: cargo::core::compiler::fingerprint: dirty: FsStatusOutdated(StaleDepFingerprint { name: "zclaw_saas" })
Checking zclaw-saas v0.1.0 (G:\ZClaw_openfang\crates\zclaw-saas)
Checking zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory)
error: could not compile `zclaw-memory` (lib test) due to 1 previous error
Checking desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)
error: could not compile `desktop` (lib test) due to 4 previous errors; 1 warning emitted
warning: build failed, waiting for other jobs to finish...
Checking zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory)
error: could not compile `desktop` (lib) due to 4 previous errors
error: could not compile `zclaw-memory` (lib test) due to 1 previous error

File diff suppressed because it is too large Load Diff