工程结构¶
Create New Project --> Empty Project
Empty Project:作为一个工作空间,相当于一个大文件夹容器,里面放所有的项目(Module模块)。
手动导入jar包的位置:Empty Project|Module|lib|mysql-connector-java-8.0.11.jar|然后右键jar包|Add as Library|
maven war项目¶
Project
- Module
- src
- main(所有业务代码都放在main下。)
- java 源码都放在java里。java文件夹下创建Package(例com.hh.controller),包下面创建类。
- com.hh
- controller:接受前端的请求,调用service去操作数据库,将数据返回给前端。
- mapper
- BookMapper.java(接口类)
- pojo:实体类pojo包
- Book.java(实体类)
- service
- BookService接口
- impl
- BookServiceImpl接口实现类,里面调BookMapper查询数据库
- resources (配置文件.properties、.xml资源文件)
- com.hh.mapper 映射文件
- BookMapper.xml(映射文件)
- applicationContext.xml
- log4j.properties
- mybatis.xml
- springmvc.xml
- webapp
- WEB-INF
- web.xml
- index.jsp
- test 测试代码
- java 类似main下的java
- com.hh.test
- test.java
- resources 类似main下的resources
- pom.xml 导包的坐标写在这里面。
工程主体结构¶
xxx父工程¶
父工程,统一管理项目依赖版本,集成springboot。
xxx-basic¶
存放通用的starter
- xxx-file-starter 文件管理starter,MinIO文件管理。
xxx-common¶
一些通用的配置。
constants¶
常量
exception¶
全局异常
可预知异常:程序员抛出的异常
不可预知异常:系统异常,500、404、空指针等。
model¶
- dtos:接口请求的参数
- pojos/domain:数据库实体类
- vos:pc、app、h5等前端传的查询参数个数不一样,pc可能多一点(例如:v1,v2,v3,v4,v5),app少一点(例如:v1,v2,v3)。后端controller根据不同的vo定义不同的接口,service用同一个即可(按照参数最多的定义)。
AppHttpCodeEnum¶
AppHttpCodeEnum.java里面给code和errorMessage赋值。一般结合ResponseResult使用。
ResponseResult¶
接口开发规范统一的返回。
import com.alibaba.fastjson.JSON;
import com.hh.common.model.enums.AppHttpCodeEnum;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 通用的结果返回类
* @param <T>
*/
@Data
public class ResponseResult<T> implements Serializable {
private Integer code;
private String message;
private T data;
public ResponseResult() {
this.code = 200;
}
public ResponseResult(Integer code, String msg, T data) {
this.code = code;
this.message = msg;
this.data = data;
}
public static <T> ResponseResult<T> errorResult(int code, String msg) {
ResponseResult<T> result = new ResponseResult<>();
return result.error(code, msg);
}
public static <T> ResponseResult<T> okResult(int code, String msg) {
ResponseResult<T> result = new ResponseResult<>();
return result.ok(code, null, msg);
}
public static <T> ResponseResult<T> okResult(T data) {
AppHttpCodeEnum enums = AppHttpCodeEnum.SUCCESS;
ResponseResult<T> result = okResult(enums.getCode(), enums.getMessage());
;
if (data != null) {
result.setData(data);
}
return result;
}
public ResponseResult<T> error(Integer code, String msg) {
this.code = code;
this.message = msg;
return this;
}
public ResponseResult<T> ok(Integer code, T data, String msg) {
this.code = code;
this.data = data;
this.message = msg;
return this;
}
public static void main(String[] args) {
//前置
/*AppHttpCodeEnum success = AppHttpCodeEnum.SUCCESS;
System.out.println(success.getCode());
System.out.println(success.getErrorMessage());*/
//查询一个对象
/*Map map = new HashMap();
map.put("name","zhangsan");
map.put("age",18);
ResponseResult result = ResponseResult.okResult(map);
System.out.println(JSON.toJSONString(result));*/
//新增,修改,删除 在项目中统一返回成功即可
/*ResponseResult result = ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
System.out.println(JSON.toJSONString(result));*/
//根据不用的业务返回不同的提示信息 比如:当前操作需要登录、参数错误
/*ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN,"自定义提示信息");
System.out.println(JSON.toJSONString(result));*/
//查询分页信息
PageResponseResult<List<String>> responseResult = new PageResponseResult<List<String>>(1, 5, 50);
ArrayList<String> list = new ArrayList<String>();
list.add("itcast");
list.add("itheima");
responseResult.setData(list);
System.out.println(JSON.toJSONString(responseResult));
}
}
PageResponseResult¶
PageResponseResult继承了ResponseResult。
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
@EqualsAndHashCode(callSuper = true)
@Data
public class PageResponseResult<T> extends ResponseResult<T> implements Serializable {
private Integer currentPage;
private Integer size;
private Integer total;
public PageResponseResult(Integer currentPage, Integer size, Integer total) {
this.currentPage = currentPage;
this.size = size;
this.total = total;
}
}
xxx-feign-api¶
feign对外的接口
- 定义远程接口都在这里面定义,供其它微服务使用。
xxx-utils¶
通用的工具类
xxx-gateway¶
管理网关微服务工程。
- xxx-admin-gateway
- xxx-wemedia-gateway
- xxx-app-gateway
右键XxGatewayApplication.java启动某一个网关。
xxx-service¶
管理所有微服务工程
- 项目会创建很多的微服务,统一管理微服务
- bootstrap.yml微服务配置,通过Nacos管理。
所有的微服务都是下面结构:
例如heima-leadnews-user微服务:
src/main/java/com.heima.user
- config
- interceptor
- controller.v1
- mapper
- service
- UserApplication.java:每一个微服务都有一个XXXApplication引导类,左键引导类debug启动工程。
src/main/resources
- bootstrap.yml:微服务配置文件。
- logback.xml:日志文件
- application.yml:配置类
xxx-test¶
测试案例