图片统一处理

  1. 为什么要统一处理

微服务中服务集群后,文件夹资源不能共享

解决方案:分布式文件系统

分布式文件系统:多个文件系统通过管理软件进行管理,得到分布式文件系统.

好处:

  1. 海量存储
  2. 高可用

方案选择

方案1:租用别人已经搭建好了的.

阿里云对象存储(收费),七牛云(10G内免费)

好处:方便,小量数据可以

坏处:大量数据时,要花很多钱.

方案2:自己搭建

hdfs(hadoop),FastDfs(国产,小文件)....

我们这里使用Fastdfs

Fastdfs介绍

FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS 架构包括 Tracker server 和 Storage server。

客户端请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。

具体实现步骤;

  1. 搭建fastDfs文件系统
  2. 上传图片
  3. 回显图片

上传和下载流程

客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回,需要客户端自行保存。

虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了

store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。

数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据

文件。

文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储

服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

下载

Fastdfs搭建-一个运维

代码操作fastdfs-入门

需求:将本地图片上传至图片服务器,再控制台打印url

(1)pom.xml中引入

<!-- https://mvnrepository.com/artifact/cn.bestwu/fastdfs-client-java -->
<dependency><groupId>cn.bestwu</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27</version>
</dependency>

(2)添加配置文件fdfs_client.conf

tracker_server=122.51.119.246:22122

(3)创建java类,main方法代码如下:

// 1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。ClientGlobal.init("D:/maven_work/fastDFS-demo/src/fdfs_client.conf");// 2、创建一个 TrackerClient 对象。直接 new 一个。TrackerClient trackerClient = new TrackerClient();// 3、使用 TrackerClient 对象创建连接,获得一个 TrackerServer 对象。TrackerServer trackerServer = trackerClient.getConnection();// 4、创建一个 StorageServer 的引用,值为 nullStorageServer storageServer = null;// 5、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的引用StorageClient storageClient = new StorageClient(trackerServer, storageServer);// 6、使用 StorageClient 对象上传图片。//扩展名不带“.”String[] strings = storageClient.upload_file("D:/pic/benchi.jpg", "jpg",null);// 7、返回数组。包含组名和图片的路径。for (String string : strings) {System.out.println(string);}

控制台输出如下结果:

group1
M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg

在浏览器输入:

http://122.51.119.246/group1/M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jp

后台上传服务

导入jar

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--配置中心支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency>

配置yml

Bootstrap.yml
spring:profiles:active: devcloud:config:name: application-common #github上面名称profile: ${spring.profiles.active} #环境 java -jar -D xxx jarlabel: master #分支discovery:enabled: true #从eureka上面找配置服务service-id: hrm-config-server #指定服务名#uri: http://127.0.0.1:1299 #配置服务器 单机配置
eureka: #eureka不能放到远程配置中client:service-url:defaultZone: http://localhost:1010/eureka  #告诉服务提供者要把服务注册到哪儿 #单机环境instance:prefer-ip-address: true #显示客户端真实ip

配置库 application-common-dev.yml

server:port: 2090
spring:application:name: hrm-common

通过网关访问的配置:

zuul:routes:sysmanage.serviceId: hrm-sysmanage #这是调用满足条件的服务名,注意要小写sysmanage.path: /sysmanage/** #这是所有路径前的通配common.serviceId: hrm-common #这是调用满足条件的服务名,注意要小写common.path: /common/** #这是所有路径前的通配course.serviceId: hrm-course #这是调用满足条件的服务名,注意要小写course.path: /course/** #这是所有路径前的通配ignored-services: "*" #用*来通配符,忽略从9527端口通过服务名来调用prefix: "/services" #这是所有路径的前缀
retryable: true #是否重试

Swagger

@Configuration
@EnableSwagger2
public class Swagger2 {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//对外暴露服务的包,以controller的方式暴露,所以就是controller的包..apis(RequestHandlerSelectors.basePackage("com.zhanglin.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("公共服务api").description("公共服务接口文档说明").contact(new Contact("zltest", "", "zl@itsource.cn")).version("1.0").build();}}

入口类

@SpringBootApplication
@EnableEurekaClient
public class CommonService2090Application {public static void main(String[] args) {SpringApplication.run(CommonService2090Application .class, args);}
}

测试

http://localhost:1030/swagger-ui.html

实现fastdfs服务(配置参照上面)

@RestController
public class FastDfsController {@RequestMapping(value = "/upload",method = RequestMethod.POST)public AjaxResult upload(@RequestParam(value = "file",required = true)MultipartFile file){try {System.out.println(file.getOriginalFilename() + ":" + file.getSize());String originalFilename = file.getOriginalFilename();// xxx.jpgString extName = originalFilename.substring(originalFilename.lastIndexOf(".")+1);System.out.println(extName);String filePath =  FastDfsApiOpr.upload(file.getBytes(), extName);return AjaxResult.me().setResultObj(filePath);} catch (IOException e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage("上传失败!"+e.getMessage());}}// /goup1/xxxxx/yyyy@RequestMapping(value = "/del",method = RequestMethod.DELETE)public AjaxResult upload(@RequestParam(value = "filePath",required = true)String filePath){String pathTmp = filePath.substring(1); // goup1/xxxxx/yyyyString groupName =  pathTmp.substring(0, pathTmp.indexOf("/")); //goup1String remotePath = pathTmp.substring(pathTmp.indexOf("/"));// /xxxxx/yyyyFastDfsApiOpr.delete(groupName, remotePath);return  AjaxResult.me();}
}

前端文件上传

<el-uploadclass="upload-demo"action="http://127.0.0.1:9527/services/common/upload":on-preview="handlePreview":on-remove="handleRemove":file-list="fileList2":on-success="handleSuccess"list-type="picture"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>

缩略图数据:

课程中心功能分析

课程中心-后台服务搭建

创建模块

父工程:hrm_course_parent

子工程:

hrm_course_common:    domain,query,client feign接口(内部服务调用)

hrm_course_service: controller,service,mapper

common:

导入pom

<dependencies><!--不能直接依赖starter,有自动配置,而消费者是不需要额。--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>cn.itsource.agiou</groupId><artifactId>basic_util</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

Service:

<dependencies><!--所有provider公共依賴--><dependency><groupId>cn.itsource.hrm</groupId><artifactId>course_interface</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--配置中心支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency></dependencies>

配置yml

Bootstrap.yml
spring:profiles:active: devcloud:config:name: application-common #github上面名称profile: ${spring.profiles.active} #环境 java -jar -D xxx jarlabel: master #分支discovery:enabled: true #从eureka上面找配置服务service-id: hrm-config-server #指定服务名#uri: http://127.0.0.1:1299 #配置服务器 单机配置
eureka: #eureka不能放到远程配置中client:service-url:defaultZone: http://localhost:1010/eureka  #告诉服务提供者要把服务注册到哪儿 #单机环境instance:prefer-ip-address: true #显示客户端真实ip

配置库 application-common-dev.yml

server:port: 2090
spring:application:name: hrm-common

配置网关,swagger,入口类

课程中心

课程类型树

树形数据无限极获取

controller

@GetMapping("/treeData")public List<CourseType> treeData() {return courseTypeService.treeData(0L);}

service:

/*** 获取多级菜单* @param pid* @return*/List<CourseType> treeData(long pid);
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {@Autowiredprivate CourseTypeMapper courseTypeMapper;@Overridepublic List<CourseType> treeData(long pid) {return treeDataRecursion(pid);}//递归思想private List<CourseType> treeDataRecursion(long pid) {List<CourseType> children = courseTypeMapper.selectList(new EntityWrapper<CourseType>().eq("pid", pid));//返回条件if (children==null || children.size()<1){return null;}for (CourseType child : children) {//自己调用自己List<CourseType> cTmp = treeDataRecursion(child.getId());child.setChildren(cTmp);}return children;}

SAAS-HRM-day4相关推荐

  1. saas php7框架开源,HRM SAAS v2.5.7 – PHP人力资源管理系统SaaS平台版

    释放双眼,带上耳机,听听看~! 系统简介 HRM是一套完整的HR管理解决方案,可管理员工,出勤,办公费用以及许多其他事情. HRM SAAS是基于PHP MySQL开发的一款人力资源管理系统运营版,程 ...

  2. hrm系统源码php,HRM SAAS v2.6.0 – PHP人力资源管理系统SaaS平台版

    释放双眼,带上耳机,听听看~! 系统简介 HRM是一套完整的HR管理解决方案,可管理员工,出勤,办公费用以及许多其他事情. HRM SAAS是基于PHP MySQL开发的一款人力资源管理系统运营版,程 ...

  3. php人力资源,HRM SAAS v2.5.7 – PHP人力资源管理系统SaaS平台版+免费分享

    系统简介 HRM是一套完整的HR管理解决方案,可管理员工,出勤,办公费用以及许多其他事情. 在线演示 https://hrm-saas.froid.works 管理员: Email: admin@ex ...

  4. 2019年中国企业级SaaS行业研究报告

    中国企业信息化水平与经济总量的关系极不平衡:SaaS作为突破口拉近中国与领先国家之间的差距:2018年中国GDP占全球的比例达到15.8%,IT支出占比仅为3.7%,企业信息化发展水平滞后:企业级Sa ...

  5. [转] SAAS, PAAS, IAAS

    [转] SAAS, PAAS, IAAS SaaS:软件即服务.如CRM.HRM.SCM等等,是可以直接使用的,所以是和多数用户接触最多的一个层面,典型的比如CRM类软件SalesForce. Paa ...

  6. 【干货】深入B端SaaS产品设计核心理念

    本文讨论"为什么采用SaaS模式"."SaaS产品有哪些"以及"如何做好SaaS产品设计"三个话题,核心是产品设计,主要从需求定义.方案设计 ...

  7. Serverless在SaaS领域的最佳实践

    简介: 特别对于当下的经济环境,SaaS厂商要明白,不能再通过烧钱的方式,只关注在自己的用户数量上,而更多的要思考如何帮助客户降低成本.增加效率,所以需要将更多的精力放在自己产品的定制化能力上. 作者 ...

  8. SaaS的行业概述及发展现状

    2015年是个互联网产品的分水岭,那时候C端产品渐渐褪去热度,B端产品渐渐崭露头角进而匀速发展.近年来SaaS慢慢进入大众视野,逐渐普及并渗透到我们日常的生活工作当中,或许你正在使用SaaS服务,但对 ...

  9. 不玩虚的!深入B端SaaS产品设计核心理念【干货】

    [前言] 本文讨论"为什么采用SaaS模式"."SaaS产品有哪些"以及"如何做好SaaS产品设计"三个话题,核心是产品设计,主要从需求定义 ...

  10. 好文:中国Saas蜕变史

    全文内容涵盖了 10 家 SaaS 企业的中国本地化商业落地方式. 『主要内容』 舶来品:SaaS 1.0 中国落地:SaaS 2.0 新 SaaS 机会的特点和趋势 展望:产业互联网中的 SaaS ...

最新文章

  1. 【强化学习篇】--强化学习从初识到应用
  2. 国内最牛的Java面试八股,真offer收割机!
  3. 谷歌最新薪资曝光:研究岗年薪最高达200多万,但远逊于人事主管
  4. Android人脸识别App(带web上传注册信息)
  5. 互联网的尽头是乡村振兴
  6. Boost:boost::bimaps::set_of的测试程序
  7. bash: ./make_ext4fs: No such file or directory 错误解决方法
  8. c语言字符串输出瘕b,c语言课件10tt函数(1)幻灯片资料(51页)-原创力文档
  9. 北京理工大学计算机学院乔磊,邸慧军_北京理工大学计算机学院
  10. 你有真正理解 Java 的类加载机制吗?| 原力计划
  11. python天下第一什么梗_「PHP 是最好的语言」这个梗是怎么来的?
  12. Documentation目录下的as-iosched.txt文档翻译
  13. tp5可以请求到linux根目录么,TP5 获取项目根目录路径
  14. Truecrypt加密软件文件检测
  15. arduino中利用LiquidCrystal内置的scrool函数实现屏幕文字滚动播放
  16. 阿里云域名怎么注册和使用(新手教程)
  17. 行政执法岗、基层岗申论必背
  18. 一读就错的68个姓氏,第一个就读错了
  19. 基于安卓的校园二手跳蚤市场APP设计与实现.rar(项目源码+论文)
  20. 一种中文字符串相似度算法

热门文章

  1. 小米AI音响的拆解及简要系统分析
  2. 惠普z800工作站bios设置_惠普台式机装win10系统及bios设置(uefi+gpt)
  3. aop日志 android,ASM实现Android APK的AOP日志统计
  4. Windows虚拟桌面
  5. 微信和QQ,终于可以互通了!
  6. 南昌航空大学961数据结构真题答案
  7. 蓝桥杯2015年第六届C/C++省赛A组第三题-奇妙的数字
  8. MDI Jade6.5安装教程-附安装包
  9. pillow英文手册
  10. Android生成签名文件对应用签名 Android签名作用