位置: IT常识 - 正文

若依(ruoyi)字典管理插件实现思路探究(若依名字的含义是什么意思)

编辑:rootadmin
若依(ruoyi)字典管理插件实现思路探究

推荐整理分享若依(ruoyi)字典管理插件实现思路探究(若依名字的含义是什么意思),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:若依是什么意思,若依名字的含义是什么意思,若依是啥,若依是什么意思和含义,若依出处,若依这个名字的含义是什么,若依是啥,若依是啥,内容如对您有帮助,希望把文章链接给更多的朋友!

 一个UI表单的构成,避免不了下拉框,多选框等标签,在开发这些标签时,通常会请求后台接口获取字典值进行动态渲染。定制化开发虽然实现简单,但会产生大量重复工作,解决这类问题的思路有哪些?文章对若依字典管理插件实现思路进行了探究,以此来开阔思路。

探究过程如下:

界面设计数据库设计开发用例源码分析一、界面设计

访问若依管理系统-系统管理-字典管理

界面截图如下:

 

功能提供了字典类型及字典键值的管理

二、数据库设计

SYS_DICT_TYPE

SYS_DICT_DATA

使用到SYS_DICT_TYPE,SYS_DICT_DATA两张表,定义了字典类型,及对应字典键值,两者是一对多的关系,通过dict_type关联。

三、开发用例

以用户性别为例,

功能配置:

字典名称:用户性别字典类型:sys_user_sex若依(ruoyi)字典管理插件实现思路探究(若依名字的含义是什么意思)

字典数据

页面开发:

引入字典类型export default { name: "User", dicts: ['sys_normal_disable', 'sys_user_sex'], components: { Treeselect }, ......}标签使用字典值 <el-col :span="12"> <el-form-item label="用户性别"> <el-select v-model="form.sex" placeholder="请选择性别"> <el-option v-for="dict in dict.type.sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> </el-select> </el-form-item> </el-col>

实现效果:

 可以发现,通过灵活的功能配置,vue页面只要引入对应的字典类型,就可以使用字典数据,完成标签的动态渲染,接下来对源码进行分析,探究其实现过程。

四、源码分析

在开发用例中,发现vue自定义属性:dicts: ['sys_user_sex'],申明了vue实例需要引入的字典类型,那问题来了,vue实例是怎么通过这个自定义属性获取对应字典信息呢?

为了回答这个问题,需要先了解一下main.js的使用,参考文章vue项目中main.js使用方法详解,

文中提到“main.js是我们的入口文件,主要作用是初始化vue实例,并引入所需要的插件”,根据提示在main.js中找到与字典插件相关的所有代码段:

import { getDicts } from "@/api/system/dict/data";// 字典标签组件import DictTag from '@/components/DictTag'// 字典数据组件import DictData from '@/components/DictData'// 全局方法挂载Vue.prototype.getDicts = getDicts// 全局组件挂载Vue.component('DictTag', DictTag)DictData.install()

按照这些插件加载的先后顺序进行分析

import { getDicts } from "@/api/system/dict/data":一个接口方法,根据字典类型查询字典数据信息。// 根据字典类型查询字典数据信息export function getDicts(dictType) {return request({url: '/system/dict/data/type/' + dictType,method: 'get'})}import DictTag from '@/components/DictTag':字典标签组件,根据传入标签值,回显其对应的标签中文名,常用于数据列表中,返回的是标签值,通过DictTag组件可以回显对应的中文描述。<template><div><template v-for="(item, index) in options"><template v-if="values.includes(item.value)"><spanv-if="item.raw.listClass == 'default' || item.raw.listClass == ''":key="item.value":index="index":class="item.raw.cssClass">{{ item.label }}</span><el-tagv-else:disable-transitions="true":key="item.value":index="index":type="item.raw.listClass == 'primary' ? '' : item.raw.listClass":class="item.raw.cssClass">{{ item.label }}</el-tag></template></template></div></template><script>export default {name: "DictTag",props: {options: {type: Array,default: null,},value: [Number, String, Array],},computed: {values() {if (this.value !== null && typeof this.value !== 'undefined') {return Array.isArray(this.value) ? this.value : [String(this.value)];} else {return [];}},},};</script><style scoped>.el-tag + .el-tag {margin-left: 10px;}</style>import DictData from '@/components/DictData':提供了字典数据组件安装方法。import Vue from 'vue'import DataDict from '@/utils/dict'import { getDicts as getDicts } from '@/api/system/dict/data'function install() { Vue.use(DataDict, { metas: { '*': { labelField: 'dictLabel', valueField: 'dictValue', request(dictMeta) { return getDicts(dictMeta.type).then(res => res.data) }, }, }, })}export default { install,}

其中 import DataDict from '@/utils/dict'  引入了字典数据组件,是整个实现的核心,是这次分析的重点,涉及以下插件:

其中index.js 是入口程序,实现逻辑如下:

引入了Dict,DictOptions 插件import Dict from './Dict'import { mergeOptions } from './DictOptions'合并配置参数mergeOptions(options),将DictData的metas 与 DictOptions的metas配置信息进行合并metas: { '*': { labelField: 'dictLabel', valueField: 'dictValue', request(dictMeta) { return getDicts(dictMeta.type).then(res => res.data) }, },}metas: { '*': { /** * 字典请求,方法签名为function(dictMeta: DictMeta): Promise */ request: (dictMeta) => { console.log(`load dict ${dictMeta.type}`) return Promise.resolve([]) }, /** * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData */ responseConverter, labelField: 'label', valueField: 'value', },},通过mixin创建混入对象,将Dict组件 “混合”到各个使用组件本身的选项中。

什么是mixin?可查看博文对vue中mixin的理解。

其中data()方法 “const dict = new Dict()” 负责Dict组件创建,created() 方法中“this.dict.init(this.$options.dicts)”,将vue页面上定义的dicts数组传进去,组装数据,请求后端,获取对应字典数据。

import Dict from './Dict'import { mergeOptions } from './DictOptions'export default function(Vue, options) { mergeOptions(options) Vue.mixin({ data() { if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) { return {} } const dict = new Dict() dict.owner = this return { dict } }, created() { if (!(this.dict instanceof Dict)) { return } // options 如果配置onCreated ,则执行options.onCreated options.onCreated && options.onCreated(this.dict) this.dict.init(this.$options.dicts).then(() => { //options 如果配置onReady ,则执行options.onReady方法 options.onReady && options.onReady(this.dict) this.$nextTick(() => { this.$emit('dictReady', this.dict) if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { this.$options.methods.onDictReady.call(this, this.dict) } }) }) }, })}

对this.dict.init(this.$options.dicts)代码进行分析:其根据传入的options配置信息,生成字典元数据配置信息dictMeta,然后创建回调方法执行数组const ps = [],根据dictMeta加入对应字典类型的loadDict方法,通过Promise.all(ps)发送多个请求并根据请求顺序获取和使用字典数据。

import Vue from 'vue'import { mergeRecursive } from "@/utils/ruoyi";import DictMeta from './DictMeta'import DictData from './DictData'const DEFAULT_DICT_OPTIONS = { types: [],}/** * @classdesc 字典 * @property {Object} label 标签对象,内部属性名为字典类型名称 * @property {Object} dict 字段数组,内部属性名为字典类型名称 * @property {Array.<DictMeta>} _dictMetas 字典元数据数组 */export default class Dict { constructor() { this.owner = null this.label = {} this.type = {} } init(options) { if (options instanceof Array) { options = { types: options } } const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options) if (opts.types === undefined) { throw new Error('need dict types') } const ps = [] this._dictMetas = opts.types.map(t => DictMeta.parse(t)) this._dictMetas.forEach(dictMeta => { const type = dictMeta.type Vue.set(this.label, type, {}) Vue.set(this.type, type, []) if (dictMeta.lazy) { return } ps.push(loadDict(this, dictMeta)) }) return Promise.all(ps) } /** * 重新加载字典 * @param {String} type 字典类型 */ reloadDict(type) { const dictMeta = this._dictMetas.find(e => e.type === type) if (dictMeta === undefined) { return Promise.reject(`the dict meta of ${type} was not found`) } return loadDict(this, dictMeta) }}/** * 加载字典 * @param {Dict} dict 字典 * @param {DictMeta} dictMeta 字典元数据 * @returns {Promise} */function loadDict(dict, dictMeta) { return dictMeta.request(dictMeta) .then(response => { const type = dictMeta.type let dicts = dictMeta.responseConverter(response, dictMeta) if (!(dicts instanceof Array)) { console.error('the return of responseConverter must be Array.<DictData>') dicts = [] } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) { console.error('the type of elements in dicts must be DictData') dicts = [] } dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts) dicts.forEach(d => { Vue.set(dict.label[type], d.value, d.label) }) return dicts })}

这样字典管理插件实现思路就基本清楚了,希望对你有所帮助。

本文链接地址:https://www.jiuchutong.com/zhishi/287111.html 转载请保留说明!

上一篇:B/S架构(b/s架构的正确解释方式)

下一篇:STP详解

  • 陌陌怎么隐身(陌陌怎么隐身访问别人的记录)

    陌陌怎么隐身(陌陌怎么隐身访问别人的记录)

  • 华为手机已保存的wifi怎么看密码(华为手机已保存的网络怎么批量删除)

    华为手机已保存的wifi怎么看密码(华为手机已保存的网络怎么批量删除)

  • 小米浏览器图标不见了(小米浏览器图标没了)

    小米浏览器图标不见了(小米浏览器图标没了)

  • 苹果8微信美颜教程(苹果8微信美颜功能怎么设置)

    苹果8微信美颜教程(苹果8微信美颜功能怎么设置)

  • 苹果电池显示维修怎么关闭(苹果电池显示维修什么意思)

    苹果电池显示维修怎么关闭(苹果电池显示维修什么意思)

  • 公域流量和私域流量是什么意思(公域流量和私域流量的思维导图)

    公域流量和私域流量是什么意思(公域流量和私域流量的思维导图)

  • iphone8plus和iphonese2对比(iphone8plus和iphonese2参数对比)

    iphone8plus和iphonese2对比(iphone8plus和iphonese2参数对比)

  • 蓝牙耳机i11和i12有什么区别(蓝牙耳机i11和i12区别)

    蓝牙耳机i11和i12有什么区别(蓝牙耳机i11和i12区别)

  • 纽扣电池cr2025和cr2032通用吗(纽扣电池cr2025和cr2032区别)

    纽扣电池cr2025和cr2032通用吗(纽扣电池cr2025和cr2032区别)

  • 礼物墙有访问记录吗(礼物墙里的礼物是不是删不掉)

    礼物墙有访问记录吗(礼物墙里的礼物是不是删不掉)

  • 换系统对电脑有什么影响(换系统对电脑有影响吗)

    换系统对电脑有什么影响(换系统对电脑有影响吗)

  • 为什么苹果充到80就充不进了(为什么苹果充到了100还是显示在充电啊)

    为什么苹果充到80就充不进了(为什么苹果充到了100还是显示在充电啊)

  • 为什么手机连上wifi却显示不可上网(为什么手机连上自家wifi却上不了网)

    为什么手机连上wifi却显示不可上网(为什么手机连上自家wifi却上不了网)

  • bios检测不到m2ssd(BIOS检测不到三星980)

    bios检测不到m2ssd(BIOS检测不到三星980)

  • 抖音移除粉丝后还能关注吗(抖音移除粉丝后对方还能关注吗)

    抖音移除粉丝后还能关注吗(抖音移除粉丝后对方还能关注吗)

  • 微信透明头像怎么弄ios(微信透明头像怎么弄)

    微信透明头像怎么弄ios(微信透明头像怎么弄)

  • 黑鲨手机怎么隐藏视频(黑鲨手机怎么隐藏app图标)

    黑鲨手机怎么隐藏视频(黑鲨手机怎么隐藏app图标)

  • 铃声多多音乐怎么下载(铃声多多音乐怎么剪辑)

    铃声多多音乐怎么下载(铃声多多音乐怎么剪辑)

  • 淘宝店铺没了能退款吗(淘宝店铺没了能恢复吗)

    淘宝店铺没了能退款吗(淘宝店铺没了能恢复吗)

  • 控制器的功能是(计算机组成原理控制器的功能是)

    控制器的功能是(计算机组成原理控制器的功能是)

  • uniapp是什么(uniapp是什么时间发布的)

    uniapp是什么(uniapp是什么时间发布的)

  • 小米盒子怎么强制重启(小米盒子怎么强制恢复出厂设置后停留在开机画面)

    小米盒子怎么强制重启(小米盒子怎么强制恢复出厂设置后停留在开机画面)

  • qq能传多大的视频(qq可传多大视频)

    qq能传多大的视频(qq可传多大视频)

  • vivo反向充电怎么弄(vivo反向充电怎么给苹果充电)

    vivo反向充电怎么弄(vivo反向充电怎么给苹果充电)

  • 绿钻续费怎么关闭(绿钻续费怎么关苹果手机)

    绿钻续费怎么关闭(绿钻续费怎么关苹果手机)

  • 红魔7pro和苹果13promax哪个好(红魔3和一加7pro哪个好)

    红魔7pro和苹果13promax哪个好(红魔3和一加7pro哪个好)

  • win11如何设置多任务窗口 Win11开启分屏多任务方法(win11多任务怎么用)

    win11如何设置多任务窗口 Win11开启分屏多任务方法(win11多任务怎么用)

  • 在Linux中安装是使用系统性能监控软件Nmon(linux安装方式有)

    在Linux中安装是使用系统性能监控软件Nmon(linux安装方式有)

  • 城建税要减进项税吗
  • 小规模纳税人进项可以抵扣吗
  • 财务报告与财务报表的联系与区别
  • 公允价值变动损益增加记哪方
  • 调整上年度损益
  • 长期挂账应付款的审计
  • 工业企业用电是收入的几倍
  • 固定资产发票未到可以确认固定资产吗
  • 电力设备维护费增值税税率
  • 增值税小规模纳税人免征增值税政策
  • 增值税在免税范围内,附加税怎么做
  • 销售商品货款已预收
  • 年终奖个人所得税怎么扣
  • 支票可以自己给自己开吗
  • 工商注销债务承担
  • 电费预付之后又退回来了
  • 超出经营范围开发票
  • mac怎么打开hosts文件
  • 开电脑店几年搞活动好吗
  • 为什么可供出售的金融资产是非流动资产
  • 一般纳税人销售二手车增值税税率
  • 开启自动备份注册表
  • php过滤emoji
  • php到底是什么
  • PHP:ftp_delete()的用法_FTP函数
  • 投标保证金怎么退还流程
  • 手机短信是哪一年开始的
  • php实现的任意进程函数
  • 家具折旧费是什么意思
  • 无私有住房证明怎么开
  • 命令行基础
  • 小微企业没有进账,可以不报税吗
  • php多条件搜索功能的实现
  • 公司收到财政补贴款的会计分录
  • 大前端技术
  • 路由加载的几种方式
  • service iptables save
  • 单元测试的测试工具
  • php弹出提示框
  • 提取法定盈余公积的公式
  • 电商会计如何做账
  • 土地使用发票
  • sqlserver2000分页
  • 收到银行承兑汇票如何记账
  • 税控盘退费怎么做会计分录
  • 不确认销售收入的原因
  • 什么叫公关费用
  • 评估价值高于账面价值怎么账务处理
  • 小规模纳税人的增值税计入成本吗
  • 财务预付账款情况说明
  • 退了的社保能申请回来吗
  • 不是公司的车费用能走公司吗
  • 暂估入库结转成本
  • 电子发票是否使用
  • 跨年退货怎么处理账务
  • 季度的工会经费怎么算
  • 最新商业会计科目做账
  • mac设置多个桌面
  • mac系统不能用
  • ubuntu12.04.5安装教程
  • centos7安装中文包
  • win8 boot manager
  • linux指定格式显示日期
  • win8正版系统自带
  • Win10 Mobile RedStone预览版14267已知问题与修复内容汇总
  • 批处理常用命令总结
  • 老生常谈的道理
  • css模糊滤镜
  • dropdownlist绑定数据
  • css中层叠的含义
  • Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
  • shell函数库
  • js插件推荐
  • android点击事件传递机制
  • 深入浅出css
  • 广东税务怎么查社保缴费明细
  • 南京电费余额查询
  • 衰竭期矿山开采的矿产品减征幅度
  • 上海税务局网上举报平台官网
  • 为什么有的企业在企查查上查不到
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设