# easy_trans_solon
**Repository Path**: fhs-opensource/easy_trans_solon
## Basic Information
- **Project Name**: easy_trans_solon
- **Description**: easy_trans 对于solon
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 22
- **Forks**: 5
- **Created**: 2022-05-06
- **Last Updated**: 2025-04-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: solon, mybatis-plus
## README
# easy_trans
# 介绍
## easy trans适用于5种场景
1 我有一个id,但是我需要给客户展示他的title/name 但是我又不想自己手动做表关联查询
2 我有一个字典码 sex 和 一个字典值0 我希望能翻译成 男 给客户展示。
3 我有一组user id 比如 1,2,3 我希望能展示成 张三,李四,王五 给客户
4 我有一个枚举,枚举里有一个title字段,我想给前端展示title的值 给客户
5 我有一个唯一键(比如手机号,身份证号码,但是非其他表id字段),但是我需要给客户展示他的title/name 但是我又不想自己手动做表关联查询
# 食用步骤
## 技术经理/架构 需要做的事情
#### 1、先把maven 引用加上
``` xml
com.fhs-opensource
easy-trans-solon-plugin
1.3.1
```
注意:非maven中央仓库更新可能延迟,如果高版本无法引入请尝试切到低一个版本过一天后在切回来。 不要使用阿里云仓库,因为他们很久没和中央仓库同步了
#### 2、初始化字典数据(如果你们项目没字典表请忽略)
``` java
@Inject
private DictionaryTransService dictionaryTransService;
//在某处将字典缓存刷新到翻译服务中,以下是demo
Map transMap = new HashMap<>();
transMap.put("0","男");
transMap.put("1","女");
dictionaryTransService.refreshCache("sex",transMap);
```
#### 3、如果是微服务模式的话,记得使用redis来存放字典缓存
``` yaml
easy-trans:
enable-cloud: true #开启cloud模式
cache:
driverType: "redis" #驱动类型
server: "192.168.0.213:6379"
password: "123456"
```
``` java
@Inject
BothCacheService bothCacheService;
//RedissonCacheService 也支持
@Inject(value = "${easy-trans.cache}")
RedisCacheService cacheService;
// 这行代码要放到 dictionaryTransService.refreshCache("sex",transMap);前面才管用
bothCacheService.setCacheService(cacheService);
```
#### 4、缓存说明
很高兴的告诉大家,Easy trans的强大缓存功能上线了,下面告诉大家怎么用。
SIMPLE加缓存和清理缓存:
``` java
//在PO上标记 下面注解,就可以添加缓存
@TransDefaultSett(isUseCache = true,cacheSeconds = 20)
public class User{
}
@Inject
TransCacheManager transCacheManager;
//下面的清理缓存
transCacheManager.clearCache(AppxModel.class,1);
```
下面是RPC添加缓存,RPC清理缓存和SIMPLE相同,就不贴代码了
``` java
transCacheManager.setRpcTransCache("com.fhs.uc.User", SimpleTransService.TransCacheSett.builder()
.maxCache(100).cacheSeconds(20).isAccess(false).build());
```
要点:因为RPC清理缓存是基于solon的分布式事件总线做的,所以要想生效需要加一个总线的依赖:https://solon.noear.org/article/78
字典缓存刷新说明:
字典是通过BothCacheService来存放缓存数据的,为了更好的速度和适配微服务,他使用了二级缓存,如果字典有更新,需要刷新redis的缓存,并且清理掉各个微服务的进程缓存,我们提供了以下API来刷新。
``` java
@Inject
DictionaryTransService dictionaryTransService;
dictionaryTransService.refreshCacheAndNoticeOtherService("sex",dictSexMap);
```
## 普通程序员需要做的事情
pojo 中添加
``` java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
//实现TransPojo 接口,代表这个类需要被翻译或者被当作翻译的数据源
public class Student implements TransPojo {
// 字典翻译 ref为非必填
@Trans(type = TransType.DICTIONARY,key = "sex",ref = "sexName")
private Integer sex;
//这个字段可以不写,实现了TransPojo接口后有一个getTransMap方法,sexName可以让前端去transMap取
private String sexName;
//SIMPLE 翻译,用于关联其他的表进行翻译 schoolName 为 School 的一个字段
@Trans(type = TransType.SIMPLE,target = School.class,fields = "schoolName")
private String schoolId;
@Trans(type = TransType.RPC,targetClassName = "com.fhs.uc.User",fields = "userName",serviceName = "ucenter")
private String createUserId;
// 枚举翻译,返回文科还是理科给前端
@Trans(type=TransType.ENUM,key = "desc")
private StudentType studentType = StudentType.ARTS;
public static enum StudentType{
ARTS("文科"),
SCIENCES("理科");
private String desc;
StudentType(String desc){
this.desc = desc;
}
}
}
```
controller
``` java
@Inject
TransService transService;
@Mapping("trans")
public Student trans() {
Student stu = new Student();
stu.setId("11");
stu.setAppId(1);
stu.setSex("boy");
stu.setCreateUserId("1")
//翻译集合用:transMore方法 如果pojo的子属性还需要被翻译用: transOneLoop/transManyLoop 方法
transService.transOne(stu);
return stu;
}
```
然后访问你的controller,看返回结果。
## easy trans solon 版本 支持的3种类型
### 字典翻译(TransType.DICTIONARY)
需要使用者把字典信息刷新到DictionaryTransService 中进行缓存,使用字典翻译的时候取缓存数据源
### 简单翻译(TransType.SIMPLE)
比如有userId需要userName或者userPo给前端,原理是组件使用MybatisPlus/JPA的API自动进行查询,把结果放到TransMap中。
### 跨微服务翻译(TransType.RPC)
原理同简单翻译,只不过可以跨不同微服务
### 枚举翻译(TransType.ENUM)
比如我要把SEX.BOY 翻译为男,可以用枚举翻译。
### 平铺模式
默认easy trans会把翻译结果放到transMap属性中,比如你取sexName(性别) 需要调用transMap.sexName。如果前端觉得不方便可以使用平铺模式transService.transOneLoop(stu,true); 需要您的json序列化方式为jackson或者fastjson.
# 参与贡献和技术支持
如果遇到使用问题可以加QQ群:976278956
如果你们使用了此插件,请留下单位名称。
# 插件文档
下面文档是springboot版本的,除了包引入有差距和不支持AUTO类型的翻译之外其他的都和solon版本一致
https://gitee.com/fhs-opensource/easy_trans/wikis/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
如果您觉得本软件好用,请帮忙给个star吧,如果您能发动身边的同项目组同事一起给个star那就太感谢您了