EverydayOneCat
☀️OverHeating🌙
图片云存储方案
1.图片存储方案
在实际开发中,我们会有很多处理不同功能的服务器。例如:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
文件服务器:负责存储用户上传文件的服务器
分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。
常见的图片存储方案:
方案一:使用nginx搭建图片服务器
方案二:使用开源的分布式文件存储系统,例如Fastdfs、HDFS等
方案三:使用云存储,例如阿里云、七牛云等
2.七牛云存储
要使用七牛云的服务,首先需要注册成为会员。地址:https://portal.qiniu.com/signup
注意:登录成功后还需要进行实名认证才能进行相关操作。
可以通过七牛云提供的开发者中心学习如何操作七牛云服务,地址:https://developer.qiniu.com/
七牛云提供了多种方式操作对象存储服务,本项目采用Java SDK方式,地址:https://developer.qiniu.com/kodo/sdk/1239/java
Java SDK的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key和Secret Key,这对密钥可以在七牛云管理控制台的个人中心(https://portal.qiniu.com/user/key)获得。
3.封装七牛云工具类
为了方便操作七牛云存储服务,我们可以将官方提供的案例简单改造成一个工具类,在我们的项目中直接使用此工具类来操作就可以:
1 | package com.itheima.utils; |
4.套餐管理中的上传图片
套餐管理和之前的检察管理差不多,这里着重介绍新增套餐中的上传图片。
4.1前端
此处使用的是ElementUI提供的上传组件el-upload,提供了多种不同的上传效果,上传成功后可以进行预览。
(1)定义模型数据,用于后面上传文件的图片预览:
1 | imageUrl:null,//模型数据,用于上传图片完成后图片预览 |
(2)定义上传组件:
1 | <!-- |
(3)定义对应的钩子函数:
1 | //文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象 |
4.2后端
在spring配置文件中配置文件上传组件
1 | <!--文件上传组件--> |
1 |
|
5.定时任务组件Quartz
5.1前面存在的问题
前面我们已经完成了文件上传,将图片存储在了七牛云服务器中。但是这个过程存在一个问题,就是如果用户只上传了图片而没有最终保存套餐信息到我们的数据库,这时我们上传的图片就变为了垃圾图片。对于这些垃圾图片我们需要定时清理来释放磁盘空间。这就需要我们能够区分出来哪些是垃圾图片,哪些不是垃圾图片。
方案就是利用redis来保存图片名称,具体做法为:
1、当用户上传图片后,将图片名称保存到redis的一个Set集合中,例如集合名称为setmealPicResources
2、当用户添加套餐后,将图片名称保存到redis的另一个Set集合中,例如集合名称为setmealPicDbResources
3、计算setmealPicResources集合与setmealPicDbResources集合的差值,结果就是垃圾图片的名称集合,清理这些图片即可
5.2完善文件上传
配置文件spring-redis.xml
1 | <!--Jedis连接池的相关配置--> |
在health_common工程中提供Redis常量类
1 | package com.itheima.constant; |
完善SetmealController,在文件上传成功后将图片名称保存到redis集合中(之前代码已实现)
完善SetmealServiceImpl服务类,在保存完成套餐信息后将图片名称存储到redis集合中(简单实现)
5.3Quartz介绍
Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。
官网:http://www.quartz-scheduler.org/
Quartz其实和SpringTask差不多,都是通过cron表达式灵活的定义出符合要求的程序执行的时间。
这里就不过多介绍cron表达式的使用,具体参见之前写的《品优购系统开发终章—品优购系统业务分析》中的任务调度SpringTask部分。
自己编写表达式还是有一些困难的,我们可以借助一些cron表达式在线生成器来根据我们的需求生成表达式即可。
5.4定时清理垃圾图片
我们基于Quartz定时任务,通过计算redis两个集合的差值找出所有的垃圾图片,就可以将垃圾图片清理掉。
创建maven工程health_jobs,打包方式为war,导入Quartz等相关坐标,配置applicationContext-jobs.xml:
1 |
|
创建ClearImgJob定时任务类
1 | /** |
预约设置
我们需要满足用户方便的管理每天的可预约人数,让用户可以通过操作Excel来方便的实现对数据库预约模块的修改。
这里需要学习java操作Excel的工具——Apache POI。
1.Apache POI
1.1POI介绍
Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。
maven坐标:
1 | <dependency> |
POI结构:
1 | HSSF - 提供读写Microsoft Excel XLS格式档案的功能 |
1.2封装操作Excel工具类
因为代码冗余太严重,将常用操作封装成工具类:
1 | package com.itheima.utils; |
2.通过Excel批量导入预约设置信息
批量导入预约设置信息操作过程:
1、点击模板下载按钮下载Excel模板文件
2、将预约设置信息录入到模板文件中
3、点击上传文件按钮将录入完信息的模板文件上传到服务器
4、通过POI读取上传文件的数据并保存到数据库
2.1前端
为模板下载按钮绑定事件实现模板文件下载
1 | <el-button style="margin-bottom: 20px;margin-right: 20px" type="primary" |
使用ElementUI的上传组件实现文件上传并绑定相关事件
1 | <el-upload action="/ordersetting/upload.do" |
判断文件格式:
1 | //上传之前进行文件格式校验 |
2.2后端
Controller:
1 |
|
Service:
1 |
|
3.日历展示预约设置信息
前面已经完成了预约设置功能,现在就需要通过日历的方式展示出来每天设置的预约人数。
在页面中已经完成了日历的动态展示,我们只需要查询当前月份的预约设置信息并展示到日历中即可,同时在日历中还需要展示已经预约的人数,效果如下:
3.1前端
观察静态页面已有代码,发现显示效果是由leftObj来决定的。数据属性如下:
1 | this.leftobj = [ |
根据当前页面对应的月份查询数据库获取预约设置信息,将查询结果赋值给leftobj模型数据
1 | //发送ajax请求,根据当前页面对应的月份查询预约设置信息 |
3.2后端
这里需要注意,leftObj的属性和OrderSetting的属性名不一样,所以我们需要自定义List< Map >来返回包装的正确数据。
Controller:
1 |
|
Service:
这里需要注意每个月的天数都不一样,但是在数据库中,每个月都查到31号,能把这个月的数据都查完。
1 |
|
Dao:
查询一个月份的所有数据可以用
between 这个月第一天 and 这个月最后一天
1 | <!--根据日期范围查询--> |
4.基于日历实现预约设置
我们也需要实现用户点击页面具体的日期修改当前日期的可预约人数,方便用户对个别有出入的日期其进行更改。
4.1前端
这里用到ElementUI的MessageBox组件。我们从官网粘贴并修改。
1 | //预约设置 |
4.2后端
Controller:
1 |
|
Service:
1 |
|
结语
我什么情话都说不出来,我只想见你一面。
静下来想你,觉得一切都美好得不可思议。
——王小波《爱你就像爱生命》
强推《到了30岁还是处男,似乎会变成魔法师》,男酮狂喜😍