二、数据字典开发

news2024/11/24 12:29:48

文章目录

  • 二、数据字典开发
    • 1、搭建service-cmn模块
      • 1.1 搭建service-cmn模块
      • 1.2 修改配置
      • 1.3 启动类
    • 2、数据字典列表
      • 2.1 数据字典列表接口
        • 2.1.1 model模块添加数据字典实体
        • 2.1.2 添加数据字典mapper
        • 2.1.4 添加数据字典controller
      • 2.2 数据字典列表前端
        • 2.2.1 添加路由
        • 2.2.2 定义api
        • 2.2.2 方法调用
        • 2.2.3 表格渲染
    • 3、EasyExcel介绍
    • 4、数据字典导出
      • 4.1 导出接口封装
        • 4.1.2 在service-cmn模块添加service方法
        • 4.1.3 在service-cmn模块添加controller方法
        • 4.1.4 测试
      • 4.2 导出前端实现
        • 4.2.1 列表页面添加导出按钮
        • 4.2.2 添加导出方法
        • 4.2.1 测试
    • 5、数据字典导入
      • 5.1 导入接口封装
        • 5.1.1 创建回调监听器
        • 5.1.2 在service-cmn模块添加service方法
        • 5.1.3 在service-cmn模块添加controller方法
      • 5.2 导入前端实现
        • 5.2.1 列表页面添加导入按钮
        • 5.2.2 添加导入弹出层
        • 5.2.3 添加弹出可见模型
        • 5.2.4 添加方法

二、数据字典开发

1、搭建service-cmn模块

1.1 搭建service-cmn模块

搭建过程参考service-hosp模块

1.2 修改配置

修改pom.xml

<?xml version="1.0"encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.yygh</groupId>
<artifactId>service</artifactId>
<version>1.0</version>
</parent>

<version>1.0</version>
<artifactId>service-cmn</artifactId>
<packaging>jar</packaging>
<name>service-cmn</name>
<description>service-cmn</description>

<dependencies>
</dependencies>

<build>
<finalName>service-cmn</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

1、添加配置文件application.properties

# 服务端口
server.port=8202
# 服务名
spring.application.name=service-cmn

# 环境设置:dev、test、prod
spring.profiles.active=dev

# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.44.165:3306/yygh_cmn?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root123

#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

1.3 启动类

package com.atguigu.yygh;

@SpringBootApplication
public class ServiceCmnApplication {
public static void main(String[] args) {
      SpringApplication.run(ServiceCmnApplication.class, args);
   }
}

2、数据字典列表

根据element组件要求,返回列表数据必须包含hasChildren字典,如图:
https://element.eleme.cn/#/zh-CN/component/table
在这里插入图片描述

2.1 数据字典列表接口

2.1.1 model模块添加数据字典实体

在model模块查看实体:com.atguigu.yygh.model.cmn.Dict

@Data
@ApiModel(description = "数据字典")
@TableName("dict")
public class Dict extends BaseEntity {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "上级id")
    @TableField("parent_id")
    private Long parentId;

    @ApiModelProperty(value = "名称")
    @TableField("name")
    private String name;

    @ApiModelProperty(value = "值")
    @TableField("value")
    private String value;

    @ApiModelProperty(value = "编码")
    @TableField("dict_code")
    private String dictCode;

    @ApiModelProperty(value = "是否包含子节点")
    @TableField(exist = false)
    private boolean hasChildren;
}

说明:hasChildren为树形组件所需字典,标识为数据库表不存在该字段

2.1.2 添加数据字典mapper

1、添加com.atguigu.yygh.cmn.mapper.DictMapper

public interface DictMapper extends BaseMapper<Dict> {
}

2、添加com.atguigu.yygh.cmn.service.impl.DictServiceImpl接口实现

@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
    //根据数据id查询子数据列表
    @Override
    public List<Dict> findChlidData(Long id) {
        QueryWrapper<Dict> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id",id);
        List<Dict> dictList = baseMapper.selectList(wrapper);
        //向list集合每个dict对象中设置hasChildren
        for (Dict dict:dictList) {
            Long dictId = dict.getId();
            boolean isChild = this.isChildren(dictId);
            dict.setHasChildren(isChild);
        }
        return dictList;
    }
    //判断id下面是否有子节点
    private boolean isChildren(Long id) {
        QueryWrapper<Dict> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id",id);
        Integer count = baseMapper.selectCount(wrapper);
        // 0>0    1>0
        return count>0;
    }
}

2.1.4 添加数据字典controller

添加com.atguigu.yygh.cmn.controller.DictController

@Api(description = "数据字典接口")
@RestController
@RequestMapping("/admin/cmn/dict")
public class DictController {

    @Autowired
    private DictService dictService;

    //根据数据id查询子数据列表
    @ApiOperation(value = "根据数据id查询子数据列表")
    @GetMapping("findChildData/{id}")
    public Result findChildData(@PathVariable Long id) {
        List<Dict> list = dictService.findChlidData(id);
        return Result.ok(list);
    }
}

2.2 数据字典列表前端

2.2.1 添加路由

在 src/router/index.js 文件添加路由

  {
    path: '/cmn',
    component: Layout,
    redirect: '/cmn/list',
    name: '数据管理',
    alwaysShow: true,
    meta: { title: '数据管理', icon: 'example' },
    children: [
      {
        path: 'list',
        name: '数据字典',
        component: () => import('@/views/dict/list'),
        meta: { title: '数据字典', icon: 'table' }
      }
    ]
  },

说明:列表与查看都添加了

2.2.2 定义api

创建文件 src/api/cmn/dict.js

export default {
  dictList(id) {//数据字典列表
    return request ({
      url: `/admin/cmn/dict/findChildData/${id}`,
      method: 'get'
    })
  }
}

2.2.2 方法调用

<script>
import dict from '@/api/dict'
export default {
    data() {
        return {
            list:[] //数据字典列表数组
        }
    },
    created() {
        this.getDictList(1)
    },
    methods: {
        //数据字典列表
        getDictList(id) {
            dict.dictList(id)
                .then(response => {
                    this.list = response.data
                })
        },
        getChildrens(tree, treeNode, resolve) {
            dict.dictList(tree.id).then(response => {
                resolve(response.data)
            })
        }
    }
}
</script>

2.2.3 表格渲染

<template>
    <div class="app-container">
        <el-table
        :data="list"
        style="width: 100%"
        row-key="id"
        border
        lazy
        :load="getChildrens"
        :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
            <el-table-column label="名称" width="230" align="left">
            <template slot-scope="scope">
            <span>{{ scope.row.name }}</span>
            </template>
            </el-table-column>

            <el-table-column label="编码" width="220">
            <template slot-scope="{row}">
                    {{ row.dictCode }}
            </template>
            </el-table-column>
            <el-table-column label="" width="230" align="left">
            <template slot-scope="scope">
            <span>{{ scope.row.value }}</span>
            </template>
            </el-table-column>
            <el-table-column label="创建时间" align="center">
            <template slot-scope="scope">
            <span>{{ scope.row.createTime }}</span>
            </template>
            </el-table-column>
        </el-table>
    </div>
</template>

3、EasyExcel介绍

EasyExcel介绍

4、数据字典导出

4.1 导出接口封装

4.1.1 在model模块添加导出实体
在model模块查看实体:com.atguigu.yygh.vo.cmn.DictEeVo

package com.atguigu.yygh.vo.cmn;

@Data
public class DictEeVo {

@ExcelProperty(value = "id",index = 0)
private Long id;

@ExcelProperty(value = "上级id",index = 1)
private Long parentId;

@ExcelProperty(value = "名称",index = 2)
private String name;

@ExcelProperty(value = "值",index = 3)
private String value;

@ExcelProperty(value = "编码",index = 4)
private String dictCode;

}

4.1.2 在service-cmn模块添加service方法

1、在DictService类添加接口

/**
 * 导出
 * @param response
*/
void exportData(HttpServletResponse response);

2、在DictServiceImpl类添加接口实现类

@Override
public void exportData(HttpServletResponse response) {
try {
      response.setContentType("application/vnd.ms-excel");
      response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("数据字典", "UTF-8");
      response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");

      List<Dict> dictList = dictMapper.selectList(null);
      List<DictEeVo> dictVoList = new ArrayList<>(dictList.size());
for(Dict dict : dictList) {
         DictEeVo dictVo = new DictEeVo();
         BeanUtils.copyBean(dict, dictVo, DictEeVo.class);
         dictVoList.add(dictVo);
      }

      EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("数据字典").doWrite(dictVoList);
   } catch (IOException e) {
      e.printStackTrace();
   }
}

说明:直接复制示例代码中的“web中的写”,改造即可

4.1.3 在service-cmn模块添加controller方法

在DictController类添加方法

@ApiOperation(value="导出")
@GetMapping(value = "/exportData")
public void exportData(HttpServletResponse response) {
dictService.exportData(response);
}

4.1.4 测试

直接通过浏览器导出数据:http://localhost:8202/admin/cmn/dict/exportData

4.2 导出前端实现

4.2.1 列表页面添加导出按钮

src/views/cmn/dict/list.vue

<div class="el-toolbar">
<div class="el-toolbar-body"style="justify-content: flex-start;">
<el-button type="text"@click="exportData"><i class="fa fa-plus"/> 导出</el-button>
</div>
</div>

4.2.2 添加导出方法

exportData() {
window.location.href = 'http://localhost:8202/admin/cmn/dict/exportData'
}

4.2.1 测试

5、数据字典导入

5.1 导入接口封装

5.1.1 创建回调监听器

public class DictListener extends AnalysisEventListener<DictEeVo> {

    private DictMapper dictMapper;
    public DictListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }

    //一行一行读取
    @Override
    public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
        //调用方法添加数据库
        Dict dict = new Dict();
        BeanUtils.copyProperties(dictEeVo,dict);
        dictMapper.insert(dict);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

5.1.2 在service-cmn模块添加service方法

//导入数据字典
@Override
public void importDictData(MultipartFile file) {
    try {
        EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)).sheet().doRead();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

5.1.3 在service-cmn模块添加controller方法

在DictController类添加方法

@ApiOperation(value = "导入")
@PostMapping("importData")
public Result importData(MultipartFile file) {
 dictService.importData(file);
 return Result.ok();
}

5.2 导入前端实现

5.2.1 列表页面添加导入按钮

src/views/cmn/dict/list.vue

<el-button type="text"@click="importData"><i class="fa fa-plus"/> 导入</el-button>

说明:按钮位置与导出并列

5.2.2 添加导入弹出层

<el-dialog title="导入":visible.sync="dialogImportVisible"width="480px">
<el-form label-position="right"label-width="170px">

<el-form-item label="文件">
<el-upload
:multiple="false"
:on-success="onUploadSuccess"
:action="'http://localhost:8202/admin/cmn/dict/importData'"
class="upload-demo">
<el-button size="small"type="primary">点击上传</el-button>
<div slot="tip"class="el-upload__tip">只能上传xls文件,且不超过500kb</div>
</el-upload>
</el-form-item>

</el-form>
<div slot="footer"class="dialog-footer">
<el-button @click="dialogImportVisible = false">
      取消
</el-button>
</div>
</el-dialog>

5.2.3 添加弹出可见模型

// 定义数据
data() {
return {
list: [],
listLoading: true,
dialogImportVisible: false
}
}

5.2.4 添加方法

importData() {
this.dialogImportVisible = true
},

onUploadSuccess(response, file) {
this.$message.info('上传成功')
this.dialogImportVisible = false
  this.fetchData()
}

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

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

相关文章

centos 8 安装nacos2.0.3

去官网下载软件包 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 上传到服务器指定位置&#xff0c;并解压 修改nacos存储为数据库 vi /xxx/nacos/conf/application.properties ## 在最后添加以下内容 spring.datasource.platformmysql db.num1 db.url.0j…

chatgpt赋能Python-pythonend

Pythonend – 一站式 Python SEO 工具 Pythonend 是一款基于 Python 的 SEO 工具&#xff0c;它为企业和个人提供了一站式的 SEO 解决方案。无论您是想要提高网站排名、监测关键词排名、分析竞争对手或进行网站优化&#xff0c;Pythonend 都可以帮助您解决这些问题。 Pythone…

【Linux】——进程信号

目录 信号入门 生活的角度 技术应用的角度 信号列表 信号处理常见方式概览 信号产生 通过终端按键产生信号 核心转储 调用系统函数向进程发信号 由软件条件产生信号 SIGPIPE信号 SIGALRM信号 硬件异常产生信号 阻塞信号 信号其他相关常见概念 内核中…

软件测试:测试用例

一、通用测试用例八要素  1、用例编号&#xff1b;   2、测试项目&#xff1b;   3、测试标题&#xff1b;   4、重要级别&#xff1b;   5、预置条件&#xff1b;   6、测试输入&#xff1b;   7、操作步骤&#xff1b;   8、预期输出 二、具体分析通用测试用…

红帽6.5进入单用户重置root密码

前言 ​一、重启Linux系统 二、按 “e” 键进入该界面 三、上下键选中第二个kernel选项&#xff0c;继续按 “e” 键进行编辑。 五、根据提示按下按键“b”&#xff0c;进入单用户模式引导 六、进入到单用户模式&#xff0c;修改密码 七、重启系统 八、进行登录 前言 大…

图片转excel表格,人工处理与OCR方案的优劣对比

随着信息化进程的发展&#xff0c;我们常常需要将图片文件中的表格信息转换成Excel表格文件&#xff0c;并进行后续数据处理和分析。对于这一需求&#xff0c;常用的解决方案有人工录入和OCR识别两种方式。本文将对这两种方案进行比较&#xff0c;评估其优劣。 一、人工做表并…

二、MongoDB入门

文章目录 一、MongoDB入门1、常用操作1.1 INSERT1.2 Query1.3 Update1.4 Remove1.5 aggregate1.5.1 插入数据1.5.2 统计sum1.5.3 常见的聚合表达式 1.6 索引 一、MongoDB入门 1、常用操作 1.1 INSERT > db.User.save({name:zhangsan,age:21,sex:true}) > db.User.find…

linux(inode)学习

目录&#xff1a; 1.认识磁盘结构 2.没有被打开的文件在磁盘里是怎么保存的 ------------------------------------------------------------------------------------------------------------------------------ 如果一个文件没有被打开&#xff0c;这个文件在哪里呢&#…

卡方检验.医学统计实例详解

卡方检验是一种常用的假设检验方法&#xff0c;通常用于分析两个或多个分类变量之间的关系。在医学研究中&#xff0c;卡方检验被广泛应用于分析两种或多种治疗方法的疗效&#xff0c;或者分析某种疾病的发病率与某些危险因素之间的关系。下面我们来看一个卡方检验在医学实例中…

虚幻商城模型转MetaHuman

一、导入虚幻商城的模型到UE 1.去虚幻商城下载一个人物模型,这里以SchoolGirl为例 2.导入UE,并找到模型,这里是SkeletalMesh 二、启动MetaHuman插件 1.通过Edit->Plugins启用MetaHuman和MetaHumanSDK插件,这里MetaHuman插件是用于创建MetaHuman的,MetaHumanSDK插件…

基于高效率IP路由查找的内容

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 实现最基本的前缀树查找,调研并实现某种IP前缀查找方案,- 基于forwarding-table.txt数据集(Network, Prefix Length, Port) - 本实验只考虑静态数据集&#xff0c;不考虑表的添加或更新- 以前缀树查找结果为基准&#xff0c;检…

代码随想录算法训练营day46 | 139.单词拆分 ,多重背包,背包问题总结篇!

代码随想录算法训练营day46 | 139.单词拆分 &#xff0c;多重背包&#xff0c;背包问题总结篇&#xff01; 139.单词拆分解法一&#xff1a;动态规划&#xff08;不好想&#xff09;解法二&#xff1a;回溯记忆化 多重背包解法一&#xff1a;转化为01背包 背包问题总结递推公式…

软考中级数据库系统工程师-第6-7章 数据库技术基础关系数据库

1.数据库系统基本概念 1&#xff09;数据库系统(DBS)是一个采用了数据库技术&#xff0c;有组织地、动态地存储大量相关联数据&#xff0c;方便多用户访问的计算机系统。广义上来讲&#xff0c;DBS是由数据库、硬件、软件和人员组成。 2&#xff09;数据库(DB)&#xff1a;数…

centos 8 安装 jdk8

去官网下载RPM软件包 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8 上传到服务器指定路径&#xff0c;进行安装 rpm -ivh jdk-8u371-linux-x64.rpm 配置JAVA_HOME环境变量 查找jdk安装路径 java -verbose修改系统环境变量文件 vi /e…

软件工程还是网络安全专业好

这个问题需要根据个人的兴趣和职业规划来选择。 从兴趣方面来看&#xff0c;如果你对计算机系统的设计和开发更感兴趣&#xff0c;那么选择软件工程专业可能更适合你。如果你对计算机系统的安全性更感兴趣&#xff0c;那么选择网络安全专业可能更适合你。 从职业规划方面来看…

Kyligence 连续入选 Gartner 揭秘服务自助式分析的语义层报告

近日&#xff0c;全球权威的技术研究与咨询公司 Gartner 发布了《揭秘服务自助式分析的语义层》(Demystifying Semantic Layers for Self-Service Analytics) 研究报告。Kyligence 是国内唯一连续入选此报告的厂商&#xff0c;此前曾入选 Gartner 指标平台创新洞察报告、数据管…

Gitlab----Gitlab-runner简介

【原文链接】Gitlab----Gitlab-runner简介 gitlab-runner是用于执行GitlabCI/CD任务的工具&#xff0c;通俗点来说它就是用来执行gitlab上的CI/CD任务的机器&#xff0c;当然这里的机器是广义上的&#xff0c;它可以是物理机、虚拟机、Docker甚至是Kubernetes。 GitLab Runne…

分布式实战教程13:ruoyi-vue-pro开发指南

文章目录 前言一、入门必读1、简介2、项目地址3、技术选型&#xff08;1&#xff09;技术架构图&#xff08;2&#xff09;后端&#xff08;3&#xff09;前端 4、功能列表5、内置功能6、快速启动&#xff08;1&#xff09;克隆代码&#xff08;2&#xff09;Apifox 接口工具&a…

chatgpt赋能Python-pythondic

Python Dict - Python中最有用的数据结构之一 当谈到Python的数据结构时&#xff0c;Python字典&#xff08;Python Dict&#xff09;是最常用和最有用的数据结构之一。Python字典是一个非常强大且多才多艺的数据结构&#xff0c;它不仅易于学习和使用&#xff0c;而且可以大大…

chatgpt赋能Python-pythonforin

Python for-in循环及其应用 作为一门通用编程语言&#xff0c;Python具备众多操作的能力。在Python中&#xff0c;for-in循环是最常用的循环语句之一。它对于遍历列表&#xff0c;元组&#xff0c;字典或集合等结构非常有用。在本文中&#xff0c;我们将探讨Python for-in循环…