感谢支持字母哥 此文档将会持续性更新
如有同学不明白 可以直接找我 蟹蟹支持
环境安装以及启动流程看这里
后端语言: Java
后端框架: Spring Boot
服务器:Tomcat
Jdk版本:17
数据库:Mysql5.7或者更高都可
操作系统和内存: windows10以上都可,内存大于8GB
软件的编译环境:Java17
开发工具:Idea
本系统采用B/S模式,将系统划分为三层,分为客户端、服务器端、数据库三个层次。其中:
├─HELP.md ├─pom.xml # 系统安装其他的依赖的包 里面可能包括springboot、mybatis、lombok、jwt、poi等库 ├─src #源文件 | ├─test #测试文件 | | ├─java | | | ├─com | | | | ├─example | | | | | ├─web | | | | | | └WebApplicationTests.java | ├─main #主要代码 | | ├─resources | | | ├─application.yml #项目配置文件 | | | ├─static #系统上传资源文件目录 | | | | ├─images #上传图片存在的地方 | | ├─java | | | ├─com | | | | ├─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 | | | | | | | | | ├─AddressComponent.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 | | | ├─com | | | | ├─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里面
然后打开星火大模型 没有就去注册一个 很简单
星火大模型免费使用超级链接
比如contoller的控制器
比如entity文件夹
创建独立的Spring应用,这意味着你可以专注于业务逻辑的开发而不是配置和环境的问题。
内嵌Web服务器,如Tomcat、Jetty等,使得应用的部署无需外部容器,极大地简化了应用的部署流程。
自动Starter依赖,可以简化构建配置,你只需要添加相应的场景依赖即可。
自动配置Spring以及第三方功能,减少了手动配置的工作量。
提供生产级别的监控、健康检查以及外部优化配置,这些功能可以帮助我们更好地管理和优化应用。
无代码生成、无需编写XML,进一步简化了开发流程。
依赖简化:Spring Boot自有的starter中提供了一些可以快捷使用的依赖,让整合或集成一些常用的功能更便捷。
一句话概括:Spring Boot是整合Spring技术栈的一种快速开发框架,它极大地简化了Spring应用的开发、部署和运维工作。
MyBatis是一款开源的持久层框架,它极大地简化了Java对数据库的操作。具有自定义SQL、存储过程和高级映射的特性。MyBatis有效地避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程,通过内部封装JDBC,开发者只需要关注SQL语句本身。此外,MyBatis可以通过简单的XML或注解来配置和映射原生类型、接口和Java POJO(Plain Old Java Objects,普通的老式Java对象)为数据库中的记录。这样的设计使得MyBatis非常适用于处理大量数据的场合。总的来说,MyBatis是一款优秀的持久层框架,它让数据库操作变得更加简单明了。
Lombok是一个Java库,它能够自动插入编辑器和构建工具,从而简化Java开发的过程。这个库的主要目标是消除Java的冗长,尤其是对于简单的Java对象(POJO)。例如,开发人员经常需要在实体类中编写大量的getter或者setter方法,使用Lombok后,可以通过简单的注解形式来减少这些重复的代码,从而提高开发效率。此外,Lombok还具有自动化日志变量的功能。使用Lombok需要的开发环境是Java+Maven+IntelliJ IDEA或者Eclipse (安装Lombok Plugin)。
JWT,全称JSON Web Token,是一种基于token的身份认证方案。它可以实现无状态、单点登录、兼容性和安全性的Web应用授权。在Java中,处理JWT的方式有很多,例如可以使用java-jwt库,这是一个实现了RFC 7519的库。此外,还有JJWT这个纯Java库,用于在JVM和Android上创建和验证JWTs和JWKs。JJWT支持所有标准的JWS和JWE算法,以及自定义声明、加密、压缩和密钥管理。这些库提供了丰富的功能和简单的接口,使得在Java中使用JWT变得更加方便。
POI是Apache POI项目,它是一个用于读写Microsoft Office文件格式的Java库。POI支持多种Office文档格式,包括Excel、Word、PowerPoint等。在Java中,可以使用POI库来读取和写入这些文件,实现对Office文档的操作。例如,可以使用POI库来读取Excel文件中的数据,或者将数据写入到Excel文件中。此外,POI还提供了一些高级功能,如合并单元格、设置样式、插入图片等。使用POI库可以方便地处理各种Office文档,提高开发效率。
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 Commons FileUpload是一个常用的文件上传库,它提供了简单易用的API来处理文件上传请求。
易于维护:Java代码结构清晰,易于维护。在开发文件上传程序时,可以使用面向对象的编程思想来组织代码,提高代码的可读性和可维护性。
高性能:Java虚拟机(JVM)具有高度优化的性能,可以实现高效的文件上传操作。此外,Java还提供了多线程编程机制,可以充分利用多核处理器的优势,提高文件上传的速度。
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: com.example.web.entity #实体存储的包位置
实现逻辑非常清晰命令 标准的上传写法
/** * 批量文件上传 * @param files 上传的文件 * @return */ @PostMapping("/BatchUpload") public ArrayListuploadFile(@RequestParam("file") MultipartFile[] files,HttpServletRequest request) { //定义一个存储文件的列表 ArrayList 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; }
相信学java这块的 没有人不知道Mybatis
本系统使用的Mybatis的官网地址我先给大家
Mybatis加强版官网地址
官网增删改查文档的超级链接
Save
// 插入一条记录(选择字段,策略插入) boolean save(T entity); // 插入(批量) boolean saveBatch(CollectionentityList); // 插入(批量) boolean saveBatch(Collection entityList, int batchSize);
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
Collection | entityList | 实体对象集合 |
int | batchSize | 插入批次数量 |
SaveOrUpdate
// 插入一条记录(选择字段,策略插入) // TableId 注解存在更新记录,否插入一条记录 boolean saveOrUpdate(T entity); // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法 boolean saveOrUpdate(T entity, WrapperupdateWrapper); // 批量修改插入 boolean saveOrUpdateBatch(Collection entityList); // 批量修改插入 boolean saveOrUpdateBatch(Collection entityList, int batchSize);
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
Wrapper< T > | updateWrapper | 实体对象封装操作类 UpdateWrapper |
Collection | entityList | 实体对象集合 |
int | batchSize | 插入批次数量 |
Remove
// 根据 queryWrapper 设置的条件,删除记录 boolean remove(WrapperqueryWrapper); // 根据 ID 删除 boolean removeById(Serializable id); // 根据 columnMap 条件,删除记录 boolean removeByMap(Map columnMap); // 删除(根据ID 批量删除) boolean removeByIds(Collection extends Serializable> idList);
类型 | 参数名 | 描述 |
---|---|---|
Wrapper | queryWrapper | 实体包装类 QueryWrapper |
Serializable | id | 主键 IDr |
Map | columnMap | 表字段 map 对象 |
Collection extends Serializable> | idList | 主键 ID 列表 |
Update
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset boolean update(WrapperupdateWrapper); // 根据 whereWrapper 条件,更新记录 boolean update(T updateEntity, Wrapper whereWrapper); // 根据 ID 选择修改 boolean updateById(T entity); // 根据ID 批量更新 boolean updateBatchById(Collection entityList); // 根据ID 批量更新 boolean updateBatchById(Collection 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(WrapperqueryWrapper); // 根据 Wrapper,查询一条记录 T getOne(Wrapper queryWrapper, boolean throwEx); // 根据 Wrapper,查询一条记录 Map getMap(Wrapper queryWrapper); // 根据 Wrapper,查询一条记录 V getObj(Wrapper queryWrapper, Function super Object, V> mapper);
类型 | 参数名 | 描述 |
---|---|---|
Serializable | id | 主键 ID |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
boolean | throwEx | 有多个 result 是否抛出异常 |
T | entity | 实体对象 |
Function super Object, V> | mapper | 转换函数 |
List
// 查询所有 Listlist(); // 查询列表 List list(Wrapper queryWrapper); // 查询(根据ID 批量查询) Collection listByIds(Collection extends Serializable> idList); // 查询(根据 columnMap 条件) Collection listByMap(Map columnMap); // 查询所有列表 List
类型 | 参数名 | 描述 |
---|---|---|
Serializable | id | 主键 ID |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
boolean | throwEx | 有多个 result 是否抛出异常 |
T | entity | 实体对象 |
Function super Object, V> | mapper | 转换函数 |
Page(分页查询)
// 无条件分页查询 IPagepage(IPage page); // 条件分页查询 IPage page(IPage page, Wrapper queryWrapper); // 无条件分页查询 IPage > pageMaps(IPage page); // 条件分页查询 IPage > pageMaps(IPage page, Wrapper queryWrapper);
类型 | 参数名 | 描述 |
---|---|---|
IPage | page | 翻页对象 |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
Count(记录总行数)
// 查询总记录数 int count(); // 根据 Wrapper 条件,查询总记录数 int count(WrapperqueryWrapper);
类型 | 参数名 | 描述 |
---|---|---|
IPage | page | 翻页对象 |
Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
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(); // 获取秒数间隔
我们用了新版的Spring boot 至少需要java支持17
如果没有选项 可以卸载你当前的idea
为什么要使用Idea Idea开发的效率高 功能齐全
注意 Idea可以从官方下载 下面有官方下载的链接 然后去淘宝花10到30块买个idea注册码 不要用破解版了 功能阉割 不能更新 2023年了 一顿饭钱就搞定了
Idea下载链接
ToolBox链接安装
然后找到maven配置
对maven进行替换包源
找到博主放到项目根目录的setting.xml
或者你有自己的maven
加入这段代码
aliyunmaven * 阿里云公共仓库 https://maven.aliyun.com/repository/public
打开我们的idea找到maven配置
点击OK
然后找到如下图所示的清理缓存
一定要重启后再进行下面的操作
打开后找到图中的Maven
到这里 环境配置已经OK了