项目第六天

项目第六天

  • 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、问题

  • 1、多次上传相同名称文件,造成,最后一次传把之前上传的文件覆盖
    • 在文件名称添加随机的唯一值,让每个文件名称不同

  • 2、把文件进行分类管理
    • 根据日期进行分类

      • 在这里插入图片描述
    • 实现年月日分类

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{}里面创建配置
        • 在这里插入图片描述
    • 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、创建监听器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值