JavaWeb(3)-后端web实战

JavaWeb(3)-后端web实战

语雀链接

https://www.yuque.com/yulia-i7t01/qt2ypb/etx8fylzbhvx78aq?singleDoc# 《后端web实战》

Tlias智能学习辅助系统

部门管理

准备工作

Apifox

介绍:Apifox是一款集成了Api文档、Api调试、ApiMock、Api测试的一体化协作平台。

作用:接口文档管理、接口请求测试、Mock服务。

官网:https://apifox.com/

查询部门

接口开发
  • @Autowired:Spring 的自动注入注解,作用是让 Spring 自动创建DeptService的实例对象,并赋值给deptService变量(无需手动new对象,是 Spring “依赖注入” 特性的体现);
  • Result:方法的返回值类型,Result自定义的统一响应类(用于封装接口的返回结果,通常包含 “状态码、提示信息、数据” 三部分);
  • list():方法名,代表 “查询列表” 的功能;方法无参数(因为是查询全部部门,不需要前端传参)。
  • System.out.println("查询全部部门数据");:在服务器控制台打印日志,用于开发阶段调试(方便确认方法是否被触发);
  • List<Dept> deptList = deptService.findAll();
    1. List<Dept>:定义一个 “Dept 类型的集合” 变量deptList,用于存储查询到的所有部门数据;
    2. deptService.findAll():调用服务层DeptServicefindAll()方法,获取数据库中所有部门的列表数据;
  • return Result.success(deptList);
    1. 调用自定义Result类的success静态方法,将查询到的部门列表deptList作为 “响应数据” 传入;
    2. 该方法会返回一个包含 “成功状态码、提示信息、部门数据” 的Result对象,最终被@RestController转换为 JSON 格式返回给前端。

·方式一:手动结果映射-通过@Results及@Result进行手动结果映射

·方式二:起别名-在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样

·方式三:开启驼峰命名-如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射

前后端联调测试

·反向代理

反向代理是一种网络架构,通过代理服务器为后端的服务器做代理,客户端的请求直接请求代理服务器,然后转发给后端的服务器。(安全、灵活、负载均衡)

1.location:用于定义匹配路径匹配的规则。

2.^~/api/:表示精确匹配,即只匹配以/api/开头的路径。

3.rewrite:该指令用于重写匹配到的路径。

4.proxy_pass:该指令用于代理转发,它将匹配到的请求转发给位于后端的指令服务器。

删除部门

(不推荐)

方式二:通过@RequesttParam注解进行参数绑定

推荐方式:如果请求参数名与形参变量名相同,直接定义方法形参即可接收

新增项目

修改部门

查询回显

@PathVariable("id"):Spring 的注解,作用是将路径中{id}对应的参数值,自动赋值给deptId变量

修改数据

@Override —— “我是照着接口的要求写的方法”

  • 大白话:这是一个 “标记注解”,告诉 Java 编译器:“下面这个update方法,不是我随便写的,是照着DeptService接口里定义的update方法来写的”。

日志技术

Logback:在springboot项目中logback依赖已传递

logback.xml

·常用的两种输出日志的位置:控制台、系统文件

·开启日志(ALL),关闭日志(OFF)

日志级别

员工管理

分页查询

代码实现

起始索引=(页码-1)*每页展示记录数

PageHelper分页插件

注意事项:

·定义的SQL语结尾不能加分号

·PageHelper仅仅能对紧跟在其后的第一查询语句进行分页处理

条件分页查询

基本实现

通过@DateTimeFormat解决了 “前端字符串日期→后端日期类型” 的自动转换问题;

程序优化

如果controller方法的参数较多,且未来可能继续增加,这会使得方法签名变得复杂难以维护,此时可以考虑将多个请求参数封装为一个对象。

<if>:判断条件是否成立,如果条件为true,则拼接SQL。

<where>:根据查询条件,来生成where关键字,并会自动去除条件前面多余的and或or。

新增员工

保存员工基本信息
批量保存员工工作经历

<foreach>属性说明:

1.collection:集合名称

2.item:集合遍历出来的元素/项

3.separator:每一次遍历使用的分隔符

4.open:遍历开始前拼接的片段

5.close:遍历结束后拼接的片段

  • collection="exprList":指定要遍历的集合是exprList(这个集合是 Mapper 接口方法传入的参数,比如List<EmpExpr> exprList);
  • item="expr":遍历集合时,当前元素的变量名是expr(后续通过#{expr.empId}取该元素的empId属性);
  • separator=",":每遍历生成一个数据片段后,在后面加一个逗号(用于分隔多条values数据)。

删除员工

·删除单条数据其实是一种特殊的批量删除

SQL语句
三层架构需求分析
Controller层

@RequestParam

·@RequestParam = “精准接收前端 URL 里的参数”

·把 URL 里的参数(page/pageSize/name)精准赋值给后端方法的变量;

·还能设置默认值、指定是否必传,解决参数缺失的问题。

批量删除员工信息
批量删除员工工作经历

修改员工

查询回显
ResultMap

· MyBatis 查询数据库后,默认会把查询结果的 “字段名” 和实体类的 “属性名” 做大小写不敏感的精准匹配

·把数据库查询结果想象成 “快递包裹上的收件人信息(地址写的是‘北京市朝阳区’)”,实体类是 “你的收货地址表单(字段叫‘详细地址’)”:

·没有 ResultMap:快递员只会按 “名字一模一样” 填信息,“朝阳区” 没法对应到 “详细地址”;

·有 ResultMap:你给快递员一张 “规则表”,写着 “包裹上的‘地址’填到表单的‘详细地址’里”,快递员就能精准填对。

Mybatis中封装查询结果,什么时候用 resultType,什么时候用resultMap?

如果查询返回的字段名与实体的属性名可以直接对应上,用resultType。

如果查询返回的字段名与实体的属性名对应不上,或实体属性比较复杂,可以通过resultMap手动封装。

修改数据
@RequestBody

·@RequestBody = “自动把前端传的 JSON 数据,转成后端的 Java 对象”

Spring MVC 中接收前端传入的 JSON 格式请求体的核心注解

Arrays.asList(...):将单个 ID 转换为List集合

rollbackFor = Exception.class:指定 “只要发生任何异常,就回滚事务”

程序优化(动态更新 )

<!--set标签:会自动生成set关键字;会自动的删除掉更新字段后多余,-->

事务管理

介绍&操作

事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

Spring事务管理

控制事物

·注解:@Transactional

·作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

·位置:业务(service)层的方法上、类上、接口上

插件
rollbackFor

·事务管理-默认出现运行时异常RuntimeException才会回滚

·用于控制出现何种异常可以回滚

propagation

·事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

四大特性

文件上传

本地存储

1.如何将上传的文件存储在服务器本地?

.multipartFile.getoriginalFilename():获取原始文件名

. multipartFile.transferTo(File dest):将文件转存到磁盘文件

2.上传文件大小受限怎么办?

.默认上传文件的最大大小为1MB,超过大小需要在配置文件配置

阿里云OSS

对象存储OSS(Object Storage Service)

第三方服务-通用思路

准备工作-参照官方SDK(软件开发工作包)编写入门程序-集成使用

@Autowired = “自动找对象并塞给你”

@Autowired是 Spring 框架的核心注解,作用是:让 Spring 自动帮你创建 / 找到需要的对象,然后赋值给你定义的变量,不用你自己手动写new去创建对象

参数配置化

·指将一些需要灵活变化的参数,配置在配置文件中,然后通过@Value注解来注入外部配置的属性

@Value

·是 Spring 框架的注解,作用是把配置文件里的参数值,自动赋值给代码里的变量,相当于 “从配置文件里读数据并填到变量里”。 【 把application.properties(Spring Boot 的配置文件)想象成 “公司的规章制度手册”,@Value就是 “帮你从手册里找到对应的规定,然后告诉你”: 】

·一个属性一个属性的注解

@ConfigurationProperties

·@ConfigurationProperties是 Spring Boot 中批量读取配置文件并封装成对象的注解,比@Value更适合 “读取多个相关配置” 的场景,

· 核心作用:“把配置文件里的一组相关参数,自动打包成一个对象”

· 如果配置文件里有多个同业务的配置项(比如 “阿里云 OSS 存储” 的多个参数),用@Value需要逐个写注解,而@ConfigurationProperties可以 “一次性把这些参数打包成一个对象”,更简洁。

异常处理

全局异常处理器

String message = e.getMessage(); // 获取原始异常信息

int i = message.indexOf("Duplicate entry"); // 找到异常信息的起始位置

String errMsg = message.substring(i); // 截取从“Duplicate entry”开始的内容

String[] arr = errMsg.split(" "); // 按空格分割字符串

@RestControllerAdvice

@RestControllerAdvice是 Spring 的注解,作用是标记一个 “全局异常处理类”,这个类里可以写多个 “处理不同异常的方法”,负责接住整个项目里所有 Controller 抛出的异常。

如果没有@RestControllerAdvice

  • 每个 Controller 的每个方法里,都得写try-catch处理异常,代码会超级冗余(比如 10 个接口就要写 10 次try-catch);

所有异常 “集中处理”,代码只写一次,全项目能用;异常提示统一、友好,用户体验更好。

@ExceptionHandler

@ExceptionHandler是 Spring 的注解,作用是标记在方法上,指定这个方法专门处理 “某一种异常”(比如专门处理 “数据库唯一键冲突异常”、“参数格式错误异常”)。

@ExceptionHandler不能单独用,必须 “放在@RestControllerAdvice标记的类里”—— 相当于 “专科医生必须在急救站里上班,不能自己单独行医”。

@RestControllerAdvice是 “全局异常处理中心的牌子”,@ExceptionHandler是 “中心里的专科医生”—— 两者配合,把项目里所有异常集中接住,转成用户能懂的提示,同时记录日志方便开发排查,是后端项目 “稳定运行 + 友好交互” 的必备配置。

员工信息统计

@NoArgsConstructor

·给类自动生成一个没有任何参数的构造方法(即public 类名())。

·很多框架(比如 Spring、MyBatis)创建对象时,默认需要 “无参构造方法”

@AllArgsConstructor

·给类自动生成一个包含所有属性作为参数的构造方法(参数顺序和类中属性定义顺序一致)

· 创建对象时可以 “一次性给所有属性赋值”,不用写一堆setXxx()方法:

依赖 Lombok:这两个注解是 Lombok 提供的,需要在项目中引入 Lombok 依赖才能生效;

这两个注解经常一起用(既有无参构造满足框架需求,又有全参构造方便创建对象)。

Case函数

·CASE 函数 = SQL 里的 “如果… 就…”

·CASE函数是 SQL 中的 “条件判断工具”,相当于编程里的if-else/switch,能根据不同条件给字段返回不同的值,解决 “按规则转换数据” 的需求。

单条件匹配
多条件判断

职位统计

性别统计

登录认证

会话技术

·会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

·会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

·会话跟踪方案:

·客户端会话跟踪技术:Cookie

·服务端会话跟踪技术:Session

·令牌技术

·跨域区分三个维度:协议、IP/域名、端口

JWT令牌

·全称:JSoN Web Token (https://jwt.io/)

·定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。

·组成:

>第一部分:Header(头),记录令牌类型、签名算法等。例如:{"alg":"HS256","type":"JWT"}

>第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}

>第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload融入,并加入指定秘钥,通过指定签名算法计算而来。

Base64:是一种基于64个可打印字符(A-Z a-z 0-9 +/)来表示二进制数据的编码方式。

JWT令牌由哪几个部分组成,每个部分都存储什么内容?

·header(头),记录令牌类型、签名算法

·payload(载荷),携带一些自定义的信息

·signature(签名),访问被篡改,保证安全性

JWT令牌生成及校验?

Jwts.builder()...

Jwts.parser()...

JWT令牌解析(校验)时什么情况会报错?

JWT令牌被篡改或过期失效了

注意事项

JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的

过滤器(Filter)

·概念:Filter过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。

·过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

·过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

1.Filter的开发步骤?

定义:定义一个类实现Filter接口(init、doFilter、destroy)

配置:

@WebFilter(urlPatterns="/*")

@ServletcomponentScan

2.注意事项

如果过滤器中不执行放行操作,过滤器拦截到请求之后,就不会访问对应的资源。

放行:chain.doFilter(request,response)

令牌校验Filter
拦截路径
过滤器链

Interceptor拦截器

“Spring 的配置说明书”

@Configuration是 Spring 框架的核心注解,标记在类上,告诉 Spring:“这个类是一个‘配置类’,里面写了创建对象、配置功能的规则,你要按照这个类里的规则来创建和管理对象”。

日志管理

Read more

扣子(Coze) Skills+OpenClaw 实战:零基础玩转AI智能体

最近龙虾太火了,但大家满怀期待地装好小龙虾,面对界面却无从下手,最后只能让这么强大的智能体在电脑里吃灰,甚至还要再花钱找人帮忙卸载。 同样部署了OpenClaw,为什么别人能用它提效工作、做账号,你的小龙虾却只会陪聊、不断失忆,最终空耗Token,白白烧光你的钱包? 答案很扎心:因为你的小龙虾,缺少最关键的核心武器——Skills(技能)! 当Agent装备上Skills,它会瞬间进化成能替你跑腿、帮你创收的“数字分身”! 别再让你的“小龙虾”在无效对话中白白浪费算力了。资深AI专家邢云阳倾力打造的新书《扣子(Coze) Skills+OpenClaw 实战:零基础玩转AI智能体》,将带你打通从“零基础部署”到“高阶应用”的全链路。 本书不仅教你用上龙虾,更手把手教你玩转Skills,让这只龙虾真正成为替你打工的超级利器! 看完这本书,AI真的会替你干活! ▼点击下方,即可购书 Part.1 什么是Skills? Skills是Anthropic专为Claude打造的模块化能力框架,现今已被众多大语言模型工具借鉴沿用。简单

让“小爱音箱PRO”智能起来:接入豆包AI

下面提供从 0 到 1 的完整流程,包含豆包 API 申请、MiGPT 部署、配置与使用,确保你能顺利让小爱音箱 Pro 用上豆包的强大能力。 一、准备工作(必做) 二、申请豆包 API 密钥(关键步骤) 豆包 API 需通过火山引擎方舟平台申请,以下是详细步骤: 1. 注册与实名认证 1. 访问火山引擎官网:https://www.volcengine.com/ 2. 注册账号并完成实名认证(个人 / 企业均可) 3. 登录后进入方舟大模型平台 2. 创建 API 密钥与推理接入点 1. 进入控制台 → API 密钥管理 → 点击 "

Kubernetes与AI推理服务最佳实践

Kubernetes与AI推理服务最佳实践 1. AI推理服务核心概念 1.1 什么是AI推理服务 AI推理服务是指将训练好的AI模型部署为可访问的服务,用于实时或批量处理推理请求。在Kubernetes环境中,AI推理服务需要考虑资源管理、性能优化和高可用性。 1.2 常见的AI推理框架 * TensorFlow Serving:Google开源的机器学习模型服务框架 * TorchServe:PyTorch官方的模型服务框架 * ONNX Runtime:微软开源的跨平台推理引擎 * Triton Inference Server:NVIDIA开源的高性能推理服务器 2. GPU资源管理 2.1 安装GPU驱动和NVIDIA Device Plugin # 安装NVIDIA驱动(在节点上执行) apt-get install -y nvidia-driver-535 # 安装NVIDIA Device Plugin kubectl apply -f https://raw.githubusercontent.com/NVIDIA/

无线联邦学习:在保护隐私的无线网络中,让AI协同进化

无线联邦学习:在保护隐私的无线网络中,让AI协同进化

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:无线通信技术,本专栏介绍无线通信相关技术 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 无线联邦学习:在保护隐私的无线网络中,让AI协同进化 一、什么无线联邦学习? 想象这样一个场景:全国各地的医院都想联合训练一个AI模型来诊断疾病,但患者的医疗数据极其敏感,不能离开医院。传统方法是把所有数据集中到一个中心服务器,但这会造成隐私泄露风险。怎么办? 无线联邦学习就像一位“知识快递员”——它不收集原始数据,而是让各地的医院在本地训练模型,然后只把模型“更新心得”(梯度或参数)通过无线网络传给中心服务器,由服务器汇总大家的智慧,形成一个更强大的模型。 核心思想 * 数据不动模型动:原始数据永远留在本地设备 * 仅上传模型更新:只传输学习到的参数,而非数据本身 * 无线传输媒介:通过Wi-Fi、5G等无线网络进行通信 本地设备3 本地设备2 本地设