简介

开发中会经常遇到这样的场景:比如在成绩表有一个student_id,如果我要查看成绩列表需要学生的名称,一般写法就是使用join,现在大部分ORM框架对于表关联支持并不是很友好,所以很多时候我们都要自己写SQL去实现。翻译服务就是为了简化这种查询的写法,使用翻译服务,您只需要单表查询成绩表即可,然后调用翻译服务的transMore方法即可。

demo

如下这样写即可实现根据parkId翻译parkName

  1. @TransTypes(types = {"pagex"})
  2. public class PayCarcome extends BaseDO<PayCarcome> implements Syncable {
  3. //DO中给需要翻译的字段加注解
  4. @Trans(type="pagex",key="parking")
  5. private String parkId;
  6. }
  7. //注入翻译服务
  8. @Autowired
  9. private TransService transService;
  10. //使用翻译服务翻译结果
  11. List<PayCarcome> comrecords = carcomeService.findCarComeListByPlatNumberLike(payCarcome.getPlateNumber(),null);
  12. transService.transMore(comrecords);
  13. //翻译后每个PayCarcome.getTransMap 中就已经有翻译的结果了。

原理

 所有的DO都继承了SuperBean,SuperBean中包含一个属性叫做transMap,翻译服务根据反射获取到哪些字段需要翻译,id是多少,然后去对应的缓存中(可以是redis,也可以是进程级缓存)获取翻译出来的结果put到transMap中。

如何实现一个翻译服务-java方式

  1. @Service
  2. public class AreaTransServiceImpl implements ITransTypeService,InitializingBean {
  3. /**
  4. * redis 缓存服务
  5. */
  6. @Autowired
  7. private RedisCacheService<String> redisCacheService;
  8. /**
  9. * 将自身注册为一个服务
  10. * @throws Exception
  11. */
  12. @Override
  13. public void afterPropertiesSet() throws Exception {
  14. TransService.registerTransType("areaInfo", this);
  15. }
  16. /**
  17. * 翻译单条数据
  18. * @param obj 需要翻译的对象
  19. * @param toTransList 需要翻译的字段
  20. */
  21. @Override
  22. public void transOne(SuperBean<?> obj, List<Field> toTransList) {
  23. for (Field tempField : toTransList)
  24. {
  25. tempField.setAccessible(true);
  26. String areaID = null;
  27. try
  28. {
  29. areaID = StringUtil.toString(tempField.get(obj));
  30. }
  31. catch (IllegalArgumentException | IllegalAccessException e)
  32. {
  33. e.printStackTrace();
  34. }
  35. obj.getTransMap().put(tempField.getName() + "AreaName", redisCacheService.getStr(Constant.AREA_NAME + areaID));
  36. }
  37. }
  38. /**
  39. * 翻译多条数据
  40. * @param objList 需要翻译的对象集合
  41. * @param toTransList 需要翻译的字段集合
  42. */
  43. @Override
  44. public void transMore(List<? extends SuperBean<?>> objList, List<Field> toTransList) {
  45. for(SuperBean<?> obj : objList)
  46. {
  47. transOne(obj, toTransList);
  48. }
  49. }
  50. }

FHS自带了哪些翻译服务

areaInfo - 省市区 编码翻译省市区名称,wordbook 字典,可以根据字典编码翻译为字典的显示值,比如0翻译为男,1翻译为女。 sysUser - 系统用户翻译,sysOrganizationInfo 系统组织机构id 翻译组织机构名称。 SysUser如何使用字典和组织机构翻译demo:https://gitee.com/fhs-opensource/fhs-framework/blob/master/fhs_framework_base_business/src/main/java/com/fhs/ucenter/bean/SysUser.java

FHS AutoTrans服务

将一张表设置为翻译数据源。

  1. @Service("parkParkingService")
  2. @AutoTrans(namespace = "parking",fields = {"parkName"},useCache = false)
  3. public class ParkParkingServiceImpl extends BaseServiceImpl<ParkParking> implements ParkParkingService {
  4. }

PAGEX使用:

  1. {name:'park_id',title:'停车场名称',width:'20%',trans:'auto',key:'parking',showField:'transMap.parkName',align:'center'}

普通java po使用;

  1. @Trans(type="auto",key="parking")
  2. private String parkId;

使用pagex开发翻译服务

假如有一个t_park_parking表,我们需要使用park_id翻译park_name,可以这样写:

  1. var modelConfig= {title:'停车场',pkey:'id',type:'uuid',orderBy:'update_time Desc',
  2. namespace:"parking",table:'t_park_parking',trans:true,extendsParam:'parent_park_id=${param.parent_park_id}',
  3. joinColumns:JSON.stringify({park_name:'parkName'}),db:"park",dp:JSON.stringify({id:'parkIds'}),isMultiTenant:true};

主要是pkey和joinColumns 2个key的配置,pkey代表这个表的主键joinColumns代表别人关联我,需要拿我的什么,demo中是需要拿我的parkName(park_name是db字段,parkName是transMap放的时候的key),,更多pagex玩法参考pagex章节介绍。 更多翻译服务请参考源码:https://gitee.com/fhs-opensource/fhs-framework/tree/master/fhs_framework_parent/src/main/java/com/fhs/system/trans