## ruweb 目录结构
```
ruweb/
├── mod.rs — 模块入口
├── readme.MD
├── webserver/ — Web 服务器(启动、配置)
│ ├── mod.rs
│ ├── ruapp.rs — RuApp 核心
│ ├── ruapp_init.rs — DI 自动注入
│ ├── start_web.rs — 统一入口
│ ├── example.rs — 旧代码
│ └── readme.MD
├── webrouter/ — 路由系统(注册、容器)
│ ├── mod.rs — 导出 + reg_route! 宏
│ ├── route_container.rs — RouteConfigContainer + register_route
│ ├── route_factroy.rs — OnceLock 全局容器 + with_container_mut
│ └── ctl/ — 路由构建器 + 示例 handler
│ ├── mod.rs
│ ├── ctl.rs — manual_hello handler
│ ├── routebuilder.rs — RouteBuilder + route_get/post/put/delete
│ └── routebuilder_init.rs — DI 自动注入
├── webclient/ — HTTP 客户端(空)
│ ├── mod.rs
│ └── readme.MD
└── webmiddle/ — 中间件(空)
├── mod.rs
└── readme.MD
```
Let me now present the analysis.
## `ruweb/` 完整目录结构
```
ruweb/
├── mod.rs — 入口:导出 4 个子模块
├── readme.MD
│
├── webserver/ — 【Web 服务器层】
│ ├── start_web.rs — 统一入口:命令行 / Web 分流
│ ├── ruapp.rs — RuApp 核心:HttpServer 启动
│ ├── ruapp_init.rs — DI 自动注入(自动生成)
│ └── example.rs — 旧示例代码(全部注释)
│
├── webrouter/ — 【路由系统层】
│ ├── mod.rs — 导出 + reg_route! 宏
│ ├── route_factroy.rs — ⭐ OnceLock 全局容器 + with_container_mut
│ ├── route_container.rs — RouteConfigContainer + register_route
│ └── ctl/ — 路由构建器 + 示例 handler
│ ├── ctl.rs — manual_hello 等 handler
│ ├── routebuilder.rs — RouteBuilder + route_get/post/put/delete
│ └── routebuilder_init.rs — DI 自动注入
│
├── webclient/ — 【HTTP 客户端】(待开发)
└── webmiddle/ — 【中间件】(待开发)
```
---
## 三层架构
```
┌─────────────────────────────────────────────────────┐
│ webserver (启动层) │
│ start_web → RuApp.run() → HttpServer::new │
│ │ │
│ ┌─────────────────────────────────────────────┐ │
│ │ webrouter (路由层) │ │
│ │ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ route_factroy.rs │ │ route_container │ │ │
│ │ │ │ │ .rs │ │ │
│ │ │ OnceLock<Mutex< │ │ │ │ │
│ │ │ RouteConfig │ │ Mutex<Vec<Box< │ │ │
│ │ │ Container>> │ │ RouteConfigFn>>│ │ │
│ │ │ │ │ │ │ │
│ │ │ with_container │ │ add() │ │ │
│ │ │ _mut() │ │ apply_routes() │ │ │
│ │ └────────┬─────────┘ └────────┬─────────┘ │ │
│ │ │ │ │ │
│ │ ┌────────┴─────────────────────┴──────────┐ │ │
│ │ │ ctl/routebuilder.rs │ │ │
│ │ │ RouteBuilder + route_get/post/put/del │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ │ reg_route! 宏 (mod.rs) │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ webclient (客户端层) — 空 │ │
│ ├─────────────────────────────────────────────┤ │
│ │ webmiddle (中间件层) — 空 │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
---
## 核心数据流
```
各模块 register()
│
│ reg_route!(name, "/path", get, handler)
│ │
│ ├── fn name(cfg) { cfg.route(...) } // 生成函数
│ └── register_route(name) // 注册
│ │
│ └── with_container_mut(|c| c.add(name))
│ │
│ └── Mutex<Vec<Box<RouteConfigFn>>>.push()
│
▼
HttpServer::new(|| App::new().configure(|cfg| {
with_container_mut(|c| c.apply_routes(cfg)) // 遍历执行
}))
```
---
## 关键文件速查
| 文件 | 职责 | 核心 API |
|------|------|---------|
| [route_factroy.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruweb/webrouter/route_factroy.rs) | 全局容器 | `OnceLock<Mutex<RouteConfigContainer>>`, `with_container_mut()` |
| [route_container.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruweb/webrouter/route_container.rs) | 路由存储 | `add()`, `apply_routes()`, `register_route()` |
| [mod.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruweb/webrouter/mod.rs) | 宏定义 | `reg_route!(name, path, get, handler)` |
| [routebuilder.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruweb/webrouter/ctl/routebuilder.rs) | 构建器 | `RouteBuilder`, `route_get()`, `route_post()` |
| [ruapp.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruweb/webserver/ruapp.rs) | 启动 | `RuApp::run()` → `HttpServer::new` |
| [start_web.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruweb/webserver/start_web.rs) | 入口 | `start_web()` 命令行/Web 分流 |
## 两套路由系统对比
| | `RouteConfigContainer` | `RouteBuilder` |
|------|------|------|
| 存储 | `Mutex<Vec<Box<RouteConfigFn>>>` | `Arc<Mutex<Vec<Box<dyn Fn>>>>` |
| 访问 | `OnceLock` 全局静态 | DI 容器 `find_bean_routebuilder()` |
| 注册 | `register_route(fn)` | `builder.add(closure)` |
| 应用 | `apply_routes(cfg)` | `apply(cfg)` |
| 现状 | ✅ 主力使用 | 备用(`ctl/` 内) |