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

使用 163 邮箱实现 Spring Boot 邮箱验证码登录

使用 163 邮箱实现 Spring Boot 邮箱验证码登录

本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器,实现 Spring Boot 项目中的邮件验证码发送功能,并解决常见配置报错问题。


一、为什么需要邮箱授权码?

出于安全考虑,大多数邮箱服务商(如 163、QQ)都不允许直接使用登录密码进行第三方邮件发送
这时候你需要在邮箱设置中开启 SMTP服务 并生成 授权码 来代替密码使用。


二、163 邮箱如何开启第三方登录(获取授权码)

⚡ 步骤如下:

  1. 登录网页版 163 邮箱 → 点击【设置】
  2. 进入左侧【POP3/SMTP/IMAP】菜单
  3. 勾选【开启客户端授权密码功能】
  4. 在【授权密码管理】中点击【新建授权码】
  5. 填入备注(如:“SpringBoot邮件服务”)后生成授权码
  6. 备份授权码,用于项目配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


三、Spring Boot 项目中如何配置 163 邮箱发送邮件

✅ Maven 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

✅ application.properties 配置

spring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=你的邮箱@163.com
spring.mail.password=你的授权码
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.default-encoding=UTF-8

四、邮件发送核心代码

✅ 工具类 EmailSender.java

@Component
public class EmailSender {@Autowiredprivate JavaMailSender mailSender;@Value("${spring.mail.username}")private String fromEmail;public boolean send(String to, String code) {try {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(fromEmail);message.setTo(to);message.setSubject("【Boounion 登录验证码】");message.setText("您的验证码是:" + code + ",5分钟内有效,请勿泄露!");mailSender.send(message);return true;} catch (Exception e) {e.printStackTrace();return false;}}
}

五、常见错误及解决办法

错误信息原因解决方案
Got bad greeting from SMTP host... EOF未启用 SSL 或端口错误使用 port=465+配置 ssl.enable=true
Authentication failed使用了登录密码用授权码替换
Connection timed out网络被墙打开 465 端口 / 更换网络
Cannot send messagefrom 地址不一致setFrom() = spring.mail.username

六、邮件验证码防刷优化

使用 Redis 实现“60 秒内同邮箱不能重复发送验证码”的控制,避免恶意刷接口。

✅ UserService 代码示例:

public boolean isInCooldown(String email) {String key = "email_code_cooldown:" + email;return Boolean.TRUE.equals(redisTemplate.hasKey(key));
}public void markCooldown(String email) {redisTemplate.opsForValue().set("email_code_cooldown:" + email, "1", 60, TimeUnit.SECONDS);
}

✅ Controller 中判断逻辑:

if (userService.isInCooldown(email)) {return ResponseEntity.status(429).body("验证码已发送,请稍后再试");
}

在这里插入图片描述


七、邮件效果展示

验证码邮件示例:

您的验证码是:211337,5分钟内有效,请勿泄露!

在这里插入图片描述


八、总结

步骤状态
163 邮箱开通 SMTP
正确生成并使用授权码
Spring Boot 邮件配置无误
Redis 冷却控制防刷
邮件内容格式清晰

以上配置完成后,你就可以轻松实现一套完整、安全、可控的邮箱登录流程!


附录:完整文件(可自行补全代码)

Spring Boot 项目目录结构参考

src/main/java/org/example/
├── controller/
│   └── LoginController.java      # 登录与验证码相关接口
├── model/
│   └── User.java                 # 用户模型类
├── service/
│   └── UserService.java          # 登录逻辑与验证码缓存管理
├── util/
│   └── EmailSender.java          # 邮件发送工具类
└── Main.java                     # SpringBoot 启动类src/main/resources/
├── static/index.html             # 前端测试页面
└── application.properties        # 邮件 + Redis + DB 配置项

pom.xml ✅

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>BoounionERP</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><!-- Spring Boot 父项目 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.3</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- Spring Boot Web 模块(包含内嵌 Tomcat) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot mail 模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!-- Spring Boot Redis 模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot 开发工具模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><!-- SQL Server JDBC 驱动 --><dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>11.2.3.jre11</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

application.properties ✅

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=BoounionDB;encrypt=true;trustServerCertificate=true
spring.datasource.username=sa
spring.datasource.password=bl123456
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriverspring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=你的邮箱
spring.mail.password=你的授权
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.default-encoding=UTF-8spring.data.redis.host=localhost
spring.data.redis.port=6379spring.jpa.hibernate.ddl-auto=none
server.port=8080

Main.java ✅

package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** ==================================================* This class Main is responsible for [功能描述].** @author darker* @version 1.0* ==================================================*/@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}
}

LoginController.java ✅

package org.example.controller;import org.example.model.User;
import org.example.service.UserService;
import org.example.util.EmailSender;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;
import java.util.Random;/*** ==================================================* This class LoginController is responsible for [功能描述].** @author darker* @version 1.0* ==================================================*/@RestController
@RequestMapping("/api")
public class LoginController {private final UserService userService;private final EmailSender emailSender;public LoginController(UserService userService, EmailSender emailSender) {this.userService = userService;this.emailSender = emailSender;}@PostMapping("/login")public ResponseEntity<Map<String, Object>> login(@RequestBody User user) {String result = userService.login(user);Map<String, Object> response = new HashMap<>();switch (result) {case "登录成功":// 拼接带参数的跳转地址String url = "https://www.baidu.com/s?wd=csdn";response.put("status", "success");response.put("redirectUrl", url);return ResponseEntity.ok(response);case "密码错误":response.put("status", "error");response.put("message", "密码错误");return ResponseEntity.status(401).body(response);case "用户不存在":response.put("status", "error");response.put("message", "用户不存在");return ResponseEntity.status(404).body(response);default:response.put("status", "error");response.put("message", "服务器异常");return ResponseEntity.status(500).body(response);}}@PostMapping("/login/code")public ResponseEntity<?> sendEmailCode(@RequestBody Map<String, String> payload) {String email = payload.get("email");if (email == null || email.isEmpty()) {return ResponseEntity.badRequest().body("邮箱不能为空");}if (!userService.isEmailRegistered(email)) {return ResponseEntity.status(404).body("该邮箱未注册");}// 检查是否在冷却期(例如60秒)if (userService.isInCooldown(email)) {return ResponseEntity.status(429).body("验证码已发送,请稍后再试");}// 生成6位验证码String code = String.format("%06d", new Random().nextInt(999999));boolean success = emailSender.send(email, code);if (success) {userService.saveEmailCode(email, code);userService.markCooldown(email);return ResponseEntity.ok("验证码发送成功");} else {return ResponseEntity.status(500).body("验证码发送失败");}}@PostMapping("/login/email")public ResponseEntity<?> loginWithEmailCode(@RequestBody Map<String, String> payload) {String email = payload.get("email");String code = payload.get("code");if (email == null || code == null) {return ResponseEntity.badRequest().body("邮箱或验证码不能为空");}if (!userService.isEmailRegistered(email)) {return ResponseEntity.status(404).body("该邮箱未注册");}if (!userService.verifyEmailCode(email, code)) {return ResponseEntity.status(401).body("验证码错误或已过期");}Map<String, Object> response = new HashMap<>();response.put("status", "success");response.put("message", "登录成功");return ResponseEntity.ok(response);}
}

User.java ✅

package org.example.model;/*** ==================================================* This class User is responsible for [功能描述].** @author darker* @version 1.0* ==================================================*/public class User {private String username;private String password;private String email;public User() {}public User(String username, String password) {this.username = username;this.password = password;}public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getPassword() { return password; }public void setPassword(String password) { this.password = password; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }
}

UserService.java ✅

package org.example.service;import org.example.model.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;import java.sql.*;/*** ==================================================* This class UserService is responsible for [功能描述].** @author darker* @version 1.0* ==================================================*/@Service
public class UserService {@Value("${spring.datasource.url}")private String dbUrl;@Value("${spring.datasource.username}")private String dbUser;@Value("${spring.datasource.password}")private String dbPassword;private static final long CODE_COOLDOWN_SECONDS = 60;private final StringRedisTemplate redisTemplate;public UserService(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}// 保存验证码到 Redis,5 分钟有效public void saveEmailCode(String email, String code) {String key = "email_code:" + email;redisTemplate.opsForValue().set(key, code, 5, TimeUnit.MINUTES);}// 验证验证码是否正确public boolean verifyEmailCode(String email, String code) {String key = "email_code:" + email;String cachedCode = redisTemplate.opsForValue().get(key);return code.equals(cachedCode);}// 判断邮箱是否注册public boolean isEmailRegistered(String email) {try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword)) {String sql = "SELECT COUNT(*) FROM Users WHERE email = ?";try (PreparedStatement stmt = conn.prepareStatement(sql)) {stmt.setString(1, email);try (ResultSet rs = stmt.executeQuery()) {rs.next();return rs.getInt(1) > 0;}}} catch (SQLException e) {e.printStackTrace();return false;}}public boolean isInCooldown(String email) {String key = "email_code_cooldown:" + email;return redisTemplate.hasKey(key);}public void markCooldown(String email) {String key = "email_code_cooldown:" + email;redisTemplate.opsForValue().set(key, "1", CODE_COOLDOWN_SECONDS, TimeUnit.SECONDS);}public String login(User user) {try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword)) {String checkUserSql = "SELECT password FROM Users WHERE username = ?";try (PreparedStatement stmt = conn.prepareStatement(checkUserSql)) {stmt.setString(1, user.getUsername());try (ResultSet rs = stmt.executeQuery()) {if (!rs.next()) {return "用户不存在";}String dbPassword = rs.getString("password");if (!dbPassword.equals(user.getPassword())) {return "密码错误";}return "登录成功";}}} catch (SQLException e) {e.printStackTrace();return "数据库错误";}}
}

EmailSender.java ✅

package org.example.util;import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Value;/*** ==================================================* This class EmailSender is responsible for [功能描述].** @author draker* @version 1.0* ==================================================*/@Component
public class EmailSender {private final JavaMailSender mailSender;@Value("${spring.mail.username}")private String fromEmail;public EmailSender(JavaMailSender mailSender) {this.mailSender = mailSender;}/*** 发送验证码邮件* @param to 收件人邮箱* @param code 验证码内容* @return true=发送成功,false=失败*/public boolean send(String to, String code) {try {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(fromEmail);message.setTo(to);message.setSubject("【Boounion 登录验证码】");message.setText("您的验证码是:" + code + ",5分钟内有效,请勿泄露!");mailSender.send(message);return true;} catch (Exception e) {System.err.println("邮件发送失败: " + e.getMessage());return false;}}
}

相关文章:

使用 163 邮箱实现 Spring Boot 邮箱验证码登录

使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器&#xff0c;实现 Spring Boot 项目中的邮件验证码发送功能&#xff0c;并解决常见配置报错问题。 一、为什么需要邮箱授权码&#xff1f; 出于安全考虑&#xff0c;大…...

python处理异常,JSON

异常处理 #异常处理 # 在连接MySQL数据库的过程中&#xff0c;如果不能有效地处理异常&#xff0c;则异常信息过于复杂&#xff0c;对用户不友好&#xff0c;暴露过多的敏感信息 # 所以&#xff0c;在真实的生产环境中&#xff0c; 程序必须有效地处理和控制异常&#xff0c;按…...

原生微信小程序 textarea组件placeholder无法换行的问题解决办法

【问题描述】 微信小程序原生代码&#xff0c;使用文本域&#xff0c;placeholder使用\n 没有效果&#xff0c;网上找了一堆方案说使用 也没有效果 最后在一个前端大佬博客&#xff0c;找到解决办法&#xff0c;CSS设置word-wrap: break-word; white-space: pre-line; 【解决办…...

毕设设计 | 管理系统图例

文章目录 环素1. 登录、注册2. 菜单管理 环素 1. 登录、注册 2. 菜单管理 公告通知 订单管理 会员管理 奖品管理 新增、编辑模块...

激光雷达视觉定位是3D视觉定位吗?

激光雷达视觉定位通常被归类为3D视觉定位&#xff0c;但具体来说&#xff0c;它是融合了激光雷达&#xff08;LiDAR&#xff09;数据和视觉&#xff08;图像&#xff09;数据的多模态3D定位方法。我们可以从几个角度来理解这点&#xff1a; 为什么说它属于3D视觉定位&#xff…...

每周靶点:NY-ESO-1、GPC3、IL27分享

本期精选了《自身免疫性癌抗原NY-ESO-1》《肝细胞癌标记物GPC3》《白细胞介素IL27》三篇文章。以下为各研究内容的概述&#xff1a; 自身免疫性癌抗原NY-ESO-1 NY-ESO-1是一种自身免疫性癌抗原&#xff0c;也称为CTA1B&#xff08;CTAG1B&#xff09;&#xff0c;由主要组织相…...

Maven 插件参数注入与Mojo开发详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

Java详解RabbitMQ工作模式之发布订阅模式

目录 一、发布订阅模式简介二、发布订阅模式的工作原理2.1 核心组件2.2 工作流程 三、代码示例3.1 生产者代码3.2 消费者代码 四、实际应用场景五、注意事项六、总结 在分布式系统中&#xff0c;消息队列作为异步通信的桥梁&#xff0c;扮演着至关重要的角色。而 RabbitMQ&…...

UR5e机器人Matlab仿真

在 MATLAB 中使用 UR5e 机器人模型进行仿真和控制&#xff0c;通常需要结合机器人系统工具箱&#xff08;Robotics System Toolbox&#xff09; UR5e loadrobot("universalUR5e","DataFormat","column"); UR5e.Gravity [0 0 -9.81]; % 保存机器…...

[ctfshow web入门] web75

信息收集 scandir被禁用了 解题 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false ) {echo $file."<br>";}c…...

论文中表格跨页该怎么整(如何给跨页表格添加标题和表头)

标题&#xff1a;光标移动到第一行表格&#xff0c;然后快捷键;ctrl shirft enter&#xff0c;就会发现第二页多了一行&#xff0c;再把标题复制张贴过来即可 表头&#xff1a; 光标移动到第一行表格&#xff0c;鼠标右键 选择插入 再选择在上方插入行&#xff0c;然后手动添加…...

day26 Python 自定义函数

目录 一、函数的基本定义 示例 1&#xff1a;不带参数的函数 示例 2&#xff1a;查看文档字符串 二、带参数的函数 示例 3&#xff1a;带一个参数的函数 示例 4&#xff1a;带多个参数的函数 三、带返回值的函数 示例 5&#xff1a;计算两个数的和并返回结果 示例 6&am…...

洛谷P4907题解

题目传送门 题意&#xff1a; 扑克牌的部分牌被移除&#xff0c;需从剩牌中选 4 个区间&#xff0c;每个区间的牌都是同一花色且点数连续。如果不可选&#xff0c;输出最少需添加几张牌才能满足要求。 思路&#xff1a; 暴力和剪枝。 暴力&#xff1a;按照题意模拟&#xff…...

【MyBatis插件】PageHelper 分页

前言 在开发 Web 应用时&#xff0c;我们经常需要处理海量数据的展示问题。例如&#xff0c;在一个电商平台上&#xff0c;商品列表可能有成千上万条数据。如果我们一次性将所有数据返回给前端&#xff0c;不仅会导致页面加载缓慢&#xff0c;还会对数据库造成巨大压力。为了解…...

AI数字人融合VR全景:从技术突破到可信场景落地

摘要 本文深度解析AI数字人与VR全景技术融合的技术架构&#xff0c;结合故宫博物院、西门子、强生等真实行业案例&#xff0c;揭示技术落地的关键路径与量化价值。通过具体技术参数、实施细节及权威机构数据&#xff0c;构建可信的技术应用图景&#xff0c;为开发者提供可复用…...

机器学习——朴素贝叶斯练习题

一、 使用鸢尾花数据训练多项式朴素贝叶斯模型&#xff0c;并评估模型 代码展示&#xff1a; from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.naive_bayes impor…...

【爬虫】DrissionPage-3

安装&#xff1a;4.1最新版本 pip install drissionpage --upgrade 官方文档&#xff1a;&#x1f6f0;️ 连接浏览器 | DrissionPage官网 1 Chromium对象 Chromium对象用于连接和管理浏览器。标签页的开关和获取、整体运行参数配置、浏览器信息获取等都由它进行。 1.1 默认…...

网络爬虫学习之httpx的使用

开篇 本文整理自《Python3 网络爬虫实战》&#xff0c;主要是httpx的使用。 笔记整理 使用urllib库requests库的使用&#xff0c;已经可以爬取绝大多数网站的数据&#xff0c;但对于某些网站依然无能为力。 这是因为这些网站强制使用HTTP/2.0协议访问&#xff0c;这时urllib和r…...

TASK02【Datawhale 组队学习】使用 LLM API 开发应用

文章目录 system prompt 和 user prompt高效prompt&#xff1a;用清晰、详尽的语言表达 Prompt原则一&#xff1a;清晰&#xff0c;具体的指令分隔符寻求结构化的输出要求模型检查是否满足条件提供少量示例 "Few-shot" prompting 原则二&#xff0c;给模型时间去思考…...

黑马k8s(七)

1.Pod介绍 查看版本&#xff1a; 查看类型,这里加s跟不加s没啥区别&#xff0c;可加可不加 2.Pod基本配置 3.镜像拉去策略 本地没有这个镜像&#xff0c;策略是Never&#xff0c;启动失败 查看拉去策略&#xff1a; 更改拉去策略&#xff1a; 4.启动命令 运行的是nginx、busv…...

【FMC216】基于 VITA57.1 的 2 路 TLK2711 发送、2 路 TLK2711 接收 FMC 子卡模块

产品概述 FMC216 是一款基于 VITA57.1 标准规范的 2 路 TLK2711 接收、2 路 TLK2711 发送 FMC 子卡模块。该板卡支持 2 路 TLK2711 数据的收发&#xff0c;支持线速率 1.6Gbps&#xff0c;经过 TLK2711 高速串行收发器&#xff0c;可以将 1.6Gbps 的高速串行数据解串为 16 位并…...

如何在Edge浏览器里-安装梦精灵AI提示词管理工具

方案一&#xff08;应用中心安装-推荐&#xff09;&#xff1a; 梦精灵 跨平台AI提示词管理工具 - Microsoft Edge AddonsMake Microsoft Edge your own with extensions that help you personalize the browser and be more productive.https://microsoftedge.microsoft.com…...

Ubuntu shell指定conda的python环境启动脚本

Ubuntu shell指定conda的python环境启动脚本。 通过指令&#xff0c;获取目前系统的conda虚拟python环境 conda info -e 如下图所示&#xff0c;为我自己电脑的python环境 # conda environments: # base * /home/ubuntu/miniconda3 kitti …...

深入理解无监督学习与K-means聚类算法:原理与实践

一、无监督学习概述 无监督学习(Unsupervised Learning)是机器学习的重要分支之一&#xff0c;与有监督学习不同&#xff0c;它不需要预先标记的训练数据。在无监督学习中&#xff0c;计算机仅根据样本的特征或样本间的相关性&#xff0c;从数据中自动发现隐藏的模式或结构。 …...

单片机-STM32部分:16、Git工具使用

Docshttps://x509p6c8to.feishu.cn/wiki/Pftrw3Z6niRlewkurnyctyw1nQx 使用Git管理本地仓库的好处是&#xff0c;可以知道自己每次修改了哪些内容&#xff0c;随时进行版本切换。 待完善。...

扬州卓韵酒店用品:优质洗浴用品,提升酒店满意度与品牌形象

在酒店提供的服务里&#xff0c;沐浴用品占据了非常重要的地位&#xff0c;其质量与种类直接关系到客人洗澡时的感受。好的沐浴用品能让客人洗澡时感到舒心和快乐&#xff0c;反之&#xff0c;质量不好的用品可能会影响客人整个住宿期间的愉悦心情。挑选恰当的洗浴用品不仅能够…...

Coze 实战教程 | 10 分钟打造你的AI 助手

> 文章中的 xxx 自行替换&#xff0c;文章被屏蔽了。 &#x1f4f1; 想让你的xxx具备 AI 对话能力&#xff1f;本篇将手把手教你&#xff0c;如何用 Coze 平台快速构建一个能与用户自然交流、自动回复提问的 xxx助手&#xff0c;零代码、超高效&#xff01; &#x1f4cc;…...

使用 frp 实现内网穿透:从基础到进阶

在日常开发中&#xff0c;我们经常会遇到需要将本地服务暴露给外部用户的情况&#xff0c;比如测试同学需要临时测试一个本地开发的 Web 服务&#xff0c;或者希望在出差时远程访问家里的 NAS。这些需求的核心问题都是如何实现内网穿透。 一、为什么选择 frp&#xff1f; 经过…...

redis中key的过期和淘汰

一、过期&#xff08;redis主动删除&#xff09; 设置了ttl过期时间的key&#xff0c;在ttl时间到的时候redis会删除过期的key。但是redis是惰性过期。惰性过期&#xff1a;redis并不会立即删除过期的key&#xff0c;而是会在获取key的时候判断key是否过期&#xff0c;如果发现…...

鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp

使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中&#xff0c;表单元素是用户交互的重要组成部分。尤其是多选框&#xff08;Checkbox&#xff09;和单选框&#xff08;Radio&#xff09;&#xff0c;它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...

和为target问题汇总

文章目录 习题题型1377.组合总和 IV 题型2494.目标和 和为target的问题&#xff0c;可以有很多种问题的形式的考察&#xff0c;当然&#xff0c;及时的总结与回顾有利于我们熟练掌握这些知识&#xff01; 题型1 爬楼梯问题&#xff0c;是对于转移步伐有规定&#xff0c;在不同…...

Ubuntu使用Docker搭建SonarQube企业版(含破解方法)

目录 Ubuntu使用Docker搭建SonarQube企业版&#xff08;含破解方法&#xff09;SonarQube介绍安装Docker安装PostgreSQL容器Docker安装SonarQube容器SonarQube汉化插件安装 破解生成license配置agent 使用 Ubuntu使用Docker搭建SonarQube企业版&#xff08;含破解方法&#xff…...

牛客网 NC22167: 多组数据a+b

牛客网 NC22167: 多组数据ab 题目分析 这道题目来自牛客网&#xff08;题号&#xff1a;NC22167&#xff09;&#xff0c;要求我们计算两个整数a和b的和。乍看简单&#xff0c;但有以下特殊点需要注意&#xff1a; 输入包含多组测试数据每组输入两个整数当两个整数都为0时表示…...

EdgeShard:通过协作边缘计算实现高效的 LLM 推理

(2024-05-23) EdgeShard: Efficient LLM Inference via Collaborative Edge Computing (EdgeShard:通过协作边缘计算实现高效的 LLM 推理) 作者: Mingjin Zhang; Jiannong Cao; Xiaoming Shen; Zeyang Cui;期刊: (发表日期: 2024-05-23)期刊分区:本地链接: Zhang 等 - 2024 …...

π0: A Vision-Language-Action Flow Model for General Robot Control

TL;DR 2024 年 Physical Intelligence 发布的 VLA 模型 π0&#xff0c;基于 transformer 流匹配&#xff08;flow matching&#xff09;架构&#xff0c;当前开源领域最强的 VLA 模型之一。 Paper name π0: A Vision-Language-Action Flow Model for General Robot Contr…...

RabbitMQ高级篇-MQ的可靠性

目录 MQ的可靠性 1.如何设置数据持久化 1.1.交换机持久化 1.2.队列持久化 1.3.消息持久化 2.消息持久化 队列持久化&#xff1a; 消息持久化&#xff1a; 3.非消息持久化 非持久化队列&#xff1a; 非持久化消息&#xff1a; 4.消息的存储机制 4.1持久化消息&…...

4、前后端联调文生文、文生图事件

4、前后端联调文生文、文生图事件 原文地址 1、底部【发送按钮】事件触发调用后端AI程序逻辑 <!-- 前端模板如下: --> <!DOCTYPE html> <html><head><meta charset"utf-8"><title>小薛博客LLM大模型实战</title><me…...

深度学习中的提示词优化:梯度下降全解析

深度学习中的提示词优化:梯度下降全解析 在您的代码中,提示词的更新方向是通过梯度下降算法确定的,这是深度学习中最基本的优化方法。 一、梯度下降与更新方向 1. 核心公式 对于可训练参数 θ \theta θ(这里是提示词嵌入向量),梯度下降的更新公式为:...

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】

引言 在人工智能图像生成领域&#xff0c;Midjourney 凭借其强大的艺术表现力和灵活的创作模式&#xff0c;已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”&#xff0c;我将结合多年实战经验&#xff0c;系统分享 Midjourney 的创作方法论&#x…...

【数字图像处理】半开卷复习提纲

1&#xff1a;要求 2张A4纸以内&#xff0c;正反面均可写 &#xff08;不过博主由于墨水浸到背面了&#xff0c;采用了把2张单面通过双面胶粘起来的方法&#xff0c;结果考前半个小时都在用这个难用的双面胶。。。&#xff09; 2&#xff1a;提纲内容 3&#xff1a;提示 考的…...

交通运输与能源融合发展——光储充在交通上的应用完整解决方案

在全球积极应对气候变化、推动可持续发展的大背景下&#xff0c;交通运输与能源领域的融合发展成为关键趋势。近日&#xff0c;交通运输部等十部门联合发布的《关于推动交通运输与能源融合发展的指导意见》&#xff0c;为这两个重要行业的协同前行指明了清晰的方向&#xff0c;…...

API 接口开放平台 Crabc 3.2 发布

2025 年 5 月 15 日&#xff0c;API 接口开放平台 Crabc 3.2 发布。 Crabc 是一款 API 接口开发平台、企业级接口管理和 SQL2API 平台。它支持动态数据源、动态 SQL 和标签&#xff0c;能接入多种 SQL 或 NoSQL 数据源&#xff0c;包括 MySQL、Oracle、达梦、TiDB、Hive、ES 和…...

基于智能推荐的就业平台的设计与实现(招聘系统)(SpringBoot Thymeleaf)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

【web应用】配置Java JDK与maven3的环境变量

文章目录 一、控制面板 - 系统 - 高级系统设置-环境变量二、用户变量和系统变量的配置方法一样&#xff1a;三、查看是否配置成功 maven有两种安装方式&#xff1a; 1、IDEA捆绑安装&#xff0c;一般是maven3【这里配置的环境变量是捆绑安装这种方式】 2、手动下载安装插件 一、…...

编程日志5.7

二叉树的功能代码 #include<iostream> using namespace std; //二叉树结点定义 template<typename T> struct TreeNode { T val;//定义了一个类型为T的成员变量val,用于存储树节点的值 TreeNode* left;//定义了一个指向TreeNode类型的指针成员变量left,…...

室内定位:热门研究方向与未解难题深度解析

I. 引言:对普适性室内定位的持续探索 A. 室内定位在现代应用中的重要性 室内定位系统(IPS)正迅速成为众多应用领域的基石技术,其重要性源于现代社会人们约70%至90%的时间在室内度过的事实 1。这些应用横跨多个行业,包括应急响应 1、智能建筑与智慧城市 6、医疗健康(如病…...

图片通过滑块小图切换大图放大镜效果显示

图片通过滑块小图切换大图放大镜效果显示 实现目标&#xff1a; 显示一组图片列表&#xff0c;鼠标进入小图记录当下小图下标&#xff0c;通过小图下标在数组中对应图片显示到大图位置&#xff1b; 鼠标进入大图位置时&#xff0c;带动滑块移动&#xff0c;并将放大两倍的大图…...

[250515] 腾讯推出 AI 编程助手 CodeBuddy,对标 Cursor

目录 腾讯推出 AI 编程助手 CodeBuddy 腾讯推出 AI 编程助手 CodeBuddy 腾讯发布 CodeBuddy&#xff0c;一款 AI 编程助手&#xff0c;旨在提升开发者效率。 主要亮点&#xff1a; CodeBuddy&#xff1a; 全新英文品牌&#xff0c;面向全球开发者。Craft 模式&#xff1a; A…...

OpenCV光流估计:原理、实现与应用

一、什么是光流&#xff1f; 光流(Optical Flow)是计算机视觉中描述图像序列中像素运动模式的重要概念。它表示图像中物体在连续帧之间的表观运动&#xff0c;是由物体或相机的运动引起的。 光流的基本假设 亮度恒常性&#xff1a;同一物体点在连续帧中的亮度保持不变时间持…...

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据&#x1f4cc; 简介&#x1f6e0; 插件安装方法&#x1f30d; 下载 DEM 数据步骤&#x1f511; 注册 OpenTopography 账号&#xff08;如使用 Cope…...