栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

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

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

文章目录

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.DictService
public interface DictService extends IService {
    //根据数据id查询子数据列表
    List findChlidData(Long id);
}

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

@Service
public 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")1
public 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;

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

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

1、在DictService类添加接口

void exportData(HttpServletResponse response);
3.3.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 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方法
//导入数据字典

@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();
}
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")
@Override
public 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)
@Override
public void importData(MultipartFile file) {
   ExcelHelper fileHelper = new ExcelHelper(DictEeVo.class);
   List dictVoList = fileHelper.importExcel(file);
if(!CollectionUtils.isEmpty(dictVoList)) {
dictMapper.insertBatch(dictVoList);
   }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/729266.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号