# easy-dict **Repository Path**: wrxfxdd/easy-dict ## Basic Information - **Project Name**: easy-dict - **Description**: 数据字典翻译,数据字典转换,数据字典映射 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 1 - **Created**: 2025-08-27 - **Last Updated**: 2025-11-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EasyDict 1.0.7 ## 开源、免费、轻量级 Java 字典翻译组件,让代码变得简单、优雅! ## 关联 数据字典转换、数据字典翻译、数据字典组件、数据字典工具 ## 📖 EasyDict 介绍 EasyDict 是一款轻量级、零侵入设计 Java 数据字典转换框架,目前拥有两种数据源获取方式:实现接口、指定枚举类。四大核心功能:注解转换、缓存机制、工具类手动转换、自定义字段转义后缀等! ## ✨ 核心特性 - 🔧 **使用简单** - 只需加一个注解,无需任何配置 - 🎯 **零侵入设计** - 基于注解驱动,无需修改现有业务逻辑 - 📊 **缓存管理** - 内置缓存统计和管理功能 - 🛡️ **支持枚举数据源** - 支持项目中已有的枚举进行翻译 ## 🚀 快速开始 ### 1. 添加Maven依赖 #### jdk8 ```xml io.gitee.wrxfxdd easy-dict 1.0.7 ``` #### jdk17 ```xml io.gitee.wrxfxdd easy-dict 2.0.7 ``` ### 2. 获取数据源 #### 选择数据源采用模式 | 系统字典架构 | 采用模式 | 简介 | |---------|--------|----------------------| | 字典存储在数据库 | 模式一 | 只需实现获取数据源接口 、无需配置 | | 字典使用的枚举 | 模式二 | 加注解直接使用,无需实现方法、无需配置、 | | 两者同时存在 | 模式一+模式二 | 同时使用 | #### 模式一:创建一个类实现 DictProvider 接口 ```java @Component public class EasyDictProvider implements DictProvider { @Autowired private DictionaryService dictionaryService; @Override public String getDictName(String typeCode, String value) { // 根据typeCode和value查询字典表或缓存 // 示例:从数据库查询 return dictionaryService.getDictLabel(typeCode, value); }} ``` #### 模式二:创建一个枚举 默认字段是 `code` 和 `label`,如果字段不一样,也无所谓,在使用注解的时候指定下即可 ```java public enum GameTypeEnum { WZRY("1", "王者荣耀"), LOL("2", "英雄联盟"); private final String code; private final String label; GameTypeEnum(String code, String label) { this.code = code; this.label = label; } public String getCode() { return code; } public String getLabel() { return label; } } ``` ### 3. 在实体类中使用注解 ```java public class User { private Long id; // 模式一:也可以自定义翻译字段后缀 @@EasyDict(dictType = "user_type", suffix = "Label") @@EasyDict(typeCode = "user_status") private String status; // 模式二 @@EasyDict(enumClass = GameTypeEnum.class) private String gameType; // 模式二:如果枚举 code 和 label 字段不一样需要指定,通过注解属性enumCodeMethod,enumLabelMethod指定你的枚举定义的字段get方法名 @@EasyDict( enumClass = GameTypeEnum.class,enumCodeMethod = "getCode",enumLabelMethod = "getLabel") private String orderType; } ``` ### 4. 使用效果 当对象被序列化为 JSON 时(如后端返回前端数据时),会自动添加字典字段。如果有其他场景需要翻译字典可以手动调用工具类转换 ```json { "id": 1, "status": "1", "statusDict": "启用", "gameType": "A", "gameTypeDict": "管理员" } ``` ## 手动转换工具 自动序列化没有触发或是有其他场景需要转换时,可以使用手动转换工具: ```java @Service public class UserService { @Autowired private EasyDictUtil dictUtil; public List getUsersWithDict() { List users = userRepository.findAll(); // 手动转换字典 return dictUtil.listConverter(users); } public User getUserWithDict(Long id) { User user = userRepository.findById(id); // 转换单个对象 return dictUtil.convertSingleObject(user); } } ``` ## 基础配置说明 (整段都无需配置,主要是提供修改统一翻译后缀的功能) ```yaml easydict: # 是否启用EasyDict功能 enabled: true # 字典翻译(全局配置) dict-suffix: Dict # 缓存配置 cache: # 是否启用字典值缓存 enabled: true # 缓存最大条目数 max-size: 1000 # 写入后过期时间(秒) expire-after-write: 3600 # 调试配置 ``` ## @@EasyDict 注解属性说明 ```java @@EasyDict( typeCode = "user_status", // 必填:字典类型代码 suffix = "Label", // 可选:自定义字段后缀 cache = true, // 可选:是否启用缓存 cacheExpire = 1800, // 可选:缓存过期时间(秒) fallback = "未知", // 可选:解析失败时的回退值 priority = 1000, // 可选:解析器优先级 group = "default", // 可选:字典数据源分组(暂未实现) enumClass = "YourEnum.class", // 指定用于字典翻译的枚举类 enumCodeMethod = "getCode", // 从枚举实例读取"代码"的方法名 enumLabelMethod = "getLabel" // 从枚举实例读取"显示值"的方法名 ) ``` ## 🔧 扩展功能 ### 缓存管理 ```java @RestController public class DictController { @Autowired private EasyDictManager easyDictManager; // 查看缓存统计 @GetMapping("/dict/cache-stats") public String getCacheStats() { return easyDictManager.getCacheStats(); // 输出示例:Cache[size=156, expired=12, maxSize=1000] } // 清理缓存 @PostMapping("/dict/cache/clear") public String clearCache() { easyDictManager.clearCache(); return "缓存已清理"; } // 检查组件状态 @GetMapping("/dict/status") public EasyDictManager.ComponentStatus getStatus() { return easyDictManager.getComponentStatus(); } } ``` ### 静态工具方法 ```java // 直接转换单个值 String dictValue = EasyDictUtil.convertDictValue( "user_status", "1", dictProvider); ``` ## 🔍 功能实现状态 ### ✅ 已实现功能 | 功能模块 | 实现状态 | 说明 | |-------------|----------|----------------| | **核心转换** | ✅ 完全实现 | 基于Jackson的字典转换 | | **注解支持** | ✅ 完全实现 | @@EasyDict | | **自动配置** | ✅ 完全实现 | Spring Boot自动配置 | | **缓存机制** | ✅ 完全实现 | LRU缓存 + 过期时间 | | **缓存管理** | ✅ 完全实现 | 统计信息 + 手动清理 | | **配置支持** | ✅ 完全实现 | 丰富的配置选项 | | **手动转换** | ✅ 完全实现 | 工具类支持 | | **异常处理** | ✅ 完全实现 | 完善的回退机制 | | **自定义后缀** | ✅ 完全实现 | 支持全局和字段级配置 | | **枚举数据源翻译** | ✅ 完全实现 | 指定项目中已有的枚举进行翻译 | ### ⚠️ 部分实现功能 | 功能模块 | 实现状态 | 说明 | |----------|----------|------| | **字段级缓存控制** | ⚠️ 部分实现 | 注解中的cache属性已定义但未完全生效 | | **自定义回退值** | ⚠️ 部分实现 | fallback属性已定义但未完全生效 | ### ❌ 未实现功能 | 功能模块 | 实现状态 | 说明 | | | ---------- | ----- | ----------------- | --- | | **字典分组** | ❌ 未实现 | group属性预留,暂未实现 | | | **多数据源** | ❌ 未实现 | 多DictProvider路由机制 | | | **解析器优先级** | ❌ 未实现 | priority属性预留,暂未实现 | | ### 下版本升级功能 暂无 ## 升级日志 - **1.0.5**: 第一版发布,通过实现接口获取数据源。四大核心功能:注解转换、缓存机制、工具类手动转换、自定义字段转义后缀等 - **1.0.6**: 新增支持项目中的枚举类获取数据源 `@@EasyDict(enumClass = GameTypeEnum.class)` ## 🚨 注意事项 ### 必要条件 1. **Spring Boot 环境** - 需要 Spring Boot 2.0+ 2. **DictProvider 实现** - DictProvider 需要注册为 Bean ### 常见问题 1. **字典字段不显示** - 检查 DictProvider 是否正确注册为 Bean 2. **缓存不生效** - 检查缓存配置是否正确 3. **数据一致性** - 字典数据变更时及时清理缓存 ## ⭐ 支持项目 如果 EasyDict 对你有帮助,欢迎: - ⭐ **给个 Star** - 让更多人发现这个项目 - 🐛 **报告问题** - 帮助我们改进和完善 - 💡 **提出建议** - 分享你的想法和需求 - 📢 **分享推荐** - 推荐给更多开发者使用 你的支持是我们持续改进的动力! ## ⭐ 新项目预告 后续推出注解自动转换外键字段需要映射的字段 ## 🔗 相关链接 - [GitHub 仓库](https://github.com/your-org/easy-dict) - [API 文档](https://your-org.github.io/easy-dict/javadoc/) - [更新日志](CHANGELOG.md) - [问题反馈](https://github.com/your-org/easy-dict/issues)