3.9 KiB
Raw Blame History

右键菜单服务 - 模块化架构

概述

右键菜单服务已重构为模块化架构,按业务逻辑分离到不同的文件中,提高了代码的可维护性和可扩展性。

文件夹结构

src/services/context-menu/
├── index.ts                    # 主入口文件,导出所有服务
├── state-manager.ts           # 核心状态管理
├── event-parser.ts            # 事件解析器
├── storage-menu.service.ts    # 库位相关业务逻辑
├── robot-menu.service.ts      # 机器人相关业务逻辑
├── menu-config.service.ts     # 菜单配置服务
└── README.md                  # 说明文档

组件结构

src/components/context-menu/
├── index.ts                   # 组件入口文件
├── context-menu.vue          # 主菜单组件
├── storage-menu.vue          # 库位菜单组件
├── robot-menu.vue            # 机器人菜单组件
└── default-menu.vue          # 默认菜单组件

核心模块说明

1. 状态管理 (state-manager.ts)

  • 提供纯函数和状态管理工具
  • 避免单例模式的问题
  • 支持订阅/通知机制

2. 事件解析 (event-parser.ts)

  • 解析鼠标事件和pen数据
  • 提取事件信息
  • 纯函数,无副作用

3. 库位菜单服务 (storage-menu.service.ts)

  • 处理库位相关的菜单逻辑
  • 库位状态检查
  • 库位操作处理

4. 机器人菜单服务 (robot-menu.service.ts)

  • 处理机器人相关的菜单逻辑
  • 机器人状态管理
  • 机器人操作处理

5. 菜单配置服务 (menu-config.service.ts)

  • 统一管理不同业务类型的菜单配置
  • 提供统一的菜单配置入口

使用方式

基本使用

import { createContextMenuManager, handleContextMenu, handleContextMenuFromPenData } from '@/services/context-menu';

// 创建状态管理器
const manager = createContextMenuManager();

// 处理右键事件
handleContextMenu(event, manager, {
  storageLocationService: storageService,
  robotService: robotService,
});

组件使用

<template>
  <ContextMenu
    :visible="menuVisible"
    :x="menuX"
    :y="menuY"
    :menu-type="menuType"
    :storage-locations="storageLocations"
    :robot-info="robotInfo"
    @close="handleClose"
    @action-complete="handleActionComplete"
  />
</template>

<script setup>
import { ContextMenu } from '@/components/context-menu';
</script>

扩展新业务类型

1. 添加新的业务服务

src/services/context-menu/ 下创建新的服务文件,例如 point-menu.service.ts

export interface PointMenuConfig {
  menuType: 'point' | 'default';
  pointInfo?: PointInfo;
}

export function getPointMenuConfig(data: ParsedEventData): PointMenuConfig {
  // 实现点位菜单逻辑
}

2. 添加新的组件

src/components/context-menu/ 下创建新的组件文件,例如 point-menu.vue

<template>
  <div class="point-menu">
    <!-- 点位菜单内容 -->
  </div>
</template>

<script setup lang="ts">
// 实现点位菜单组件
</script>

3. 更新菜单配置服务

menu-config.service.ts 中添加新的业务类型处理:

case 'point':
  return getPointMenuConfig(data);

4. 更新主菜单组件

context-menu.vue 中添加新的组件:

<PointMenu
  v-else-if="menuType === 'point' && pointInfo"
  :point-info="pointInfo"
  @action-complete="handleActionComplete"
/>

向后兼容

原有的 context-menu.service.ts 文件仍然保留,作为向后兼容的入口,重新导出新的模块化服务。现有代码无需修改即可继续使用。

优势

  1. 模块化: 按业务逻辑分离,代码更清晰
  2. 可维护性: 每个模块职责单一,易于维护
  3. 可扩展性: 新增业务类型只需添加对应模块
  4. 可测试性: 每个模块可独立测试
  5. 向后兼容: 保持现有API不变