# Controller 控制器基类
## 概述
`Controller` 是所有业务控制器的基类，继承自 `Container` 容器类，核心作用是提供统一的响应格式封装（成功/失败响应），规范控制器层的返回数据结构，减少重复代码，提升开发效率。

## 依赖说明
| 依赖模块 | 路径 | 说明 |
|----------|------|------|
| `success`/`fail` | `../helper/response.js` | 响应格式封装工具函数，提供标准化的成功/失败响应结构 |
| `Container` | `./Container.js` | 基础容器类，为控制器提供组件类型标识等能力 |

## 类继承关系
```
Container <|-- Controller
```

## 构造函数
### 语法
```javascript
constructor()
```
### 说明
调用父类 `Container` 的构造函数，并指定组件类型为 `'controller'`，用于容器类对控制器组件的统一管理。

### 示例
```javascript
import Controller from './chanjs/base/Controller.js';

class UserController extends Controller {
  constructor() {
    super(); // 继承 Controller 构造逻辑
  }
}
```

## 核心方法
### 1. 成功响应 - `success(options)`
封装标准化的成功响应格式，返回统一结构的成功数据。

#### 参数说明
| 参数名 | 类型 | 必传 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `options` | `Object` | 否 | `{}` | 响应配置项 |
| `options.data` | `any` | 否 | - | 响应体数据，可传任意类型（对象、数组、基本类型等） |
| `options.msg` | `string` | 否 | `"操作成功"` | 响应提示消息 |

#### 返回值
`Object`：标准化的成功响应对象（结构由 `../helper/response.js` 的 `success` 函数定义）。

#### 示例
```javascript
class UserController extends Controller {
  async getUserInfo() {
    const data = { id: 1, name: "张三" };
    // 返回成功响应，使用默认提示语
    return this.success({ data });
    
    // 自定义提示语
    // return this.success({ data, msg: "获取用户信息成功" });
  }
}
```

### 2. 失败响应 - `fail(options)`
封装标准化的失败响应格式，返回统一结构的失败数据。

#### 参数说明
| 参数名 | 类型 | 必传 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `options` | `Object` | 否 | `{}` | 响应配置项 |
| `options.msg` | `string` | 否 | `"操作失败"` | 失败提示消息 |
| `options.data` | `any` | 否 | `{}` | 失败时附带的补充数据 |
| `options.code` | `number` | 否 | `201` | 自定义错误码，用于前端区分不同失败场景 |

#### 返回值
`Object`：标准化的失败响应对象（结构由 `../helper/response.js` 的 `fail` 函数定义）。

#### 示例
```javascript
class UserController extends Controller {
  async updateUserInfo() {
    try {
      // 业务逻辑：更新用户信息失败
      throw new Error("用户ID不存在");
    } catch (err) {
      // 返回失败响应，自定义提示语和错误码
      return this.fail({ 
        msg: err.message, 
        code: 400,
        data: { userId: 1 } // 附带失败关联的用户ID
      });
      
      // 使用默认配置
      // return this.fail();
    }
  }
}
```

## 完整使用示例
```javascript
import Controller from './chanjs/base/Controller.js';

/**
 * 用户业务控制器
 * 继承 Controller 基类，使用统一响应格式
 */
class UserController extends Controller {
  constructor() {
    super(); // 必须调用父类构造函数
  }

  /**
   * 获取用户列表
   * @returns {Object} 成功响应
   */
  async getList() {
    const list = [
      { id: 1, name: "张三" },
      { id: 2, name: "李四" }
    ];
    return this.success({ 
      data: list, 
      msg: "获取用户列表成功" 
    });
  }

  /**
   * 删除用户
   * @param {number} id - 用户ID
   * @returns {Object} 成功/失败响应
   */
  async delete(id) {
    if (!id) {
      return this.fail({ 
        msg: "用户ID不能为空", 
        code: 401 
      });
    }
    
    // 模拟删除成功
    return this.success({ msg: `删除ID为${id}的用户成功` });
  }
}

export default UserController;
```

## 注意事项
1. 所有自定义控制器必须继承 `Controller` 基类，以保证响应格式的统一性；
2. `success`/`fail` 方法的参数为可选配置对象，未传参时会使用默认值；
3. 响应的最终数据结构由 `../helper/response.js` 中的 `success`/`fail` 函数决定，若需调整全局响应格式，建议修改该工具文件；
4. 错误码 `code` 可根据业务场景自定义扩展（如 400 代表参数错误、404 代表资源不存在等），建议与前端约定统一的错误码规范。