Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能
Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能
基于SpringBoot3+Vue3前后端分离的Java快速开发框架
项目简介:基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-Plus、Knife4j等构建后端,基于Vue 3、Element-Plus 、TypeScript等构建前端的分离单体权限管理系统。
项目地址:
后端:
gitee: https://gitee.com/harry-tech/harry.git
gitcode: https://gitcode.com/harry-tech/harry.git
前端:
gitee: https://gitee.com/harry-tech/harry-vue.git
gitcode: https://gitcode.com/harry-tech/harry-vue.git
觉着有帮助,给个Star再走呗 ~~~~
公众号搜“Harry技术”,关注我,带你看不一样的人间烟火!

端口修改
之前后端服务的启动端口设置为9000,而现在将其修改为9999。为什么会做出这样的修改呢?这主要是由于在进行minio整合工作的时候,发现后端原本使用的9000端口与minio存储服务的端口产生了冲突。在这种情况下,为了确保整个项目的顺利运行(也方便大家在整合minio做出不必要的麻烦),经过权衡,只能做出调整,让出原本使用的端口,将后端服务的启动端口修改为9999。
- 后端修改
server:port: 9999
- 前端修改

注意:最近总是有小伙伴在运行项目的时候报错,首先,确保本地安装了redis、mysql等,其次查看一下前端
.env.development文件中 Mock 服务是否为false状态,当设置为false时,才会去加载后台接口。# 是否启用 Mock 服务 VITE_MOCK_DEV_SERVER = false
添加存储(minio、aliyun oss)

有关minio的安装,这里就不过多说了,可以参考《Windows下Minio的安装以及基本使用》、《Spring Boot 3 整合 minio 实现文件存储》这两篇文章带你入门。
minio依赖
<minio.version>8.5.10</minio.version><!-- MinIO 对象存储 --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>${minio.version}</version></dependency>
阿里云OSS依赖
<aliyun.oss.version>3.17.4</aliyun.oss.version><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun.oss.version}</version></dependency>
在项目启动前,先选择你需要的存储服务器,比如你想使用minio作为存储,那么你在yml文件中进行相关的配置,将type设置为minio。
# 文件存储配置
oss:# OSS 类型 (目前支持aliyun、minio)type: minio# MinIO 对象存储服务minio:# 服务Endpointendpoint: http://localhost:9090# 访问凭据access-key: eFbF9rSBtgfqiLGDcPDo# 凭据密钥secret-key: Sfgc06T1S6zhzVTzCwIFhr6KUs7zqCwOwFkHHez4# 存储桶名称bucket-name: harry# (可选)自定义域名,如果配置了域名,生成的文件URL是域名格式,未配置则URL则是IP格式custom-domain:# 阿里云OSS对象存储服务aliyun:# 服务Endpointendpoint: oss-cn-beijing.aliyuncs.com# 访问凭据access-key-id: XXX# 凭据密钥access-key-secret: XXX# 存储桶名称bucket-name: honghh
短信sms(aliyun、模拟)
这次更新里,我们接入了阿里云的短信服务。比如你在个人中心换个手机号,就得先拿到一个短信验证码。但在咱们本地测试的时候,老发真实短信也太费钱了。所以啊,我特意加了个模拟发送短信的功能,这样在后台就能直接打印出验证码来,你只需要输入这个验证码就能完成验证了。那么,我们应该如何开启模拟功能呢?很简单,只需要将sms.aliyun.enable设置为false就可以了。
sms:aliyun:enable: false #如果enable为false时 则不发送短信accessKeyId: XXXaccessKeySecret: XXXregionId: cn-shanghaisignName: Harry技术templateCodes:# 注册(预留)register: SMS_xxx# 登录(预留)login: SMS_xxx# 修改密码changePassword: SMS_xxx
@Slf4j
@Component
@ConditionalOnProperty(value = "sms.aliyun.enable", havingValue = "false")
public class FakeSmsStrategy implements SmsStrategy {@Overridepublic SendSmsResponse send(SmsParam smsParam) {log.info("FakeSmsStrategy smsParam:{}", JSONUtil.toJsonStr(smsParam));String str = "{\"bizId\":\"111111111\",\"code\":\"OK\",\"message\":\"并未真实发送\",\"requestId\":\"111111111\"}";return BeanUtil.copyProperties(JSONUtil.parseObj(str), SendSmsResponse.class);}
}
邮件发送
这次更新里,我们还引入了邮件发送,如果你没有基础,你可以去学习这篇文章进行入门《使用Java实现邮件发送功能,邮件发送API JavaMail》,配置也是很简单的。
引入依赖
<!-- 邮件发送 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>
功能实现
/*** @author harry* @公众号 Harry技术*/
public interface MailService {/*** 发送简单文本邮件** @param to 收件人地址* @param subject 邮件主题* @param text 邮件内容*/void sendMail(String to, String subject, String text) ;/*** 发送带附件的邮件** @param to 收件人地址* @param subject 邮件主题* @param text 邮件内容* @param filePath 附件路径*/void sendMailWithAttachment(String to, String subject, String text, String filePath);
完善个人中心

修改文件内容

总结
本次更新主要包含以下内容:
- 端口修改:为避免与Minio存储服务冲突,后端启动端口从9000改为9999。
- 添加存储支持:集成Minio和阿里云OSS对象存储服务,详细配置请参考相关文档。
- 短信服务:接入阿里云短信服务,并增加模拟发送功能,方便本地测试。
- 邮件发送:引入邮件发送功能,支持简单文本邮件和带附件邮件。
- 完善个人中心:优化个人中心页面,提升用户体验。
注意事项:
- 确保本地安装Redis、MySQL等。
- 检查前端
.env.development文件中Mock服务是否设置为false,以加载后台接口。
相关文章:
Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能
Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能 基于SpringBoot3Vue3前后端分离的Java快速开发框架 项目简介:基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-P…...
【python基础——异常BUG】
什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…...
解决Qt打印中文字符出现乱码
在 Windows 平台上,默认的控制台编码可能不是 UTF-8,这可能会导致中文字符的显示问题。 下面是在 Qt 应用程序中设置中文字体,并确保控制台输出为 UTF-8 编码: 1. Qt 应用程序代码 在 Qt 中,我们可以使用 QApplic…...
第三十八章 Spring之假如让你来写MVC——适配器篇
Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...
服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found.
服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found. 1. 故障现象2. 解决思路3. 故障分析4. 案件回溯5. 解决问题 1. 故障现象 有一台服务器业务报无法连接. 尝试用Ping命令发现无法ping通. 通过控制台查看发现有以下报错: error: ..…...
昵称 校验
1. 基本格式校验 1. 长度限制 • 设置最小和最大字符长度:2-20 个字符(常见范围)。 • 避免昵称过短或过长影响显示和识别。 • 示例: • 2 ≤ 长度 ≤ 20:let minLength 2 let maxLength 20 if nickname.count <…...
MATLAB学习笔记目录
MATLAB学习笔记-生成纯音并保存-CSDN博客 MATLAB学习笔记-各种格式之间的转换 - 知乎 MATLAB学习笔记-胞组(cell array)转换为矩阵,cell2mat_matlab如何把元胞数组改为矩阵-CSDN博客MATLAB学习笔记-判断数组、结构体、数值、字符串是否相同…...
基于单片机的语音控制玩具汽车的设计
语音控制小汽车选用了两个单片机、一个语音识别芯片、两个无线收发模块、一个电机驱动模块、两个电机、一个音频解码模块。语音控制端选用了一个语音识别芯片,实现了将声音信号转换成数字信号,再将数据传输给单片机的功能。小车端选用了单片机来控制电机…...
Qt WORD/PDF(五)使用Json一键填充Word表格
关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: 《Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作》 《Qt WORD/PDF&#…...
vue3+ts的几个bug调试
由于编译问题,把几个type检查给关闭了,否则错误太多。 1)第一个检查出的问题,拼写错误数组的length,写成了lengh。 2)数组的对象引用。 torStatus Array(8).fill({ ...defaultStatus }) as TorStatus[]…...
DVWA靶场CSRF漏洞通关教程及源码审计
目录标题 CSRFlow源码审计 medium源码审计 high源码审计 impossible源码审计 CSRF low 先修改密码 看到地址栏 复制在另一个网页打开 成功登录 源码审计 没有任何过滤措施,很危险,并且采用了不安全的md5加密 <?phpif( isset( $_GET[ Change ] )…...
前端开发:HTML常见标签
1.注释标签 注释不会显示在界面上 . 目的是提高代码的可读性 . ctrl / 快捷键可以快速进行注释 / 取消注释 . <!-- 我是注释 --> 2.标题标签 有六个 , 从 h1 - h6. 数字越大 , 则字体越小 <h1> hello </h1> //我们所写的csdn的格式中的标题一…...
【机器学习】主动学习-增加标签的操作方法-样本池采样(Pool-Based Sampling)
Pool-Based Sampling Pool-based sampling 是一种主动学习(Active Learning)方法,与流式选择性采样不同,它假设有一个预先定义的未标注样本池,算法从中选择最有价值的样本进行标注,以提升模型的性能。这种…...
【Rust自学】11.9. 单元测试
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.9.1. 测试的分类 Rust把测试分为两类,一个是单元测试,一个是集成测试。 单元测试比较小也比较专注ÿ…...
深入理解Web存储机制:Cookie、SessionStorage与LocalStorage的区别
文章目录 前言一、Cookie简介二、SessionStorage简介三、LocalStorage简介四、三者之间的比较五、最佳实践建议结语 前言 随着Web应用程序变得越来越复杂,开发者需要更有效的办法来管理客户端数据。Cookie、SessionStorage和LocalStorage是三种常用的Web存储机制&a…...
SpringBoot之BeanDefinitionLoader类源码学习
该类的作用 Spring 框架中用于加载和解析 Bean 定义的工具类。它主要用于从不同的资源(如 XML 文件、注解、Java 配置类等)中读取 Bean 定义,并将这些定义注册到 Spring 的 BeanFactory 或 ApplicationContext 中 基本属性 //指定的资源pri…...
【芯片封测学习专栏 -- 2D | 2.5D | 3D 封装的区别和联系】
请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 Overview线键合(wire-bonding)封装FOWLP2D封装2.5D 封装硅通孔(TSV)硅中介层无TSV的2.5D 3D封装 Overview 我们先要了解一下&…...
从硬件设备看Linux
一、介绍 DM3730通过各种连接方式连接了各种设备,输入输出设备根据不同的类型大体可 以分为电源管理、用户输人、显示输出、图像采集、存储以及无线设备等。我们可以将DM 3730与这些设备的数据接口分为总线和单一的数据接口总线。总线的显著特点是单个总线上可以连…...
open3d+opencv实现矩形框裁剪点云操作(C++)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! open3dopencv实现矩形框裁剪点云操作(Cÿ…...
git 本地操作
一、git.vscode 撤回本地提交 要在Git中撤销本地的最后一次提交,可以使用以下命令: git reset --soft HEAD^ 这将会撤销最后一次的提交,但是保留工作区以及暂存区的内容,方便重新提交。 如果你想完全撤销最后一次提交…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
