若依框架--数据字典设计使用和前后端代码分析

RY的数据字典管理:

字典管理是用来维护数据类型的数据,如下拉框、单选按钮、复选框、树选择的数据,方便系统管理员维护。减少对后端的访问,原来的下拉菜单点击一下就需要对后端进行访问,现在通过数据字典减少了对后端的访问。

如果不使用数据字典,对于每次查找的一些字段都要向后端发送请求。比如选择的时候 下拉框,因为数据都是动态选择的,不能直接输入。这样开发起来效率会很低。

数据库表结构

字典类型表

包括了 类型名称 、 字典类型需要是英文,status状态/

create table sys_dict_type
(dict_id     bigint auto_increment comment '字典主键'primary key,dict_name   varchar(100) default ''  null comment '字典名称',dict_type   varchar(100) default ''  null comment '字典类型',status      char         default '0' null comment '状态(0正常 1停用)',create_by   varchar(64)  default ''  null comment '创建者',create_time datetime                 null comment '创建时间',update_by   varchar(64)  default ''  null comment '更新者',update_time datetime                 null comment '更新时间',remark      varchar(500)             null comment '备注',constraint dict_typeunique ()
)comment '字典类型表';

用到了label和value.

create table sys_dict_data
(dict_code   bigint auto_increment comment '字典编码'primary key,dict_sort   int          default 0   null comment '字典排序',dict_label  varchar(100) default ''  null comment '字典标签',dict_value  varchar(100) default ''  null comment '字典键值',dict_type   varchar(100) default ''  null comment '字典类型',css_class   varchar(100)             null comment '样式属性(其他样式扩展)',list_class  varchar(100)             null comment '表格回显样式',is_default  char         default 'N' null comment '是否默认(Y是 N否)',status      char         default '0' null comment '状态(0正常 1停用)',create_by   varchar(64)  default ''  null comment '创建者',create_time datetime                 null comment '创建时间',update_by   varchar(64)  default ''  null comment '更新者',update_time datetime                 null comment '更新时间',remark      varchar(500)             null comment '备注'
)comment '字典数据表';

数据字典使用

在页面中获取数据字典:

<script setup>import {getCurrentInstance} from  'vue'   导入getCurrentInstanceconst   {proxy}=getCurrentInstance()const {port_type} =proxy.useDict('port_type')   //通过UseDict获取数据字典</script><template><div  v-for="item in port_type" :key="item.value" >{{item.label}}:{{item.value}}</div>
</template>

页面加载的时候像后端发送数据字典的请求。

console.log(port_type.value)  //就是一个Proxy数组

原理

前端

在main.js中导入了useDict。

并进行全局的挂载。

Vue 3 中,app.config.globalProperties 是一个可以让我们在 全局 为应用添加自定义属性或方法的对象。它的作用大致相当于 Vue 2 时代的 Vue.prototype。当我们执行:、
app.config.globalProperties.useDict = useDict
实际上就是给整个 Vue 应用的实例注入了一个名为 useDict 的方法,使得在任何组件实例里,都能够通过 this.useDict(在 Options API)或 proxy.useDict(在 Composition API 中通过 getCurrentInstance() 获取)去调用它。

拿到所有的数据字典。根据传进来的参数进行遍历字典,返回数据。

UseDictStore,对于某个页面的数据字典,会拿到之后存入到pinia中去,先看pinia中有没有数据,如果有就从pinia中拿,没有数据再去查询后端。

import useDictStore from '@/store/modules/dict'
import { getDicts } from '@/api/system/dict/data'/**
* 获取字典数据
*/
export function useDict(...args) {const res = ref({});return (() => {args.forEach((dictType, index) => {res.value[dictType] = [];const dicts = useDictStore().getDict(dictType);if (dicts) {res.value[dictType] = dicts;} else {getDicts(dictType).then(resp => {res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass }))useDictStore().setDict(dictType, res.value[dictType]);})}})return toRefs(res.value);})()
}

向后端发送数据字典请求的代码

export function getDicts(dictType) {return request({url: '/system/dict/data/type/' + dictType,method: 'get'})
}

在pinia中存储字典数据

const useDictStore = defineStore('dict',{state: () => ({dict: new Array()}),
actions: {// 获取字典getDict(_key) {if (_key == null && _key == "") {return null;}try {for (let i = 0; i < this.dict.length; i++) {if (this.dict[i].key == _key) {return this.dict[i].value;}}} catch (e) {return null;}},// 设置字典setDict(_key, value) {if (_key !== null && _key !== "") {this.dict.push({key: _key,value: value});}},// 删除字典removeDict(_key) {var bln = false;try {for (let i = 0; i < this.dict.length; i++) {if (this.dict[i].key == _key) {this.dict.splice(i, 1);return true;}}} catch (e) {bln = false;}return bln;},// 清空字典cleanDict() {this.dict = new Array();},// 初始字典initDict() {}
}
})export default useDictStore

持久化之后页面再次回来,不会发送请求了,而是直接从pinia中获取数据。

后端

在admin包下面 sysDictDataController

根据数据字典类型查询数据

@GetMapping(value = "/type/{dictType}")
public AjaxResult dictType(@PathVariable String dictType)
{List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);if (StringUtils.isNull(data)){data = new ArrayList<SysDictData>();}return success(data);
}

这边代码做了一个缓存的操作,每次启动项目的时候都会将数据查询所有的数据字典,缓存到redis中去。

@Override
public List<SysDictData> selectDictDataByType(String dictType)
{
List<SysDictData> dictDatas = DictUtils.getDictCache(dictType); //拿到缓存的字典
if (StringUtils.isNotEmpty(dictDatas))
{return dictDatas;
}
dictDatas = dictDataMapper.selectDictDataByType(dictType); //根据dictType查询数据库
if (StringUtils.isNotEmpty(dictDatas))
{DictUtils.setDictCache(dictType, dictDatas);return dictDatas;
}
return null;
}

缓存工具类

public static List<SysDictData> getDictCache(String key)
{
//拿到一个一个JSON树,将JSon数组转为List集合
JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(arrayCache))
{return arrayCache.toList(SysDictData.class);
}
return null;
}/*** 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public <T> T getCacheObject(final String key){ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);}public static String getCacheKey(String configKey){return CacheConstants.SYS_DICT_KEY + configKey;}public static final String SYS_DICT_KEY = "sys_dict:";

查看Redis缓存,发现存在数据字典。

删除redis中的数据字典,重新启动项目。发现数据字典又出来,说明项目启动的时候自动回去查询数据字典。

在SysDictTypeServiceImpl上面添加注解,这个注解可以让项目在启动的时候加载这个方法。

@PostConstruct//package javax.annotation; 这个javax的注解  加了这个注解之后 spring项目启动后会运行这个方法
public void init()
{    loadingDictCache();
}
@Override
public void loadingDictCache()
{// 1. 构造一个条件对象(SysDictData),并设置 status = "0"SysDictData dictData = new SysDictData();dictData.setStatus("0");// 2. 查询数据库中符合条件(status = "0")的字典数据,然后使用 Stream 流处理Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData)    // 2.1 从数据库中获取所有的字典数据.stream()                        // 2.2 转换为 Stream.collect(                        // 2.3 分组Collectors.groupingBy(SysDictData::getDictType));// 3. 遍历每一组字典数据(以 dictType 作为分组依据)for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet()){// 4. 按照某个排序字段(getDictSort)对每个分组内的字典数据进行排序,然后放进缓存DictUtils.setDictCache(entry.getKey(), // key: dictTypeentry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)) .collect(Collectors.toList()));}
}

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

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

相关文章

2025年  生活公报计划

我计划&#xff0c;在2025年将自己生活的一部分进行公开化播报&#xff0c;公报内容基本就是所见所闻所思所想&#xff0c;以及最近要做的事情和已经完成的计划任务。 也可以当做一种生活日志。暂定一年期执行&#xff0c;以后做不做&#xff0c;以后再说。 因为我一直有计划清…

Unity打包+摄像机组件

转换场景 使用程序集&#xff1a;using UnityEngine.SceneManagement; 切换场景相关代码&#xff1a;SceneManager.LoadScene(1);//括号内可放入场景名称&#xff0c;场景索引等 //Application.LoadLevel(""); 老版本Unity加载场景方法 打包相关 Bundle Identi…

蓝桥与力扣刷题(66 加一)

题目&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入…

stable diffusion 量化学习笔记

文章目录 一、一些tensorRT背景及使用介绍1&#xff09;深度学习介绍2&#xff09;TensorRT优化策略介绍3&#xff09;TensorRT基础使用流程4&#xff09;dynamic shape 模式5&#xff09;TensorRT模型转换 二、实操1&#xff09;编译tensorRT开源代码运行SampleMNIST 一、一些…

省森林防火应急指挥系统

森林防火形势严峻 我国森林防火形势十分严峻&#xff0c;森林火灾具有季节性强、发现难、成灾迅速等特点&#xff0c;且扑救难度大、影响范围广、造成的损失重。因此&#xff0c;构建森林防火应急指挥系统显得尤为重要。 系统建设模式与架构 森林防火应急指挥系统采用大智慧…

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/

79 Openssl3.0 RSA公钥加密数据

1 引言 最近不小心用到了openssl3.0&#xff0c;项目中需要使用rsa非对称加解密算法&#xff0c;所以把openssl3.0使用公钥加密数据的函数调用摸了一遍。 之所以记录此篇文章&#xff0c;是因为网络上大多数是openssl3.0以前的版本的函数接口&#xff0c;而openssl3.0之后已经丢…

【python3】 sqlite格式的db文件获得所有表和数据

【python3】 sqlite格式的db文件获得所有表和数据 1.背景2.代码3.解析1.背景 SQLite 格式的 .db 文件就是一个包含 SQLite 数据库的文件。 SQLite 格式的 .db 文件通常存储的是一个关系型数据库。 SQLite广泛用于应用程序、移动设备、浏览器等场景。它将整个数据库存储在一个文…

C++ STL map和set的使用

序列式容器和关联式容器 想必大家已经接触过一些容器如&#xff1a;list&#xff0c;vector&#xff0c;deque&#xff0c;array&#xff0c;forward_list&#xff0c;string等&#xff0c;这些容器统称为系列容器。因为逻辑结构为线性的&#xff0c;两个位置的存储的值一般是…

26、【OS】【Nuttx】用cmake构建工程

背景 之前wiki 14、【OS】【Nuttx】Nsh中运行第一个程序 都是用 make 构建&#xff0c;准备切换 cmake 进行构建&#xff0c;方便后续扩展开发 Nuttx cmake 适配 nuttx项目路径下输入 make distclean&#xff0c;清除之前工程配置 adminpcadminpc:~/nuttx_pdt/nuttx$ make …

spring boot解决swagger中的v2/api-docs泄露漏洞

在配置文件中添加以下配置 #解决/v2/api-docs泄露漏洞 springfox:documentation:swagger-ui:enabled: falseauto-startup: false 处理前&#xff1a; 处理后&#xff1a;

Iterator 与 ListIterator 的区别

在 Java 中&#xff0c;Iterator 和 ListIterator 是用于遍历集合的两种常用接口&#xff0c;它们提供了不同的功能和操作方式。理解它们的区别对于编写高效的 Java 代码非常重要。本文将详细介绍这两个接口的区别&#xff0c;帮助大家更好地理解它们在不同场景下的应用。 1. I…

堆叠、M-LAG

1.基础概念 堆叠&#xff1a;可以理解为多个设备连接在一起&#xff0c;形成一个逻辑设备。比如有三个物理交换机A、B、C通过配置与网线把他们连接在一起&#xff0c;配成堆叠设备后&#xff0c;可以看成一个交换机D。M-lag&#xff08;Multichassis Link Aggregation Group&a…

计算机网络之---物理层的基本概念

物理层简介 物理层&#xff08;Physical Layer&#xff09; 是 OSI&#xff08;开放系统互联&#xff09;模型 中的第 1 层&#xff0c;它主要负责数据在物理媒介上的传输&#xff0c;确保原始比特&#xff08;0 和 1&#xff09;的传输不受干扰地从一个设备传送到另一个设备。…

LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎

前言 LayaAir3的每一个分支版本都是一次较大的提升&#xff0c;在3.1彻底完善了引擎生态结构之后&#xff0c;本次的3.2会重点完善全平台发布相关的种种能力&#xff0c;例如&#xff0c;除原有的安卓与iOS系统外&#xff0c;还支持Windows系统、Linux系统、鸿蒙Next系统&#…

AI多模态技术介绍:视觉语言模型(VLMs)指南

本文作者&#xff1a;AIGCmagic社区 刘一手 AI多模态全栈学习路线 在本文中&#xff0c;我们将探讨用于开发视觉语言模型&#xff08;Vision Language Models&#xff0c;以下简称VLMs&#xff09;的架构、评估策略和主流数据集&#xff0c;以及该领域的关键挑战和未来趋势。通…

uniapp区域滚动——上划进行分页加载数据(详细教程)

##标题 用来总结和学习&#xff0c;便于自己查找 文章目录 一、为什么scroll-view?          1.1 区域滚动页面滚动&#xff1f;          1.2 代码&#xff1f; 二、分页功能&#xff1f;          2.1 如何实现&#xff…

【大数据】Apache Superset:可视化开源架构

Apache Superset是什么 Apache Superset 是一个开源的现代化数据可视化和数据探索平台&#xff0c;主要用于帮助用户以交互式的方式分析和展示数据。有不少丰富的可视化组件&#xff0c;可以将数据从多种数据源&#xff08;如 SQL 数据库、数据仓库、NoSQL 数据库等&#xff0…

开源 vGPU 方案 HAMi 解析

开源 vGPU 方案 HAMi 一、k8s 环境下 GPU 资源管理的现状与问题 &#xff08;一&#xff09;资源感知与绑定 在 k8s 中&#xff0c;资源与节点紧密绑定。对于 GPU 资源&#xff0c;我们依赖 NVIDIA 提供的 device-plugin 来进行感知&#xff0c;并将其上报到 kube-apiserver…

反射的底层实现原理?

Java 反射机制详解 目录 什么是反射&#xff1f;反射的应用反射的实现反射的底层实现原理反射的优缺点分析 一、什么是反射&#xff1f; 反射是 Java 编程语言中的一个强大特性&#xff0c;它允许程序在运行期间动态获取类和操纵类。通过反射机制&#xff0c;可以在运行时动…