Serie Java integrada de código bajo: cree complementos personalizados de manera eficiente

Prefacio

A medida que el desarrollo de software avanza rápidamente y las demandas continúan creciendo, los desarrolladores enfrentan más presiones y desafíos. Los métodos de desarrollo tradicionales requieren mucho tiempo y energía, y la aparición de plataformas de desarrollo de código bajo proporciona a los desarrolladores un método de desarrollo más eficiente y rápido. Hoy, el editor tomará como ejemplo la creación de un complemento de comando para mostrar cómo utilizar el lenguaje Java para crear de manera eficiente un complemento personalizado.

Preparación ambiental

  • Herramienta de construcción de complementos de cuadrícula de tipo móvil: versión Java (forguncyJavaPluginGenerator)
  • Diseñador de cuadrículas de tipos móviles (versión v10.0 y superior)
  • Compilador IDE (por ejemplo, IntelliJ IDEA Community Edition)
  • Entorno de ejecución de Java
  • Versión JDK8.0 y superior

generador de complementos

Abra el enlace de la versión Java de la herramienta Generador de complementos Java de Forguncy ( forguncyJavaPluginGenerator ) y descargue el [Generador de complementos Java de Forguncy]. Se recomienda utilizar la versión del paquete comprimido.

Abra [forguncyJavaExtensionGenerateTool.exe] y configure la información básica del complemento en la siguiente interfaz:

Haga clic para crear el complemento de comando del servidor. Una vez completada la creación, el archivo del proyecto se generará en el conjunto de directorios correspondiente:

A continuación, utilice el compilador IDE para abrir el proyecto MyPlugin. Después de abrirlo, el directorio del proyecto se muestra a continuación:

Hasta ahora, se ha completado el trabajo de preparación preliminar. A continuación, escribiremos la lógica del código.

Código

Agregar dependencias

Antes de implementar el código, primero debemos agregar algunas dependencias relacionadas con la cuadrícula de tipos móviles. Como se muestra a continuación, debemos agregar las siguientes dependencias al archivo pom:

Simplemente reemplace Icon.png y PluginLogo.png con el ícono y el logotipo del complemento.

Y [PluginConfig.json] se utiliza para configurar la información básica del complemento:

{
  "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"                    // 插件支持依赖最低活字格版本
}

Escribir lógica de código central

Después de completar la configuración anterior, puede escribir la lógica del complemento. El siguiente es un código de muestra del complemento, que genera principalmente una firma de número aleatorio a través de 5 parámetros (AppSecret, ID de solicitud, marca de tiempo, datos y resultado de la firma).

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();
    }
}

Utilice maven para empaquetar complementos

Una vez escrito el código, empaquete todo el proyecto: haga clic en [limpiar] aquí y luego haga clic en [instalar]:

Luego, el producto empaquetado aparecerá en el directorio [destino]:

Luego instale el complemento zip empaquetado en el diseñador de cuadrícula de tipos móviles y utilícelo.

Cree un nuevo comando y podrá encontrar el complemento que acaba de empaquetar en la selección de comandos.

Complete los parámetros:

Esto se puede probar en el comando del lado del servidor:

Como puede ver, se devuelve una firma de número aleatorio en los resultados de la prueba anteriores. De esta forma, se ha desarrollado un complemento creado en lenguaje Java.

Resumir

Lo anterior es todo el proceso de cómo usar Java para desarrollar un complemento de comando en una plataforma de código bajo. Si desea obtener más información, haga clic aquí para ver.

Enlace de extensión:

Desde el basado en formularios hasta el basado en modelos, interprete la tendencia de desarrollo de las plataformas de desarrollo de código bajo

¿Qué es una plataforma de desarrollo de código bajo?

La gestión de versiones basada en sucursales ayuda a que el código bajo pase de la entrega de proyectos al desarrollo de productos personalizados.

¡Compañero pollo deepin-IDE de "código abierto" y finalmente logró el arranque! Buen chico, Tencent realmente ha convertido Switch en una "máquina de aprendizaje pensante" Revisión de fallas de Tencent Cloud del 8 de abril y explicación de la situación Reconstrucción de inicio de escritorio remoto de RustDesk Cliente web Base de datos de terminal de código abierto WeChat basada en SQLite WCDB marcó el comienzo de una actualización importante Lista de abril de TIOBE: PHP cayó a un mínimo histórico, Fabrice Bellard, el padre de FFmpeg, lanzó la herramienta de compresión de audio TSAC , Google lanzó un modelo de código grande, CodeGemma , ¿te va a matar? Es tan bueno que es de código abierto: herramienta de edición de carteles e imágenes de código abierto
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

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