1 绪 论
1.1 研究的背景及意义
1.1.1 选题的背景
随着信息网络技术的迅猛发展,云计算技术从它的概念提出已经开始在实际生产环境中使用了。大部分的东西都已经慢慢云端化,这种新型的技术也受到许多互联网人员的关注,网盘产品的诞生也是建立在云计算的基础之上的。互联网相关的公司不断增多,这些公司内部每天都进行着数据的产生和流动,由于公司的人员和公司业务的扩大,员工之间传输资源文件也变得更加频繁了,而通过传统的移动设备来进行资源传播,存在着许多问题,首先移动设备的使用寿命是有限的,而且通过传统方法来共享资源的话,用户一定要将该移动设备转交给另个用户。除了移动设备外,大家也经常使用发送电子邮件方式来传输文件,但是大型的文件是不支持的。随着数据量不断增大,传统的网盘已经不能很好满足企业的需求,无论是在文件的传输速度上,还是文件保密性都存在一定得缺陷。不过,现在市面上有一些企业做网盘服务,比如腾讯公司和百度公司,但他们的产品太过于商业化,数据的隐私和购买服务的价格都不太理想。因此,根据目前企业网盘发展状况,我们急需设计一个符合企业的网盘系统,该系统能够提供超大容量、高可用的存储服务,帮助企业更高效管理内部的资源。
在这个大数据和云计算时代,海量数据的存储面临着一个难题,因此有些企业先对这个问题进行了研究,谷歌也做出了很大的贡献,它开发了一套文件系统,通过现有的技术和各种资源,做到可以在多台电脑上进行分布式存储,这样的设计方式更好的满足了大数据存储的需要。谷歌分布式文件系统不是开源的,HDFS分布式文件存储系统对此进行了实现并向大众公开源码,让大家参与进来。HDFS系统部署的机器没有什么特殊要求,另外Hdfs集群有许多优秀的设计模式,我们可以用它以更低的成本实现更多数据的传输,所以本系统最终选用Hdfs作为资源文件存储文件系统。
1.1.2 国内外研究现状
我们常见的网盘有个人版和企业版。本次毕业要实现的是一个私有化的企业网盘系统,该系统的主要作用是可以将企业内部产生的资源文件按系统设定的算法,同过大数据技术和云计算能力将资源高效的存储在云端,然后系统提供给用户在线查看、分享、备份、下载等多种资源操作服务。
根据调查发现,国内外企业网盘发展的状况是不同的。通过资料了解到,国外很早的时候就开始研究企业网盘了,而我们国内研究的时间相对要晚许多。但近年随着云计算和大数据的不断成熟,企业网盘很多遗留的问题也得到了解决。对于很多新型的企业公司,他们会将企业内部用户产生的各种数据、文件、多媒体资源进行统一存储,然后提供一个友好的平台给用户进行访问,这个可以让一些资源在企业进行流动分享,提高资源的利用
率和团队的协同办公效率。最近几年,国内的很多巨头公司在企业网盘上也砸下了很多资金,投入了许多人力物力来研究企业网盘。而在海外,企业网盘也是发展地非常迅速,从多种数据角度分析,可以看出企业网盘存在的合理性。从目前国内外发展状况来看,企业网盘在市场上任然有很多的上升空间。
1.1.3 研究的意义
为了解决企业的数据存储和企业内部资源的高效管理问题,本系统底层采用云存储技术,在数据中心进行海量数据的运算和存储,为企业数据可视化提供数据服务支持。目前,该项目前端使用的是Vue.js;后端使用SpringCloud。通过这种系统架构,可以实现前后端的分离,前端开发人员和后端开发人员可以减少更多的冲突,如果后端的接口没及时提供,前端可以先Mock数据,这样可以提高开发的效率。SpringCloud提供了很多插件,有链路监控插件,日志在线查看插件,数据大盘插件等,通过集成这些插件,我们可以很轻松扩展我们应用的功能。对于注册在SpringCloud里面的服务,它可单独部署,就算系统其中某些服务出现问题,也不会影响系统完整的功能。
本企业网盘系统也提供了许多实用的功能和友好的界面,整个系统的架构可以快速满足企业的发展需求。当企业员工共享文件时,可以有效地提高工作效率,用户产生的文件会在后台进行一个处理,该处理对用户是无感的。此外,我们将产生的文件都存放到Hdfs文件系统,该文件系统也提供了非常强大的平台,我们可以对存储的文件进行各种计算处理,而且该系统会将文件备份成3份,就算系统文件丢失,我们也有办法进行恢复。咱们也希望通过本次毕业系统设计,让我们能够将多种技术进行整合,加强了对常用的开发工具,各种开源办公平台的使用。
1.2 系统目标
现在大部分企业使用的办公软件是钉钉或者企业微信等软件,企业员工之间经常会 传一些资料,但通常这些资料会被聊天记录冲刷掉,导致我们想去找文件的时候还有去以前的聊天历史里面去找,这样对于办公人员非常不友好,而且有时候我们把软件的缓存清除,以前传输的文件也会被清除。目前市面上也有一些比较网盘成熟的网盘产品,比如百度网盘,微盘等,但这大部分都网盘对应的用户都是个体。个人使用的网盘基本上存储的是自己私人的资料,而且大部分网盘的上传速度和下载速度都非常慢,所以我们需要开发一套私有化的企业网盘,来满足企业的需求。目前百度,联想等是常见的企业网盘公司,他们大多数服务都过多的商业化,对企业来讲,在数据的保密性和租赁服务的价格上都不太理想。为了能给一些企业有效管理内部资源,帮助企业快速成长,因此私有的企业级网盘系统顺势而生。
2 需求分析
2.1 功能需求
2.1.1 子系统说明
根据本次的设计需求分析,本次企业级网盘系统的开发与完成主要分为前端和后端二大部分,前台主要为企业用户服务的,企业的员工可以管理自己的网盘,如果自己有比较好的资源文件可以加入到企业共享网盘,这样企业每个用户都有权限下载、在线查看文件,除此之外,也可以把自己的资源文件通过用户分享或者链接分享的方式发送给用户。系统后台用户可以对系统角色进行编辑和分配,控制用户的管理权限,管理企业共享网盘里面的资源文件等,具体模块功能如下:
前台
(1) 用户登录,本系统用户可以通过账号登录,短信登录,还可以通过QQ扫码登录,如果用户忘记了密码,验证通过后,可以找回密码。
(2) 个人中心,用户可以修改自己的信息,绑定扫描登录的QQ号。
(3) 系统通知,后台管理员通过后台系统发布系统通知,然后通知会通过推送的方式发送给前台用户。
(4) 网盘管理,每个用户系统会分配一个网盘给他,用户可以在分配的网盘里面创建文件夹,上传各种格式的文件,文件下载,文件重命名,文件复制,文件删除。除此之外,用户可以在线浏览文档,图片和视频等多媒体资源。
(5) 企业内部资源查询,用户可以把自己个人好的资源加入到企业内部共享网盘,例如,自己总结的或者看到的优秀的技术文档,或者一些有技术含量的开源项目、开发工具等。在上方的输入框可以通过输入关键词对资源进行模糊查询。
(6) 分享管理,用户可以把自己一些好的资源分享给企业其他用户,可以通过搜索相关的用户,然后将资源分享给他,也可以通过生成一个code,然后拼接一个url进行分享。
(7) 关注用户,自己感兴趣的一些用户可以进行关注,当关注的用户发布他们的资源,关注他的用户可以在动态里面看见。
后台
(1) 用户登录,这里提供了多种登录的方式,如账号登录,扫码登录,短信登录,方便用户登录网盘系统。
(2) 首页数据大盘,系统管理员可以通过可视化的界面查看企业内部用户使用该系统的活跃折线图,资源下载排行榜,资源受欢迎程度排行榜。
(3) 用户管理,本次毕设系统面向两类用户人群,一类是前台用户,管理员可以通过导入Excel的方式批量添加用户,也可以一条一条添加,而后台用户只能单条添加。管理员可以对用户信息分别进行编辑,删除操作。
(4) 部门管理,企业刚开始使用系统时,需要将企业部门相关信息完善,后台提供了非常友好的界面和操作方便管理员录入。
(5) 角色管理,系统超级管理员可以添加多个角色,然后分别给角色分配权限,该权限包过系统后台菜单的权限和部门之间的数据权限,保存之后即可生效。
(6) 企业共享网盘资源管理,后台管理员可以管理企业内部用户上传在共享网盘上的资源,可以将一些劣质的,对企业无关的资料进行清除。
(7) 系统管理,管理员可以动态的增加,删除,修改菜单,给菜单分配对应的权限,这样设置的好处是可以将不同的菜单功能面向不同的用户人群;在该模块下的定时任务配置管理界面中,用户可以配置Corn表达式,来定时触发需要执行的代码。系统管理员在日志管理里面查看所有的系统日志,如果系统监控一些奇怪的请求,系统会及时将相关异常信息通过邮件发送给管理员。
(8) 其他管理,系统对后台所有提供的接口生成一个在线接口文档,对系统开发人员,和系统以后的维护有重要的意义。
(9) 系统监控,在该模块下有服务器监控,Sql监控,Hadoop监控,SpringCloud微服务注册中心监控。
2.1.2 功能需求描述
经过对企业网盘的需求分析,我们最终决定本次毕业设计系统采用SpringCloud,首先需要将所有的服务启动,然后注册到服务注册中心,服务之间可以互相调用,访问的协议是Http。最后引入API Gateway作为轻量级网关,该网关处理分发前端的请求,通过JSON数据返回给前端。为了保证该系统信息的保密性,访问该系统所有的用户都需要进行权限校验,只有校验成功的用户才可以成功跳转到系统主界面。然后在拦截器里面根据用户ID去用户角色表和用户菜单表查出用户可以访问的菜单权限和数据权限,从而给用户展示不同的界面,系统角色功能如下:
(1) 企业普通员
该用户通过前台系统登陆后,进入系统首页,首页会有个图表展示,登陆用户可以清楚知道自己网盘里面的文件数和分享的文件数,右侧也会有个企业员工分享排行榜,然后用户可以分别操作网盘,分享,资源库,关注用户,个人信息修改,系统通知这几个模块。在我的网盘管理模块中,用户可以通过用户或链接的方式将自己的资源分享给其他的用户,也可以将文件发布到企业共享网盘里面。只要是在企业里面的员工都有权限查看企业的共享网盘,可以在线查看共享网盘里面的文件,下载到自己本地。
(2) 管理员
用户通过后台入口登陆后台系统,系统通过账号自动检测用户的类型,管理员登陆后,会根据管理员所拥有的菜单权限和部门数据权限控制用户所能看到的后台界面和查询数据的范围。管理员可以添加前台用户,然后给用户分配部门和所拥有的角色,另外还有网盘管理模块的权限,在网盘管理这个模块中,管理员可以查看企业共享网盘里面所有的资源文件,并有权修改文件信息,规范网盘。
(3) 超级管理员
系统超级管理员默认账号是admin,密码是asdf123。超级管理员登录系统后,管理员,如果是超级管理员,会跳过过滤器的校验。除此之外,超级管理员可以添加系统后台用户类型,动态配置后台菜单和对应页面按钮的权限,添加系统角色类型,添加企业部门相关信息。除了管理员有的功能外,超级管理员有权查看系统相关的日志,定时任务,公告管理,数据库监控,Hadoop分布式存储集群监控,微服务监控。
2.2 非功能需求
2.2.1 外部接口需求
需求名称 | 详细设计 |
---|---|
短信发送接口 | 这里对接的短信的第三方平台是容联云通讯,在该平台找到对应短信服务模块,然后提交认证信息,充值短信条数,提交短信模板,通过审核后,我们可以发送模板短信的https请求给云通讯服务端,然后这个平台会将对应短信发送给用户。 |
QQ扫码登陆接口 | 在访问腾讯开放平台之前,需要先申请账号,并在访问网站之前获取相应的appid和appkey,以确保网站和应用程序在后续过程中能够得到正确的验证和授权。QQ登陆功能需要通过OAuth2.0协议进行验证,我们网站要对接QQ扫码登录方式,如下:1. 访问QQ互联平台,然后找到对应的入口下载相关的jar包。该方法对接起来会比较方便,开发人员只需修改一点点代码,如果自己开发的时间比较短,用该方法会比较合适。2. 通过QQ登录的协议,独立开发,该方法具有高度的定制性,可供需要与现有系统集成的网站使用。 |
发送电子邮件接口 | QQ邮箱提供了相关发送邮件的API。我们通过访问QQ邮箱网页,找到“POP3...”将此服务开启,我们可以获取到一个授权码,在代码的配置文件里面将该授权码设为连接邮箱的密码。 |
2.2.2 性能需求
表 2-2性能需求
需求名 | 详细设计 |
---|---|
响应时间 | 数据接口请求的平均响应时间<800毫秒,网页的打开速度小于5秒。 |
吞吐量 | 一个接口每年支持200个同时进行的用户调用(平均3秒) |
数据存储量 | 每月的数据存储容量及接下来几个月的预期增长量。 |
2.2.3 其它需求
表 2-3其他需求
需求名 | 详细设计 |
---|---|
系统可靠性 | 系统能够在工作日不宕机,满足7*24小时; |
系统可扩展性 | 如果后期需要对系统进行扩展,系统能够快速对服务器进行服务资源的扩容。并且不能影响当前服务的使用。 |
系统安全性 | 没有权限的用户是无法访问到需要授权的接口。 |
系统易用性 | 对于使用该系统的用户,通过简单的培训后,能够快速掌握该系统主要功能模块的使用。 |
系统可维护性 | 开发人员在一个软件开发完成并开始投入使用后,也应该根据时代发展需求及用户需求来不断的对软件进行功能的迭代,将系统的功能更加完善和系统的维护来延长软件的使用寿命。 |
界面需求 | 对应企业网盘系统,要求对用户有友好的界面,用户界面美观,大方,操作简单。 |
3 总体设计
3.1 运行环境
编程语言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue
开发环境:Windows 10 + Mysql
开发工具:WebStorm、IDEA编译器、Git、Maven
应用部署服务器:SpringBoot内置Tomcat插件
Node服务器:Node v10.15.3
数据库:Mysql v5.5.59
缓存服务:Redis v2.8.9
代码仓库管理系统:GitHub
服务器环境:处理器Core i5以上
3.2 基本处理流程
企业网盘系统的使用者分为企业普通员工和企业管理员,所以进行的基本处理流程是不一样的。企业普通员工进入本系统前台主界面后看到的是首页数据大盘,系统右上角有用户的头像和系统公告通知。在首页顶部的位置有个欢迎用户功能,此模块会根据用户登录的时间,人性化的对用户进行打招呼,比如用户深夜的时候登陆系统,该提示语会提醒"已经深夜了,你还在加班吗,请注意休息!"。当用户点击我的网盘模块后,系统首先会请求一次接口,展示自己网盘里面的文件,该用户可以对文件进行相关的操作。在分享模块中,用户可以选择不同的tab栏,分别对已共享、已接收的文件进行查看。当用户进入存储库模块时,单击不同的文档分类以查看已分类的文档,可以对文件进行查询,预览和下载。系统管理员发布通知后,系统前台会在系统右上角进行消息条数的提醒,点击消息红点后,会出现通知下拉列表框,再点击下拉列表里面的查看更多,可以进入更多模块下的系统公告列表页面,在该页面里面,用户可以通过标题关键字,公告发布的时间范围进行搜索,在更多模块下用户可以动态切换系统主题,然后让用户无感知的记录用户行为,当用户退出登录后重新登录,系统的主题还是用户退出登录时所选择的主题。
管理员和超级管理员成功登入系统后台后,默认会调到Index页面去,在该首页,我们可以看到登录用户、服务器运行相关信息。在数据大盘模块,可以看到最近上传文件的数量,以及最近一段时间的上传曲线图。系统超级管理员可以管理系统所有的功能和所有用户,如果需要控制系统用户能访问的菜单,系统管理员只需更改相关角色所拥有的菜单列表。
图3-1企业网盘系统基本处理流程
3.3 模块结构
基于SpringCloud+Hadoop+Vue企业网盘系统主要分为前台和后台两大模块,前台模块分为首页,网盘,分享,资源库,关注用户,系统公告模块,不同的功能模块拥有的功能也是不相同的。此外,所需权限也不同。后台模块分为用户、部门、角色、网盘、日志、系统监控、接口文档、定时任务模块。在网络磁盘管理模块中,管理员可以上传、删除和修改文档,管理员还可以在线查看多媒体资源,如Word文档、视频、音乐、图片。
3.4 外部接口
3.4.1 软件接口
(1) 计算机操作系统:Win10
(2) 应用服务器:ApacheTomcat、Node服务器
3.4.2 硬件接口
(1) 输入设备:鼠标、键盘
(2) 输出设备:显示器
3.4.3 通讯接口
(1) 浏览器:谷歌浏览器
(2) 网络通讯协议:HTTP
3.4.3 其他接口
(1) 电子邮件发送接口
(2) 手机短信发送接口
(3) QQ扫码登录接口
3.5 内部接口
SpringCloud将SpringBoot工程搭建的服务,注册到Eureka注册中心,服务间通过Feign进行http方式调用,最后将上层服务在网关暴露出去。
4 数据库设计
4.1 概念结构设计
4.1.1 设计思路
概念结构设计指的就是开发人员在项目开发前,对数据结构进行设计,这是需求分析中所得到东西进行抽象化的结果。本系统主要实体如下:
(1) 用户:用户主键(pk)、用户名、头像、密码、salt值、邮箱、手机号码、类型、状态、部门ID(fk)、添加时间。
(2) 部门:部门主键(pk)、父部门编号、部门名、删除标记。
(3) 角色:角色主键(pk)、角色名、注释、添加时间。
(4) 菜单:菜单主键(pk)、父菜单ID、菜单名称、菜单URL、授权、类型、菜单图标、排序、版本号。
(5) 文件:文件ID(pk)、父文件ID、原版文件名、文件名、文件路径、文件大小、文件类型、是否可在线查看、是否邮箱、创建者、创建时间、修改者、添加时间、版本号、下载数量。
(6) 网盘:网盘ID(pk)、企业名字、企业ID(fk)、是否有效、创建者、添加时间。
(7) 分享:ID(pk)、用户主键(fk)、用户名、被分享用户ID(fk)、被分享用户名、文件名、过期时间、是否有效、创建时间、创建者、修改时间、修改人、版本号。
(8) 数据字典:字典id(pk)、字典名称、 字典类型、字典码、 字典值、 排序、备注、删除标记、创建时间、创建者、修改时间、修改者、版本号。
(9) 系统日志:日志id(pk)、用户名、用户操作、请求方法、请求参数、执行时长(毫秒)、IP地址、创建时间、创建者。
(10) 文件上传:id(pk)、URL地址、创建时间、创建者。
(11) 定时任务:任务id(pk)、SpringBean名称、方法名称、参数、cron表达式、任务状态、注释、添加时间。
(12) 定时任务日志:任务日志id(pk)、任务id(fk)、SpringBean名称、方法名、参数、任务运行状态、失败信息、耗时(毫秒)、创建时间。
(13) 网络磁盘文件关联实体:id(pk)、网络磁盘id(fk)、文件id(fk)、添加时间、创建者。
(14) 用户文件管理实体:id(pk)、用户编号(fk)、文件主键(fk)、新增时间、创建者。
4.1.2 E-R图
4.1.3 数据库总表
表4-1数据库总表
表名 | 功能 |
---|---|
系统配置信息表 | 存储系统所有的配置信息 |
部门表 | 存储企业所有部门信息 |
通知公告表 | 存储系统所有通知公告信息 |
网盘表 | 存储企业所有网盘信息 |
系统日志表 | 存储系统所有日志信息 |
菜单表 | 存储系统所有菜单信息 |
OSS上传文件表 | 存储系统所有通过OSS上传文件信息 |
---|---|
角色表 | 存储系统角色相关信息 |
角色部门表 | 存储系统所有角色和部门关联信息 |
角色菜单表 | 存储系统所有角色和菜单关联信息 |
用户表 | 存储系统用户相关信息 |
用户角色表 | 存储系统所有用户和角色关联信息 |
定时任务表 | 存储系统所有定时任务信息 |
定时任务日志表 | 存储系统所有定时任务运行的日志信息 |
用户文件表 | 存储系统所有用户关联的文件信息 |
文件表 | 存储系统所有文件相关信息 |
网盘文件表 | 存储系统所有网盘关联文件的信息 |
关注用户表 | 存储所有已关注和被关注的信息 |
分享表 | 存储所有已分享和收到的分享信息 |
4.2 逻辑结构设计
4.2.1 设计思路
图4-2结构设计转化过程图
逻辑结构设计是通过需求分析,得到抽象数据设计局部视图,然后将多个E-R图进行集成,得到总的E-R图,最后将ER图向关系模型进行转换,在将转换的结果向数据模型转换。企业网盘系统的E-R图则是由管理员,系统管理员,部门,角色,菜单,公告,网盘等个实体的属性以及各个实体类型之间的联系这三个方面组成。
4.2.2 逻辑模型
(1) 系统配置信息表(sys_config)
表4-2系统配置表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
status | tinyint | 4 | YES | 状态 |
remark | varchar | 500 | YES | 备注 |
param_value | varchar | 2000 | YES | value |
param_key | varchar | 50 | YES | key |
id | bigint | 20 | NO | |
create_date | datetime | YES | 创建时间 |
(2) 部门表(sys_dept)
表4-3部门表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
dept_id | bigint | 20 | NO | |
parent_id | bigint | 20 | YES | 上级部门ID |
name | varchar | 50 | YES | 部门名称 |
order_num | int | 11 | YES | 排序 |
del_flag | tinyint | 4 | YES | 是否删除 |
Update_date | datetime | YES | 更新时间 | |
create_date | datetime | YES | 创建时间 |
(3) 数据字典表(sys_dict)
表4-4数据字典表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | |
name | varchar | 100 | NO | 字典名称 |
type | varchar | 100 | NO | 字典类型 |
code | varchar | 100 | NO | 字典码 |
value | varchar | 1000 | NO | 字典值 |
del_flag | tinyint | 4 | YES | 删除标记 |
Update_date | datetime | YES | 更新时间 | |
create_date | datetime | YES | 创建时间 |
(4) 系统日志表(sys_log)
表4-5系统日志表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | |
username | varchar | 50 | YES | 用户名 |
operation | varchar | 50 | YES | 用户操作 |
method | varchar | 200 | YES | 请求方法 |
params | varchar | 5000 | YES | 请求参数 |
time | bigint | 20 | NO | 执行时长(毫秒) |
ip | varchar | 64 | YES | IP地址 |
create_date | datetime | YES | 创建时间 |
(5) 菜单表(sys_menu)
表4-6菜单表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
menu_id | bigint | 20 | NO | |
parent_id | bigint | 20 | YES | 父菜单ID |
name | varchar | 50 | YES | 菜单名称 |
url | varchar | 200 | YES | 菜单URL |
perms | varchar | 500 | YES | 授权 |
type | int | 11 | YES | 类型 |
icon | varchar | 50 | YES | 菜单图标 |
order_num | int | 11 | YES | 排序 |
(6) 系统通知表(sys_notice)
表4-7系统通知表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | 公告ID |
notice_title | varchar | 100 | NO | 公告标题 |
notice_type | tinyint | 4 | NO | 公告类型 |
notice_content | varchar | 500 | NO | 公告内容 |
status | tinyint | 1 | YES | 状态 |
create_user | varchar | 32 | NO | 创建用户 |
create_time | bigint | 20 | YES | 创建时间 |
remark | varchar | 255 | YES | 备注 |
(7) 角色表(sye_role)
表4-8角色表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
rele_id | bigint | 20 | NO | |
role_name | varchar | 100 | YES | 角色名 |
remark | varchar | 100 | YES | 备注 |
dept_id | bigint | 20 | YES | 部门ID |
create_time | datetime | YES | 创建时间 |
(8) 用户表(sys_user)
表4-9用户表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
user_id | bigint | 20 | NO | |
username | varchar | 50 | NO | 用户名 |
img_path | varchar | 100 | NO | 头像 |
password | varchar | 100 | YES | 密码 |
salt | varchar | 20 | YES | 盐 |
varchar | 100 | YES | 邮箱 | |
mobile | varchar | 100 | YES | 手机号 |
type | tinyint | 4 | YES | 用户类型 |
status | tinyint | 4 | YES | 状态 |
dept_id | bigint | 20 | YES | 部门ID |
(9) 定时任务表(schedult_job)
表4-10定时任务表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | |
disk_id | bigint | 20 | YES | 用户ID |
file_id | bigint | 20 | YES | 文件ID |
is_valid | tinyint | 4 | NO | 是否有效 |
create_user | varchar | 32 | YES | 创建用户 |
create_time | bigint | 20 | YES | 创建时间 |
(10) 文件表(tb_file)
表4-11文件表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | 文件ID |
parent_id | bigint | 20 | YES | 文件父ID |
original_name | varchar | 200 | YES | 原版文件名 |
name | varchar | 100 | YES | 文件名 |
original_path | Varchar | 200 | YES | 原版文件路径 |
path | Varchar | 100 | YES | 文件路径 |
length | Varchar | 100 | YES | 文件长度 |
type | tinyint | 4 | YES | 文件类型 |
view_flag | tinyint | 4 | YES | 是否可用看 |
is_valid | tinyint | 4 | NO | 是否有效 |
create_user | varchar | 32 | YES | 创建用户 |
create_time | bigint | 20 | YES | 创建时间 |
opt_user | varchar | 32 | YES | 操作用户 |
opt_time | bigint | 20 | NO | 操作时间 |
download_num | Int | 11 | NO | 下载数量 |
(11) 网盘表(sys_disk)
表4-12网盘表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | |
company_name | varchar | 200 | YES | 企业名字 |
company_id | bigint | 20 | NO | 企业ID |
name | varchar | 100 | YES | 文件名 |
is_valid | tinyint | 4 | NO | 是否有效 |
create_user | varchar | 32 | YES | 创建用户 |
create_time | bigint | 20 | YES | 创建时间 |
opt_user | varchar | 32 | YES | 操作用户 |
opt_time | bigint | 20 | YES | 操作时间 |
(12) 关注用户表
表4-13关注用户表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | |
from_user_id | bigint | 20 | YES | 用户ID |
to_user_id | bigint | 20 | YES | 被关注用户ID |
is_valid | tinyint | 4 | NO | 是否有效 |
create_user | varchar | 32 | YES | 创建用户 |
create_time | bigint | 20 | YES | 创建时间 |
opt_user | varchar | 32 | YES | 操作用户 |
opt_time | bigint | 20 | YES | 操作时间 |
last_ver | smallint | 6 | NO | 版本号 |
(13) 分享表
表4-14分享表字段详情
字段 | 类型 | 长度 | 是否为空 | 备注 |
---|---|---|---|---|
id | bigint | 20 | NO | |
from_user_id | bigint | 20 | YES | 用户ID |
from_user_name | varchar | 100 | YES | 用户名 |
to_user_id | bigint | 20 | YES | 被分享用户ID |
to_user_name | varchar | 100 | YES | 被分享用户名 |
file_id | bigint | 20 | YES | 文件ID |
file_name | varchar | 100 | YES | 文件名 |
expired_time | bigint | 20 | YES | 过期时间 |
is_valid | tinyint | 4 | NO | 是否有效 |
create_user | varchar | 32 | YES | 创建用户 |
create_time | bigint | 20 | YES | 创建时间 |
opt_user | varchar | 32 | YES | 操作用户 |
opt_time | bigint | 20 | YES | 操作时间 |
last_ver | smallint | 6 | NO | 版本号 |
4.3 物理结构设计
4.3.1 存取方式
数据库系统是可以给多个用户一起使用的系统,为了满足不同用户的需要,我们需要对同一个关系建立不同的存储路径来满足不同用户的需求。数据库系统物理结构设计的其中一个目的就是通过数据库系统支持的存储方法来确定对于用户当前的需求,到底该选择怎样的存取方式。对于存取方式,我们在字面上的理解就是怎么和数据库里面的数据进行快速的存取交互。对于数据库管理系统,基本上都提供了许多的存取方式,常见的是建立索引,B+树索引和Hash索引在数据库设置上也是频繁使用的方式。基于对本企业网盘系统的调研分析,最终本系统底层数据库的存取方式采用B+树索引存取方法。在设计数据库表的时候,我们需要注意哪些字段上面需要加上索引,哪些字段上用唯一索引或者组合索引,来提高数据的查询效率。在本次系统数据库索引的设置采用如下准则:
(1) 表的主键,外键应该创建索引。
(2) 如避免选择大学数据类型的列作为索引。
(3) 确定对某个表需要进行大量的查询操作而不是大量增删改的操作。
(4) 如对于小型的表(数据量低于500行),建立索引可能会影响性能。
(5) 索引的建立也要适度,当增删改时,系统要去维护索引,是需要付出代价的。
(6) 了解业务需求,汇总表要查询的字段,然后根据需要进行索引。
4.3.2 存储结构
在对数据进行插入和查询时,我们需要考虑数据库对数据存储的时间和系统后期的维护成本,但是我们偏向任何一方都是无法实现的,所以在设计的时候需要考虑如何取舍。Mysql在版本为5.5.6之后数据库引擎改为了InnoDB,该引擎对数据一致性要求比较高,能够支持事务操作,InnodB相对MyISAM而言,它对硬件的要求会更高,具有非常高的缓存特性,并且支持外键约束,不支持全文索引。
5 界面设计
5.1 界面关系图
5.2 界面设计成果
5.2.1 主界面
(1) 用户界面
用户界面由菜单、欢迎词组、系统通知、用户头像组成。横向菜单中列出用户能够使用的功能,由首页,网盘,分享,资源库,关注用户,系统公告,个人信息管理几个功能选项组成;题头是根据用户登录ID来显示对应的登录用户称呼题头中还设置了注销退出的按钮,清晰明了的告诉用户,如何退出系统,另外题头也有消息通知提示,点击后可以看到消息简略内容,点击查看更多可以进入系统公告列表页面,然后可以查看公告详情。整体界面如图5-3所示:
图 5-3 用户界面
(2) 管理员界面
管理员界面由菜单、欢迎词、修改密码组成,菜单中列出管理员能够使用的功能,由用户管理,网盘管理,日志管理,系统管理,系统监控几个功能选项组成。在导航栏的右侧还提供了注销退出和修改密码功能模块,清晰明了的告诉用户,如何退出系统,以及忘记密码如何重新设置密码。界面如图5-4所示:
图 5-4 管理员界面
(3) 超级管理员界面
超级管理员拥有最高权限,界面如图5-5所示:
图 5-5 超级管理员界面
5.2.2 前台子界面
(1) 登录界面
图 5-6 登陆界面
(2) 网盘界面
在用户主界面下的查询子界面,用户在网盘界面可以查看自己网盘文件(例如文件名,大小,创建时间,创建人)。当上传文件成功时,vue会监听相关事件,如果监听到上传文件事件就刷新该页面,重新请求后台接口。
图 5-7 网盘界面
(3) 分享界面
本系统实现了两种分享方式,第一种方式是通过用户分享,在用户分享界面可以进行模糊搜索,会根据用户输入的关键词模糊匹配出所有的用户;第二种分享方式是链接分享,
系统将生成的链接放到Redis缓存,并设定过期的时间,其他用户打开链接后,通过code去Redis缓存里面查询该code对应的文件和用户信息,用户点击提取后,该文件就会添加到自己网盘里。
图 5-8 分享界面
5.2.3 后台子界面
(1) 用户管理界面
在系统后台主界面下的子界面中,用户可以在用户管理菜单目录下查看企业用户列表,编辑用户信息(如用户名、部门、密码、邮箱、手机号、状态)。选择部门时,会弹出企业部门选择框,该数据结构是树状的,可以一层一层展开下去,直到子部门。
图 5-9 用户管理界面
(2) 角色管理界面
系统超级管理员可以编辑角色拥有的功能权限和数据权限。
图 5-10 角色管理界面
(3) 菜单管理界面
超级管理员可以配置菜单对应的页面,在配置菜单的时候需要注意菜单的授权方式,这里需要结合shrio的访问权限。代码里面的权限标识符合配置菜单的权限标识符要一致才能生效,另外可以对菜单设置排序编号。
图 5-11 菜单界面
6 详细设计
6.1 系统主要功能模块介绍
6.1.1 前台主要功能模块介绍
(1) 登陆模块
用户要使用该系统,必须登录通过后才有权访问系统。用户输入正确的账户信息、手机号和验证码或QQ扫码登录,如果用户账户信息无误,系统会跳转到网盘系统首页界面。
(2) 个人信息维护模块
个人信息维护模块里面有基本信息设置和安全信息设置,在基本信息设置Tab中,用户可以对个人资料进行修改,修改时会对用户输入的账户、邮箱进行一定得校验;在安全信息设置Tab中,用户可以将自己账户和相关的QQ进行绑定,登录系统的时候就可以通过QQ扫码登录了。
(3) 系统通知模块
后台管理员发布系统公告后,系统前台可以接收到系统公告的通知,前端在页面表现行为在界面头部会有个信息通知条数提示,点击后会展示最新的前5条公告,点击查看更多可以查看公告详情。
(4) 网盘管理模块
系统每增加一位用户,用户可以获取默认大小的网盘空间,登录系统后,可以对我的网盘进行各种操作。
(5) 资源库管理模块
用户可以把自己认为比较好的资源加入到企业内部共享网盘,比如自己总结的一
些好的技术文档,开源项目,博客技术文档,开发工具等。企业其他用户在该模块里
面可以进行查看,这里提供了按文件名模糊搜索的功能。
(6) 关注用户模块
为了将系统用户之间关系打通,我们这里添加了一个用户关注模块。在关注用户模块下,用户可以查询自己已经关注了哪些用户,还有哪些用户没有进行关注。点击用户名,可以进入到用户信息详情页面。
6.1.2 后台主要功能模块介绍
(1) 登录模块
用户要使用后台系统,必须登录通过后才有权访问。后台登录是通过账户+验证码方式进行登录的。
(2) 网盘管理模块
后台管理员可以管理企业内部用户上传在共享网盘上的资源,可以将一些劣质
的,对企业无关的一些资料进行筛选,删除等各种操作。
(3) 日志管理模块
日志管理模块下,系统通过Aspect方式,将所有的请求方法都进行拦截,在请求
前开始计时,直到请求完成,关闭计时,然后将请求相关的信息封装成我们想要的格式,插入数据库中。系统后台管理员可以在日志列表页里面进行查看,由于日志的数量非常多,所有在该列表可以对数据进行过滤,在搜索输入框里面输入用户名或用户操作对日志进行模糊查询,系统管理员也可以一键清除日志,者配置定时任务,定期给系统日志进行备份,清洗。
(4) 系统管理模块
该模块下的功能比较多,主要是系统相关的功能模块,比如系统后台菜单,公告
通知,字典管理。该模块下比较特殊的一个是接口文档功能,将系统中相关的接口进行可视化,并且可以在线对接口进行测试,这样设计还有好处是可以方便系统的后期维护。
(5) 系统监控模块
该模块下有阿里Druid数据库监控,Hdfs集群监控,Eureka注册中心监控,服务器监控。在Sql监控界面,我们可以看到Mysql的驱动版本,系统启动的时间。在Hadoop监控菜单下,我们可以看见分布式集群各个节点状况和系统网盘文件在Hdfs分布式存储里面存储状况。在Eureka注册中心菜单界面下,我们可以看到系统的状态,当前已注册到Eureka的服务,节点信息,基本配置信息。在服务器监控菜单下,我们可以看见服务部署所在服务器的CPU,内存,服务器新,Java虚拟机信息,磁盘状态信息。
6.2 后台登录模块设计
6.2.1 后台登录模块算法描述
表 6-1 后台登录模块算法描述
用例简介: | 登录后台系统时需要输入准确的账号、密码和验证码,并且用户所使用的登录帐号和登录密码也是由超级管理员分派的。 |
---|---|
执行者: | 管理员,超级管理员 |
后置条件: | 如果是超级管理员登录成功,可以对整个系统后台所有功能模块进行管理;如果是其他角色的用户登录,他们能管理的功能,由超级管理员所配置的角色权限决定,拥有相同角色的用户可管理的菜单是相同的。 |
事件流: | (1) 填写用户信息,验证码;a. 点击”登录”;b. 用户信息校验授予权限,进入系统管理主界面。 |
6.2.2 后台登陆模块程序流程图
图 6-1 后台登录模块流程图
6.2.3 后台登陆模块关键类说明
本系统使用的安全框架是Shiro,系统后台用户输入用户名,密码,然后刷新验证码填入有效的验证码,后台首先对验证码进行校验,如果校验成功,在Shiro模块下的UserRealm类中,使用用户名和密码创建令牌,UsernamePasswordToken token = new UsernamePasword
(用户名、密码),对生成的令牌信息进行校验,然后获取Subject单例对象,再调用对象的login方法传入token。
6.3 用户管理模块设计
6.3.1 用户管理模块算法描述
表 6-2 用户管理模块算法描述
用例简介: | 管理员或超级管理员对用户的信息进行添加、修改、查看等操作。 |
---|---|
执行者: | 超级管理员、管理员 |
前置条件 | 用户以管理员或超级管理员身份登录可以进行添加用户操作;用户以管理员或超级管理员身份登录,存在该用户,可以进行删除,修改操作; |
后置条件: | 用户登录网盘系统后,进入前台用户列表,在用户列表也可以对用户进行新增,修改,按用户名进行模糊查询。 |
事件流: | 增加用户a. 进入前台用户管理界面;b. 点击新增按钮;c. 填写用户信息包括:用户名、所属部门、密码、邮箱、手机号;d. 点击确定按钮; |
6.3.2 用户管理模块程序流程图
图 6-2 用户新增修改流程图
6.3.3 用户管理模块关键类说明
将用户信息填写完后,点击新增按钮,此时向后台发送请求,首先系统会通过切面拦截该请求,根据请求头里面的Token,判断用户是否有访问权限。有权限访问的用户会将请求转发到SysUserController类里面,根据RequestMapping,映射到save方法上,这里通过RequestBody接收到请求体里面的用户信息,后台通过ValidatorUtils.valid(user),对User实体里面加了校验注解的属性进行校验,如果没抛异常,就调SysUserService接口中的add、update方法最后调用到数据Dao层,将数据录入数据库中。
6.4部门管理模块设
6.4.1 部门管理模块算法描述
表 6-3 部门模块算法描述
用例描述: | 超级管理员对企业部门信息进行添加、修改、删除、查看操作,部门的信息包括部门名称,上级部门,排序号。点击部门,可以一级一级从上级部门展开下去。 |
---|---|
执行者: | 超级管理员 |
前置条件 | 用户以超级管理员身份登录,存在该用户,可以进行添加、删除、修改操作。 |
后置条件: | 超级管理员登录后,点击部门管理,在右侧的部门管理列表可以分别对部门进行新增,修改操作。 |
事件流: | 添加部门a. 超级管理员登录系统,进入部门管理界面;b. 点击新增按钮;c. 跳转到新增界面;d. 填写部门信息包括:部门名称、上级部门、排序号;e. 点击确定按钮; |
6.4.2 部门管理模块程序流程图
图 6-3 部门操作流程图
6.4.3 部门管理模块关键类说明
部门管理的实体类用了一个树形结构属性,在SysDeptEntity类里面有添加了一个该实体的集合属性,因为部门和部门之间存在子父级关系,一个部门下可以有多个子部门。本系统使用Mybatis Plus来提供开发效率,在SysDeptEntity实体List\
6.5角色管理模块设计
6.5.1 角色管理模块算法描述
表 6-4 角色模块算法描述
用例简介: | 超级管理员对系统用户角色信息进行添加、修改、删除、查看操作。 |
---|---|
执行者: | 超级管理员 |
前置条件 | 超级管理员身份登录,并且该用户存在,可以分别对角色进行增、删、改操作; |
后置条件: | 超级管理员登录后,点击角色管理下的用户角色菜单列表,在右侧的用户角色管理列表可以分别对角色进行新增,修改,删除,查询操作。 |
事件流: | 添加角色a. 超级管理员登录系统,进入用户角色管理界面;b. 点击新增按钮;c. 填写角色信息;d. 点击确定按钮; |
6.5.2 角色管理模块程序流程图
图 6-4 角色操作流程图
6.5.3 角色管理模块关键类说明
在用户登录系统时,通过调用ISysUserRoleService接口下的queryRoleIdList(Long userId)方法,获取该用户的角色列表。由于数据库里面存的角色信息是不会太多,所以这里我们把所有角色信息都加载到内存里面,进行处理,然后通过用户拥有的角色Ids,获取到用户拥有哪些菜单列表和部门列表。
6.6网盘管理模块设计
6.6.1 网盘管理模块算法描述
表 6-5 网盘模块算法描述
用例简介: | 管理员或超级管理员对企业共享网盘进行文件上传、文件重命名、文件删除、文件下载,文件在线查看操作。 |
---|---|
执行者: | 超级管理员,管理员 |
前置条件 | 超级管理员或管理员,并且该用户存在,可以对文件进行upload,download,rename,onlineView等操作。 |
后置条件: | 管理员或超级管理员登录后,点击企业管理,在右侧的网盘管理列表可以选择网盘文件类型,默认是展示所有的文件,然后可以分别对文件进行相关的操作。 |
事件流: | 文件uploada. 管理员或超级管理员登录系统,进入网盘管理界面;b. 选择文件类型;c. 点击上传文件按钮,弹出文件上传框;d. 在本地选择需要上传的文件;e. 上传成功;f. 页面进行刷新; |
6.6.2 网盘管理模块程序流程图
图 6-5 网盘操作流程图
6.6.3 网盘管理模块关键类说明
在网盘管理界面用户点击上传文件,然后表单会想后台发送enctype="multipart/form
-data"属性的数据请求,然后服务端通过\@RequestPart注解获取到MultipartFile文件信息,再通过getInputStream方法获取到文件流。第一步我们调用IFileService接口,将文件信息插入到tb_file表里面,同时调用HdfsDao下put方法,将文件上传到Hdfs分布式文件系统里,再通过异步的方式将用户文件关联信息进行完善。
6.7系统菜单管理模块设计
6.7.1 系统菜单管理模块算法描述
表 6-6 系统菜单管理模块算法描述
用例描述: | 超级管理员对系统菜单信息进行添加、修改、删除、查看操作。 |
---|---|
执行者: | 超级管理员 |
基本事件流: | 添加、修改菜单信息a. 超级管理员登录系统,进入菜单管理界面;b. 点击新增按钮或修改按钮;c. 如果是修改信息会回显,否则填写菜单信息d. 点击确定按钮; |
6.7.2 系统菜单管理模块程序流程图
图 6-6 系统菜单操作流程图
6.7.3 系统菜单管理模块关键类说明
在菜单模操作模块下,我们配置权限的粒度可以到按钮,本系统使用的权限管理框架是shiro。Shrio的配置方法也很简单,比如要配网盘查询权限,表达式为disk:view;可查询或编辑网盘权限表达式为disk:view,edit;可对网盘进行所有操作权限表达式为disk:*或者disk。通常我们在Contraller里的方法写上对应的注解,括号里面是前端对应的权限字符串,这样就可以空着已认证用户的权限了。在代码里面,后端java代码里面使用的注解为\@RequirePermissions("权限标识"),然后前端页面里面也通过\<#if shiro.hasPermission("权限标识")>,如果用户有这个权限,该代码下的元素对应用户就是可见的。
6.8前台登录模块设计
6.8.1 前台登录模块算法描述
表 6-7前台登录模块算法描述
用例简介: | 账号登录,QQ扫码登录 |
---|---|
执行者: | 企业员工 |
后置条件: | 企业员工登录后,可以进入系统前台管理界面,有权访问界面中所有的模块。 |
事件流: | 账号登录:a. 输入用户名,登录密码b. 点击”登录”c. 用户信息校验,进入系统主界面扫码登录:a. 打开手机上QQ,授权成功 b. 进入系统主界面 |
6.8.2 前台登录模块程序流程图
图 6-7 前台登录操作流程图
6.8.3 前台登录模块关键类说明
前端请求的每个接口(除登录,注册之外)都带上了token,于是在SpringCloud的网关服务里面会通过拦截器对token进行校验,具体实现类是AuthorizationInterceptor,该类继承HandlerInterceptorAdapter,在preHandle方法里面我们判断调用的接口是否有Login注解,如果没有直接跳过拦截器,否则从请求头里面取获取token。本系统对token的处理是存在缓存服务器上,缓存的key是token,value是用户,在调TokenService接口判断token是否有效,如果验证通过,就不执行拦截器里面的处理逻辑。这里我们还对用户的信息做了一个传递,我们先将用户信息存在request域里面,然后我们自定义了一个注解LoginUser,这样我们可以通过SpringMvc的HandlerMethodArgumentResolve自定义参数解析。因为每个接口基本上都要获取到请求用户的信息,所以我们可以将该方法提取出来,我们只需要在接口参数里面加上一个用户实体参数,并加上\@LoginUser注解,这样对系统代码后期的维护性和代码的可读性在一定程度上都有很大的提高。
7 编码
7.1 代码实现与核心算法
7.1.1 前台系统
(1) 拦截器
由于本次毕业设计系统交互模式是前后端分离的,在前端登成录功后,通过登录接口获取到用户对于的授权令牌,然后每一次请求后端的接口都会将令牌参数放在请求后里发送给后端服务,后端解析用户的请求,从请求头里面获取令牌信息并进行校验,根据令牌查到用户访问权限。前端每次发送的http请求,都需要对token进行判断,当token过期后,用户需要重新登录系统,获取新的token。这里有一个非常通用的功能,在每个接口请求后需要对响应进行判断,如果每个都要单独处理,那么会是一个非常大的修改工作量。此时,我们将推测在Vue资源中是否有为任何请求响应捕获的公共回调函数,Vue的拦截器是满足此需求的最佳解决方案。在每次请求响应后,先执行拦截器中的处理代码,根据请求响应的结果,判断请求后需要执行的操作。
``js
//下边代码添加在main.js中
//请求前进行拦截
$http.interceptors.request.use(
config => {
config.url = utils.getApiUrl(config.url);
let token = getStore('token');
if (token){
config.headers.Authorization =
${token}
;
config.headers.token =
${token}`;
}
return config;
}
);
//请求后进行拦截 $http.interceptors.response.use( response => { response = response.data; response.code = Number(response.code); } ) ```
7.1.2 后台系统
(1) 权限校验
目前大部分系统的系统管理框架都是使用Shrio,Shiro可以很方便实现一套权限校验系统,而且可以快速接入到我们项目中。Shiro的核心代码如下:
java
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pr) {
SysUserEntity user = (SysUserEntity)principals.getPrimaryPrincipal();
Long userId = user.getUserId();
List<String> permsList;
//系统管理员,拥有最高权限
if(userId == Constant.SUPER_ADMIN){
List<SysMenuEntity> menuList = sysMenuDao.selectList(null);
permsList = new ArrayList<>(menuList.size());
for(SysMenuEntity menu : menuList){
permsList.add(menu.getPerms());
}
}else{
permsList = sysUserDao.queryAllPerms(userId);
}
//用户权限列表
Set<String> permsSet = new HashSet<>();
for(String perms : permsList){
if(StringUtils.isBlank(perms)){
continue;
}
permsSet.addAll(Arrays.asList(perms.trim().split(",")));
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setStringPermissions(permsSet);
return info;
}
//认证(登录时调用)
protected AuthenticationInfo doGetAuthenticationInfo(AuthentionToken token){
UsernamePasswordToken token = (UsernamePasswordToken)authcToken;
//查询用户信息
SysUserEntity user = new SysUserEntity();
user.setUsername(token.getUsername());
user = sysUserDao.selectOne(user);
//账号不存在
if(user == null) { throw new UnknownAccountException("账号或密码不正确");}
//账号锁定
if(user.getStatus() == 0){throw new LockedAccountException("账号已被锁定,"); }
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,
user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());
return info;
}
(2) 核心算法加密实现
我们设置了一个简单的字符串密码,但在数据表中存的密码不应该存储密码明文,而是存储加密后的字符串。这个加密算法是无法通过任何方式获取到最原始的密码。使用MD5加密算法后,前台用户输入的字符串如何使用MD5加密,需要做的是将当前的Realm 的credentialsMatcher属性,替换Md5 Credentials由于MD5凭据匹配器已过期,建议使用哈希凭据匹配器并设置加密算法。
java
public static final String md5(String password, String salt){
//加密方式
String name = "MD5";
//盐:为了即使相同的密码不同的盐加密后的结果也不同
ByteSource byteSalt = ByteSource.Util.bytes(salt);
Object source = password; //密码
int hashIterations = 1024; //加密次数
SimpleHash result = new SimpleHash(name, source, byteSalt, hashIterations);
return result.toString();
}
7.2 代码优化分析
7.2.1 前端代码优化分析
(1) 通用的方法应该把组件应该给抽离出来,公共使用,便于代码后期维护,敏捷开发。
(2) 有时候写代码,我们经常会在某些地方重复的使用某个功能函数,一般我们会写一个工具包,然后将方法提取出来,放到该文件里面。但我们常常只需要该包里面的某个方法,但是导入的时候却将所有的代码都进行了打包,这样会造成系统资源的浪费。随着引入的文件越来越多,这种问题也会变得越来越明显。
7.2.2 后端代码优化分析
(1) 目前该企业网盘系统是我一个人开发,但是当多人协同一起开发时,又加上本系 统采用SpringCloud技术,涉及到多个服务之间的调用,后期的代码维护和管理会愈加困难,所以后期的一个优化点可以将系统代码结构上模块化划分更清除,很多的东西可以统一提取出来,进行统一管理。例如,我们可以将配置提取出来,单独建立一个应用,其他的应用都依赖该配置,当我们需要修改配置时,我们只需要该一个地方。
(2) 在展示系统首页数据大屏时,响应时间比较不太理想。由于首页大屏设计到许多数据,而且需要对数据进行处理技术,然后将处理完的数据给前端渲染。经过分析,接口耗时主要是去获取系统参数时耗时比较久,这边我们可以采取多线程的方式进行处理,在获取系统数据时我们可以加上多线程,一边获取系统数据时,我们在去处理其他接口。
(3) 本次系统需要频繁的对流进行操作,包括本地文件,分布式文件系统,数据库连接池等,如果我们不及时将流关闭,重复流会被占用,资源得不到释放,最终造成大量的内存垃圾等问题,严重会导致系统瘫痪。因此,在I/O流上操作时,应注意关闭流。
(4) 尽量减少对Try Cache的使用,当系统发生异常时,如果加上了异常捕获,我们加上事务后无法检测到异常,这样无法让事务回滚。所有我们可以预先对一些结果进行判断,减少不必要的异常。
(5) 在代码中的数据运算中,我们可以使用移位运算进行乘法和除法运算,这可以大大提高接口的性能,因为在计算机的底层,位运算是最快和最方便的。但是,代码中对移位操作的理解不太好,因此最好添加相应的注释,以便于以后其他开发的维护。
8 测试
8.1 测试方案设计
8.1.1 测试策略
在企业网盘系统的开发过程中,我们应该对软件中的每一个最小的单元进行单元测试,在Java语言中,单元指的就是一个个的类;在图形界面中,单元测试是指界面、菜单、窗口等在单元测试中,应根据客观实际判断单元的具体含义,并对语法错误进行检查和验证。我们常用的是手动测试,它和黑、白盒测试是有区别的,手动测试依赖于测试人员,按照测试用例一步步完成。与黑白盒测试相比,手动测试工作量更大,而且耗时长。所以,在测试的时间安排方面,我们应该合理安排时间以及测试的进程,要及时的对系统的各个单元及模块进行测试,以免因为没有进行测试出现小问题时,系统已经成型,对于问题出现原因的查找难度会大大增加。
8.1.2 测试进度安排
(1) 在编写模块代码后,通过编写单元测试来验证接口的正确性。
(2) 1月15号以前,对系统后台进行手动测试,然后所以后台系统有个的接口,编写测试用例,并通过Maven插件运行单元测试。
(3) 1月16号到3月31号,对前台进行手动测试,重点测试网盘模块,资源库模块,个人信息设置模块。
(4) 2月上旬,对系统的整体功能进行完整的手动测试.
8.1.3 测试资源
测试一般需要人力、软件和硬件支持。软件资源是我们需要开发工具,这里我们使用的是IDEA,然后该工具里面可以很轻松的集合Maven插件,和Junit Test,很方便我们测试工作的开展。硬件资源主要是服务器,我们每个服务都需要进行部署,才能访问。人力资源是我们在完成系统开发后,需要对各个功能模块编写测试用户,需要人员来将所有的Case进行测试,验证系统的正确性。
8.1.4 关键测试点
星云企业网盘管理系统登录流程;系统后台修改用户角色所拥有的菜单,看不同角色的用户登录系统后,所能查看的菜单是不是一样;系统前台QQ扫码登录流程,在扫完码后,并且在手机版QQ上进行了授权信息的确认,看系统是否有收到推送的消息,能够正确条到用户主界面。
8.2 测试用例构建
8.2.1 测试用例编写约定
(1) 对于系统功能的某个测试点,我们需要从多个角度编写多个测试用例来进行测试。
(2) 对应接口的开发人员也需要进行单元测试,不过这个可以自己决定要否。
(3) 对于编写的测试Case,需要简要的说明测试用例要涉及的操作,可能会影响的范围。
(4) 执行测试用例,需要明确规定各个所需要的输入条件,输出会是什么结果。
8.2.2 测试用例设计
在测试时,我们应该明白测试的目的是什么,需要输入哪些条件,能够获取到怎样的结果。测试时还需要考虑到系统功能的正确性,系统是否符合用户的使用习惯,系统是否具有稳定性,能否适合长时间使用等等。我们不仅需要熟练掌握手工测试的过程、要点和注意事项,还需要测试人员对软件设计、程序的各个模块、功能实现的效果等有足够的了解。
8.2.3 关键测试用例
表 8-1 后台系统测试用例
编号 | 测试内容 | 步骤 | 预期结果 |
---|---|---|---|
1 | 后台登录测试 | 输入正确用户信息、验证码。 | 验证通过,登录成功 |
2 | 后台错误登录测试 | 输入正确的账号、验证码、不正确的密码。 | 弹框告知用户账号、密码不正确 |
3 | 增加用户测试 | 输入用户名、部门、密码、邮箱、手机号码和状态信息后,单击确认按钮。 | 提示操作成功 |
5 | 添加角色信息测试 | 进入用户角色列表也,点击新增按钮,然后填写角色名,所属的部门,备注信息,勾选角色的功能权限和数据权限,点击确定即可。 | 跳转到角色添加界面,提交后,告知用户添加成功。 |
8 | 在线查看网盘文件测试 | 进入网盘管理界面,选择文件类型,点击文件图标即可 | 点击文件后,会弹出文件查看框,点击不同的文件,都可以在线查看,点击放大按钮可以全屏查看,点击关闭按钮可以关闭弹框。 |
9 | 上传文件测试 | 在网盘管理界面,选择文件类型后,点击上传文件,会弹出上传提示框。 | 点击上传本地文件后,会出现文件上传进度条,可以看到文件名,文件大小,文件上传成功后提示已上传,关闭弹出后,文件列表会展示该文件。 |
10 | 下载文件测试 | 在网盘管理界面,点击文件名,然后可以看见下载按钮,点击就可以下载文件。 | 点击下载按钮后,浏览器会弹出文件下载文件进度条。 |
11 | 添加系统菜单测试 | 点击菜单系统管理下面的菜单管理,进入菜单管理界面,点新增菜单,填写完菜单信息后,点击确定。 | 点击新增按钮后,页面会进入菜单新增界面,然后选择菜单,完善菜单信息,包括菜单名,上级菜单,菜单URL,授权标识,菜单图标,点击确定按钮,提示操作成功。 |
12 | 添加数据字典,字典名为空测试 | 在字典管理界面,点击新增按钮,字典名称不填,其他的信息都填写,点击确定按钮。 | 进入字典新增界面,按测试用例输入信息后,点击确定按钮,提示字典名称不能为空 |
表 8-2 前台系统测试用例
编号 | 测试内容 | 步骤 | 预期结果 |
---|---|---|---|
1 | 前台手机号登录测试 | 输入正确的手机号、手机验证码 | 通过验证,登录成功 |
2 | 前台错误账号登录测试 | 输入正确的账号、错误的密码 | 提示账号或密码不正确 |
3 | 上传文件测试 | 登陆前台系统后,进入网盘管理模块,点击上传文件 | 提示操作成功 |
5 | 文件在线查看测试 | 在我的文件列表里面,点击文件名,在线查看文件 | 跳转到角色添加界面,提交后,提示添加成功。 |
7 | 文件链接分享测试 | 在网盘管理模块里面,可以看见文件列表,点击右边的下拉图标,在点击分享文件给用户。 | 点击分享给用户后,会弹出分享资源界面,再点击通过链接分享,然后弹出一个链接弹窗,我们在复制链接,打开查看提取界面,点击提交,提示提取成功。 |
9 | 我的分享删除测试 | 进入分享列表界面,可以看到我的分享和我收到的分享,点击右侧文件上的删除操作按钮 | 在分享列表页里面,点击文件有测的操作删除按钮,提示删除成功,页面进行刷新。 |
11 | 资源库搜索测试 | 在资源库管理模块,我们选择需要的文件类型,在对文件进行搜索。 | 在文件名搜索框里面,当输入了2个以上的字符,会自动请求后台的接口,实时更新页面的数据,点击搜索框右边的清除按钮,会清空搜索框的数据,并重新加载数据。 |
下面我列举了部分测试用例如下所示:
(1) 后台登陆测试
操作步骤:输入正确的账号、密码、验证码。
期望结果:通过验证,登录成功,跳转到后台首页。
实际结果:通过验证,登录成功,跳转到后台首页。
操作界面如图8-1,8-2所示:
图 8-1 后台登录界面
图 8-2 后台登录成功界面
(2) 错误后台登陆测试
操作步骤:输入正确的账号、验证码、错误密码。
期望结果:提示账号或密码不正确。
实际结果:提示账号或密码不正确。
操作界面如图8-3所示:
图 8-3 后台登录失败界面
(3) 前台手机号登陆测试
操作步骤:输入正确的手机号,和验证码。
期望结果:提示登陆成功,跳转到前台系统首页。
实际结果:提示登陆成功,跳转到前台系统首页。
操作界面如图所示8-4,8-5所示:
图 8-4 前台手机号登录界面
图 8-5 前台登录成功界面
(4) 前台错误账号登录测试
操作步骤:输入正确的账号、错误密码。
期望结果:提示用户账号或密码错误。
实际结果:提示用户账号或密码错误。
操作界面如图8-6所示:
图 8-6 前台登录成功界面
(5) 文件在线查看测试
操作步骤:点击文件Logo
期望结果:弹出文件可在线预览框,对图片可以进行旋转,放大放小
实际结果:弹出文件可在线预览框,对图片可以进行旋转,放大放小
操作界面如图8-7,8-8所示:
图 8-7图片在线查看界面
图 8-8 pdf在线查看界面
(6) 发布公告测试
操作步骤:后台发布公告,填写公告信息,发布
期望结果:后台发布成功,前台可以接受到
实际结果:后台发布成功,前台可以接受到
操作界面如图8-9,8-10所示:
图 8-9 公告发布界面
图 8-10 前台公告通知界面
(7) 上传文件测试
操作步骤:点击上传按钮,选择上传的文件。
期望结果:弹出提示框,文件上传完成,列表也进行刷新。
实际结果:弹出提示框,文件上传完成,列表也进行刷新。
操作界面如图8-11所示:
图 8-11 前台文件上传界面
(8) 文件下载测试
操作步骤:点击下载按钮
期望结果:浏览器弹出下载文件框。
实际结果:浏览器弹出下载文件框。
操作界面如图8-12所示:
图 8-12 文件下载界面
(9) 修改用户头像测试
操作步骤:点击更换头像,选择头像 。
期望结果:实时更新头像信息,包括右上角的头像 。
实际结果:实时更新头像信息,包括右上角的头像 。
操作界面如图8-13所示:
图 8-13 前台登录成功界面
8.2.4 测试用例维护
(1) 采用统一的编写规则
当开发一个软件系统时,系统会进行多次迭代,每一次迭代后,相关的测试用例也需要变动。但是在本次项目变更中,我们对系统测试用例编写最后统一采用统一的编写规则,当功能迭代后,我们也可以快速按照编写规则,编写新的测试用例。
(2) 需求变更后需要同步测试用例
软件是在不停的进行迭代,测试用例也需要跟着进行迭代。比如,在某次迭代里面删除了某个功能,那么对应该功能相关的测试用例也要进行删除,保证两边是一致的。这样后期测试的工作量可以减少。
(3) 开发一个对应的管理平台
对应测试人员,企业最好有一个平台可以分部门,通一个部门下的员工可以有权访问部门下的资源,让测试员将测试用例在线同步,这样更方便查看和后期的维护。同时开发一个自动化测试平台,该平台可以读取系统中已经存在的测试用例,对于后期的回归,可以大大减少测试人员的工作量,让自动化测试平台自动检测。
9 总结与展望
9.1 设计工作总结
毕业设计的完成也代表着我们大学生活将结束,毕业系统设计是对同学们综合能力的一个考核,通过这个毕业设计,可以加强我们的自主学习本领、独立思考本领和实战能力。在开始编写代码之前,我调查了市场上现有的许多企业网络磁盘系统,分析了它们的优缺点,进行了多维比较,然后根据用户的需要逐步完善了需求文档。当需求基本确定后,要做好系统的架构设计,然后将系统的功能进行模块化,按照自己的计划,一个一个模块进行开发和实现,这样可以将毕设工作有序的进行下去。
本次毕业设计将SpringCloud、Hadoop和Vue等多种技术进行了整合,系统有两个入口,分别给前台用户使用和管理员使用。前台用户主要是对于企业员工使用的,员工登录系统后,可以查看自己的网盘并且有权对自己的网盘进行文件上传、下载、删除操作,除此之外,可以将自己的文件进行分享。另外,前台系统会接收到系统的消息推送,并在消息通知栏告知给用户,用户可以查看通知详情。后台系统主要是给企业管理员使用,管理员可以将系统的一些配置进行初始化,在刚开始使用本系统时,系统超级管理员需要初始化企业部门信息,系统角色信息,企业用户信息。除了这些基本的功能外,系统后台还提供了日志在线查询功能,在线监控系统状态。我在其中一些模块设计的时候也遇到了许多问题,然后在导师的指导下以及同学的帮助下,还有就是自己查询相关资料下解决了一些,由于本次毕设使用的技术也是非常新的,遇到一些很奇怪的问题,最后自己不断推测,调试,修改慢慢将系统中的问题解决。在本次企业网盘系统开发中,系统还是存在很多问题,由于自己现在所学的技术有些,系统的很多功能和模块的设计还需要进行优化,然后本次系统的需求还是非常简单的,还需要从真实用户考虑,无论是从界面的UI,还是用户的操作行为,都需要进一步完善。通过这次对企业网盘的需求分析,再到最终的实现,让我充满成就感,大大加深我对软件开发的喜爱和认识,我也充分体会到了开发一个产品路途的艰辛和最终收获成功果实的兴奋。
9.2 未来工作展望
开发任何一个系统时,前期一定要充分做好准备工作,只有准备工作充分后,在对系统进行详细的设计时,才能有计划的、有方向的进行。开发设计一个系统还有很多需要我们去学习的地方,我们应该更好的去获取用户的需求,减少不需要的迭代工作。我们不仅要积累更多的软件开发的相关知识,而且要认真做好没一件事,通过实战提高我们的实践能力。在这信息快速发展的时代,互联网开发所需要掌握的技术更新速度非常快,我们只有不断地去学习新的东西,才能更好地走下去。所以,对于软件开发人员来讲,我们要有一颗折腾的心,喜欢研究各种技术,不断探索新知识,丰富自己,才能走得更好,更远,更稳。\ 谢 辞
轻轻马蹄,寂寂流年,时光如流水从我们的指尖倏忽消逝,走的最快的总是时间,来不及感叹,大学生活已经接近尾声了,四年的努力与付出,随着本次论文的完成,将要划下完美的句点。回首过往,自己一生最宝贵的时光能于这样的校园之中,能在众多学富五车和才华横溢的老师们的熏陶下度过,实是荣幸至极。在这四年的时光里,我在学习上和思想上都受益匪浅。这次毕业除了自己的努力之外,与各位老师,同学,朋友和家人的关心,鼓励和支持是分不开的。
论文的编写是枯燥艰辛而有富有挑战的。本次基于SpringCloud+Hadoop+Vue企业网盘系统的设计以及论文的编写是在刘老师的耐心指导下完成的,导师严谨的治学态度、宽以待人、平易近人的人格魅力对我影响深远。从第一次毕业设计的选题到最后系统的实现、从论文的初稿编写到论文的最终完成,期间刘老师时刻关注我们的进度,在我的毕业设计期间,我提前提交了毕业设计的论文初稿,请刘老师进行审阅和修改,老师也将初稿中出现的问题及时向我反馈,同时也提出了一下创新的意见。没有刘老师这样的帮助和耐心指导,我也就不会这么顺利的完成毕业系统设计,在此向刘立月老师表示深深的感谢和崇高的敬意。在临近毕业之际,我还要借此机会向在这三年中给予我诸多教诲和帮助的各位老师表示由衷的谢意,感谢他们三年来的辛勤栽培。不积跬步何以至千里,各位任课老师认真负责,在他们的悉心帮助和支持下,我能够很好的掌握和运用专业知识,并在设计中得以体现,顺利完成毕业论文。同时还要感谢和我一起写毕设的同学,在毕设的这段时间里,你们给了我很大启发,提出了一些宝贵的意见,谢谢他们的互帮互助。
"长风破浪会有时,直挂云帆济沧海",这是我非常喜欢的一句诗词,以此作为结尾,和所有要感谢的人共勉,相信就能看的见,有梦想就有蓝天,相信自己,追逐最初的梦想,永不言弃。
参考文献
[1]方志鹏.深入理解Spring Cloud与微服务构建 [M].北京:人民邮电出版社,2018.3第1版.
[2]林子雨.大数据技术原理与应用 [M]. 北京: 人民邮电出版社,2017.1第2版.
[3]王松.SpringBoot+Vue全栈开发实战 [M]. 北京:清华大学出版社,2018.12.
[4]Tom White著,王海,刘喻等译.Hadoop权威指南第四版 [M].北京:清华大学出版社,2017.
[5]汪云飞编著,JaveEE开发的颠覆者SpringBoot实战.北京:电子工业出版社,2018.
[6]杨保华,戴王剑等著,Docker技术入门与实战 [M].机械工业出版社,2018.9.
[7]陈中,范开勇著,基于Hadoop分布式交通大数据存储分析平台设计 [J].大数据,2018.12.
[8]邹立民.基于Hadoop的分布式数据存储系统应用的研究[D].沈阳工业大学,2018.
[9]S.K.Lakshmanaprabu,K.Shankar,S.Sheeba Rani,Enas Abdulhay,N.Arunkumar,Gustavo Ramirez,J. Uthayakumar.An effect of big data technology with ant colony optimization based routing in vehicular ad hoc networks:Towards smart cities[J].Journal of Cleaner Production,2019,2.17.
[10]Mihai Varga,Alina Petrescu-Nita,Florin Pop. Deadline scheduling algorithm for sustainable computing in Hadoop environment[J]. Computers & Security,2018,7.6.
[11]明日科技.Java从入门到精通.第五版.清华大学出版社.2019.
[12]贺伟,李凤. 基于项目驱动式教学的《Java面向对象程序设计》课程实践[J]. 计算机产品与流通,2019(01):263-264.
[14]陈实.后MOOC时代移动学习视角下的翻转课堂设计---以《JAVA程序设计》为例[J]. 中国多媒体与网络教学学报(上旬刊),2019.
[15]谢金星.基于云存储的网盘系统设计与实现[D].湖南大学,2017.
[16]王韬. 基于版本控制的网盘研究与实现[D].电子科技大学,2018.
[17]杨强,张钧鸣.基于微服务架构的大数据应用开发创新实践[J].电力大数据,2019:71-76.
[18]方意,朱永强,宫学庆.微服务架构下的分布式事务处理[J].计算机应用与软件,2019:152-158.
[19]樊雷.基于Docker的企业级微服务架构设计[J].电脑知识与技术,2018,14(34):25-26.
[20]刘梦飞.我国网盘版权保护问题研究[J].常州工学院学报(社科版),2018,36(04):101-105.
[21]乔晓飞.计算机硬件储存设备与网络储存的发展现状[J].信息与电脑(理论版),2018(08).
[22]陈禹新.个人云储存服务的发展现状与趋势研究[J].福建电脑,2017,33(08):46-47.
[23]范晓玲.基于云存储的高职院校网盘系统设计与实现[J].河北软件职业技术学院学报,2017.
[24]康双勇.信息安全小百科,云存储与信息安全[J].保密科学技术,2017(05):69.
[25]原建伟.中小企业云盘系统的设计与实现[J].电子设计工程,2017,25(07):70-74.
[26]陈韶健. SpringCloud与Docker高并发微服务架构设计实施 [M].北京:电子工业出版社,2018-06-01.
[27](美)妮哈·纳克海德(Neha Narkhede),格温·沙皮拉(Gwen Shapira),托德·帕利诺(Todd Palino). Kafka权威指南 [M]. 北京: 人民邮电出版社,2018-01-01.
[28]林意群.深度剖析HadoopHDFS [M]. 北京:机械工业出版社,2017年08月.
[29][美]保罗·迪布瓦(PaulDuBois)著.MySQL技术内幕 [M]. 北京:人民邮电出版社,2015年07月 第5版.
[30]张帆.Vue.js项目开发实战 [M]. 北京: 机械工业出版社,2018年07月.
[31]闫伟,陈满林,白云鹤,班海涛.基于Hadoop的校园网盘的设计与实现[J].科技创新与应用,2015.
[32]张晓杰. 基于HDFS的可信分布式文件系统研究与设计[D].华南理工大学,2017.
参考文献
- 私有网盘应用系统的设计与实现(电子科技大学·付波)
- 基于Hadoop的分布式数据存储设计与实现(吉林大学·毛剑)
- 云计算管理系统的研究与设计(中国地质大学(北京)·赵晓光)
- 基于SSH框架的人力资源管理系统的设计与开发(电子科技大学·唐伟)
- 基于Spring技术的大型视频网站后台上传系统的设计与实现(南京大学·徐悦轩)
- 某电信业务管理系统的设计与实现(北京邮电大学·张佳豪)
- 云计算管理系统的研究与设计(中国地质大学(北京)·赵晓光)
- 基于GRPC的安全存储系统的设计与实现(北京交通大学·方赢)
- Hadoop平台下的海量数据存储技术研究(东北石油大学·邰建华)
- 某电信业务管理系统的设计与实现(北京邮电大学·张佳豪)
- 小型云存储平台管理系统的设计与实现(电子科技大学·刘亮成)
- 面向中小企业的信息管理系统的设计与实现(北京邮电大学·贾士强)
- 小型云存储平台管理系统的设计与实现(电子科技大学·刘亮成)
- 基于OAuth2.0协议的企业分布式授权系统设计与实现(华中科技大学·支猛)
- 基于Hadoop海量数据微博系统的设计与实现(北京工业大学·吕峰)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕业设计客栈 ,原文地址:https://m.bishedaima.com/yuanma/35688.html