字典翻译EasyTrans简单使用分享

news2025/1/21 12:13:53

前言

     最近太忙了,一直按在项目上摩擦,都没有时间写分享了。今天终于市把所有负责的模块都写完了,本次迭代引入了字典翻译,借这个机会顺便分享下。


一、什么是字典翻译

     所谓的字典翻译其实简单理解就是一些不常更新的有键值对属性的数据转换。片面点理解就是一些下拉框、枚举值等等。

二、使用步骤

     前任本来有自己实现的翻译,是利用反射+缓存+自定义注解+json序列配置等实现,我看了下太麻烦,而且场景比较片面,所以我就偷摸引入了easyTrans,早期只想方便自己用。后来大家看我的处理后,觉得比较香,所以也用上了。

1.引入库

这里注意引入不同的orm扩展支持,我这里orm是使用的mybatisPlus。

<dependency>
    <groupId>com.fhs-opensource</groupId>
    <artifactId>easy-trans-spring-boot-starter</artifactId>
    <version>2.1.16</version>
</dependency>
<dependency>
    <groupId>com.fhs-opensource</groupId>
    <artifactId>easy-trans-mybatis-plus-extend</artifactId>
    <version>2.1.16</version>
</dependency>

2.字典配置类

所有字典在这里一次性加载到缓存,如果有相应的管理界面,可以增加更新缓存机制。

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fhs.trans.service.impl.DictionaryTransService;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 字典配置类
 *
 * @author zhengwen
 */
@Configuration
public class DictionaryConfig implements InitializingBean {


    @Autowired
    private DictionaryTransService dictionaryTransService;

	//业务dao
    @Autowired
    private BaseDictionaryMapper baseDictionaryMapper;
	//业务dao
    @Resource
    private EventTypeMapper eventTypeMapper;

    @Override
    public void afterPropertiesSet() throws Exception {
        //将字典缓存刷新到翻译服务中
        Map<String, String> transMap = new HashMap<>();
        transMap.put("0", "禁用");
        transMap.put("1", "使用");
        dictionaryTransService.refreshCache("useStatus", transMap);

        //TODO 业务字典加载到缓存中
        QueryWrapper<EventType> eventTypeQw = new QueryWrapper<>();
        eventTypeQw.eq("type_", 2);
        List<EventType> eventTypeList = eventTypeMapper.selectList(eventTypeQw);
        //eventTypeList根据属性parentCode使用stream方法分组
        Map<String, List<EventType>> eventTypeMap = eventTypeList.stream().collect(java.util.stream.Collectors.groupingBy(EventType::getParentCode));
        if (CollectionUtil.isNotEmpty(eventTypeMap)) {
            eventTypeMap.entrySet().stream().forEach(entry -> {
                Map<String, String> eventTypeTransMap = new HashMap<>();
                String entryKey = entry.getKey();
                List<EventType> entryValue = entry.getValue();
                if (CollectionUtil.isNotEmpty(entryValue)) {
                    entryValue.stream().forEach(eventType -> {
                        eventTypeTransMap.put(eventType.getCode(), eventType.getName());
                    });
                }
                dictionaryTransService.refreshCache(entryKey, eventTypeTransMap);
            });
        }

        QueryWrapper<EventType> eventTypeAllQw = new QueryWrapper<>();
        List<EventType> allEventTypeList = eventTypeMapper.selectList(eventTypeAllQw);
        //eventType
        if (CollectionUtil.isNotEmpty(allEventTypeList)) {
            Map<String, String> allEventTypeTransMap = new HashMap<>();
            allEventTypeList.stream().forEach(eventType -> {
                allEventTypeTransMap.put(eventType.getCode(), eventType.getName());
            });
            dictionaryTransService.refreshCache("allEventType", allEventTypeTransMap);
        }

        //可以简单加个timer,定时刷新缓存(如果字典后面有界面操作字典,可能需要业务端操作后自己刷入缓存)

        //字典表数据放入其中
        IPage<BaseDictionary> selectPage = baseDictionaryMapper.selectPage(new Page(0, -1), new BaseDictionary());
        List<BaseDictionary> records = selectPage.getRecords();
        if (CollectionUtil.isNotEmpty(records)){
            //分组
            Map<String, List<BaseDictionary>> listMap = records.stream().filter(r -> StringUtils.isNotBlank(r.getCategoryCode()))
                    .collect(Collectors.groupingBy(BaseDictionary::getCategoryCode));
            listMap.forEach((k,v)->
                    //字典分类为key存入字典翻译缓存
                dictionaryTransService.refreshCache(k, v.stream().collect(Collectors.toMap(BaseDictionary::getDictCode,BaseDictionary::getDictDesc)))
            );
        }
    }

}

3.字典数据

在这里插入图片描述
     这个就是我们的数据字典表,实际上就是把里面的数据加载到缓存。

4.配置文件

#easyTrans字典转换配置
easy-trans:
  #启用redis缓存 如果不用redis请设置为false
  is-enable-redis: true
  #启用全局翻译(拦截所有responseBody进行自动翻译),如果对于性能要求很高可关闭此配置
  is-enable-global: true
  #启用平铺模式
  is-enable-tile: true
  #字典缓存放到redis 微服务模式请开启
  dict-use-redis: true
  # ruoyi相关的请开启
  is-enable-map-result: true

5.使用姿势

  • A.实体要实现implements TransPojo
  • B.实体对象属性上写注解标签@Trans(type = TransType.DICTIONARY, key = “deploy_strategy_type”)
    key是字典码,对应3表的字典类型code值。
    /**
     * 布控任务类型,1人员,2车辆
     */
    @TableField("strategy_type_")
    @Trans(type = TransType.DICTIONARY, key = "deploy_strategy_type")
    private Integer strategyType;

     以上只是easyTrans最简单的一个场景,实际上easyTrans还有很多使用场景,我这里也不想一个个演示,官方demo写的很清楚,我这里就抛砖引玉分享一个场景(其实也是我们自己暂时也用不到其他场景,比如springCloud等)官方文档见:https://www.kancloud.cn/shuaizai88/easy-trans/3100797


总结

  • 字典翻译简单实用
  • 场景支持多,扩展强
         希望能帮到大家,uping

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 Java 的内存模型?如何保证安全

Java 的内存模型定义了多线程程序中&#xff0c;不同线程之间如何共享和访问共享变量的规则。Java 内存模型的设计旨在保证线程安全和可见性&#xff0c;同时保证程序的性能。本文将介绍 Java 内存模型的基本概念、线程安全的实现方法以及如何使用 synchronized 和 volatile 关…

yolo 训练

这里写目录标题 分配训练集&Validation数量数据集读取读取全部文件夹替换路径 loss weightNMSBBox_IOUEIou Optimizer 分配训练集&Validation数量 validation_size training_size * validation_ratio / (1 - validation_ratio)training_size 219 validation_ratio …

基于Java+SpringMVC+vue+element实现前后端分离校园失物招领系统详细设计

基于JavaSpringMVCvueelement实现前后端分离校园失物招领系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获…

单轴丝杠平台实现搬运功能

1. 功能说明 本文示例将实现R279样机单轴丝杠平台搬运的功能。 该机构是由一个丝杠模组和一个 舵机关节模组 组合而成&#xff0c;关节模组上安装了一个电磁铁。 注意限位开关【①触碰传感器、②近红外传感器】的安装位置&#xff1a; 2. 丝杠传动机构原理 丝杠传动机构是一个将…

基于海思Hi3531 ARM+K7 FPGA高性能综合视频图像处理平台

板卡概述 XM703是自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台&#xff0c;该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#xff…

最新域名查询-中文域名注册到期查询软件

最新域名查询 最新域名查询指的是查询最新注册的域名或者快速确认某个域名是否被注册等相关信息的工具。以下是一些常用的最新域名查询工具&#xff1a; 域名Whois查询工具&#xff1a;Whois查询是一种查询域名注册信息的方式&#xff0c;可以查询已经注册的域名的所有信息&am…

http/https

http 基本概念 超文本传输协议&#xff0c;是互联网应用最广泛的协议之一&#xff0c;用于从 WWW 服务器传输超文本到本地浏览器的传输协议&#xff0c;它可以使浏览器更加高效&#xff0c;使网络传输减少。 https 基本概念 HTTPS是HTTP over SSL的简称&#xff0c;即工作…

LTI连续线性时不变系统能控性证明(格拉姆判据、秩判据)

一、能控性和能达性 1.1、能控性和能达性的定义 能控性&#xff1a;如果在一个有限的时间间隔内&#xff0c;可以用幅值没有限制的输入作用&#xff0c;使偏离系统平衡状态的某个初始状态回复到平衡状态&#xff0c;就称这个初始状态是能控的。 能达性&#xff1a;系统在外控…

【网红营销】海外网红营销怎么做?及注意事项?

随着互联网的发展和全球化的进程&#xff0c;海外网红营销逐渐成为企业推广产品和服务的重要途径。海外网红可以借助其社交媒体平台上的影响力&#xff0c;帮助企业扩大品牌知名度、提升销售业绩。然而&#xff0c;海外网红营销存在着一定的挑战和风险&#xff0c;企业需要制定…

探索将大语言模型用作推荐系统

编者按&#xff1a;目前大语言模型主要问答、对话等场景&#xff0c;进行被动回答。是否可以将大模型应用于推荐系统&#xff0c;进行主动推送呢&#xff1f; 这篇文章回顾了可以将大模型作为推荐系统的理论基础&#xff0c;并重点描述了基于英文和阿拉伯语的购物数据集微调T5-…

菜鸟健身-新手使用哑铃锻炼手臂的动作与注意事项

目录 一、前言 二、哑铃锻炼手臂的好处 三、哑铃锻炼手臂的注意事项 四、哑铃锻炼手臂的基本动作 1. 哑铃弯举 2. 哑铃推举 3. 哑铃飞鸟 五、哑铃锻炼手臂的进阶动作 1. 哑铃侧平举 2. 哑铃俯身划船 六、哑铃锻炼手臂的训练计划 七、总结 一、前言 哑铃是一种非常…

2023年5月天津/南京/成都/深圳CDGA/CDGP数据治理认证报名

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证班进行中&#xff0c;报名从速&#xff01; DAMA认证为数据管…

MySQL 日志管理与恢复

MySQL日志管理 MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种&#xff1a;通过配置文件或者是通过命令 通过命令修改开启的日志是临时的&#xff0c;关闭或重启服务后就会关闭 MySQL日志管理 日志的分类 1.错误日志 用来记录当MySQL启动、停止或运行时…

畅购商城4.0

畅购商城4.0 1.走进电商 1.1电商行业分析 近年来&#xff0c;世界经济正向数字化转型&#xff0c;大力发展数字经济成为全球共识。党的十九大报告明确提出要建设“数字中国”“网络强国”&#xff0c;我国数字经济发展进入新阶段&#xff0c;市场规模位居全球第二&#xff0c;数…

DC-DC直流隔离升压电源模块高压稳压可调输出12v24v48v转60V80V110V150V200V220V250V300V400V500V

特点 效率高达 80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上 应用 HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36V、…

我们拆了一款将ChatGPT“落地”的AI语音交互机器人,八核A7全志R58主控

视频版本拆机&#xff1a;【60块钱&#xff0c;垃圾佬的第一台机器人&#xff0c;国产8核CPU全志R58】 https://www.bilibili.com/video/BV1Qk4y177ja/?share_sourcecopy_web&vd_source6ec797f0de1d275e996fb7de54dea06b 公子小白是一对由狗尾草智能科技推出的人工智能机…

Pytorch代码——持续更新

1 连续两个argsort 返回张量中每个元素对应的排名 torch.argsort(torch.argsort(pred, dim1, descendingTrue),dim1,descendingFalse) 例子 使用一个argsort后得到的是张量中按列降序排序后的索引&#xff0c; 再使用一个argsort后是张量中每一个元素的排名。 例如第2行中…

港联证券|股票分批技巧是什么?分批买进的手续费如何计算?

股票分批是股市中常用操作&#xff0c;根基股票的波动不同&#xff0c;将资金分批投资在不同股价还在时间上。那么股票分批技巧是什么&#xff1f;分批买进的手续费如何计算&#xff1f;下面就由港联证券为大家分析&#xff1a; 股票分批技巧是什么&#xff1f; 1、补仓股票选…

国药集团蒸汽表内网图像识别案例

一、项目需求 项目背景&#xff1a;国药集团MES系统硬件仪表数据采集项目 为了实现现场蒸汽表计数据的采集和存储&#xff0c;我们提供了本地内网图像离线识别方案&#xff0c;它可以在不接线的情况下实现对现场蒸汽表计数据的采集&#xff0c;并通过485接口将数据传输到客户内…

Facebook商店和亚马逊店铺:双管齐下,实现多渠道销售

在当今数字化时代&#xff0c;电子商务已成为商业领域中不可或缺的一部分。随着消费者购物行为的转变&#xff0c;企业需要利用多种渠道来吸引潜在客户并增加销售额。 在这个过程中&#xff0c;Facebook商店和亚马逊店铺成为了两个备受关注的选择。本文将深入探讨如何通过同时…