ruwebframe 0.1.3

a simple webframe for rust actix-web, based on rudi and rbatis.
Documentation
 
## `database` 目录功能总结


`src/database/` 是项目的**数据库连接层**,封装了 **PostgreSQL** 和 **Redis** 两种数据源的连接管理,并通过项目的 DI 容器实现全局单例注入。

### 文件结构


```
src/database/
├── mod.rs                  # 模块导出
├── database.rs             # PostgreSQL 连接封装
├── database_init.rs        # Database 单例注册(自动生成)
├── database_test.rs        # PostgreSQL 测试
├── redisclient.rs          # Redis 客户端封装
├── redisclient_init.rs     # RedisClient 单例注册(自动生成)
└── redisclient_test.rs     # Redis 测试
```

---

### 1. `Database` — PostgreSQL 连接


[`database.rs`](file:///E:/soft/gitee.com/ruwebframe/src/database/database.rs)

| 项目 | 说明 |
|------|------|
| **结构体** | `Database { gorm: Gorm, datasource: DataSource }` |
| **配置来源** | 从全局配置 `rucfg::find_bean_ruconfig()` 读取 `gorm``datasource` |
| **核心方法** | `conn()` → 创建 `postgres::Client` 连接,返回 `Result<Client, postgres::Error>` |
| **注入方式** | 单例(`register_singleton`),全局唯一实例 |
| **获取方式** | `database::find_bean_database().unwrap()` 获取 `Arc<Database>` |

使用示例(来自 [database_test.rs](file:///E:/soft/gitee.com/ruwebframe/src/database/database_test.rs)):
```rust
// 建表
let db = database::find_bean_database().unwrap();
db.conn().unwrap().execute("CREATE TABLE IF NOT EXISTS users1 (...)", &[]);

// 查询
for row in db.conn().unwrap().query("SELECT * FROM users LIMIT 3", &[]) {
    println!("{:?}", row.get::<_, i32>(0));
}
```

---

### 2. `RedisClient` — Redis 客户端


[`redisclient.rs`](file:///E:/soft/gitee.com/ruwebframe/src/database/redisclient.rs)

| 项目 | 说明 |
|------|------|
| **结构体** | `RedisClient { redisDto: RedisDto, client: Option<redis::Client> }` |
| **配置来源** | 从全局配置 `rucfg::find_bean_ruconfig()` 读取 `redis` 配置 |
| **Trait** | `TraitRedis` 定义了 `conn()``set_key()``get_key()``del_key()` 四个接口 |
| **核心方法** | `reopen()` 重新打开连接;`set_key/get_key/del_key` 键值操作 |
| **注入方式** | 单例(`register_singleton`),全局唯一实例 |
| **获取方式** | `database::find_bean_redisclient().unwrap()` 获取 `Arc<RedisClient>` |

---

### 3. 自动注入机制


`database_init.rs` 和 `redisclient_init.rs` 是**自动生成的代码**(注释标注 `StructInit自动生成`),通过 `#[ctor(unsafe)]` 在程序启动时自动注册到 DI 容器:

```
程序启动 → ctor 自动执行 init() → register_bean_xxx() → direg::register_singleton()
```

之后任何地方通过 `find_bean_database()` / `find_bean_redisclient()` 即可获取全局单例。

---

### 架构图示


```
┌─────────────────────────────────────────┐
│              rucfg (全局配置)              │
│   datasource / gorm / redis 配置项        │
└──────────────┬──────────────────────────┘
               │ 读取配置
    ┌──────────┴──────────┐
    ▼                     ▼
┌───────────┐      ┌──────────────┐
│ Database  │      │ RedisClient  │
│ (PG连接)  │      │ (Redis连接)  │
└─────┬─────┘      └──────┬───────┘
      │                   │
      ▼                   ▼
┌─────────────────────────────────────────┐
│         DI 容器 (direg 全局单例)          │
│  find_bean_database() / find_bean_redisclient() │
└─────────────────────────────────────────┘
```

简而言之,`database` 目录就是一个**统一的数据源访问层**,将 PostgreSQL 和 Redis 的连接管理封装为 DI 单例,配合项目的自动注入框架,实现"配置驱动、即取即用"的数据库访问模式。