尚医通06:数据字典+EasyExcel+mongodb

内容介绍

1、数据字典列表前端

2、EasyExcel介绍、实例

3、数据字典导出接口、前端

4、数据字典导入接口、前端

5、数据字典添加redis缓存

6、MongoDB简介

7、MongoDB安装

8、MongoDB基本概念

数据字典列表前端

1、测试问题

1)报错日志

2)问题定位

URL错误

3)解决问题

2nginx

1)基本功能

反向代理、负载均衡、动静分离

2)安装

解压即可使用

3)启动

4)修改配置

server {

    listen 9001;

    server_name localhost;

    location ~/hosp/ {          

        proxy_pass http://localhost:8201;

    }

    location ~/cmn/ {          

        proxy_pass http://localhost:8202;

    }

}

重启服务或重新加载(nginx.exe -s reload)才可生效

5)测试访问后端接口

http://localhost:9001/admin/hosp/hospitalSet/findAll

6)改造前端

重启生效

EasyExcel介绍、实例

1、是什么

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。

2、为什么

没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

3、准备工作

1cmn导入依赖

<dependencies>

    <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->

    <dependency>

        <groupId>com.alibaba</groupId>

        <artifactId>easyexcel</artifactId>

        <version>2.1.1</version>

    </dependency>

  </dependencies>

2)创建目录、创建实体

@Data

  public class Stu {

    //设置表头名称

    @ExcelProperty("学生编号")

    private int sno;

    //设置表头名称

    @ExcelProperty("学生姓名")

    private String sname;

  }

4、实现写操作

public class WriterTest {

    public static void main(String[] args) {

        String fileName = "D:\\test\\230308\\a.xlsx";

        EasyExcel.write(fileName,Stu.class)

                .sheet("学员信息").doWrite(data());

    }

  

    //循环设置要添加的数据,最终封装到list集合中

    private static List<Stu> data() {

        List<Stu> list = new ArrayList<Stu>();

        for (int i = 0; i < 10; i++) {

            Stu data = new Stu();

            data.setSno(i);

            data.setSname("张三"+i);

            list.add(data);

        }

        return list;

    }

  }

5、实现读操作

1)改造实体

@Data

  public class Stu {

    //设置表头名称

    @ExcelProperty(value = "学生编号",index = 0)

    private int sno;

    //设置表头名称

    @ExcelProperty(value = "学生姓名",index = 1)

    private String sname;

  }

2)创建监听器

public class ExcelListener extends AnalysisEventListener<Stu> {

    @Override

    public void invoke(Stu stu, AnalysisContext analysisContext) {

        //可以实现调用接口,数据入库

        System.out.println("stu = " + stu);

    }

  

    //读取excel表头信息

    @Override

    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {

        System.out.println("表头信息:"+headMap);

    }

  

    @Override

    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

  

    }

  }

3)读数据实例

public class ReadTest {

    public static void main(String[] args) {

        String fileName = "D:\\test\\230308\\a.xlsx";

        EasyExcel.read(fileName,Stu.class,new ExcelListener()).sheet().doRead();

    }

  }

数据字典导出、前端

1、准备工作

1)确认依赖

2)确认对象

2、实现导出接口

1)分析接口

*参数:response

*返回值:无

2)实现controller

@ApiOperation(value="导出")

  @GetMapping(value = "/exportData")

  public void exportData(HttpServletResponse response) {

    dictService.exportData(response);

  }

3)实现service

//导出

  @Override

  public void exportData(HttpServletResponse response) {

    try {

        //1设置response参数

        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");

        //2查询数据字典表数据List<Dict>

        List<Dict> dictList = baseMapper.selectList(null);

        //3遍历集合List<Dict>转型List<DictEeVo>

        List<DictEeVo> dictEeVoList = new ArrayList<>();

        for (Dict dict : dictList) {

            DictEeVo dictEeVo = new DictEeVo();

            BeanUtils.copyProperties(dict,dictEeVo);

            dictEeVoList.add(dictEeVo);

        }

        //4调用工具方法导出数据

        ServletOutputStream outputStream = response.getOutputStream();

        EasyExcel.write(outputStream,DictEeVo.class)

                .sheet("数据字典").doWrite(dictEeVoList);

  

    } catch (IOException e) {

        throw new YyghException(20001,"导出失败");

    }

  

  }

3、对接前端

1)添加页面元素

<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>

(2)实现js方法

//导出数据

    exportData(){

        window.open(`${process.env.VUE_APP_BASE_API}admin/cmn/dict/exportData`)

    }

3)测试

数据字典导入、前端

1数据字典导入接口

1)分析接口

*参数:file

*返回值:R.ok()

2)实现controller

@ApiOperation(value = "导入")

  @PostMapping("importData")

  public R importData(MultipartFile file) {

    dictService.importData(file);

    return R.ok();

  }

3)创建监听器

@Component

  public class DictListener  extends AnalysisEventListener<DictEeVo> {

    

    @Autowired

    private DictMapper dictMapper;

    

    //手动注入,使用有参构造

    //private DictMapper dictMapper;

    

    @Override

    public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {

        //1转化数据类型DictEeVo=Dict

        Dict dict = new Dict();

        BeanUtils.copyProperties(dictEeVo,dict);

        //2补充数据

        dict.setIsDeleted(0);

        //3数据入库

        dictMapper.insert(dict);

    }

  

    @Override

    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

  

    }

  }

4实现service

@Autowired

  private DictListener dictListener;

//导入

  @Override

  public void importData(MultipartFile file) {

    try {

        InputStream inputStream = file.getInputStream();

        EasyExcel.read(inputStream,DictEeVo.class,dictListener).sheet().doRead();

    } catch (IOException e) {

        throw new YyghException(20001,"导入失败");

    }

  }

5)测试

2、对接前端

1)分析需求

2)查看组件

3)添加页面元素

<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>

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

      </div>

    </div>

<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="BASE_URL+'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>

4)实现js

*属性

data() {

    return {

      list: [],

      dialogImportVisible: false, //对话框是否显示

      BASE_URL: process.env.VUE_APP_BASE_API //基础访问地址

    };

  },

……

*方法

//打开导入窗口

    importData() {

      this.dialogImportVisible = true;

    },

    //导入成功方法

    onUploadSuccess(response, file) {

      this.$message.success("上传成功");

      this.dialogImportVisible = false;

      this.getData();

    }

数据字典添加redis缓存

1redis回顾

2、准备工作

1)虚拟机

2)安装redis

3)检查配置

4)启动redis

3redis缓存访问机制

4、整合redis

1common_utils模块,添加redis依赖

<dependencies>

    <!-- redis -->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-redis</artifactId>

    </dependency>

  

    <!-- spring2.X集成redis所需common-pool2-->

    <dependency>

        <groupId>org.apache.commons</groupId>

        <artifactId>commons-pool2</artifactId>

        <version>2.6.0</version>

    </dependency>

  </dependencies>

2common_utils模块,添加Redis配置类

@Configuration

@EnableCaching

  public class RedisConfig {

    /**

     * 设置RedisTemplate规则

     * @param redisConnectionFactory

     * @return

     */

    @Bean

    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

  

  //解决查询缓存转换异常的问题

        ObjectMapper om = new ObjectMapper();

  // 指定要序列化的域,field,getset,以及修饰符范围,ANY是都有包括privatepublic

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

  // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

  

  //序列号key value

        redisTemplate.setKeySerializer(new StringRedisSerializer());

        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

  

        redisTemplate.afterPropertiesSet();

        return redisTemplate;

    }

  

    /**

     * 设置CacheManager缓存规则

     * @param factory

     * @return

     */

    @Bean

    public CacheManager cacheManager(RedisConnectionFactory factory) {

        RedisSerializer<String> redisSerializer = new StringRedisSerializer();

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

  

  //解决查询缓存转换异常的问题

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

  

  // 配置序列化(解决乱码的问题),过期时间600

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()

                .entryTtl(Duration.ofSeconds(600))

                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))

                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))

                .disableCachingNullValues();

  

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)

                .cacheDefaults(config)

                .build();

        return cacheManager;

    }

  

  }

3)在service_cmn模块添加redis配置

spring.redis.host=192.168.140.138

  spring.redis.port=6379

  spring.redis.database= 0

  spring.redis.timeout=1800000

  

  spring.redis.lettuce.pool.max-active=20

  spring.redis.lettuce.pool.max-wait=-1

  #最大阻塞等待时间(负数表示没限制)

  spring.redis.lettuce.pool.max-idle=5

  spring.redis.lettuce.pool.min-idle=0
 

(4)查询方法添加注解

@Override

  // redis k:v   k=dict::selectIndexList  v=List<Dict>

  @Cacheable(value = "dict", key = "'selectIndexList'")

  public List<Dict> findChildData(Long id) {

    //1拼写查询条件

    LambdaQueryWrapper<Dict> wrapper = new LambdaQueryWrapper<>();

    wrapper.eq(Dict::getParentId,id);

    //2查询子数据集合

    List<Dict> dictList = baseMapper.selectList(wrapper);

    //3遍历集合,确认是否有子数据

    for (Dict dict : dictList) {

        boolean isChildren = this.isChildren(dict);

        dict.setHasChildren(isChildren);

    }

    return dictList;

  }

5、问题解决

1)问题描述

*一级数据可以走缓存

*二级数据加载不出来

2)问题定位

*二级数据查询需要查询数据库

*二级数据没有查询数据库,查询缓存获取一级数据

3)解决方案

让多次查询redis缓存的key不一样

//根据数据id查询子数据列表

  @Override

  // redis k:v   k=dict::selectIndexList  v=List<Dict>

  @Cacheable(value = "dict", key = "'selectIndexList'+#id")

  public List<Dict> findChildData(Long id) {

    //1拼写查询条件

    LambdaQueryWrapper<Dict> wrapper = new LambdaQueryWrapper<>();

    wrapper.eq(Dict::getParentId,id);

    //2查询子数据集合

    List<Dict> dictList = baseMapper.selectList(wrapper);

    //3遍历集合,确认是否有子数据

    for (Dict dict : dictList) {

        boolean isChildren = this.isChildren(dict);

        dict.setHasChildren(isChildren);

    }

    return dictList;

  }

4redis缓存写操作同步机制

MongoDB简介

1 NoSQL概述

2MongoDB是什么

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

MongoDB 是文档型NOSQL数据库

MongoDB安装

1、安装

1)确认docker服务

2)下载

docker pull mongo:latest

docker pull mongo:4.4.8

3)创建和启动容器

docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo:4.4.8

(4)进入容器

docker exec -it mymongo /bin/bash

5)进入mongo

mongo

新版本:mongosh

MongoDB概念介绍

1、与mysql对比

2、数据库(文件柜)

1Help查看命令提示

db.help();

2use test

如果数据库不存在,则创建数据库,否则切换到指定数据库

3 查询所有数据库

show dbs;

4)删除当前使用数据库

db.dropDatabase();

5)查看当前使用的数据库

db.getName();

6)显示当前db状态

db.stats();

7)当前db版本

db.version();

8 查看当前db的链接机器地址

db.getMongo();

3、集合(抽屉)

1、 创建一个集合(table)

db.createCollection( "user");

2、 得到指定名称的集合(table )

db.getCollection("user");

4、文档

文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别

1)数据类型

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

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

相关文章

升讯威在线客服系统是如何实现对 IE8 完全完美支持的(怎样从 WebSocket 降级到 Http)【干货】

简介 升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件&#xff0c;宗旨是&#xff1a; 开放、开源、共享。努力打造 .net 社区的一款优秀开源产品。 完整私有化包下载地址 &#x1f4be; https://kf.shengxunwei.com/freesite.zip 当前版本信息 发布…

QTDAY3

闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器事件处理函数 #include <QTime> //时间类 #include <QString> #include <QPushButton> #include <QTextToSpeech> #include …

【嵌入式学习笔记】嵌入式基础9——STM32启动过程

1.MAP文件浅析 1.1.MDK编译后生成的中间过程文件 1.2.Map文件构成&#xff1a; 程序段交叉引用关系&#xff08;Section Cross References&#xff09;&#xff1a;描述各文件之间函数调用关系删除映像未使用的程序段&#xff08;Removing Unused input sections from the im…

【驱动开发day4作业】

头文件代码 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #…

使用Wps减小PDF文件的大小

第一步、打开左上角的文件 第二步、点击打印选项 第三步、点击打印按钮

[数据库]对数据库事务进行总结

文章目录 1、什么是事务2、事务的特性&#xff08;ACID&#xff09;3、并发事务带来的问题4、四个隔离级别&#xff1a; 1、什么是事务 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红…

基于Fringe-Projection环形投影技术的人脸三维形状提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................................... figure; imshow(Im…

用windeployqt.exe打包Qt代码

首先找到我们编译Qt代码的对应Qt版本的dll目录&#xff0c;该目录下有windeployqt.exe&#xff1a; D:\DevTools\Qt\5.9\msvc2017_64\bin 在这个目录下打开cmd程序。 然后把要打包的exe放到一个单独的目录下&#xff0c;比如&#xff1a; 然后在cmd中调用&#xff1a; winde…

Qt : day4

1.思维导图 2.服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this);}Widget::~Widget() {delete ui;…

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型 版本更新&#xff1a; 2023/7/29版本&#xff1a; 1.增加自定义参数&#xff0c;方便直接套数据运行。 pre_num3;%预采样数据个数 learn_pr0.85; %训练数据比例&#xff08;不包括预采样数…

使用 ChatGPT 进行研究的先进技术

在这篇文章中&#xff0c;您将探索改进您研究的先进技术。尤其&#xff0c; 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…

边缘计算对现代交通的重要作用

边缘计算之所以重要&#xff0c;是在于即使在5G真正商用之时&#xff0c;可以实现超大带宽&#xff08;eMBB&#xff09;的应用场景&#xff0c;但庞大数据量的涌现也就意味着需要在云和端传输过程中找到一个承接点&#xff0c;对数据进行预处理再选择是否上云。 边缘计算应用演…

源码学习初章-基础知识储备

文章目录 学前准备源码地址引言extern "C" 宏定义平台宏跨平台宏vstdio平台禁用警告宏 连接、双层宏定义函数宏系统函数宏自定义函数宏多语句执行宏do while0 普通宏定义 C的一些必备函数知识回调函数和函数指针回调函数wireshark-4.0.7源码例子函数指针wireshark4.0…

kafka集群搭建(Linux环境)

zookeeper搭建&#xff0c;可以搭建集群&#xff0c;也可以单机&#xff08;本地学习&#xff0c;没必要搭建zookeeper集群&#xff0c;单机完全够用了&#xff0c;主要学习的是kafka&#xff09; 1. 首先官网下载zookeeper&#xff1a;Apache ZooKeeper 2. 下载好之后上传到…

自动化测试框架unittest与pytest的区别!

引言 前面文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别&…

Grafana - TDEngine搭建数据监测报警系统

TDengine 与开源数据可视化系统 Grafana 快速集成搭建数据监测报警系统 一、介绍二、前置条件三、Grafana 安装及配置3.1 下载3.2 安装3.2.1 windows安装 - 图形界面3.2.2 linux安装 - 安装脚本 四、Grafana的TDEngine配置及使用4.1 登录4.2 安装 Grafana Plugin 并配置数据源4…

流数据湖平台Apache Paimon(一)概述

文章目录 第1章 概述1.1 简介1.2 核心特性1.3 基本概念1.3.1 Snapshot1.3.2 Partition1.3.3 Bucket1.3.4 Consistency Guarantees一致性保证 1.4 文件布局1.4.1 Snapshot Files1.4.2 Manifest Files1.4.3 Data Files1.4.4 LSM Trees 第1章 概述 1.1 简介 Flink 社区希望能够将…

10.python设计模式【代理模式】

内容&#xff1a;为其他对象提供一种代理一控制对这个对象的访问 应用场景&#xff1a; 远程代理&#xff1a; 为远程的对象提供代理虚代理&#xff1a;根据需要创建很大的对象保护代理&#xff1a;控制对原始对象的访问&#xff0c;用于对象有不同访问权限时 UML图 举个例…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案&#xff0c;线上线下统一管理&#xff0c;打造私域流量&#xff0c;微信、门店会员全渠道管理&#xff0c;打通私域流量池&#xff0c;实现裂变营销&#xff1a; 开启新零售之路&#xff0c;必然要摒弃原有的管理模式&#xff0c;大…