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

5. 实现一个中间件

 原文地址: 实现一个中间件 更多内容请关注:php代码框架

理解中间件

中间件(Middleware) 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务,如身份验证、日志记录、CORS 处理等。

在本例中,认证中间件将检查用户是否已登录,若未登录,则重定向到登录页面。


定义中间件接口

首先,定义一个中间件接口,确保所有中间件类都实现该接口。这有助于保持中间件的一致性和可扩展性。

步骤:

  1. 创建 Middleware 接口

    在 src/Middleware/ 目录下创建 Middleware.php 文件,并定义接口:

    <?php
    // src/Middleware/Middleware.phpnamespace MyFrameworkMiddleware;interface Middleware
    {/*** 处理请求** @param array $params 路由参数* @return bool 返回 `true` 继续执行,`false` 中止执行*/public function handle($params);
    }
    ?>

    说明:

    • handle 方法:接收路由参数,执行中间件逻辑。返回 true 表示请求可以继续执行,返回 false 则中止执行。


创建认证中间件

接下来,创建具体的认证中间件,实现上述接口。

步骤:

  1. 创建 AuthenticationMiddleware 类

    在 src/Middleware/ 目录下创建 AuthenticationMiddleware.php 文件:

    <?php
    // src/Middleware/AuthenticationMiddleware.phpnamespace MyFrameworkMiddleware;class AuthenticationMiddleware implements Middleware
    {public function handle($params){session_start();if (isset($_SESSION['user'])) {// 已认证,允许继续return true;} else {// 未认证,重定向到登录页面header('Location: /login');exit();}}
    }
    ?>

    说明:

    • 认证逻辑:检查 $_SESSION['user'] 是否存在,判断用户是否已登录。

    • 未认证处理:若未登录,使用 header 函数重定向到 /login 路由,并使用 exit() 终止脚本执行。


更新路由器以支持中间件

为了让路由器能够识别和执行中间件,需要对现有的 Router 类进行修改。

步骤:

  1. 扩展路由定义以包含中间件

    修改 Router 类,使其能够接受中间件参数。

  2. 更新 Router.php 文件

    在 src/Router.php 中进行如下修改:

    <?php
    // src/Router.phpnamespace MyFramework;use MyFrameworkMiddlewareMiddleware;class Router
    {private $routes = [];/*** 添加路由规则** @param string $method HTTP 方法(GET, POST, etc.)* @param string $uri 请求的 URI,支持参数,例如 '/user/{id}/profile'* @param string $action 控制器和方法,例如 'UsersController@showProfile'* @param array $middlewares 中间件列表*/public function add($method, $uri, $action, $middlewares = []){// 转换 URI 模式为正则表达式,并提取参数名称$pattern = preg_replace_callback('/{([a-zA-Z0-9_]+)(?)?}/', function ($matches) {$param = $matches[1];$optional = isset($matches[2]) && $matches[2] === '?';if ($optional) {return '(?P<' . $param . '>[a-zA-Z0-9_-]+)?';} else {return '(?P<' . $param . '>[a-zA-Z0-9_-]+)';}}, $uri);// 支持可选参数后的斜杠$pattern = preg_replace('#//+#', '/', $pattern);$pattern = '#^' . $pattern . '(/)?$#';// 提取参数名称$params = $this->extractParams($uri);$this->routes[] = ['method'      => strtoupper($method),'pattern'     => $pattern,'action'      => $action,'params'      => $params,'middlewares' => $middlewares];}/*** 分发请求到相应的控制器方法** @param string $requestMethod HTTP 方法* @param string $requestUri 请求的 URI*/public function dispatch($requestMethod, $requestUri){foreach ($this->routes as $route) {if ($route['method'] === strtoupper($requestMethod)) {if (preg_match($route['pattern'], $requestUri, $matches)) {// 提取命名参数$params = [];foreach ($route['params'] as $param) {if (isset($matches[$param]) && $matches[$param] !== '') {$params[$param] = $matches[$param];}}// 执行中间件foreach ($route['middlewares'] as $middlewareClass) {$middleware = new $middlewareClass();if ($middleware instanceof Middleware) {if (!$middleware->handle($params)) {// 中间件中止请求return;}}}$this->executeAction($route['action'], $params);return;}}}// 如果没有匹配的路由,返回 404$this->sendNotFound();}// ... 其他方法保持不变 ...
    }
    ?>

    说明:

    • 路由定义扩展:add 方法现在接受一个可选的 $middlewares 数组,用于指定该路由需要执行的中间件。

    • 中间件执行:在匹配路由后,遍历中间件列表,实例化并调用其 handle 方法。如果任何中间件返回 false,则中止请求处理。


应用中间件到路由

现在,指定哪些路由需要执行认证中间件。

步骤:

  1. 添加需要认证的路由

    在 index.php 中,定义需要认证的路由,并为其指定认证中间件。例如:

    <?php
    // index.phpuse MyFrameworkRouter;
    use MyFrameworkMiddlewareAuthenticationMiddleware;// ... 之前的代码 ...// 定义带有中间件的路由
    $router->add('GET', '/users', 'UsersController@list', [AuthenticationMiddleware::class]);
    $router->add('GET', '/user/{id}', 'UsersController@show', [AuthenticationMiddleware::class]);
    $router->add('GET', '/user/{id}/info/{info?}', 'UsersController@info', [AuthenticationMiddleware::class]);// 定义无需认证的登录路由
    $router->add('GET', '/login', 'AuthController@showLoginForm');
    $router->add('POST', '/login', 'AuthController@login');// 其他无需认证的路由
    $router->add('GET', '/', 'HomeController@index');
    $router->add('GET', '/about', 'HomeController@about');
    $router->add('GET', '/contact', 'HomeController@contact');
    $router->add('POST', '/submit', 'HomeController@submit');// 处理请求
    $router->dispatch($requestMethod, $requestUri);
    ?>

    说明:

    • 指定中间件:为需要认证的路由添加 [AuthenticationMiddleware::class],这将确保这些路由在执行控制器方法前进行身份验证。

    • 登录路由例外:登录相关的路由(如 /login)无需认证,因此不指定中间件。

  2. 创建认证控制器

    需要确保有一个 AuthController,包含 showLoginForm 和 login 方法,用于显示登录表单和处理登录逻辑。

    <?php
    // src/Controllers/AuthController.phpnamespace MyFrameworkControllers;use MyFrameworkController;
    use MonologLogger;
    use MonologHandlerStreamHandler;class AuthController extends Controller
    {private $logger;public function __construct(){$this->logger = new Logger('auth');$this->logger->pushHandler(new StreamHandler(__DIR__ . '/../../logs/app.log', Logger::DEBUG));}public function showLoginForm(){// 显示登录表单echo '<form method="POST" action="/login"><label>用户名: <input type="text" name="username" required></label><br><label>密码: <input type="password" name="password" required></label><br><button type="submit">登录</button></form>';}public function login(){// 处理登录逻辑$username = $_POST['username'] ?? '';$password = $_POST['password'] ?? '';// 简单示例:假设用户名和密码均为 'admin'if ($username === 'admin' && $password === 'admin') {session_start();$_SESSION['user'] = $username;$this->logger->info("用户登录成功", ['username' => $username]);header('Location: /users');exit();} else {$this->logger->warning("用户登录失败", ['username' => $username]);echo "<p>登录失败,请重试。</p>";$this->showLoginForm();}}public function logout(){session_start();unset($_SESSION['user']);session_destroy();header('Location: /login');exit();}
    }
    ?>

    说明:

    • 登录逻辑:在 login 方法中验证用户凭证,成功后将用户信息存入 $_SESSION,并重定向到受保护的路由。

    • 登出功能:可选,提供 logout 方法以允许用户登出。


处理认证逻辑

在认证中间件和认证控制器中正确处理用户会话和认证状态。

关键点:

  1. 会话管理

    • 在中间件和控制器中使用 session_start() 来管理会话。

    • 确保在每个需要访问 $_SESSION 的地方调用 session_start()

  2. 保护受限路由

    • 使用认证中间件保护所有需要认证的路由。

    • 确保登录路由不受认证中间件保护,以防止死循环重定向。

  3. 重定向逻辑

    • 未认证用户访问受限路由时,中间件将其重定向到登录页面。

    • 登录成功后,用户被重定向到之前尝试访问的受限页面,或默认的受限页面(如 /users)。


总结

通过以上步骤,在自定义的 PHP 框架中成功添加了身份认证的中间件,实现了以下功能:

  1. 中间件接口:定义了一个通用的中间件接口,确保所有中间件的一致性。

  2. 认证中间件:实现了 AuthenticationMiddleware,用于检查用户是否已登录。

  3. 路由器增强:更新了 Router 类,使其能够识别和执行路由中指定的中间件。

  4. 路由定义更新:在路由定义中为需要认证的路由指定了认证中间件,确保这些路由在访问前进行身份验证。

  5. 认证控制器:创建了 AuthController,包含显示登录表单和处理登录逻辑的方法。

扩展建议:

  1. 中间件堆栈:支持为路由指定多个中间件,按顺序执行。

  2. 全局中间件:实现全局中间件功能,对所有路由统一应用某些中间件(如日志记录)。

  3. 中间件参数:允许为中间件传递参数,以增强中间件的灵活性。

  4. 更复杂的认证机制:集成更安全的认证机制,如密码哈希、令牌验证等。

  5. 错误处理:增强中间件中的错误处理,提供更友好的错误信息和页面。

相关文章:

5. 实现一个中间件

原文地址: 实现一个中间件 更多内容请关注&#xff1a;php代码框架 理解中间件 中间件&#xff08;Middleware&#xff09; 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务&#xff0c;如身份验证、日志记录、CORS 处理等。 在…...

数据库理论基础

数据库理论基础 1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c;是长期存放在…...

STM32学习笔记之振荡器(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

SQL Server安装程序无法启动:系统兼容性检查失败

问题现象&#xff1a; 运行 SQL Server 2022 安装程序时&#xff0c;提示 “硬件或软件不满足最低要求”&#xff0c;安装向导直接退出或无法继续。 快速诊断 操作系统版本检查&#xff1a; # 查看 Windows 版本&#xff08;需 20H2 或更高&#xff09; winver 支持的系统&…...

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持&#xff0c;其中包括两个重要的函数&#xff1a;std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…...

树形结构的工具类TreeUtil

这个地方是以null为根节点&#xff0c;相关以null或者0自己在TreeUtil中加代码&#xff0c;就行 基础类 package com.jm.common.entity;import lombok.Data;import java.util.ArrayList; import java.util.List;/*** Author:JianWu* Date: 2025/3/26 9:02*/ Data public clas…...

【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody2D)

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

人员进出新视界:视觉分析算法的力量

视觉分析赋能离岗检测新策略 随着时代的发展&#xff0c;失业率增加&#xff0c;社会安保压力也随之增大。企业为了提升管理效率&#xff0c;保障园区安全&#xff0c;对员工离岗检测的需求日益迫切。传统的离岗管理方式&#xff0c;如人工巡逻、打卡记录等&#xff0c;不仅效率…...

LabVIEW液压振动锤控制系统

在现代工程机械领域&#xff0c;液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件&#xff0c;展开液压振动锤启停共振控制技术的研究与应用&#xff0c;探讨如何通过改进控制系统来优化液压振动锤的工作性能&#xff0c;确保其在复杂工况下的稳定性与效率。 ​ …...

Slidev使用(一)安装

文章目录 1. **安装位置**2. **使用方式**3. **适用场景**4. **管理和维护** 全局安装1. **检查 Node.js 和 npm 是否已安装**2. **全局安装 Slidev CLI**3. **验证安装是否成功**4. **创建幻灯片文件**5. **启动 Slidev**6. **实时编辑和预览**7. **构建和导出&#xff08;可选…...

浙大:DeepSeek技术溯源及前沿探索

浙江大学DS系列专题《DeepSeek技术溯源及前沿探索》由朱强教授主讲&#xff0c;内容主要包括 语言模型、Transformer、ChatGPT、DeepSeek及新一代智能体 等核心主题。 下载方式&#xff1a;关注“渡江客涂鸦板”&#xff0c;回复ds1253免费获取下载地址 语言模型&#xff1a;语…...

【八股】未知宽高元素水平垂直居中的三种方法

在笔试/面试中&#xff0c;经常出现的一个问题就是&#xff1a;如何实现元素水平垂直居中&#xff1f; 本文会直接使用代码&#xff0c;介绍未知宽高元素水平垂直居中的三种方法&#xff1a; 方法一&#xff1a;绝对定位absolute //绝对定位&#xff0c;将元素的左右位置设置…...

23种设计模式-中介者(Mediator)设计模式

中介者设计模式 &#x1f6a9;什么是中介者设计模式&#xff1f;&#x1f6a9;中介者设计模式的特点&#x1f6a9;中介者设计模式的结构&#x1f6a9;中介者设计模式的优缺点&#x1f6a9;中介者设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…...

(免费开源)图片去水印以及照片擦除功能,你会选择使用吗?

图片去水印以及相关人物擦除是一个非常小众的需求&#xff0c;就是将原本图片上的文字或者logo去除让变成一个干净的图片&#xff0c;但市面上很多都是付费的&#xff0c;今天就介绍一下这款免费工具。 工具演示效果 工具介绍 名称&#xff1a;lama-projct 利用AI模型训练LaM…...

Rust 学习笔记(一)

本文是博主学Rust的学习笔记&#xff0c;将学习经历整理下来&#xff0c;学习接收的内容更加条理且以便回顾。 参照学习资料为Rust官方文档&#xff0c;如内容中有误还请指点&#xff08;一般没有☺&#xff09; 一. 项目搭建 1.创建项目 cargo new hello_cargo cd hello_c…...

C++vector常用接口和模拟实现

C中的vector是一个可变容量的数组容器&#xff0c;它可以像数组一样使用[]进行数据的访问&#xff0c;但是又不像C语言数组空间是静态的&#xff0c;它的空间是动态可变的。 在日常中我们只需要了解常用的接口即可&#xff0c;不常用的接口查文档即可。 1.构造函数 //空构造…...

AI数据分析:一键生成数据分析报告

作为一名数据分析师&#xff0c;我们经常需要做一些数据分析报告&#xff0c;今天我就来手把手教你如何使用大模型一键生成高质量的数据分析报告&#xff0c;提高你的工作效率。 假设你是一家新零售企业的销售分析师&#xff0c;有一份销售数据&#xff0c;数据结构如数据结构…...

leetcode 2829. k-avoiding 数组的最小总和 中等

给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组&#xff0c;如果其中不存在任何求和等于 k 的不同元素对&#xff0c;则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1&#xff1a; 输入&#xff1a;n 5, k 4 输出&…...

微信小程序登录和获取手机号

目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号&#xff08;可以去微信公众平台创建一个测试号或者正式号&#xff09; appid&#xff1a;小程序id …...

漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)

漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…...

华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统

今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装&#xff0c;本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…...

Graphpad Prism for Mac医学绘图

Graphpad Prism for Mac医学绘图 文章目录 Graphpad Prism for Mac医学绘图一、介绍二、效果三、下载 一、介绍 GraphPad Prism for Mac是一款功能强大、易于使用的科学和统计分析软件&#xff0c;适用于各种类型的数据处理和可视化需求。无论您是进行基础研究、临床试验还是学…...

单多表查询练习

课堂代码练习 mysql> select * from t_heros; ----------------------------- | id | name | books | ----------------------------- | 1 | 孙悟空 | 西游记 | | 2 | 猪八戒 | 西游记 | | 3 | 林黛玉 | 红楼梦 | | 4 | 贾宝玉…...

SICAR标准 汽车焊装生产线触摸屏操作说明

目录 SIMATIC HMI 是西门子工业自动化解决方案的核心组件&#xff0c;支持实时设备监控与交互&#xff0c;文档中展示了其在焊装生产线中以SICAR标准为基础的具体应用&#xff0c;包括车型切换&#xff08;如 AY2/A26&#xff09;、KMC 夹具配置及能源效率分析&#xff0c;适用…...

Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程

文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师&#xff0c;还是刚接触图像处理的新手&#xff0c…...

SylixOS 中 select 原理及使用分析

1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符&#xff0c;等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指&#xff1a;文件描述符不再是阻塞状…...

F1C200S编译

一、查看荔枝派Nano的分区内容 分成了两个分区 将第一个分区通过mount进行挂载&#xff0c;查看到内容包括&#xff1a;主要是dtb设备树和zImage压缩的内核。由于u-boot不是是通过dd指令传输到指定的位置&#xff0c;因此这里不显示。还有一个scr&#xff0c;这是一个uboot启动…...

边缘计算 vs. 云计算,谁才是工业物联网的未来?

前言 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理&#xff0c;但随着设备数量的激增&#xff0c;这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…...

vue 使用v-model实现父子组件传值——子父组件同步更新

基于vue2和vue3两个版本的框架略显不同&#xff0c;所以我分开的来讲&#xff1a; 1、vue2 子组件&#xff08;my-input.vue&#xff09;&#xff1a; <template><input type"text" :value"name" input"inputChange" /> </tem…...

监控易运维在北京某医药集团数字新基建项目中的应用

随着信息技术的快速发展&#xff0c;企业数字化转型已成为当今时代的趋势。北京某医药公司作为一家知名的中医药企业&#xff0c;也在积极推进数字化建设。在数字新基建招标项目中&#xff0c;监控易管理平台 6.0 凭借其强大的功能和特点&#xff0c;成功中标&#xff0c;为医药…...

小智AI音频开发 libopus + Eclipse C/C++ MinGW 编解码测试用例

小智AI音频开发 libopus Eclipse C/C MinGW 编解码测试用例 目录 小智AI音频开发 libopus Eclipse C/C MinGW 编解码测试用例前言移植编解码测试libopus编码器的控制参数信号类型比特率带宽编码复杂度前向纠错声道不连续传输位深帧持续时长码率VBR约束应用类型 示例代码 前言…...

Spring Boot定时任务设置与实现

Spring Boot定时任务设置与实现 在Spring Boot中&#xff0c;可以使用Scheduled注解来创建定时任务。以下是一个简单的示例&#xff0c;展示了如何在项目启动后每5秒调用一次指定的方法。 1. 添加依赖 首先&#xff0c;确保你的pom.xml文件中包含Spring Boot的依赖&#xff…...

海康/大华/宇视/华为/汉邦/天地伟业/英飞拓/科达/中星微/同为/天视通等主流监控设备RTSP地址

RTSP协议是TCP/IP协议体系中的一个应用层协议&#xff0c;该协议主要规定了一对多应用程序如何有效地通过IP网络传送多媒体数据&#xff0c;特别适用于音视频数据的实时传输和控制。 目前监控市场厂家众多&#xff0c;各个厂家的RTSP地址格式不尽一致 以下是海康威视、大华股份…...

FreeRTOS 队列结构体 xQUEUE 深度解析

一、核心成员与功能设计 FreeRTOS 的队列结构体 xQUEUE 是任务间通信&#xff08;IPC&#xff09;的核心数据结构&#xff0c;通过统一的设计支持队列、信号量、互斥量等多种同步机制。其设计体现了 ​**"数据拷贝 结构复用"** 的理念&#xff0c;兼顾轻量化与扩展…...

system V 消息队列信息量(了解)

目录 system V 消息队列 消息队列的基本原理 消息队列数据结构 消息队列接口介绍 消息队列相关函数 消息队列的释放 向消息队列发送数据 向消息队列接收消息 System V 信号量 信号量相关概念 信号量的数据结构 信号量相关函数 进程互斥 system V IPC联系 system V…...

CSS rem、vw/vh、less

目录 分辨率、视口与二倍图 一、分辨率与像素基础 1. 物理像素&#xff08;Physical Pixels&#xff09; 2. 逻辑像素&#xff08;CSS 像素&#xff09; 二、视口&#xff08;Viewport&#xff09;控制 1. 视口类型 2. 设置理想视口 三、二倍图&#xff08;Retina/HiD…...

CHI协议——retry

一、核心目标 防止请求阻塞&#xff1a;当Completer暂时无法处理请求(比如tracker不够被占满)时&#xff0c;通过retry机制避免请求在 REQ Channel堆积&#xff0c;确保系统流畅运行。 retry机制只存在于REQ Channel&#xff0c;在DAT/RSP/SNP Channel不存在 二、Retry Flow…...

在linux部署网站

在Linux部署网站&#xff0c;需要准备一个纯净的系统 一、系统环境准备 1.设置静态IP地址 ‌ 2.关闭默认防火墙 systemctl disable firewalld --now ‌ 3.配置SSH密钥登录 4.yum update -y && reboot # 更新系统内核 5.yum install -y wget curl unzip # 安装…...

语义网是什么

语义网&#xff08;Semantic Web&#xff09;是由万维网发明者 蒂姆伯纳斯-李&#xff08;Tim Berners-Lee&#xff09; 在20世纪90年代末提出的概念&#xff0c;目标是让互联网上的数据不仅对人类可读&#xff0c;还能被机器自动理解、关联和推理。它通过为数据添加明确的语义…...

51单片机

本文来源&#xff1a;腾讯元宝 51单片机是对所有兼容Intel 8031指令系统的8位单片机的统称&#xff0c;其技术起源于1981年Intel推出的8051内核微控制器(Micro Control Unit)。作为嵌入式系统领域的经典代表&#xff0c;它具有以下核心特点和应用价值&#xff1a; 一、技术特…...

初2数学-1.勾股定理

复习勾股定理&#xff1a; 1. ; 2. ; 3. ; 4. 后面3个式子都是根据相似三角形对应边成比例推出来的。 第4个式子来做例子&#xff1a; 三角形CBD与三角形 ACD相似&#xff0c;所以&#xff1a; h:c2 c1 : h. 【例题] ABCD为菱形&#xff0c;边长为…...

Java条码与二维码生成技术详解

一、技术选型分析 1.1 条码生成方案 Barbecue是最成熟的Java条码库&#xff0c;支持&#xff1a; Code 128EAN-13/UPC-AUSPS Inteligent Mail等12种工业标准格式 1.2 二维码方案对比 库名称维护状态复杂度功能扩展性ZXing★★★★☆较高强QRGen★★★☆☆简单一般BoofCV★…...

Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)

Spring Boot 集成 Quartz 实现定时任务&#xff08;Cron 表达式示例&#xff09; 前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Spring Boot 观察定时任务执行5. Quartz Cron 表达式详解6. 结论 前言 在 Spring Boot 项目中&#xff0c;我们经常…...

数智读书笔记系列025《智能医疗:医学人工智能的未来》

一、书籍概述与核心价值 1.1 书籍定位与影响力 《智能医疗:医学人工智能的未来》在智能医疗领域占据着独特且重要的位置,作为首部由德勤管理咨询引进的 AI 医疗译著,它宛如一座桥梁,连接了人工智能与生物医学这两个看似独立却又紧密关联的领域。在当下智能医疗蓬勃发展但…...

SQL Server 2022常见问题解答

以下是SQL Server 2022的常见问题解答,按主题分类整理: 一、安装与升级 SQL Server 2022的系统要求是什么? 支持的操作系统:Windows Server 2016及以上、Linux(Ubuntu 20.04/22.04, RHEL 8/9等)。内存:至少4GB(建议8GB+)。磁盘空间:6GB以上,具体取决于安装组件。如何…...

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…...

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15&#xff08;2016&#xff09; 核心架构&#xff1a;Stack Reconciler&#xff08;栈协调器&#xff09; 工作原理&#xff1a; 同步递归渲染&#xff1a;采用深度优先遍历方式递归处理 Virtual DOM&#xff0c;形成不可中断的调用栈渲染流程&#xff1a;1. 触发 …...

[Windows] Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏

微软Edge浏览器 绿色便携增强版 长期更新 链接&#xff1a;https://pan.xunlei.com/s/VOMA-aVC_GPJiv-MzRS89lsVA1?pwdemxj# Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏...

STM32学习笔记之存储器映射(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…...