序文
ソフトウェア開発が急速に発展し、需要が増大し続けるにつれて、開発者はより多くのプレッシャーと課題に直面しています。従来の開発方法は多くの時間とエネルギーを必要としますが、ローコード開発プラットフォームの出現により、開発者はより効率的で高速な開発方法を得ることができます。今日、エディターはコマンド プラグインの構築を例として、Java 言語を使用してカスタム プラグインを効率的に構築する方法を示します。
環境整備
- Movable Type グリッドプラグイン構築ツール - Java版(forguncyJavaPluginGenerator)
- Movable Type グリッド デザイナー(v10.0 バージョン以降)
- IDE コンパイラー (IntelliJ IDEA Community Edition など)
- Javaランタイム環境
- JDK8.0以降のバージョン
プラグインジェネレーター
Forguncy Java Plugin Generator ツール - Java バージョンのリンク ( forguncyJavaPluginGenerator ) を開き、[Forguncy Java Plugin Generator] をダウンロードします。圧縮パッケージ版を使用することをお勧めします。
[forguncyJavaExtensionGenerateTool.exe]を開き、以下のインターフェースでプラグインの基本情報を設定します。
クリックしてサーバー コマンド プラグインを作成します。作成が完了すると、対応するディレクトリ セットにプロジェクト ファイルが生成されます。
次に、IDE コンパイラを使用して MyPlugin プロジェクトを開きます。開くと、プロジェクト ディレクトリは次のようになります。
ここまでで下準備は完了です。次にコードロジックを記述していきます。
コード
依存関係を追加する
コードを実装する前に、まず可動タイプ グリッドに関連する依存関係をいくつか追加する必要があります。以下に示すように、pom ファイルに依存関係を追加する必要があります。
Icon.png と PluginLogo.png をプラグインのアイコンとロゴに置き換えるだけです。
[PluginConfig.json] は、プラグインの基本情報を設定するために使用されます。
{
"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" // 插件支持依赖最低活字格版本
}
コアコードロジックを書く
上記の構成が完了したら、プラグイン ロジックを作成できます。以下はプラグインのサンプルコードです。主に 5 つのパラメーター (AppSecret、リクエスト ID、タイムスタンプ、データ、署名結果) を通じて乱数署名を生成します。
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();
}
}
Maven を使用してプラグインをパッケージ化する
コードを記述した後、プロジェクト全体をパッケージ化します。ここで [クリーン] をクリックし、次に [インストール] をクリックします。
次に、パッケージ化された製品が [target] ディレクトリに表示されます。
次に、パッケージ化された zip プラグインを可動型グリッド デザイナーにインストールして使用します。
新しいコマンドを作成すると、コマンド選択欄にパッケージ化したばかりのプラグインが表示されます。
パラメータを入力します。
これはサーバー側のコマンドでテストできます。
ご覧のとおり、上記のテスト結果では乱数署名が返されています。このようにして、Java言語を使用して構築されたプラグインが開発されました。
要約する
上記は、Java を使用してローコード プラットフォームでコマンド プラグインを開発する方法の全プロセスです。詳細を知りたい場合は、ここをクリックして参照してください。
拡張リンク:
フォーム駆動からモデル駆動へ、ローコード開発プラットフォームの開発トレンドを読み解く
ブランチベースのバージョン管理は、プロジェクトの提供からカスタマイズされた製品開発へのローコード移行を支援します
仲間のニワトリがDeepin-IDE を 「オープンソース」化し、ついにブートストラップを達成しました。 いい奴だ、Tencent は本当に Switch を「考える学習機械」に変えた Tencent Cloud の 4 月 8 日の障害レビューと状況説明 RustDesk リモート デスクトップ起動の再構築 Web クライアント WeChat の SQLite ベースのオープンソース ターミナル データベース WCDB がメジャー アップグレードを開始 TIOBE 4 月リスト: PHPは史上最低値に落ち、 FFmpeg の父であるファブリス ベラールはオーディオ圧縮ツール TSAC をリリースし 、Google は大規模なコード モデル CodeGemma をリリースしました 。それはあなたを殺すつもりですか?オープンソースなのでとても優れています - オープンソースの画像およびポスター編集ツール