spring boot发送邮箱,java实现邮箱发送(邮件带附件)3中方式【保姆级教程一,代码直接用】
文章目录
- Java发送邮箱的方式
- 1. 基于 Javax.mail 实现
- 关于附件上传的方法
- 2. 基于 org.apache.commons.mail 实现
- 常见报错
- 3. 基于 spring-boot-starter-mail 实现(推荐)
实际开发时需要实现邮件发送,本文章实现如何从零实现邮件发送。也就是 Spring Boot 项目中如何实现邮箱发送。
Java发送邮箱的方式
1、前提:需要获取发件人邮箱的授权码,也就是打开POP3/IMAP/SMTP
服务设置,拿到授权码。
2、获取到邮件服务器的 smtp 地址:
服务商 | smtp服务地址 | smtp服务端口 | pop3服务地址 | pop3服务端口 |
---|---|---|---|---|
新浪: sina.com | smtp.sina.com.cn | 25 | pop3.sina.com.cn | 110 |
搜狐:sohu.com | smtp.sohu.com | 25 | pop3.sohu.com | 110 |
163:163.com | smtp.163.com | 25 | smtp.163.com | 110 |
QQ:qq.com | smtp.qq.com | 25 或 465 或 587 | smtp.qq.com | 110 |
foxmail:foxmail.com | smtp.foxmail.com | 25 | pop3.foxmail.com | 110 |
QQ企业邮箱:exmail.qq.com | smtp.exmail.qq.com | 995 | pop3.exmail.qq.com | 587/465 |
1. 基于 Javax.mail 实现
先引入依赖:
<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version>
</dependency>
大致的流程:
1、创建配置项变量 Properties 对象,用于声明 smtp 相关配置;
2、创建一个Session,重写一个Authenticator,用于声明发件人邮箱地址和授权码;
3、利用 session 创建一个 MimeMessage 对象,再利用 MimeMessage 创建一个 MimeMessageHelper 对象,该对象用于设置收件人、发件人、抄送、秘密抄送、主题、内容、附件、发送时间等属性;
4、利用 Transport.send 方法发送邮件。
代码示例:
@Slf4j
public class EmailJavax {// 也可以从配置文件中取值// smtp服务地址private static final String senderSmtpHost = "smtp.qq.com";// 邮箱端口号private static final String senderSmtpPort = "465";// 发信人邮箱private static final String senderEmail = "xxx@qq.com";// 发信人邮箱授权码private static final String senderPassword = "xxx";/*** 邮件发送** @param subject 邮件主题* @param content 邮件内容* @param contentIsHtml 内容是否为html格式* @param fromMailPersonalName 发件人昵称* @param toMail 收件人邮箱* @param ccMail 抄送人邮箱* @param bccMail 秘密抄送人邮箱* @param fileNames 文件名(本地路径)*/public static void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName, String toMail, String ccMail, String bccMail, List<String> fileNames) throws GeneralSecurityException, UnsupportedEncodingException, MessagingException {// 1.创建配置项变量,用于声明 smtp 相关配置Properties properties = System.getProperties();// smtp服务地址properties.put("mail.smtp.host", senderSmtpHost);// smtp服务端口properties.put("mail.smtp.port", senderSmtpPort);// 开启验证properties.put("mail.smtp.auth", "true");// 开启TLS加密properties.put("mail.smtp.starttls.enable", "true");// 是否启用socketFactory,默认为trueproperties.put("mail.smtp.socketFactory.fallback", "true");MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable", "true");properties.put("mail.smtp.ssl.socketFactory", sf);// 2.重写Authenticator,用于声明发件人邮箱地址和授权码// 建立会话,将邮箱授权码给jvmSession session = Session.getDefaultInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(senderEmail, senderPassword);}});// 设置为true可以在控制台打印发送过程,生产环境关闭session.setDebug(true);// 3.创建MimeMessage对象// 创建邮件对象MimeMessage message = new MimeMessage(session);// 创建MimeMessageHelper对象,通过MimeMessageHelper设置正文和附件,否则会导致两者显示不全MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");//设置发件人helper.setFrom(new InternetAddress(senderEmail, fromMailPersonalName));// 设置收件人,to为收件人,cc为抄送,bcc为密送if (StringUtils.isEmpty(toMail)) {log.error("邮件收件人为空");return;}helper.setTo(InternetAddress.parse(toMail, false));if (!StringUtils.isEmpty(ccMail)) {helper.setCc(InternetAddress.parse(ccMail, false));}if (!StringUtils.isEmpty(bccMail)) {helper.setBcc(InternetAddress.parse(bccMail, false));}// 设置邮件主题helper.setSubject(subject);//设置邮件正文内容helper.setText(content, contentIsHtml);//设置发送的日期helper.setSentDate(new Date());// 设置附件(注意这里的fileName必须是服务器本地文件名,不能是远程文件链接)if (!CollectionUtils.isEmpty(fileNames)) {for (String fileName : fileNames) {FileDataSource fileDataSource = new FileDataSource(fileName);helper.addAttachment(fileDataSource.getName(), fileDataSource);}}// 4.调用Transport的send方法去发送邮件Transport.send(message);}
}
// 测试:
public class Test(){public static void main(String[] args) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException {// excel表格的存放位置:String fileName = "/xx/xx/xx/供应商接口参数.xlsx";String html = "<h1>统计数据如下所示:</h1>" +"<table border=\"1\">\n" +" <tr>\n" +" <th>月度销售额</th>\n" +" <th>年度销售额</th>\n" +" </tr>\n" +" <tr>\n" +" <td>10000</td>\n" +" <td>2000000</td>\n" +" </tr>\n" +"</table>";// 调方法:EmailJavax.sendEmail("统计数据", html, true, "发送人名字", "收件人邮箱", null, null, Collections.singletonList(fileName));}
}
关于附件上传的方法
附件上传有多种方式,除了上面用到的 FileDataSource
形式添加附件外,还有 文件、输入流的方式添加:
addAttachment(String attachmentFilename, DataSource dataSource)
addAttachment(String attachmentFilename, File file)
addAttachment(String attachmentFilename, InputStreamSource inputStreamSource)
addAttachment(String attachmentFilename, InputStreamSource inputStreamSource, String contentType)
2. 基于 org.apache.commons.mail 实现
commons
包中提供了 Email
抽象类,该类下实现了
HtmlEmail(用于HTML正文,附件邮件发送)
ImageHtmlEmail(用于HTML图片正文,附件邮件发送)
MultiPartEmail(用于附件邮件发送)
SimpleEmail(用于简单邮件发送)
其继承关系如图所示:
1、引入依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.5</version>
</dependency>
2、实现:
@Slf4j
public class EmailCommons {// 也可以从配置文件中取值// smtp服务地址private static final String senderSmtpHost = "smtp.qq.com";// 邮箱端口号private static final String senderSmtpPort = "465";// 发信人邮箱private static final String senderEmail = "xxx@qq.com";// 发信人邮箱授权码private static final String senderPassword = "xxx";/*** 邮件发送** @param subject 邮件主题* @param content 邮件内容* @param contentIsHtml 内容是否为html格式* @param fromMailPersonalName 发件人昵称* @param toMail 收件人邮箱* @param ccMail 抄送人邮箱* @param bccMail 秘密抄送人邮箱* @param fileList 附件 */public static void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName, String toMail, String ccMail, String bccMail, File[] fileList) throws GeneralSecurityException, UnsupportedEncodingException, MessagingException {// 1.创建HtmlEmail对象HtmlEmail email = new HtmlEmail();// smtp服务地址email.setHostName(senderSmtpHost);// smtp服务端口email.setSmtpPort("mail.smtp.port", senderSmtpPort);email.setCharset("utf-8");// 邮件验证email.setAuthentication(senderEmail,senderPassword);//设置发件人email.setFrom(senderEmail, fromMailPersonalName);// 设置收件人,to为收件人,cc为抄送,bcc为密送if (StringUtils.isEmpty(toMail)) {log.error("邮件收件人为空");return;}email.addTo(toMail);if (!StringUtils.isEmpty(ccMail)) {email.addCc(ccMail);}if (!StringUtils.isEmpty(bccMail)) {email.addBcc(bccMail);}// 设置邮件主题email.setSubject(subject);//设置邮件正文内容if(contentIsHtml){email.setHtmlMsg(content);}else{email.setMsg(content);}// 设置附件if(!ObjectUtils.isEmpty(fileList)){for (File file : fileList) {EmailAttachment emailAttachment = new EmailAttachment();emailAttachment.setName(MimeUtility.encodeText(file.getName()));emailAttachment.setPath(file.getPath());email.attach(emailAttachment);}}// 4.调用send方法去发送邮件email.send();}
}
3、测试:
public class Test(){public static void main(String[] args) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException {// excel表格的存放位置:String fileName = "/xx/xx/xx/供应商接口参数.xlsx";File file = new File(fileName);String html = "<h1>统计数据如下所示:</h1>" +"<table border=\"1\">\n" +" <tr>\n" +" <th>月度销售额</th>\n" +" <th>年度销售额</th>\n" +" </tr>\n" +" <tr>\n" +" <td>10000</td>\n" +" <td>2000000</td>\n" +" </tr>\n" +"</table>";EmailCommons.sendEmail("统计数据", html, true, "发送人名字", "收件人邮箱", null, null,new File[]{file} );}
}
常见报错
1、535 Login Fail. Please enter your authorization code to login
原因:邮箱验证设置的账号密码错误
解决:注意参数值正确性:email.setAuthentication(发件人邮箱地址,邮箱授权码);
2、MessagingException: Got bad greeting from SMTP host: smtp.qq.com, port: 465, response: [EOF]
解决:commons.mail 发送邮件时,QQ 邮箱使用默认端口 25 即可
3. 基于 spring-boot-starter-mail 实现(推荐)
1、引入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、使用配置文件:
spring:# 配置发送邮件的配置信息mail:# 配置smtp服务主机地址host: smtp.qq.com# 发送者邮箱username: XXX@qq.com# 配置密码,注意不是真正的密码,而是申请到的授权码password: jlpXXXXXdecj# 端口号:465或587port: 465# 默认的邮件编码为UTF-8default-encoding: UTF-8# 其他参数properties:mail:# 配置SSL 加密工厂smtp:ssl:# 本地测试,先放开sslenable: truerequired: true# 开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误debug: true
3、实现:
/*** 发送邮件类*/
public class SendEmailUtil {// 注入系统相关类@Autowiredprivate JavaMailSender javaMailSender;@Autowiredprivate MailProperties mailProperties;// 发送者邮箱
// @Value("${spring.mail.username}")
// private String sendMailer;/*** 邮件发送1** @param subject 邮件主题* @param content 邮件内容* @param contentIsHtml 内容是否为html格式* @param fromMailPersonalName 发件人昵称* @param toMail 收件人邮箱* @param ccMail 抄送人邮箱* @param bccMail 秘密抄送人邮箱* @param fileNames 文件名(本地文件名)*/public static void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName,String toMail, String ccMail, String bccMail, List<String> fileNames) throws MessagingException, UnsupportedEncodingException {// true 代表支持复杂的类型MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);/* 邮件发信人:两种写法:1. 定义成员变量获取application.yml的username属性@Value("${spring.mail.username}")private String sendMailer;helper.setFrom(sendMailer,发件人名称)2. 注入系统类的对象,然后调方法获取,获取的值也是application.yml文件中的值@Autowiredprivate MailProperties mailProperties;helper.setFrom(mailProperties.getUsername(),发件人名称);*/helper.setFrom(mailProperties.getUsername(), fromMailPersonalName);// 邮件收信人 1或多个helper.setTo(toMail);if (!ObjectUtils.isEmpty(ccMail)) {// 邮件抄送人helper.setCc(ccMail);}if (!ObjectUtils.isEmpty(bccMail)) {// 邮件私密抄送人helper.setBcc(bccMail);}// 邮件主题helper.setSubject(subject);// 邮件内容 contentIsHtml值为 true 代表支持htmlhelper.setText(content, contentIsHtml);// 设置附件(注意这里的fileName必须是服务器本地文件名,不能是远程文件链接)if (!CollectionUtils.isEmpty(fileNames)) {for (String fileName : fileNames) {// 添加邮件附件FileDataSource fileDataSource = new FileDataSource(fileName);helper.addAttachment(fileDataSource.getName(), fileDataSource);}}// 发送邮件javaMailSender.send(mimeMessage);}/*** 邮件发送2 -- 方法优化 -- 文件对象** @param subject 邮件主题* @param content 邮件内容* @param contentIsHtml 内容是否为html格式* @param fromMailPersonalName 发件人昵称* @param toMail 收件人邮箱* @param ccMail 抄送人邮箱* @param bccMail 秘密抄送人邮箱* @param files 文件对象*/public static void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName,String toMail, String ccMail, String bccMail, File[] files) throws MessagingException, UnsupportedEncodingException {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(mailProperties.getUsername(), fromMailPersonalName);helper.setTo(toMail);if (!ObjectUtils.isEmpty(ccMail)) {helper.setCc(ccMail);}if (!ObjectUtils.isEmpty(bccMail)) {helper.setBcc(bccMail);}helper.setSubject(subject);helper.setText(content, contentIsHtml);// 设置附件,不能是远程文件if (!ObjectUtils.isEmpty(files)) {for (File file : files) {helper.addAttachment(file.getName(), file);}}javaMailSender.send(message);}/*** 邮件发送3 -- 方法优化 -- 使用流** @param subject 邮件主题* @param content 邮件内容* @param contentIsHtml 内容是否为html格式* @param fromMailPersonalName 发件人昵称* @param toMail 收件人邮箱* @param ccMail 抄送人邮箱* @param bccMail 秘密抄送人邮箱* @param fileName 文件名称* @param fileInput 文件流*/public static void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName,String toMail, String ccMail, String bccMail, String fileName, InputStreamSource fileInput) throws MessagingException, UnsupportedEncodingException {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(mailProperties.getUsername(), fromMailPersonalName);helper.setTo(toMail);if (!ObjectUtils.isEmpty(ccMail)) {helper.setCc(ccMail);}if (!ObjectUtils.isEmpty(bccMail)) {helper.setBcc(bccMail);}helper.setSubject(subject);helper.setText(content, contentIsHtml);// 设置附件,不能是远程文件if (fileInput != null) {helper.addAttachment(fileName, fileInput);}javaMailSender.send(message);}
}
关于邮件发送的方法参数: 上面几个方法,最后接收附件的参数都不一样,说明可以灵活变化
sendEmail(xxx, List<String> fileNames)
:可以接收多个附件,其中传的时候,就是附件的绝对路径sendEmail(xxx, File[] files)
:可以接收多个附件,传的时候,就是附件的文件对象sendEmail(xxx, InputStreamSource fileInput)
:接收一个附件,传的时候,就是附件的流
5、测试:
/*** excel表格生成工具*/
public class ExcelUtil {/*** 生成excel文件** @param fileName excel文件路径* @param dataList 数据列表* @param clazz 导出对象类* @param <T>* @return*/public static <T> File generateExcel(String fileName, List<T> dataList, Class<T> clazz) {// 生成文件File file = new File(fileName);// 单sheet写入EasyExcel.write(file, clazz).sheet("XXX").doWrite(dataList);return file;}/*** 生成excel文件 -- 方法优化 -- 用流** @param dataList 数据列表* @param clazz 导出对象类* @param <T>* @return*/public static <T> ByteArrayOutputStream generateExcel(List<T> dataList, Class<T> clazz) {ByteArrayOutputStream out = new ByteArrayOutputStream();// 单excel写入EasyExcel.write(out, clazz).sheet("XXX").doWrite(dataList);return out;}}
public class Test(){public static void main(String[] args) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException {String content = "客户统计数据如附件所示";// 测试邮件发送1// excel表格的存放位置:String fileName = "/xx/xx/xx/供应商接口参数.xlsx";String html = "<h1>统计数据如下所示:</h1>" +"<table border=\"1\">\n" +" <tr>\n" +" <th>月度销售额</th>\n" +" <th>年度销售额</th>\n" +" </tr>\n" +" <tr>\n" +" <td>10000</td>\n" +" <td>2000000</td>\n" +" </tr>\n" +"</table>";SendEmailUtil.sendEmail("统计数据", html, true, "发送人名字", "收件人邮箱", null, null, Arrays.asList(fileName));// 测试邮件发送2File excel = ExcelUtil.generateExcel("文件名", 表格映射的实体类对象, 表格映射的实体类.class);SendEmailUtil.sendEmail("统计数据", content, false, "发送人名字", "收件人邮箱", null, null, new File[]{excel});// 测试邮件发送3ByteArrayOutputStream bos = ExcelUtil.generateExcel(userInfos, UserInfo.class);SendEmailUtil.sendEmail("统计数据", content, false, "发送人名字", "收件人邮箱", null, null, fileName, new ByteArrayResource(bos.toByteArray()));}
}
注意: 实现 excel 生成,然后发送邮箱 的代码,可以查看这篇文章:生成 excel 并发送邮箱
至此!文章的内容结束!!记得关注收藏,有更多精彩内容!!!
相关文章:
spring boot发送邮箱,java实现邮箱发送(邮件带附件)3中方式【保姆级教程一,代码直接用】
文章目录 Java发送邮箱的方式1. 基于 Javax.mail 实现关于附件上传的方法 2. 基于 org.apache.commons.mail 实现常见报错 3. 基于 spring-boot-starter-mail 实现(推荐) 实际开发时需要实现邮件发送,本文章实现如何从零实现邮件发送。也就是…...
数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall
数据集-目标检测系列- 电话 测数据集 call DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! …...
Zstandard压缩算法
简介 Zstandard(缩写为zstd)是一种开源的无损数据压缩算法,主要设计目标是提供高比率的压缩和快速的解压缩速度。它由Yann Collet开发,并于2015年首次发布。 特点 高比率的压缩(通常比gzip更好)。快速的解压缩速度(通常比gzip更快)。支持流式解压缩。可以选择不同的压…...
npm i 报错
nodejs中 使用npm install命令时报错 npm err! file C: \user\admin\package.json_package.json 里缺少 description 和 repository 两个n字段。-CSDN博客...
【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
目录 1.轮转数组 2.除自身以外数组的乘积 3.矩阵置零 4.螺旋矩阵 5.旋转图像 1.轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 class Solution { public:void rotate(vector<int>& nums, int k) …...
EFCore HasDefaultValueSql
今天小伙伴在代码中遇到了有关 HasDefaultValue 的疑问,这里整理澄清下... 在使用 Entity Framework Core (EFCore) 配置实体时,HasDefaultValue 方法会为数据库列设置一个默认值。该默认值的行为取决于以下条件: 1. 配置 HasDefaultValue 的…...
【数据结构】栈
目录 1.1 什么是栈 1.2 顺序栈 1.2.1 特性 1.3 链式栈 1.3.1 特性 总结: 1.1 什么是栈 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。 特点:栈是先进后出FILO…...
C++初阶—CC++内存管理
第一章:C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(si…...
【机器视觉】OpenCV 图像基本变换
文章目录 介绍机器视觉的核心组成部分机器视觉的关键技术和趋势 4. 图像的基本变换4.1 图像的放大与缩小4.2 图像的翻转4.3 图像的旋转4.4 仿射变换之图像平移4.5 仿射变换之获取变换矩阵4.6 透视变换 介绍 机器视觉(Machine Vision)是一门跨学科的领域…...
【数据库】四、数据库管理与维护
文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库,以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证: 服务器级别…...
徐克版射雕唤醒热血武侠魂,共赴新春侠义之约
2025年大年初一,由徐克执导的古装武侠电影《射雕英雄传:侠之大者》将在影院拉开帷幕,在精彩纷呈的春节档电影中,“大IP”“大导演”“大场面”等标签让这部电影自定档起便备受关注,其精良的制作和传统中国武侠风的设定…...
设计模式(观察者模式)
设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…...
能量函数和能量守恒
在之前的文章1中讨论了与循环坐标相对应的动量守恒定律和动量矩守恒定律,本文将由拉格朗日方程中导出能量函数,进一步讨论能量守恒定律,并给出耗散系统的处理方法,这其中用到的一个关键数学定理是欧拉定理(描述如何将一…...
【pycharm发现找不到python打包工具,且无法下载】
发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …...
使用 Maxwell 计算母线的电动势
三相短路事件的动力学 三相短路事件在电气系统中至关重要,因为三相之间的意外连接会导致电流大幅激增。如果管理不当,这些事件可能会造成损坏,因为它们会对电气元件(尤其是母线)产生极大的力和热效应。 短路时&#x…...
【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!
这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo步骤一&#…...
Ubuntu中批量重命名,rename
你可以使用下面的命令批量重命名这些文件,在文件名中插入 _1: 方式一 使用 mv 命令批量重命名 如果你已经在终端中,且当前目录包含这些文件,可以执行以下命令: mv ai.c ai_1.c mv ai.h ai_1.h mv ao.c ao_1.c mv a…...
LINUX 下 NODE 安装与配置
一、官网地址: (中文网)https://nodejs.cn/ (英文网)https://nodejs.org/en/ 二、下载安装包 2.1、下载地址:下载 | Node.js 中文网 https://nodejs.cn/download/ 2.2、使用 wget 命令下载到linux 服务器…...
Vue3 el-tree-v2渲染慢的问题
一、现象 使用el-tree-v2处理组织架构权限时,整个树的数据在8500条,勾选数据8200条,打开页面需要8~10秒,用户无法接受。 经调试,发现主要卡在树的渲染回显上(勾选数据少时,很快,勾选…...
【redis初阶】浅谈分布式系统
目录 一、常见概念 1.1 基本概念 2.2 评价指标(Metric) 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…...
模式识别与机器学习 | 十一章 概率图模型基础
隐马尔科夫模型(Hidden Markov Model,HMM) HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的(x,y)的联合概率可以表示为 α递归计算——前向算法β递归…...
Linux基本指令(1)
一、ls指令 功能:对于目录,显示这个目录下的目录名以及文件名;对于文件,显示文件名 后面可接命令行选项配合使用,接选项时ls与选项以及选项与选项之间要有一个空格; 这里先学习了两个选项:-l…...
逐“绿”前行 企业综合能源管控低碳转型如何推进?
引言: 在“双碳”战略指引下,中国低碳节能各项工作有序推进,逐步建立起碳达峰碳中和“1N”的政策体系,重点领域、重点行业及各地区的碳达峰实施方案相继出台。能源对于促进经济社会发展、增进人民福祉至关重要。近年来࿰…...
springboot和vue配置https请求
项目场景: 代码发布到线上使用https请求需要配置ssl证书,前后端都需要修改。 问题描述 如图,我们在调用接口时报如下错误,这就是未配置ssl但是用https请求产生的问题。 解决方案: 前端:在vite.config.js文…...
数据库(2)--建表 表操作
1.建表 语法: create table if not exists 表名( 类型名 类型 comment ‘注释内容’, ... )设置字符集编码与排序规则; create table if not exists student( name char(10) comment 姓名, id bigint comment 学号 )character set utf8mb4 collate utf8mb4_0900_a…...
泷羽sec----学会并玩转powershell【基础1-2】
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
2 逻辑符号
在文件和目录的判断或者其他情况中,可以组合使用多个条件。 逻辑与 (&&) 逻辑与运算符 && 用于在多个条件都为真时执行某个操作。 # 判断文件是否存在且可读 if [ -f "$file" ] && [ -r "$file" ]; thenecho "…...
Android基于回调的事件处理
Android 中的回调机制:基于回调的事件处理详解 在 Android 开发中,回调(Callback)是一种常见的事件处理机制,主要用于异步操作和事件通知。与传统的基于监听器的事件处理相比,回调机制更加灵活、通用&…...
跨界融合:人工智能与区块链如何重新定义数据安全?
引言:数据安全的挑战与现状 在信息化驱动的数字化时代,数据已成为企业和个人最重要的资产之一。然而,随着网络技术的逐步优化和数据量的爆发式增长,数据安全问题也愈变突出。 数据安全现状:– 数据泄露驱动相关事件驱…...
qml SpringAnimation详解
1. 概述 SpringAnimation 是 Qt Quick 中用于模拟弹簧效果的动画类。它通过模拟物体在弹簧力作用下的反应,产生一种振荡的动画效果,常用于模拟具有自然回弹、弹性和振动的动态行为。这种动画效果在 UI 中广泛应用,特别是在拖动、拉伸、回弹等…...
Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)
文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…...
Windows service运行Django项目
系统:Windows Service 软件:nssm,nginx 配置Django项目 1、把Django项目的静态文件整理到staticfiles文件夹中 注:settings中的设置 STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, staticfiles/) STATICFILES_DI…...
notebook主目录及pip镜像源修改
目录 一、notebook主目录修改二、pip镜像源修改 一、notebook主目录修改 在使用Jupyter Notebook进行数据分析时,生成的.ipynb文件默认会保存在Jupyter的主目录中。通常情况下,系统会将Jupyter的主目录设置为系统的文档目录,而文档目录通常位…...
Linux(Centos 7.6)命令详解:touch
1.命令作用 如果文件不存在将创建一个空文件;修改文件修改访问时间。 2.命令语法 Usage: touch [OPTION]... FILE... 3.参数详解 Usage: -a,access 只修改访问时间-c,不创建任何文件-d,--dateSTRING 解析STRING并使用它替代…...
ubuntu 下生成 core dump
在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited后仍然无效。 1.ulimit -c unlimited 输出的的含义是核心转储文件的大小限制,单位是blocks,默认是0,表示不生成core dump文件。 2. 重设core_pattern ulimit -c unlimited后,核心转储文件…...
大数据智能选课系统
1.产品介绍 产品名称:大数据智能选课系统 一、产品概述 随着信息技术的快速发展,大数据技术在教育领域的应用越来越广泛。针对当前高校选课过程中的繁琐操作、资源分配不均等问题,我们研发了一款基于大数据智能分析的选课系统。本系统旨在…...
HTTP-响应协议
HTTP的响应过程? 浏览器请求数据--》web服务器过程:请求过程 web服务器将响应数据-》到浏览器:响应过程 响应数据有哪些内容? 1.和请求数据类似。 2. 响应体中存储着web服务器返回给浏览器的响应数据。并且注意响应头和响应体之间…...
[离线数仓] 总结三、Hive数仓DIM层开发
5.9 数仓开发之DIM层 DIM层设计要点: (1)DIM层的设计依据是维度建模理论,该层存储维度模型的维度表。 (2)DIM层的数据存储格式为orc列式存储+snappy压缩。 (3)DIM层表名的命名规范为dim_表名_全量表或者拉链表标识(full/zip)。 -- 数仓开发之DIM层 -- DIM层设计要点:…...
搭建RK3588开发板Qt交叉编译环境
一、开发环境 在虚拟机里安装Ubuntu20.04Qt5.14.2交叉编译器gcc-linaro-7.5.0 二、相关资料下载 在虚拟机里安装Ubuntu20.04 Ubuntu20.04镜像下载(https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/)安装Qt5.14.2 下载安装包和源码 安装包(http…...
【Rust自学】11.3. 自定义错误信息
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…...
ROS核心概念解析:从Node到Master,再到roslaunch的全面指南
Node 在ROS中,最小的进程单元就是节点(node)。一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。 从程序角度来说,node就是一个可执行文件&…...
Autodl安装tensorflow2.10.0记录
首先租用新实例(我选的是3080*2卡),由于基础镜像中没有2.10.0版本,选miniconda3的基础环境 创建虚拟环境:conda create --name xxx python3.8(环境名)激活虚拟环境:conda activate x…...
Linux第一课:c语言 学习记录day06
四、数组 冒泡排序 两两比较,第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮:i 0 n:n个数,比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …...
代码随想录day03
203 链表基础操作 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while (head!NULL&&head->valval){ListNode* temphead;headhead->next;delete temp;}ListNode* curhead;while (cur!NULL&&cur->next!NULL){if(cur-…...
python-leetcode-无重复字符的最长子串
3. 无重复字符的最长子串 - 力扣(LeetCode) class Solution:def lengthOfLongestSubstring(self, s: str) -> int:char_set set()left 0max_length 0for right in range(len(s)):while s[right] in char_set:char_set.remove(s[left])left 1char_…...
30天开发操作系统 第 12 天 -- 定时器 v1.0
前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单,只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器,CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…...
RNN之:LSTM 长短期记忆模型-结构-理论详解(Matlab向)
前言 递归!循环神经网络Recurrent Neural Network 循环神经网络(又称递归神经网络,Recurrent Neural Network,RNN)。是一种用于处理序列数据的神经网络结构,具有记忆功能,能够捕捉序列中的时间…...
vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题
近期对前端的路由卫士有了更多的认识。 何为路由守卫?这可能是一种约定俗成的名称。就是VUE中的自定义函数,用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…...
C++版的飞翔的小鸟
忙了几天,写了个小鸟游戏打发时间。 MINGWOPENGL 作者很懒,具体看readme.txt吧。 好吧,这就是个当网盘用的,没有售后服务的,而且还不怎么会上传文件。。。😂😂 顺便问下,这破玩意上…...
深入详解自然语言处理(NLP)中的语言模型:BERT、GPT及其他预训练模型的原理与应用
【自然语言处理】——深入详解自然语言处理(NLP)中的语言模型:BERT、GPT及其他预训练模型的原理与应用 自然语言处理(NLP)是人工智能(AI)领域中的重要分支,旨在通过计算机处理和分析…...