在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁!而我们要做的就是为他们提供这些选择,确保他们都能毫无阻碍地进入我们的系统。
目标? 用一种轻松而富有趣味的方式带你构建一个支持多种登录方式的 Spring Boot 项目!好了,系好安全带,让我们开始这段奇妙的代码之旅。
一、需求分析
首先,让我们明白我们要做什么。如果你还记得那些老式网站,登录方式非常单一:只允许使用用户名登录,且密码必须是8个字符的 “password123” 这种经典组合。好吧,时代已经不同了,现在的人们懒得记用户名和密码,他们更愿意使用手机、邮箱,甚至脸书、微信等社交账号来登录。为什么? 因为每个人都有点“懒得输入太多字”的心理。
因此,我们的目标很明确——让用户能有更多的选择方式来登录:
- 用户名 + 密码(这是经典款)
- 手机号 + 密码(这就很潮流了)
- 邮箱 + 密码(一看就很高端)
这就像在餐厅点菜——我们提供多样化的菜单,用户随便选,爱吃啥点啥!
二、搭建你的基础工程:项目配置
没有基础设施的建筑就是一场灾难,而没有配置文件的 Spring Boot 项目就是——废的。所以,第一步,我们要确保项目的所有配置正确无误。
在你的 pom.xml
文件中,加入我们即将用到的一些核心依赖。包括 Spring Security(因为我们要玩登录认证嘛)、JPA(因为我们要有地方存储用户信息),以及 MySQL 数据库的连接驱动。
<dependencies><!-- Spring Boot Security 依赖,用于管理我们的登录和认证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- Spring Boot Data JPA 依赖,用来进行数据库操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- Spring Boot Web 依赖,用来处理 Web 请求 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MySQL Connector 依赖,毕竟数据还是要放进数据库的 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- Lombok 用来减少代码量,让我们不用再写那些烦人的 getter/setter --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>
好了,既然我们已经有了正确的配置依赖,现在就像是我们已经准备好了一杯现磨咖啡,接下来该享受喝咖啡的过程了!
三、数据库设计:让用户信息有个家
每个登录系统都需要一个地方存储用户信息,否则它就像你早上出门忘了带钥匙一样尴尬。我们要创建一个用户表来保存用户名、手机号、邮箱以及密码。这里我们使用 JPA 来简化数据库操作,不必再写那些琐碎的 SQL 语句。
@Entity
@Table(name = "users")
@Data
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username; // 用户名private String password; // 密码(重要的东西,当然要加密保存)private String email; // 邮箱private String phoneNumber; // 手机号
}
你可能会问,为什么不加个字段来存储用户的昵称、性别、兴趣爱好?嗯,那确实也是个不错的想法,但我们今天的重点是登录系统——所以先忍一忍,别跑偏了。
四、用户存储库:我们需要一些查询方式
数据库表已经有了,但我们还需要写一些代码来查询这些用户信息。为此,我们需要创建一个存储库类,用于根据用户名、手机号或者邮箱来查找用户。
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);Optional<User> findByEmail(String email);Optional<User> findByPhoneNumber(String phoneNumber);
}
瞧,这就是我们数据层的三剑客:findByUsername
、findByEmail
和 findByPhoneNumber
。有了它们,我们可以方便地从数据库中查询到用户。
五、用户认证服务:让 Spring Security 成为我们的好帮手
接下来,我们要告诉 Spring Security 如何根据不同的登录信息来加载用户。这部分代码就像是一道考题,告诉系统:“嘿,如果用户输入了个手机号或者邮箱,你该如何处理?”
@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String loginInput) throws UsernameNotFoundException {Optional<User> userOpt;// 判断输入的登录信息类型,来确定是邮箱、手机号还是用户名if (loginInput.contains("@")) {// 邮箱登录userOpt = userRepository.findByEmail(loginInput);} else if (loginInput.matches("\\d+")) {// 手机号登录userOpt = userRepository.findByPhoneNumber(loginInput);} else {// 用户名登录userOpt = userRepository.findByUsername(loginInput);}// 如果用户不存在,抛出异常User user = userOpt.orElseThrow(() -> new UsernameNotFoundException("用户不存在"));// 返回 Spring Security 所需的 UserDetails 对象return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());}
}
这个类做的事情就像是一个门卫,不管用户输入的是用户名、邮箱,还是手机号,都会验证一遍,确保用户是真实存在的。
六、密码加密:不要让用户的密码变成人人可知的小秘密
安全问题非常重要,如果我们把密码明文存储,那就相当于把家里的钥匙放在门口的地垫下面,绝对是个坏主意。幸运的是,Spring Security 自带了密码加密支持,我们可以使用 BCryptPasswordEncoder
来加密用户密码。
@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}
然后在用户注册时,对密码进行加密后再存入数据库:
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PasswordEncoder passwordEncoder;public void registerUser(User user) {// 密码加密user.setPassword(passwordEncoder.encode(user.getPassword()));userRepository.save(user);}
}
有了这个小魔法,所有密码都会以加密形式存储,即便有人黑进了数据库,也只能看到一串毫无意义的字符。
七、Spring Security 配置:别忘了这位主角
一部电影怎么能没有导演?而我们的导演就是 Spring Security 的配置类。我们将在这里配置登录逻辑,告诉系统如何处理不同的登录方式。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Autowiredprivate PasswordEncoder passwordEncoder;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// 配置认证方式,使用我们自定义的 UserDetailsService 和密码加密方式auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);}@Overrideprotected void configure(HttpSecurity http) throws Exception {// 设置允许哪些 URL 可以被匿名访问http.csrf().disable().authorizeRequests().antMatchers("/login", "/register").permitAll() // 允许登录和注册页面被访问.anyRequest().authenticated() // 其他页面都需要认证.and().formLogin().loginPage("/login") // 设置自定义的登录页面.defaultSuccessUrl("/home", true) // 登录成功后跳转的页面.permitAll().and().logout().permitAll();}
}
在这段配置中,我们告诉 Spring Security 使用我们自定义的 CustomUserDetailsService
来处理登录请求。我们还设置了登录页面和成功后的重定向页面,显得很专业有木有?
八、最后的话:为用户提供选择,登录就像选咖啡一样简单
现在,我们已经成功搭建了一个支持多种方式登录的系统。不论是使用用户名、手机号还是邮箱,用户都可以自由选择,就像他们早晨选择喝哪种咖啡一样简单。而你,作为这家“咖啡店”的老板,成功地提供了更多的便利和选择!
所以,下次当你看到用户轻松登录时,可以骄傲地拍拍自己的肩膀,毕竟,你让这个世界的登录系统变得更加多样化了。
(Ps:如果用户抱怨登录总是出错,请告诉他们密码不能用“123456”,那样实在太“平庸”了点 😜)
相关文章:
在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…...
JVM标量替换
JVM标量替换 简单来说 JVM 中的标量替换是一种编译优化技术,将未逃逸对象拆解成不能再分,标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量,不但避免了完整对象的创建和后续回收流程,而且能更快地获取和操作相应的数据&…...
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等,对吧?机器学习也是一样,需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...
C语言蓝桥杯组题目
系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...
用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...
真实网络安全面试场景题
1.公司内部搭建了2台DNS服务器做主辅同步,公司的业务官网地址为 www.chinaddic.com。小明作为网络管理员把域名添加至DNS服务器进行测试。 问题1:使用自己电脑可以正常访问刚添加的域名,但处于同样网络环境同事电脑却访问不了。 出现此问题原因…...
速盾:ddos防御手段哪种比较好?高防cdn怎么样?
DDoS(分布式拒绝服务)攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响,许多安全专家和公司开发了各种防御手段。在这篇文章中,我们将重点讨论一种常见的DDoS防御手段——高防CDN(内容分…...
【ArcGISPro】Sentinel-2数据处理
错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集...
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
接到一个需求是类似下图的3D多房间视角,需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现,需要拖拽起来有跟手的感觉,会存在不同分辨率机型的适配问题。 即:美术调整好了机型1的手感,能做到手指按下顶层地板上下挪动&…...
谷粒商城-消息队列Rabbitmq
RabbitMq参考文档 在谷粒商城项目中使用消息队列主要有以下几个重要原因: 异步处理提高性能 场景示例:在订单系统中,当用户提交订单后,系统需要完成多个操作,如更新库存、生成订单记录、发送订单通知等。如果这些操作…...
python-爬虫入门指南
前言:由于个人负责的运维组,其中有个同事每回在某个项目发版更新后,需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息,用来更新微服务清单,个人决定抽时间写个爬虫脚本自动完成手动执行的任务…...
力扣—53. 最大子数组和
53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4…...
STM32H7开发笔记(2)——H7外设之多路定时器中断
STM32H7开发笔记(2)——H7外设之多路定时器中断 文章目录 STM32H7开发笔记(2)——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置,硬件使用STM32H…...
kafka如何知道哪个消费者消费哪个分区?
在Kafka中,消费者和分区之间的分配是通过一个称为“消费者组协调器”(Consumer Group Coordinator)的组件来管理的。 以下是Kafka如何确定哪个消费者消费哪个分区的步骤: 消费者加入消费者组: 当消费者启动时…...
Dockerfile构建报错【ERROR: failed to solve: process】的解决办法
报错信息如下 ERROR: failed to solve: process “/bin/sh -c yarn install” did not complete successfully: exit code: 1 解决 从阿里云等镜像站点下载CentOS-7.repo文件 下载CentOS-7.repo文件:可以从阿里云等镜像站点下载CentOS-7.repo文件,…...
html渲染优先级
在前端开发中,优先布局是指在设计和构建页面时,将页面的各个部分按照其重要性和优先级进行排序,并依次进行布局和开发。这种方法可以帮助开发团队在项目初期就确定页面结构的核心部分,从而更好地掌控项目的整体进度和优先级。且确…...
AIX下crs-5005 ip address is aready in use in the network的解决办法
某业务生产系统中,三节点的rac数据库中3号节点因故障停机后,进行crs的重启。重启完成后,发现数据库的监听未起来,启动的过程中并提示crs-5005错误。 一、问题过程 查看监听,发现监听no service ywdb03/oracle/grid/c…...
Docker--通过Docker容器创建一个Web服务器
Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…...
C#里怎么样自己实现10进制转换为二进制?
C#里怎么样自己实现10进制转换为二进制? 很多情况下,我们都是采用C#里类库来格式化输出二进制数。 如果有人要你自己手写一个10进制数转换为二进制数,并格式化输出, 就可以采用本文里的方法。 这里采用求模和除法来实现的。 下…...
sql 查询语句:将终端数据形式转换成insert语句
文本转换:sql 查询语句:将终端数据形式转换成insert语句 如上,写过后端的都知道,从生产或其他地方拿到的数据,有可能会是图一;但实际上,我们需要图二的数据; 不废话,直接…...
Spring Boot 应用开发:构建高效、可扩展的 Java 微服务
以下是一个简单的 Spring Boot 小项目示例,该项目是一个基于 Spring Boot 的博客系统后端部分。这个项目将展示如何使用 Spring Boot 框架来创建一个基本的 RESTful API 服务,以管理博客文章。 项目结构 spring-boot-blog ├── src │ ├── main…...
【Linux】安装 openssh-server 并打开 ssh 服务(Ubuntu 22.04)
引言 openssh-server是OpenSSH套件的一部分,它是SSH协议的开源实现。SSH,全称为Secure Shell,是一种网络协议,用于安全地在不安全的网络环境中执行远程命令和传输数据。 配置步骤 在Ubuntu系统中安装openssh-server。 sudo apt…...
开源IM,为你的项目增加聊天功能
现在大多数APP,或多或少都会涉及到聊天功能,而大部分APP的选择则是接入TIM等三方IM服务,但是,这种方式对于大多数刚刚起步的APP来说,费用是非常昂贵的,基本上每月都有好几百的支出,并且…...
跨平台应用开发框架(1)----Qt(组件篇)
目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…...
Java基础 设计模式——针对实习面试
目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。适用场景&…...
C++ —— 以真我之名 如飞花般绚丽 - 智能指针
目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…...
k8s中部署filebeat进行日志监听并发送到es中
注意事项 1. 需要将namespace修改为自己项目中的命名空间 2. es换成对应的地址 3. filebeat-inputs中的两个配置(根据需要用任意一个就可以) 3.1 第一个配置是监听docker日志,由于系统日志太多所以这里只监听项目部署命名空间下的内容 -…...
HTTP Accept用法介绍
一、HTTP Accept是什么 HTTP协议是一个客户端和服务器之间进行通信的标准协议,它定义了发送请求和响应的格式。而HTTP Accept是HTTP协议中的一个HTTP头部,用于告诉服务器请求方所期望的响应格式。这些格式可以是媒体类型、字符集、语言等信息。 HTTP A…...
软件工程设计模式--结构型设计模式
设计模式的核心思想 : 广义——软件设计模式是可解决一类软件问题并能重 复使用的软件设计方案 狭义——设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,是在类和对象的层次描述的可重复使用的软件设计问题的解决方…...
HTML5好看的音乐播放器多种风格(附源码)
文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者&…...
【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register
0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…...
快速排序算法-C语言
第一步:实现分区函数 根据题目中的“快速排序”,我们需要实现一个分区函数,这个功能的实现: 设定基准值 pivot。使用两个指针 low 和 high,分别从数组的两端向中间移动,进行元素交换。 int part(int A[]…...
SuperMap Objects组件式GIS开发技术浅析
引言 随着GIS应用领域的扩展,GIS开发工作日显重要。一般地,从平台和模式上划分,GIS二次开发主要有三种实现方式:独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊,其中集成二次开发既可以充分利…...
极简开源Windows桌面定时提醒休息python程序
当我们长期在电脑面前坐太久后,会产生一系列健康风险,包括干眼症,颈椎,腰椎,肌肉僵硬等等。解决方案是在一定的时间间隔内我们需要have a break, 远眺可以缓解干眼症等眼部症状,站起来走动两步,…...
SpringBoot源码解析(五):准备应用环境
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...
JAVA笔记 | 策略模式+枚举Enum简单实现策略模式(可直接套用)
本篇为更为简单的策略模式应用,使用枚举来进行策略分配 上一篇(链接如下)更像是策略工厂模式来分配策略 JAVA笔记 | 实际上用到的策略模式(可直接套用)-CSDN博客 先创建策略相关类 //策略类 public interface PetStrategy {/*** 执行动作 - 跑RUN*/String run(Str…...
SpringBoot集成 Jasypt 实现数据源连接信息进行加密
SpringBoot集成 Jasypt 实现数据源连接信息进行加密 在实际项目中,敏感信息(如数据库连接的 URL、用户名、密码等)直接暴露在配置文件中可能导致安全隐患。为了解决这一问题,可以使用 Jasypt 来加密敏感信息,并在运行…...
大数据新视界 -- Hive 数据桶原理:均匀分布数据的智慧(上)(9/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
优化Docker镜像:提升部署效率与降低资源消耗
目录 1. 最小化镜像层 2. 使用轻量级基础镜像 3. 多阶段构建 4. 清理不必要的文件和依赖 5. 使用.dockerignore文件 6. 压缩和优化文件系统 7. 外部化配置和数据 8. 限制容器资源 9. 定期清理未使用的镜像和容器 结论 在云计算和微服务架构的浪潮中,Docke…...
strupr(arr);模拟实现(c基础)
hi , I am 36 适合对象c语言初学者 strupr(arr);函数是把arr数组变为大写字母,并返回arr 介绍一下strupr(arr);(c基础)-CSDN博客 现在进行My__strupr(arr);模拟实现 #include<stdio.h>//My__strupr(arr); //返回值为arr(地址),于是…...
skywalking es查询整理
索引介绍 sw_records-all 这个索引用于存储所有的采样记录,包括但不限于慢SQL查询、Agent分析得到的数据等。这些记录数据包括Traces、Logs、TopN采样语句和告警信息。它们被用于性能分析和故障排查,帮助开发者和运维团队理解服务的行为和性能特点。 …...
AI时代的软件工程:迎接LLM-DevOps的新纪元
在科技日新月异的今天,GPT的问世无疑为各行各业带来了一场深刻的变革,而软件工程领域更是首当其冲,正式迈入了软件工程3.0的新纪元。2024年,作为软件工程3.0的元年,伴随着软件工程3.0宣言的震撼发布,一个全…...
【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
详解Servlet的使用
目录 Servlet 定义 动态页面 vs 静态页面 主要功能 Servlet的使用 创建Maven项目 引入依赖 创建目录 编写代码 打war包 部署程序 验证程序 Smart Tomcat 安装Smart Tomcat 配置Smart Tomcat插件 启动Tomcat 访问页面 路径对应关系 Servlet运行原理 Tomcat的…...
使用Java代码操作Kafka(五):Kafka消费 offset API,包含指定 Offset 消费以及指定时间消费
文章目录 1、指定 Offset 消费2、指定时间消费 1、指定 Offset 消费 auto.offset.reset earliest | latest | none 默认是 latest (1)earliest:自动将偏移量重置为最早的偏移量,–from-beginning (2)lates…...
MAC 怎么终端怎么退出和进入Anaconda环境
mac安装完anaconda 后,命令行窗口默认使用conda的,取消默认,用以下一行代码在命令行运行即可,重启终端: conda config --set auto_activate_base false # 将false改为true设置默认环境为conda进入conda环境ÿ…...
如何在 .gitignore 中仅保留特定文件:以忽略文件夹中的所有文件为例
在日常的开发工作中,使用 Git 来管理项目是不可或缺的一部分。项目中的某些文件夹可能包含大量的临时文件、生成文件或不需要版本控制的文件。在这种情况下,我们通常会使用 .gitignore 文件来忽略这些文件夹。然而,有时我们可能希望在忽略整个…...
USRP:B205mini-i
USRP B205mini-i B205mini-i都是采用工业级的FPGA芯片(-I表示industrial-grade),所以价格贵。 这个工业级会让工作温度从原来 0 – 45 C 变为 -40 – 75 C. 温度的扩宽,会让工作的稳定性变好。但是前提是你需要配合NI的外壳才行,你如果只买一…...
Oracle SQL优化②——访问路径
前言 访问路径指的就是通过哪种扫描方式获取数据,比如全表扫描、索引扫描或者直接通过ROWID获取数据。想要完成SQL优化,就必须深入理解各种访问路径。本文章详细介绍常见的访问路径。 一.常见访问路径 1.TABLE ACCESS FULL 表示全表扫描,…...
k8s1.30.0高可用集群部署
负载均衡 nginx负载均衡 两台nginx负载均衡 vim /etc/nginx/nginx.conf stream {upstream kube-apiserver {server 192.168.0.11:6443 max_fails3 fail_timeout30s;#server 192.168.0.12:6443 max_fails3 fail_timeout30s;#server 192.168.0.13:6443 max_fails3…...