当前位置: 首页 > news >正文

基于 Spring 的自定义注解和请求拦截器实现认证机制

基于 Spring 的自定义注解和请求拦截器实现认证机制

  • 一、基于 Spring 的自定义注解和请求拦截器实现认证机制
    • 1. 背景
    • 2. 业务场景
    • 3. 核心实现
      • 3.1 定义自定义注解 `@IgnoreAuth`
      • 3.2 定义请求拦截器 `AuthInterceptor`
      • 3.3 配置拦截器
      • 3.4 登录接口
    • 4. 小结


一、基于 Spring 的自定义注解和请求拦截器实现认证机制

在现代 Web 开发中,用户认证与权限控制是确保应用安全的重要环节。为了简化和统一用户身份验证,很多系统会在请求处理链中引入认证中间件,确保每个请求都经过适当的身份验证。本文将通过一个基于 Spring 框架的实现例子,介绍如何使用自定义注解和请求拦截器来完成认证机制。

1. 背景

随着 Web 应用的复杂性增加,接口的访问权限管理也变得越来越重要。在传统的身份验证中,用户通常会提交用户名和密码,服务器通过验证这些信息来识别用户身份。然而,随着前后端分离架构的流行,接口认证(如 JWT)逐渐成为一种常见的认证方式。为了增强开发的灵活性和可维护性,我们可以通过自定义注解来简化认证逻辑。

在这篇文章中,我们将通过一个具体例子,展示如何使用 Spring 的拦截器和自定义注解来实现认证机制,并控制接口的访问权限。

2. 业务场景

假设我们有一个 Web 应用,用户可以通过提交用户名和密码来登录。如果验证成功,系统将返回一个 Token,前端应用会将 Token 存储起来,在后续的请求中通过 HTTP 请求头携带该 Token。对于需要认证的接口,系统需要验证请求中的 Token 是否有效。

同时,某些接口,如用户注册接口、文件上传接口等,不需要身份认证,可以通过一个自定义注解来标识这些接口。

3. 核心实现

3.1 定义自定义注解 @IgnoreAuth

首先,我们需要定义一个自定义注解,用于标识那些不需要认证的接口。这些接口可以直接放行,无需进行 Token 验证。

@Target(ElementType.METHOD) // 注解作用在方法上
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时可用
@Documented
public @interface IgnoreAuth {
}
  • @Target(ElementType.METHOD):该注解仅能应用于方法上。
  • @Retention(RetentionPolicy.RUNTIME):表示该注解会在运行时保留,可以通过反射机制获取。
  • @Documented:表示该注解会出现在 Javadoc 中。

3.2 定义请求拦截器 AuthInterceptor

接下来,我们实现一个请求拦截器 AuthInterceptor,该拦截器会在请求处理之前执行,检查请求是否需要认证。

public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取请求路径String servletPath = request.getServletPath();// 放行不需要认证的路径if ("/dictionary/page".equals(servletPath) || "/file/upload".equals(servletPath) || "/yonghu/register".equals(servletPath)) {return true;}// 跨域配置response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Headers", "Token, Origin, Content-Type, Accept, Authorization");response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));// 判断方法是否有 @IgnoreAuth 注解,如果有则跳过认证if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;IgnoreAuth annotation = handlerMethod.getMethodAnnotation(IgnoreAuth.class);if (annotation != null) {return true; // 如果有 @IgnoreAuth 注解,直接放行}}// 执行 Token 验证(假设我们有一个 TokenService 处理此逻辑)String token = request.getHeader("Token");if (token == null || !tokenService.validateToken(token)) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回未授权状态response.getWriter().write("Unauthorized access");return false; // 认证失败,拦截请求}// 认证通过,继续执行请求return true;}
}

在上面的 AuthInterceptor 中:

  • 我们首先检查请求的路径是否属于不需要认证的接口。如果是,则直接放行。
  • 如果请求的路径需要认证,拦截器会通过 Token 进行身份验证。如果 Token 验证失败,返回 401 状态码(未授权)。
  • 另外,我们还为跨域请求设置了相关的响应头,确保支持跨域资源共享(CORS)。

3.3 配置拦截器

要使拦截器生效,我们需要将其注册到 Spring MVC 的拦截器链中。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate AuthInterceptor authInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authInterceptor).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/login", "/yonghu/register", "/file/upload"); // 排除登录、注册等接口}
}

WebConfig 类中,我们通过实现 WebMvcConfigurer 接口,注册了 AuthInterceptor 拦截器,并指定了拦截的路径(这里是所有路径 /**),并排除了登录、注册、文件上传等不需要认证的接口。

3.4 登录接口

假设我们有一个登录接口,用户通过用户名和密码进行登录。登录成功后,我们为用户生成一个 Token,并返回给前端。

@RestController
public class AuthController {@Autowiredprivate UsersService usersService;@Autowiredprivate TokenService tokenService;@PostMapping("/login")public R login(@RequestParam String username, @RequestParam String password) {// 验证用户信息UsersEntity user = usersService.findByUsername(username);if (user == null || !user.getPassword().equals(password)) {return R.error("Invalid username or password");}// 生成 TokenString token = tokenService.generateToken(user.getId(), user.getUsername());return R.ok().put("token", token);}
}

login 方法中,用户提交用户名和密码后,我们查询用户信息,如果验证成功,则生成一个 Token,并将其返回给前端。

4. 小结

在本文中,我们通过一个具体的例子展示了如何在 Spring 应用中使用自定义注解和请求拦截器实现认证机制。主要的步骤包括:

  1. 使用 @IgnoreAuth 注解标识不需要认证的接口。
  2. 使用 AuthInterceptor 拦截器,在请求到达控制器之前检查 Token 是否有效。
  3. 配置拦截器生效的路径。
  4. 实现登录接口,并为用户生成 Token。

通过这种方式,我们可以轻松地管理和扩展应用中的认证机制,确保系统的安全性。

相关文章:

基于 Spring 的自定义注解和请求拦截器实现认证机制

基于 Spring 的自定义注解和请求拦截器实现认证机制 一、基于 Spring 的自定义注解和请求拦截器实现认证机制1. 背景2. 业务场景3. 核心实现3.1 定义自定义注解 IgnoreAuth3.2 定义请求拦截器 AuthInterceptor3.3 配置拦截器3.4 登录接口 4. 小结 一、基于 Spring 的自定义注解…...

Java编程规约:集合处理

文章目录 I 集合处理【强制】【推荐】II 知识扩展I 集合处理 【强制】 不要在 foreach 循环里进行元素的 remove / add 操作。remove 元素请使用 iterator 方式,如果并发操作,需要对 iterator 对象加锁。// 正例: List<String> list = new ArrayList<>(...

python使用PyQt5,整套,桌面应用

安装 安装 pip install PyQt55.7.1 pip install PyQtWebEngine1、创建窗口&#xff0c;按百分比划分 from PyQt5.QtGui import QGuiApplication from PyQt5.QtWidgets import QApplication, QWidget # 创建应用程序实例 app QApplication([]) # 创建主窗口 window QWidget(…...

机械臂的各种标定

文章目录 1. 工具坐标系标定2. 工具手标定3. 手眼标定联系 在工程中&#xff0c;同时使用工具坐标系标定、工具手标定和手眼标定的概念、目的和作用如下&#xff1a; 1. 工具坐标系标定 概念&#xff1a; 工具坐标系标定是指确定工具相对于机器人坐标系的位置和姿态关系的过程…...

金融租赁系统助力企业转型与市场竞争力提升

内容概要 在现代商业环境中&#xff0c;金融租赁系统不仅是一个简单的工具&#xff0c;而是企业转型的重要推动力。通过优化业务流程&#xff0c;提升自动化水平&#xff0c;它帮助企业在复杂的市场中找到自己的立足之地。想象一下&#xff0c;一个企业在使用传统方法时&#…...

正则表达式 - 运算符优先级

正则表达式 - 运算符优先级 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,它通过特定的语法规则来匹配、查找和替换文本中的特定模式。在正则表达式中,运算符的优先级决定了表达式各部分的处理顺序,这对于正确理解和编写正则表达式至关重要…...

【python】unittest单元测试

文章目录 基本使用不同启动方式的区别 基本使用 下面是根据文档写的一个demo&#xff0c;主要的内容基本都包含了&#xff0c;使用时导入自己的业务类测试类中的方法就行。 import unittest# 测试类不强制test开头&#xff0c;仅作为规范。但必须继承unittest.TestCase class…...

【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7817897.html?templateId1718516 以gis表为例&#xff1a; drop table gis; create table gis(id number not null, pos st_geometry not null); 使用如下的java代码片断&#xff0c…...

基于 LangChain 实现数据库问答机器人

基于 LangChain 实现数据库问答机器人 一、简介二、应用场景三、实战案例1、需求说明2、实现思路3、对应源码 一、简介 在 Retrieval 或者 ReACT 的一些场景中&#xff0c;常常需要数据库与人工智能结合。而 LangChain 本身就封装了许多相关的内容&#xff0c;在其官方文档-SQ…...

XIAO ESP32 S3网络摄像头——2视频获取

本文主要是使用XIAO Esp32 S3制作网络摄像头的第2步,获取摄像头图像。 1、效果如下: 2、所需硬件 3、代码实现 3.1硬件代码: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 设…...

图像描述/字幕开源模型与数据集全览

图像描述/字幕&#xff08;Image Captioning&#xff09;是用文字描述图像内容的任务&#xff0c;属于计算机视觉和自然语言处理的交叉领域。大多数图像描述系统采用编码器-解码器&#xff08;encoder-decoder&#xff09;框架&#xff0c;其中输入图像被编码为中间表示形式&am…...

关于UE加载osgb数据的研究(一)

最近关于倾斜数据在UE中加载显示的问题,直接转换格式本地加载的方式避免了数据延迟加载、缓存加载,动态刷新等问题,但是也暴露了突出的问题:常规的模型格式会丢失掉倾斜数据的lod,致使效果缺失。 故而需要深入研究一下UE加载osgb数据的方式方法。 首先,我们需得学习一下…...

Hypervisor 的两种类型

文章目录 一、定义 Hypervisor&#xff08;也被称为虚拟机监视器&#xff0c;即Virtual Machine Monitor&#xff0c;VMM&#xff09;是一种创建和运行虚拟机的软件、固件或硬件。它可以在物理主机上划分出多个虚拟的计算环境&#xff0c;使得多个操作系统&#xff08;Guest Op…...

07-ArcGIS For JavaScript--隐藏参数qualitySettings(memory和lod控制)

目录 1、综述2、sceneview.qualitySettings2.1、sceneview.qualitySettings.memoryLimit2.2、lodFactor2.3 additionalCacheMemory 3、结论 1、综述 先上重点&#xff0c;SceneView.qualitySettings为隐藏对象参数&#xff0c;该对象的memoryLimit和lodFactor等值&#xff0c;…...

内训宝企业培训平台 upload/scorm 文件上传致RCE漏洞复现

0x01 产品简介 内训宝企业培训平台是一款专注于企业内部培训的在线平台,由北京内训宝科技有限公司开发并提供服务。旨在为企业提供全方位、个性化的内部培训解决方案。通过该平台,企业可以轻松地组织和管理内部培训活动,提升员工的专业技能和综合素质,进而增强企业的竞争力…...

js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1

效果如下图&#xff1a; 实现思路&#xff1a; 汇总数据&#xff1a;使用 reduce 方法遍历原始数据数组&#xff0c;将相同日期的数据进行合并&#xff0c;并计算每个日期的总和。创建日期映射&#xff1a;创建一个映射 dateMap&#xff0c;存储每个日期的对象列表。排序并添加…...

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时&#xff0c;会提示您安装驱动程序。单击“是”确认安装&#xff0c;然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列&#xff08;iOS14.4及以上&#xff09;&#xff0c;您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…...

修改表字段属性,SQL总结

MYSQl varchar转为mediumtext ALTER TABLE table_name MODIFY COLUMN column_name mediumtext; ALTER TABLE table_name MODIFY COLUMN column_name varchar(255) 1. 修改字段的数据类型 使用 MODIFY COLUMN 可以改变字段的数据类型、长度、默认值或注释&#xff0c;但不会更…...

艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!

Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在简化您的工作流程&#xff0c;提升工作效率。 我们一直致力于构建强大的开发者生态系统&#xff0c;并在您工作的每一步提…...

PHP 中的魔术常量

概述 PHP提供了9个魔术常数&#xff0c;您可以在PHP应用程序代码中使用。它们是“神奇的”&#xff0c;因为它们是在编译时定义的&#xff0c;不像常规常量&#xff08;您可以自己定义&#xff09;是在运行时定义的。这意味着它们的值可以根据它们在代码中的使用位置而更改。 …...

培训机构Day20

今天还是讲一些基本的js知识点。 知识点&#xff1a; html css &#xff1a;框架结构 样式修饰 javascript&#xff1a;行为交互&#xff0c;动态效果。有逻辑的语言。动态脚本语言。无需编译&#xff0c;解释执行。 寄生在网页上执行。浏览器内核自带js解释器。 js引入三…...

Day62 图论part11

Floyd 算法精讲 Floyd 算法代码很简单&#xff0c;但真正理解起原理 还是需要花点功夫&#xff0c;大家在看代码的时候&#xff0c;会发现 Floyd 的代码很简单&#xff0c;甚至看一眼就背下来了&#xff0c;但我为了讲清楚原理&#xff0c;本篇还是花了大篇幅来讲解。 代码随想…...

【Golang 面试题】每日 3 题(十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

云手机+Facebook:让科技与娱乐完美结合

移动互联网时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现&#xff0c;则为Facebook营销注入了新的活力&#xff0c;其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…...

2024年总结与展望

23年底的时候&#xff0c;和一大批同事一起转到刚成立的合资公司&#xff0c;当时大家都以为会是好的归宿&#xff0c;毕竟外资文化&#xff0c;投了这么多钱&#xff0c;起码两三年内应该是稳定、不内卷的&#xff0c;似乎可以安心工作&#xff0c;安心生活。2024的开头确实挺…...

标准流,浮动,Flex布局

三个 div 盒子在一一行显示&#xff0c;但是 div 标签默认是独占一行的 想要实现块级盒子在一行&#xff0c;两种方法&#xff0c;浮动和 Flex 布局 浮动之后的盒子&#xff1a;顶对齐&#xff0c;行内块显示特点&#xff08;宽高显示&#xff09; 浮动的盒子会脱标&#xff0c…...

2 、什么是Java中的不可变类

在Java中&#xff0c;不可变类&#xff08;Immutable Class&#xff09;是指一类其对象一旦创建后&#xff0c;就不能更改其状态&#xff08;即对象的字段值不能被修改&#xff09;的类。不可变类提供了一种安全的方式来管理对象&#xff0c;尤其是在并发编程中&#xff0c;能够…...

网络安全技能试题总结参考

对网络安全技能测试相关的试题进行了总结,供大家参考。 一、单选题 1.(单选题)以下属于汇聚层功能的是 A.拥有大量的接口,用于与最终用户计算机相连 B.接入安全控制 C.高速的包交换 D.复杂的路由策略 答案:D 2.(单选题)VLAN划分的方法,选择一个错误选项 A.基于端口…...

基于Python的社交音乐分享平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

CP AUTOSAR标准之FlexRayDriver(AUTOSAR_SWS_FlexRayDriver)(更新中……)

1 简介和功能概述 FlexRay驱动程序(Fr)抽象了特定FlexRay通信控制器(CC)的硬件相关实现细节。本规范主要依赖于符合FlexRay规范[13]的FlexRay CC。此外,本规范还支持符合FlexRay规范[14]的旧版FlexRay控制器。本SWS中因支持的FlexRay规范不同而导致的不同行为在适用的情况下以…...

AIDD -人工智能药物设计- DrugChat:多模态大语言模型实现药物机制与属性的全方位预测

DrugChat&#xff1a;多模态大语言模型实现药物机制与属性的全方位预测 今天为大家介绍的是来自加州大学圣地亚哥分校谢澎涛团队的一篇论文。准确预测潜在药物分子的作用机制和性质对于推进药物发现至关重要。然而&#xff0c;传统方法通常需要为每个特定的预测任务开发专门的…...

CP AUTOSAR标准之FlexRayInterface(AUTOSAR_SWS_FlexRayInterface)(更新中……)

1 简介和功能概述 该规范指定了AUTOSAR基础软件模块“FlexRay接口”的功能、API和配置。   在AUTOSAR分层软件架构中,FlexRay接口属于ECU抽象层,或者更准确地说,属于通信硬件抽象。这表明了FlexRay接口的主要任务:   为上层提供FlexRay通信系统的抽象接口。至少就数据传…...

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源&#xff0c;我们对共享资源进行保护&#xff0c;就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题&#xff0c;下面是一个抢票的代码&#xff0c;共计票数10000张&#xff0c;4个线程去抢 之前我们展示过封…...

当一个服务拆成两个服务的错误

1.老路由信息没有修改&#xff0c;导致一直404...

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...

Android Room 框架的初步使用

一、简介 Room 是一个强大的对象关系映射库&#xff0c;它允许你将 SQLite 数据库中的表映射到 Java 或 Kotlin 的对象&#xff08;称为实体&#xff09;上。你可以使用简单的注解&#xff08;如 Entity、Dao 和 Database&#xff09;来定义数据库表、数据访问对象&#xff08…...

后盼2024,前顾2025

年年花落又花开&#xff0c;后顾2024&#xff0c;前盼2025~~ 2024年&#xff0c;继续前进&#xff0c;稳扎稳打。 生活 组织并陪伴家人去了理县、成都等地游玩&#xff0c;nice。 出差和旅行去了杭州、西安、成都、江门、珠海等地&#xff0c;嘻嘻。 爱人如养花&#xff0c…...

电子电器架构 ---什么是智能电动汽车上的逆变器?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

Android ActionBar 技术深度解析

Android ActionBar 技术深度解析 概述 ActionBar 是 Android 应用中的一个核心 UI 组件,用于提供导航、操作和品牌展示。它通常位于应用窗口的顶部,包含应用的标题、导航按钮、操作项等。ActionBar 自 Android 3.0(API 11)引入,并在 Android 5.0(API 21)后被 Toolbar …...

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx&#xff0c;使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器&#xff0c;以其高效处理大量并发连接的能力而闻名&#xff0c;这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…...

建立一个Macos载入image的实例含界面

前言 为了方便ios程序的开发&#xff0c;有时候需要先用的Macos平台进行一些功能性的程序开发。 作为对比和参考。 1、创建一个MacOS的App 2、主界面控件的增加 添加的控件方法与ios相同&#xff0c;也是再用commandshiftL&#xff08;CtrlShiftL&#xff09;,就会弹出控件…...

qt5.15.2+visual studio2022 免安装版环境配置

1.环境准备 visual studio2022qt5.15.2&#xff08;免安装版本&#xff09; 2.环境配置 2.1 打开首选项 2.2 添加Qt版本 2.3 构建套件手动添加Qt 5.15.2&#xff08;msvc2019_64&#xff09;并配置如下 3.新建项目 问题1&#xff1a;qt creator 没有欢迎界面 解决办法&#…...

鱼眼相机模型与去畸变实现

1.坐标系说明 鱼眼相机模型涉及到世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系。对于分析鱼眼相机模型&#xff0c;假定世界坐标系下的坐标点,经过外参矩阵的变换转到相机坐标系&#xff0c;相机坐标再经过内参转换到像素坐标&#xff0c;具体如下 进一步进…...

【视觉SLAM:六、视觉里程计Ⅰ:特征点法】

视觉里程计&#xff08;Visual Odometry, VO&#xff09;是通过处理图像序列&#xff0c;估计摄像头在时间上的相对位姿变化的技术。它是视觉SLAM的重要组成部分之一&#xff0c;主要通过提取图像中的信息&#xff08;如特征点或直接像素强度&#xff09;来实现相机运动估计。以…...

SQLiteDataBase数据库

XML界面设计 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_paren…...

正则表达式(三剑客之awk)

1.awk工具的使用 1.1 截取文档中的某个段 1&#xff09;打印以 : 为分隔的第一个字段 [rootlocalhost ~]# head -n3 /etc/passwd | awk -F : {print $1} 2&#xff09;注意事项 -F&#xff1a;作用是指定分隔符。如果不加分隔符&#xff0c;则以空格或者tab为分隔符 print&…...

Python世界:人生苦短,我用Python

Python世界&#xff1a;人生苦短&#xff0c;我用Python 前言Python优势Python缺点 前言 几句话说清&#xff0c;我们为啥要用Python&#xff1f; Python设计之初心&#xff0c;是为了解决编程门槛&#xff0c;让大家更聚焦业务实现&#xff0c;而非编程细节。当前人工智能火…...

DevOps流程CICD之Jenkins使用操作

一、jenkins的docker-compose安装部署 请参考 jenkins的docker安装部署配置全网最详细教程-CSDN博客 二、创建repository 三、创建ssh 四、创建视图 五、创建任务 六、配置gitlab钩子 七、自动构建部署CI/CD验证...

Day60 图论part10

今天大家会感受到 Bellman_ford 算法系列在不同场景下的应用。 建议依然是:一刷的时候,能理解 原理,知道Bellman_ford 解决不同场景的问题 ,照着代码随想录能抄下来代码就好,就算达标。 二刷的时候自己尝试独立去写,三刷的时候 才能有一定深度理解各个最短路算法。 Bell…...

「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏

本篇教程将带你实现一个水果掉落小游戏&#xff0c;掌握基本的动态交互逻辑和鸿蒙组件的使用&#xff0c;进一步了解事件处理与状态管理。 关键词 UI互动应用水果掉落状态管理动态交互游戏开发 一、功能说明 水果掉落小游戏包含以下交互功能&#xff1a; 随机生成水果&#…...