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

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_type
  unique ()
)
    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'   导入getCurrentInstance
  const   {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: dictType
            entry.getValue()
            .stream()
            .sorted(Comparator.comparing(SysDictData::getDictSort)) 
            .collect(Collectors.toList())
        );
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openEuler 22.04使用yum源最快速度部署k8s 1.20集群

本文目的 openEuler的官方源里有kubernetes 1.20&#xff0c;使用yum源安装是最快部署一个k8s集群的办法 硬件环境 主机名系统架构ipmasteropenEuler release 22.03 (LTS-SP2)arm192.168.3.11edgeopenEuler release 22.03 (LTS-SP2)arm192.168.3.12deviceopenEuler release 22.…

使用宝塔面板,安装 Nginx、MySQL 和 Node.js

使用ssh远程链接服务器 在完成使用ssh远程链接服务器后 可使用宝塔面板&#xff0c;安装 Nginx、MySQL 和 Node.js 宝塔网站 一、远程链接服务器 二、根据服务器系统安装宝塔 wget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash inst…

Linux第一课:c语言 学习记录day06

四、数组 冒泡排序 两两比较&#xff0c;第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮&#xff1a;i 0 n&#xff1a;n个数&#xff0c;比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …

油猴支持阿里云自动登陆插件

遇到的以下问题&#xff0c;都已在脚本中解决&#xff1a; 获取到的元素赋值在页面显示&#xff0c;但是底层的value并没有改写&#xff0c;导致请求就是获取不到数据元素的加载时机不定&#xff0c;尤其是弱网情况下&#xff0c;只靠延迟还是有可能获取不到&#xff0c;且登陆…

什么是卷积网络中的平移不变性?平移shft在数据增强中的意义

今天来介绍一下数据增强中的平移shft操作和卷积网络中的平移不变性。 1、什么是平移 Shift 平移是指在数据增强&#xff08;data augmentation&#xff09;过程中&#xff0c;通过对输入图像或目标进行位置偏移&#xff08;平移&#xff09;&#xff0c;让目标在图像中呈现出…

android framework.jar 在应用中使用

在开发APP中&#xff0c;有时会使用系统提供的framework.jar 来替代 android.jar, 在gradle中配置如下&#xff1a; 放置framework.jar 依赖配置 3 优先级配置 gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspat…

7.STM32F407ZGT6-RTC

参考&#xff1a; 1.正点原子 前言&#xff1a; RTC实时时钟是很基本的外设&#xff0c;用来记录绝对时间。做个总结&#xff0c;达到&#xff1a; 1.学习RTC的原理和概念。 2.通过STM32CubeMX快速配置RTC。 27.1 RTC 时钟简介 STM32F407 的实时时钟&#xff08;RTC&#xf…

如何开启苹果手机(IOS)系统的开发者模式?

如何开启开发者模式&#xff1f; 一、打开设置二、隐私与安全性三、找到开发者模式四、开启开发者模式------------------------------------------------------------如果发现没有开发者模式的选项一、电脑下载爱思助手二、连接手机三、工具箱——虚拟定位——打开虚拟定位——…

day06_Spark SQL

文章目录 day06_Spark SQL课程笔记一、今日课程内容二、DataFrame详解&#xff08;掌握&#xff09;5.清洗相关的API6.Spark SQL的Shuffle分区设置7.数据写出操作写出到文件写出到数据库 三、Spark SQL的综合案例&#xff08;掌握&#xff09;1、常见DSL代码整理2、电影分析案例…

stable diffusion 量化学习笔记

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

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…

primitive 编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…

【Linux-多线程】-线程安全单例模式+可重入vs线程安全+死锁等

一、线程安全的单例模式 什么是单例模式 单例模式是一种“经典的&#xff0c;常用的&#xff0c;常考的”设计模式 什么是设计模式 IT行业这么火&#xff0c;涌入的人很多.俗话说林子大了啥鸟都有。大佬和菜鸡们两极分化的越来越严重&#xff0c;为了让菜鸡们不太拖大佬的后…

C语言程序环境和预处理详解

本章重点&#xff1a; 程序的翻译环境 程序的执行环境 详解&#xff1a;C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 程序的翻译环境和执行环…

pytorch torch.isclose函数介绍

torch.isclose 是 PyTorch 中用于比较两个张量是否“近似相等”的函数。它主要用于判断两个张量的对应元素在数值上是否接近&#xff08;考虑了浮点数精度的可能误差&#xff09;。 函数定义 torch.isclose(input, other, rtol1e-05, atol1e-08, equal_nanFalse)参数说明 inpu…

springboot整合h2

在 Spring Boot 中整合 H2 数据库非常简单。H2 是一个轻量级的嵌入式数据库&#xff0c;非常适合开发和测试环境。以下是整合 H2 数据库的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加 H2 数据库的依赖&#xff1a; <dependency><grou…

RabbitMQ 可观测性最佳实践

RabbitMQ 简介 RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写&#xff0c;支持多种客户端。它通过使用交换机&#xff08;Exchanges&#xff09;、队列&#xff08;Queues&#xff09;和绑定&#xff08;Bindings&#xff09;来路由消息&#xff…

初识 Git——《Pro Git》

Why Git&#xff1f; 1. 本地版本控制系统 Why&#xff1a; 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单&#xff0c;但是特别容易犯错。 有时候会混淆所在的工作目录&#xff0c;一不小心…

C语言gdb调试

目录 1.gdb介绍 2.设置断点 2.1.测试代码 2.2.设置函数断点 2.3.设置文件行号断点 2.4.设置条件断点 2.5.多线程调试 3.删除断点 3.1.删除指定断点 3.2.删除全部断点 4.查看变量信息 4.1.p命令 4.2.display命令 4.3.watch命令 5.coredump日志 6.总结 1.gdb介绍…

UML系列之Rational Rose笔记三:活动图(泳道图)

一、新建活动图&#xff08;泳道图&#xff09; 依旧在用例视图里面&#xff0c;新建一个activity diagram&#xff1b;新建好之后&#xff0c;就可以绘制活动图了&#xff1a; 正常每个活动需要一个开始&#xff0c;点击黑点&#xff0c;然后在图中某个位置安放&#xff0c;接…