Série Java integrada com baixo código: crie plug-ins personalizados com eficiência

Prefácio

À medida que o desenvolvimento de software se desenvolve rapidamente e as demandas continuam a crescer, os desenvolvedores enfrentam mais pressão e desafios. Os métodos tradicionais de desenvolvimento exigem muito tempo e energia, e o surgimento de plataformas de desenvolvimento de baixo código fornece aos desenvolvedores um método de desenvolvimento mais eficiente e rápido. Hoje, o editor usará a construção de um plug-in de comando como exemplo para mostrar como usar a linguagem Java para construir com eficiência um plug-in customizado.

Preparação ambiental

  • Ferramenta de construção de plug-in de grade de tipo móvel - versão Java (forguncyJavaPluginGenerator)
  • Designer de grade de tipo móvel (versão 10.0 e superior)
  • Compilador IDE (por exemplo, IntelliJ IDEA Community Edition)
  • Ambiente de execução Java
  • Versão JDK8.0 e superior

gerador de plugins

Abra o link da ferramenta Forguncy Java Plugin Generator - versão Java ( forguncyJavaPluginGenerator ) e baixe o [Forguncy Java Plugin Generator]. Recomenda-se usar a versão compactada do pacote.

Abra [forguncyJavaExtensionGenerateTool.exe] e configure as informações básicas do plug-in na seguinte interface:

Clique para criar o plug-in de comando do servidor. Após a conclusão da criação, o arquivo do projeto será gerado no conjunto de diretórios correspondente:

Em seguida, use o compilador IDE para abrir o projeto MyPlugin. Após a abertura, o diretório do projeto é mostrado abaixo:

Neste ponto, o trabalho de preparação preliminar foi concluído. A seguir, escreveremos a lógica do código.

Código

Adicionar dependências

Antes de implementar o código, primeiro precisamos adicionar algumas dependências relacionadas à grade de tipo móvel. Conforme mostrado abaixo, precisamos adicionar as seguintes dependências ao arquivo pom:

Basta substituir Icon.png e PluginLogo.png pelo ícone e logotipo do plug-in.

E [PluginConfig.json] é usado para configurar as informações básicas do plug-in:

{
  "assembly": [],                                    // 如需要加载其他类
  "javascript": [],                                  // 如需加载其他JavaScript文件
  "css": [],                                         // 如需加载其他css文件
  "image": "resources/PluginLogo.png",               // 需要加载图片的相对路径
  "description": "这是一个活字格插件",                 // 插件的文本描述信息
  "description_cn": "这是一个活字格插件",              // 插件的中文文本描述信息
  "name": "MyPlugin",                                // 插件名称
  "name_cn": "我的插件",                              // 插件中午名称
  "pluginType": "command",                           // 插件类型,当前为命令类型插件
  "guid": "fefeb164-ab98-48c8-b309-b5410052e504",    // 插件唯一标识GUID,建议勿修改
  "version": "1.0.0.0",                              // 插件版本
  "dependenceVersion": "10.0.0.0"                    // 插件支持依赖最低活字格版本
}

Escreva a lógica do código principal

Depois de concluir a configuração acima, você pode escrever a lógica do plug-in. A seguir está um exemplo de código do plug-in, que gera principalmente uma assinatura de número aleatório por meio de 5 parâmetros (AppSecret, ID da solicitação, carimbo de data / hora, dados e resultado da assinatura).

package org.example;

import com.grapecity.forguncy.LoggerContext;
import com.grapecity.forguncy.commands.ICommandExecutableInServerSide;
import com.grapecity.forguncy.commands.IServerCommandExecuteContext;
import com.grapecity.forguncy.commands.annotation.ResultToProperty;
import com.grapecity.forguncy.commands.annotation.common.Category;
import com.grapecity.forguncy.commands.entity.Command;
import com.grapecity.forguncy.commands.entity.ExecuteResult;
import com.grapecity.forguncy.commands.enumeration.CommandScope;
import com.grapecity.forguncy.plugincommon.common.annotation.*;
import lombok.Data;
import org.apache.commons.codec.binary.Base64;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.http.HttpServletRequest;

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

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

    @DisplayName(displayName = "AppSecret")
    @FormulaProperty
    @Required
    private String appSecret;

    @DisplayName(displayName = "请求ID")
    @FormulaProperty
    @Required
    private String requestId;

    @DisplayName(displayName = "时间戳")
    @FormulaProperty
    @Required
    private String timestamp;

    @DisplayName(displayName = "数据")
    @FormulaProperty
    @Required
    private String data;

    @ResultToProperty
    @FormulaProperty
    @DisplayName(displayName = "签名结果")
    private String resultTo = "结果";

    @Override
    public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
        Long innerTimestamp = Long.parseLong(timestamp);
        String res = null;
        try {
            res = sign(appSecret, requestId, innerTimestamp, data);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        try {
            dataContext.getParameters().put(resultTo, res);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

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

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

        return super.getDesignerPropertyVisible(propertyName, commandScope);
    }

    @Override
    public String toString() {
        return "签名程杰";
    }

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

    /**
     * 对字符串进行MD5加密,得到32位MD5值
     * @param text 明文
     * @return 密文
     */
    public static String md5(String text) {
        try {
            MessageDigest msgDigest = MessageDigest.getInstance("MD5");
            msgDigest.update(text.getBytes("UTF-8"));
            byte[] bytes = msgDigest.digest();
            // 转成16进制
            return new String(encodeHex(bytes));
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException("System doesn't support MD5 algorithm.");
        } catch (UnsupportedEncodingException e) {
            throw new IllegalStateException("System doesn't support your  EncodingException.");
        }
    }

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


    /**
     * base64编码
     *
     * @param content
     * @return
     * @throws Exception
     */
    public static String base64Encode(byte[] content) throws Exception {
        return Base64.encodeBase64String(content).replaceAll("(\\\r\\\n|\\\r|\\\n|\\\n\\\r)", "");
    }

    /**
     * base64解码
     *
     * @param content
     * @return
     * @throws Exception
     */

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

    /**
     * 转换成16进制
     * @param data
     * @return
     */
    private static char[] encodeHex(byte[] data) {
        int l = data.length;
        char[] out = new char[l << 1];
        // two characters form the hex value.
        for (int i = 0, j = 0; i < l; i++) {
            out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
            out[j++] = DIGITS[0x0F & data[i]];
        }
        return out;
    }
    public static String getPostData(HttpServletRequest request) {
        StringBuilder data = new StringBuilder();
        String line;
        BufferedReader reader;
        try {
            reader = request.getReader();
            while (null != (line = reader.readLine())) {
                data.append(line);
            }
        } catch (IOException e) {
            return null;
        }
        return data.toString();
    }
}

Use maven para empacotar plug-ins

Depois que o código for escrito, empacote todo o projeto: clique em [limpar] aqui e depois clique em [instalar]:

Então o produto empacotado aparecerá no diretório [target]:

Em seguida, instale o plug-in zip empacotado no designer de grade de tipo móvel e use-o.

Crie um novo comando e você poderá encontrar o plug-in que acabou de empacotar na seleção de comandos.

Preencha os parâmetros:

Isso pode ser testado no comando do lado do servidor:

Como você pode ver, uma assinatura numérica aleatória é retornada nos resultados do teste acima. Desta forma, foi desenvolvido um plug-in construído em linguagem Java.

Resumir

A descrição acima é todo o processo de como usar Java para desenvolver um plug-in de comando em uma plataforma de baixo código. Se você quiser saber mais informações, clique aqui para visualizar.

Link de extensão:

Do orientado ao formulário ao orientado ao modelo, interprete a tendência de desenvolvimento de plataformas de desenvolvimento de baixo código

O que é uma plataforma de desenvolvimento low-code?

O gerenciamento de versões baseado em filiais ajuda o low-code a passar da entrega do projeto para o desenvolvimento de produtos personalizados

Companheiro de frango, deepin-IDE de "código aberto" e finalmente conseguiu a inicialização! Bom cara, a Tencent realmente transformou o Switch em uma "máquina de aprendizagem pensante" Revisão de falhas e explicação da situação da Tencent Cloud em 8 de abril Reconstrução de inicialização de desktop remoto RustDesk Cliente Web Banco de dados de terminal de código aberto do WeChat baseado em SQLite WCDB inaugurou uma grande atualização Lista de abril TIOBE: PHP caiu para o nível mais baixo, Fabrice Bellard, o pai do FFmpeg, lançou a ferramenta de compressão de áudio TSAC , o Google lançou um grande modelo de código, CodeGemma , isso vai te matar? É tão bom que é de código aberto - ferramenta de edição de imagens e pôsteres de código aberto
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/powertoolsteam/blog/11052465
Recomendado
Clasificación