01 搭建后端项目

搭建后端项目

一、后端项目框架

  • springboot-web
  • mybatis-plus
  • sa-token
  • swagger
  • qiniu
  • mysql
  • juint

二、新建项目并与远端仓库连接

1. 创建项目、选择依赖

image-20220616194450129

image-20220616195019345

2. 更改启动banner

  • 在项目目录中的src/main/resources目录下新建banner.txt文件,输入的文本内容将打印在启动时输出。

image-20220616200017599

TgM

将上述图片通过在线网站转化为ASCLL图,复制进去,最终效果如下图

image-20220616200332467

3. 初始化本地仓库

image-20220616200424696

image-20220616200430905

image-20220616200450295

4. 首次提交,选择需要被管理的文件

配置.ignore文件,最外层的,这样不应该被提交的不会自动提交

HELP.md
target/
!**/src/main/**
!**/src/test/**

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
.log

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.mvn
mvnw*

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/

### VS Code ###
.vscode/

### generated files ###
bin/
gen/

### MAC ###
.DS_Store

### Other ###
logs/
log
temp/

image-20220616201513479

5. 关联远程仓库(gitee)

image-20220616201705034

image-20220616201714150

image-20220616201815472

image-20220616201923822

6. 推送到远程仓库

image-20220616202015634

image-20220616202033118

三、添加需要依赖

1. swagger 用于接口测试

 <!-- swagger2 -->
 <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.9.2</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
 <dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-spring-boot-starter</artifactId>
     <!--在引用时请在maven中央仓库搜索2.X最新版本号-->
     <version>2.0.9</version>
 </dependency>

一个是样式,一个是处理

2. satoken 用于权限验证

<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.30.0</version>
</dependency>

四、配置数据库、连接数据库

  1. 本次使用阿里云数据库,在application中配置连接

src/main/resources/application.properties中进行更改或添加,我用的时properties方式,如果喜欢用yml格式自己改下就可以

image-20220616203611341

  1. 使用idea工具连接

    image-20220616203849044

    image-20220616204108610

五、使用mybatisX快速生成代码

image-20220616212118349

image-20220616212445745

image-20220616212628628

六、使用EasyCode生成代码

1. 代码基本框架

  1. web层:写controller逻辑
  2. service层:写服务写接口,在impl写实现
  3. mapper层:完成基础实体上的操作
  4. config层:配置层
  5. entity层:实体层,包括基础的实体和返回数据实体

七、satoken简单配置

  1. application配置
# satoken 配置
# token名字
sa-token.token-name=sgtjytoken
# token有效期
sa-token.timeout=2592000
# 临时有效期
sa-token.activity-timeout=-1
# 是否允许并发登录
sa-token.is-concurrent=false
# token风格
sa-token.token-style=uuid
  1. 在启动类中查看配置信息
 public static void main(String[] args) {
        SpringApplication.run(OrderingSystemBackApplication.class, args);
        System.out.println("启动成功:Sa-Token配置如下:" + SaManager.getConfig());
    }

image-20220618230923154

八、swaggar配置

  1. swagger配置
package group.mngzs.orderingsystemback.config;


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.builders.RequestHandlerSelectors;
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 createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("group.mngzs.orderingsystemback"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("食尚年华石锅土鲫鱼接口文档")
                .contact(new Contact("TgM","tgmmmmmmmm.online","youxiang@xx.com"))
                .version("1.0")
                .description("这是所有接口的说明和测试使用。")
                .build();
    }
}

九、统一返回格式、统一异常处理

  1. 统一返回格式

创建返回代码类ResultCode.java

public interface ResultCode {
    public static Integer SUCCESS = 20000;
    public static Integer ERROR = 20001;
}

创建返回类R

package group.mngzs.orderingsystemback.commonutils;

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

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

@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<String, Object>();
    private R(){}
    public static R ok(){
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }
    public static R error(){
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        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;
    }
}
  1. 统一异常处理

全局异常处理

package group.mngzs.orderingsystemback.commonutils;

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();
    }
}

自定义异常类

package group.mngzs.orderingsystemback.commonutils;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SgtjyException extends RuntimeException {
    @ApiModelProperty(value = "状态码")
    private Integer code;
    private String msg;

}

在书写中,可以在项目里捕获此特殊异常,然后通过全局中进行特殊处理的返回

十、整合七牛云用于上传图片

1. pom.xml坐标

<dependency>
  <groupId>com.qiniu</groupId>
  <artifactId>qiniu-java-sdk</artifactId>
  <version>7.10.4</version>
</dependency>

他这个中括号自动找最新版本我不知道为啥用不了,就指定了7.10.4版本

2. 配置信息

# 七牛云配置
# 公钥
qiniu.accessKey=****************
# 私钥
qiniu.secretKey=******************
# 存储空间名
qiniu.bucketName=tgm
# 外链域名
qiniu.path=http://*************

3. 编写配置类

UploadConfig

package group.mngzs.orderingsystemback.config;

import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class UploadConfig {

    @Value("${qiniu.accessKey}")
    private String accessKey;
    @Value("${qiniu.secretKey}")
    private String secretKey;

    @Bean
    public Auth getAuth(){
        return Auth.create(accessKey,secretKey);
    }

    @Bean
    public UploadManager getUploadManager(){
        return new UploadManager(new Configuration());
    }
}

4. 编写工具类

QiniuUtils

package group.mngzs.orderingsystemback.commonutils;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.FileInputStream;

@Component
public class QiniuUtils {

    @Autowired
    private UploadManager uploadManager;

    @Autowired
    private Auth auth;

    @Value("${qiniu.bucketName}")
    private String bucketName;
    @Value("${qiniu.path}")
    private String url;

    public String upload(FileInputStream file, String fileName) throws QiniuException {
        String token = auth.uploadToken(bucketName);
        Response res = uploadManager.put(file, fileName, token, null, null);
        if (!res.isOK()) {
            throw new RuntimeException("上传七牛云出错:" + res);
        }
        return url+"/"+fileName;
    }
}

StringUtils工具类以生成图片名称

package group.mngzs.orderingsystemback.commonutils;

import java.util.UUID;

public class StringUtils {

    /**
     * @Description: 生成唯一图片名称
     * @Param: fileName
     * @return: 云服务器fileName
     */
    public static String getRandomImgName(String fileName) {

        int index = fileName.lastIndexOf(".");

        if (fileName.isEmpty() || index == -1){
            throw new IllegalArgumentException();
        }
        // 获取文件后缀
        String suffix = fileName.substring(index).toLowerCase();
        // 生成UUID
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        // 生成上传至云服务器的路径
        return "存储地址下的文件夹目录/" + uuid + suffix;
    }
}

5. 编写Service层

interface PictureService

package group.mngzs.orderingsystemback.service;
import group.mngzs.orderingsystemback.commonutils.R;
import org.springframework.web.multipart.MultipartFile;

public interface PictureService {
    public R upload(MultipartFile file);
}

PictureServiceImpl

package group.mngzs.orderingsystemback.service.Impl;


import group.mngzs.orderingsystemback.commonutils.R;
import group.mngzs.orderingsystemback.commonutils.QiniuUtils;
import group.mngzs.orderingsystemback.commonutils.StringUtils;
import group.mngzs.orderingsystemback.service.PictureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Objects;

@Service
public class PictureServiceImpl implements PictureService {

    @Autowired
    private QiniuUtils qiniuUtils;

    @Override
    public R upload(MultipartFile file) {
        if (file.isEmpty()) {
            return R.error().message("图片为空");
        }
        String fileName = StringUtils.getRandomImgName(Objects.requireNonNull(file.getOriginalFilename()));
        try {
            FileInputStream uploadFile = (FileInputStream) file.getInputStream();
            String path = qiniuUtils.upload(uploadFile, fileName);
            return R.ok().message(path);
        } catch (IOException e) {
            e.printStackTrace();
            return R.error().message("IO异常");
        }
    }
}

6. 编写controller层

package group.mngzs.orderingsystemback.controller;

import group.mngzs.orderingsystemback.commonutils.R;
import group.mngzs.orderingsystemback.service.PictureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@CrossOrigin
public class PictureController {

    @Autowired
    private PictureService pictureService;

    @PostMapping(value = "/upload")
    public R upload(@RequestParam("file") MultipartFile file) {
        return pictureService.upload(file);
    }
}
port org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@CrossOrigin
public class PictureController {

    @Autowired
    private PictureService pictureService;

    @PostMapping(value = "/upload")
    public R upload(@RequestParam("file") MultipartFile file) {
        return pictureService.upload(file);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值