1. 引言
日常生活中普遍存在的存储设备有光盘、U盘、移动硬盘、网盘等等。利用存储,我们可以将重要的资料、文件、生活中的照片、电影视频等保存起来。但是由于大多数用户对于先进、新型的存储设备和存储方式缺乏足够的了解,仍然习惯使用光盘、U盘和移动硬盘等相对传统的存储方式,部分用户甚至直接将数据存储在电脑和手机里 [1] [2] 。将数据存储在实物物体之内对于数据的安全性与管理有着诸多不便,如实物物体存储大小固定、丢失带来的数据丢失的问题,甚至会有数据泄露的安全问题,且实物物体无法做到数据跨平台、异地管理 [3] [4] 。同时,网盘存储需要首先下载与之对应的应用程序,还有网速限制、存储空间限制或者存在会员收费等问题。微信小程序作为软件开发的后起之秀,其最为突出的好处之一就是即用即走,这也是微信小程序设计之初主打的概念。微信是人们日常使用最频繁的工具之一,微信小程序内嵌于微信中,借助微信使用导向,吸引流量,符合大众应用软件惯性。不同于APP,小程序不在手机界面占据单独空间,且查找方便,不用下载和等待下载,简化使用流程 [5] [6] [7] [8] [9] 。因此,为了方便数据的存储、管理,本文通过设计开发出一款基于云存储技术,使用简单易于操作的NAS微信小程序,解决实物存储、网盘存储带来的诸多不便。
2. 相关技术介绍
2.1. 开发与测试环境
为了实现小程序的快速开发、更新迭代、测试,该项目采用前后端分离的开发方式模式。
前端开发运用微信小程序官方提供的微信开发者工具,后端开发使用JetBrains公司的产品IntelliJ IDEA开发集成环境。移动端测试,分别对于现主流的移动端安卓、iOS、和鸿蒙三个不同的系统进行项目测试。开发与测试环境见表1。
2.2. NAS
NAS (Network Attached Storage,网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者 [4] 。

Table 1. Development and test environment
表1. 开发与测试环境
2.3. SpringBoot
SpringBoot是由Pivotal团队提供的全新开源轻量级的框架系统,后端采用SpringBoot框架,SpringBoot的一大优点是能快速创建项目、减少配置文件的配置并与其他框架完美地集成,SpringBoot内嵌Servlet、Tomcat、Jetty等。SpringBoot可直接运用java-jar指令对项目打包为jar,同时进行自动依赖与版本控制,帮助开发者导入所用到的全部依赖,并自动控制版本,文中所有的配置都由SpringBoot完成,提高了开发效率 [10] [11] 。
2.4. MySQL
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前,MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库 [12] 。
2.5. Redis
Redis (Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、高性能的Key-Value数据库,并提供多种语言的API。在高并发场景中表现出极高的性能和配置简单等优势 [13] [14] 。
2.6. COS
对象存储COS (Cloud Object Storage)是由腾讯云推出的无目录层次结构、无数据格式限制、可容纳海量数据且支持HTTP/HTTPS协议访问的分布式存储服务。腾讯云COS的存储桶空间无容量上限,无需分区管理,适用于CDN数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。COS提供网页端管理界面、多种主流开发语言的SDK、API以及命令行和图形化工具,并且兼容S3的API接口,方便用户直接使用社区工具和插件。
2.7. OAuth 2.0与Token
OAuth 2.0是目前较流行的授权机制,使用令牌(Token)代替用户名密码进行身份认证与权限鉴别,因此用户信息泄露较低,并可以设置令牌时效,也可以直接在令牌中写入权限信息 [15] [16] [17] [18] 。
3. 程序的设计
3.1. 系统设计
项目整体架构为五层结构,即展示层、控制层、业务层、支持层、数据层。系统架构详见图1。
3.1.1. 展示层
展示层系统的界面展示,主要是微信小程序前端模块,包括小程序端用户界面的实现,小程序端用户数据的显示。
3.1.2. 控制层
控制层囊括了系统运行过程中需要的一些公共基础服务控制。响应展示层的请求,连接具体的业务。
3.1.3. 业务层
业务层包含了系统主要的业务服务。上传、下载、删除、分享文件服务与回收站功能是项目的主体功能模块。
3.1.4. 支持层
支持层为系统的设计开发提供支持,如使用npm构建工具实现VantUI的使用、服务接口采用RESTful设计风格、后端采用SpringBoot框架快速构建Java应用、采用MyBatis用于项目中MySQL数据库中的表的映射生成代码以及CRUD操作、使用Swagger工具自动化构建服务接口文档、使用腾讯云储存对象COS的java的SDK操作COS等。
3.1.5. 数据层
数据层为系统提供数据支持,采用MySQL作为主要的数据库进行数据存储,以Redis作中间缓存提高数据读写效率,以及储存有时间限制的验证码和当前登录用户的OAuth2授权认证信息。
3.2. 功能模块设计
项目主要分为个人NAS与图床两大模块,项目功能模块设计详见图2。
3.2.1. 上传
用户上传文件,后台接口智能化的识别文件类型(文档、图片、音乐、视频、其他文件),分类储存不同类型的文件。将文件信息写入数据库,将文件储存在用户的腾讯云储存对象COS里。详情见图3。
3.2.2. 下载
用户下载文件,调用wx.downloadFile()接口相应的文件腾讯云储存对象COS的URL路径下载文件。通过需要下载的文件类型与文件名称筛选出需要下载的文件,下载下来选择一个聊天搭配微信的文件传输助手使用体验更加。
3.2.3. 分享
用户分享文件,选择文件后设置有效时间(1、7、30天或者永久),调用后台接口生成腾讯云储存对象COS文件的预签名URL,再将生成的预签名URL生成二维码图片,返回二维码图片,前端调用wx.getImageInfo()与wx.showShareImageMeun()完成二维码的分享。详情见图4、图5。
3.2.4. 回收站
彻底删除,在回收站删除文件将彻底删除文件,删除腾讯云储存对象COS里面对应的文件,回收站表对应的文件的数据。
文件还原,在回收站能还原被移入回收站的文件,就文件对应的表中逻辑删除的数据还原,同时删除回收站的数据。详情见图6。
3.3. 数据库设计
本项目采用MySQL数据库,为了保证数据库设计的合理性和减少数据不必要的冗余,数据库表结构严格遵循MySQL三大范式,保证属性的原子性、记录的唯一性、字段的冗余性。根据图2所示的项目功能模块设计,在数据库中建立十张表进行数据的存储。每一张表都采用字段id主键、is_deleted逻辑删除1 (true)已删除,0 (false)未删除、gmt_create创建时间、gmt_modified更新时间的设计规范,对应的为图床、文档、图片、音频、视频、其他、回收站、用户。数据库详见表2。
4. 程序的实现
4.1. OAuth 2.0协议用户登录授权
通过Token令牌实现用户的身份确认,进行相关文件授权操作。微信端用户登录时,会传入户登录凭证res.code到后端,后端使用red.code为密钥加密用户的信息生成临时身份信息令牌Token并且返回到微信端。
首先在微信端登录调用wx.login()方法获取用户登录凭证res.code,再将用户登录凭证传入后端服务器,在后端通过微信官方提供的url获取用户的唯一标识openid,通过openid在MySQL中查询用户信息userInfo,将用户信息封装成Map数据userMap,在以openid为Key,userMap数据为Value存储入Redis数据库中,然后将res.code为密钥openid为加密数据生成Token令牌,并将Token令牌返回微信端,同时以Token令牌为Key,用户登录凭证res.code为Value存储到Redis数据库中。在微信端通过微信官方提供的wx.setStorageSync()方法缓存Token令牌,在微信前端设置请求拦截器,在拦截器中给axios设置请求头Token令牌,同时完成登录。详情见图7。
4.2. 身份认证文件管理
用户每次进行请求时,微信端会通过header附带上Token,后端通过解析Token,确认用户身份信息正确后在进行相应的请求操作。
首先微信端发送axios请求,拦截器调用wx.getStoragerSync()方法从微信端缓存获取Token令牌并将Token设置为header,请求头信息跟随axios请求传入后端,后端通过HttpServletRequest对象的getHeader()方法获取Token令牌,以Token为Key查询Redis数据库获取Token密钥res.code,通过res.code密钥解码Token信息,获取用户的openid,再以openid为Key在Redis数据库中获取用户信息,使用用户信息获取相应的文件的权限,再进行相对应的MySQL、COS操作,同时返回结果信息到微信端。详情见图8。
5. 结语
本文主要论述了基于SpringBoot、Redis、云存储等相关技术的个人网络附加存储微信小程序的设计与实现,详细介绍了小程序的各功能模块设计与整体的系统设计。通过OAuth 2.0协议Token授权方式大大提升了数据信息的安全性。对比传统的将数据存储在实物物体之内或者网盘上的存储方式,本项目可以为用户提供安全、可靠、无固定容量、网速、会员的限制,并可跨终端随时随地查看、分享管理的功能,达到了预期目标。但是由于能力和精力等原因,在小程序的功能方面,存在扩展新功能模块的需求,还可以进一步开发完善,如:完善文件的批量操作、压缩文件的在线解压、影音文件的在线观看、图片在线编辑功能等等。
基金项目
教育部第二批新工科研究与实践项目(E-JSJRJ20201343);西藏大学2021年大学生创新训练项目(2021XCX051)。
NOTES
*通讯作者。