數據字典回顯功能設計與實現

數據字典回顯功能設計與實現

文章目錄

  • 數據字典回顯功能設計與實現
    • 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.pswp.cn/news/167132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167132.shtml
英文地址,請注明出處:http://en.pswp.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的基本信息&…