feat(protocol): 添加补丁管理和行为指标协议类型 feat(client): 实现补丁管理插件采集功能 feat(server): 添加补丁管理和异常检测API feat(database): 新增补丁状态和异常检测相关表 feat(web): 添加补丁管理和异常检测前端页面 fix(security): 增强输入验证和防注入保护 refactor(auth): 重构认证检查逻辑 perf(service): 优化Windows服务恢复策略 style: 统一健康评分显示样式 docs: 更新知识库文档
2.4 KiB
2.4 KiB
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 |