使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发
开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎,可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现,展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。
项目概述
我们的工作流系统将包含以下功能:
- 使用 Elsa Workflows 创建和管理工作流。
- 在 Blazor 前端界面中展示工作流的任务列表。
- 用户能够执行工作流的任务(如审批、拒绝)。
- 支持任务状态更新和流程流转。
1. 安装依赖
首先,我们需要在 Blazor 项目中安装 Elsa Workflows 相关的 NuGet 包。
dotnet add package Elsa.Core
dotnet add package Elsa.Activities.Http
dotnet add package Elsa.Activities.Console
这些包将帮助我们集成 Elsa 引擎,并使用 HTTP 和控制台活动。
2. 设置 Elsa 配置和工作流引擎
在 Startup.cs 或 Program.cs 中配置 Elsa 工作流引擎。
using Elsa;
using Elsa.Persistence.EntityFramework.Core.Extensions;
using Elsa.Services;public class Program
{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddElsa(options => options.UseEntityFrameworkPersistence(options =>{options.UseSqlite("Data Source=elsa_workflows.db");}).AddConsoleActivities().AddHttpActivities());// Add Blazor Server Servicesservices.AddRazorComponents().AddInteractiveComponents();});
}
此配置初始化了 Elsa 工作流引擎,并将工作流数据存储在 SQLite 数据库中。你可以根据需要选择其他数据库存储类型。
3. 定义工作流
我们需要创建一个工作流并定义其步骤。假设我们创建一个审批流程工作流。
using Elsa.Builders;
using Elsa.Services;
using Elsa.Activities.Console;
using Elsa.Activities.Http;public class ApprovalWorkflow : IWorkflow
{public string Id => "ApprovalWorkflow";public void Build(IWorkflowBuilder builder){builder.StartWith<HttpRequestActivity>().Then<ApprovalTask>().Then<EndTask>();}
}
在这个例子中,ApprovalWorkflow 是我们定义的工作流,包含三个步骤:
- HttpRequestActivity:处理 HTTP 请求。
- ApprovalTask:审批任务,我们可以在这个步骤进行审批操作。
- EndTask:结束任务。
4. 实现审批任务
假设 ApprovalTask 是一个自定义活动,它负责执行审批操作。
using Elsa.Services;
using Elsa.ActivityResults;public class ApprovalTask : Activity
{protected override IActivityExecutionResult Execute(ActivityExecutionContext context){var taskId = context.GetInput<string>("TaskId");var approvalDecision = context.GetInput<string>("ApprovalDecision");// 处理审批决策if (approvalDecision == "Approve"){// 执行审批通过的操作}else{// 执行拒绝操作}return Done();}
}
5. Blazor 页面实现
接下来,我们在 Blazor 页面中创建一个用户界面,允许用户查看工作流并进行操作。
@page "/workflow/{workflowId}"@inject Elsa.Services.IWorkflowLaunchpad WorkflowLaunchpad
@inject IJSRuntime JSRuntime<h3>工作流审批</h3><p>Workflow ID: @workflowId</p><button @onclick="StartWorkflow">开始工作流</button>@if (isTaskPending)
{<h4>审批任务</h4><button @onclick="ApproveTask">通过</button><button @onclick="RejectTask">拒绝</button>
}@code {private string workflowId;private bool isTaskPending = false;protected override void OnParametersSet(){workflowId = (string)RouteData.Values["workflowId"];}private async Task StartWorkflow(){// 启动工作流var instance = await WorkflowLaunchpad.StartWorkflowAsync("ApprovalWorkflow", new { TaskId = "123" });isTaskPending = true;}private async Task ApproveTask(){// 审批通过await JSRuntime.InvokeVoidAsync("alert", "审批通过!");isTaskPending = false;}private async Task RejectTask(){// 审批拒绝await JSRuntime.InvokeVoidAsync("alert", "审批拒绝!");isTaskPending = false;}
}
在这个 Blazor 页面中:
StartWorkflow方法用于启动工作流并触发第一个 HTTP 请求活动。ApproveTask和RejectTask分别处理审批通过和拒绝操作。isTaskPending控制页面是否显示审批按钮。
6. 前端与 Elsa 的集成
Elsa 提供了 HTTP 请求活动,我们可以利用它在前端与工作流交互。Blazor 前端页面通过调用后端的 API 启动工作流,并通过状态更新来控制用户操作。
// HTTP 请求活动配置,接收任务数据并处理审批
public class HttpRequestActivity : Activity
{protected override IActivityExecutionResult Execute(ActivityExecutionContext context){// 获取工作流输入var taskId = context.GetInput<string>("TaskId");// 返回工作流状态或继续处理其他活动return Outcome("Approved");}
}
7. 工作流实例与状态管理
Elsa 工作流引擎会自动管理工作流实例和任务状态。如果你希望将工作流状态持久化到数据库中,你可以配置 Elsa 使用 Entity Framework 或其他持久化机制。
8. 数据库配置
在 Startup.cs 中,我们使用 SQLite 来持久化工作流实例。
services.AddElsa(options => options.UseEntityFrameworkPersistence(options =>{options.UseSqlite("Data Source=elsa_workflows.db");}).AddHttpActivities().AddConsoleActivities()
);
这将确保工作流和任务实例在数据库中存储。
9. 运行与调试
最后,确保你正确配置了数据库和工作流引擎,运行 Blazor 项目。在 Blazor 页面中启动工作流后,用户将看到审批任务,并能够进行审批操作。
10. 总结
这个示例展示了如何使用 Blazor 和 Elsa Workflows 创建一个简单的工作流系统,支持启动工作流、审批任务和前端交互。你可以根据实际需求,扩展工作流的复杂性,增加更多的任务、角色和权限控制。
进一步扩展:
- 用户管理:为不同的用户角色(如审批人、普通用户)设置不同的工作流操作权限。
- 通知功能:通过 SignalR 或其他方式实时通知用户任务状态变化。
- 自定义活动:根据需要,开发更多自定义活动来处理特殊任务。
相关文章:
使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发
开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎,可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现,展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。 项目概述 我们的工作流系统将包含以…...
Node.js 完全教程:从入门到精通
Node.js 完全教程:从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…...
elasticsearch 数据导出/导入
例子: 导出命令: elasticdump --inputhttps://elastic:elasticsearchlocalhost:9100/company --outputcompany.json --typedata --no-verify 注意,本地docker搭建,禁用自签证书验证,先设置环境变量 export NODE_TL…...
什么是三高架构?
大家好,我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性(High Availability)、高性能ÿ…...
Docker 单机快速部署大数据各组件
文章目录 一、Spark1.1 NetWork 网络1.2 安装 Java81.3 安装 Python 环境1.4 Spark 安装部署 二、Kafka三、StarRocks四、Redis五、Rabbitmq六、Emqx6.1 前言6.2 安装部署 七、Flink八、Nacos九、Nginx 一、Spark 1.1 NetWork 网络 docker network lsdocker network create -…...
CSS笔记基础篇01——选择器、文字控制属性、背景属性、显示模式、盒子模型
黑马程序员视频地址: 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodeshttps://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d3666…...
pytest全局配置文件pytest.ini
pytest.ini 改变 pytest 的默认行为,一般放在项目的根目录,不能包含中文符号。不管是主函数模式运行,命令行模式运行,都会去读取这个全局配置文件。 [pytest] ;配置命令行参数,用空格进行分隔。addopts 中的选项会被命…...
PyTest自学-认识PyTest
1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么? PyTest是一个自动化测试框架,支持单元测试和功能测试,有丰富的插件,如,pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…...
【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中,制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动,旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...
自旋锁与CAS
上文我们认识了许许多多的锁,此篇我们的CAS就是从上文的锁策略开展的新概念,我们来一探究竟吧 1. 什么是CAS? CAS: 全称Compare and swap,字⾯意思:“比较并交换”,⼀个CAS涉及到以下操作: 我们假设内存中…...
数组-二分查找
目录 算法思想: 实践: 备注: 二分查找是一种高效的查找算法,适用于在 有序数组 或列表中快速定位目标元素的索引。 重要事情说三遍:使用前提:数组有序,无重复,如果数组未排序&am…...
如何使用 Python 进行文件读写操作?
大家好,我是 V 哥。今天的内容来介绍 Python 中进行文件读写操作的方法,这在学习 Python 时是必不可少的技术点,希望可以帮助到正在学习 python的小伙伴。 以下是 Python 中进行文件读写操作的基本方法: 一、文件读取࿱…...
springcloud中的Feign调用
目录 一、基础应用 1.feign使用 1.增加feign依赖 2.编写feign接口 3.启用feign 4.调试 5.可能出现的异常信息 1.404 可能原因: 2.503 可有原因: 2.feign自定义配置 1.创建Feign配置类 2.feign接口 3.调试结果 3.feign多参数请求 Feign是Netflix开发的声明…...
【部署】将项目部署到云服务器
目录 1.获得服务器 2.连接到云服务器 3.配置环境 3.1.Java(运行后端所需) 3.2.MySQL数据库 3.3.Nginx(运行前端所需) 3.4. Node.js(构建前端所需) 4.打包项目 4.1.打包后端项目 4.2.打包前端项目…...
2024年AI大模型技术年度总结与应用实战:创新与突破并进
前言 回顾2024年,我一共发布了286篇博文,粉丝数也达到了43000多。这一年里,我收获颇丰,始终坚持AI大模型的研究方向,并且积极开展大模型的实战应用,也取得了一系列令人振奋的突破。 在286篇博文中&#…...
docker离线安装及部署各类中间件(x86系统架构)
前言:此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本:docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面,这里放在…...
SuperdEye:一款基于纯Go实现的间接系统调用执行工具
关于SuperdEye SuperdEye是一款基于纯Go实现的间接系统调用执行工具,该工具是TartarusGate 的修订版,可以利用Go来实现TartarusGate 方法进行间接系统调用。 该工具的目标是为了扫描挂钩的NTDLL并检索Syscall编号,然后使用它来执行间接系统调…...
PCL 新增自定义点类型【2025最新版】
目录 一、自定义点类型1、前言2、定义方法3、代码示例二、合并现有类型三、点云按时间渲染1、CloudCompare渲染2、PCL渲染博客长期更新,本文最近更新时间为:2025年1月18日。 一、自定义点类型 1、前言 PCL库自身定义了很多点云类型,但是在使用的时候时如果要使用自己定义的…...
Docker导入镜像
使用命令行进行处理: docker load < onething1_wxedge.tar如下图所示 查看状态 docker images...
PyTorch使用教程(9)-使用profiler进行模型性能分析
1、简介 PyTorch Profiler是一个内置的性能分析工具,可以帮助开发者定位计算资源(如CPU、GPU)的瓶颈,从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况,能够有效识别并解决性能瓶颈。 2、原…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
