苍穹外卖笔记-18-修改密码、bug记录
文章目录
- 1 修改密码
- 1.1 需求分析和设计
- 1.2 代码实现
- 1.2.1 admin/EmployeeController
- 1.2.2 EmployeeService
- 1.2.3 EmployeeServiceImpl
- 1.3 功能测试
- 2 bug记录
1 修改密码
完结的时候发现还有一个接口未实现。这里补充

1.1 需求分析和设计
产品原型:

业务规则:
身份验证:在修改密码之前,需要验证用户的身份。这通常涉及到输入当前的密码,以证明用户有权限修改密码。
密码复杂度要求:新密码应该满足一定的复杂度要求,比如长度、大小写字母、数字和特殊字符的组合等。
密码加密存储:密码在存储时应该进行加密处理,比如使用哈希加盐的方式,以防止密码泄露后被轻易破解。
异常处理:在密码修改过程中,应该有适当的异常处理机制,比如密码不匹配时的友好提示,或者密码修改失败时的错误信息。
接口设计:

package com.sky.dto;import lombok.Data;import java.io.Serializable;@Data
public class PasswordEditDTO implements Serializable {//员工idprivate Long empId;//旧密码private String oldPassword;//新密码private String newPassword;}
1.2 代码实现
1.2.1 admin/EmployeeController
/*** 修改密码** @param passwordEditDTO* @return* @throws Exception*/@PutMapping("/editPassword")@ApiOperation("修改密码")public Result editPassword(@RequestBody PasswordEditDTO passwordEditDTO){log.info("修改密码:{}", passwordEditDTO);employeeService.editPassword(passwordEditDTO);return Result.success();}
1.2.2 EmployeeService
/*** 更新员工信息* @param employeeDTO*/void update(EmployeeDTO employeeDTO);
}
1.2.3 EmployeeServiceImpl
/*** 编辑员工密码** @param passwordEditDTO*/@Overridepublic void editPassword(PasswordEditDTO passwordEditDTO) {String oldPassword = passwordEditDTO.getOldPassword();String newPassword = passwordEditDTO.getNewPassword();//获取员工idLong empId = BaseContext.getCurrentId();//1.根据id查询员工信息Employee employee = employeeMapper.getById(empId);//2. 密码比对String encryptedOldPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes());if (!encryptedOldPassword.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}//3. 更新密码String encryptedNewPassword = DigestUtils.md5DigestAsHex(newPassword.getBytes());employee.setPassword(encryptedNewPassword);employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(empId);employeeMapper.update(employee);}
1.3 功能测试

2 bug记录
o.s.web.servlet.PageNotFound : No mapping for PUT /user/order/cancel/8
检查Controller中路径是否出错,函数是否放错位(写在其他XxxxController)
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Optional int parameter ‘pageNum’ is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.] with root cause
java.lang.IllegalStateException: Optional int parameter ‘pageNum’ is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
存在可选int参数’pageNum’,但由于被声明为基本类型,因此无法转换为空值。考虑将其声明为对应基本类型的对象包装器
//Controller中命名page
public Result<PageResult>page(int page,intpageSize,Integerstatus){
PageResultpageResult=orderService.pageQueryUser(page,pageSize,status);
returnResult.success(pageResult);
//Service中命名pageNum
Page Result pageQueryUser(int pageNum,intpageSize,Integerstatus);
ERROR 29228 — [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 无效的密钥格式] with root cause
java.lang.RuntimeException: 无效的密钥格式
微信小程序没有密钥
ERROR 8716 — [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘user_id’ in ‘class com.sky.entity.Orders’] with root cause
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost/:6379] with root cause
启动Redis
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.EOFException
这个错误表明在尝试对 Redis 中的数据进行反序列化时出现了问题。根据错误信息,这可能是由于尝试反序列化不完整的字节数组导致的。
在处理这个问题时,有几种可能的解决方案:
- 检查数据完整性: 确保在进行序列化和存储数据时,数据没有发生截断或丢失。这可能需要检查数据的存储和读取过程,以确保整个字节数组都被正确地写入和读取。
- 检查序列化器配置: 确保在 RedisTemplate 或其他涉及到序列化的地方,所使用的序列化器是正确配置的。你需要保证数据的序列化和反序列化使用的是相同的序列化器。
- 检查数据格式: 确保反序列化操作的目标对象与实际存储的数据格式相匹配。如果你对存储的数据进行了更改,可能需要更新代码来处理新的数据结构。
- 排查数据内容: 如果可能的话,检查实际存储在 Redis 中的数据内容。有时候问题可能源于存储了不符合预期格式的数据。
最后,请确保在处理 Redis 数据时,采用了健壮的异常处理机制,以便能够更好地理解和排查潜在的数据问题。
希望这些信息能够帮助你解决问题。如果你需要更多帮助,欢迎随时与我联系。
com.sky.config
//设置rediskey的序列化器
redisTemplate.setKeySerializer(newStringRedisSerializer());
//设置redisvalue的序列化器
redisTemplate.setValueSerializer(newStringRedisSerializer());
//设置redishash的序列化器
redisTemplate.setHashValueSerializer(newStringRedisSerializer());
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String] with root cause{ “timestamp”: 1717330318869, “status”: 500, “error”: “Internal Server Error”, “path”: “/admin/shop/1” }
java.lang.Integer cannot be cast to java.lang.String
Fitten Code
根据你提供的错误信息,看起来在处理请求 “/admin/shop/1” 时发生了内部服务器错误。具体的错误根本原因是 “java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String”。
这个错误通常表示代码试图将一个整数类型的数据转换为字符串类型时出现了类型转换错误。根据报错的上下文,可能是在将整数类型的数据用作字符串处理时出现了问题。
可能的问题点:
- 路径参数处理错误: 如果你的代码中使用了路径参数来表示商品或店铺的标识,而在处理路径参数时出现了类型转换错误,就会抛出这个异常。需要检查对路径参数的解析和使用是否正确。
- 数据操作错误: 如果你从数据源(比如数据库、缓存等)中取出了某个整数类型的值,并且尝试将其作为字符串使用,也会出现这个错误。需要确保在操作数据时进行了正确的类型转换。
要解决这个问题,你需要根据具体的业务逻辑和异常发生的上下文来检查代码,并确保数据类型的正确使用。

不写范型就行

APPLICATION FAILED TO START
Description:
Failed to bind properties under ‘sky.wechat.appid’ to java.lang.String:
Property: sky.wechat.appid
Value: "${sky.wechat.appid}"
Origin: class path resource [application.yml] - 58:12
Reason: java.lang.IllegalArgumentException: Circular placeholder reference 'sky.wechat.appid' in property definitions
Action:
Update your application’s configuration
Process finished with exit code 1
!!! 这个问题就看看application的配置!!!
2024-06-11 19:26:06.852 ERROR 32748 — [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘user_id’ in ‘class com.sky.entity.ShoppingCart’] with root cause
这个异常表明在处理请求时发生了错误,具体而言是因为MyBatis无法找到名为 ‘user_id’ 的属性的 getter 方法。可能有几个原因会导致这种情况:
3. 属性名错误:确保你的实体类 com.sky.entity.ShoppingCart 中存在名为 ‘user_id’ 的属性,并且有对应的 getter 方法。
4. 配置错误:检查你的 MyBatis 映射文件,以确保正确地映射了数据库列和实体类的属性,包括 ‘user_id’。
5. 数据库查询错误:如果你在执行 SQL 查询时指定了 ‘user_id’,但实际上实体类中并不存在该属性,就会导致这个问题。
为了排除这个问题,可以按照以下步骤进行排查:
• 确保实体类 com.sky.entity.ShoppingCart 中存在名为 ‘user_id’ 的属性,并且有对应的 getter 方法。
• 检查 MyBatis 映射文件(通常是 XML 文件)中,与 ‘user_id’ 相关的属性映射是否正确。
• 跟踪具体的请求处理流程,确认是在哪个环节出现了这个异常,有助于定位问题所在。
一旦找到了问题所在,针对性地进行修复即可。如果以上方法仍无法解决问题,可能需要进一步检查程序的逻辑和配置,或者提供更多的代码和细节信息进行分析。
D:\Code\Course\java-learning\sky-take-out\sky-server\src\main\java\com\sky\service\impl\AddressBookServiceImpl.java:5:22 java: 找不到符号 符号: 类 AddressBookMapper 位置: 程序包 com.sky.mapper D:\Code\Course\java-learning\sky-take-out\sky-server\src\main\java\com\sky\service\impl\AddressBookServiceImpl.java:6:23 java: 找不到符号 符号: 类 AddressBookService 位置: 程序包 com.sky.service D:\Code\Course\java-learning\sky-take-out\sky-server\src\main\java\com\sky\service\impl\AddressBookServiceImpl.java:15:48 java: 找不到符号 符号: 类 AddressBookService D:\Code\Course\java-learning\sky-take-out\sky-server\src\main\java\com\sky\service\impl\AddressBookServiceImpl.java:17:13 java: 找不到符号 符号: 类 AddressBookMapper 位置: 类 com.sky.service.impl.AddressBookServiceImpl
Fitten Code
这些错误表明编译器无法找到名为 AddressBookMapper 和 AddressBookService 的类和接口。这通常是因为编译器无法在指定的位置找到所需的类或接口。
在大多数情况下,这种错误是由以下原因引起的:
6. 包名错误:确保 AddressBookMapper 和 AddressBookService 类在正确的包中。在你的示例中,它们应该分别位于 com.sky.mapper 和 com.sky.service 包下。
7. 缺失依赖:检查你的项目依赖,确保相关的包或模块已经正确导入并设置为依赖项。
8. 编译路径错误:有时编译器无法在指定的路径中找到所需的类或接口。确保你的编译路径配置正确,并包含了这些类和接口所在的位置。
9. 类或接口未定义:最显而易见的情况是这些类和接口可能确实未定义。在这种情况下,你需要创建它们或者从其他地方获取它们的定义。
下面是一个可能的排查步骤:
• 确保 AddressBookMapper 和 AddressBookService 类分别位于 com.sky.mapper 和 com.sky.service 包中,并且包名和类名的大小写拼写与代码中的引用一致。
• 检查项目的依赖配置,确保相关的包或模块已经正确导入并设置为依赖项。
• 确保编译路径配置正确,包含了这些类和接口所在的位置。
• 如果以上步骤都正确无误,但问题依然存在,可能需要检查是否缺少了必要的依赖项,或者类和接口未被正确定义。
通过排查这些可能引起问题的原因,你应该能够定位并解决编译错误。
导入新功能代码,重新打开Maven在sky_take_out使用compile一下
2024-06-12 15:40:55.795 ERROR 15856 — [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Field orderService in com.sky.controller.user.OrderController required a bean of type ‘com.sky.service.OrderService’ that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type ‘com.sky.service.OrderService’ in your configuration. Disconnected from the target VM, address: ‘127.0.0.1:57369’, transport: ‘socket’ Process finished with exit code 1
Fitten Code
这个错误信息表明 Spring 在启动应用程序时无法找到类型为 com.sky.service.OrderService 的 bean。通常情况下,这种错误是由缺少 bean 的定义或者扫描路径错误引起的。
要解决这个问题,你可以尝试以下几个步骤:
- 确认 Service 类被正确扫描和组件化: 确保 com.sky.service.OrderService 类上使用了 @Service 注解或者被正确标记为组件。在 Spring Boot 应用中,通常使用了 @SpringBootApplication 的类所在的包及其子包将会被自动扫描,你需要确保 com.sky.service.OrderService 类在扫描路径下。
- 查看是否存在正确的 bean 配置: 确保在配置类(如使用 @Configuration 注解的类)或者 XML 配置文件中存在了 com.sky.service.OrderService 类的 bean 配置。
- 排查依赖注入位置: 如果 @Autowired 注解标记的地方并非预期的位置,可能会出现这种错误。请检查 orderService 字段所在的类,确认它是否应该被注入为一个 bean。
- 查看启动日志: 在启动日志中查看是否有针对 bean 扫描和自动配置相关的日志,有时会通过日志信息找到问题所在。
- 手动创建 bean: 如果以上步骤都不能解决问题,你可以尝试手动在配置类中创建 com.sky.service.OrderService 的 bean。
基于以上步骤,你可以逐一排查是否缺少了对 com.sky.service.OrderService 的正确定义。一旦找到了问题所在,并修复了配置,你的应用程序应该可以成功启动了。
相关文章:
苍穹外卖笔记-18-修改密码、bug记录
文章目录 1 修改密码1.1 需求分析和设计1.2 代码实现1.2.1 admin/EmployeeController1.2.2 EmployeeService1.2.3 EmployeeServiceImpl 1.3 功能测试 2 bug记录 1 修改密码 完结的时候发现还有一个接口未实现。这里补充 1.1 需求分析和设计 产品原型: 业务规则&am…...
java如何截取字符串
如果想在一个字符串中截取一段字符,形成新的字符,那么在java中途需要用到substring语句 substring的语法格式是 str.substring(beginindex,endindex) 其中str是字符串 beginindex是起始索引,endindex是结束索引 截取的字符串包含起始索引…...
虚拟淘宝-Virtual-Taobao论文解读(AAAI2019)
目录 1 论文简介 2 文章的主要贡献 3 文章技术的简要说明 4 技术的详细说明 4.1 GAN-SD:生成客户特征 4.2 MAIL:生成交互过程 4.3 ANC:动规范约束 5 实验设定及结果 6 结论 7 参考 1 论文简介 南京大学LAMDA团队的侍竞成、俞扬等…...
低代码组件扩展方案在复杂业务场景下的设计与实践
组件是爱速搭的前端页面可视化模块的核心能力之一,它将前端研发人员从无休止的页面样式微调和分辨率兼容工作中解放了出来。 目前,爱速搭通过内置的上百种功能组件(120),基本可以覆盖大部分中后台页面的可视化设计场景…...
震撼科技界的GPT-4o发布首日即遭“越狱破防”
前言 本文主要解读分析OpenAI最新推出的大型模型GPT-4o可能存在的越狱风险。 5 月14 日凌晨的科技圈再一次被OpenAI轰动,其发布的最新大模型GPT-4o,能力横跨语音、文本和视觉,这一成果无疑再次巩固了OpenAI在人工智能领域的领先地位。 然而…...
保护密码安全,探讨密码加盐及其在Go语言中的实现
介绍 在当今数字化时代,个人隐私和数据安全成为了人们关注的焦点之一。随着网络犯罪的不断增加,用户的密码安全性变得尤为重要。密码加盐作为一种常见的安全措施,被广泛应用于密码存储和认证系统中。本文将深入探讨密码加盐的概念、重要性以…...
Sqoop学习详细介绍!!
一、Sqoop介绍 Sqoop是一款开源的工具,主要用于在Hadoop(HDFS/Hive/HBase)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的H…...
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 生成哈夫曼树(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 生成哈夫曼树(100分) 🌍 评测功能需要订阅专栏后私信联系清…...
ctfshow web 单身杯
web签到 <?phperror_reporting(0); highlight_file(__FILE__);$file $_POST[file];if(isset($file)){if(strrev($file)$file){ //翻转函数include $file;}}要进行反转并且包含文件用data协议 自己写不好写可以用函数帮你翻转 <?php $adata:text/plain,<?eval(…...
天锐绿盾加密软件,它的适用范围是什么?
天锐绿盾数据防泄密软件的适用范围广泛,主要可以归纳为以下几点: 行业适用性: 适用于各个行业,包括但不限于制造业、设计行业、软件开发、金融服务等,特别是对数据安全性要求较高的行业。企业规模与类型: 适…...
mysql面试题 Day2
1 长文本如何存储? 可以使用Text存储 TINYTEXT(255长度) TEXT(65535) MEDIUMTEXT(int最大值16M) LONGTEXT(long最大值4G) 2 大段文本存储如何设计表结构? 分表存储 分表后多段存储 3 大段文本查找时如何建立索引࿱…...
Excel加密怎么设置?这5个方法不容错过!(2024总结)
Excel加密怎么设置?如何不让别人未经允许查看我的excel文件?如果您也有这些疑问,那么千万不要错过本篇文章了。今天小编将向大家分享excel加密的5个简单方法,保证任何人都可以轻松掌握!毫无疑问的是,为Exce…...
2024年下一个风口是什么?萤领优选 轻资产创业项目全国诚招合伙人
2024年,全球经济与科技发展的步伐不断加快,各行各业都在探寻新的增长点与风口。在这样的时代背景下,萤领优选作为一个轻资产创业项目,正以其独特的商业模式和前瞻的市场洞察力,吸引着众多创业者的目光。(领取ÿ…...
Redis 网络模型
一、用户空间和内核空间 1.1 linux 简介 服务器大多采用 Linux 系统,这里我们以 Linux 为例来讲解,下面有两个不同的 linux 发行版,分别位 ubuntu 和 centos,其实发行版就是在 Linux 系统上包了一层壳。 任何 Linux 发行版&#…...
【设计模式之组合模式 -- C++】
组合模式 – 树状结构,递归遍历 组合模式(Composite Pattern)是一种结构型设计模式,它可以让你将对象组合成树形结构,并且能像使用独立对象一样使用它们。这种模式定义了包含人和组的类,每个类都有可以在树形结构中显示的方法。这…...
C# 通过Win32API设置客户端系统时间
在日常工作中,有时可能会需要获取或修改客户端电脑的系统时间,比如软件设置了Licence有效期,预计2024-06-01 00:00:00到期,如果客户手动修改了客户端电脑时间,往前调整了一年,则软件就可以继续使用一年&…...
VirtualHere 允许通过网络远程使用 USB 设备,就像本地连接一样!
传统上,USB 设备需要直接插入计算机才能使用。有了 VirtualHere,就不再需要这样做,网络本身就变成了传输 USB 信号的电缆(也称为 USB over IP、USB/IP、USB over WiFi、USB over Ethernet、USB 设备服务器)。 此 USB …...
【Kubernetes】k8s 自动伸缩机制—— HPA 部署
一、在K8s中扩缩容分为两种: ●Node层面:对K8s物理节点扩容和缩容,根据业务规模实现物理节点自动扩缩容 ●Pod层面:我们一般会使用Deployment中的Replicas参数,设置多个副本集来保证服务的高可用,但是这是…...
MT1415 大小相同
题目 给定一个由N(<10)个正整数组成的数组A,生成一些最小元素和最大元素相同的子数组数(可以仅包含1个元素),统计这些子数组的数量并输出。 注:最大元素和最小元素相同就是数组中的元素全部为同一个值。如数组&am…...
使用python库moviepy完成视频剪辑
1.关于moviepy和原理 moviepy事github上面的一个开源项目,地址是:GitHub - Zulko/moviepy: Video editing with Python 官方文档地址: User Guide — MoviePy 1.0.2 documentation 中文版文档可参考: MoviePy中文手册 — mov…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

