如何使用C#编写低代码应用插件

本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前言

作为当今快速发展的技术之一,低代码平台为开发人员提供了更高效、更简便的工具和方法,以快速构建和部署应用程序。现在市面上的大部分低代码平台可以满足大部分日常的需求,但对于一些定制化并且低代码平台无法实现的需求,如何解决呢?最常见的方法就是对低代码平台的功能进行扩展(低代码插件)。因此,今天小编将以葡萄城的企业级低代码开发平台——活字格为例为的大家介绍如何使用C#编写一个低代码插件。

操作步骤

第1步:环境准备

开发活字格插件之前,需要下载并安装活字格设计器及集成开发环境。

集成开发环境,这里推荐免费下载安装 VisualStudio 2022 社区版

安装VisualStudio 2022 社区版步骤

  1. 打开链接https://visualstudio.microsoft.com/zh-hans/vs/community/,点击“下载Visual Studio按钮”。

  2. 下载后双击打开,看到以下界面, 勾选".Net 桌面开发",其他保持默认配置,点击Next即可。

如果提示系统版本不支持,需要升级Windows

  1. 系统要求。
  2. Windows 11 版本 21H2 或更高版本:家庭版、专业版、专业教育版、专业工作站版、企业版和教育版。
  3. Windows 10 版本 1909 或更高版本:家庭版、专业版、教育版和企业版。

下载插件构建器

活字格插件构建器是一个开源项目,使用插件构建器构建活字格插件项目会获得以下好处

  1. 自动添加活字格插件开发所需依赖,生成一个工程开箱即用,直接找到对应的文件添加业务逻辑即可。
  2. 添加前端接口描述文件 (.d.ts)。
  3. 支持前端JS代码热更新(不用重启活字格设计器,修改js文件后保存再刷新页面,即可应用最新变更)。
  4. 支持Cs代码热更新(编译插件工程后,不用重新安装插件,只需重启活字格设计器即可应用最新变更)。
  5. 自动打包(编译后自动在bin目录下生成打包好的 zip 插件包)。

下载活字格插件构建器步骤

  1. 打开https://gitee.com/grape-city-software/forguncy-plugin-project-creator, 点击最新的发行版。

  2. 打开发行版页面后点击下载 forguncyPluginBuilder.zip 文件。

  3. 解压缩后可以看到两个子文件。

  4. 在bin目录下找到 ForguncyPluginCreator.exe 文件,双击打开。

  5. 可以看到以下界面

  6. 直接点击OK。

  7. 在“文档\HZG-Plugins\MyPlugin”目录下找到“MyPlugin.sln”文件,双击打开。

  8. 在VisualStudio 里找到并点击菜单 “生成->生成解决方案”。

  9. 编译成功后,打开活字格设计器,在单元格类型选择下拉列表中可以看到多了一个单元格类型“我的插件单元格”,第一个插件已经开发完成了。

第2步:插件开发

1.完成一个自定义插件的开发

公式类型属性:

1.1创建公式属性

(1)在插件中增加一个公式类型的属性(单元格、命令、服务端命令)。

// 这样就可以增加一个公式类型的属性了,具体结果可以参考帮助手册插件开发文档
[FormulaProperty]
public object MyFormulaProperty{ get; set; }

(2)支持换行输入。

// 运行用户输入的时候,可以按住Alt+Enter换行输入
[FormulaProperty(AcceptsReturn = true)]
public object MyFormulaProperty{ get; set; }

(3)支持输入只能选择一个页面上的单元格。

// 前端命令中,可以引用页面上一些单元格的位置,我们可以通过这个属性,让输入只能是页面上某一个单元格,而不是一个复杂的公式,或者一块区域
[FormulaProperty(OnlySupportCell = true)]
public object MyFormulaProperty{ get; set; }

1.2使用公式属性

(1)单元格插件和命令插件的公式的计算是一样的。

/**
首先计算公式时,需要函数中传递一个参数(IServerCommandExecuteContext dataContext),
需要通过参数的一个函数来执行,而参数的来源就是服务端命令中ExecuteAsync,
示例中是直接在服务端命令执行过程中调用的
**/
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
      // 这里await是异步执行,可以不做理解,照这样子使用即可
      /**
      其他地方若是想要调用计算公式的函数,
     需要将IServerCommandExecuteContext dataContext作为函数的一个参数,
     在调用的时候将dataContext传入
     **/
      var propCalcedValue = await dataContext.EvaluateFormulaAsync(this.MyFormulaProperty);
}

(2)服务端命令的公式计算有些区别,是在C#(也就是CS文件)中计算的。

/**
首先计算公式时,需要函数中传递一个参数(IServerCommandExecuteContext dataContext),
需要通过参数的一个函数来执行,而参数的来源就是服务端命令中ExecuteAsync,
示例中是直接在服务端命令执行过程中调用的
**/
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
      // 这里await是异步执行,可以不做理解,照这样子使用即可
      /**
      其他地方若是想要调用计算公式的函数,
     需要将IServerCommandExecuteContext dataContext作为函数的一个参数,
     在调用的时候将dataContext传入
     **/
      var propCalcedValue = await dataContext.EvaluateFormulaAsync(this.MyFormulaProperty);
}

(3)有一点需要注意,单元格插件和命令插件的公式执行虽然一样,但是获取属性函数是不一样的。

// 这个是单元格插件获取属性值
const formula = this.CellElement.CellType.MyFormulaProperty;

// 这个是命令插件获取属性值
const formula = this.CommandParam.MyFormulaProperty;

支持返回结果(命令、服务端命令):

1.3创建对应属性

[ResultToProperty]
[DisplayName("返回结果到变量")]
public string Result { get; set; } = "结果";

1.4给返回结果属性赋值

// 命令插件赋值给变量是在JS文件中,通过活字格提供的函数给对应的变量“Result”赋值
Forguncy.CommandHelper.setVariableValue(this.CommandParam.Result, value);

// 服务端命令赋值是在CS文件中,仍然是通过dataContext这个变量给对应的变量命令“Result”赋值
dataContext.Parameters[Result] = value;

1.5属性校验

属性校验是我们在定义属性的中一个不可获取的一环,比如必填,数据范围等。

(属性校验 - 活字格V9帮助手册 - 葡萄城产品文档中心 (grapecity.com.cn))

// 标注Required属性,该属性在用户输入中,就是必填的,当然这个属性不限制属性的类型,所有的属性都是可以标注的
[Required]
public string Name { get; set; }

// 字符串类型的属性,可以通过下面属性定义最大长度和最小长度
[MaxLength(6)]
[MinLength(1)]
public string Name { get; set; }

// 整数或者小数类型的属性,可以通过下面的属性定义可填的返回
[Range(0,100)]
public double Money { get; set; }

想要了解更多属性命名空间的特性请点击这里。

JS-C#互相传值(单元格、命令)

1.6 JS文件获取用户输入的属性值

// 单元格类型的命令,一般是在onPageLoaded()函数中执行的
onPageLoaded() {
      const formula = this.CellElement.CellType.MyProperty;
      const result = this.evaluateFormula(formula)
}

// 命令类型的命令,一般是在execute()函数中执行的
execute() {
      const formula = this.CommandParam.MyProperty;
      const result = this.evaluateFormula(formula);
}

1.7 JS文件将计算后的结果返回

// 命令类型的插件,在执行完对应的逻辑之后,会有一个执行结果数据,需要将这个执行结果返回给用户
Forguncy.CommandHelper.setVariableValue(this.CommandParam.Result, res);

1.8引用外部第三方JS文件(单元格、命令)

(1)将JavaScript和CSS文件拷贝到插件中Resources目录下。

(2)然后在PluginConfig.json文件中,引用这个文件就可以正常使用了。

2代码调试

2.1前端代码调试

前端代码调试比较简单,当活字格安装好插件之后,直接在活字格运行应用就可以调试,而调试工具就是浏览器,在活字格页面执行完插件命令之后,在浏览器源代码里,找到Forguncy,下的Plugin对应插件名称下的JS文件,就可以直接打断点调试了。

2.1后端代码调试

后端代码调试,比前端代码调试复杂一些,调试的工具是Visual Studio,需要在活字格中将应用Run起来,Run起来之后可以看到应用的访问地址:http://localhost:11574/Forguncy。

在Visual Studio中操作如下(首先得有对应插件源代码),点击菜单栏的调试,找到附加到进程。

点击进去,然后在搜索栏,输入Forguncy,就可以看到和活字格相关的所有进程信息了,然后在命令行一列找到我们前面记录有对应的端口号的URL,然后点击附加,就可以正常调试了。

总结

本文从环境准备到插件开发,以及最后的代码调试,从头到尾为大家介绍了如何实现一个低代码插件,从而满足低代码开发当中的一些特殊需求,通过本文的指导,读者可以深入了解低代码平台的插件开发流程,为低代码应用开发提供更多可能性。

扩展链接:

Redis从入门到实践

一节课带你搞懂数据库事务!

Chrome开发者工具使用教程

从表单驱动到模型驱动,解读低代码开发平台的发展趋势

低代码开发平台是什么?

基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/166802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis五大常见数据结构的操作命令(string, hash, list, set和zset)

string redis的string&#xff0c;直接按照二进制&#xff08;不做任何的转换&#xff0c;存的是什么取出来的依旧是什么&#xff09;的方式存储。所以string不仅仅可以存储文本数据&#xff0c;还可以存储整数&#xff0c;JSON&#xff0c;xml甚至音视频。但是string的大小最…

数据结构与算法之美学习笔记:21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?

目录 前言什么是哈希算法&#xff1f;应用一&#xff1a;安全加密应用二&#xff1a;唯一标识应用三&#xff1a;数据校验散列函数解答开篇内容小节 前言 本节课程思维导图 如果你是 一名工程师&#xff0c;你会如何存储用户密码这么重要的数据吗&#xff1f;仅仅 MD5 加密一下…

08.智慧商城——购物车布局、全选反选、功能实现

01. 购物车 - 静态布局 基本结构 <template><div class"cart"><van-nav-bar title"购物车" fixed /><!-- 购物车开头 --><div class"cart-title"><span class"all">共<i>4</i>件商品…

性格急躁怎么办?如何改变急躁的性格?

性格急躁很多人可能都有&#xff0c;有的人只是有过&#xff0c;而有些人持续的有&#xff0c;而且越来越频繁&#xff0c;要说偶尔出现性格急躁也算不上什么大问题&#xff0c;可是当急躁成了一种人格特征&#xff0c;或者说急躁是在一段时间内持续的&#xff0c;那么这问题就…

深度学习系列54:使用 MMDETECTION 和 LABEL-STUDIO 进行半自动化目标检测标注

参考https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/label_studio.html&#xff0c;这里进行简要概述&#xff1a; 1. 启动目标检测服务 在mmdetection文件夹中&#xff0c;执行 label-studio-ml start projects/LabelStudio/backend_template --with \ conf…

【LeetCode】每日一题 2023_11_20 最大子数组和(dp)

文章目录 刷题前唠嗑题目&#xff1a;最大子数组和题目描述代码与解题思路 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 今天是一道 LeetCode 的经典题目&#xff0c;如果是 LeetCode 老手&#xff0c;估计都刷过&#xff0c;话是这么说&#xff0c;但咱…

STM32存储左右互搏 SPI总线FATS文件读写FLASH W25QXX

STM32存储左右互搏 SPI总线FATS文件读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库实现FATS文件操作W25Q各型号FLASH的例程。…

光纤的跳线和尾纤

光纤跳线和光纤尾纤在结构上、连接方式、应用场景等方面存在明显的区别。 光纤跳线有0.9、2.0、3.0&#xff0c;通常是区分光缆外径的。0.9光缆外径0.9mm的&#xff0c;2.0光缆外径2mm&#xff0c;3.0光缆外径3mm。 同时分单模光纤跳线和多模光纤跳线。单模一般是黄色&#xff…

C++ 十进制与十六进制转换

文章作者&#xff1a;里海 来源网站&#xff1a;里海C\C专栏 十进制与十六进制转换 #include <iostream> #include <string> using namespace std;//十进制整数转十六进制字符串 string DecimalToHex(long long decimal) {string hex "";while (de…

求二叉树的高度(可运行)

输入二叉树为&#xff1a;ABD##E##C##。 运行环境&#xff1a;main.cpp 运行结果&#xff1a;3 #include "bits/stdc.h" using namespace std; typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;int tag; }BiTNode,*BiTree;void createTree(BiTre…

好莱坞罢工事件!再次警醒人类重视AI监管,人工智能矛盾一触即发!

原创 | 文 BFT机器人 关注国外新闻的应该都知道&#xff0c;最近焦点新闻是好莱坞史上最大规模的一场罢工运动。这场维持118天的罢工运动&#xff0c;终于在11月9号早上12点在好莱坞宣布结束。这场罢工运动虽是演员工会和代表资方的影视制片人联盟的茅盾&#xff0c;但直接引发…

智达方通EPM,解决企业经营分析和管理难题

随着我国企业的不断发展&#xff0c;其战略目标也不断壮大&#xff0c;在企业经营活动和战略执行方面遇到的挑战随之增多&#xff0c;面临着业务、财务和企业目标不对等&#xff0c;工作执行力度不够、流程难跟踪&#xff0c;相关数据无法共享、信息闭塞等痛点。在此现状下&…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

pyhton重启Deployment和状态

import os import timefrom kubernetes import client, config# 指定配置文件路径 config.load_kube_config(config_fileconfig)# 创建 Kubernetes API 客户端 v1 client.AppsV1Api() v2 client.CoreV1Api() # 指定命名空间 namespace default# 指定 Deployments 名称列表 d…

Vue2基础-Vue对象进阶介绍1

文章目录 一、绑定样式绑定class样式绑定style样式总结 二、渲染条件渲染列表渲染语法key详解 三、Vue检测数据原理问题解决 四、收集表单数据五、过滤器定义语法: 六、内置指令回顾v-text指令:v-htmlcookie问题 v-clock指令v-oncev-pre 一、绑定样式 绑定class样式 <!-- …

【漏洞复现】浙大恩特CRM大客户系统sql注入0day(三)

漏洞描述 杭州恩软信息技术有限公司(浙大恩特)提供外贸管理软件、外贸客户管理软件等外贸软件,是一家专注于外贸客户资源管理及订单管理产品及服务的综合性公司。 浙大恩特客户资源管理系统中的T0140_editAction.entweb接口存在SQL注入漏洞,攻击者可通过此漏洞获取企业数…

OpenAI前CEO萨姆·阿尔特曼可能重返CEO职位;用LoRA微调LLM的实用技巧

&#x1f989; AI新闻 &#x1f680; OpenAI前CEO萨姆阿尔特曼可能重返CEO职位 摘要&#xff1a;据报道&#xff0c;OpenAI前CEO萨姆阿尔特曼有望重新担任CEO职位&#xff0c;并对公司董事会进行重大改变。微软等投资人正努力恢复阿尔特曼的职位&#xff0c;尽管董事会仍然是…

振弦式渗压计的安装方式及注意事项

振弦式渗压计的安装方式及注意事项 振弦式渗压计是一种常用的测量土壤水位的仪器&#xff0c;可以用于监测地下水位、土壤含水量、岩层渗透系数等参数。其原理是依靠振弦的共振频率变化来测量介质中的压力变化。 安装方式&#xff1a; 1.适当选取安装点&#xff1a;振弦式渗压…

网络安全涉及哪些方面?

1.系统安全&#xff1a;运行系统安全即保证信息处理和传输系统的安全。它侧重于保证系统正常运行&#xff0c;避免因为系统的损坏而对系统存储、处理和传输的消息造成破坏和损失&#xff0c;避免由于电磁泄露&#xff0c;产生信息泄露&#xff0c;干扰他人或受他人干扰。 2. 网…

安全测试工具分为 SAST、DAST和IAST 您知道吗?

相信刚刚步入安全测试领域的同学都会发现&#xff0c;安全测试领域工具甚多&#xff0c;不知如何选择&#xff01;其实安全测试工具大致分为三类&#xff1a;SAST、DAST和IAST。本文就带大家快速的了解这三者的本质区别&#xff01; SAST &#xff08;Static Application Secu…