网盘进化史就这样(下)——功能实现
上回说到网盘的思路简单设计以及和升级迭代的过程
详细内容请回顾https://blog.51cto.com/yerikyu/2361380
本文主要是介绍,如何通过jHipster快速搭建网络云盘服务。
我们使用jHipster构建一个web服务是一件简单便捷的事情,启动起来也很舒服的,如下图所示,通过命令jhipster就可以启动该框架为我们提供创建项目的功能
之后是进行项目名称的设置,还有包名,认证方式等配置设置。不懂的话,建议一直回车选择默认配置,之后在数据库选型这一栏,由于项目需要,这里我们选择mongodb。
之后我们还需要选择启动仓库,笔者习惯使用gradle
其他的按照默认配置就行啦,之后还是一样的 ,一路回车暴击,等待项目创建完成,你们会观察到创建项目中,不断的新建文件以及相关依赖的进度条,等待创建完成。
这样就形成了我们的构建的web服务了,服务可以启动了,然而毕竟是通过框架搭建起来的web服务还是比较简单的,我们需要再进行个性化开发。在图中我们可以看到一个清晰的后端服务框架
因为我们在创建项目的过程中,已经明确说明需要用到mangodb,因此,框架已经为我们提供了mangodb数据库的docker-compose文件,我们可以直接使用的,不过此时docker container的数据是不会保存的,如果我们重启docker服务,将会导致数据丢失,因此我们需要为该容器挂载一个持久化卷,修改下docker-compose文件即可,设置镜像自动重启
version: '2'services: utils-mongodb: image: mongo:4.0.2 ports: - "27017:27017" volumes: - ~/volumes/jhipster/utils/mongodb/:/data/db/ restart: always准备工作完成之后,我们接下来是开始网盘功能的简单开发了,在jHipster中,对象之间的关系可以通过JDLJHipster Domain Language来表达,其表达方式比较简单,这个就是一个简单的网盘逻辑关系设计
entity UploadFile { uploadTime String}entity DownloadFile { name String downloadTime String count Instant}relationship OneToOne { UploadFile{name} to DownloadFile}// Set pagination optionspaginate * with infinite-scrollpaginate * with paginationdto * with mapstruct// Set service options to all except fewservice all with serviceImpl// Set an angular suffixangularSuffix * with smallestpan设计完成之后使用命令jHipster import-jdl ./jdl/p1.jdl 对该文件进行编译,执行,至于具体原理本文不作深入分析,下次有机会再说:)
执行之后是需要生成数据库mapper层来完成对数据的自动写入读出功能./gradew build
生成结果如下
接下来是对service进行开发,基于前面jdl自动生成的DTO、impl等文件,我们需要的就是对接口进行调通,不妨开发一个接口类,实现上传和下载,网盘不就是这样嘛,一个远端的存储设备,提供上传和下载功能嘛
@Servicepublic class FileServiceImpl implements FileService { @Override public Object upload(Object object) { return null; } @Override public Object download(Object object) { return null; }}这里我们主要使用spring-cloud框架中的Grid这个组件,实现ORM的功能,完成对mongodb数据库的写入写出,提高我们的开发效率,不过这样做从一定程度上降低代码的运行效率,这个优化思路并不是本文介绍内容
@Servicepublic class GridfsService { @Autowired private MongoDbFactory mongodbfactory; /** * 插入文件 * @param file * @return */ public GridFSInputFile save(MultipartFile file){ GridFS gridFS = new GridFS(mongodbfactory.getLegacyDb()); try{ InputStream in = file.getInputStream(); String name = file.getOriginalFilename(); GridFSInputFile gridFSInputFile = gridFS.createFile(in); gridFSInputFile.setFilename(name); gridFSInputFile.setContentType(file.getContentType()); gridFSInputFile.save(); return gridFSInputFile; } catch (Exception e){} return null; } /** * 据id返回文件 */ public GridFSDBFile getById(ObjectId id){ DBObject query = new BasicDBObject("_id", id); GridFS gridFS = new GridFS(mongodbfactory.getLegacyDb()); GridFSDBFile gridFSDBFile = gridFS.findOne(query); return gridFSDBFile; } /** * 删除 * @param id */ public void remove(String id) { GridFS gridFS = new GridFS(mongodbfactory.getLegacyDb()); gridFS.remove(new ObjectId(id)); } public void setMongodbfactory(MongoDbFactory mongodbfactory) { this.mongodbfactory = mongodbfactory; }}好了,开发至此,代码就已然开发完毕了,可以正式启用这个超简洁的小小盘,至于说接口格式,网络请求路径等这些,jHipster都已经为你自动生成好了,就在web.rest里面,各位看官不妨阅读下源码,倒是简洁易懂呢,由于这个只是后台页面,所以可以通过postman这样的调试工具对这个功能进行测试即可,后面有机会在来介绍该页面的前端开发
使用jHipster这样的框架辅助我们开发给我们减少了很多工作量,妥妥提升我们开发的幸福感:)
代码仅供参考,不妨来个star:https://github.com/Yerikshu/smallestpan
谢啦~~
文章参考:
jHipster官方网站:https://www.jhipster.tech
Grid介绍:https://www.baeldung.com/spring-data-mongodb-gridfs