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

java-activiti笔记

版本:activiti7

 <dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>7.0.0.Beta2</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions></dependency><!--activiti与springboot整合包--><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.0.0.Beta2</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions></dependency>

发布

流程图

会签

这里是将流程图通过bpmn.io插件设计好流程图,存放到服务器端

  public AjaxResult publishBpm(BpmFormVo bpmFormVo) {FileInputStream bpmnfileInputStream = null;try{BpmForm byId = getById(bpmFormVo.getId());xml=BpmFormManager.xmlnsActivitiEmpty(xml);xml=BpmFormManager.gatewaySupply(xml);activitiFlowService.delFlowByDefKey(bpmFormVo.getCode());repositoryService.createDeployment().addString(code+ ProcessConstants.SUFFIX, xml).name(code).key(code).deploy();bpmFormVo.setPublishTime(new Date());bpmFormVo.setState(1);bpmFormMapper.publishBpm(bpmFormVo);if("1".equals(byId.getCountersignature())){bpmCountersignService.bpmPublishHandle(byId,xml);}}catch (Exception e){e.printStackTrace();return AjaxResult.error("部署失败");}finally {try {if(bpmnfileInputStream!=null){bpmnfileInputStream.close();}}catch (Exception e){e.printStackTrace();}}return AjaxResult.success("部署成功");}

重新发布需要做如下处理

    @SneakyThrowspublic void delFlowByDefKey(String code) {List<String> deploymentIdByName = activitiFlowMapper.getDeploymentIdByName(code+ ProcessConstants.SUFFIX);if(CollUtil.isEmpty(deploymentIdByName)){return;}for(String did:deploymentIdByName){repositoryService.deleteDeployment(did);}}

启动

    @Overridepublic ProcessInstance startProcess(String definitionKey, String bussinessId,String userId,String userName, String projectId) {String bpmCode=definitionKey;Authentication.setAuthenticatedUserId(userId);Map<String, Object> map=new HashMap<>();map.put("state",ProcessConstants.AUDIT_YES);map.put("assignee",userId);ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(definitionKey, bussinessId, map);Task task = taskService.createTaskQuery().processDefinitionKey(definitionKey).taskAssignee(userId) //设置任务的负责人.orderByTaskCreateTime().desc().list().get(0);if (task!=null){taskService.addComment(task.getId(), task.getProcessInstanceId(), "流程提交","流程提交成功!");startTaskComplete(bpmCode,projectId,task.getId(),null);}startLogProcessHandle(bpmCode,definitionKey,bussinessId,projectId,userId,userName,processInstance,task);return processInstance;}

将会签中的占位的数据赋值

    @Overridepublic void startTaskComplete(String bpmCode,String projectId,String taskId, Map<String, Object> variables) {BpmForm bpmForm = bpmFormService.queryInfoByCode(bpmCode, projectId);if(variables==null){variables=new HashMap<>();}if(bpmForm!=null&&"1".equals(bpmForm.getCountersignature())){//会签模式Object xmlByKey = activitiFlowMapper.getXmlByKey(bpmForm.getResCode() + ".bpmn");Map<String, List<String>> stringListMap = bpmUtil.collectionUseMap(bpmForm, (byte[]) xmlByKey);variables.putAll(stringListMap);}if(CollUtil.isEmpty(variables)){taskService.complete(taskId);}else{taskService.complete(taskId,variables);}}@SneakyThrowspublic Map<String,List<String>> collectionUseMap(BpmForm bpmForm,byte[] resByte){Map<String,List<String>> result=new HashMap<>();if("0".equals(bpmForm.getCountersignature())){return result;}String resStr = new String(resByte);BpmnModel bpmnModel = ModelUtil.getBpmnModel(resStr);Collection<UserTask> allUserTaskEvent = ModelUtil.getAllUserTaskEvent(bpmnModel);if(CollUtil.isEmpty(allUserTaskEvent)){return result;}SysRoleVo sysRoleVo=new SysRoleVo();sysRoleVo.setProjectId(bpmForm.getProjectId());List<SysRoleVo> sysRoleVos = sysRoleService.queryList(sysRoleVo);SysDept sysDept=new SysDept();sysDept.setProjectId(bpmForm.getProjectId());List<SysDept> sysDepts = sysDeptService.queryList(sysDept);for(UserTask userTask:allUserTaskEvent){if(userTask.hasMultiInstanceLoopCharacteristics()){MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics();String inputDataItem = loopCharacteristics.getInputDataItem();String coll = inputDataItem.replace("${", "").replace("}", "");String[] groups = coll.split("_");if("ROLE".equals(groups[0])){List<String> idListByRoleId = getIdListByRoleId(groups[1], sysRoleVos).getUserIdList();if(CollUtil.isNotEmpty(idListByRoleId)){result.put(coll,idListByRoleId);}}else if("DEPT".equals(groups[0])){List<String> idListByDeptId = getIdListByDeptId(groups[1], sysDepts).getUserIdList();if(CollUtil.isNotEmpty(idListByDeptId)){result.put(coll,idListByDeptId);}}}}return result;}

流程审批

    @SneakyThrowspublic CompletResultVo orSignCompletHandle(String taskId, String result, String remark, String definitionKey, Map<String, Object> variables, String userName){Task task = taskService.createTaskQuery().taskId(taskId).singleResult();taskService.addComment(taskId, task.getProcessInstanceId(), result,remark);if(variables==null){variables=new HashMap<>();}variables.put("state",result);taskService.complete(taskId,variables);CompletResultVo completResultVo=new CompletResultVo();boolean afterHandle = afterHandle(task, userName, remark, result);completResultVo.setAuditEndState(afterHandle);return completResultVo;}boolean afterHandle(Task task,String userName,String remark,String result){//存储审核日志信息QueryWrapper queryWrapper=new QueryWrapper<>();queryWrapper.eq("process_instance_id",task.getProcessInstanceId());BussTask bussTask = bussTaskMapper.selectOne(queryWrapper);//日志记录
completByTaskLogHandle(bussTask,task,task.getProcessInstanceId(),userName,remark, result);//更新结束记录return endHandle(task.getProcessInstanceId(),bussTask,userName);}

判断流程结束后相关操作

    boolean endHandle(String piid,BussTask bussTask,String userName){List<Task> task1 = taskService.createTaskQuery().processInstanceId(piid).list();bussTaskMapper.updateById(bussTask);if(CollUtil.isEmpty(task1)){bussTaskMapper.updateStatus(piid,ProcessConstants.AUDIT_NO);endLogHandle(bussTask);return true;}return false;}

会签审批

    @SneakyThrowspublic CompletResultVo countersignCompletHandle(String taskId, String result, String remark,String definitionKey,String projectId,String userName,Long userId,BpmForm bpmForm){Task task = taskService.createTaskQuery().taskId(taskId).singleResult();String taskDefinitionKey = task.getTaskDefinitionKey();UserTask userTask = getUserTaskByNodeId(bpmForm.getResCode(), taskDefinitionKey);if(userTask==null){return orSignCompletHandle(taskId,result,remark,definitionKey,projectId,null,userName);}if(!userTask.hasMultiInstanceLoopCharacteristics()){return orSignCompletHandle(taskId,result,remark,definitionKey,projectId,null,userName);}MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics();String completionCondition = loopCharacteristics.getCompletionCondition();String codeByInfo = BpmCountersignTypeEnum.getCodeByInfo(completionCondition);Map<String,Object> variables=new HashMap<>();QueryWrapper queryWrapper=new QueryWrapper<>();queryWrapper.eq("process_instance_id",task.getProcessInstanceId());BussTask bussTask = bussTaskMapper.selectOne(queryWrapper);List<LogProcess> bussList = getLogs(bussTask.getBussId(), task.getProcessInstanceId());List<BpmCountersignRecord> bpmCountersignRecords=new ArrayList<>();if(CollUtil.isNotEmpty(bussList)){BpmCountersignRecord bpmCountersignRecord=new BpmCountersignRecord();bpmCountersignRecord.setExecutionId(bussList.get(0).getExecutionId());bpmCountersignRecords= bpmCountersignService.queryListByExeId(bpmCountersignRecord);}BpmCountersign bpmCountersignByTaskInfo = bpmCountersignService.getBpmCountersignByTaskInfo(task.getTaskDefinitionKey(), bussTask.getDefinitionKey());String[] user_split = bpmCountersignByTaskInfo.getUids().split(",");if("all".equals(codeByInfo)){if(ProcessConstants.AUDIT_NO.equals(result)){variables.put("pass",true);variables.put("state",ProcessConstants.AUDIT_NO);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,false,true,bussList);}else{if(user_split.length<=(bpmCountersignRecords.size()+1)){variables.put("pass",true);variables.put("state",ProcessConstants.AUDIT_YES);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,true,true,bussList);}else{variables.put("pass",false);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,false,false,bussList);}}}else if("half".equals(codeByInfo)){if(user_split.length<=(bpmCountersignRecords.size()+1)){int ok_users=0;for(BpmCountersignRecord bpm:bpmCountersignRecords){if(ProcessConstants.AUDIT_YES.equals(bpm.getAuditResult())){ok_users+=1;}}if(ProcessConstants.AUDIT_YES.equals(result)){ok_users+=1;}String state=null;BigDecimal divide = new BigDecimal(ok_users).divide(new BigDecimal(user_split.length), 2, BigDecimal.ROUND_HALF_UP)double doubleValue = divide.doubleValue();if(doubleValue>=0.5){state=ProcessConstants.AUDIT_YES;}else{state=ProcessConstants.AUDIT_NO;}variables.put("state",state);variables.put("pass",true);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,state.equals(ProcessConstants.AUDIT_YES)?true:false,true,bussList);}else{variables.put("pass",false);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,false,false,bussList);}}else if("single".equals(codeByInfo)){if(ProcessConstants.AUDIT_YES.equals(result)) {variables.put("pass",true);variables.put("state",ProcessConstants.AUDIT_YES);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,true,true,bussList);}else{if(user_split.length<=(bpmCountersignRecords.size()+1)){variables.put("pass",true);variables.put("state",ProcessConstants.AUDIT_NO);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,false,true,bussList);}else{variables.put("pass",false);taskService.complete(taskId,variables);countersignRecordHandle(task,bpmForm,userName,userId,bpmCountersignByTaskInfo,result,remark,bussTask,false,false,bussList);}}}CompletResultVo completResultVo=new CompletResultVo();List<LogProcess> bussList2 = getLogs(bussTask.getBussId(), task.getProcessInstanceId());String aname="";if(CollUtil.isNotEmpty(bussList2)){aname=bussList2.get(0).getAssigneeName();}else{aname= bussList.get(0).getAssigneeName();}boolean endHandle = endHandle(task.getProcessInstanceId(), bussTask, aname);completResultVo.setAuditEndState(endHandle);return completResultVo;}//日志及操作记录/**** @param task* @param bpmForm* @param userName* @param userId* @param bpmCountersignByTaskInfo* @param result 当前人的审核状态* @param remark* @param auditState 最终审核状态(会签)* @param isEnd 当前节点是否全部完成*/void countersignRecordHandle(Task task,BpmForm bpmForm,String userName,Long userId,BpmCountersign bpmCountersignByTaskInfo,String result,String remark,BussTask bussTask,boolean auditState,boolean isEnd,List<LogProcess> bussList){LogProcess logRecord=null;if(CollUtil.isEmpty(bussList)){logRecord=new LogProcess();logRecord.setProjectId(bpmForm.getProjectId());String myExeId=UUID.randomUUID().toString();logRecord.setExecutionId(myExeId);logRecord.setBusinessId(bussTask.getBussId());logRecord.setTaskId(task.getId());logRecord.setAssigneeName(bpmCountersignByTaskInfo.getUnames());logRecord.setAssignee(bpmCountersignByTaskInfo.getUids());logRecord.setInstanceId(task.getProcessInstanceId());logRecord.setDefinitionKey(bpmForm.getResCode());if(isEnd){logRecord.setStepType(auditState?ActivitiStepType.approved.getCode():ActivitiStepType.reject.getCode());}else{logRecord.setStepType(ActivitiStepType.unapproved.getCode());}logProcessMapper.insert(logRecord);}else{if(isEnd){logRecord = bussList.get(0);logRecord.setStepType(auditState?ActivitiStepType.approved.getCode():ActivitiStepType.reject.getCode());logProcessMapper.updateById(logRecord);}}BpmCountersignRecord bcr=new BpmCountersignRecord();bcr.setNodeId(task.getTaskDefinitionKey());bcr.setBpmCode(bpmForm.getCode());bcr.setUserId(userId+"");bcr.setUserName(userName);if(logRecord!=null){bcr.setLogId(logRecord.getId());}else{bcr.setLogId(bussList.get(0).getId());}bcr.setBusinessId(bussTask.getBussId());bcr.setAuditRemark(remark);bcr.setAuditResult(result);bcr.setExecutionId(logRecord.getExecutionId());bcr.setProcessInstanceId(task.getProcessInstanceId());bpmCountersignRecordMapper.insert(bcr);}

会签流程表达式枚举,全部通过即通过,半数通过即通过,一人通过即通过:

public enum BpmCountersignTypeEnum {all("all", "${nrOfCompletedInstances==nrOfInstances||pass==true}"),half("half", "${nrOfCompletedInstances/nrOfInstances&gt;=0.5&&pass==true}"),single("single", "${nrOfCompletedInstances>=1&&pass==true}");private final String code;private final String info;BpmCountersignTypeEnum(String code, String info){this.code = code;this.info = info;}public static String getCodeByInfo(String info){if(StringUtils.isBlank(info)){return null;}for(BpmCountersignTypeEnum bct:BpmCountersignTypeEnum.values()){String elEscape = EscapeUtil.elEscape(bct.info);if(info.equals(elEscape)){return bct.code;}}return null;}public String getCode(){return code;}public String getInfo(){return info;}
}

这里:

nrOfInstances:总实例数nrOfCompletedInstances:已完成实例数nrOfActiviteInstances:未完成的实例数

全部通过即通过和一人通过即通过直接处理即可,state是流线走向,按比例通过时,我这里用一张表记录了每次操作,即BpmCountersignRecord,将此次记录作为流程操作记录的子关联表,executionId作为关联键。

其他

每次流程启动表act_ge_bytearray中会出现如下图的数据,这就是会签流程里面的变量数据

当流程审批结束后,var-开头的数据就会消失,hist开头的是act_hi表中相关数据

相关文章:

java-activiti笔记

版本&#xff1a;activiti7 <dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>7.0.0.Beta2</version><exclusions><exclusion><groupId>org.mybatis</g…...

Layui——隐藏表单项后不再进行验证

目录 修改后的部分代码 修改后的完整代码 我编辑用户信息和添加新用户用的是同一个表单&#xff0c;不同的是编辑用户信息里没有密码项和确认密码项&#xff0c;但是把它们隐藏后仍然要进行验证&#xff0c;也就是说它们俩的验证并没有随着表单项的隐藏而关闭。原因&#xf…...

Github Copilot 使用技巧

&#x1f3af;目标读者 本文不包含如何安装 Github Copilot本文介绍了 Github Copilot 使用方法和一些技巧 本人已经使用 Github Copilot 2 年了&#xff0c;交了 3 次年费&#xff0c;每年 100$ 着实心痛&#xff0c;但是用着确实爽歪歪 但是感觉一直只用了一小部分功能&am…...

【实现100个unity特效之20】用unity实现物品悬浮和发光像素粒子特效

最终效果 文章目录 最终效果新增飞升粒子效果光圈效果修改不同颜色完结 新增飞升粒子效果 效果 光圈效果 效果 修改不同颜色 完结 赠人玫瑰&#xff0c;手有余香&#xff01;如果文章内容对你有所帮助&#xff0c;请不要吝啬你的点赞评论和关注&#xff0c;你的每一次支持…...

GPT-4o mini发布,轻量级大模型如何颠覆AI的未来?

从巨无霸到小巨人&#xff1a;GPT-4o Mini的创新之路 ©作者|潇潇 来源|神州问学 引言 随着人工智能技术的飞速进步&#xff0c;AI领域的竞争日益激烈&#xff0c;大型模型的发布几乎成为常态。然而&#xff0c;这些庞大的模型通常需要大量的计算资源和存储空间&#xff…...

高性能的 C++ Web 开发框架 CPPCMS + WebSocket 模拟实现聊天与文件传输案例。

1. 项目结构 2. config.json {"service": {"api": "http","port": 8080,"ip": "0.0.0.0"},"http": {"script": "","static": "/static"} }3. CMakeLists.txt…...

合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别

合合信息TextIn平台明星产品——国内通用票据识别&#xff0c;重磅更新&#xff01; 产品支持票据类型扩展到23大类、30小类&#xff0c;覆盖场景更全面&#xff0c;同时升级优化了多款票据识别模型&#xff0c;平均识别率较前版本提升11.5%&#xff0c;整体识别速度提升21.9%…...

LeetCode-day40-3151. 特殊数组 I

LeetCode-day40-3151. 特殊数组 I 题目描述示例示例1&#xff1a;示例2&#xff1a;示例3&#xff1a; 思路代码 题目描述 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 Aging 有一个整数数组 nums。如果 nums 是一个 特殊…...

技术研究:Redis 数据结构与 I/O 模型

数据结构 Redis之所以“快”&#xff0c;一方面因为它是内存数据库&#xff0c;所有操作都在内存上完成&#xff0c;内存的访问速度本来就快。另一方面则是因为高效的数据结构&#xff0c;使得操作键值效率较高。总体来说&#xff0c;Redis使用了一个用来保存每个Key/Value的全…...

46-扇孔的处理及铺铜以及布线

1.先连信号线 2.电源管脚,以如下方式处理&#xff1a; 引线打孔处理...

LVS实验的三模式总结

文章目录 LVS的概念叙述NAT工作模式实战案例**思想&#xff1a;**NAT工作模式的优点NAT工作模式的缺点 NAT工作模式的应用场景大致配置 route&#xff1a;打开路由内核功能 部署DR模式集群案例工作思想&#xff1a;大致工作图如下思路模型 具体配置与事实步骤补充 防火墙标签解…...

游戏安全入门-扫雷分析远程线程注入

前言 无论学习什么&#xff0c;首先&#xff0c;我们应该有个目标&#xff0c;那么入门windows游戏安全&#xff0c;脑海中浮现出来的一个游戏 – 扫雷&#xff0c;一款家喻户晓的游戏&#xff0c;虽然已经被大家分析的不能再透了&#xff0c;但是我觉得自己去分析一下还是极好…...

bert-base-chinese模型的完整训练、推理和一些思考

前言 使用google-bert/bert-base-chinese模型进行中文文本分类任务&#xff0c;使用THUCNews中文数据集进行训练&#xff0c;训练完成后&#xff0c;可以导出模型&#xff0c;进行预测。 项目详细介绍和数据下载 数据集下载地址 Github完整代码 现记录训练过程中的一些感悟…...

JS基础5(JS的作用域和JS预解析)

JS的作用域 1. 全局作用域 全局作用域是在代码的任何地方都能访问到的最外层作用域。在浏览器环境下&#xff0c;全局作用域就是window对象&#xff0c;因此所有在全局作用域中声明的变量和函数都会成为window对象的属性和方法。 var globalVar "I am global"; …...

Doris 夺命 30 连问!(中)

导言 抱歉&#xff0c;作为从 S2 开始的骨灰级玩家看到 EDGUZI 官宣首发上线&#xff0c;兴奋之余忘了写文档 - -||&#xff0c;还望各位看官老爷见谅&#xff0c;这次错了&#xff0c;下次还敢 ^_^ 这是继上次的 30 问上篇的中篇&#xff0c;也是 10 个问题&#xff0c;有些…...

书生.浦江大模型实战训练营——(四)书生·浦语大模型全链路开源开放体系

最近在学习书生.浦江大模型实战训练营&#xff0c;所有课程都免费&#xff0c;以关卡的形式学习&#xff0c;也比较有意思&#xff0c;提供免费的算力实战&#xff0c;真的很不错&#xff08;无广&#xff09;&#xff01;欢迎大家一起学习&#xff0c;打开LLM探索大门&#xf…...

SpringBoot 整合 RabbitMQ 实现延迟消息

一、业务场景说明 用于解决用户下单以后&#xff0c;订单超时如何取消订单的问题。 用户进行下单操作&#xff08;会有锁定商品库存、使用优惠券、积分一系列的操作&#xff09;&#xff1b;生成订单&#xff0c;获取订单的id&#xff1b;获取到设置的订单超时时间&#xff0…...

Cilium:基于开源 eBPF 的网络、安全性和可观察性

基于 eBPF 的网络、安全性和可观察性 Cilium 是一种开源的云原生解决方案&#xff0c;它利用 Linux 内核中的 eBPF 技术来提供、保护和监控工作负载之间的网络连接。 什么是 eBPF&#xff1f; eBPF 是一项源自 Linux 内核的技术&#xff0c;允许沙盒程序在特权上下文&#x…...

Axios 详解与使用指南

Axios 详解与使用指南 1. Axios 简介 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;能够在浏览器和 Node.js 环境中运行。它提供了一种简便的方式来执行 HTTP 请求&#xff0c;并支持多种请求方法&#xff0c;如 GET、POST、PUT、DELETE 等。Axios 的配置灵活&#x…...

深度学习 —— 个人学习笔记20(转置卷积、全卷积网络)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 三十九、转置卷积 import torch from torch import nndef trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...