前言
感谢支持字母哥 此文档将会持续性更新
如有同学不明白 可以直接找我 蟹蟹支持
环境安装部署教学视频
环境安装以及启动流程看这里
系统的环境
后端语言: Java
后端框架: Spring Boot
服务器:Tomcat
Jdk版本:17
数据库:Mysql5.7或者更高都可
操作系统和内存: windows10以上都可,内存大于8GB
软件的编译环境:Java17
开发工具:Idea
系统架构设计
本系统采用B/S模式,将系统划分为三层,分为客户端、服务器端、数据库三个层次。其中:
- 客户端:采用html、css、js、vue、elementui等开发技术,提供友好的操作界面。
- 服务器端:使用Tomcat服务器,通过HTTP协议与客户端通信,负责系统逻辑处理。
- 数据库:使用MySQL数据库进行数据存储,保证数据的可靠性和安全性。
系统完整架构文件目录图
├─HELP.md
├─pom.xml # 系统安装其他的依赖的包 里面可能包括springboot、mybatis、lombok、jwt、poi等库
├─src #源文件
| ├─test #测试文件
| | ├─java
| | | ├─***
| | | | ├─example
| | | | | ├─web
| | | | | | └WebApplicationTests.java
| ├─main #主要代码
| | ├─resources
| | | ├─application.yml #项目配置文件
| | | ├─static #系统上传资源文件目录
| | | | ├─images #上传图片存在的地方
| | ├─java
| | | ├─***
| | | | ├─example
| | | | | ├─web
| | | | | | ├─SysConst.java #系统常量
| | | | | | ├─WebApplication.java #系统启动文件
| | | | | | ├─tools #工具库
| | | | | | | ├─BaseContext.java #请求上下文
| | | | | | | ├─CollaborativeFiltering.java #协同过滤算法
| | | | | | | ├─CurrentUserInterceptor.java #当前请求的用户截面
| | | | | | | ├─Extension.java #扩展帮助类
| | | | | | | ├─GlobalExceptionHandler.java #全局异常处理类
| | | | | | | ├─GlobalResponseAdvice.java #全局返回结果处理类
| | | | | | | ├─HttpUtils.java #http网络请求工具类
| | | | | | | ├─InterceptorConfig.java #mybatis截面类
| | | | | | | ├─JWTInterceptor.java #jwt截面类
| | | | | | | ├─JWTUtils.java #jwt工具类
| | | | | | | ├─LocalDateTimeConfig.java #本地事件配置类
| | | | | | | ├─MybatisPlusConfig.java #mybatis分页配置类
| | | | | | | ├─MyMetaObjectHandler.java #mybatis操作数据之前处理类
| | | | | | | ├─QRCodeTools.java #二维码识别工具类
| | | | | | | ├─wx #微信类
| | | | | | | | └WeiXinUtils.java #微信扩展方法
| | | | | | | ├─exception #异常处理目录
| | | | | | | | └CustomException.java #异常报错基类
| | | | | | | ├─dto #基础模型目录
| | | | | | | | ├─BaseDto.java #基本模型父类
| | | | | | | | ├─CurrentUserDto.java #当前用户信息类
| | | | | | | | ├─FileResultDto.java #文件上传结果存储类
| | | | | | | | ├─IdInput.java #基础单id查询模型类
| | | | | | | | ├─IdsInput.java #基础多id查询模型类
| | | | | | | | ├─PagedInput.java #基础分页查询模型类
| | | | | | | | ├─PagedResult.java #基础分页查询结果模型类
| | | | | | | | ├─ResponseData.java #基础响应结果包装模型类
| | | | | | | | ├─SelectResult.java #基础下拉框包装模型类
| | | | | | | | └UserCalculateCosineSimilarity.java #协同过滤算法包装类
| | | | | | | ├─amap # 高德地图扩展类
| | | | | | | | ├─MapUtils.java
| | | | | | | | ├─dto
| | | | | | | | | ├─Address***ponent.java
| | | | | | | | | ├─DrivingResultDto.java
| | | | | | | | | ├─Paths.java
| | | | | | | | | ├─Regeocode.java
| | | | | | | | | ├─RegeoInput.java
| | | | | | | | | ├─RegeoResultDto.java
| | | | | | | | | ├─Route.java
| | | | | | | | | ├─RoutePlanningResultDto.java
| | | | | | | | | ├─Steps.java
| | | | | | | | | └Tmcs.java
| | | | | | ├─service # 业务类*
| | | | | | | ├─AppUserService.java # 用户业务声明类
| | | | | | | ├─impl #业务实现目录
| | | | | | | | ├─AppUserServiceImpl.java #用户业务实现类
| | | | | | ├─mapper #mapper目录
| | | | | | | ├─AppUserMapper.java #用户CRUD类
| | | | | | ├─entity #数据库对应实体类
| | | | | | | ├─AppUser.java #用户表实体类
| | | | | | | ├─BaseEntity.java #基础实体类
| | | | | | | ├─Enums.java #枚举类
| | | | | | ├─dto #前后盾传输模型目录
| | | | | | | ├─AppUserDto.java #用户模型
| | | | | | | ├─query #查询模型目录
| | | | | | | | ├─AppUserPagedInput.java #用户分页查询模型类
| | | | | | ├─controller #控制器目录
| | | | | | | ├─AppUserController.java #用户控制器类
系统必须掌握架构文件目录图
├─HELP.md
├─pom.xml # 系统安装其他的依赖的包 里面可能包括springboot、mybatis、lombok、jwt、poi等库
├─src #源文件
| ├─main #主要代码
| | ├─resources
| | | ├─application.yml #项目配置文件
| | | ├─static #系统上传资源文件目录
| | | | ├─images #上传图片存在的地方
| | ├─java
| | | ├─***
| | | | ├─example
| | | | | ├─web
| | | | | | ├─service # 业务类*
| | | | | | | ├─AppUserService.java # 用户业务声明类
| | | | | | | ├─impl #业务实现目录
| | | | | | | | ├─AppUserServiceImpl.java #用户业务实现类
| | | | | | ├─mapper #mapper目录
| | | | | | | ├─AppUserMapper.java #用户CRUD类
| | | | | | ├─entity #数据库对应实体类
| | | | | | | ├─AppUser.java #用户表实体类
| | | | | | | ├─BaseEntity.java #基础实体类
| | | | | | | ├─Enums.java #枚举类
| | | | | | ├─dto #前后盾传输模型目录
| | | | | | | ├─AppUserDto.java #用户模型
| | | | | | | ├─query #查询模型目录
| | | | | | | | ├─AppUserPagedInput.java #用户分页查询模型类
| | | | | | ├─controller #控制器目录
| | | | | | | ├─AppUserController.java #用户控制器类
系统前后端数据交互的细节
系统设计架构图
代码翻译(如果有看不懂的代码如何进行自救看懂)
首先系统的代码逻辑主要写在Service的impl里面
然后打开星火大模型 没有就去注册一个 很简单
星火大模型免费使用超级链接
如何进行有效的提问
1.看不懂某个方法 如何进行提问
2.如何提问某个文件的作用是干嘛的
比如contoller的控制器
比如entity文件夹
系统技术清单
- Java语言
- SpringBoot
- Mybatis
- Lombok
- Jwt
- POI
- MySql
- 序列化与反序列化
- 拉姆达表达式
- 全局过滤器
- 文件上传与下载
Springboot
创建独立的Spring应用,这意味着你可以专注于业务逻辑的开发而不是配置和环境的问题。
内嵌Web服务器,如Tomcat、Jetty等,使得应用的部署无需外部容器,极大地简化了应用的部署流程。
自动Starter依赖,可以简化构建配置,你只需要添加相应的场景依赖即可。
自动配置Spring以及第三方功能,减少了手动配置的工作量。
提供生产级别的监控、健康检查以及外部优化配置,这些功能可以帮助我们更好地管理和优化应用。
无代码生成、无需编写XML,进一步简化了开发流程。
依赖简化:Spring Boot自有的starter中提供了一些可以快捷使用的依赖,让整合或集成一些常用的功能更便捷。
一句话概括:Spring Boot是整合Spring技术栈的一种快速开发框架,它极大地简化了Spring应用的开发、部署和运维工作。
Mybatis
MyBatis是一款开源的持久层框架,它极大地简化了Java对数据库的操作。具有自定义SQL、存储过程和高级映射的特性。MyBatis有效地避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程,通过内部封装JDBC,开发者只需要关注SQL语句本身。此外,MyBatis可以通过简单的XML或注解来配置和映射原生类型、接口和Java POJO(Plain Old Java Objects,普通的老式Java对象)为数据库中的记录。这样的设计使得MyBatis非常适用于处理大量数据的场合。总的来说,MyBatis是一款优秀的持久层框架,它让数据库操作变得更加简单明了。
Lombok
Lombok是一个Java库,它能够自动插入编辑器和构建工具,从而简化Java开发的过程。这个库的主要目标是消除Java的冗长,尤其是对于简单的Java对象(POJO)。例如,开发人员经常需要在实体类中编写大量的getter或者setter方法,使用Lombok后,可以通过简单的注解形式来减少这些重复的代码,从而提高开发效率。此外,Lombok还具有自动化日志变量的功能。使用Lombok需要的开发环境是Java+Maven+IntelliJ IDEA或者Eclipse (安装Lombok Plugin)。
Jwt
JWT,全称JSON Web Token,是一种基于token的身份认证方案。它可以实现无状态、单点登录、兼容性和安全性的Web应用授权。在Java中,处理JWT的方式有很多,例如可以使用java-jwt库,这是一个实现了RFC 7519的库。此外,还有JJWT这个纯Java库,用于在JVM和Android上创建和验证JWTs和JWKs。JJWT支持所有标准的JWS和JWE算法,以及自定义声明、加密、压缩和密钥管理。这些库提供了丰富的功能和简单的接口,使得在Java中使用JWT变得更加方便。
POI
POI是Apache POI项目,它是一个用于读写Microsoft Office文件格式的Java库。POI支持多种Office文档格式,包括Excel、Word、PowerPoint等。在Java中,可以使用POI库来读取和写入这些文件,实现对Office文档的操作。例如,可以使用POI库来读取Excel文件中的数据,或者将数据写入到Excel文件中。此外,POI还提供了一些高级功能,如合并单元格、设置样式、插入图片等。使用POI库可以方便地处理各种Office文档,提高开发效率。
MySql
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于Oracle旗下产品。它是一种基于SQL查询语言的开源跨平台数据库管理系统,也是目前市面上最流行的数据库管理软件之一。具有很多独特的特点,如支持多种操作系统、编程语言和存储引擎,可以处理大型数据库,同时也非常适合中小型网站和Web应用开发。这些特性使得MySQL广泛应用于互联网中,成为了WEB应用开发中最主流的数据库管理系统。
序列化与反序列化
JSON的序列化是将一个JavaScript对象或值转换为JSON字符串的过程,而反JSON的序列化是将一个JavaScript对象或值转换为JSON字符串的过程,而反序列化则是将JSON字符串转换回原始的JavaScript对象或值的过程。
在Java中,可以使用内置的JSON库来实现JSON的序列化和反序列化。例如,使用ObjectMapper类可以将Java对象转换为JSON字符串,也可以将JSON字符串转换为Java对象。
拉姆达表达式
Java的Lambda表达式有许多优点,以下是一些主要的优点:
代码精简优雅:Lambda表达式可以使代码变得更加精简和优雅。例如,在遍历Map时,使用lambda表达式可以大大简化代码,如demoMap.forEach((k, v) -> list.add(v));。
提高编程效率:Lambda表达式能够将函数作为参数进行传递,使得编程更加高效。这种特性在一些需要将函数作为参数的场景中非常有用,例如在集合类的流式操作或者匿名对象实现相关场景。
函数式编程:Lambda表达式是函数式编程的一种体现,它允许我们将一个函数作为另外一个函数的参数,或者理解为一段可以传递的代码(将代码作为实参)。这种特性在其他语言中已经得到广泛应用,例如JavaScript和Python,因此在Java 8中引入Lambda表达式后,Java程序员也能更好地利用这一特性,提高编程效率。
替代匿名类:在Java 8之前,如果我们需要创建一个只包含一个抽象方法的匿名类,我们需要使用匿名内部类。但是,自从Java 8添加了函数式接口和lambda表达式后,我们就可以使用更简洁的lambda表达式来替代匿名类。
总的来说,Java的Lambda表达式提供了一种更简洁、更高效的方式来编写代码,特别是在涉及到集合类的流式操作或者匿名对象实现相关场景。
全局过滤器
Java全局过滤器是指在Java Web应用程序中,对所有的请求和响应进行拦截和处理的过滤器。它通常用于实现一些通用的功能,例如身份验证、日志记录、性能监控等。
文件上传与下载
Java的文件和上传的好处和优点如下:
跨平台性:Java是一种跨平台的编程语言,可以在不同的操作系统上运行。因此,使用Java编写的文件上传程序可以在多个平台上运行,具有很高的可移植性。
安全性:Java提供了许多安全机制来保护文件上传过程中的数据安全。例如,可以使用加密算法对文件进行加密,以防止数据泄露。
强大的库支持:Java拥有丰富的类库和框架,可以帮助开发人员快速实现文件上传功能。例如,Apache ***mons FileUpload是一个常用的文件上传库,它提供了简单易用的API来处理文件上传请求。
易于维护:Java代码结构清晰,易于维护。在开发文件上传程序时,可以使用面向对象的编程思想来组织代码,提高代码的可读性和可维护性。
高性能:Java虚拟机(JVM)具有高度优化的性能,可以实现高效的文件上传操作。此外,Java还提供了多线程编程机制,可以充分利用多核处理器的优势,提高文件上传的速度。
该系统核心(必看)
系统配置文件application.yml
server:
tomcat: #tomact 服务器的配置
relaxed-query-chars: '|,{,},[,]' #进行get请求到时候 如何参数包含[,{,},] 认为是正常的
port: 7245 # 端口
#数据库名:mysql,用户名root,密码123456
spring:
servlet:
multipart: #文件的上传配置
max-request-size: 100MB #请求的最大报文长度不能超过100MB
max-file-size: 1024MB #上传的文件最大不能超过1024MB
datasource: #数据库的配置
username: sa #数据库的账号
password: 123456 #数据库的密码
url: jdbc:mysql://localhost:3306/resthome?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
jackson: # json序列号配置
property-naming-strategy: UPPER_CAMEL_CASE #设置大写开头的命名风格
date-format: yyyy-MM-dd HH:mm:ss #设置标准的时间格式
time-zone: Asia/Shanghai #时间对于的时区
mybatis-plus: #操作数据库的ORM框架 mybatis
mapper-locations: mapper/*.xml #配置对于的mapper文件位置
global-config: #mybatis的全局配置
db-config: #数据库的配置
table-prefix: #表前面是否加前缀 如果不配置为空 会导致查询的sql表前面带有特定 前缀
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: false #是否转换成大小写
type-aliases-package: ***.example.web.entity #实体存储的包位置
如何找到本项目的数据库配置地址
如何启动项目
如何判断项目启动成功
如何找到文件上传的代码
实现逻辑非常清晰命令 标准的上传写法
/**
* 批量文件上传
* @param files 上传的文件
* @return
*/
@PostMapping("/BatchUpload")
public ArrayList<FileResultDto> uploadFile(@RequestParam("file") MultipartFile[] files,HttpServletRequest request) {
//定义一个存储文件的列表
ArrayList<FileResultDto> fileResultDtos = new ArrayList<>();
//获取项目运行的绝对路径
String filePath = System.getProperty("user.dir");
//循环处理一下文件 是否满足格式,不满足直接报错给前端
for (MultipartFile file : files) {
if (file.isEmpty()) {
throw new CustomException("文件不能为空");
}
if (file.getSize() <= 0) {
throw new CustomException("上传的文件不能为空!请重新上传");
}
}
//循环保存文件到项目的src\main\resource\static\images路径下
for (MultipartFile file : files) {
//获取文件原始的名称
String originFileName = file.getOriginalFilename();
//随机生成一个时间
Long time = new Date().getTime();
//声明一个保存目录的路径
String dirPath = filePath + "\\src\\main\\resources\\static\\images\\" + time;
//创建一个文件或者文件夹的操作对象
File dirFile = new File(dirPath);
//判断文件是否存在 不存在的话执行下面的代码
if (!dirFile.exists()) {
//创建这个目录
dirFile.mkdirs();
}
//定义一个文件输出流
FileOutputStream fileOutputStream = null;
//try catch处理流 防止报错导致系统崩掉
try {
//创建一个文件
fileOutputStream = new FileOutputStream(dirPath +"\\"+ originFileName);
//把前端传入的内容以byte是格式写入到流里面
fileOutputStream.write(file.getBytes());
//结束流
fileOutputStream.flush();
//关闭流
fileOutputStream.close();
//定义一个返回给前端的路径地址
String url = "http://localhost:7245/images/" + time + "/" + originFileName;
//加入到返回的列表中
fileResultDtos.add(new FileResultDto(url, originFileName));
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
return fileResultDtos;
}
系统是如何操作数据库的 增删改查(必看)
Mybatis
相信学java这块的 没有人不知道Mybatis
本系统使用的Mybatis的官网地址我先给大家
Mybatis加强版官网地址
如何执行增删改查操作的
官网增删改查文档的超级链接
保存方法
Save
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
Collection | entityList | 实体对象集合 |
int | batchSize | 插入批次数量 |
SaveOrUpdate
// 插入一条记录(选择字段,策略插入)
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
Wrapper< T > | updateWrapper | 实体对象封装操作类 UpdateWrapper |
Collection | entityList | 实体对象集合 |
int | batchSize | 插入批次数量 |
删除方法
Remove
// 根据 queryWrapper 设置的条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
类型 | 参数名 | 描述 |
---|---|---|
Wrapper | queryWrapper | 实体包装类 QueryWrapper |
Serializable | id | 主键 IDr |
Map<String, Object> | columnMap | 表字段 map 对象 |
Collection<? extends Serializable> | idList | 主键 ID 列表 |
修改方法
Update
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
类型 | 参数名 | 描述 |
---|---|---|
Wrapper | updateWrapper | 实体对象封装操作类 UpdateWrapper |
T | entity | 实体对象 |
Collection | entityList | 实体对象集合 |
int | batchSize | 更新批次数量 |
查询方法
Get
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
类型 | 参数名 | 描述 |
---|---|---|
Serializable | id | 主键 ID |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
boolean | throwEx | 有多个 result 是否抛出异常 |
T | entity | 实体对象 |
Function<? super Object, V> | mapper | 转换函数 |
List
// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
类型 | 参数名 | 描述 |
---|---|---|
Serializable | id | 主键 ID |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
boolean | throwEx | 有多个 result 是否抛出异常 |
T | entity | 实体对象 |
Function<? super Object, V> | mapper | 转换函数 |
Page(分页查询)
// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
类型 | 参数名 | 描述 |
---|---|---|
IPage | page | 翻页对象 |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
Count(记录总行数)
// 查询总记录数
int count();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);
类型 | 参数名 | 描述 |
---|---|---|
IPage | page | 翻页对象 |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
Java高级知识
配置前后端分离的项目 出现跨域问题如何解决
如何暴露该系统上传的文件(图片资源)
Java基础知识
Java时间类的一些操作(必看)
Java 8引入了全新的日期和时间API,即java.time包,提供了用于处理日期、时间和时间间隔的类。以下是一些示例
LocalDate:表示一个日期,例如:2023-07-03,对应MySQL的DATE类型。
LocalDate date = LocalDate.now(); // 获取当前日期
int year = date.getYear(); // 获取年份
int month = date.getMonthValue(); // 获取月份
int day = date.getDayOfMonth(); // 获取日期
** LocalTime:表示一个时间,例如:12:30:45,对应MySQL的TIME类型。 **
LocalTime time = LocalTime.now(); // 获取当前时间
int hour = time.getHour(); // 获取小时
int minute = time.getMinute(); // 获取分钟
int second = time.getSecond(); // 获取秒数
**LocalDateTime:表示日期和时间,例如:2023-07-03T12:30:45,对应MySQL的DATETIME类型。 **
LocalDateTime dateTime = LocalDateTime.now(); // 获取当前日期和时间
int year = dateTime.getYear(); // 获取年份
int month = dateTime.getMonthValue(); // 获取月份
int day = dateTime.getDayOfMonth(); // 获取日期
int hour = dateTime.getHour(); // 获取小时
int minute = dateTime.getMinute(); // 获取分钟
int second = dateTime.getSecond(); // 获取秒数
**Period:表示日期之间的间隔。 **
LocalDate date1 = LocalDate.of(2020, 6, 1);
LocalDate date2 = LocalDate.of(2023, 7, 3);
Period period = Period.between(date1, date2); // 计算两个日期之间的间隔
int years = period.getYears(); // 获取年份间隔
int months = period.getMonths(); // 获取月份间隔
int days = period.getDays(); // 获取日期间隔
** Duration:表示时间之间的间隔。 **
LocalTime time1 = LocalTime.of(12, 0, 0);
LocalTime time2 = LocalTime.now();
Duration duration = Duration.between(time1, time2); // 计算两个时间之间的间隔
long hours = duration.toHours(); // 获取小时间隔
long minutes = duration.toMinutes(); // 获取分钟间隔
long seconds = duration.getSeconds(); // 获取秒数间隔
系统开发工具以及环境安装
第一步如果你有idea 判断自己的idea是不是满足条件
我们用了新版的Spring boot 至少需要java支持17
如果没有选项 可以卸载你当前的idea
使用原因
为什么要使用Idea Idea开发的效率高 功能齐全
注意 Idea可以从官方下载 下面有官方下载的链接 然后去淘宝花10到30块买个idea注册码 不要用破解版了 功能阉割 不能更新 2023年了 一顿饭钱就搞定了
Idea下载链接
ToolBox链接安装
第二步使用idea打开项目打开Maven配置
然后找到maven配置
对maven进行替换包源
找到博主放到项目根目录的setting.xml
或者你有自己的maven
加入这段代码
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.***/repository/public</url>
</mirror>
打开我们的idea找到maven配置
点击OK
然后找到如下图所示的清理缓存
一定要重启后再进行下面的操作
打开后找到图中的Maven
到这里 环境配置已经OK了