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

thinkphp实现图像验证码

示例

在这里插入图片描述

服务类 app\common\lib\captcha

<?php
namespace app\common\lib\captcha;use think\facade\Cache;
use think\facade\Config;
use Exception;class Captcha
{private $im = null; // 验证码图片实例private $color = null; // 验证码字体颜色// 默认配置protected $config = ['length'      => 4,      // 验证码位数'fontSize'    => 25,     // 字体大小(px)'imageH'      => 0,      // 验证码高度'imageW'      => 0,      // 验证码宽度'useCurve'    => true,   // 是否画混淆曲线'useNoise'    => false,  // 是否添加杂点(已禁用)'bg'          => [243, 251, 254], // 背景颜色'fontttf'     => '',     // 字体文件路径'useZh'       => false,  // 使用中文验证码'math'        => false,  // 算术验证码'alpha'       => 0,      // 透明度(0-127)'api'         => false,  // API模式'fontPath'    => '',     // 字体文件目录'bgPath'      => '',     // 背景图片目录'expire'      => 1800,   // 验证码过期时间(s)];// 简化后的验证码字符集合(仅数字和大写字母)protected $codeSet = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';/*** 构造函数* @param array $config 配置参数*/public function __construct(array $config = []){// 合并配置参数$this->config = array_merge($this->config, Config::get('captcha', []), $config);// 设置字体路径if (empty($this->config['fontPath'])) {$this->config['fontPath'] = __DIR__ . '/ttfs/';}}/*** 生成验证码* @param string $uniqueId 前端传递的唯一标识(如时间戳)* @return string 图片二进制内容*/public function create(string $uniqueId = ''): string{// 清理过期缓存$this->clearExpiredCaptchas();// 如果未提供 uniqueId,则生成一个默认值if (empty($uniqueId)) {$uniqueId = uniqid('captcha_');}// 生成验证码文本$generator = $this->generate($uniqueId);// 计算图片宽高$this->config['imageW'] = $this->config['imageW'] ?: $this->config['length'] * $this->config['fontSize'] * 1.5;$this->config['imageH'] = $this->config['imageH'] ?: $this->config['fontSize'] * 2;// 创建图片资源$this->im = imagecreate((int)$this->config['imageW'], (int)$this->config['imageH']);// 设置背景色$bgColor = imagecolorallocate($this->im,$this->config['bg'][0],$this->config['bg'][1],$this->config['bg'][2]);imagefill($this->im, 0, 0, $bgColor);// 设置字体颜色$this->color = imagecolorallocate($this->im, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));// 添加干扰线if ($this->config['useCurve']) {$this->writeCurve();}// 绘制验证码$text = str_split($generator['value']);$space = $this->config['imageW'] / $this->config['length'];foreach ($text as $index => $char) {// 计算位置$x = $space * $index + mt_rand(5, 10);$y = $this->config['imageH'] / 2 + $this->config['fontSize'] / 2;$angle = mt_rand(-15, 15);imagettftext($this->im,(int)$this->config['fontSize'],$angle,(int)$x,(int)$y,$this->color,$this->getFont(),$char);}ob_start();imagepng($this->im);$content = ob_get_clean();imagedestroy($this->im);return $content;}/*** 验证验证码* @param string $code 用户输入的验证码* @param string $uniqueId 前端传递的唯一标识(如时间戳)* @return bool*/public function check(string $code, string $uniqueId = ''): bool{if (empty($uniqueId)) {return false;}// 从 Cache 中获取数据$cacheData = Cache::get($uniqueId);if (!$cacheData || time() - $cacheData['time'] > $this->config['expire']) {$this->removeCaptchaFromRecords($uniqueId);return false;}// 验证码校验$result = password_verify(strtoupper($code), $cacheData['key']);return $result;}/*** 生成验证码文本* @param string $uniqueId 前端传递的唯一标识(如时间戳)* @return array ['value' => 显示的文本, 'key' => 加密后的验证码]*/protected function generate(string $uniqueId): array{$bag = '';$characters = str_split($this->codeSet);for ($i = 0; $i < $this->config['length']; $i++) {$bag .= $characters[random_int(0, count($characters) - 1)];}$key = strtoupper($bag);// 使用 Bcrypt 加密验证码$hash = password_hash($key, PASSWORD_BCRYPT, ['cost' => 10]);// 将验证码信息存储到 Cache 中Cache::set($uniqueId, ['key' => $hash,'time' => time(),// 'raw' => $key // 调试用,正式环境移除], $this->config['expire']);// 记录到清理队列$this->addCaptchaToRecords($uniqueId);return ['value' => $bag, 'key' => $hash];}/*** 添加验证码记录到清理队列*/protected function addCaptchaToRecords(string $uniqueId): void{$records = Cache::get('captcha_records', []);$records[$uniqueId] = time() + $this->config['expire'];// 限制最大记录数,防止内存占用过大if (count($records) > 1000) {$records = array_slice($records, -500, null, true);}Cache::set('captcha_records', $records);}/*** 从清理队列中移除验证码记录*/protected function removeCaptchaFromRecords(string $uniqueId): void{$records = Cache::get('captcha_records', []);unset($records[$uniqueId]);Cache::set('captcha_records', $records);}/*** 清理过期的验证码缓存*/protected function clearExpiredCaptchas(): void{// 每小时清理一次$lastClear = Cache::get('last_captcha_clear', 0);if (time() - $lastClear < 3600) {return;}$records = Cache::get('captcha_records', []);$now = time();$cleaned = false;foreach ($records as $uid => $expireTime) {if ($expireTime < $now) {Cache::delete($uid);unset($records[$uid]);$cleaned = true;}}if ($cleaned) {Cache::set('captcha_records', $records);Cache::set('last_captcha_clear', time());}}/*** 获取字体文件路径* @return string* @throws Exception*/protected function getFont(): string{if (!empty($this->config['fontttf'])) {return $this->config['fontttf'];}$fonts = glob($this->config['fontPath'] . '*.ttf') +glob($this->config['fontPath'] . '*.otf');if (empty($fonts)) {throw new Exception('验证码字体文件不存在,请检查字体路径: ' . $this->config['fontPath']);}return $fonts[array_rand($fonts)];}/*** 画干扰曲线*/protected function writeCurve(): void{$px = $py = 0;// 曲线前部分$A = mt_rand(1, (int)($this->config['imageH'] / 2)); // 振幅$b = mt_rand((int)(-$this->config['imageH'] / 4), (int)($this->config['imageH'] / 4)); // Y轴偏移$f = mt_rand((int)(-$this->config['imageH'] / 4), (int)($this->config['imageH'] / 4)); // X轴偏移$T = mt_rand($this->config['imageH'], $this->config['imageW'] * 2); // 周期$w = (2 * M_PI) / $T;$px1 = 0; // 起始X坐标$px2 = mt_rand((int)($this->config['imageW'] / 2), (int)($this->config['imageW'] * 0.8)); // 结束X坐标for ($px = $px1; $px <= $px2; $px++) {if ($w != 0) {$py = $A * sin($w * $px + $f) + $b + $this->config['imageH'] / 2;$i = (int)($this->config['fontSize'] / 5);while ($i > 0) {imagesetpixel($this->im, $px + $i, $py + $i, $this->color);$i--;}}}// 曲线后部分$A = mt_rand(1, (int)($this->config['imageH'] / 2));$f = mt_rand((int)(-$this->config['imageH'] / 4), (int)($this->config['imageH'] / 4));$T = mt_rand($this->config['imageH'], $this->config['imageW'] * 2);$w = (2 * M_PI) / $T;$b = $py - $A * sin($w * $px + $f) - $this->config['imageH'] / 2;$px1 = $px2;$px2 = $this->config['imageW'];for ($px = $px1; $px <= $px2; $px++) {if ($w != 0) {$py = $A * sin($w * $px + $f) + $b + $this->config['imageH'] / 2;$i = (int)($this->config['fontSize'] / 5);while ($i > 0) {imagesetpixel($this->im, $px + $i, $py + $i, $this->color);$i--;}}}}
}

控制器调用

// 生成图形验证码public function getCaptcha(){$uid = 'captcha_' . uniqid('', true);$captcha = new \app\common\lib\captcha\Captcha();$img = $captcha->create($uid);return json(['image' => 'data:image/png;base64,'.base64_encode($img),'uid' => $uid]);}// 校验图形验证码public function checkCaptcha(){$code = input('post.code');$uid = input('post.uid');$captcha = new \app\common\lib\captcha\Captcha();$result = $captcha->check($code, $uid);return json(['success' => $result,'input_code' => $code,'uid' => $uid]);}

相关文章:

thinkphp实现图像验证码

示例 服务类 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 验证码图片实例private $color null; // 验证码字体颜色// 默认配置protected $co…...

【Pandas】pandas DataFrame where

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签&#xff08;行标签和列标签&#…...

redis利用备忘录

fofa: icon_hash"864611937" 防护&#xff1a; redis的安全设置&#xff1a;设置完毕&#xff0c;需要重加载配置文件启动redis 1.绑定内网ip地址进行访问 2. requirepass设置redis密码 3.保护模式开启protected-mode开启&#xff08;默认开启&#xff09; 4.最好把…...

【dify实战】chatflow结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载

dify结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载 观看视频&#xff0c;您将学会 在dify下如何快速的构建一个chatflow&#xff0c;来完成数据分析工作&#xff1b;如何在AI的回复中展示可视化的图表&#xff1b;如何在AI 的回复中加入Excel报…...

医疗行业如何构建合成数据平台?——技术、合规与实践全景

目录 医疗行业如何构建合成数据平台&#xff1f;——技术、合规与实践全景 一、为什么医疗领域尤需合成数据&#xff1f; 二、平台功能全景图 ✅ 模块划分&#xff1a; 三、典型合成数据生成方式 1. 结构化病例合成 2. 医学图像生成 3. 多轮医生-患者问答合成 四、数据…...

6.8.最小生成树

一.复习&#xff1a; 1.生成树&#xff1a; 对于一个连通的无向图&#xff0c;假设图中有n个顶点&#xff0c;如果能找到一个符合以下要求的子图&#xff1a; 子图中包含图中所有的顶点&#xff0c;同时各个顶点保持连通&#xff0c; 而且子图的边的数量只有n-1条&#xff0…...

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构&#xff0c;控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下&#xff0c;即 这时控制器的状态方程为&#xff1a; 其中X与Y分别为下面两个代数Riccati方程的解…...

社交媒体时代的隐私忧虑:聚焦Facebook

在数字化时代&#xff0c;社交媒体平台已成为人们日常生活的重要组成部分。Facebook作为全球最大的社交媒体之一&#xff0c;拥有数十亿用户&#xff0c;其对个人隐私的影响和忧虑也日益凸显。本文将探讨社交媒体时代下&#xff0c;尤其是Facebook平台上的隐私问题。 数据收集…...

9.Rust+Axum 测试驱动开发与性能优化全攻略

摘要 本文深入讲解 RustAxum 测试驱动开发及性能优化&#xff0c;涵盖多种测试工具与优化技术。 一、引言 在当今的软件开发领域&#xff0c;测试驱动开发&#xff08;TDD&#xff09;和性能优化是保障软件质量和性能的关键环节。Rust 作为一种安全、高效的系统编程语言&…...

中国首个全国34省3,667个城市多属性建筑数据集(屋顶、高度、结构、功能、风格、年龄、质量等属性)

中国首个全国34省3,667个城市多属性建筑数据集&#xff08;屋顶、高度、结构、功能、风格、年龄、质量等属性&#xff09; 数据介绍 快速获取三维&#xff08;3D&#xff09;建筑数据&#xff0c;包括屋顶、高度和方向等几何属性&#xff0c;以及功能、质量和年龄等指示性属性…...

探索Spring Boot Web模块:设计思想与技术实现

探索Spring Boot Web模块&#xff1a;设计思想与技术实现 在现代Web开发中&#xff0c;Spring Boot作为一个强大的框架&#xff0c;提供了丰富的功能来简化Web应用的开发。本文将深入探讨Spring Boot框架中Web模块的核心类&#xff0c;揭示其设计思想、技术实现以及扩展知识。…...

GitHub创建远程仓库

使用GitHub创建远程仓库&#xff1a;从零开始实现代码托管与协作 前言 在当今软件开发领域&#xff0c;版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表&#xff0c;Git凭借其强大的分支管理和高效的协作能力&#xff0c;已成为行业标准。而GitHub作为…...

PLM系统如何支持利益相关者分析?沟通矩阵设计

PLM&#xff08;产品生命周期管理&#xff09;系统在现代企业的产品研发与管理过程中扮演着至关重要的角色。它不仅仅是一个管理产品数据的工具&#xff0c;更能在利益相关者分析以及沟通矩阵设计方面提供强大的支持。通过合理运用PLM系统&#xff0c;企业能够更好地识别、理解…...

每日一题(8) 求解矩阵最小路径和问题

给定一个m行n列的矩阵&#xff0c;从左上角开始每次只能向右或者向下移动&#xff0c;最后到达右下角的位置&#xff0c;路径上的所有数字累加起来作为这条路径的路径和。求所有路径和中最小路径和。 输入格式: 首先输入行数m及列数n&#xff0c;接下来输入m行&#xff0c;每…...

JAVA设计模式:注解+模板+接口

1.基础组件 1.1注解类控制代码执行启动、停止、顺序 /*** author : test* description : 数据同步注解* date : 2025/4/18*/ Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface SyncMeta {/*** 执行服务名称* return*/String name…...

如何在Linux系统中部署C++ Web应用

在 Linux 上部署 C Web 应用&#xff0c;和部署传统的 PHP 或 Node.js 应用相比更“原生”一些&#xff0c;通常涉及到自己编译、配置 Web 服务、处理依赖等。本文将详细讲解部署一个基于 C 编写的 Web 应用的完整流程&#xff0c;涵盖从构建、部署、到上线的每一步&#xff0c…...

实用工具-screenrec介绍(截图工具)

官方地址&#xff1a;Communicate Faster with Instant Video Messages & Screenshots 官方下载安装包&#xff0c;安装完成后&#xff0c;默认快捷键 alt s 开启截图&#xff0c;录屏 介绍 ScreenRec 是一款免费无广告的屏幕录制与截图工具&#xff0c;支持多平台&…...

使用veaury,在vue项目中运行react组件

网上的信息太少了&#xff0c;记录一下 我的项目是vue3webpack 使用&#xff1a;veaury Veaury 是基于React和Vue3的工具库&#xff0c;主要用于React和Vue在一个项目中公共使用的场景&#xff0c;主要运用在项目迁移、技术栈融合的开发模式、跨技术栈使用第三方组件的场景。 参…...

开源 vs. 闭源:大模型的未来竞争格局

开源 vs. 闭源&#xff1a;大模型的未来竞争格局 引言 在人工智能领域&#xff0c;尤其是大型语言模型(LLM)的发展中&#xff0c;开源与闭源之争已成为决定行业未来走向的关键议题。随着ChatGPT的横空出世和开源模型的蓬勃发展&#xff0c;技术社区正经历着一场深刻的范式转变…...

pcl代码解析

一、库基础代码解析&#xff1a; PCL库基础&#xff1a;点云类型与算法详解-CSDN博客 主要介绍PCL库的一些基本的点云类型、相关数据类型以及ROS接口消息&#xff0c;和一些常用的算法。 用到的一些PCL点云类型 pcl::PointXYZ: 这是最简单也可能是最常用到的点类型;它只储存…...

中华传承-医山命相卜-梅花易数

梅花易数 灵活起卦&#xff08;如数字、声音、外应等&#xff09;和象数结合&#xff0c;准确率可达96.8%。其起卦方式摆脱传统龟壳、蓍草的繁琐&#xff0c;强调直觉与灵活性。 个人决策、事件预测等 尤其在短期、具体问题上表现突出。...

HOOPS Exchange 与HOOPS Communicator集成:打造工业3D可视化新标杆!

一、概述 在工业3D开发、BIM建筑、数字孪生和仿真分析等高端应用场景中&#xff0c;数据格式复杂、模型体量庞大、实时交互体验要求高&#xff0c;一直是困扰开发者的难题。Tech Soft 3D旗下的HOOPS Exchange和HOOPS Communicator&#xff0c;正是解决这类问题的黄金搭档。二者…...

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中&#xff0c;程序本身 未对插入的SQL语句进行过滤&#xff0c;导致SQL语句直接被服务端执行。 拼接的SQL查询例如&#xff0c;通过在id变量后插入or 11这样的条件&#xff0c;来绕过身份验证&#…...

通过 Zotero 的样式编辑器(Style Editor)自定义文献引用和参考文献列表的格式

好的&#xff01;以下是一个更为详细的教程&#xff0c;帮助你通过 Zotero 的样式编辑器&#xff08;Style Editor&#xff09;自定义文献引用和参考文献列表的格式。 详细教程&#xff1a;使用 Zotero 样式编辑器自定义文献格式 1. 准备工作 在开始之前&#xff0c;请确保&a…...

PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据

COPY命令介绍 copy是postgresql提供的一个专门用于快速导入导出数据的命令,通常用于从文件(TXT、CSV等)或标准输入输出中读取或写入数据。适合批量导入导出数据,速度快。 默认情况下,如果在处理过程中遇到错误,COPY将失败。 COPY只能用于表,不能用于视图!!! COPY…...

Next.js 技术详解:构建现代化 Web 应用的全栈框架

1. Next.js 概述 Next.js 是一个基于 React 的全栈框架&#xff0c;由 Vercel 团队开发和维护。它提供了一系列开箱即用的功能&#xff0c;使开发者能够快速构建高性能的 Web 应用。 核心优势 服务端渲染 (SSR)静态站点生成 (SSG)增量静态再生成 (ISR)文件系统路由API 路由图…...

【unity实战】Unity动画层级(Animation Layer)的Sync同步和Timing定时参数使用介绍,同步动画层制作角色的受伤状态

文章目录 前言方案一&#xff1a;复制粘贴原有层级的状态机1、实现2、问题 方法二&#xff1a;勾选Sync同步动画层1、简单实现同步2、同步blend tree的问题3、动画状态的播放时长4、下层状态覆盖了上层状态 专栏推荐完结 前言 如何制作角色的受伤状态&#xff1f; 玩家角色在…...

NFC 碰一碰发视频源码搭建,碰一碰发视频定制化开发技术

在移动互联时代&#xff0c;便捷的数据传输方式备受青睐。NFC&#xff08;近场通信&#xff09;技术以其操作简单、连接迅速的特性&#xff0c;为设备间的数据交互提供了高效解决方案。通过搭建 NFC 碰一碰发视频功能&#xff0c;用户只需将支持 NFC 的设备轻轻靠近&#xff0c…...

获取视频封面

目录 实现方式注意事项代码实现 实现方式 通过 video 元素canvas 元素的方式实现 生成 video 和 canvas 元素当 video 元素资源加载完成时&#xff0c;将 video 元素绘制到 canvas 画布上&#xff0c;然后通过 toBlob 或则 toDataURL 获取到对应的封面图片资源 注意事项 vid…...

c#开发大冲锋游戏登录器

1 前言 本文主要分享登录器的简要开发过程&#xff0c;只适合小白选手&#xff0c;高手请自动避让。 此项目是复刻大冲锋计划中的子集。 &#xff08;注&#xff1a;大冲锋是迅雷代理的一款次时代多职业第一人称FPS射击游戏&#xff0c;目前已经关服嗝屁。&#xff09; 2 …...

堆的实现以及利用堆进行排序

堆 堆的实现1. 什么是堆&#xff1f;2. 最小堆的核心操作2.1 初始化堆2.2 销毁堆2.3 插入元素2.4 删除堆顶元素2.5 获取堆顶元素2.6 判断堆是否为空 3. 调整堆的算法3.1 向上调整3.2 向下调整 4. 测试代码 堆排序一.向下调整建堆二.向上调整建堆 时间复杂度分析向上建堆分析&am…...

FPGA-VGA

目录 前言 一、VGA是什么&#xff1f; 二、物理接口 三、VGA显示原理 四、VGA时序标准 五、VGA显示参数 六、模块设计 七、波形图设计 八、彩条波形数据 前言 VGA的FPGA驱动 一、VGA是什么&#xff1f; VGA&#xff08;Video Graphics Array&#xff09;是IBM于1987年推出的…...

仿腾讯会议项目开发——界面关闭功能实现

目录 1、include(./netapi/netapi.pri) 2、加快构建速度 3、INCLUDEPATH./netapi 4、添加控制类 5、用单例模式创建一个Ckernel的对象 6、创建一个回收的槽函数 7、添加界面文件 8、创建一个私有的界面对象 9、修改为使用单例模式的控制类创建界面 10、在Ckernel类中…...

微信小程序怎么分包步骤(包括怎么主包跳转到分包)

第一步 主包跳转到分包 第一步 第二步...

点云配准控制迭代停止的阈值

在点云配准&#xff08;如ICP算法&#xff09;中&#xff0c;setEuclideanFitnessEpsilon() 是一个设置收敛条件的函数&#xff0c;用于控制迭代停止的阈值。以下是关于该参数的详细说明&#xff1a; 函数作用 setEuclideanFitnessEpsilon() 设置的是 两次连续迭代之间均方误…...

高频面试题:Android MVP/MVVM/MVI这几种架构在实际生产中,各自的优缺点和适用场景是什么

安卓开发早期的架构模式相对简单&#xff0c;许多开发者直接在Activity或Fragment中堆砌业务逻辑和UI操作&#xff0c;这种方式虽然在小型项目中看似高效&#xff0c;但随着代码量的增加&#xff0c;很快就会导致逻辑混乱、难以测试和维护的问题。Activity和Fragment作为安卓框…...

国内主要半导体厂家

以下是国内主要半导体厂家按产品类别&#xff08;模拟、数字、MCU、功率、传感器等&#xff09;的分类总结&#xff0c;涵盖各领域代表企业及其核心产品方向&#xff1a; ​一、模拟芯片&#xff08;Analog IC&#xff09;​​ ​圣邦微电子&#xff08;SGMICRO&#xff09;​​…...

DeepSeek深度观察:白宫“炒人“威胁的语义强度与市场应激量化分析

一、AI观察&#xff1a;政治博弈的语义强度分析 通过NLP情感分析模型对特朗普近期公开言论的语义解析显示&#xff0c;总统在社交媒体及记者会中多次使用"立即解雇""卷铺盖走人"等极端表述&#xff0c;其公开威胁解雇鲍威尔的推文互动量突破120万次&#…...

城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 城市街拍暗色电影胶片风格 Lr 调色&#xff0c;是借助 Adobe Lightroom 软件&#xff0c;为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感&#xff0c;营造出充满故事感与艺术感的暗色氛围&#xff0c;让照片仿佛截取于某部充满张力…...

图像分类标注小工具

图像分类标注小工具 不说废话 上代码 import os import cv2 import shutil import csvclass ImageLabeler:def __init__(self, input_dir, output_dir, class_names, csv_pathlabel_log.csv, preview_size(800, 800)):self.input_dir input_dirself.output_dir output_dirse…...

leetcode 2364. 统计坏数对的数目 中等

给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] &#xff0c;那么我们称 (i, j) 是一个 坏数对 。 请你返回 nums 中 坏数对 的总数目。 示例 1&#xff1a; 输入&#xff1a;nums [4,1,3,3] 输出&#xff1a;5 解释&#xff1a;数对…...

网络互连与互联网3

1.SMTP简单邮件传输协议&#xff0c;用于发送电子邮件&#xff0c;默认情况下是明文传输&#xff0c;没有加密机制。 SSL是一种安全协议&#xff0c;对电子邮件进行加密传输。 POP3主要用于接收电子邮件 IMAP用于接收电子邮件 2.采用存储-转发方式处理信号的设备是交换机 …...

docker部署springboot(eureka server)项目

打jar包 使用maven&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17&…...

git 出现 port 443 Connection timed out

梯子正常延迟不算严重&#xff0c;但在使用git push时反复出现 fatal: unable to access https://github.com/irvingwu5/xxxx.git/ Error in the HTTP2 framing layer Failed to connect to github.com port 443 after 136353 ms: Connection timed out 将git的网络配置与梯子…...

深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南

在数据管理和分析的过程中&#xff0c;MySQL 提供了强大的查询功能&#xff0c;特别是在处理复杂数据关系时。本文将深入探讨 MySQL 的三种高级查询技术&#xff1a;JOIN、子查询和窗口函数。通过对这些技术的详细讲解和示例&#xff0c;帮助您更好地掌握并应用这些查询技巧。 …...

AXOP36061S: 60V 高压单通道运算放大器

AXOP36061S 是一款通用型高压带关断功能的单通道运算放大器&#xff0c;工作电压为3V至60V&#xff0c;具有17MHz的带宽和 15V/μs的压摆率&#xff0c;静态电流2.2mA&#xff0c;关断电流80μA&#xff0c;高耐压和宽带宽使其可以胜任绝大多数的高压应用场景。得益于对噪声和T…...

Aladdin显卡多任务运行教程

Aladdin显卡多任务运行 任务场景操作步骤其他说明 任务场景 当我运行我的代码后发现80G的显存仅占用了46G左右&#xff0c;还有很大空间没有被使用&#xff0c;于是想着能不能把剩下的空间也利用起来&#xff0c;于是有了接下来的工作。 操作步骤 当我们使用GPU run/debug/…...

Oracle AWR快照保留策略及其修改

文章目录 一、AWR快照保留机制及其修改方法二、生产环境建议三、监控建议 一、AWR快照保留机制及其修改方法 默认保留策略&#xff1a; • 标准保留期&#xff1a;8天 • 快照间隔&#xff1a;每小时1次&#xff08;默认&#xff09; • 存储位置&#xff1a;SYSAUX表空间 保留…...

日本公司如何实现B2B商城订货系统的自动化和个性化?

在日本构建具备前后台日文本地化、业务员代客下单、一客一价、智能拆单发货的B2B电商系统&#xff0c;需结合日本商业习惯与技术实现。以下是关键模块的落地方案&#xff1a; 一、系统架构设计 1. 前端本地化 语言与UI适配 采用全日语界面&#xff0c;包含敬语体系&#xff08…...

JavaScript 核心特性完全指南

引言 JavaScript 已经不再只是浏览器中的脚本语言,它支撑着前端、后端(Node.js)、桌面(Electron)、移动端(React Native)等多种生态。要在现代 Web 开发中游刃有余,除了会写代码,更要深刻理解语言特性、掌握常见模式和优化技巧。下面逐一深入解析 20 大核心特性。 1.…...