暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

前后端分离开发(后端)(一)

JAVA不归路 2021-09-09
903

统一结果返回

统一状态码

package com.baidu.commonutils;

public interface ResultCode {
    public static Integer SUCCESS = 20000;//状态码:成功
    public static Integer ERROR = 20001;//失败
}

返回统一实体类

package com.baidu.commonutils;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一结果返回类,方法内返回this,方便链式编程
 */

@Data
public class R {
    @ApiModelProperty(value = "是否成功")
    private Boolean success;
    @ApiModelProperty(value = "返回码")
    private Integer code;
    @ApiModelProperty(value = "返回消息")
    private String message;
    @ApiModelProperty(value = "返回数据")
    private Map<String,Object> data = new HashMap<>();

    private R(){}

    public static R ok(){
        R r = new R();
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        r.setSuccess(true);
        return r;
    }
    public static R error(){
        R r = new R();
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        r.setSuccess(false);
        return r;
    }
    public R success(Boolean success){
        this.setSuccess(success);
        return this;
    }
    public R message(String message){
        this.setMessage(message);
        return this;
    }
    public R code(Integer code){
        this.setCode(code);
        return this;
    }
    public R data(String key,Object value){
        this.data.put(key,value);
        return this;
    }
    public R data(Map<String,Object> map){
        this.setData(map);
        return this;
    }


}

示例:

  @GetMapping("findAll")
    public R findAll() {
        List<EduTeacher> list = eduTeacherService.list(null);
        return R.ok().data("item", list);  //统一返回R类
    }

统一异常处理

package com.baidu.handler;



import com.baidu.commonutils.R;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * 统一异常处理
 */

@ControllerAdvice
public class GlobalExceptionHandler  {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        return  R.error().message("全局异常处理执行了...");
    }
/**
*可以自定义处理异常
*/

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(GuliException e){
        e.printStackTrace();
        return  R.error().code(e.getCode()).message(e.getMsg());
    }

}

自定义异常类

package com.baidu.handler;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GuliException extends  RuntimeException {
    private Integer code;
    private String msg;
}

后端整合swagger

(http://localhost:8001/swagger-ui.html)

package com.baidu.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket webApiConfig(){

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")         //name
                .apiInfo(webApiInfo())        //下面的方法
                .select()
               .paths(Predicates.not(PathSelectors.regex("/admin/.*")))//含有admin路径不显示
                .paths(Predicates.not(PathSelectors.regex("/error.*")))//含有error不显示
                .build();

    }

    private ApiInfo webApiInfo(){

        return new ApiInfoBuilder()
                .title("网站-课程中心API文档")        //标题
                .description("本文档描述了课程中心微服务接口定义"//描述
                .version("1.0")        //版本
                .contact(new Contact("zhangsan""http://baidu.com""2366508910@qq.com"))  //其他相关信息
                .build();
    }
}

项目整合阿里云oss存储

官方文档:https://www.aliyun.com/sswd/423470-1.html

pom依赖

 <!-- 阿里云oss依赖 -->
<dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.8.0</version>
</dependency>

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=yourkey
aliyun.oss.file.keysecret=yourkeyset
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=zhangsan00

# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

放置常量的工具类

package com.baidu.utils;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@Component

public class ConstanPropertyUtils implements InitializingBean {
    @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 ENDPOINT;
    public static String KEYID;
    public static String KEYSECRET;
    public static String BUCKETNAME;
    //该方法在上面四个变量初始化后执行
    @Override
    public void afterPropertiesSet() throws Exception {
        ENDPOINT = this.endPoint;
        KEYID = this.keyId;
        KEYSECRET = this.keySecret;
        BUCKETNAME = this.bucketName;
    }
}

获取上传文件存储到oss中(返回存储路径)

package com.baidu.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.baidu.service.OssService;
import com.baidu.utils.ConstanPropertyUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

@Service
public class OssServiceImpl implements OssService {
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = ConstanPropertyUtils.ENDPOINT;
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = ConstanPropertyUtils.KEYID;
        String accessKeySecret = ConstanPropertyUtils.KEYSECRET;
        String bucketName = ConstanPropertyUtils.BUCKETNAME;
        //获取文件名

        String fileName = file.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-""");
        fileName = uuid + fileName;
        //获取当前时间  年/月/日  根据时间来存储,目录分类
        String date = new DateTime().toString("yyyy/MM/dd");
        fileName = date+"/" + fileName ;
        try{
            // 创建OSSClient实例。
            //参数1 地域节点  参数2 图片路径+图片名/图片名  参数3  密匙密码
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 上传文件流。
            InputStream inputStream = file.getInputStream();
            ossClient.putObject(bucketName, fileName, inputStream);
    // https://zhangsan00.oss-cn-beijing.aliyuncs.com/mm.jpg
// 关闭OSSClient。
            ossClient.shutdown();
            String url = "https://"+bucketName+"."+endpoint+"/"+fileName;

            return url;//返回存储路径
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }
}

controller得到存储路径并返回给前端

   @PostMapping("upload")
    public R fileUpload(MultipartFile file){

        String url = ossService.uploadFileAvatar(file);

        return R.ok().data("url",url);
    }

使用EasyExcel对excel文件读写

(文档:https://alibaba-easyexcel.github.io/index.html)

示例代码

//创建读的监听器
public class ExcelListener extends AnalysisEventListener<DemoData{
    //一行一行读取  第一个参数为每行内容
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        System.out.println(demoData);
    }
    //读取表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头"+headMap);
    }
    //读取完成后执行的方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

    //写
    @Test
  public  void test01(){
        String path = "E:/write.xls";//表格路径
                        //excel表格路径 实体类.class       表名                  获取list集合
        EasyExcel.write(path,DemoData.class).sheet("学生表").doWrite(getList());//写操作
    }
    //读
    @Test
    public  void test02(){
        String path = "E:/write.xls";//表格路径
                    //excel表格路径      实体类.class       表名         获取list集合
        EasyExcel.read(path, DemoData.class, new ExcelListener()).sheet().doRead();
    }

    private List<DemoData> getList(){
        List<DemoData> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            DemoData demoData = new DemoData();//学生实体类,有name和id属性
            demoData.setSno(i);
            demoData.setSname("lucy"+i);
            list.add(demoData);
        }
        return  list;
    }


文章转载自JAVA不归路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论