vue3项目中的字典功能

文章介绍了在前端使用TS重写和优化若依平台的字典功能,包括数据结构设计、自定义字典数据加载和el-tag插件的升级。优化点涉及避免不推荐的mixin方法,增加对布尔型和枚举类型的支持,以及数据持久化处理。示例代码展示了DictDataClass、DictLoad和index.ts等关键组件。
摘要由CSDN通过智能技术生成

声明:
本方法参考“若依”平台的字典功能,部分数据结构以及后台请求方法参考该平台源代码。

问题引入

若依平台的字典模块使用简洁便利,但是仍存在一些有待改进的地方:

  • 该模块使用minxin方法在vue3中已不再被提倡;
  • 模块阅读难度较大。主要是个人水平所限;
  • 无法在el-table-column的filters中使用;
  • 无常用自定义常量的功能,如布尔型变量的展示;
  • 不能处理后台枚举类型数据;
  • 未实现数据持久化处理,需要不断请求后台数据;

实现

采用ts语言编写。

数据结构

文件名:DictDataClass.ts

其中class DictData可根据自己情况添加属性

/**
 * 字典数据、字典元数据结构定义
 *@author MuYi
 *@date 2023-3-15 21:14:12
 *@version 1.0
 **/
/**
 * 后台返回数据结构,即标签和值,可能使用的字段名
 */
export const DictDataDefaultField = {
    /**
     * 默认标签字段
     */
    LABEL: ['label', 'name', 'title'],
    /**
     * 默认值字段
     */
    VALUE: ['value', 'id', 'uid', 'key'],

}
/**
 * 字典集合数据结构
 * @constructor
 */
export const DictClassData = () => {
    return {
        owner: null,
        label: {},
        type: {}
    }
}

/**
 *   字典集合类
 * @property {Object} label 字典 {字典类型名:{值:标签...}...}对象集合
 * @property {Object} dict 字典对象 {字典类型名:{}:DictData ...}字典集合
 * @property {Array.<DictMeta>} _dictMetas 字典元数据数组
 */
export class Dict {
    private owner: null;
    public label: {};
    public type: {};

    /**
     *
     * @param typeName 指定有效时(非null或‘’),type、label数组同时初始化一个该类型名的属性
     */
    constructor(typeName?: string) {
        this.owner = null;
        this.label = {};
        this.type = {};
        if (typeName && typeName.trim() != '') {
            let name = typeName.trim();
            if (name != '') {
                this.label[name] = {};
                this.type[name] = [];
            }
        }
    }
}


/**
 * 字典数据单项结构定义
 * @property label{string} 标签
 * @property text{string} 标签,与label相同。以便直接把值付给el-table-column的filters
 * @property value {*} 值
 * @property raw 原始数据(后台java的DictData类)
 **/
export class DictData {
    label: string;
    text: string;
    value: string | number;
    raw: object;

    /**
     *
     * @param label 标签值
     * @param value 字典值
     * @param raw 原始数据
     */
    constructor(label: string, value: string | number, raw: object) {
        this.label = label
        this.text = this.label
        this.value = value
        this.raw = raw
    }
}


/**
 * 字典元数据
 * @property {String} type 类型
 * @property {Function} request 请求
 * @property {Function} responseConverter 后台数据映射方法
 * @property {String} label 标签字段
 * @property {String} value 值字段
 */
export class DictMeta {
    type: string;
    labelField: string;
    valueField: string;
    public request: object;

    /**
     *
     * @param typeName 类型
     * @param labelField 标签字段
     * @param valueField 值字段
     */
    constructor(typeName: string, labelField: string, valueField: string) {
        this.type = typeName;
        this.labelField = labelField
        this.valueField = valueField
    }
}

前端自定义字典数据

文件名:DefinedDictData.json

其中:cssClass、isDefault、listClass、sort属性用于el-tag展示的样式

{
  "#说明":" 组key必须为小写,且前缀必须为'_',",
  "_boolean": [
    {
      "label": "是",
      "value": "true",
      "cssClass": "",
      "dictType": "_boolean",
      "dictValue": true,
      "isDefault": "Y",
      "listClass": "primary",
      "sort": 1
    },
    {
      "label": "否",
      "value": "false",
      "cssClass": "",
      "dictType": "_boolean",
      "dictValue": false,
      "isDefault": "N",
      "listClass": "warring",
      "sort": 2
    }
  ]
}

数据加载

文件名:DictLoad.ts

字典挂接方法

文件名:index.ts
抱歉。没CSDN积分了,整点积分用。下载地址:全部代码

/**
 * 字典数据
 * <pre>
 * </pre>
 *@author MuYi
 *@date 2023/3/15 21:38
 *@version 1.0
 **/
import {DictData, DictMeta, Dict} from "~/composables/dict/DictDataClass";
import {getDictEnumList} from '~/api/system/dict/data'
import {requestDict} from "~/composables/dict/DictLoad";

const DEFAULT_DICT_META = {
    type: '',
    labelField: 'label',
    valueField: 'dictValue',
    request(dictType: string) {
        return getDictEnumList(dictType).then(res => (res && res.data) ? (res.data) : [{}])
    }
}
/**
 * 加载字典数据
 * <pre>
 *     dictsTypeName约定:
 *     1 枚举enum类型以Enum开头
 *     2 自定义类型以"_"开头,如"_boolean"
 *     3 其他为系统提供dictType
 * </pre>
 * @param dictsTypeName 字典名称集合。字符串数组,或以逗号分隔的字符串
 * @param config
 * @constructor
 */
export const LoadDict = (dictsTypeName: string[] | string, config = DEFAULT_DICT_META): Dict => {
    let result = new Dict(null);
    let typeNames: string[] = getDictTypeNameArray(dictsTypeName);
    if (typeNames.length < 1) return result;
    for (let typeName of typeNames) {
        config.type = typeName;
        result.type[typeName] = [];
        result.label[typeName] = [];
        let dicts = requestDict(config, result)
    }

    return result;
}

const getDictTypeNameArray = (dicts: string[] | string): string[] => {
    if (!dicts) return [];
    let result: string[];
    if (dicts instanceof Array) {
        result = dicts;
    } else {
        result = dicts.toString().split(",")
    }
    for (let i = 0; i < result.length; i++) {
        result[i] = result[i].trim();
    }
    return result
}

el-tag插件升级

注:此代码为“若依”平台源代码

使用

<script setup="SysUser" lang="ts">
//from为上述代码的存放路径
import {LoadDict} from "~/composables/dict";
 //加载数据,依次为标准后台字典类型、后台enum类、自定义类型
const dict = LoadDict(['sys.yesNo', 'EnumExFormatType','_boolean']);
    <el-form-item label="下载类型" prop="exportType">
        <el-select>
          <el-option v-for="item in dict.type[EnumExFormatType]"
                        :key="item.value" :label="item.label" :value="item.value"/>
           </el-select>
   </el-form-item> 
   <el-table-column prop="cType" label="系统级别" resizable sortable
                      :filters="dict.type['sys.yesNo']" :filter-method="handleFilterChange">
       <template #default="scope">
           <dict-tag :options="dict.type['sys.yesNo']" :value="scope.row.cType"/>
       </template>
   </el-table-column>
引用\[1\]:在搭建Spring Boot项目时,可以参考一些教程来创建项目。在创建项目的过程,可以逐步添加新的功能,并进行测试,以确保项目的完整性和准确性。在创建项目时,可以选择适合自己的Spring Boot版本,并根据需要添加相应的依赖。\[1\] 引用\[2\]:在项目搭建完成并正常运行后,可以开始配置项目的日志。可以创建一个logback-spring.xml的配置文件,并在其指定日志存放的路径和打印的mapper位置。然后在application-dev.yml的配置文件添加日志文件的位置,以便项目启动后能正常打印日志。在测试项目时,可能会遇到一些问题,例如与原项目的冲突。因此,测试的重要性不可忽视,通过测试可以发现并解决问题。\[2\] 引用\[3\]:接下来是配置数据库。首先需要在pom文件添加所需的MySQL数据库依赖和阿里巴巴的Druid连接池依赖。然后在配置文件配置数据库相关内容,可以参考一些教程来进行配置。此外,还需要配置MyBatis,可以创建一个MyBatis配置类,并在其指定扫描路径和Mapper文件的位置。\[3\] 根据您的问题,如果您想在Spring Boot + Vue项目创建字典,可以按照以下步骤进行操作: 1. 在后端项目创建一个字典实体类,定义字典的属性和方法。 2. 创建一个字典的数据访问对象(DAO),用于与数据库进行交互,包括查询、插入、更新和删除字典数据。 3. 创建一个字典的服务类,用于处理字典的业务逻辑,例如查询字典数据、添加字典数据等。 4. 在前端项目创建一个字典管理页面,用于展示和操作字典数据。可以使用Vue框架来实现前端页面的开发。 5. 在前后端之间进行数据交互,可以使用RESTful API来进行数据传输。 通过以上步骤,您可以在Spring Boot + Vue项目成功创建字典,并实现字典的管理和操作。 #### 引用[.reference_title] - *1* *2* *3* [idea创建springboot+vue项目搭建之旅(一)](https://blog.csdn.net/ZuoJiu_/article/details/104281687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muyi517

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值