Agent Detail 分层架构说明
📁 文件结构
pages/agent-detail/
├── agent-detail.uvue # 主组件文件 (包含控制器逻辑和视图层逻辑)
├── styles/ # 样式文件目录
│ └── agent-detail.scss # 页面样式文件
└── layers/ # 分层架构目录
├── README.md # 本说明文档
├── AgentDetailData.uts # 数据层
├── AgentDetailUtils.uts # 工具层
├── AgentDetailService.uts # 服务层
├── ComponentManager.uts # 组件管理层
└── ScrollManager.uts # 滚动管理层
🏗️ 架构层次
1. 数据层 (Data Layer) - AgentDetailData.uts
职责: 负责状态管理和数据存储
- 管理所有响应式数据 (
ref) - 存储组件引用和私有变量
- 提供数据的统一访问接口
特点:
- 纯数据类,不包含业务逻辑
- 所有数据都是响应式的
- 便于状态管理和调试
2. 工具层 (Utility Layer) - AgentDetailUtils.uts
职责: 提供通用的工具函数
- 类型判断和转换
- ID生成和数据处理
- 纯函数设计,无副作用
特点:
- 静态方法,无需实例化
- 易于测试和复用
- 与业务逻辑解耦
3. 服务层 (Service Layer) - AgentDetailService.uts
职责: 负责业务逻辑和API调用
- 处理API请求和响应
- 管理业务流程
- 协调数据层和外部服务
特点:
- 依赖注入数据层
- 包含复杂的业务逻辑
- 处理异步操作
4. 组件管理层 (Component Management Layer) - ComponentManager.uts
职责: 负责组件的引用管理和更新
- 管理子组件的引用
- 处理组件间的通信
- 提供组件更新接口
特点:
- 管理组件生命周期
- 处理组件间依赖关系
- 提供组件更新策略
5. 滚动管理层 (Scroll Management Layer) - ScrollManager.uts
职责: 专门处理滚动相关的逻辑
- 管理滚动状态
- 处理滚动事件
- 控制自动滚动行为
特点:
- 专注于滚动功能
- 与业务逻辑解耦
- 易于独立测试
6. 视图层 (View Layer) - agent-detail.uvue
职责: 负责用户交互和事件处理
- 处理用户操作
- 协调各层之间的交互
- 管理视图状态
特点:
- 直接在主组件中实现
- 处理用户交互逻辑
- 协调各层功能
7. 主控制器 (Main Controller) - agent-detail.uvue
职责: 协调各层之间的交互
- 初始化各层实例
- 管理依赖关系
- 设置监听器和生命周期
特点:
- 直接在主组件中实现
- 管理各层生命周期
- 便于查看和维护
🔄 数据流向
用户操作 → View Layer (主组件) → Service → Data
↓
组件更新 ← ComponentManager ← Data
↓
滚动控制 ← ScrollManager ← Data
💡 使用方式
在主组件中使用
// 1. 导入各层
import AgentDetailData from './layers/AgentDetailData.uts'
import AgentDetailService from './layers/AgentDetailService.uts'
import ComponentManager from './layers/ComponentManager.uts'
import ScrollManager from './layers/ScrollManager.uts'
// 2. 创建各层实例
const data = new AgentDetailData()
const service = new AgentDetailService(data)
const componentManager = new ComponentManager(data)
const scrollManager = new ScrollManager(data)
// 3. 直接在组件中实现视图层方法
const handleMorePopup = (): void => {
if (data.refMorePopup.value) {
nextTick(() => {
data.refMorePopup.value?.open()
})
}
}
// 4. 使用各层功能
const messageList = data.messageList
await service.handleSendMessage('Hello')
componentManager.setMessageRef(el, 'msg-1')
scrollManager.scrollToLastMsg(true)
添加新功能
- 新增数据: 在
AgentDetailData.uts中添加新的ref - 新增工具: 在
AgentDetailUtils.uts中添加新的静态方法 - 新增业务: 在
AgentDetailService.uts中添加新的方法 - 新增组件管理: 在
ComponentManager.uts中添加新的组件管理逻辑 - 新增滚动功能: 在
ScrollManager.uts中添加新的滚动控制 - 新增交互: 直接在
agent-detail.uvue中添加新的事件处理方法 - 新增控制器逻辑: 直接在
agent-detail.uvue中添加
✅ 架构优势
- 职责分离: 每个类都有明确的职责边界
- 依赖注入: 通过构造函数注入依赖,降低耦合
- 易于测试: 每个层都可以独立进行单元测试
- 代码复用: 工具方法可以在其他地方复用
- 维护性提升: 修改某个功能时,只需要关注对应的层
- 扩展性增强: 新增功能时,可以轻松添加新的类或方法
- 便于维护: 控制器逻辑和视图层逻辑直接在主组件中,方便查看和调试
🧪 测试策略
- 数据层: 测试数据初始化和响应式更新
- 工具层: 测试工具函数的输入输出
- 服务层: 测试API调用和业务逻辑
- 组件管理层: 测试组件引用管理
- 滚动管理层: 测试滚动状态和事件
- 视图层: 测试用户交互处理(在主组件中)
- 主控制器: 测试各层协调和初始化(在主组件中)
📝 注意事项
- 依赖关系: 确保各层之间的依赖关系清晰
- 错误处理: 在服务层和组件管理层添加适当的错误处理
- 性能优化: 避免在数据层中存储过多数据
- 类型安全: 使用TypeScript确保类型安全
- 文档更新: 添加新功能时及时更新文档
- 控制器维护: 控制器逻辑在主组件中,需要保持代码整洁
- 视图层维护: 视图层方法直接在主组件中,便于调试和维护
- 样式维护: 样式文件独立管理,便于主题定制和样式复用