# 配置版本管理模块 - 快速开始

## 5分钟快速上手

### 步骤1: 创建数据库表 (1分钟)

在MySQL数据库中执行以下SQL：

```sql
-- 配置版本表
CREATE TABLE `config_version` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `app_code` varchar(50) DEFAULT NULL COMMENT '应用编码',
  `key` varchar(100) DEFAULT NULL COMMENT '键值',
  `version` varchar(50) DEFAULT NULL COMMENT '版本号',
  `status` int(11) DEFAULT '0' COMMENT '状态：0-禁用，1-启用',
  `owner_by` bigint(20) DEFAULT NULL COMMENT '所有者',
  `create_by` bigint(20) DEFAULT NULL COMMENT '创建人',
  `update_by` bigint(20) DEFAULT NULL COMMENT '更新人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_delete` tinyint(1) DEFAULT '0' COMMENT '是否删除：0-未删除，1-已删除',
  `enabled` tinyint(1) DEFAULT '1' COMMENT '是否启用：0-禁用，1-启用',
  `sort` int(11) DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (`id`),
  KEY `idx_app_code` (`app_code`),
  KEY `idx_key` (`key`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置版本表';
```

或者执行项目中的SQL文件：
```bash
mysql -u your_username -p your_database < storlead-knowledge/sql/config_version.sql
```

### 步骤2: 编译项目 (2分钟)

在项目根目录执行：

```bash
cd E:\workspace\storlead-sasa-platform
mvn clean install -DskipTests
```

### 步骤3: 启动应用 (1分钟)

启动包含knowledge模块的Spring Boot应用。

### 步骤4: 测试API (1分钟)

#### 方式1: 使用Swagger UI
访问: `http://localhost:8080/doc.html`

找到"知识库: 配置版本管理"分组，即可看到所有接口。

#### 方式2: 使用curl命令

**保存配置版本:**
```bash
curl -X POST http://localhost:8080/knowledge/config-version/save \
  -H "Content-Type: application/json" \
  -d '{
    "name": "数据库连接配置",
    "appCode": "USER_SERVICE",
    "key": "db.connection.url",
    "version": "1.0.0",
    "status": 1
  }'
```

**查询配置版本列表:**
```bash
curl -X GET "http://localhost:8080/knowledge/config-version/page?pageIndex=1&pageSize=10"
```

**根据应用编码和键值查询:**
```bash
curl -X GET "http://localhost:8080/knowledge/config-version/by-app-key?appCode=USER_SERVICE&key=db.connection.url"
```

## 常用场景示例

### 场景1: 为微服务管理配置版本

```bash
# 为用户服务添加配置
curl -X POST http://localhost:8080/knowledge/config-version/save \
  -H "Content-Type: application/json" \
  -d '{
    "name": "用户服务数据库URL",
    "appCode": "user-service",
    "key": "spring.datasource.url",
    "version": "1.0.0",
    "status": 1
  }'

# 为订单服务添加配置
curl -X POST http://localhost:8080/knowledge/config-version/save \
  -H "Content-Type: application/json" \
  -d '{
    "name": "订单服务Redis地址",
    "appCode": "order-service",
    "key": "spring.redis.host",
    "version": "1.0.0",
    "status": 1
  }'
```

### 场景2: 查询某个应用的所有配置

```bash
curl -X GET "http://localhost:8080/knowledge/config-version/page?pageIndex=1&pageSize=100&appCode=user-service"
```

### 场景3: 搜索包含特定关键词的配置

```bash
curl -X GET "http://localhost:8080/knowledge/config-version/page?pageIndex=1&pageSize=10&keyword=database"
```

### 场景4: 更新配置版本

```bash
# 先查询获取ID
curl -X GET "http://localhost:8080/knowledge/config-version/by-app-key?appCode=USER_SERVICE&key=db.connection.url"

# 然后更新（假设ID为1）
curl -X PUT http://localhost:8080/knowledge/config-version/update \
  -H "Content-Type: application/json" \
  -d '{
    "id": 1,
    "name": "数据库连接配置",
    "appCode": "USER_SERVICE",
    "key": "db.connection.url",
    "version": "2.0.0",
    "status": 1
  }'
```

## 代码中使用

### 在Service中注入并使用

```java
@Service
public class YourService {
    
    @Resource
    private ConfigVersionService configVersionService;
    
    public void example() {
        // 1. 根据应用编码和键值获取配置
        ConfigVersionEntity config = configVersionService.getByAppCodeAndKey("USER_SERVICE", "db.url");
        
        // 2. 保存新配置
        ConfigVersionDTO dto = new ConfigVersionDTO();
        dto.setName("新配置");
        dto.setAppCode("MY_APP");
        dto.setKey("my.key");
        dto.setVersion("1.0.0");
        dto.setStatus(1);
        configVersionService.saveByDTO(dto);
        
        // 3. 分页查询
        IPage<ConfigVersionVO> page = configVersionService.pageVO(1, 10, "USER_SERVICE", null);
    }
}
```

### 在Controller中添加自定义接口

```java
@RestController
@RequestMapping("/your-path/")
public class YourController {
    
    @Resource
    private ConfigVersionService configVersionService;
    
    @GetMapping("config/{appCode}/{key}")
    public Result<ConfigVersionEntity> getConfig(@PathVariable String appCode, 
                                                  @PathVariable String key) {
        ConfigVersionEntity config = configVersionService.getByAppCodeAndKey(appCode, key);
        return Result.ok(config);
    }
}
```

## 常见问题

### Q1: 为什么保存后createTime和updateTime自动填充了？
A: 因为Entity继承了SysBaseField，框架会自动填充这些字段。

### Q2: 如何实现逻辑删除？
A: 调用`removeById()`方法时，框架会自动将`is_delete`字段设置为1，而不是真正删除数据。

### Q3: 如何添加自定义查询条件？
A: 在Service实现类中使用LambdaQueryWrapper构建查询条件。

### Q4: DTO和Entity有什么区别？
A: 
- DTO用于接收前端数据，包含验证注解
- Entity用于数据库持久化，包含MyBatis Plus注解
- 两者通过Orika自动映射转换

### Q5: 如何添加事务支持？
A: 在Service方法上添加`@Transactional`注解。

## 下一步

1. 阅读完整文档: `CONFIG_VERSION_README.md`
2. 查看创建总结: `CREATE_SUMMARY.md`
3. 运行单元测试了解更多信息
4. 根据业务需求扩展功能

## 需要帮助？

- 查看完整的API文档（Swagger）
- 阅读源码注释
- 参考其他模块的实现方式