当前位置: 首页 > news >正文

通过Aop实现限制修改删除指定账号的数据

1、需求

对于Teach账号创建的数据,其他用户仅仅只有查询的权限,而不能修改和删除。并且部分接口只允许Teach账号访问

2、实现思路

在删除和修改时往往需要传递数据的id,进而可以通过id查询该数据是否由Teach账号创建。当然我们可以在每个删除和修改接口里面进行判断,但这样照成管控不够集中,并且不利于后续的修改。如果后续又要求对Admin账号创建的数据也做同样的管控,那需要修改的地方会很多。
因此可以通过Aop拦截删除、修改等接口,通过接口的参数中的查询id对应的数据是否由Teach账号创建。

3、实现Demo

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.function.BiConsumer;@Order(0)
@Aspect
@Component
public class TeachAccountCheckAop {private static final Logger logger = LoggerFactory.getLogger(TeachAccountCheckAop.class);@Autowiredprivate HttpServletRequest request;@Autowiredprivate UserInfoUtil userInfoUtil;@Autowiredprivate ExpInfoService expInfoService;@Autowiredprivate ExpManualService expManualService;@Autowiredprivate MaterialInfoService materialInfoService;@Autowiredprivate SandboxMgtService sandboxMgtService;/*** 存储每个接口对应的从接口参数中获取id的方式*/private Map<String, BiConsumer<Object, List<Long>>> classMap = new HashMap<>();/*** 存储仅仅运行Teach账号访问的接口*/private Set<String> onlyTeachApiMethodSet = new HashSet<>();{onlyTeachApiMethodSet.add("com.huawei.ebg.olblab.controller.ExpInfoController.exportExperiment");onlyTeachApiMethodSet.add("com.huawei.ebg.olblab.controller.ExpInfoController.importExperiment");/*** arg:接口的参数* list:用于存储从接口参数中提取的id*/classMap.put("com.huawei.ebg.olblab.controller.ExpInfoController.saveExpBaseInfo", (arg, list) -> {ExpBaseInfoDto param = (ExpBaseInfoDto) arg;if (Objects.nonNull(param.gettid())) {list.add(param.gettid());}});classMap.put("com.huawei.ebg.olblab.controller.ExpManualController.saveExpManualBaseInfo", (arg, list) -> {ExpManualBaseDto param = (ExpManualBaseDto) arg;if (Objects.nonNull(param.gettid())) {list.add(param.gettid());}});classMap.put("com.huawei.ebg.olblab.controller.ExpMaterialInfoController.updateExpMaterialInfo", (arg, list) -> {MaterialUpdateDto param = (MaterialUpdateDto) arg;if (Objects.nonNull(param.gettid())) {list.add(param.gettid());}});classMap.put("com.huawei.ebg.olblab.controller.SandboxMgtController.deleteSandbox", (arg, list) -> {SandboxTempDto.Delete param = (SandboxTempDto.Delete) arg;if (CollectionUtils.isNotEmpty(param.getSandboxTempIds())) {list.addAll(param.getSandboxTempIds());}});}@Before("execution(public * com.huawei.ebg.olblab.controller.ExpInfoController.saveExpBaseInfo(..))"+ "|| execution(public * com.huawei.ebg.olblab.controller.ExpManualController.saveExpManualBaseInfo(..))"+ "|| execution(public * com.huawei.ebg.olblab.controller.ExpMaterialInfoController.updateExpMaterialInfo(..))"+ "|| execution(public * com.huawei.ebg.olblab.controller.SandboxMgtController.deleteSandbox(..))")public void beforeApiCheck(JoinPoint joinPoint) {// 获取当前登录者账号,Teach账号直接结束String userAccount = userInfoUtil.getUserAccount(request);if (StringUtils.equals(userAccount, ImportAccount.TEACH)) {return;}// 获取切点的方法String proxyTargetClass = joinPoint.getSignature().getDeclaringTypeName();String proxyTargetMethod = proxyTargetClass + "." + joinPoint.getSignature().getName();// 检查接口是否仅Teach能访问if (onlyTeachApiMethodSet.contains(proxyTargetMethod)) {if (StringUtils.equals(userAccount, ImportAccount.CREAT)) {return;}throw new RuntimeException(ErrorCode.EDU81080); // 仅Teach能访问}// 从接口参数中获取idObject[] args = joinPoint.getArgs();BiConsumer<Object, List<Long>> consumer = classMap.get(proxyTargetMethod);List<Long> ids = new ArrayList<>();for (Object arg : args) {if (Objects.isNull(arg)) {continue;}consumer.accept(arg, ids);}if (CollectionUtils.isEmpty(ids)) {return;}// 不同controller的接口,调用不同的Service查询id对应的数据的创建人是否存在Teach账号创建的数据long count = 0L;if (StringUtils.equals(proxyTargetClass, ExpInfoController.class.getName())) {count = expInfoService.count(Wrappers.lambdaQuery(ExpInfoEntity.class).eq(ExpInfoEntity::getCreateBy, ImportAccount.TEACH).in(ExpInfoEntity::getType, ExpType.TYPE_0, ExpType.TYPE_1).in(ExpInfoEntity::gettid, ids));} else if (StringUtils.equals(proxyTargetClass, ExpManualController.class.getName())) {count = expManualService.count(Wrappers.lambdaQuery(ExpManualEntity.class).eq(ExpManualEntity::getCreateBy, ImportAccount.TEACH).in(ExpManualEntity::gettid, ids));} else if (StringUtils.equals(proxyTargetClass, ExpMaterialInfoController.class.getName())) {count = materialInfoService.count(Wrappers.lambdaQuery(MaterialInfoEntity.class).eq(MaterialInfoEntity::getCreateBy, ImportAccount.TEACH).in(MaterialInfoEntity::gettid, ids));} else if (StringUtils.equals(proxyTargetClass, SandboxMgtController.class.getName())) {count = sandboxMgtService.count(Wrappers.lambdaQuery(SandboxTempEntity.class).eq(SandboxTempEntity::getCreatedByName, ImportAccount.TEACH).in(SandboxTempEntity::getSandboxTempId, ids));}if (count > 0) {throw new RuntimeException(ErrorCode.EDU81080); // 仅Teach能访问}}
}

4、可优化点

切入点表达式,可以改为自定义注解

相关文章:

通过Aop实现限制修改删除指定账号的数据

1、需求 对于Teach账号创建的数据&#xff0c;其他用户仅仅只有查询的权限&#xff0c;而不能修改和删除。并且部分接口只允许Teach账号访问 2、实现思路 在删除和修改时往往需要传递数据的id&#xff0c;进而可以通过id查询该数据是否由Teach账号创建。当然我们可以在每个删…...

递归实现指数型枚举

我们以n2 为例 我们每次都有选和不选两种 方案&#xff0c;对于每个数字 核心代码 tatic void dfs(int u) { // u代表当前处理的数字if (u > n) { // 终止条件&#xff1a;处理完所有数字for (int i 1; i < n; i) { // 遍历所有数字if (nums[i]) {…...

无代码国产流程引擎 FlowLong 1.1.6 发布

无代码国产流程引擎 FlowLong 1.1.6 于 2025 年 4 月 7 日发布。 FlowLong 是一款纯血国产自研的工作流引擎&#xff0c;具有以下特点&#xff1a; 核心精简&#xff1a;引擎核心仅 8 张表实现逻辑数据存储&#xff0c;采用 json 数据格式存储模型&#xff0c;结构简洁直观。组…...

软考高项-考前冲刺资料-M 类【项目管理类】【光头张老师出品】

重点考点汇总 一、案例答题时需要注意: 1.条目写要清晰,要标注 1、2、3、4、… 2.关键字突出,关键字一定是专业词汇如 “监控”“控制成本”…等等,代替自己平时工作中的用此。 3.尽量多写几点,错了不扣分,但是避免重复写,避免写了一大段的内容,但是表达的是一个观点。…...

LLM Agents项目推荐:MetaGPT、AutoGen、AgentVerse详解

这一部分我们将深入介绍三大备受关注的LLM Agents项目&#xff1a;MetaGPT、AutoGen和AgentVerse&#xff0c;包括它们的背景、设计思路、主要功能、技术亮点以及典型应用场景。 1. MetaGPT&#xff1a;让AI像软件工程团队一样协作 项目背景 MetaGPT由Huang et al.于2023年提…...

win10家庭版安装Docker

win10家庭版本中成功安装Docker&#xff0c;亲测&#xff01; 1、下载Docker 下载地址&#xff1a;http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ Docker的有CE和EE版&#xff0c;CE为免费版&#xff0c;EE由公司支持的付费版&#xff0c;在此选择CE版本…...

mapbox基础,加载ESRI OpenStreetMap开放街景标准风格矢量图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀加载ESRI OpenStreetMap开放街景标准风…...

【网络安全 | 漏洞挖掘】通过分析JS文件实现接口未授权访问与账户接管

未经许可,不得转载。 文中所述漏洞均已修复,未经授权不得进行非法渗透测试。 文章目录 正文正文 大约一年前,我给我妈买了一辆 2023 款斯巴鲁 Impreza,前提是她得答应我,之后我可以借来做一次“白帽渗透测试”。过去几年我一直在研究其他车企的安全问题,但一直没有机会仔…...

引领东方语言识别新风潮!Dolphin语音模型开创自动语音识别(ASR)新时代

引领东方语言识别新风潮&#xff01;Dolphin语音模型开创自动语音识别&#xff08;ASR&#xff09;新时代 在全球语音识别技术领域&#xff0c;随着人工智能的飞速发展&#xff0c;许多技术巨头纷纷推出了多语言支持的语音识别系统&#xff0c;如Whisper等。然而&#xff0c;尽…...

运动规划实战案例 | 基于四叉树分解的路径规划(附ROS C++/Python仿真)

目录 1 为什么需要四叉树&#xff1f;2 基于四叉树的路径规划2.1 分层抽象2.2 路图搜索2.3 动态剪枝 3 算法仿真3.1 ROS C算法仿真3.2 Python算法仿真 1 为什么需要四叉树&#xff1f; 路径规划的本质是在给定环境中寻找从起点到终点的最优或可行路径&#xff0c;其核心挑战在…...

java设计模式-享元模式

享元模式 基本介绍 1、享元模式(flyweight Pattern)&#xff0c;也叫作蝇量模式&#xff1a;运用在共享技术有效的支持大量细粒度的对象。 2、常用语系统底层开发&#xff0c;解决系统的性能问题。像 数据库连接&#xff0c;里面都是创建好的连接对象&#xff0c;在这些连接对…...

Java 大视界 -- Java 大数据在智慧水利水资源调度与水情预测中的应用创新(180)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

自动驾驶---苹果又要造车了吗?

1 背景 巴菲特一直认为造车的企业是一个做 “苦生意” 的企业&#xff0c;可能苹果高层也意识到了这一点&#xff0c; 于是造车计划在去年被终止。 但2025年2月份&#xff0c;苹果公司署名发了一篇自动驾驶领域的论文《Robust Autonomy Emerges from Self-Play》&#xff0c;详…...

Redis主从复制:告别单身Redis!

目录 一、 为什么需要主从复制&#xff1f;&#x1f914;二、 如何搭建主从架构&#xff1f;前提条件✅步骤&#x1f4c1; 创建工作目录&#x1f4dc; 创建 Docker Compose 配置文件&#x1f680; 启动所有 Redis&#x1f50d; 验证主从状态 &#x1f4a1; 重要提示和后续改进 …...

PHP:将关联数组转换为索引数组的完整示例

处理之前的数据 头和行在一起显示 // 执行SQL查询后的原始数据&#xff08;假设查询返回3条记录&#xff09; $rawData [[wip_entity_name > JOB001,primary_item > ITEM001,primary_name > 主产品1,primary_desc > 主产品描述1,start_quantity > 100,quanti…...

27.[2019红帽杯]easyRE1(保姆教程)

收到文件&#xff0c;.elf 文件&#xff0c;ExeinfoPE查看一下基础信息。无壳&#xff0c;64bit。 把文件拖入IDA工具&#xff0c;查看一下。 点击关键字&#xff0c;ctrl x 交叉搜索一下位置&#xff0c;跟进&#xff0c;顺便菜单左侧 Edit --> Plugins--> findcrypt …...

【Redis】Redis实现分布式锁

1. 基于Redis 1.1 加锁 setnx lockKey uniqueValue1.2 解锁 基于Lua脚本保证解锁的原子性。Redis在执行Lua脚本时&#xff0c;可以以原子性的方式执行&#xff0c;确保原子性。 if redis.call("get", keys[1]) argv[1] then return redis.call("del", …...

AI大模型底层技术——Scaling Law

0. 定义 Scaling Law 是描述 AI 模型性能随关键因素&#xff08;如参数量、数据量、计算量&#xff09;增长而变化的数学规律&#xff0c;通常表现为幂律关系。 历史里程碑&#xff1a; **OpenAI 2020 年论文首次系统提出语言模型的缩放定律**DeepMind、Google 等机构后续发表…...

Spring MVC 国际化机制详解(MessageSource 接口体系)

Spring MVC 国际化机制详解&#xff08;MessageSource 接口体系&#xff09; 1. 核心接口与实现类详解 接口/类名描述功能特性适用场景MessageSource核心接口&#xff0c;定义消息解析能力支持参数化消息&#xff08;如{0}占位符&#xff09;所有国际化场景的基础接口Resource…...

java学习笔记13——IO流

File 类的使用 常用构造器 路径分隔符 常用方法 File类的获取功能和重命名功能 File 类的判断功能 File类的创建功能和删除功能 File 类的使用 总结&#xff1a; 1.File类的理解 > File类位于java.io包下&#xff0c;本章中涉及到的相关流也都声明在java.io包下 > File…...

防DDoS流量清洗核心机制解析

本文深度剖析DDoS流量清洗技术演进路径&#xff0c;揭示混合云清洗系统的四层过滤架构&#xff0c;结合2023年新型反射攻击案例&#xff0c;提出基于AI行为分析的动态防御策略。通过Gartner最新攻防效能数据与金融行业实战方案&#xff0c;阐明流量清洗系统在误判率、清洗延迟、…...

边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用

边缘计算革命&#xff1a;低功耗GPU在自动驾驶实时决策中的应用 ——分析NVIDIA Jetson与华为昇腾的嵌入式方案差异 一、自动驾驶的实时决策挑战与边缘计算需求 自动驾驶系统需在30ms内完成环境感知、路径规划与车辆控制的全流程闭环‌。传统云端计算受限于网络延迟&#xf…...

ubuntu24.04-MyEclipse的项目导入到 IDEA中

用myeclipse创建的一个web项目&#xff0c; jdk1.7,tomcat7,mysql8.0,导入到idea项目中 1.导入现有项目 1.打开IDEA&#xff0c;选择“Import Project”进入下一步 2.选择所需要导入的项目&#xff0c;点击“OK” 3.点击创建一个新的项目&#xff0c;然后下一步 4.直接点…...

基于SpringBoot的律师事务所案件管理系统【附源码】

基于SpringBoot的律师事务所案件管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1界面设计原则 4.2功能结构设计 4.3数据库设计 4.3.1属性图 4.3.2 数据库物理设计 5 系统实现 5.1客户信息管理 5.2 律师…...

电力网关:推动电力物联网及电力通信系统革新

在“双碳”目标与新型电力系统建设的背景下&#xff0c;电力行业正加速向数字化、智能化、绿色化转型。作为国内领先的电力物联网解决方案提供商&#xff0c;厦门计讯物联科技有限公司&#xff08;以下简称“计讯物联”&#xff09;依托自主研发的电力专用网关、边缘计算平台及…...

Android系统的Wi-Fi系统框架和详细启动流程

目录 一、前言 二、系统架构层次 ‌1、应用层‌ ‌2、Framework层‌ 3‌、HAL层‌ ‌4、驱动层‌ 三、Wi-Fi 目录树结构 四、系统流程 1、应用层请求 2、Wi-Fi管理服务处理 3、硬件交互 4、数据处理与事件通知 5.连接管理 6.状态维护 五、WiFi启动流程及函数调用…...

Scala基础知识8

集合计算高级函数 包括过滤、转换或映射、扁平化、扁平化加映射、分组、简化&#xff08;归约&#xff09;&#xff0c;折叠 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合。 转换或映射:将原始集合中的元素映射到某个函数中。 扁平化:取消嵌套格式&…...

SwiftUI 本地推送(Local Notification)教程目录

1. 本地推送简介 1.1 什么是本地推送&#xff1f;1.2 本地推送的应用场景&#xff08;提醒、定时任务、用户交互等&#xff09;1.3 本地推送与远程推送的区别 2. 前提条件 2.1 开发环境要求&#xff08;Xcode 13、iOS 15&#xff09;2.2 需要的基础知识&#xff08;SwiftUI …...

大数据技术与Scala

集合高级函数 过滤 通过条件筛选集合元素&#xff0c;返回新集合。 映射 对每个元素应用函数&#xff0c;生成新集集合 扁平化 将嵌套集合展平为单层集合。 扁平化映射 先映射后展平&#xff0c;常用于拆分字符串。 分组 按规则将元素分组为Map结构。 归约 …...

golang通过飞书邮件服务API发送邮件功能详解

一.需求 需要实现通过飞书邮件服务API发送邮件验证码功能:用户输入邮箱, 点击发送邮件,然后发送邮件验证码, 这里验证码有过期时间, 保存到redis缓存中 二.实现 实现的部分代码如下: 控制器部分代码 // 发送邮件控制器 func EmailSendController(userId uint64, m proto.Messa…...

BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码

web自动化代码&#xff1a; https://gitee.com/chicken-c/boost-search/tree/master/AutoTest...

MySQL学习笔记集--触发器

触发器 MySQL触发器&#xff08;Trigger&#xff09;是一种特殊的存储过程&#xff0c;它在指定的数据库表上指定的事件&#xff08;INSERT、UPDATE、DELETE&#xff09;之前或之后自动执行。触发器可以用来强制执行复杂的业务逻辑、数据完整性规则、自动更新数据等。 触发器…...

算力驱动未来:从边缘计算到高阶AI的算力革命

算力驱动未来&#xff1a;从边缘计算到高阶AI的算力革命 摘要 本文深入探讨了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能领域的多样化应用场景。从边缘计算的实时目标检测到自动驾驶的多传感器融合&#xff0c;从自然语言处理的大模型应用到AI for Scie…...

4.8刷题记录(双指针)

今天刷的部分是代码随想录中的双指针专题代码随想录 由于里面包含的题目大部分之前刷过&#xff0c;并且用双指针做过。所以今天仅仅复习&#xff0c;不再进行代码的搬运。 1.19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a;此题无…...

在shell脚本中,$@和$#的区别与联系

在 Shell 脚本里&#xff0c;$ 和 $* 都是用于表示传递给脚本或函数的所有参数&#xff0c;下面详细介绍它们的区别与联系。 联系 表示所有参数&#xff1a;二者都能够代表传递给脚本或者函数的全部参数。当你在执行脚本时带上了多个参数&#xff0c;$ 和 $* 都能把这些参数呈…...

IP节点详解及国内IP节点获取指南

获取国内IP节点通常涉及网络技术或数据资源的使用&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络连接和通信至关重要。详细介绍几种修改网络IP地址的常用方法&#xff0c;无论是对于家庭用户还是企业用户&#xff0c;希望能找到适合自己的解决方案。以下是方法…...

Google Play上架:解决android studio缓存问题(内容清理不干净导致拒审)

在as打包中,经常会遇到改变工程参数或者对应文件参数的情况,比如 修改android gradle版本 快捷键:ctrl + alt + shift + s 修改SDK文件路径 快捷键:ctrl + alt + shift + s 修改Gradle存储下载文件的默认位置 快捷键:ctrl + alt + s 先打开设置 修改compile...

蓝桥杯备赛 Day 21 图论基础

图的基础 ![[图的基础.png]] 1.图的存储方式 (1)邻接表(常用) vector<pair<int,int>> g[N]; //g[x]存放x的所有出点信息,二维数组 g[i][j]{first,second},first是从i出发的第j个出点,second表示边权 例如上图: g[1]{{2,0}.{3,0}} g[6]{{3,7}} g[4]{{5,0},{6,0}…...

MySQL数据库应用技术试卷

建一个以自己名字拼音为命名的数据库。&#xff08;3分&#xff09; CREATE DATABASE example; 令这个数据库为当前所使用的数据库。&#xff08;2分&#xff09; USE example; 写出如下student表结构语句。&#xff08;95分&#xff09; 表1&#xff1a; 列名 数据类型 …...

openssl源码分析之加密模式(modes)

openssl实现分组加密模式&#xff08;例如AES128-CBC的CBC部分&#xff09;的模块名字叫做modes&#xff0c;源代码位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不开github了TT&#xff0c;只能找个gitee镜像 头文件是modes.h。 该模块目前…...

【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作

【Unity 】Transform缩放控制教程&#xff1a;实现3D模型缩放交互&#xff0c;支持按钮/鼠标/手势操作 在Unity开发中&#xff0c;Transform组件承担着场景中物体的空间信息控制&#xff0c;包括位置、旋转和缩放。而缩放&#xff08;Scale&#xff09;操作&#xff0c;作为三…...

集成nacos2.2.1出现的错误汇总

总结 1.jdk问题 jdk要一致 2.idea使用问题 idea启动nacos要配置&#xff0c;idea启动类要启动两次&#xff0c;并配置两次vm参数 3.项目依赖问题 依赖要正确添加&#xff0c;有的模块就是不能用公共模块的pom配置&#xff0c;需要独立配置&#xff0c;先后启动顺序也要注意…...

从零到有的游戏开发(visual studio 2022 + easyx.h)

引言 本文章适用于C语言初学者掌握基本的游戏开发&#xff0c; 我将用详细的步骤引领大家如何开发属于自己的游戏。 作者温馨提示&#xff1a;不要认为开发游戏很难&#xff0c;一些基本的游戏逻辑其实很简单&#xff0c; 关于游戏的开发环境也不用担心&#xff0c;我会详细…...

海外高防服务器延迟优化——跨国业务安全加速的底层逻辑

本文深度解析海外高防服务器延迟优化的技术实现路径&#xff0c;揭示跨国业务场景下DDoS防护与网络性能的平衡法则。从物理线路选择到协议栈调优&#xff0c;从流量调度算法到安全检测机制重构&#xff0c;系统阐述降低20ms-50ms延迟的工程实践方案&#xff0c;并附2023年东南亚…...

常用环境部署(二十六)——Centos搭建MQTT服务端EMQX

1、安装docker https://blog.csdn.net/wd520521/article/details/112609796?spm1011.2415.3001.5331 2、安装EMQX4.4.4 &#xff08;1&#xff09;使用docker pull指令安装emqx镜像 docker pull emqx/emqx:4.4.4 &#xff08;2&#xff09;查看镜像 docker images 3、启…...

ecovadis认证基本概述,ecovadis认证审核有效期

EcoVadis认证基本概述 1. 什么是EcoVadis认证&#xff1f; EcoVadis是全球领先的企业可持续发展&#xff08;ESG&#xff09;评级平台&#xff0c;专注于评估企业在**环境&#xff08;E&#xff09;、劳工与人权&#xff08;S&#xff09;、商业道德&#xff08;L&#xff09…...

2.8.4 iOS覆盖率SDK开发

iOS系统的覆盖率SDK,通过搭建本地的pod仓库,直接在podfile中添加指定的下载地址,就可以实现对被测试的app注入覆盖率SDK。 2.8.4.1 开发iOS覆盖率获取Pod私有库 在网上查找了相应的开发方法后,决定开发自己的依赖库,开发方法及步骤如下: 1,开发新的包 (1)通过Xcode创…...

Redhat(6)-ansible-变量

变量 1.作用域 Global scope:命令行中设置。 Play scope:play中设置。 Host scope &#xff1a;inventory中定义、facts收集或任务中注册&#xff0c;在主机组和主机上设置。 1.全局变量 1.1cmd命令 #1.全局变量 #显示变量 echo %PATH1.2.ansible变量 全局变量 var变量不加…...

麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用

碳化硅&#xff08;SiC&#xff09;MOSFET 是基于宽禁带半导体材料碳化硅&#xff08;SiC&#xff09;制造的金属氧化物半导体场效应晶体管&#xff0c;相较于传统硅&#xff08;Si&#xff09;MOSFET&#xff0c;具有更高的击穿电压、更低的导通电阻、更快的开关速度以及更优异…...

android audiorecord

这里写目录标题 初始化失败记录 AudioRecord 初始化及参数介绍基本初始化参数详解1. audioSource (音频源)2. sampleRateInHz (采样率)3. channelConfig (声道配置)4. audioFormat (音频格式)5. bufferSizeInBytes (缓冲区大小) 完整初始化示例使用注意事项 参考地址 初始化失败…...