第三方API——Spring Boot 集成阿里云短信发送功能
目录
一. 创建阿里云OSS服务并获取密钥,开通短信服务
1.1 注册阿里云服务器
1.2 开通短信服务
1.3 创建对象存储OSS服务
1.4 RAM用户授权短信权限
1.5 新增用户并授权用户短信权限
1.6 获取 AccessKey ID 和 AccessKey Secret
二. 创建项目集成短信发送
2.1 引入依赖
2.2 修改 yml 文件
2.3 创建阿里云短信配置类
2.4 编写 SmsService 短信发送模板业务类
2.5 在业务中调用短信发送的方法
一. 创建阿里云OSS服务并获取密钥,开通短信服务
1.1 注册阿里云服务器
点击链接,直接选择一种登录方式注册登陆即可。
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
1.2 开通短信服务
搜索短信服务,点击跳转然后有免费开通。
如下页面,简单过一遍"快速学习与测试"
走完上面的流程,我们点击"国内消息",然后如右侧页面所示,需要去申请"资质",只要是项目集成都需要申请"资质",资质申请审核完毕;到签名页面添加签名,签名会需要使用到申请的资质,签名创建完毕后,添加我们的短信模板,自行选择即可,也可以自定义模板。
创建完毕之后,一定要把"签名","短信模板Code码"记下来,一会在代码中会用到。
这里以我的为例,签名是"aliyunSM666"。
短信模板Code为"SMS_481015005"
1.3 创建对象存储OSS服务
左上角搜索输入"对象存储",即可找到对象存储OSS服务,点击跳转。
然后来到如下页面,点击 Bucket——>创建Bucket 一步步操作即可。
这里需要记一个点,如果创建的地域是北京,那么下面在配置 yml 文件时,aliyun.regionId 的值就是 cn-beijing;如果是杭州,就是 cn-hangzhou;如果是上海,就是cn-shanghai。
1.4 RAM用户授权短信权限
创建完毕 Bucket 完毕后,点击创建的 Bucket 进入详情页。
然后前往RAM控制台
1.5 新增用户并授权用户短信权限
来到RAM控制台,先新增一名用户,然后点击添加权限
在权限策略中输入短信即可搜索到,直接授权给用户即可。
如果之前已经创建过用户,直接授权即可,也可以像下图所示,到授权页面选择指定用户授权不能
1.6 获取 AccessKey ID 和 AccessKey Secret
点击右上角用户头像
跳转到 AccessKey 详情页,如果没有则新建一个即可,
注意!!!AssessKey Secret 新建后不会再展示,首次新建请保存,如果遗忘只需禁用现有的AssessKey,再新建一个即可。
二. 创建项目集成短信发送
2.1 引入依赖
<!-- 阿里云核心 SDK --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.16</version></dependency><!-- 短信服务 SDK --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>2.1.0</version></dependency><!-- OSS SDK --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency>
2.2 修改 yml 文件
如下图所示,修改项目的 yml 文件,在 yml 文件中添加 aliyun 配置。
assessKeyId 就是上面第一步提到的 AccessKey ID;
accessKeySecret 就是上面提到的 AccessKey Secret;
regionId 激素hi上面提到的 cn-shanghai;根据自己创建的 Bucket 区域而定。
2.3 创建阿里云短信配置类
在下面配置类中,首先获取 yml 配置文件中设置的值,然后编写返回实例的方法并将值赋值给新建实例。
然后,使用短信客户端实例调用 API 接口发送短信,这里写为一个方法,传递手机号,签名,短信模板Code值,然后再其他业务类型,注入此配置类的实例,调用 sendSms 方法,根据业务需求传递不同的短信Code发送不同的短信。
@Configuration
public class AliyunSmsConfig {// 1.阿里云账号的accessKeyId@Value("${aliyun.assessKeyId}")private String accessKeyId;// 2.阿里云账号的accessKeySecret@Value("${aliyun.assessKeySecret}")private String accessKeySecret;// 3.阿里云账号的regionId@Value("${aliyun.regionId}")private String regionId;// 创建并初始化阿里云短信服务的客户端实例@Beanpublic IAcsClient acsClient() {DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);return new DefaultAcsClient(profile);}// 发送短信的核心逻辑,通过 IAcsClient 调用阿里云短信服务 APIpublic SendSmsResponse sendSms(String phoneNumber, String signName, String templateCode, String templateParam) throws Exception {IAcsClient client = acsClient();SendSmsRequest request = new SendSmsRequest();request.setPhoneNumbers(phoneNumber);request.setSignName(signName);request.setTemplateCode(templateCode);request.setTemplateParam(templateParam);return client.getAcsResponse(request);}
}
2.4 编写 SmsService 短信发送模板业务类
在上面,我们已经定义好了发送短信的方法,按道理来说,直接 @Autowired 注入 配置的 Bean 实例就可以了,但是我们观察上方方法,其实还不够简洁,因为 sendSms 方法中,只有 phone 手机号一个参数是需要用户传递的,其他的参数是不需要的。
因此,我们最好再进行一层抽取,将每一种发送短信验证码的方法写成一个 Service 业务类,这样一来其他类当要发送短信的时候,直接调用封装好的 Service 中的方法即可,优化了原本的业务类代码。
如下代码所示,
定义一个发送登录验证码的方法 "sendLoginVerificationCode",还可以定义发送修改密码的验证码 "sendUpdatePasswordVerificationCode",还可以定义付钱的验证码方法 "sendPayMoneyVerificationCode"。
当然啦,这里只是举个例子,实际业务项目中,需要发送的短信验证码肯定也是多种多样的,可以定义多个方法,也可以定义一个通用方法,都是可以的,小编这里就采用这种常用写法啦。
@Service
@Slf4j
public class SmsService {@Autowiredprivate AliyunSmsConfig aliyunSmsConfig;public boolean sendLoginVerificationCode(String phoneNumber, String code) {try {SendSmsResponse response = aliyunSmsConfig.sendSms(phoneNumber,"aliyunSMS666","SMS_481015005","{\"code\":\"" + code + "\"}");log.info(response.getCode());return "OK".equals(response.getCode());} catch (Exception e) {e.printStackTrace();return false;}}public boolean sendUpdatePasswordVerificationCode(String phoneNumber, String code) {try {SendSmsResponse response = aliyunSmsConfig.sendSms(phoneNumber,"aliyunSMS666","SMS_481015005","{\"code\":\"" + code + "\"}");log.info(response.getCode());return "OK".equals(response.getCode());} catch (Exception e) {e.printStackTrace();return false;}}public boolean sendPayMoneyVerificationCode(String phoneNumber, String code) {......}
}
2.5 在业务中调用短信发送的方法
上面的工作都做完之后,我们就可以进入到真正的业务层了,如下代码,其实非常简单,这里小编定义了五个方法,其实这里的 sendCode 方法是可以不用要的,毕竟代码不多,也可以直接将代码写入到 login 登陆方法中。
"selectByUsername" 查询用户方法;
"sendCode"发送短信方法;
"login" 登陆方法;
"createUser" 创建新用户方法;
"generateTokenByUid" 生成用户 token 方法;
逻辑很简单,都有注释,大家一步一步看即可。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 添加类顶部声明private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);@Autowiredprivate UserMapper userMapper;@Autowiredprivate SmsService smsService;@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 方法一: 根据用户名查询用户是否已存在@Overridepublic Boolean selectByUsername(String username) {return !userMapper.selectByUserName(username).isEmpty();}/* 方法二: 发送短信方法 */public Boolean sendCode(String phone) {// 1. 生成6位随机数作为验证码SecureRandom secureRandom = new SecureRandom();String code = String.valueOf(100000 + secureRandom.nextInt(900000));// 2. 将验证码存入RedisstringRedisTemplate.opsForValue().set(phone,String.valueOf(code),5, java.util.concurrent.TimeUnit.MINUTES);// 3. 发送验证码try {logger.info("准备发送验证码,手机号:{},验证码:{}",phone,code);return smsService.sendLoginVerificationCode(phone, code);} catch (Exception e) {logger.error("短信发送失败,手机号:{},错误信息:{}", phone, e.getMessage(), e);return false;}}/* 方法三:用户登录+注册接口综合方法 */public Result<Boolean> login(LoginDto loginDto, HttpServletRequest request, HttpServletResponse response){Result<Boolean> result = new Result<>();// 1. 登陆方式一: 手机号+短信登录if (loginDto.getPhone() != null && loginDto.getCode() != null){List<User> users = userMapper.selectUserByPhone(loginDto.getPhone());if (users.isEmpty()){createUser(loginDto);}String code = stringRedisTemplate.opsForValue().get(loginDto.getPhone());if (code != null && code.equals(loginDto.getCode())){generateTokenByUid(users.get(0).getId(), request, response);result.setCode(200);result.setData(true);result.setMsg("success");}else{result.setCode(999);result.setMsg("验证码错误");result.setData(false);}return result;}// 2. 登陆方式二:手机号+密码登录else if (loginDto.getUsername() != null && loginDto.getPassword() != null){User user = userMapper.selectOne(new QueryWrapper<User>().eq("username", loginDto.getUsername()));if (user != null && MD5Utils.md5HashWithSalt(loginDto.getPassword(), user.getSalt()).equals(user.getPassword())){generateTokenByUid(user.getId(), request, response);result.setCode(200);result.setData(true);result.setMsg("success");}else{result.setCode(999);result.setMsg("密码错误");result.setData(false);}result.setCode(999);result.setMsg("未知错误");result.setData(false);return result;}// 3. 登陆方式三:用户名+密码登录else if (loginDto.getUsername() != null || loginDto.getPassword() != null) {User user = userMapper.selectOne(new QueryWrapper<User>().eq("username", loginDto.getUsername()));if (user != null && MD5Utils.md5HashWithSalt(loginDto.getPassword(), user.getSalt()).equals(user.getPassword())){generateTokenByUid(user.getId(), request, response);result.setCode(200);result.setData(true);result.setMsg("success");}else if (user == null && loginDto.getPassword() != null && loginDto.getPassword2() != null && loginDto.getPassword().equals(loginDto.getPassword2())){User newUser = createUser(loginDto);generateTokenByUid(newUser.getId(), request, response);}else {result.setCode(999);result.setMsg("密码错误");result.setData(false);}}result.setCode(999);result.setMsg("未知错误");result.setData(false);return result;}/* 方法四:创建新用户方法 */public User createUser(LoginDto loginDto){User user = new User();user.setPhone(loginDto.getPhone());user.setStatus(0);if (loginDto.getUsername() != null){user.setUsername(loginDto.getUsername());// 生成随机密码盐值字符串String salt = UUID.randomUUID().toString().replaceAll("-", "");user.setSalt(salt);user.setPassword(MD5Utils.md5HashWithSalt(loginDto.getPassword(), salt));}user.setAvatar("https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg");user.setCreated(LocalDateTime.now());userMapper.insert(user);return user;}/* 方法五:生成 Token 方法*/public void generateTokenByUid(Long uid, HttpServletRequest request, HttpServletResponse response){String token = JwtUtils.generateToken(uid);response.setHeader("Authorization", token);response.setHeader("Access-control-Expose-Headers", "Authorization");}
}
相关文章:
第三方API——Spring Boot 集成阿里云短信发送功能
目录 一. 创建阿里云OSS服务并获取密钥,开通短信服务 1.1 注册阿里云服务器 1.2 开通短信服务 1.3 创建对象存储OSS服务 1.4 RAM用户授权短信权限 1.5 新增用户并授权用户短信权限 1.6 获取 AccessKey ID 和 AccessKey Secret 二. 创建项目集成短信发送 2.1…...
【C++】前向声明(Forward Declaration)
前向声明(Forward Declaration)是在C、C等编程语言中,在使用一个类、结构体或其他类型之前,仅声明其名称而不给出完整定义的一种方式。 作用 减少编译依赖:当一个源文件包含大量头文件时,编译时间会显著增…...
Golang|抽奖相关
文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率,可以想象这样一条 0-1 的数轴,数轴上的每一段相当于一种商品,概率之和为1。 抽奖时,我们会生…...
10.第二阶段x64游戏实战-添加计时器
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:9.第二阶段x64游戏实战-创建项目代码获取人物属性 效果图: 当前游戏…...
fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb
fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb...
打造AI应用基础设施:Milvus向量数据库部署与运维
目录 打造AI应用基础设施:Milvus向量数据库部署与运维1. Milvus介绍1.1 什么是向量数据库?1.2 Milvus主要特点 2. Milvus部署方案对比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案对比表 3. Milvus部署操作命令实战3.1 Milv…...
使用WindSurf生成贪吃蛇小游戏:从零开始的开发之旅
在当今数字化时代,编程已经成为一项必备技能,而创建游戏无疑是学习编程过程中最具趣味性的项目之一。今天,我将向大家介绍如何使用WindSurf这款强大的代码生成工具来快速生成一个经典的贪吃蛇小游戏。从下载软件到运行游戏,我们将…...
论文学习:《EVlncRNA-net:一种双通道深度学习方法,用于对实验验证的lncRNA进行准确预测》
原文标题:EVlncRNA-net: A dual-channel deep learning approach for accurate prediction of experimentally validated lncRNAs 原文链接:https://www.sciencedirect.com/science/article/pii/S0141813025020896 长链非编码RNA( long non-coding RNAs&…...
LLM Post-Training
1. LLM的后训练分类 Fine-tuning Reinforcement Learning Test-time Scaling 方法 优点 缺点 Fine-tuning 任务适应性:能够针对特定任务或领域进行优化,提升模型在该任务上的性能。 数据驱动优化:利用标注数据直接调整模型参数&#x…...
【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现
人工智能(AI)智能体正迅速成为企业提高生产力、自动化工作流程和增强运营能力的关键工具。从处理日常重复性任务到协助复杂的决策,智能体的潜力巨大。然而,当这些智能体来自不同的供应商、使用不同的框架或被限制在孤立的数据系统…...
FileWriter 详细解析与记忆方法
FileWriter 详细解析与记忆方法 一、FileWriter 核心概念 FileWriter 是 Java 中用于向文件写入字符数据的类,继承自 OutputStreamWriter,属于字符流体系。 1. 核心特点 特性说明继承关系Writer → OutputStreamWriter → FileWriter数据单位字符&am…...
Java笔记5——面向对象(下)
目录 一、抽象类和接口 1-1、抽象类(包含抽象方法的类) 1-2、接口 编辑编辑 二、多态 编辑 1. 自动类型转换(向上转型) 示例: 注意: 2. 强制类型转换(向下转型) 示…...
c++------模板进阶
目录 一、模板 1.1 非类型模板参数 二、模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 全特化 偏特化 (1)部分特化 (2)参数更进一步的限制 三、模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决…...
《轨道力学讲义》——第四讲:轨道计算与预测
第四讲:轨道计算与预测 引言 在轨道力学的研究中,轨道计算与预测是将理论付诸实践的关键环节。当我们掌握了轨道运动的基本规律和数学描述后,下一步便是要能够准确地计算航天器在任意时刻的位置和速度,并对其未来的运动轨迹进行…...
鸿蒙开发-页面跳转
1.路由使用 //1.引入路由 import router from ohos.router//2.使用跳转router.pushUrl({url: "pages/Show"})2.页面跳转 import { router } from kit.ArkUI;Entry Component struct LoginPage {State message: string 登陆页;build() {Row() {Column() {Text(this…...
数据大屏只能撑撑场面?
很多人对数据大屏的看法就是“没有用”、“花架子”,实际上,它的作用绝不止于此。 业财猫全新升级的经营驾舱模块,以精准的行业洞察与场景化设计,重新定义了这一工具的价值。 作为专为财税代账行业打造的一站式运营管理平台&…...
第十九讲 | XGBoost 与集成学习:精准高效的地学建模新范式
🟨 一、为什么要学习集成学习? 集成学习(Ensemble Learning) 是一种将多个弱学习器(如决策树)组合成一个强学习器的策略。它在地理学、生态学、遥感分类等领域表现尤为突出。 📌 应用优势&#…...
大数据面试问答-批处理性能优化
1. 数据存储角度 1.1 存储优化 列式存储格式:使用Parquet/ORC代替CSV/JSON,减少I/O并提升压缩率。 df.write.parquet("hdfs://path/output.parquet")列式存储减少I/O的核心机制: 列裁剪(Column Pruning) …...
关于 软件开发模型 的分类、核心特点及详细对比分析,涵盖传统模型、迭代模型、敏捷模型等主流类型
以下是关于 软件开发模型 的分类、核心特点及详细对比分析,涵盖传统模型、迭代模型、敏捷模型等主流类型: 一、软件开发模型分类及核心特点 1. 瀑布模型(Waterfall Model) 核心特点: 线性阶段划分:需求分…...
【STL】set
在 C C C S T L STL STL 标准库中, s e t set set 是一个关联式容器,表示一个集合,用于存储唯一元素的容器。 s e t set set 中的元素会自动按照一定的顺序排序(默认情况下是升序)。这意味着在 s e t set set 中不能…...
信奥还能考吗?未来三年科技特长生政策变化
近年来,科技特长生已成为名校录取的“黄金敲门砖”。 从CSP-J/S到NOI,编程竞赛成绩直接关联升学优势。 未来三年,政策将如何调整?家长该如何提前布局? 一、科技特长生政策趋势:2025-2027关键变化 1. 竞…...
几何建模基础-拓扑命名实现及优化
1.背景介绍 1.1 什么是拓扑? 拓扑是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的一个学科。它只考虑物体间的位置关系而不考虑它们的形状和大小。 Body对象的拓扑可以理解为面(Face)与边(Edge)、边…...
浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek音乐创作最强玩法来了!
浙江大学DeepSeek系列专题线上公开课第二季第5期即将在今晚进行直播! 其中,今晚8点10分左右,浙大AI大佬张克俊教授将带来硬核的deepseek公开课讲座。 讲座 主题: 人工智能与音乐创作 主讲人: 张克俊 教授 人工智能作…...
electron-builder参数详解
electron-builder 是一个用于打包和构建 Electron 应用的工具,支持 macOS、Windows 和 Linux 平台,并提供了丰富的参数配置选项。 1、安装: npm install electron-builder --save-dev2、参数详解 命令: electron-builder build…...
PVE+CEPH+HA部署搭建测试
一、基本概念介绍 Proxmox VE Proxmox Virtual Environment (Proxmox VE) 是一款开源的虚拟化管理平台,基于 Debian Linux 开发,支持虚拟机和容器的混合部署。它提供基于 Web 的集中管理界面,简化了计算、存储和网络资源的配置与监控。P…...
Android Studio 日志系统详解
文章目录 一、Android 日志系统基础1. Log 类2. 日志级别 二、Android Studio 中的 Logcat1. 打开 Logcat2. Logcat 界面组成3. 常用 Logcat 命令 三、高级日志技巧1. 自定义日志工具类2. 打印方法调用栈3. 打印长日志4. JSON 和 XML 格式化输出 四、Logcat 高级功能1. 自定义日…...
【LLM】A2A 与 MCP:剖析 AI Agent 互联时代的两种关键协议
随着人工智能技术的飞速发展,AI Agent(智能体)正从理论走向实践,有望成为提升生产力的关键。然而,正如历史上任何新兴技术领域一样,标准的缺失导致了“筒仓效应”——不同来源、不同框架构建的 Agent 难以有…...
解析大尺寸液晶屏视觉检测,装配错位如何避免?
在3C电子产品种类飞速发展的今天,大尺寸液晶屏已成为市场主流,消费刚需。消费者对手机屏幕的视觉体验要求不断攀升,屏占比的提升成为各大手机厂商竞争的焦点。然而,大尺寸液晶屏在生产过程中面临着诸多检测难题,严重影…...
巴法云平台-TCP设备云-微信小程序实时接收显示数据-原理
微信小程序通过WebSocket或HTTP长轮询连接平台(而非直接使用TCP)!!! 物联网平台对协议层的一种封装设计——将底层通信协议(如TCP)与应用层业务逻辑(如主题路由)解耦&am…...
ElementNotInteractableException原因及解决办法
在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…...
信息系统项目管理师-工具名词解释(上)
本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 数据收集 头脑风暴 在短时间内获得大量创意,适用于团队环境,需要引导者…...
CSI-external-provisioner
main() 这段Go代码是一个CSI(容器存储接口)Provisioner(供应器)的实现,用于在Kubernetes集群中动态提供持久卷。代码涉及多个组件和步骤,下面是对关键部分的解释: 初始化和配置 命令行标志和…...
OpenAI为抢跑AI,安全底线成牺牲品?
几年前,如果你问任何一个AI从业者,安全测试需要多长时间,他们可能会淡定地告诉你:“至少几个月吧,毕竟这玩意儿可能改变世界,也可能毁了它。”而现在,OpenAI用实际行动给出了一个新答案——几天…...
单片机任意普通IO引脚使用定时器扩展外部中断的巧妙方法
在嵌入式系统中,将任意一个IO端口配置为外部中断源是一种常见的需求,尤其是在硬件资源有限的情况下。通过定时器扩展外部中断的方法,可以在不依赖专用中断引脚的情况下,实现对外部信号的实时响应。以下是一种基于定时器扩展外部中…...
arcgis几何与游标(1)
本节我们对几何进行展开学习 ArcPy 的几何对象 在 ArcPy 中,几何对象是表示地理空间数据的核心。它包括点(Point)、多点(Multipoint)、线(Polyline)和面(Polygon)等类型…...
安全密码处理实践
1. 引言 在现代应用程序中,密码存储和验证的安全性 直接关系到用户数据的保护。密码泄露事件频繁发生,通常是由于不安全的存储方式 或 弱加密处理 导致的。为了提高密码的安全性,开发者需要遵循一系列安全密码处理 的最佳实践。 本篇文章将详细介绍如何在应用程序中安全地…...
can‘t set boot order in virtualbox
Boot order setting is ignored if UEFI is enabled https://forums.virtualbox.org/viewtopic.php?t99121 如果勾选EFI boot order就是灰色的 传统BIOS就是可选的 然后选中任意介质,通过右边的上下箭头调节顺序,最上面的应该是优先级最高的 然后就…...
电池分选机详细介绍
在当今这个科技飞速发展的时代,电池作为能源存储的重要载体,其性能的一致性和稳定性对于各类电子设备和电动汽车等应用至关重要。而电池分选机,作为电池生产过程中的关键环节,正扮演着越来越重要的角色。本文将带您深入了解电池分…...
深入理解浏览器的 Cookie:全面解析与实践指南
在现代 Web 开发中,Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好,还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富,Cookie 的使用和管理也日趋复杂,如何在保障…...
浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek人文艺术之美专场来啦!
浙江大学DeepSeek系列专题线上公开课第二季第五期即将重磅上线! 其中,今晚7点半,浙大AI大神陈为教授将带来硬核的deepseek公开课讲座。 讲座 主题: DeepSeek时代,让AI更懂中国文化的美与善 主讲人: 陈为 …...
5分钟学会接口自动化测试框架
今天,我们来聊聊接口自动化测试。 接口自动化测试是什么?如何开始?接口自动化测试框架如何搭建? 自动化测试 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发…...
Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程
在前面的文章中Flink 编程基础:Scala 版 DataStream API 入门-CSDN博客,我们已经介绍了 Flink 的 Datastream API 编程模型、窗口划分以及时间语义(处理时间、事件时间等)。本篇文章将深入讲解窗口计算的进阶内容,包括…...
【从零实现高并发内存池】内存池整体框架设计 及 thread cache实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
#MES系统中的一些相关的名词
📌MES系统 部分 术语表 缩写英文全称中文名称详细解释MESManufacturing Execution System制造执行系统用于连接计划系统与生产现场,实时管理和控制整个生产过程,覆盖物料、人员、设备、质量、指令等。ERPEnterprise Resource Planning企业资…...
《灵活的接口设计:如何支持多种后端数据存取实现》
《灵活的接口设计:如何支持多种后端数据存取实现》 一、引言:从单一适配到多样需求 在现代软件开发中,系统通常需要与不同的数据存储后端进行交互,例如关系型数据库(MySQL、PostgreSQL)、NoSQL 数据库(MongoDB、Redis)或文件存储(JSON、CSV)。为了增强系统的可扩展性…...
Spark-SQL核心编程(一)
一、Spark-SQL 基础概念 1.定义与起源:Spark SQL 是 Spark 用于结构化数据处理的模块,前身是 Shark。Shark 基于 Hive 开发,提升了 SQL-on-Hadoop 的性能,但因对 Hive 依赖过多限制了 Spark 发展,后被 SparkSQL 取代&…...
Qt:解决MSVC编译器下qDebug输出中文乱码的问题
问题描述: 使用msvc编译器,通过qDebug输出打印信息为乱码(显示问号或者乱码) 百度到以下方案,但是没有效果 最终解决: 在.pro文件中添加如下,重新构建运行即可显示中文内容 msvc:QMAKE_CXXFLAGS -exec…...
Go:接口
接口既约定 Go 语言中接口是抽象类型 ,与具体类型不同 ,不暴露数据布局、内部结构及基本操作 ,仅提供一些方法 ,拿到接口类型的值 ,只能知道它能做什么 ,即提供了哪些方法 。 func Fprintf(w io.Writer, …...
js | 网页上的 json 数据怎么保存到本地表格中?
1.思路 json 转为 csv 保存到本地或者:json 转为 html 显示到网页中,然后复制到excel中。 (2) 数据 wjl{"code":1,"data":[{"chrmiRNA":"chr1","0":"chr1","startmiRNA":&quo…...
智能Todo协作系统开发日志(二):架构优化与安全增强
📅 2025年4月14日 | 作者:Aphelios380 🌟 今日优化目标 在原Todo单机版基础上进行三大核心升级: 组件化架构改造 - 提升代码可维护性 本地数据加密存储 - 增强隐私安全性 无障碍访问支持 - 践行W3C标准 一、组件化架构改造 …...