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

[Go 微服务] Kratos 验证码业务

文章目录

      • 1.环境准备
      • 2.验证码服务
        • 2.1 kratos 初始化验证码服务项目
        • 2.2 使用 Protobuf 定义验证码生成接口
        • 2.3 业务逻辑代码实现

1.环境准备

protoc和protoc-gen-go插件安装和kratos工具安装

  1. protoc下载

    • 下载二进制文件:https://github.com/protocolbuffers/protobuf/releases 下拉到最下方下载系统对应的版本,将解压出来bin目录下的protoc.exe拷贝到GOPATH的bin目录下。
    • 查看protoc版本:protoc --version。
    • 在这里插入图片描述
  2. protoc-gen-go插件安装

    • protoc是针对所有语言开发的,protoc-gen-go是专门针对go语言开发,因为是使用go语言开发的,所以直接使用go install就可以进行安装,安装后在GOPATH的bin沐目录下就会有对应的二进制文件。
    • go install google.golang.org/protobuf/cmd/protoc-gen-go@latest,版本验证protoc-gen-go --version
    • go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest,版本验证protoc-gen-go-grpc --version
    • 在这里插入图片描述
    • 在这里插入图片描述
  3. kratos工具安装

    • kratos也是go语言编写的,帮助我们快速生成代码的,直接go install安装即可,安装完成也会在GOPATH的bin目录中生成二进制文件。
    • 安装命令:go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
    • 版本验证:kratos -v
    • 在这里插入图片描述
    • 在这里插入图片描述

2.验证码服务

2.1 kratos 初始化验证码服务项目
kratos new kratos-demo03

在这里插入图片描述

PS E:\java\go_code> kratos new kratos-demo03
🚀 Creating service kratos-demo03, layout repo is https://github.com/go-kratos/kratos-layout.git, please wait a moment.Already up to date.CREATED E:\java\go_code\kratos-demo03\.gitignore (590 bytes)
CREATED E:\java\go_code\kratos-demo03\Dockerfile (483 bytes)
CREATED E:\java\go_code\kratos-demo03\LICENSE (1087 bytes)
CREATED E:\java\go_code\kratos-demo03\Makefile (2608 bytes)
CREATED E:\java\go_code\kratos-demo03\README.md (1113 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\error_reason.pb.go (5126 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\error_reason.proto (306 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter.pb.go (8299 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter.proto (711 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter_grpc.pb.go (3667 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter_http.pb.go (2213 bytes)
CREATED E:\java\go_code\kratos-demo03\cmd\kratos-demo03\main.go (1834 bytes)
CREATED E:\java\go_code\kratos-demo03\cmd\kratos-demo03\wire.go (645 bytes)
CREATED E:\java\go_code\kratos-demo03\cmd\kratos-demo03\wire_gen.go (1121 bytes)
CREATED E:\java\go_code\kratos-demo03\configs\config.yaml (306 bytes)
CREATED E:\java\go_code\kratos-demo03\go.mod (1301 bytes)
CREATED E:\java\go_code\kratos-demo03\go.sum (9022 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\biz\README.md (7 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\biz\biz.go (134 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\biz\greeter.go (1285 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\conf\conf.pb.go (21434 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\conf\conf.proto (805 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\data\README.md (8 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\data\data.go (500 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\data\greeter.go (880 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\server\grpc.go (867 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\server\http.go (872 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\server\server.go (158 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\service\README.md (11 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\service\greeter.go (723 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\service\service.go (142 bytes)
CREATED E:\java\go_code\kratos-demo03\openapi.yaml (1169 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\README.md (15 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\errors\errors.proto (428 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\annotations.proto (1082 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\client.proto (3495 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\field_behavior.proto (3090 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\http.proto (15515 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\httpbody.proto (2748 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\any.proto (6067 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\api.proto (7942 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\compiler\plugin.proto (8937 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\descriptor.proto (39418 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\duration.proto (5011 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\empty.proto (2481 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\field_mask.proto (8430 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\source_context.proto (2389 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\struct.proto (3874 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\timestamp.proto (6606 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\type.proto (6313 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\wrappers.proto (4165 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\openapi\v3\annotations.proto (2254 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\openapi\v3\openapi.proto (22754 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\validate\README.md (84 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\validate\validate.proto (32133 bytes)🍺 Project creation succeeded kratos-demo03
$ cd kratos-demo03
$ go generate ./...
$ go build -o ./bin/ ./...
$ ./bin/kratos-demo03 -conf ./configs🤝 Thanks for using Kratos📚 Tutorial: https://go-kratos.dev/docs/getting-started/start🤝 Thanks for using Kratos📚 Tutorial: https://go-kratos.dev/docs/getting-started/start

在这里插入图片描述

# 进入项目目录,拉取依赖\
cd kratos-demo03
go mod tidy# 安装wire工具:kratos使用了依赖注入来生成相关的代码,所以运行项目前也需要安装
go get github.com/google/wire/cmd/wire# 生成了wire_gen.go
go generate ./...

在这里插入图片描述

# 项目运行
kratos run

在这里插入图片描述

在这里插入图片描述

以上的layout的目录布局,仅仅是kratos推荐的项目目录布局方式

2.2 使用 Protobuf 定义验证码生成接口
  1. 定义 protobuf 文件说明接口
  2. 利用 protoc 基于 protobuf 生成必要代码
  3. 将生成的代码整合到项目中
  4. 完善业务逻辑
kratos proto add api/verifyCode/verifyCode.proto

在这里插入图片描述

syntax = "proto3";package api.verifyCode;
// 生成的go代码所在的包
option go_package = "kratos-demo03/api/verifyCode;verifyCode";
// 定义 VerifyCode 服务
service VerifyCode {rpc GetVerifyCode (GetVerifyCodeRequest) returns (GetVerifyCodeReply);
}
// 类型常量
enum TYPE {DEFAULT = 0;DIGIT = 1;LETTER = 2;MIXED = 3;
};
// 定义 GetVerifyCodeRequest 消息
message GetVerifyCodeRequest {//    验证码长度uint32 length = 1;// 验证码类型TYPE type = 2;}
// 定义 GetVerifyCodeReply 消息
message GetVerifyCodeReply {//    生成的验证码string code = 1;
}

基于verifyCode.proto生成 client(Stub)相关代码

  • kratos proto client api/verifyCode/verifyCode.proto
  • api/verifyCode/verifyCode.pb.go:类型定义代码
  • api/verifyCode/verifyCode_grpc.pb.go:gRPC服务定义代码

在这里插入图片描述

基于verifyCode.proto文件生成 grpc服务代码

  • kratos proto server api/verifyCode/verifyCode.proto -t internal/service
  • -t 选项指定生成文件所在位置,代码会生成在internal/service目录中的internal/service/verifycode.go
  • internal/service/verifycode.go该文件定义了最基本的 VerifyCode 服务和对应的 GetVerifyCode 方法

在这里插入图片描述

在这里插入图片描述

package serviceimport ("context"pb "kratos-demo03/api/verifyCode"
)type VerifyCodeService struct {pb.UnimplementedVerifyCodeServer
}func NewVerifyCodeService() *VerifyCodeService {return &VerifyCodeService{}
}func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) {return &pb.GetVerifyCodeReply{}, nil
}

将生成的服务代码注册到 gRPC 服务中

  • 更新 internal/service/service.go 文件
  • 在这里插入图片描述
  • 告知 wire 依赖注入系统,如果需要 VerifyCodeService 的话,使用NewVerifyCodeService 函数来构建

将 VerifyCodeService 注册到 gRPC 服务中

  • 更新 internal/server/grpc.go 文件
  • 在这里插入图片描述
package serverimport (v1 "kratos-demo03/api/helloworld/v1""kratos-demo03/api/verifyCode""kratos-demo03/internal/conf""kratos-demo03/internal/service""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/transport/grpc"
)// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server, greeter *service.GreeterService, verifyCodeService *service.VerifyCodeService, logger log.Logger) *grpc.Server {var opts = []grpc.ServerOption{grpc.Middleware(recovery.Recovery(),),}if c.Grpc.Network != "" {opts = append(opts, grpc.Network(c.Grpc.Network))}if c.Grpc.Addr != "" {opts = append(opts, grpc.Address(c.Grpc.Addr))}if c.Grpc.Timeout != nil {opts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))}srv := grpc.NewServer(opts...)v1.RegisterGreeterServer(srv, greeter)verifyCode.RegisterVerifyCodeServer(srv, verifyCodeService)return srv
}

生成依赖注入代码:go generate ./...

在这里插入图片描述

kratos run

在这里插入图片描述

建立ApiPost的项目

在这里插入图片描述

2.3 业务逻辑代码实现
  1. GetVerifyCode方法中添加code返回
  2. 添加RandCode方法,返回测试字符串"result"
  3. kratos启动测试
package serviceimport ("context"pb "kratos-demo03/api/verifyCode"
)type VerifyCodeService struct {pb.UnimplementedVerifyCodeServer
}func NewVerifyCodeService() *VerifyCodeService {return &VerifyCodeService{}
}func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) {return &pb.GetVerifyCodeReply{Code: RandCode(int(req.Length), req.Type),}, nil
}func RandCode(l int, t pb.TYPE) string {return "result"
}

在这里插入图片描述

// RandCode 开放的被调用的方法,用于区分类型
func RandCode(l int, t pb.TYPE) string {switch t {case pb.TYPE_DEFAULT:fallthroughcase pb.TYPE_DIGIT:return randCode("0123456789", l)case pb.TYPE_LETTER:return randCode("abcdefghijklmnopqrstuvwxyz", l)case pb.TYPE_MIXED:return randCode("0123456789abcdefghijklmnopqrstuvwxyz", l)}return ""
}// randCode 随机的核心方法
func randCode(chars string, l int) string {charsLen := len(chars)result := make([]byte, l)for i := 0; i < l; i++ {// 核心函数 生成[0,n]的整型随机数randIndex := rand.Intn(charsLen)result[i] = chars[randIndex]}return string(result)
}

在这里插入图片描述

相关文章:

[Go 微服务] Kratos 验证码业务

文章目录 1.环境准备2.验证码服务2.1 kratos 初始化验证码服务项目2.2 使用 Protobuf 定义验证码生成接口2.3 业务逻辑代码实现 1.环境准备 protoc和protoc-gen-go插件安装和kratos工具安装 protoc下载 下载二进制文件&#xff1a;https://github.com/protocolbuffers/protobu…...

等保2.0安全计算环境解读

等保2.0&#xff0c;即网络安全等级保护2.0制度&#xff0c;是中国为了适应信息技术的快速发展和安全威胁的新变化而推出的网络安全保护标准。相较于等保1.0&#xff0c;等保2.0更加强调主动防御、动态防御和全面审计&#xff0c;旨在实现对各类信息系统的全面保护。 安全计算环…...

Qt视频播放器(二)

文章目录 1. 安装FFmpeg库2. 创建Qt项目3. 配置项目文件CMakeLists.txt4. 实现核心FFmpeg功能`videoplayer.h``videoplayer.cpp`5. 实现QML界面`main.qml`6. 主函数`main.cpp`运行项目详细说明结合FFmpeg进行视频播放的核心部分,并使用QML进行界面设计,您可以实现一个功能强大…...

普元EOS学习笔记-创建精简应用

前言 本文依旧基于EOS8.3进行描述。 在上一篇文章《EOS8.3精简版安装》中&#xff0c;我们了解到普元预编译好的EOS的精简版压缩包&#xff0c;安装后&#xff0c;只能进行低开&#xff0c;而无法高开。 EOS精简版的高开方式是使用EOS开发工具提供的IDE&#xff0c;创建一个…...

观察者模式在金融业务中的应用及其框架实现

引言 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得多个观察者对象同时监听某一个主题对象。当这个主题对象发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。…...

最新docker仓库镜像

目前下面的docker仓库镜像源还能使用。 vi /etc/docker/daemon.json添加如下配置{"registry-mirrors": ["https://hub.uuuadc.top", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu&…...

springboot 3.x相比之前版本有什么区别

Spring Boot 3.x相比之前的版本&#xff08;尤其是Spring Boot 2.x&#xff09;&#xff0c;主要存在以下几个显著的区别和新特性&#xff1a; Java版本要求&#xff1a; Spring Boot 3.x要求至少使用Java 17作为最低版本&#xff0c;同时已经通过了Java 19的测试&#xff0c;…...

Python逻辑控制语句 之 判断语句--if语句的基本结构

1.程序执行的三大流程 顺序 分支&#xff08;判断&#xff09; 循环 2.if 语句的介绍 单独的 if 语句,就是 “如果 条件成⽴,做什么事” 3.if 语句的语法 if 判断条件: 判断条件成立&#xff0c;执行的代码…...

LeetCode 算法:翻转二叉树 c++

原题链接&#x1f517;&#xff1a;翻转二叉树 难度&#xff1a;简单⭐️ 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 …...

七天速通javaSE:第五天 数组进阶

文章目录 前言一、二维数组二、Arrays类1.toString打印数组内各元素1.1 示例1.2 自己实现内部逻辑 2. sort升序排列3. fill数组填充&#xff08;重新赋值&#xff09;4.equals比较数组元素是否相等 三、冒泡排序 前言 本文将学习二维数组、arrays类以及冒泡排序 一、二维数组 …...

游戏心理学Day28

独立游戏团队架构 独立游戏工作室是一个包括编程美术设计院校项目管理和运营等各种职能的团队找到可以共同奋斗。数月甚至数年的合适人选并不是一件容易的事情。游戏开发过程中要涉及多种常规工作。小团队的每个成员通常都要身兼数职&#xff0c;而且有些角色常由多人担任。 …...

鸿蒙开发设备管理:【@ohos.multimodalInput.inputEventClient (注入按键)】

注入按键 InputEventClient模块提供了注入按键能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口均为系统接口&#xff0c;三方应用不支持调用。 导入模块 import inputEventCli…...

C++:std::function的libc++实现

std::function是个有点神奇的模板&#xff0c;无论是普通函数、函数对象、lambda表达式还是std::bind的返回值&#xff08;以上统称为可调用对象&#xff08;Callable&#xff09;&#xff09;&#xff0c;无论可调用对象的实际类型是什么&#xff0c;无论是有状态的还是无状态…...

DM 的断点续传测试

作者&#xff1a; 大鱼海棠 原文来源&#xff1a; https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三种数据迁移同步方式&#xff08;task-mode&#xff09;&#xff0c;在all同步模式下&#xff0c;因一些特殊情况&#xff0c;需要变更上游MySQL的数…...

力扣每日一题 6/30 记忆化搜索/动态规划

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 494.目标和【中等】 题目&#xff1a; 给你一个非负整数数组 nums 和一个…...

图像基础知识入门【图像概念不同图像格式】

图像基础知识入门【图像概念&不同图像格式】 最近有在处理图像转换&#xff0c;因此稍微补足了一下图像相关知识&#xff0c;特在此记录。下面汇总是我根据自己理解和网上查阅资料而来。如有错误&#xff0c;欢迎大家指正。 1 基础概念 像素/分辨率 像素(Pixel)&#xff…...

HP服务器基于SNMP-ilo4的硬件监控指标解读

监控易是一款功能全面的IT基础设施监控软件&#xff0c;它通过SNMP协议与HP服务器内置的ilo4远程管理卡进行通信&#xff0c;实现对HP服务器硬件状态的实时监控。本文将针对监控易中基于SNMP-ilo4的HP服务器硬件监控指标进行解读&#xff0c;帮助运维团队更好地理解和应用这些监…...

Android13系统导航栏添加音量加减键按钮功能

不知道为什么拿到芯片原厂发布给我们的Android13系统源码编译后&#xff0c;导航栏没有音量加减键&#xff0c;客户有反馈这个问题&#xff0c;所以特意加了一下&#xff0c;修改记录如下&#xff1a;frameworks/base目录下 commit 9cb2244d61a237cab03c540bfcca6e4fac2bea2c …...

普及GIS知识,推动产业发展

915 GIS节&#xff1a;普及GIS知识&#xff0c;推动产业发展 自2008年起&#xff0c;每年的9月15日被定为“GIS节”&#xff0c;这一特殊的节日由超图首次发起倡议&#xff0c;旨在打造一个普及和传播GIS&#xff08;地理信息系统&#xff09;知识的平台&#xff0c;促进大众对…...

第2章-Python编程基础

#本章目标 1&#xff0c;了解什么是计算机程序 2&#xff0c;了解什么是编程语言 3&#xff0c;了解编程语言的分类 4&#xff0c;了解静态语言与脚本语言的区别 5&#xff0c;掌握IPO程序编写方法 6&#xff0c;熟练应用输出函数print与输入函数input 7&#xff0c;掌握Python…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...