后端字典的优雅设计

2023-09-14 08:09:39

背景

今天讲到的是数据字典的设计。为什么要讲到这个呢,因为我下午在做开发的时候遇到了一个问题。我先扔出来某个表的字段的定义吧:

business_type int default 0 comment '0:收款计划;1:付款计划'

而且我还有一个字典表,字典表的结构大约是这样的:

dict_codeCodeValue
business_type0收款计划
business_type1付款计划

一看到这个,我就觉得尴尬了,这个样我查出来的数据字段business_type: 1,前端自己也要定义一个字典,然后自己格式化的显示成付款计划。OK,我们思考一下这样的问题:

  1. 这个数据字典的定义的意义在哪里?
  2. 我的数据字典万一key、value的值变了,对不起,将迎来接近于灭顶之灾!字段的注释需要变、后端代码需要变、前端的字典变,总之就是变变变。

我也总结一下我自己在看这么多的代码和职业生涯中遇到的比较奇葩的处理方式:

  1. 直接left join字典表
select * from user left join t_dict on user.business_type = t_dict.code
  1. 直接在代码里干
User user = userDao.findByUserId(12);
// user里边有一个冗余的字段 bussinessTypeStr
if (user.getBusinessType() == 1) {
  user.setBusinessType("付款计划");
}
  1. 无情,直接交给前端的妹子
<p>业务类型: {{ businessType | formatBusinessType }}</p>

单我这样说,找不到老婆是有原因的!

我们自己反思一下,其实自己的心里就过意不去的。当然,shigen也在不断的反思自己,遇到这样的代码的时候,自己是怎样处理的。当然,我承认:第三种还是哦比较用的多的。一个是项目代码实在是太shi了,二是需求太赶了,代码写的再优雅有什么用,没人重视。

那今天,我就要出一个教程,实现字典的混乱终结,你会爱上这种处理方式。

实现

字典表的定义我就话不多说,直接干sql语句:

我想一眼看得出来是干嘛的吧,不行再上UML图:

接下来增删改查的接口需要吧,代码生成器直接干:

sorry

行文至此,我必须先说一声sorry,因为我参考了如下的参考文章的方式,觉得并不是最优雅的。关于字典的设计和使用,我只能在字典表的设计上有一种很清晰的认识,至于使用上,我觉得我自己还不是很熟,如后端的枚举类的设计、前端的字典设计,这些都和数据库的设计严格的且分开了,不能实现动态的配置。

更好的设计方式,我还在进一步的研究中。我很sorry纠结了两天的时间还是没有得到很好的解决。但是我相信问题的扔出总会有好的解决方式的,我也在研究ruoyi-vue的代码,期待在其中找到好的解决方案。进一步的设计和心得我将会持续的分享和输出。

参考文章:[Spring boot中优雅的实现字典管理](

更多推荐

《算法竞赛进阶指南》0x55 环形与后效性处理

0x55环形与后效性处理休息时间题意:一天有nnn个小时,在第iii个小时睡觉恢复体力uiu_iui​。一头牛一天要休息bbb个小时,可以分成多段。每一段需要花费一个小时才能睡着,这一个小时不恢复体力。询问恢复体力的最大值。解析:可以考虑dp。第一维是每天的时间,第二维是已经休息的时间。转移的时候需要知道当前休息的这一

面试官:你是怎么理解ES6中 Decorator 的?使用场景?

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录一、介绍二、用法类的装饰类属性的装饰注意三、使用场景@antobind@readonly@deprecate一、介绍Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式简单来讲,装饰者模式就是一种

Java 21 正式发布!新特性专栏继续更起来了~

就在昨天晚间,Oracle公司宣布Java21正式发布。该版本是继JDK17之后最新的长期支持版本(LTS),将获得至少8年的支持!Java21号称具有数千项性能、稳定性和安全性改进。新的JDK21包括对15项改进的抢先体验,这些增强功能是在OracleCloudWorld2023会议上宣布的,包括支持虚拟线程以提高整

linux内核——进程

Processesandthreads进程是正在运行的程序,包括下列部分的抽象:(独立的)地址空间一个或者多个线程打开的文件(以描述符fd的形式呈现)套接字信号量Semaphore共享的内存区域定时器信号句柄signalhandler其他的资源和状态信息这些东西都存在于进程控制块(PCB)中。在linux中,是stru

论文精读:Feature Pyramid Networks for Object Detection

文章目录1.摘要1.1背景1.2提出新方法1.3贡献2.引言2.1提出问题2.2叙述Featurepyramid2.3叙述深度卷积网络2.4Featurepyramid的局限2.5使用deepConvNet计算多尺度特征的方式2.6提出我们的方法2.7贡献3.相关工作3.1手工工程特征和早期神经网络3.2深度卷积目标检

指针和数组笔试题讲解(3)

🐵本篇文章将对指针相关笔试题进行讲解,同时也是指针和数组笔试题讲解的最后一篇文章,那么接下来将会对8道笔试题进行逐一讲解笔试题1💻intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d%d",*(a+1),*(ptr-1));return0;}1.

数据结构——C++实现二叉搜索树,前中后序、层序迭代遍历配合仿函数

通过介绍二叉搜索树,到实现最基础的二叉树模型,四种迭代遍历方式。结点模型template<classType>classbinary_tree{/*二叉树是由多个结点组成的,所以定义一个内部的结点类用于构建树*/classBTNode{/*不允许无参构造,因为编译器会对m_val采用默认构造,如果是int类型会导致随机

地牢大师问题(bfs提高训练 + 免去边界处理的特殊方法)

地牢大师问题文章目录地牢大师问题前言题目描述题目分析输入处理移动方式【和二维的对比】边界判断问题的解决代码总结前言在之前的博客里面,我们介绍了bfs基础算法的模版和应用,这里我们再挑战一下自己,尝试一个更高水平的题目,加深一下对bfs算法的理解。如果对bfs更多知识感兴趣的话,可以点个关注,后续会继续更新有关知识点的。

2023/9/15 -- C++/QT

作业:1>将工程文件进行注释2>03login_box.pro:QT+=coregui#core核心库gui图形开发库greaterThan(QT_MAJOR_VERSION,4):QT+=widgets#4.0版本以上自动包含widgets库CONFIG+=c++11#支持C++11版本#Thefollowingde

如何在百度百科建立个人词条,百度词条建立的过程是怎样的

如何在百度百科建立个人词条,很多朋友对百科全书这些问题都非常感兴趣,特别是很多朋友比较关心如何在百度百科上创建自己,下面洛希爱做百科网分享百度百科词条建立的过程,让大家明白创建百科词条是怎么样的。一、准备工作百度百科词条平台不能自己创建是个不正确的说法,自己完全可以再百度百科平台编辑。主要先做好以下准备工作:收集资料:

书剑宠物疫苗接种管理软件操作教程

【软件简介】书剑宠物疫苗接种管理软件是一款宠物疫苗接种管理的工具,适合宠物诊所使用。具有动物主人建档、宠物疫苗接种登记管理、每日提醒、打印疫苗接种通知卡、自定义短信提醒模板等完善的功能。另外本软件的特色是同时具有手机网页版功能,手机扫一扫即能接到电脑数据库,然后在手机上批量打电话,发短信,提醒疫苗接种即将到期的宠物主人

热文推荐