跳转至

工程结构

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

全局异常

image-20240705144121262

可预知异常:程序员抛出的异常

不可预知异常:系统异常,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

测试案例