字典翻译EasyTrans简单使用分享

前言

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


一、什么是字典翻译

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

二、使用步骤

     前任本来有自己实现的翻译,是利用反射+缓存+自定义注解+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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何利用python调用API接口获取数据进行测试

一、Python 可以使用 requests 库来调用 API 接口获取数据。以下是基本的步骤&#xff1a; 1.安装 requests 库 pip install requests 2.导入 requests 库 import requests 3.构建 API 请求的 URL 根据 API 文档&#xff0c;构建请求的URL。 例如&#xff0c; https://a…

从BinDiff到0day 在IE中利用CVE-2019-1208

前言 如上所述&#xff0c;CVE-2019-1208是UAF漏洞&#xff0c;这类安全漏洞可以破坏有效数据、引发进程crash、并且可以精心利用最终导致任意代码执行。而对于本文介绍的CVE-2019-1208而言&#xff0c;成功利用此漏洞的攻击者可以获得系统当前用户权限。如果当前用户具有admi…

C++: 计时器类的设计和实现

文章目录 1. 目的2. 功能列表3. 基础功能&#xff1a;获取耗时4. API 设计: Timer 类5. 单元测试6. API 实现 1. 目的 使用 C Class 的形式&#xff0c;封装原本 C语言的获取时间的函数&#xff0c;提供更容易使用的计时器调用。 使用 C03&#xff0c;原因是和先前的线程安全队…

python+vue流浪动物公益科普宠物在线领养网站

使用动物在线领养网站的用户分管理员和用户两个角色的权限子模块。 开发语言&#xff1a;Python 框架&#xff1a;django/flask Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 系统所要实现的功…

AI 时代,知识工作者的生存指南

最近&#xff0c;大家可能已经见识过 AI 的威力了吧&#xff0c;以 ChatGPT 为代表的 人工智能&#xff08;AI&#xff09;展现出接近人一样的回答水准。 来自 Craft AI Assitant AI 就在那里&#xff0c;是房间里的大象&#xff0c;大家不能总装做对自己没有影响。要知道&…

[架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

目录 引言&#xff1a; 第1章 故障树分析法与鱼骨图的比较 1.1 相同点 1.2 区别点 第2章 鱼骨图 第3章 故障树 3.1 示意图 3.2 故障树解读 3.3 故障树常见符号 第4章 产品失效(Failure)模式分析DFMEA 引言&#xff1a; 目标系统/产品的可靠性和性能在客户需求阶段就…

脂溶性荧光染料Cy7标记羧酸Cy7-COOH/Carboxylic acids星戈瑞

CY7-COOH是一种含有羧基的化合物&#xff0c;它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。其化学结构中包含有一个吲哚菁骨架&#xff0c;以及一个羧基&#xff08;COOH&#xff09;官能团。它的分子式为C37H45ClN2O2&#xff0c;分子量519.12。CY7-COOH是一种近红外荧…

requset页面的代码逻辑

1. 封装请求基地址 在src目录下 放上一个专门写请求相关的文件夹 然后在里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 并且根据接口文档 写请求 然后把这个请求封装成一个函数&#xff0c;这个函数里需要传入两个参数 这两个参数 都放在d…

SpringMVC第二阶段:@RequestMapping注解详解

RequestMapping注解详解 RequestMapping是给个方法配置一个访问地址。就比如web学习的Servlet程序&#xff0c;在web.xml中配置了访问地址之后&#xff0c;它们之间就有一个访问映射关系。 1、value属性 value 属性用于配置方法对应的访问地址. /*** RequestMapping 可以配…

自动操作魔法师4.9.0.0

产品下载 (won-soft.com) 如下图所示&#xff1a; 彻底远离枯燥乏味的工作 在日常办公中&#xff0c;开发票&#xff0c;更新客户资料&#xff0c;打印报表&#xff0c;录入数据等等工作是极为重要&#xff0c;但大部分时候这些工作是相当枯燥的。你不得得一遍又一遍的进行重复…

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)

Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…

Java websocket 使用

简介 WebSocket 是一种基于 TCP 协议的全双工通信协议&#xff0c;可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中&#xff0c;我们可以使用 Java API for WebSocket&#xff08;JSR 356&#xff09;来实现 WebSocket。 WebSocket 的作用是在 Web 应用程序中…

springboot+jsp+javaweb学生信息管理系统 05hs

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【MySQL】浅谈事务

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 “事务”&#xff0c;可能大家都会在心中出现一个大大的 &#xff1f;&#xff0c;博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

详解二叉树

&#x1f308;目录 一、树形结构​ &#x1f333;1.1 概念1.2 其他概念1.3 树的表示形式 二、二叉树✨2.1 概念2.2 两种特殊二叉树2.3 性质2.4 二叉树存储 三、二叉树的基本操作&#x1f64c;3.1 前置说明3.2 二叉树的遍历3.3 二叉树的基本操作 四、二叉树的OJ✍️ 一、树形结构…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…

爱奇艺2020校招Java方向笔试题(第一场)

1.计算下列程序的时间复杂度&#xff08;&#xff09; for (i1;i<n;i)for(j1;j<m;j){a1,a2,a3,a4};A.O(n) B.O(mn) C.O(m) D.O(1) 答案:B 2.求递归方程T(n)4T(n/2)n 的解 ( ) A.O(n) B.O(n^2) C.O(n^3) D.O(logn) 答案:B 用Mater公式计算 3.下列关于动态规划算法说法错…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

国货大佬“卡脖子”后王者风范不减?小米卷出光学拍摄“天花板”?| 手机行业社媒心智品牌榜出炉

Social Power 核心解读 1、智能手机“乍暖还寒”&#xff0c;龙头品牌仍稳占消费者心智 比拼屏幕、赶超系统、迭代形态、拓展概念&#xff1f;眼花缭乱过后&#xff0c;产品精益求精&#xff0c;建立稳固的消费者认知&#xff0c;才是“保鲜”关键。在最新发布的数说故事5月…