作为一个项目,它的基础架构是什么样子的?一个模块的流程是什么样的?
这里拿登陆部分作例子》》》》
1、首先确定用到的技术
idea创建maven项目,用springboot框架,数据库dao层用JPA框架(也可以用mybatis框架然后逐个构建mapper映射文件,这里用JPA,方便快捷还整洁),前端暂时放两个输入框能输账号和密码就行,用vue和axios进行数据的请求发送(比如说get、post等)
首先依据用到的技术在pom.xml里导入依赖,然后右键reload project等待加载完成。
我这里用到的依赖有:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
2、项目整体框架是什么样的?
maven项目创建好后,在src/main/java下面创建包com.公司名,在本包下详细构造如下————》
config:
@Configuration
将此项目用到的配置文件放在config里,比如说redis的防止中文乱码的RedisConfig配置,swagger的测试文档SwaggerConfig配置,定时器配置,redis配置等。
entity层
@Data(lombok的get、set方法)
@AllArgsConstructor(全参构造器)
@NoArgsConstructor(无参构造器)
@Entity(JPA独有,表示是一个实体类)
@Table(name = “book_tab”)(JPA独有,对应数据库中的表名)
此包下放的是实体类,一个实体类对应一个数据库表,其内部的每个数据都和数据库表一一对应,实例:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "book_tab")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "book_id")
private Integer id;//书的id
@Column(name = "book_title")
private String title;//书名
@Column(name = "book_author")
private String author;//作者
@Column(name = "book_category")
private String category;//书的类型
@Column(name = "book_library")
private Integer library;//书所在图书馆id
@Column(name = "book_introduce")
private String introduce;//书的简介
@Column(name = "book_ok")
private Integer ok;//是否可用1、0
}
@Entity表示这个是一个对应数据库表的实体类,且作为一个数据库表对应的实体类他必须要有主键。因此在下方书的id上方需要写@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)代表主键生成策略,@Table("")其内部使数据库对应的表名,每个变量上方的@Column("")对应的是该引用在数据库对应的字段名,整体都是一一对应的关系;
dto层
@Data
@AllArgsConstructor
@NoArgsConstructor
里面放着一个返回给前端的统一的类型的类,通过这个类进行一个简单的包装,将整体的数据包装成这个类型后发送给前端,使前端收到的数据是一个统一的类型。
例如可以这样↓
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HttpResp {
private int code;//不同代码表示各种不同的情况
private String msg;//该情况对应的信息
private Object obj;//从service拿到的数据对象
private LocalDateTime date;//当前时间
}
dao层:
@Repository(是将接口的一个实现类交给spring管理,和@Service、@Controller作用差不多,名字不一样只是为了区分)
作为使用JPA的项目,对数据库操作里面当然需要继承JpaRepository<要操作的对象类名,主键类型>,例如:public interface IUserDao extends JpaRepository<User,Integer>
负责的是最基础的对数据库的操作,不负责任何业务,只管数据库的基础操作。一个数据库表对应一个对其进行操作的dao的class文件,除了继承JPARepository用其自带的方法进行基本的增删改查操作,里面还可以用JPA的一个@Query(value = “这里写自己设计的数据库语句”,nativeQuery = true)的方法自己进行数据库查询的方法设计,下面写接口里面方法类型的方法定义,设计完后service层会来调用。(注意:返回类型都是对象类型,就算是一个简单的String,也会被JPA包装成对象)
controller层:
整体类前:
@Api(tags = “用户进行操作”)(配合swaggerui用的,后面的文章会解释)
@RestController
@RequestMapping("/api/user")
方法前:
@ApiOperation(“用户登录模块”)(配合swaggerui用的,后面的文章会解释)
@GetMapping("/login")
负责接受前端的信息,前端根据RequestMapping括号里设置的路径+各方法体上面的GetMapping作为请求发送的路径,controller收到后进行传输到service层,其实也就是controller层只负责数据传输,只管数据流通,并不做太多的操作,具体操作都交给service层去进行判断或者是逻辑运算什么的。
exception层:
这是一个存放自定义异常类别的包,里面放着不同类型的异常,建议在此包下直系建一个类比如起名叫SysException继承RuntimeException,然后此包下的其他包继承这个SysException类就行
service层:
@Service
这个是包/层负责的是对从controller传过来的数据进行逻辑运算,在这里进行一些列内部操作,吐出用户需要的东西给controller层,这样很明显可以看出,controller层对数据只是传输和包装成前端需要的类型的作用,不做太多操作。在这里,最好的操作是,在service包下创建不同的针对不同controller的接口,然后挨个在实现类里实现这些接口,操作都是在impl实现类里进行。这里怎么进行操作呢?当然是和上面提到的dao层进行交互。dao只实现最基础的数据库操作增删改查,而service就是通过最基础的判断抛异常、以及最重要的对dao里面的方法进行排列组合,得到自己的答案,返回给controller层。
vo层:
这是个另外的一种实体类,也是一个类里面几个属性,但是不同的是,这个是针对前端接收的类,而不是和数据库交互的类。当从将数据库得到一大堆数据时,只把里面用到的数据(比如说一大堆数据(User)里面有名字、账号、id、密码、积分、已借书数量,但前端此时只需要账号和密码,这个时候就需要用到vo了)包装成vo,这个时候里面只有我们的账号和密码了。
最重要的:一个整体的、和上面这些包平行的一个运行和加载整合项目用的类App.class:
@SpringBootApplication
App.class:自己起个名字就行
这里面其实是一个main函数,而这个类是用来将所有的带注解的类提前加载到spring容器中,当然不是直接就能加载,需要加注解:@SpringBootApplication。
@EnableOpenApi
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class);
}
}
这个时候,我们的所有包下面的带注解的各类文件就被提前加载到容器里完成了!