找回密码
 立即注册

QQ登录

只需一步,快速开始

Jack.Cheng
超级版主   /  发表于:2024-3-5 14:03  /   查看:2305  /  回复:0
本帖最后由 Jack.Cheng 于 2024-3-8 09:35 编辑

活字格本体可以扩展的插件分为三种类型,单元格类型插件、命令插件和服务端命令插件。
之前开发插件,需要掌握JavaScript和C#编程语言才可以,而在新版本中,服务端命令插件这一类型(单元格类型插件和命令插件暂未支持)的开发将会支持Java语言。本篇帖子将会为大家介绍这个新特性。

之前有个用户论坛有个帖子,我们以这个为背景,来介绍下Java开发服务端命令插件的步骤
论坛有一个客户分享了一个签名加密的Java代码,看看能不能改一下放进来(求指导活字格支不支持使用JAVA工具
https://gcdn.grapecity.com.cn/showtopic-196810-1-1.html
(出处: 葡萄城开发者社区))



第1步:使用forguncyJavaPluginGenerator构建工程
活字格Java Web Api生成工具(https://gitee.com/GrapeCity/forg ... /releases/tag/1.0.0),推荐使用压缩包版本创建。
如果压缩包版本闪退,是因为系统太老没有webview2,推荐使用msi安装包安装,或者更新系统到2018年4月之后的win10 或更高版本。

image.png176409911.png
完成后,在对应目录将会生成工程文件
image.png530650329.png
idea打开后工程文件结构如下
image.png865977783.png
MyPlugin是我们主类,后面主要业务需求在此处实现。

第2步:针对业务需求进行具体编码
pom中增加这些依赖
image.png583522033.png
Icon图片和PluginLogo图片替换如下
image.png961841735.png image.png925405578.png
PluginConfig中修改如下
image.png837215576.png
这是我的示例代码
  1. package org.example;

  2. import com.grapecity.forguncy.LoggerContext;
  3. import com.grapecity.forguncy.commands.ICommandExecutableInServerSide;
  4. import com.grapecity.forguncy.commands.IServerCommandExecuteContext;
  5. import com.grapecity.forguncy.commands.annotation.ResultToProperty;
  6. import com.grapecity.forguncy.commands.annotation.common.Category;
  7. import com.grapecity.forguncy.commands.entity.Command;
  8. import com.grapecity.forguncy.commands.entity.ExecuteResult;
  9. import com.grapecity.forguncy.commands.enumeration.CommandScope;
  10. import com.grapecity.forguncy.plugincommon.common.annotation.*;
  11. import lombok.Data;
  12. import org.apache.commons.codec.binary.Base64;

  13. import java.io.BufferedReader;
  14. import java.io.IOException;
  15. import java.io.UnsupportedEncodingException;
  16. import java.security.MessageDigest;
  17. import java.security.NoSuchAlgorithmException;
  18. import javax.servlet.http.HttpServletRequest;

  19. @Data
  20. @Icon( uri= "resources/Icon.png")
  21. @Category(category = "程杰合集")
  22. public class MyPlugin extends Command implements ICommandExecutableInServerSide {

  23.     private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

  24.     @DisplayName(displayName = "AppSecret")
  25.     @FormulaProperty
  26.     @Required
  27.     private String appSecret;

  28.     @DisplayName(displayName = "请求ID")
  29.     @FormulaProperty
  30.     @Required
  31.     private String requestId;

  32.     @DisplayName(displayName = "时间戳")
  33.     @FormulaProperty
  34.     @Required
  35.     private String timestamp;

  36.     @DisplayName(displayName = "数据")
  37.     @FormulaProperty
  38.     @Required
  39.     private String data;

  40.     @ResultToProperty
  41.     @FormulaProperty
  42.     @DisplayName(displayName = "签名结果")
  43.     private String resultTo = "结果";

  44.     @Override
  45.     public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
  46.         Long innerTimestamp = Long.parseLong(timestamp);
  47.         String res = null;
  48.         try {
  49.             res = sign(appSecret, requestId, innerTimestamp, data);
  50.         } catch (Exception e) {
  51.             throw new RuntimeException(e);
  52.         }
  53.         try {
  54.             dataContext.getParameters().put(resultTo, res);
  55.         } catch (Exception e) {
  56.             throw new RuntimeException(e);
  57.         }

  58.         ExecuteResult executeResult = new ExecuteResult();
  59.         executeResult.getReturnValues().put("结果", res);
  60.         return executeResult;
  61.     }

  62.     @Override
  63.     public boolean getDesignerPropertyVisible(String propertyName, CommandScope commandScope) {

  64.         return super.getDesignerPropertyVisible(propertyName, commandScope);
  65.     }

  66.     @Override
  67.     public String toString() {
  68.         return "签名程杰";
  69.     }

  70.     public static String sign(String appSecret, String requestId, Long timestamp, String data) throws Exception{
  71.         // 1.签名参数按自然升序排列,拼接上data
  72.         StringBuilder sb = new StringBuilder();
  73.         sb.append("appSecret=").append(appSecret).append("&")
  74.                 .append("requestId=").append(requestId).append("&")
  75.                 .append("timestamp=").append(timestamp)
  76.                 .append(data);
  77.         // 2.对签名字符串base64编码后获取32位md5值
  78.         // 2.对签名字符串base64编码后获取32位md5值
  79.         String base64Encode = base64Encode(sb.toString().getBytes("UTF-8"));
  80.         String md5Value = md5(base64Encode);
  81.         // 3.将得到的MD5值进行sha1散列,转换为16进制字符串
  82.         String sign = sha1(md5Value);
  83.         return sign;
  84.     }

  85.     /**
  86.      * 对字符串进行MD5加密,得到32位MD5值
  87.      * @param text 明文
  88.      * @return 密文
  89.      */
  90.     public static String md5(String text) {
  91.         try {
  92.             MessageDigest msgDigest = MessageDigest.getInstance("MD5");
  93.             msgDigest.update(text.getBytes("UTF-8"));
  94.             byte[] bytes = msgDigest.digest();
  95.             // 转成16进制
  96.             return new String(encodeHex(bytes));
  97.         } catch (NoSuchAlgorithmException e) {
  98.             throw new IllegalStateException("System doesn't support MD5 algorithm.");
  99.         } catch (UnsupportedEncodingException e) {
  100.             throw new IllegalStateException("System doesn't support your  EncodingException.");
  101.         }
  102.     }

  103.     /***
  104.      * SHA加密
  105.      * @return
  106.      */
  107.     public static String sha1(String content) throws Exception {
  108.         MessageDigest sha = MessageDigest.getInstance("SHA1");
  109.         byte[] byteArray = content.getBytes("UTF-8");
  110.         return new String(encodeHex(sha.digest(byteArray)));
  111.     }


  112.     /**
  113.      * base64编码
  114.      *
  115.      * @param content
  116.      * @return
  117.      * @throws Exception
  118.      */
  119.     public static String base64Encode(byte[] content) throws Exception {
  120.         return Base64.encodeBase64String(content).replaceAll("(\\\r\\\n|\\\r|\\\n|\\\n\\\r)", "");
  121.     }

  122.     /**
  123.      * base64解码
  124.      *
  125.      * @param content
  126.      * @return
  127.      * @throws Exception
  128.      */

  129.     public static byte[] base64Decode(String content) throws Exception {
  130.         return Base64.decodeBase64(content);
  131.     }

  132.     /**
  133.      * 转换成16进制
  134.      * @param data
  135.      * @return
  136.      */
  137.     private static char[] encodeHex(byte[] data) {
  138.         int l = data.length;
  139.         char[] out = new char[l << 1];
  140.         // two characters form the hex value.
  141.         for (int i = 0, j = 0; i < l; i++) {
  142.             out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
  143.             out[j++] = DIGITS[0x0F & data[i]];
  144.         }
  145.         return out;
  146.     }
  147.     public static String getPostData(HttpServletRequest request) {
  148.         StringBuilder data = new StringBuilder();
  149.         String line;
  150.         BufferedReader reader;
  151.         try {
  152.             reader = request.getReader();
  153.             while (null != (line = reader.readLine())) {
  154.                 data.append(line);
  155.             }
  156.         } catch (IOException e) {
  157.             return null;
  158.         }
  159.         return data.toString();
  160.     }
  161. }
复制代码

目前Java开发服务端命令插件时属性使用情况与C#一致,只是语法需要按照Java要求书写。

第3步:使用maven打包插件
在此处先点击clean,后点击install
image.png805855102.png
在target目录会出现产出物
image.png982929992.png

下面我们把插件进行安装后实际看看效果
image.png909423217.png
这是在服务端命令里面的样式
image.png354179686.png image.png351853331.png
这是在服务端命令中进行测试后
image.png180971984.png

近期和社区里一些插件开发者交流时候,他们说活字格支持Java开发插件实在是太好了,之前有些.NET中不太好找的硬件对接功能,在Java生态非常好实现,极大提高了他们的业务半径。

因此,活字格10出来后,大家可以充分利用Java生态的丰富性,开发相关的扩展插件了,同时C#生态也能利用到。这样子,可以降低项目交付中可能的技术风险,而且插件可以复用,降低了技术投入成本



评分

参与人数 6满意度 +30 收起 理由
真难想 + 5
wsh89757 + 5
zzry + 5
true + 5
13794930121 + 5
吴小胖 + 5

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部