当前位置: 首页 > 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[…...

解决Mac系统Python3.12版本pip安装报错error: externally-managed-environment的问题

遇到的问题 在Mac安装了Python3.12.x版本&#xff08;3.12.3、3.12.4&#xff09;后&#xff0c;当尝试pip3 install xxx的时候&#xff0c;总是报错&#xff1a;error: externally-managed-environment error: externally-managed-environment This environment is external…...

lvm知识终结

、什么是 LVM LVM 是 Linux 下对磁盘分区进行管理的一种工具&#xff0c;适合管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小 lvm 常用的命令 功能 PV 管理命令 VG 管理命令 LV 管理命令 scan 扫描 pvscan vgscan lvscan create 创建 pvcreate v…...

ESP32S3 IDF 对 16路输入输出芯片MCP23017做了个简单的测试

这次还是使用了idf老版本4.4.7&#xff0c;上次用了5.3&#xff0c;感觉不好用&#xff0c;官方的MCP23017芯片是英文版&#xff0c;真的很难读明白&#xff0c;可能是我英语水平不够吧。先看看每个寄存器的功能&#xff1a; IODIRA 和 IODIRB: 输入/输出方向寄存器 IPOLA 和 I…...

【技术前沿】Flux.1部署教程入门--Stable Diffusion团队最前沿、免费的开源AI图像生成器

项目简介 FLUX.1 是一种新的开源图像生成模型。它由 Stable Diffusion 背后的团队 Black Forest Labs 开发。 官网中有以下功能开源供大家参考&#xff1a; FLUX.1 擅长在图像中准确再现文字&#xff0c;因此非常适合需要清晰文字或短语的设计。无论是标牌、书籍封面还是品牌…...

Redis 的 STREAM 和 RocketMQ 是两种不同的消息队列和流处理解决方案,它们在设计理念、功能和用途上有显著区别。以下是它们的主要区别:

20240813 Redis 的 STREAM 和 RocketMQ 是两种不同的消息队列和流处理解决方案&#xff0c;它们在设计理念、功能和用途上有显著区别。以下是它们的主要区别&#xff1a;1. 使用 Redis 的 Sorted Set 数据结构连接到 Redis示例用法添加事件获取滑动窗口内的事件移除过期事件连接…...

Visual Studio Code安装与C/C++语言运行(上)

Visual Studio Code&#xff08;VS Code&#xff09;作为微软开发的一款轻量级但功能强大的源代码编辑器&#xff0c;广泛应用于各种编程语言的开发&#xff0c;包括C/C。以下将详细介绍VS Code的安装过程以及与C/C语言运行环境的配置。 一、Visual Studio Code的安装 1. 准备…...

探索数据可视化,数据看板在各行业中的应用

数据可视化是一种通过图形化手段将数据呈现出来的技术&#xff0c;它将复杂的数据和信息转化为易于理解的图表、地图、仪表盘等视觉元素&#xff0c;使得数据的模式、趋势和关系更加直观地展现出来。通过数据可视化&#xff0c;用户可以快速识别重要信息、发现潜在问题&#xf…...

haralyzer 半自动,一次性少量数据采集快捷方法

使用场景&#xff1a;半自动&#xff0c;一次性少量数据采集需求在工作中还是不少遇到的&#xff0c;无论使用模拟的方式&#xff0c;或者破解都不太划算。其实这种需求&#xff0c;使用半自动爬虫是最简单的。不需要考虑网站反爬虫的问题&#xff0c;因为你使用的就是真实的浏…...

mall-admin-web-master前端项目下载依赖失败解决

碰壁后的总结 pythone 环境 2.XX版本&#xff0c;切记不要3.0以上的。node 16.x不能太高 错误案例 npm ERR! code 1 npm ERR! path D:\workspace\springBootMall\mall-admin-web-master\node_modules\node-sass npm ERR! command failed npm ERR! command C:\windows\system…...

【07】JVM是怎么实现invokedynamic的

在Java中&#xff0c;方法调用会被编译为invokeStatic&#xff0c;invokeSpecial&#xff0c;invokVirtual以及invokeInterface四种指令。这些指令与包含目标方法类名、方法名以及方法描述符的符号引用捆绑&#xff0c;在实际运行之前&#xff0c;JVM根据这个符号引用链接到具体…...