搭建后端项目
文章目录
一、后端项目框架
- springboot-web
- mybatis-plus
- sa-token
- swagger
- qiniu
- mysql
- juint
二、新建项目并与远端仓库连接
1. 创建项目、选择依赖
2. 更改启动banner
- 在项目目录中的
src/main/resources
目录下新建banner.txt
文件,输入的文本内容将打印在启动时输出。
将上述图片通过在线网站转化为ASCLL图,复制进去,最终效果如下图
3. 初始化本地仓库
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/
5. 关联远程仓库(gitee)
6. 推送到远程仓库
三、添加需要依赖
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>
四、配置数据库、连接数据库
- 本次使用阿里云数据库,在application中配置连接
在src/main/resources/application.properties
中进行更改或添加,我用的时properties方式,如果喜欢用yml格式自己改下就可以
-
使用idea工具连接
五、使用mybatisX快速生成代码
六、使用EasyCode生成代码
1. 代码基本框架
- web层:写controller逻辑
- service层:写服务写接口,在impl写实现
- mapper层:完成基础实体上的操作
- config层:配置层
- entity层:实体层,包括基础的实体和返回数据实体
七、satoken简单配置
- 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
- 在启动类中查看配置信息
public static void main(String[] args) {
SpringApplication.run(OrderingSystemBackApplication.class, args);
System.out.println("启动成功:Sa-Token配置如下:" + SaManager.getConfig());
}
八、swaggar配置
- 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();
}
}
九、统一返回格式、统一异常处理
- 统一返回格式
创建返回代码类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;
}
}
- 统一异常处理
全局异常处理
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);
}
}