1.图片存储方案

介绍

在实际开发中,我们会有很多处理不同功能的服务器。例如:

应用服务器:负责部署我们的应用

数据库服务器:运行我们的数据库

文件服务器:负责存储用户上传文件的服务器

分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

常见的图片存储方案:

方案一:使用nginx搭建图片服务器

方案二:使用开源的分布式文件存储系统,例如Fastdfs、HDFS等

方案三:使用云存储,例如阿里云、七牛云等

1.1七牛云存储

存储空间创建后,会在左侧的存储空间列表菜单中展示创建的存储空间名称,点击存储空间名称可以查看当前存储空间的相关信息

七牛云提供了多种方式操作对象存储服务,本项目采用Java SDK方式,地址:https://developer.qiniu.com/kodo/sdk/1239/java

1.2使用Java SDK操作七牛云需要导入如下maven坐标:

<dependency>
  <groupId>com.qiniu</groupId>
  <artifactId>qiniu-java-sdk</artifactId>
  <version>7.2.0</version>
</dependency>

1.3鉴权

Java SDK的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key和Secret Key,这对密钥可以在七牛云管理控制台的个人中心(https://portal.qiniu.com/user/key)获得,如下图:

1.4Java SDK操作七牛云

Java SDK完成图片上传和删除

官方文档

//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;try {byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(byteInputStream,key,upToken,null, null);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}
} catch (UnsupportedEncodingException ex) {//ignore
}
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释String accessKey = "your access key";
String secretKey = "your secret key";String bucket = "your bucket name";
String key = "your file key";Auth auth = Auth.create(accessKey, secretKey);
BucketManager bucketManager = new BucketManager(auth, cfg);
try {bucketManager.delete(bucket, key);
} catch (QiniuException ex) {//如果遇到异常,说明删除失败System.err.println(ex.code());System.err.println(ex.response.toString());
}

1.5封装工具类

package com.itheima.utils;import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;/*** 七牛云工具类*/
public class QiniuUtils {public  static String accessKey = "dulF9Wze9bxujtuRvu3yyYb9JX1Sp23jzd3tO708";public  static String secretKey = "vZkhW7iot3uWwcWz9vXfbaP4JepdWADFDHVLMZOe";public  static String bucket = "qiniutest";public static void upload2Qiniu(String filePath,String fileName){//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(Zone.zone0());UploadManager uploadManager = new UploadManager(cfg);Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(filePath, fileName, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);} catch (QiniuException ex) {Response r = ex.response;try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}}//上传文件public static void upload2Qiniu(byte[] bytes, String fileName){//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(Zone.zone0());//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//默认不指定key的情况下,以文件内容的hash值作为文件名String key = fileName;Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(bytes, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}}//删除文件public static void deleteFileFromQiniu(String fileName){//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(Zone.zone0());String key = fileName;Auth auth = Auth.create(accessKey, secretKey);BucketManager bucketManager = new BucketManager(auth, cfg);try {bucketManager.delete(bucket, key);} catch (QiniuException ex) {//如果遇到异常,说明删除失败System.err.println(ex.code());System.err.println(ex.response.toString());}}
}

图片增加

新增套餐

套餐其实就是检查组的集合,例如有一个套餐为“入职体检套餐”,这个检查组可以包括多个检查组:一般检查、血常规、尿常规、肝功三项等。所以在添加套餐时需要选择这个套餐包括的检查组。

套餐对应的实体类为Setmeal,对应的数据表为t_setmeal。套餐和检查组为多对多关系,所以需要中间表t_setmeal_checkgroup进行关联。

前端页面

1.1完善页面

套餐管理页面对应的是setmeal.html页面,根据产品设计的原型已经完成了页面基本结构的编写,现在需要完善页面动态效果。

1.2弹出新增窗口

页面中已经提供了新增窗口,只是出于隐藏状态。只需要将控制展示状态的属性dialogFormVisible改为true接口显示出新增窗口。点击新建按钮时绑定的方法为handleCreate,所以在handleCreate方法中修改dialogFormVisible属性的值为true即可。同时为了增加用户体验度,需要每次点击新建按钮时清空表单输入项。

由于新增套餐时还需要选择此套餐包含的检查组,所以新增套餐窗口分为两部分信息:基本信息和检查组信息,如下图:

新建按钮绑定单击事件,对应的处理函数为handleCreate

1.3动态展示检查组列表

现在虽然已经完成了新增窗口的弹出,但是在检查组信息标签页中需要动态展示所有的检查组信息列表数据,并且可以进行勾选。具体操作步骤如下:

定义数据模型

tableData:[],//添加表单窗口中检查组列表数据
checkgroupIds:[],//添加表单窗口中检查组复选框对应id

1.4完善handleCreate方法,发送ajax请求查询所有检查组数据并将结果赋值给tableData模型数据用于页面表格展示

后端代码

1.5分别在CheckGroupController、

CheckGroupService、

CheckGroupServiceImpl、

CheckGroupDao、

CheckGroupDao.xml中扩展方法查询所有检查组数据

图片上传并预览

此处使用的是ElementUI提供的上传组件el-upload,提供了多种不同的上传效果,上传成功后可以进行预览。

实现步骤:

1.1imageUrl:null,//模型数据,用于上传图片完成后图片预览

1.2定义上传组件:

1.3定义对应的钩子函数:

1.4

ssm项目笔记(五)图片存储方案相关推荐

  1. cocos2dx打飞机项目笔记五:CCSpriteBatchNode 的使用

    在上一节里,在头文件看到 定义了一个 CCSpriteBatchNode* batchNode;,在addEnemy方法里看到 batchNode->addChild(enemy); 新建的敌机 ...

  2. SSM米米商城项目笔笔记五(商品信息多条件查询)

    SSM米米商城项目笔笔记五(商品信息多条件查询) 1.当查询的条件没有数据时,点击查询会展示出所有的上商品信息 2.当输入商品的模糊信息时,就会展示带有模糊信息的数据 3.当选中商品类型的时候就根据类 ...

  3. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  4. 宅急送项目第五天笔记!

    修复bug 1.RegionAction 添加区域时,条件书写错误 if(region.getId()==null || region.getId().equals("")){ } ...

  5. SSM米米商城项目笔记一(数据库表创建和项目搭建)

    米米商城项目笔记一(数据库表创建和项目搭建) 使用的相关技术[当前最新技术]: IDEA:2022+ JDK:1.8 MySQL:8.0+ Maven:3.8+ Tomact:9.0+ 创建数据库信息 ...

  6. 瑞吉外卖项目笔记+踩坑1——基础功能

     导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 1 ...

  7. 论文阅读笔记(五)——狐猴识别系统:一种便于狐猴个体识别的面部识别系统

    论文阅读笔记(五)--狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文简介 论文中文翻译:狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文名称:<LemurFaceID: a fac ...

  8. 部署SSM项目到阿里云服务器ECS

    文章目录 一. 问题背景 二. 准备资源 三. 安装JDK 3.1 下载 3.2 安装 3.3 配置环境变量 四. 安装MySQL 4.1 下载 4.2 解压缩 4.3 修改操作系统配置 4.4 卸载 ...

  9. 管理3.0 学习词汇笔记 五 复杂理论

    词汇管理3.0 学习笔记 五 复杂理论 断言 1.任何复杂问题都有一个清晰,简单但错误的答案.   2.因果律:事情会按计划发生.能计算2061 哈雷重返太阳系,确不能确定下个星期的天气.因素多且关系 ...

最新文章

  1. window10 系统上 ecplise 环境搭建
  2. Attention函数手册
  3. python读取mysql数据_如何将mysql的数据读取python
  4. 【暴力】心中报情(jzoj 2317)
  5. 帝国CMS7.0 7.2 7.5微信登录插件 UTF-8版本
  6. C语言的EOF是什么?getchar()!=EOF返回的是什么?
  7. ES6_Set和WeakSet_note
  8. 手写数字识别代码,可以跑通
  9. mysql中int 5_mysql中int(x)与int以及varchar与char的区别_HelloWorld_ty的博客-CSDN博客
  10. 分享一个基于labview的2048小游戏(附详细教程+代码)
  11. java 游标 查数据_Java中的大量数据查询
  12. Python 爬抖音
  13. JavaScript : 对LHS和RHS两个名词的理解
  14. C#实现网络监控,网络连接是否断开
  15. java状态机(订单状态控制)
  16. 【BYM】Android 仿百度搜索列表滑动效果,写的太详细了
  17. Smooze for Mac(鼠标增强辅助软件)
  18. 基于Python3+PyQt5开发的GUI精美框架界面:导航定位与测量综合系统-GNSSAMS Offcial 1.2.0
  19. 解决国内vscode快速下载办法 下载vscode慢、网络失败的问题
  20. teamcenter快速入门

热门文章

  1. 韦东山jz2440开发板重烧系统
  2. URLencode转换
  3. 【持续更新】树莓派启动与故障系列集锦
  4. Day14.监听器之察看结果树+断言结果+聚合报告+图形结果+用表格察看结果
  5. html中a标签的属性
  6. elevation格式_Google Elevation的工作方式以及如何创建简单的C#应用​​程序?
  7. 苹果手机解压缩软件_解压缩全能王app下载-解压缩全能王app手机版
  8. 三角函数形式的傅里叶级数
  9. word中绘制流程图
  10. Python语言快速入门(上)