欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

商易通项目总结(三)(一款包含Spring+SpringBoot+SpringCloud+Mysql+Mybatis-plus+RabbitMq+Redis的医院挂号系统)

时间:2023-07-23
文章目录

1.数据字典介绍2.搭建

2.1model模块添加数据字典实体2.2添加数据字典mapper2.3添加数据字典service2.4 添加数据字典controller 3.数据导入和导出

3.1EasyExcell介绍3.2EasyExcell集成3.2.1添加依赖3.3数据字典导出3.3.1 在service-cmn模块添加service方法3.3.2 在DictServiceImpl类添加接口实现类3.3.3 在service-cmn模块添加controller方法3.4数据字典导入 4.Spring Cache+Redis 1.数据字典介绍

首先,我们现在要做的就是一个数据字典,什么是数据字典呢,我们来看看就知道了

在数据里面,这是一个神奇的东西,也可以作为一个难点出现,那就是在这个过程当中,数据肯定不只是有医院等级这个东西吧,还有种族、学历,所以我们需要设置对应的总parent_id来代表其种类,在这里面,我们还需要做的就是设置一个对应的id,来代表他们的医院等级、以及种族类别这些。

2.搭建

首先也是一样,在group中引入这个对应的微服务,然后在里面建立对应的mapper,还有就是对应的service,以及对应的controller这些东西在里面,就是这样的一个思路在里面

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

@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;}

2.2添加数据字典mapper

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

public interface DictMapper extends baseMapper {}

2.3添加数据字典service

//1、添加com.atguigu.yygh.cmn.service.DictServicepublic interface DictService extends IService { //根据数据id查询子数据列表 List findChlidData(Long id);}

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

@Servicepublic class DictServiceImpl extends ServiceImpl implements DictService { //根据数据id查询子数据列表 @Override public List findChlidData(Long id) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("parent_id",id); List 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 wrapper = new QueryWrapper<>(); wrapper.eq("parent_id",id); Integer count = baseMapper.selectCount(wrapper); // 0>0 1>0 return count>0; }}

这样的一个过程当中,因为是还要进行判断是否有子节点,那么这个时候就是判断对应的eq(“parent_id",id)。

2.4 添加数据字典controller

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

@Api(description = "数据字典接口")@RestController@RequestMapping("/admin/cmn/dict")1public class DictController { @Autowired private DictService dictService; //根据数据id查询子数据列表 @ApiOperation(value = "根据数据id查询子数据列表") @GetMapping("findChildData/{id}") public Result findChildData(@PathVariable Long id) { List list = dictService.findChlidData(id); return Result.ok(list); }}

3.数据导入和导出 3.1EasyExcell介绍

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

3.2EasyExcell集成 3.2.1添加依赖

com.alibaba easyexcel 2.1.1

3.3数据字典导出

在model模块添加导出实体

package com.atguigu.yygh.vo.cmn;@Datapublic 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;}

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

1、在DictService类添加接口

void exportData(HttpServletResponse response);

3.3.2 在DictServiceImpl类添加接口实现类

@Overridepublic 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 dictList = dictMapper.selectList(null); List 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中的写”,改造即可

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

在DictController类添加方法

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

3.4数据字典导入

5.1.1 创建回调监听器

public class DictListener extends AnalysisEventListener { 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方法
//导入数据字典

@Overridepublic 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();}

4.Spring Cache+Redis

2、使用Spring Cache
2.1 常用缓存标签
2.1.2 缓存@Cacheable
根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
2.1.2 缓存@CachePut
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
2.1.3 缓存@CacheEvict
使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
allEntries 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存
beforeInvocation 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存

2.2 数据字典应用
改造com.atguigu.yygh.cmn.service.impl.DictServiceImpl类方法

@Cacheable(value = "dict",keyGenerator = "keyGenerator")@Overridepublic List findByParentId(Long parentId) { List dictList = dictMapper.selectList(new QueryWrapper().eq("parent_id", parentId)); dictList.stream().forEach(dict -> {boolean isHasChildren = this.isHasChildren(dict.getId()); dict.setHasChildren(isHasChildren); });return dictList;}@CacheEvict(value = "dict", allEntries=true)@Overridepublic void importData(MultipartFile file) { ExcelHelper fileHelper = new ExcelHelper(DictEeVo.class); List dictVoList = fileHelper.importExcel(file);if(!CollectionUtils.isEmpty(dictVoList)) {dictMapper.insertBatch(dictVoList); }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。