项目第六天
- Nginx使用,另外一个端口
- 1、添加讲师实现头像上传功能
- 1)阿里云oss存储服务
- 2、添加课程分类功能
- 1)使用EasyExcel读取excel内容添加数据
- 3、课程分类列表
- 1)树形结构显示
1、对象存储OSS
- 为了解决海量数据存储与弹性扩容,项目中采用云存储的解决方案-阿里云OSS
2、java代码操作阿里云oss
-
上传文件到阿里云oss操作
-
1、准备工作:创建操作阿里云oss许可证(阿里云颁发id和密钥)
-
2、在service创建子模块service_oss
-
3、在service_oss引入依赖
-
<!-- 引入依赖--> <dependencies> <!-- 阿里云oss依赖--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency> <!-- 日期工具栏依赖--> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> </dependencies>
-
-
4、配置application.properties
-
# 服务端口 server.port=8002 # 服务名 spring.application.name=service-oss # 环境配置:dev test prod spring.profiles.active=dev # 阿里云oss # 不同的服务器,地址不同 aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com aliyun.oss.file.keyid=LTAI5tQd3TDj38JEekixQvAH aliyun.oss.file.keysecret=ad7VeFIdeJZDMd1znSjARupMWTBFQr # bucket可以在控制台创建,也可以使用java代码创建 aliyun.oss.file.bucketname=guli-file-conch
-
3、java上传代码
1、创建常量类,读取配置文件内容
-
package com.atguigu.oss.utils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * @author pkk * @version 1.0 * @date 2022/6/28 18:02 * 常量属性读取工具类,读取配置文件里面的内容 * */ //当项目已启动,spring接口,spring加载之后,执行接口中的一个方法 @Component public class ConstantPropertiesUtils implements InitializingBean { // 读取配置文件中的内容 // value:属性注入,将value的值注入到属性中 @Value("${aliyun.oss.file.endpoint}") private String endpoint; @Value("${aliyun.oss.file.keyid}") private String keyId; @Value("${aliyun.oss.file.keysecret}") private String keySecret; @Value("${aliyun.oss.file.bucketname}") private String bucketName; // 定义公开静态常量 // 就可以通过类名.方法名,直接调用 public static String END_POIND; public static String ACCESS_KEY_ID; public static String ACCESS_KEY_SECRET; public static String BUCKET_NAME; @Override public void afterPropertiesSet() throws Exception { END_POIND = endpoint; ACCESS_KEY_ID = keyId; ACCESS_KEY_SECRET = keySecret; BUCKET_NAME = bucketName; } }
2、创建controller,创建service
-
@RestController @RequestMapping("/eduoss/fileoss") public class OssController { @Autowired private OssService ossService; // 上传头像的方法 @PostMapping public R uploadOssFile(MultipartFile file) { // 获取上传的文件 MultipartFile // 返回上传到oss的路径 String url = ossService.uploadFileAvatar(file); return R.ok().data("url",url); } }
3、在service实现上传文件到oss过程
-
package com.atguigu.oss.service.impl; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.atguigu.oss.service.OssService; import com.atguigu.oss.utils.ConstantPropertiesUtils; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * @author pkk * @version 1.0 * @date 2022/6/29 9:58 */ @Service public class OssServiceImpl implements OssService { // 上传头像到oss @Override public String uploadFileAvatar(MultipartFile file) { // 通过工具类获取值 String endpoint = ConstantPropertiesUtils.END_POIND; String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID; String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET; String bucketName = ConstantPropertiesUtils.BUCKET_NAME; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { // 上传文件流 // 通过文件输入流MultipartFile获取前端传入的文件 InputStream inputStream = file.getInputStream(); // 获取文件名称 String fileName = file.getOriginalFilename(); // 用oss方法实现上传 // 第一个参数:传入BucketName // 第二个参数:上传到oss文件路径和文件名称 /aa/bb/1.jpg // 第三个参数:上传文件的输入流 ossClient.putObject(bucketName,fileName,inputStream); // 关闭OSSClient ossClient.shutdown(); // 把上传之后文件路径返回 // 需要把上传到阿里云oss路径手动拼接出来 // https://guli-file-conch.oss-cn-beijing.aliyuncs.com/1.jpg String url = "https://"+bucketName+"."+endpoint+"/"+fileName; return url; } catch (IOException e) { e.printStackTrace(); return null; } } }
4、问题
5、Nginx使用
- 反向代理服务器 – 特点:使用cmd启动nginx,如果关闭cmd窗口,nginx不会停止的
5.1、请求转发
5.2、负载均衡
5.3、动静分离
- 将图片和java,js文件分成不同的服务器
5.4、配置nginx实现请求转发的功能
-
1、找到nginx配置文件
-
2、在nginx.conf进行配置
-
1)修改nginx默认端口,把80修改81
-
2)配置nginx转发规则
- 在http{}里面创建配置
- 在http{}里面创建配置
-
3)修改前端请求地址改为nginx地址
-
4)需要把nginx重新启动,先关闭后启动
-
6、添加讲师实现上传头像前端整合
1、在添加讲师页面,创建上传组件,实现上传
- 使用element-ui组件
2、添加讲师页面使用这个复制上传组件
- 从课件复制上传组件代码
3、使用组件
- *.data()定义变量和初始值
4、引入组件,声明组件
5、修改上传接口地址
6、编写close方法和上传成功的方法
7、课程分类管理
-
课程名称:java基础开发课程, 课程名称:vue高级开发课程
-
分类 后端开发
-
分类 前端开发
-
-
用技术读取excel表格
7.1、EasyExcel
7.1.1、简介
- Java领域解析,生成Excel比较有名的框架有Apache poi、jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc
- EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大的减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行一行读取数据,逐个解析
- EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
7.1.2、EasyExcel操作excel进行读和写操作
-
使用EasyExcel进行写操作
-
1、引入依赖
-
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency>
-
-
2、创建实体类,和excel数据对应,根据列数定义属性
-
3、
-
-
使用EasyExcel实现读操作
-
1、创建和excel对应的实体类,标记对应列关系
-
2、创建监听进行excel文件读取
-
/** * @author pkk * @version 1.0 * @date 2022/6/30 11:12 */ public class ExcelListener extends AnalysisEventListener<DemoData> { // 一行一行读取excel内容 @Override public void invoke(DemoData data, AnalysisContext analysisContext) { System.out.println("****"+data); } // 读取表头内容 @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { System.out.println("表头:"+headMap); } // 读取完成之后 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) {} }
-
-
3、最终方法调用
-
7.2、课程分类添加功能
7.2.1、引入easyexcel依赖
7.2.2、使用代码生成器把课程分类代码生成
7.2.3、创建实体类和excel对应关系
-
@Data public class SubjectData { // 一级分类 @ExcelProperty(index = 0) private String oneSubjectName; @ExcelProperty(index = 1) private String twoSubjectName; }
7.2.4、创建监听器