数据字典回显功能设计与实现

数据字典回显功能设计与实现

文章目录

  • 数据字典回显功能设计与实现
    • 1. 业务场景
    • 2. 实现设计
      • 2.1 注解+AOP切面
      • 2.2 注解+mybatis拦截器
      • 2.3 注解+序列化
      • 2.4 涉及字段直接申明成字典引用类型+mybatis拦截器+反序列化处理
    • 3. 具体实现

1. 业务场景

我们日常开发中经常会遇到:数据字典类型的字段存储至数据库的是id或者code,然而页面显示的时候却是名称

2. 实现设计

关于解决上述问题有以下几种方案:

2.1 注解+AOP切面

注解主要起标记作用,然后采用切面处理标记字段,把id或code转化成字典名称。这种方式可以灵活的标记是否需要回显转化处理,后面我采用这种方式举例说明

2.2 注解+mybatis拦截器

注解主要起标记作用,mybatis拦截器拦截之后,判断注解标记字段,把id或code转化成字典名称

2.3 注解+序列化

注解主要起标记作用,需增加专门的序列化处理器,序列化的过程中判断注解标记字段,把id或code转化成字典名称

2.4 涉及字段直接申明成字典引用类型+mybatis拦截器+反序列化处理

这种方式最为灵活,意思就是把涉及数据字典的字段,申明成字典类型(比如说DictData),前端就直接可以拿到字典的所有内容(包括id、code、名称)。

该种方式的实现需要三步操作
1.涉及字段直接申明成字典引用类型
2.mybatis拦截之后通过id或code补全字典数据
3.前端传递的id或code在反序列化的过程中补全字典数据

3. 具体实现

  • 定义方法标记注解,主要用来判断该接口是否需要字典转化
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface NeedEchoDict {}
  • 定义字段标记注解,主要用来判断字典类型字段
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictData {/*** 字典类型** @return*/String type() default "";
}
  • AOP切面处理
@Slf4j
@Aspect
@Component
public class DictEchoAspect {@Around("@annotation(com.jiayuan.common.annotation.NeedEchoDict)")public Object translation(final ProceedingJoinPoint pjp) throws Throwable {//目标方法执行Object resultR = pjp.proceed();if (ObjectUtil.isNull(resultR)) {return resultR;}//获取返回data值Object result = ((Result) resultR).getData();if (result instanceof PageData) {// 分页的情况PageData page = (PageData) result;result = ((PageData) result).getList();result = translate(result);page.setList((List) result);((Result) resultR).setData(page);return resultR;}result = translate(result);((Result) resultR).setData(result);return resultR;}/*** 返回值转换,增加字典回显** @param result* @return*/private Object translate(Object result) {if (result instanceof List || result instanceof ArrayList) {for (Object entity : (List) result) {to(entity);}} else {to(result);}return result;}/*** 根据类上注解,设置目标属性值** @param entity 返回对象*/public void to(Object entity) {Class c = entity.getClass();for (; c != Object.class; c = c.getSuperclass()) {try {Field[] fields = c.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);Object preValue = field.get(entity);Class<?> type = field.getType();if (ObjectUtil.isNotNull(preValue)) {//如果对象中包含list,判断list中是否包含注解if (type.equals(List.class) || type.equals(ArrayList.class)) {// 当前集合的泛型类型Type genericType = field.getGenericType();if (null == genericType) {continue;}if (genericType instanceof ParameterizedType) {for (Object o : (List) preValue) {to(o);}}}//todo 自定义对象方式if (field.isAnnotationPresent(DictData.class)) {final String dictName = DictCache.getDictName(preValue.toString());//设置字典内容field.set(entity, dictName);}}}//父类存在子类不存在情况} catch (Exception e) {log.error("字典回显失败:{}", JSONUtil.toJsonStr(entity));e.printStackTrace();}}}}
  • 使用案例
@NeedEchoDict
@GetMapping("pageForApproval")
@ApiOperation("审批分页")
public Result<PageData<ApprovalAcademicActivityResponse>> pageForApproval(@Validated ApprovalAcademicActivityRequest request,@Validated PageDTO pageDTO) {PageData<ApprovalAcademicActivityResponse> page = academicActivityService.pageForApproval(request, pageDTO);return Result.ok(page);
}@Data
@ApiModel(value = "审批分页学术活动结果")
public class ApprovalAcademicActivityResponse Serializable {private static final long serialVersionUID = -4402178057699015363L;@DictData@ApiModelProperty(value = "活动性质")private String activityNature;@DictData@ApiModelProperty(value = "活动范围")private String activityScope;。。。
}

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

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

相关文章

羊大师教你,什么搭配羊奶能够带来全方位的营养?

羊奶作为一种营养价值极高的乳制品&#xff0c;其丰富的营养成分对人体健康有着诸多益处。然而&#xff0c;不同的食物搭配会对羊奶的营养吸收产生不同的影响。为了让大家更好地利用羊奶的营养价值&#xff0c;下面小编羊大师将为大家介绍一些与羊奶搭配的食物&#xff0c;帮助…

Qt实现画的图片移动

要实现左键点击鼠标时图片跟着鼠标移动&#xff0c;可以通过以下步骤来实现&#xff1a;1. 在QGraphicsView的构造函数中设置鼠标跟踪属性&#xff0c;以便能够捕获鼠标事件。cpp QGraphicsView::QGraphicsView(QWidget *parent) : QGraphicsView(parent) {setMouseTracking(tr…

Leetcode617合并二叉树

理解题意&#xff1a;相同节点位置上&#xff0c;都有数据的话&#xff0c;节点值相加&#xff0c;只有一方有数据的话&#xff0c;把有数据的部分及相关子树保留下来。 考察操作两棵二叉树&#xff0c;二叉树的遍历。 一般有两种解决方式&#xff1a; 递归|迭代。 区别&#x…

element 中文地址

Element - The worlds most popular Vue UI framework 2 Menu 菜单 | Element Plus 3 侦听器 | Vue.js vue中文官网

软件测试职业规划导图

公司开发的产品专业性较强&#xff0c;软件测试人员需要有很强的专业知识&#xff0c;现在软件测试人员发展出现了一种测试管理者不愿意看到的景象&#xff1a; 1、开发技术较强的软件测试人员转向了软件开发(非测试工具开发)&#xff1b; 2、业务能力较强的测试人员转向了软件…

ubuntu创建新用户, 并赋予root权限

在Ubuntu上创建新用户可以通过adduser命令来完成。以下是创建新用户的基本步骤&#xff1a; 打开终端&#xff1a;你可以按下Ctrl Alt T来打开终端。 使用sudo命令以管理员权限执行adduser命令。例如&#xff0c;如果你要创建一个名为newuser的新用户&#xff0c;运行以下命…

【EI会议征稿】第三届电子信息技术国际学术会议(EIT 2024)

The 3rd International Conference on Electronic Information Technology 第三届电子信息技术国际学术会议&#xff08;EIT 2024&#xff09; 电子信息工程在我国信息化产业的发展过程中举足轻重&#xff0c;且随着现代社会的发展&#xff0c;航空航天领域、制造业领域和智能…

LSTM+CNN实现时间序列预测(负荷预测)

文章目录 LSTM+CNN实现时间序列预测(PyTorch版)基于PyTorch搭建LSTM+CNN模型实现风速时间序列预测配置类时序数据集的制作数据归一化数据集加载器搭建LSTM+CNN模型定义模型、损失函数、优化器模型训练可视化结果十、完整源码LSTM+CNN实现时间序列预测(Keras版)源码模型训练绘制…

每日一题:LeetCode-102.二叉树的层序遍历

每日一题系列&#xff08;day 03&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

NX二次开发UF_CSYS_set_wcs 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_wcs Defined in: uf_csys.h int UF_CSYS_set_wcs(tag_t csys_id ) overview 概述 Sets the work coordinate system to the prototype coordinate system whose tag y…

为什么技术干不过产品?

近年来&#xff0c;我们经常会听到一些关于技术和产品之间关系的讨论&#xff0c;包括最近的ChatGPT之父奥特曼被董事会开除事件。在这个问题上&#xff0c;有人认为技术应该优于产品&#xff0c;因为技术是实现产品的基础。然而&#xff0c;也有人认为产品比技术更重要&#x…

基于低代码平台搭建应用程序

目录 一、背景 二、如何基于低代码开发应用&#xff1f; 1.创建数据表 2.添加数据表属性 3.配置功能 4.数据筛选 5.数据集显示&功能发布 三、写在最后 一、背景 很多时候&#xff0c;市场上的管理软件鱼龙混杂&#xff0c;找一些外包团队在实际应用中效果并不理想&#xff…

企业微信平台:连接你我,引领数字化未来

近年来&#xff0c;随着移动互联网的飞速发展&#xff0c;社交媒体平台如微信已经成为人们生活中必不可少的一部分。对于企业而言&#xff0c;微信平台不仅是一个重要的宣传渠道&#xff0c;更是实现数字化转型的关键工具。本文将探讨企业微信平台的发展趋势、运营策略以及成功…

开源还是闭源(=°Д°=)!!趋势表明,开源技术在诸多领域中日益受到重视

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

堆和前缀树

1 堆 1.1 堆结构 堆是用数组实现的完全二叉树结构完全二叉树中如果每棵树的最大值都在顶部就是大根堆&#xff0c;最小值在顶部就是小根堆堆结构的heapInsert就是插入操作&#xff0c;heapify是取出数组后进行堆结构调整的操作优先级队列结构就是堆结构 public class Heap {…

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示(三)

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示(三) 不使用base64编码方式传递 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filter…

【正点原子STM32连载】第五十九章 T9拼音输入法实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32F407最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五十…

关于 token 和证书

关于 token 和证书 在网络检测中&#xff0c;Token通常是指一种特殊的令牌&#xff0c;用于在分布式系统中进行资源控制和访问管理。Token可以用于验证客户端的身份、限制客户端的访问权限以及控制客户端对某些资源的使用。 在网络检测中&#xff0c;Token通常用于以下几个方…

uniapp IOS从打包到上架流程(详细简单) 原创

​ 1.登入苹果开发者网站&#xff0c;打开App Store Connect ​ 2.新App的创建 点击我的App可以进入App管理界面&#xff0c;在右上角点击➕新建App 即可创建新的App&#xff0c;如下图&#xff1a; ​ 3.app基本信息填写 新建完App后&#xff0c;需要填写App的基本信息&…