ruwebframe 0.1.4

a simple webframe for rust actix-web, based on rudi and rbatis.
Documentation
## 自动生成代码

### 代码自动生成

  
## `data` 目录解析


`data` 是项目的**数据访问对象(DAO)层**,遵循传统的 DAO 设计模式,作为业务逻辑与数据库之间的抽象层。目前处于早期阶段,定义了一个示例 `DBDao` 结构体作为 DAO 的模板。

### 文件结构


```
data/
├── mod.rs           # 模块导出
├── dbdao.rs         # DAO 结构体定义 DBDao
├── dbdao_init.rs    # DBDao 的 DI 注册(自动生成)
└── dbdao_test.rs    # DAO 测试 + DI 单例/多例验证
```

---

### 核心设计:`DBDao`


[dbdao.rs](file:///E:/soft/gitee.com/ruwebframe/src/data/dbdao.rs) 是目前唯一的 DAO:

```rust
use crate::rubase::BaseEntity;
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Clone, Default, Serialize)]

pub struct DBDao {}

impl BaseEntity for DBDao {}  // ⭐ 多例模式

impl DBDao {
    pub fn test(&self) -> String {
        "test".to_string()
    }
}
```

**设计要点**:
- 实现了 `BaseEntity`(多例模式),每次 `get_bean` 返回新实例
- 派生 `Default`,DI 容器通过 `DBDao::default` 构造
- 目前是空壳模板,方法预留了 `test()` 用于验证

---

### DI 注册(自动生成)


[dbdao_init.rs](file:///E:/soft/gitee.com/ruwebframe/src/data/dbdao_init.rs) 由 `rucmd rudi all` 自动生成:

```rust
#[ctor(unsafe)]

pub fn init() {
    register_bean_dbdao();
}

pub fn find_bean_dbdao() -> Option<Arc<DBDao>> {
    direg::get_bean::<DBDao>(SINGLE_BEAN_NAME)
}

pub fn register_bean_dbdao() {
    direg::register(SINGLE_BEAN_NAME, DBDao::default);  // 多例注册
}
```

---

### 测试文件中的验证逻辑


[dbdao_test.rs](file:///E:/soft/gitee.com/ruwebframe/src/data/dbdao_test.rs) 除了测试 DAO 本身,还包含了**单例/多例模式的验证**:

```rust
// 测试1:触发 DI 代码生成
#[test]

fn test_01_rudi() {
    find_bean_difactroy().unwrap().make_di()
}

// 测试2:DAO 基本功能
#[test]

fn test_02_dbdao() {
    let s = data::find_bean_dbdao().unwrap().test();
    assert_eq!("test", s);
}

// 测试3:验证单例模式 — 两次获取地址相同
#[test]

fn test_03_single_case() {
    let bean1 = find_bean_difactroy().unwrap();
    let bean2 = find_bean_difactroy().unwrap();
    let addr1 = Arc::as_ptr(&bean1);
    let addr2 = Arc::as_ptr(&bean2);
    assert_eq!(addr1, addr2);  // ✅ 单例:地址相同
}

// 测试4:验证多例模式 — 两次获取地址不同
#[test]

fn test_04_multi_case() {
    let bean1 = cfgdto::find_bean_gorm().unwrap();
    let bean2 = cfgdto::find_bean_gorm().unwrap();
    let addr1 = Arc::as_ptr(&bean1);
    let addr2 = Arc::as_ptr(&bean2);
    assert_ne!(addr1, addr2);  // ✅ 多例:地址不同
}
```

---

### 架构定位


`data` 目录在整个项目中的位置:

```
┌─────────────────────────────────────────────────────────┐
│                    业务层 / 领域层                        │
│  rudomain / rudb / dbentity / dbexample                 │
│  → 定义 Person、User 等实体                              │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│                    data (DAO 层)                          │
│                                                          │
│  DBDao / find_bean_dbdao()                               │
│  → 封装数据库 CRUD 操作                                   │
│  → 多例模式,每次调用创建新实例                             │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│                    database (连接层)                       │
│  Database (PostgreSQL) / RedisClient (Redis)             │
│  → 底层连接管理、连接池                                     │
└─────────────────────────────────────────────────────────┘
```

---

### 设计意图


| 层级 | 职责 | 示例 |
|------|------|------|
| `rudomain` | 实体定义(POJO) | `Person { id, name, age }` |
| `data` | 数据访问(DAO) | `DBDao.insert_person()` / `DBDao.find_by_id()` |
| `database` | 连接管理 | `Database.conn()` / `RedisClient.get_key()` |

这是典型的**三层数据架构**:
- `data/DBDao` 是中间层,屏蔽底层数据库差异
- 业务代码不直接调用 `database::Database`,而是通过 `data::DBDao` 操作
- 未来可扩展为 `UserDao``OrderDao` 等业务 DAO

---

**总结**:`data` 目录是项目的 DAO 层,目前包含一个 `DBDao` 模板结构体,采用多例 DI 模式,处于早期搭建阶段。它的测试文件同时也是验证 rudi DI 框架单例/多例模式正确性的重要测试用例。后续业务 DAO(如 `UserDao`、`OrderDao`)将在此目录下扩展。