后端字典的优雅设计

背景

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

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中优雅的实现字典管理](

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

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

相关文章

导数公式及求导法则

目录 基本初等函数的导数公式 求导法则 有理运算法则 复合函数求导法 隐函数求导法 反函数求导法 参数方程求导法 对数求导法 基本初等函数的导数公式 基本初等函数的导数公式包括&#xff1a; C0(x^n)nx^(n-1)(a^x)a^x*lna(e^x)e^x(loga(x))1/(xlna)(lnx)1/x(sinx)cos…

asp.net+C#高校实验室机房预约管理系统

本系统以学生&#xff0c;教师和管理员三种角色参与到系统中&#xff0c;这样让学校的主要角色都够方面的&#xff0c;合理的参与到机房的预约管理中&#xff0c;考虑到可能出现的教师同时预约机房的情况&#xff0c;本系统采用了预约时避免冲突、受理时解决冲突的方法&#xf…

Mapbox加载arcgis的底图

成果图 这种底图基本上都是按照raster来加载的&#xff0c;主要就是知道地址了&#xff0c;拼参数 具体参数请参考官网 https://developers.arcgis.com/rest/services-reference/enterprise/export-map.htm 源码 我的服务列表是这样的 http://XXXX:XXXX/arcgis/rest/services/…

ctfshow 反序列化

PHP反序列化前置知识 序列化和反序列化 对象是不能在字节流中传输的&#xff0c;序列化就是把对象转化为字符串以便存储和传输&#xff0c;反序列化就是将字符串转化为对象 魔术方法 __construct() //构造&#xff0c;当对象new时调用 __wakeup() //执行unserialize()时&am…

14.Redis 主从复制

Redis 主从复制 redis 主从复制配置 redis 主从复制启动 redis 主从复制断开 redis 主从复制主从复制构特点主从复制的拓扑结构一主一从⼀主多从树状主从 主从复制原理数据同步psync 运行流程全量复制流程部分复制流程实时复制 关于从节点何时晋升成主节点总结 redis 主从复制 …

分类预测 | Matlab实现RBF-Adaboost多特征分类预测

分类预测 | Matlab实现RBF-Adaboost多特征分类预测 目录 分类预测 | Matlab实现RBF-Adaboost多特征分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于RBF-Adaboost数据分类预测&#xff08;Matlab完整程序和数据&#xff09; 2.多特征输入…

深入理解JVM虚拟机第六篇:内存结构与类加载子系统概述

文章目录 一&#xff1a;内存结构概述 1&#xff1a;运行时数据区 2&#xff1a;运行时数据区简图 3&#xff1a;运行时数据区详细图中英文版 二&#xff1a;类加载器子系统 1&#xff1a;加载 2&#xff1a;连接 3&#xff1a;初始化 一&#xff1a;内存结构概述 1…

Redis缓存设计与性能优化

多级缓存架构 缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去…

GpsAndMap模块开源,欢迎测评

背景 之前的文章有提到&#xff0c;最近在使用folium的过程中&#xff0c;深感对于一个非专业人员来说&#xff0c;GPS坐标以及其所隐含的GPS坐标系&#xff0c;以及不同GPS坐标系之间的相互转换关系&#xff0c;不是一个十分清晰的概念&#xff0c;往往造成在使用GPS坐标在fo…

前端通过第三插件uuid 生成一个 uuid

有时候 后端会让我们自己生成一个uuid 我们没必要自己去写 直接用第三方插件就好了 先终端执行 npm install uuid这样 我们第三方插件就进来了 然后 引入一定要根据环境来 //TS环境引入 import { v4 as uuidv4 } from uuid; //js环境引入 const { v4: uuidv4 } require(uui…

全球汽车安全气囊芯片总体规模分析

安全气囊系统是一种被动安全性的保护系统&#xff0c;它与座椅安全带配合使用&#xff0c;可以为乘员提供有效的防撞保护。在汽车相撞时&#xff0c;汽车安全气囊可使头部受伤率减少25%&#xff0c;面部受伤率减少80%左右。 汽车安全气囊芯片是整个系统的控制核心&#xff0c;并…

业务中如何拓展微前端架构

站在整体架构的角度&#xff0c;微前端可以分为以下几类拓展迭代方向。 注册更多微应用 随着业务的扩展,我们可以在主应用中注册更多的微应用。每个微应用是一个独立的子系统,只需要在主应用的注册列表中添加新的项,配置微应用的名称、入口、活动规则等信息即可。 集成微应用…