# CSM 知识库 ## 项目画像 CSM (Client Security Manager) — 医院终端安全管控平台,C/S + Web 三层架构。管理 11 个安全插件,覆盖上网拦截、U盘管控、打印审计、剪贴板管控、补丁管理等场景。 **关键数字**: 3 个 Rust crate + Vue 前端 | 18 个数据库迁移 | 13 个客户端插件 | ~30 个 API 端点 | 自定义 TCP 二进制协议 ## 模块导航树 ``` CSM ├── [[protocol]] — 二进制协议层(Frame 编解码、MessageType、payload 定义) ├── [[server]] — 服务端(HTTP API + TCP 接入 + WebSocket + SQLite) ├── [[client]] — 客户端代理(Windows 服务、插件采集、自动重连) ├── [[web-frontend]] — Web 管理面板(Vue 3 SPA) ├── [[plugins]] — 插件体系(端到端设计、新增插件清单) └── [[database]] — 数据库层(SQLite、迁移、操作方法) ``` ## 核心架构决策 ### 为什么用自定义 TCP 二进制协议而不是 HTTP? 内网环境低延迟需求,二进制帧比 HTTP 更省带宽和延迟。帧头仅 10 字节(MAGIC+VERSION+TYPE+LENGTH),payload 用 JSON 保持可调试性。 ### 为什么插件配置用 watch channel 而不是 HTTP 轮询? Server 主动推送配置变更到 Client,避免轮询延迟。`tokio::watch` 保证每个插件总是读到最新配置值,配置下发 → 全链路秒级生效。 ### 为什么嵌入前端而不是独立部署? `include_dir!` 编译时打包 `web/dist/`,部署只需一个 server 二进制文件。SPA fallback 让前端路由(如 `/devices`)直接返回 `index.html`。 ### 为什么 SQLite 而不是 PostgreSQL? 医院内网单机部署场景,零外部依赖。WAL 模式 + 64MB 缓存足以支撑数百台终端的并发写入。 ### 为什么三级作用域推送(global/group/device)? 医院按科室分组管理设备。全局策略作为基线,科室策略覆盖特定需求,单设备策略处理例外情况。`push_to_targets()` 自动解析作用域并过滤在线设备。 ## 技术栈速查 | 层 | 技术 | |----|------| | 服务端 | Rust + Axum + SQLx + SQLite + JWT + Rustls | | 客户端 | Rust + Tokio + sysinfo + windows-rs | | 协议 | 自定义 TCP 二进制(MAGIC + VERSION + TYPE + LENGTH + JSON payload) | | 前端 | Vue 3 + TypeScript + Vite + Element Plus + Pinia + ECharts | | 构建 | Cargo workspace + npm |