Spring Boot AOP实现动态数据脱敏
依赖&配置
<!-- Spring Boot AOP起步依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
/*** @Author: 说淑人* @Date: 2025/1/18 23:03* @Description: 切面配置*/
@Configuration
// ---- 该注解用于开启AOP功能。
@EnableAspectJAutoProxy
public class AspectConfig {
}
数据脱敏
注解&修饰
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @Author: 说淑人* @Date: 2023-11-24* @Description: 授权业务脱敏AO类*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface OauthBizMask {// ---- 该注解用来修饰在控制器方法上以标注该方法的返回数据需要数据脱敏,其核心作用是// 为AOP提供切入点。// ---- 注意!根据切入方式的不同,该注解并不是必须的,下文在切入代码中提供了无需当前// 注解的切入方式。但我们并不推荐那么做,因为那会导致所有的接口都必须经历数据脱敏过程,// 即使我们并不想执行该操作。}
/*** 获取宇宙** @param customerId 客户ID* @return 结果BO(客户业务宇宙VO回应)*/@OauthBizMask@ApiOperation("获取宇宙")@GetMapping(value = "get/universe")public ResultBox<CustomerBizUniverseResponse> getUniverse(@ApiParam(value = "客户ID", required = true) @RequestParam(value = "customerId") Long customerId) {return ResultBox.result(customerBizDispatcher.getUniverse(customerId));}/*** 查询宇宙集** @param customerBizQueryRequest 客户业务查询VO请求* @return 结果BO(查询BO(客户业务宇宙VO回应集))*/@OauthBizMask@ApiOperation("查询宇宙集")@GetMapping(value = "query/universes")public ResultBox<QueryBox<CustomerBizUniverseResponse>> queryUniverses(@Valid @ModelAttribute CustomerBizQueryRequest customerBizQueryRequest) {return ResultBox.result(customerBizDispatcher.queryUniverses(customerBizQueryRequest));}
import com.ssr.world.biz.manage.model.eo.oauth.OauthBizMaskRuleEnum;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @Author: 说淑人* @Date: 2023-11-24* @Description: 授权业务脱敏规则AO类*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface OauthBizMaskRule {// ---- 该注解只对字符串类型的字段有效!// ---- 该注解对嵌套超过5层的对象字段无效!/*** 权限 -- 在拥有指定权限的情况下可以避免数据脱敏,该功能可以视个人情况保留/删除。*/String authority() default "";/*** 规则 -- 具体数据脱敏规则*/OauthBizMaskRuleEnum rule();}
/*** 账号*/@ApiModelProperty(value = "账号", required = true)// ---- 设置拥有“root/customer/nomask”权限的可以免数据脱敏,数据脱敏规则为账号。@OauthBizMaskRule(authority = "root/customer/nomask", rule = OauthBizMaskRuleEnum.ACCOUNT)private String account;/*** 手机号码*/@ApiModelProperty(value = "手机号码")@OauthBizMaskRule(authority = "root/customer/nomask", rule = OauthBizMaskRuleEnum.PHONE_NUMBER)private String phoneNumber;/*** 名称*/@ApiModelProperty(value = "名称")@OauthBizMaskRule(authority = "root/customer/nomask", rule = OauthBizMaskRuleEnum.NAME)private String name;
枚举&工具
import com.ssr.world.tool.pedestal.util.string.StringUtil;import java.util.function.Function;/*** @Author: 说淑人* @Date: 2022/1/12 下午8:18* @Description: 授权业务脱敏规则EO类*/
public enum OauthBizMaskRuleEnum {/*** 授权业务脱敏规则枚举集*/ACCOUNT(s -> s.replaceAll("(\\S{5})\\S{10}(\\S*)", "$1**********$2")),PHONE_NUMBER(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),NAME(s -> s.charAt(0) + StringUtil.repeat('*', s.length() - 1)),;public final Function<String, String> masker;OauthBizMaskRuleEnum(Function<String, String> masker) {this.masker = masker;}}
切面
在对数据对象的字段进行反射遍历时,我们还需要考虑父类对象&嵌套对象的字段遍历。由于对象嵌套的层级可能非常深且还可能有相互嵌套的情况,因此在遍历&迭代时必须要限制层级以避免长遍历&死循环,以及还要尽可能避免不必要的遍历,例如原生/框架的类,从而尽可能的提升性能。关于这些问题在下文的代码中都有提及且处理,请仔细查看代码注释。
下述代码对列表结构也做了处理,基本上可以直接拿来用。
import com.ssr.world.biz.manage.client.oauth.OauthBizStaffClient;
import com.ssr.world.biz.manage.model.ao.oauth.OauthBizMaskRule;
import com.ssr.world.biz.manage.model.eo.oauth.OauthBizUserType;
import com.ssr.world.biz.manage.model.eo.oauth.OauthBizUserTypeEnum;
import com.ssr.world.biz.manage.model.vo.response.oauth.OauthBizStaffAuthorityResponse;
import com.ssr.world.biz.manage.tool.util.oauth.OauthBizUtil;
import com.ssr.world.tool.pedestal.model.bo.result.ResultBox;
import com.ssr.world.tool.pedestal.util.string.StringUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.Objects;/*** @Author: 说淑人* @Date: 2023-11-24* @Description: 授权业务脱敏AO类*/
@Aspect
@Component
public class OauthBizMaskAspect {@Autowiredprivate OauthBizStaffClient oauthBizStaffClient;// /**
// * 切入点
// */
// @Pointcut("execution(* com.ssr.world..controller..*(..))")
// public void pointcut() {
// // ---- 以工程路径下所有控制器方法为切入点。这种方式比较简便,因为无需额外注解进
// // 行修饰。但对性能的损耗很大,因为所有的控制器方法都会被切入。
// }/*** 切入点*/@Pointcut("@annotation(com.ssr.world.biz.manage.model.ao.oauth.OauthBizMask)")public void pointcut() {// ---- 以修饰了@OauthBizMask注解的方法为切入点。}/*** 环绕** @param proceedingJoinPoint 行动参与点* @return 值* @throws Throwable 可抛出*/@Around("pointcut()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {// ---- 获取方法的执行结果。Object object = proceedingJoinPoint.proceed();// ---- 判断是否需要对当前请求的返回数据进行脱敏操作,如果未携带令牌/用户为客户/用// 户为超级管理员,则直接返回而不执行的数据脱敏操作(该逻辑视个人情况保留/删除)。if (StringUtil.isBlank(OauthBizUtil.getAuthorization()) ||OauthBizUserTypeEnum.CUSTOMER.equals(OauthBizUtil.getUserType())|| OauthBizUserType.SHUO_SHU_REN.equals(OauthBizUtil.getAccount())) {return object;}// ---- 将控制器方法的返回值强制转化为ResultBox对象以获取内部的封装数据。(该逻辑// 视个人情况保留/删除)。ResultBox<?> resultBox = (ResultBox<?>) object;Object data = resultBox.getData();// ---- 迭代数据对象包括父类在内的所有字段,判断其是否标注了@OauthBizMask注解,是// 则对内部数据进行脱敏。if (Objects.nonNull(data)) {recursiveField(1, data.getClass(), data, // ---- 获取员工权限作为数据脱敏的执行依据。oauthBizStaffClient.getStaffAuthorityMapCache(OauthBizUtil.getAccount()));}return object;}/*** 迭代字段** @param tier 层级* @param clazz 类对象* @param data 数据* @param authorityMap 权限映射* @throws IllegalAccessException 非法访问异常*/private void recursiveField(int tier, Class<?> clazz, Object data, Map<String, OauthBizStaffAuthorityResponse> authorityMap) throws IllegalAccessException {// ---- 如果嵌套层级超过5级则直接返回。层级限制是为了避免深度嵌套导致的性能问题,// 以及相互嵌套导致的死循环问题。if (tier > 5) {return;}// ---- 判断数据对象是否是集(及子类)类型 ,是则迭代内部所有对象的所有字段。注意!// 迭代集中的对象不需要增加层级。if (data instanceof Collection) {for (Object collectionData : (Collection<?>) data) {if (Objects.nonNull(collectionData)) {recursiveField(tier, collectionData.getClass(), collectionData, authorityMap);}}return;}// ---- 如果数据对象不是集(及子类)类型,判断其是否是自开发的类型,否则直接返回。// 该判断可以帮助我们免去对原生/框架类的字段迭代,因为我们只能对自开发的类字段修// 饰@OauthBizMaskRule注解,从而有效提升性能。// ---- 当然,在极少数情况下,我们可能使用除"集类"以外的某些原生/框架类对象来承载自// 开发类对象。这种情况下当前逻辑会导致数据无法脱敏,因此后续可能需要和"集类"一样// 对这些类进行特殊处理。Package pack = clazz.getPackage();if (Objects.isNull(pack) || !pack.getName().startsWith("个人工程路径前缀,例如com.xxx.xxx")) {return;}// ---- 迭代当前class对象的所有直属字段,即非父类字段。Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// ---- 判断当前字段值是否为null,是则直接略过。field.setAccessible(true);Object fieldData = field.get(data);if (Objects.isNull(fieldData)) {continue;}// ---- 判断当前字段是否是字符串类型,否则对该嵌套对象进行字段迭代,随后返回。if (!(fieldData instanceof String)) {recursiveField(tier + 1, fieldData.getClass(), fieldData, authorityMap);continue;}// ---- 判断字符串字段是否直接修饰了@OauthBizMaskRule注解,否则直接略过。OauthBizMaskRule oauthBizMaskRule = field.getDeclaredAnnotation(OauthBizMaskRule.class);if (Objects.isNull(oauthBizMaskRule)) {continue;}// ---- 如果字符串字段修饰了@OauthBizMaskRule注解,判断当前员工是否拥有指定权// 限且未曾过期,否则直接略过(该逻辑视个人情况保留/删除)。String authorityCode = oauthBizMaskRule.authority();OauthBizStaffAuthorityResponse authority;if (StringUtil.isNotBlank(authorityCode) &&Objects.nonNull(authority = authorityMap.get(authorityCode)) &&new Date().before(authority.getExpireDatetime())) {continue;}// ---- 进行数据脱敏操作。System.out.println("字段名:" + field.getName());System.out.println("字段值:" + fieldData);String value = (String) fieldData;field.set(data, oauthBizMaskRule.rule().masker.apply(value));}// ---- 获取父类,如果父类存在,继续迭代。注意!父类不属于嵌套。Class<?> parentClass = clazz.getSuperclass();if (Objects.nonNull(parentClass)) {recursiveField(tier, parentClass, data, authorityMap);}}}
效果




相关文章:
Spring Boot AOP实现动态数据脱敏
依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…...
AutoGen入门——快速实现多角色、多用户、多智能体对话系统
1.前言 如https://github.com/microsoft/autogen所述,autogen是一多智能体的框架,属于微软旗下的产品。 依靠AutoGen我们可以快速构建出一个多智能体应用,以满足我们各种业务场景。 本文将以几个示例场景,使用AutoGen快速构建出…...
.NET Framework
.NET Framework 是微软推出的一个软件开发平台,主要用于构建和运行 Windows 应用程序。它是 .NET 生态系统的早期版本,专注于 Windows 平台,并提供了丰富的类库和运行时环境。 注意事项 跨平台限制:.NET Framework 主要适用于 W…...
算法中的移动窗帘——C++滑动窗口算法详解
1. 滑动窗口简介 滑动窗口是一种在算法中常用的技巧,主要用来处理具有连续性的子数组或子序列问题。通过滑动窗口,可以在一维数组或字符串上维护一个固定或可变长度的窗口,逐步移动窗口,避免重复计算,从而提升效率。常…...
DuckDB:Golang操作DuckDB实战案例
DuckDB是一个嵌入式SQL数据库引擎。它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的。DuckDB支持各种数据类型和SQL特性。凭借其在以内存为中心的环境中处理高速分析的能力,它迅速受到数据科学家和分析师的欢迎。在这篇博文中࿰…...
C++通过输入3D相机像素点集{u、v、z}和机械手世界坐标点集{X、Y、Z}求得变换矩阵RT(眼在手外)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! C++通过输入3D相机像素点集{u、v、z}和机械手世界坐标点集{X、Y、Z}求得变换矩阵RT(眼在手外) 引言原理简介点集数据(含像素坐标、世界坐标及求解后的变换矩阵)配…...
手机怎么远程操控电脑?
远程看看是一款免费使用的远程控制软件,兼容 Windows、iOS 和 Android 系统,用户可以通过电脑或移动设备轻松远程控制电脑。不仅如此,远程看看还提供了文件传输、在线聊天和隐私屏等实用功能。如果您需要在远程操作时隐藏被控电脑的操作界面&…...
【Golang/gRPC/Nacos】在golang中将gRPC和Nacos结合使用
Nacos与gRPC 前言 关于这部分,前段时间我在看文档以及视频教程的时候,怎么都想不明白,到底为什么要用gRPC是什么,他在项目中应该充当什么样的角色?Nacos又是如何和他结合的? 于是我就决定去看看一些小项…...
数据库-多表关系
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构。由于业务之间相互关联,所以各个表结构之间也存在着各种联系。 多表关系: 一对多(多对一) 一对一 多对多 多表关系 一对…...
回归算法、聚类算法、决策树、随机森林、神经网络
这也太全了!回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法一口气学完!_哔哩哔哩_bilibili 【线性回归、代价函数、损失函数】动画讲解_哔哩哔哩_bilibili 14分钟详解所有机器学习算法:…...
RabbitMQ1-消息队列
目录 MQ的相关概念 什么是MQ 为什么要用MQ MQ的分类 MQ的选择 RabbitMQ RabbitMQ的概念 四大核心概念 RabbitMQ的核心部分 各个名词介绍 MQ的相关概念 什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出&am…...
第17章:Python TDD回顾与总结货币类开发
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
7、数组知识点汇总
一、 数组基本概念 程序算法数据结构 算法:解决程序的流程步骤数据结构:将数据按照某种特定的结构来存储设计良好的数据结构会导致良好的算法。ArrayList、LinkedList 数组是最简单的数据结构。 1、数组: 数组:存放同一种类型…...
蓝桥杯c/c++需要掌握的基础语法总结
1、#include<bits/stdc.h> 万能头文件 2、using namespace std; 3、输出 cout<<""<<end1; (换行) printf(""); 4、int x3;整数 double d3.14;小数 char ch’A‘;字符 char s[]"Hell…...
学习第七十四行
qt调用信号与槽机制: MOC查找头文件中的signal与slots,标记出信号槽。将信号槽信息储存到类静态变量staticMetaObject中,并按照声明的顺序进行存放,建立索引。connect链接,将信号槽的索引信息放到一个双向链表中&…...
《罗宾逊-旅途VR》Build2108907官方学习版
《罗宾逊-旅途VR》官方版 https://pan.xunlei.com/s/VODiY5gn_fNxKREdVRdwVboCA1?pwdsh3f# 从第一人称的角度进行探索,玩家将遇到一系列恐龙和生物,这些恐龙和生物会对它们在泰森三世生态系统中的存在做出反应。强调与周围环境的互动,鼓励玩…...
详解共享WiFi小程序怎么弄!
在数字化时代,共享WiFi项目正逐渐成为公共场所的新标配,它不仅为用户提供了便捷的上网方式,还为商家带来了额外的收入来源。那么共享wifi怎么弄,如何搭建并运营一个成功的共享WiFi项目呢? 共享WiFi项目通过在公共场所…...
Glide加载gif遇到的几个坑
Glide本身支持gif格式的动画加载,但是大多数情况下我们用Glide都是去加载一些静态图片,加载gif动态图的需求不是很多,因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题 问题一:加载gif图片会有明显的卡顿 通常情况下我们…...
mybatis(19/134)
大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符…...
部分“古董机”编程读取文件时出现文件损坏的简易处理办法(简单粗暴) - 随笔
在部分老旧计算机(通常被戏称为“古董机”)上编程,读取文件时可能会遇到文件损坏的问题。这通常是由于硬件性能限制或操作系统的文件处理机制导致的。本文将介绍几种简易的处理办法,以解决或绕过这一问题。 方法1. 调整磁盘关闭时…...
StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级
自 StarRocks 3.0 起,社区明确了以 Lakehouse 为核心的发展方向。Lakehouse 的价值在于融合数据湖与数据仓库的优势,能有效应对大数据量增长带来的存储成本压力,做到 single source of truth 的同时继续拥有极速的查询性能,同时也…...
强化学习入门--基本概念
强化学习基本概念 grid-world example 这个指的是一个小机器人(agent)在一个网格区域(存在边界),网格中存在需要躲避的格子和目标格子,我们的目的就是找到到达目标格子的最短路径 state 表示智能体相对…...
Oracle 创建并使用外部表
目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…...
深度学习python基础(第三节) 函数、列表
本节主要介绍函数、列表的基本语法格式。 函数 与c语言的函数差不多,就是语法基本格式不同。 name "loveyou" length len(name) print("字符串的长度为:%d" % length) # 自定义函数 def countstr(data):count 0for i in da…...
基于Python的多元医疗知识图谱构建与应用研究(上)
一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…...
Spring Boot 快速创建项目
目录 一. 创建项目 编辑 二. 项目目录 三. 运行项目 (1) 启动项目 (2) 输出HelloWorld 一. 创建项目 我们以idea专业版为例创建Spring项目: 步骤: (1) File --> New --> Project (2) 配置项目基本信息 (3) 依赖: 需要什么就勾选什么. 我们这里就只勾选一个Spri…...
MySQL预编译语句过多告警排查
业务背景 在使用Spring Cloud Alibaba搭建的微服务架构中,项目采用ShardingSphere进行分库分表,MyBatis-Plus作为持久层。线上环境突发大量预编译语句过多的数据库告警,导致系统性能下降。 排查过程 1. 初步排查:联系云数据库厂…...
在centos上编译安装opensips【初级-默认安装】
环境:centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…...
偏序关系.
一、偏序(半序)关系 偏序关系 自反反对称传递性 二、全序(线序、链)关系 三、偏序集中的重要元素 1. 极大元与极小元 极大元找所在集合的一个或几个最高点; 极小元找所在集合的一个或几个最低点。 2. 最大元与最小…...
Node.js接收文件分片数据并进行合并处理
前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…...
设计模式概述 - 设计模式的重要性
引言 设计模式是软件工程中用于解决常见设计问题的经典解决方案。它们提供了一种标准化的方式来组织和设计代码,使得代码更易于理解、维护和扩展。在C编程中,设计模式尤为重要,因为它们可以帮助开发者应对复杂的系统设计,提高代码…...
OSI5GWIFI自组网协议层次对比
目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层,负责将数字数据转换为适合无线传输的信号,并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段(…...
网络安全(渗透)
目录 名词解释 2、相互关系 3. 安全影响 名词解释 1、poc、exp、payload与shellcode POC(Proof of Concept): 是一种概念验证代码或演示程序,用于证明漏洞的存在。 主要目的是通过简单的代码或操作向安全研究人员、开发人员…...
Whisper-GPT:混合表征音频大语言模型
Whisper-GPT:混合表征音频大语言模型 当下,利用从神经压缩算法(例如#Encodec#)派生的离散音频标记的生成式音频、语音以及音乐模型数量激增。然而,这种方法的主要缺陷之一在于对上下文长度的处理。如果必须考虑所有不同频率的音频内容才能进行下一个标记预测,那么高保…...
科技重塑未来:前沿技术趋势、跨领域融合与社会影响深度洞察
目录 科技重塑未来:前沿技术趋势、跨领域融合与社会影响深度洞察引言一、前沿技术趋势洞察与分析1. 人工智能与自动化1.1 趋势分析1.2 挑战分析 2. 区块链技术2.1 趋势分析2.2 挑战分析 3. 量子计算3.1 趋势分析3.2 挑战分析 二、跨领域技术融合与创新实践1. AI与大…...
深度学习:大模型Decoding+MindSpore NLP分布式推理详解
大模型推理流程 1. 用户输入提示词(Prompt) 假设用户输入为:“从前,有一只小猫,它喜欢……” 我们的目标是让模型生成一段完整的故事。 2. 模型处理用户输入 2.1 分词:输入提示被分词为模型可以理解的…...
GESP6级语法知识(二):动态规划算法(二)
最小路径和; //最小路径和 #include<iostream> using namespace std; const int N100; int dp[N][N],value[N][N]; int n,m; int main() {cin>>n>>m;for(int i1;i<n;i) //录入初始数字矩阵 for(int j1;j<m;j)cin>>value[i][j];for(int i1;i…...
数据结构与算法之递归: LeetCode 79. 单词搜索 (Ts 版)
单词搜索 https://leetcode.cn/problems/word-search/description/ 描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 单词必须按照字母顺序,通过相邻的单…...
智能系统的感知和决策
智能系统在感知和决策过程中具备的关键能力表现在智能感知/自主判定上,下面可以从感知的本质、自主判断的含义及其在智能系统中的作用进行深入分析。 1、智能感知:信息获取与理解 智能感知是指智能系统通过传感器或其他数据采集手段获取环境中的信息&…...
多线程之旅:线程安全问题
之前说到了多线程的创建和一些属性等等,接下来,就来讲讲多线程安全问题。 小编引入这段代码讲解下: public class Demo13 {public static int count0;public static void main(String[] args) throws InterruptedException {Thread t1new…...
用java配合redis 在springboot上实现令牌桶算法
令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法,适用于控制请求的频率,防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先,需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...
科学计算库NumPy
NumPy是高性能科学计算和数据分析的基础包。 认识NumPy数据对象 n维数组对象ndarray(array) 数组是编程语言中重要且复杂的数据结构,它是由相同类型元素按照一定的顺序排列的集合。ndarray具有矢量算术能力和复杂的广播能力。 - 维度又称为维数,在数学…...
【大数据】机器学习----------强化学习机器学习阶段尾声
一、强化学习的基本概念 注: 圈图与折线图引用知乎博主斜杠青年 1. 任务与奖赏 任务:强化学习的目标是让智能体(agent)在一个环境(environment)中采取一系列行动(actions)以完成一个…...
Unicode不可见字符
场景复现 在访问 https://dotnet.microsoft.com/zh-cn/apps/aspnet地址时 突然出现 https://dotnet.microsoft.com/zh-cn/apps/aspnet%E2%80%8C%E2%80%8C 但是正常来看,这个地址后面是没有%E2%80%8C%E2%80%8C的,粘贴到idea里发现了url地址后面还拼接了2…...
w172二手车交易系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
TRELLIS微软的图生3D
TRELLIS 教程目录: Youtube:https://www.youtube.com/watch?vJqFHZ-dRMhI 官网地址:https://trellis3d.github.io/ GitHub:https://github.com/Microsoft/TRELLIS 部署目录: 克隆项目 git clone --recurse-submodul…...
【力扣:新动计划,编程入门 —— 题解 ①】
向前看,总会有新的故事值得期盼 —— 25.1.21 2235. 两整数相加 给你两个整数 num1 和 num2,返回这两个整数的和。 示例 1: 输入:num1 12, num2 5 输出:17 解释:num1 是 12,num2 是 5 &#x…...
如何使用 Pytest -k 选项轻松筛选测试用例
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 你是否曾不得不从成百上千个测试中费力筛选,只为运行几个特定的测试&am…...
C语言之小型成绩管理系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之小型成绩管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验收要…...
C++ ——— 模拟实现 vector 类
目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…...