菜单徽标

1. 概述

菜单徽标功能允许开发者在系统菜单上显示徽标(如数字、红点等),用于提醒用户某些状态或数量信息。例如,显示未读消息数量、待处理任务数量等。 菜单徽标

2. 核心组件

2.1 MenuBadgeConfig

该模型定义了菜单徽标的配置信息:

  • menuCode: 菜单唯一编码(对应前端路由path)
  • badge: 徽标文本(可选)
  • badgeType: 徽标类型(可选,支持 dot|normal)
  • badgeVariants: 徽标颜色样式(可选)

2.2 BadgeDataProvider

所有徽标数据提供器都需要实现该接口,其中必须实现getBadgeConfigs方法,用于返回该提供器管理的徽标配置列表。

2.3 BadgeConfigAggregator

系统全局的徽标配置聚合器,负责收集和管理所有徽标数据提供器,并提供获取所有徽标配置的方法getAllBadgeConfigs

3. 使用方法

3.1 创建自定义徽标数据提供器

要创建一个自定义徽标数据提供器,需要:

  1. 创建一个实现 BadgeDataProvider接口的类
  2. 添加 @Component 注解使该类成为Spring组件
  3. 实现 getBadgeConfigs 方法,返回 MenuBadgeConfig列表

示例:

import com.mldong.badge.BadgeDataProvider;
import com.mldong.badge.MenuBadgeConfig;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;

@Component
public class TestBadge implements BadgeDataProvider {
    @Override
    public List<MenuBadgeConfig> getBadgeConfigs() {
        return Arrays.asList(new MenuBadgeConfig(
            "/sys/timer/index", 
            "new", 
            "dot", 
            "#FD4E4E"
        ));
    }
}

3.2 徽标类型说明

  • badgeType="dot": 显示为小圆点徽标
  • badgeType="normal": 显示为普通文本徽标

3.3 颜色样式

  • badgeVariants可以是颜色值,如 "#FD4E4E"、"red" 等

3.4 在服务中实现动态徽标

如果需要根据业务逻辑动态生成徽标,可以在服务类中实现,下面是获取待办任务数量,并返回一个 MenuBadgeConfig 对象。

@Service
@RequiredArgsConstructor
public class ProcessTaskServiceImpl extends ServiceImpl<ProcessTaskMapper, ProcessTask> 
    implements ProcessTaskService, BadgeDataProvider {
    
    // ... 其他代码
    
    @Override
    public List<MenuBadgeConfig> getBadgeConfigs() {
        // 查询当前用户的待办任务数量
        Long userId = LoginUserHolder.getUserId();
        Integer count = baseMapper.selectTodoCount(ProcessTaskStateEnum.DOING.getCode(), userId);

        List<MenuBadgeConfig> badgeConfigs = new ArrayList<>();

        // 如果有待办任务,则添加徽标配置
        if (count != null && count > 0) {
            MenuBadgeConfig config = new MenuBadgeConfig();
            config.setMenuCode("/wf/process-task/todo");
            config.setBadge(String.valueOf(count));
            config.setBadgeType("normal");
            config.setBadgeVariants("destructive"); // 使用红色标识紧急/重要任务
            badgeConfigs.add(config);
        }
        
        if(CollectionUtil.isNotEmpty(badgeConfigs)){
            // 子项存在,则父项也需要,工作流程
            MenuBadgeConfig config = new MenuBadgeConfig();
            config.setMenuCode("/wf/manager");
            config.setBadge("");
            config.setBadgeType("dot");
            config.setBadgeVariants("destructive"); // 使用红色标识紧急/重要任务
            badgeConfigs.add(config);
        }
        
        return badgeConfigs;
    }
}

4. 获取徽标配置

前端可以通过调用相应接口获取所有徽标配置,系统会通过 BadgeConfigAggregatorgetAllBadgeConfigs 方法聚合所有提供器的数据。

5. 自动加载机制

系统会自动通过Spring的依赖注入机制收集所有实现了BadgeDataProvider 接口的Bean,并在 BadgeConfigAggregator 中进行聚合。

6. 最佳实践

  1. 合理使用: 徽标应仅用于重要提醒,避免过多使用导致用户忽略
  2. 性能考虑: 在 getBadgeConfigs 方法中避免执行耗时操作,可考虑使用缓存
  3. menuCode 对应: 确保 menuCode 与前端路由路径一致,以便正确显示徽标
  4. 类型选择: 根据实际需求选择合适的徽标类型(数字 or 红点)

7. 示例应用场景

  1. 显示待处理任务数量
  2. 显示未读消息数
  3. 显示系统警告或新功能提示
  4. 显示用户申请或审核状态