码云仓库地址
这里使用的通用mapper是我之前学习tensquare没有注意到的。
**tk.mybatis:**有了这个依赖,我们就可以不用写sql语句,真正实现了开发零sql。
tk.mybatis
mapper-spring-boot-starter
2.0.4
mysql
mysql-connector-java
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.3
这里可以值得一学的就是在需要做条件查询的时候,我们设计自己想要的查询模式。
/**
* 条件查询
* @param brand
* @return
*/
@Override
public List findList(Brand brand){
//构建查询条件
Example example = createExample(brand);
//根据构建的条件查询数据
return brandMapper.selectByExample(example);
}
/**
* 构建查询对象
* @param brand
* @return
*/
public Example createExample(Brand brand){
Example example=new Example(Brand.class);
Example.Criteria criteria = example.createCriteria();
if(brand!=null){
// 品牌名称
if(!StringUtils.isEmpty(brand.getName())){
criteria.andLike("name","%"+brand.getName()+"%");
}
// 品牌图片地址
if(!StringUtils.isEmpty(brand.getImage())){
criteria.andLike("image","%"+brand.getImage()+"%");
}
// 品牌的首字母
if(!StringUtils.isEmpty(brand.getLetter())){
criteria.andLike("letter","%"+brand.getLetter()+"%");
}
// 品牌id
if(!StringUtils.isEmpty(brand.getLetter())){
criteria.andEqualTo("id",brand.getId());
}
// 排序
if(!StringUtils.isEmpty(brand.getSeq())){
criteria.andEqualTo("seq",brand.getSeq());
}
}
return example;
}
为了使我们的代码更容易维护,我们创建一个类集中处理异常,该异常类可以创建在changgou-common工程中,创建com.changgou.framework.exception.BaseExceptionHandler,代码如下:
@ControllerAdvice
public class BaseExceptionHandler {
/***
* 异常处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(Exception e) {
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}
注意:@ControllerAdvice注解,全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获。
FastDFS是一个分布式文件管理系统(轻量级)、功能包括: 文件存储、文件同步、文件访问(文件上传、文件下载)等 。 解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
主要结构:Tracker server 和 Storage server
Tracker server : 主要负责作为Storage server 通信路由,类似于分布式中的Eureka注册中心,
Storage server :主要负责存储文件,同步备份。
1、客户端通过连接Tracker server ,
2、Storage server 定时向Tracker反应存活状态
3、发现哪个Storage可用,向用户返回Sotrage的信息。
4、用户拿到Storage信息,直接连接Storage,上传文件。
5、Storage生成file_id(等路径信息和文件名),客户端存储文件。
组名:文件上传后所在的 storage 组名称,在文件上传成功后有storage 服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项store_path*对应。如果配置了
store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。
数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据
文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储
服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
1、使用Docker技术安装FastDFS
安装FastDFS
docker pull morunchang/fastdfs
创建容器,运行
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.s
docker run -d --name storage --net=host -e TRACKER_IP=192.168.211.132:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
这里介绍一下–net=host,是docker的一种网络连接模式
Docker网络连接模式
2、配置Nginx
Nginx在这里主要提供对FastDFS图片访问的支持,Docker容器中已经集成了Nginx,我们需要修改nginx的配置,进入storage的容器内部,修改nginx.conf ,用户需要通过nginx对图片对图片进行访问。
docker exec -it storage /bin/bash
进入后
vi /etc/nginx/conf/nginx.conf
location ~ /M00 {
root /data/fast_data/data;
ngx_fastdfs_module;
}
设置开机启动
docker update --restart=always tracker
docker update --restart=always storage
1、pom文件依赖
net.oschina.zcx7878
fastdfs-client-java
1.27.0.0
2、对象的文件信息封装
public class FastDFSFile implements Serializable {
//文件名字
private String name;
//文件内容
private byte[] content;
//文件扩展名
private String ext;
//文件MD5摘要值
private String md5;
//文件创建作者
private String author;
public FastDFSFile(String name, byte[] content, String ext, String md5, String author) {
this.name = name;
this.content = content;
this.ext = ext;
this.md5 = md5;
this.author = author;
}
public FastDFSFile(String name, byte[] content, String ext) {
this.name = name;
this.content = content;
this.ext = ext;
}
public FastDFSFile() {
}
//..get..set..toString
}
@Test
public void upload() throws Exception {
//加载全局的配置文件
ClientGlobal.init("C:\\Users\\Administrator\\IdeaProjects\\beike\\changgou\\changgou-service\\changgou-service-file\\src\\main\\resources\\fdfs_client.conf");
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
//获取StorageClient对象
StorageClient storageClient = new StorageClient(trackerServer, null);
//执行文件上传
String[] jpgs = storageClient.upload_file("C:\\Users\\Administrator\\Pictures\\5b13cd6cN8e12d4aa.jpg", "jpg", null);
for (String jpg : jpgs) {
System.out.println(jpg);
}
}
@Test
public void delete() throws Exception {
//加载全局的配置文件
ClientGlobal.init("C:\\Users\\Administrator\\IdeaProjects\\beike\\changgou\\changgou-service\\changgou-service-file\\src\\main\\resources\\fdfs_client.conf");
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
//获取StorageClient对象
StorageClient storageClient = new StorageClient(trackerServer, null);
//执行文件上传
int group1 = storageClient.delete_file("group1", "M00/00/00/wKjThF1VEiyAJ0xzAANdC6JX9KA522.jpg");
System.out.println(group1);
}
@Test
public void download() throws Exception {
//加载全局的配置文件
ClientGlobal.init("C:\\Users\\Administrator\\IdeaProjects\\beike\\changgou\\changgou-service\\changgou-service-file\\src\\main\\resources\\fdfs_client.conf");
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
//获取StorageClient对象
StorageClient storageClient = new StorageClient(trackerServer, null);
//执行文件上传
byte[] bytes = storageClient.download_file("group1", "M00/00/00/wKjThF1VFfKAJRJDAANdC6JX9KA980.jpg");
File file = new File("D:\\ceshi\\1234.jpg");
FileOutputStream fileOutputStream = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
bufferedOutputStream.write(bytes);
bufferedOutputStream.close();
fileOutputStream.close();
}
//获取文件的信息数据
@Test
public void getFileInfo() throws Exception {
//加载全局的配置文件
ClientGlobal.init("C:\\Users\\Administrator\\IdeaProjects\\beike\\changgou\\changgou-service\\changgou-service-file\\src\\main\\resources\\fdfs_client.conf");
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
//获取StorageClient对象
StorageClient storageClient = new StorageClient(trackerServer, null);
//执行文件上传
FileInfo group1 = storageClient.get_file_info("group1", "M00/00/00/wKjThF1VFfKAJRJDAANdC6JX9KA980.jpg");
System.out.println(group1);
}
//获取组相关的信息
@Test
public void getGroupInfo() throws Exception {
//加载全局的配置文件
ClientGlobal.init("C:\\Users\\Administrator\\IdeaProjects\\beike\\changgou\\changgou-service\\changgou-service-file\\src\\main\\resources\\fdfs_client.conf");
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer group1 = trackerClient.getStoreStorage(trackerServer, "group1");
System.out.println(group1.getStorePathIndex());
//组对应的服务器的地址 因为有可能有多个服务器.
ServerInfo[] group1s = trackerClient.getFetchStorages(trackerServer, "group1", "M00/00/00/wKjThF1VFfKAJRJDAANdC6JX9KA980.jpg");
for (ServerInfo serverInfo : group1s) {
System.out.println(serverInfo.getIpAddr());
System.out.println(serverInfo.getPort());
}
}
@Test
public void getTrackerInfo() throws Exception {
//加载全局的配置文件
ClientGlobal.init("C:\\Users\\Administrator\\IdeaProjects\\beike\\changgou\\changgou-service\\changgou-service-file\\src\\main\\resources\\fdfs_client.conf");
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
InetSocketAddress inetSocketAddress = trackerServer.getInetSocketAddress();
System.out.println(inetSocketAddress);
}
}