diff --git a/chaincode/GeneralChainCode/java/pom.xml b/chaincode/GeneralChainCode/java/pom.xml
new file mode 100644
index 00000000..a1a8db0e
--- /dev/null
+++ b/chaincode/GeneralChainCode/java/pom.xml
@@ -0,0 +1,138 @@
+
+
+ 4.0.0
+
+ com.gvssimux
+ FabricGeneralChainCode
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+ UTF-8
+
+
+
+
+ aliyun
+ https://maven.aliyun.com/repository/public
+
+ true
+
+
+ true
+
+
+
+ jitpack.io
+ https://www.jitpack.io
+
+
+ artifactory
+ https://hyperledger.jfrog.io/hyperledger/fabric-maven
+
+
+
+
+
+
+
+ org.hyperledger.fabric-chaincode-java
+ fabric-chaincode-shim
+ 2.4.1
+
+
+ org.hyperledger.fabric-chaincode-java
+ fabric-chaincode-protos
+ 2.4.1
+
+
+ org.projectlombok
+ lombok
+ 1.18.22
+
+
+ org.apache.commons
+ commons-collections4
+ 4.4
+
+
+ org.apache.commons
+ commons-lang3
+ 3.12.0
+
+
+ commons-codec
+ commons-codec
+ 1.15
+
+
+ com.alibaba
+ fastjson
+ 1.2.79
+
+
+ com.owlike
+ genson
+ 1.5
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+
+
+
+ src/main/java
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 1.8
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.1.0
+
+
+ package
+
+ shade
+
+
+ chaincode
+
+
+ org.hyperledger.fabric.contract.ContractRouter
+
+
+
+
+ *:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/chaincode/GeneralChainCode/java/src/main/java/ChainCode.java b/chaincode/GeneralChainCode/java/src/main/java/ChainCode.java
new file mode 100644
index 00000000..c74083cc
--- /dev/null
+++ b/chaincode/GeneralChainCode/java/src/main/java/ChainCode.java
@@ -0,0 +1,100 @@
+/*
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import lombok.extern.java.Log;
+import org.apache.commons.collections4.IterableUtils;
+import org.hyperledger.fabric.contract.Context;
+import org.hyperledger.fabric.contract.ContractInterface;
+import org.hyperledger.fabric.contract.annotation.*;
+import org.hyperledger.fabric.shim.ChaincodeStub;
+import org.hyperledger.fabric.shim.ledger.KeyValue;
+import org.hyperledger.fabric.shim.ledger.QueryResultsIterator;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Contract(
+ name = "GeneralChainCode",
+ info = @Info(
+ title = "GeneralChainCode contract",
+ description = "The hyperlegendary FabricGeneralChainCode contract",
+ version = "0.0.1-SNAPSHOT",
+ license = @License(
+ name = "Apache 2.0 License",
+ url = "http://www.apache.org/licenses/LICENSE-2.0.html"),
+ contact = @Contact(
+ email = "gvssimux@qq.com",
+ name = "Shanzj",
+ url = "www.gvssimux.com")))
+@Default
+@Log
+public class ChainCode implements ContractInterface {
+
+ @Transaction
+ public void initLedger(final Context ctx) {
+ String value = "{\n" +
+ " \"name\":\"GeneralChainCode\",\n" +
+ " \"email\":\"gvssimux@qq.com\",\n" +
+ " \"author\":\"ShanZJ\",\n" +
+ " \"url\":\"www.gvssimux.com\"\n" +
+ '}';
+ ChaincodeStub stub = ctx.getStub();
+ stub.putStringState("FabricGeneralChainCode" , value);
+ }
+
+ @Transaction
+ public static QueryResultList richQuery(final Context ctx, String s) {
+ return InvokingMethod.richQuery(ctx,s);
+ }
+
+ @Transaction
+ public static QueryResultList queryAllByKey(final Context ctx, final String key){
+ return InvokingMethod.queryAllByKey(ctx,key);
+ }
+
+ @Transaction
+ public String queryData(final Context ctx, final String key) {
+ return InvokingMethod.queryData(ctx,key);
+ }
+
+ @Transaction
+ public static String createData(final Context ctx, String key, String jsonData) throws ClassNotFoundException {
+ return InvokingMethod.createData(ctx,key,jsonData);
+ }
+ @Transaction
+ public static String deleteData(final Context ctx, final String key){
+ return InvokingMethod.deleteData(ctx,key);
+ }
+
+ @Transaction
+ public static String updateData(final Context ctx, final String key,String value){
+ return InvokingMethod.updateData(ctx,key,value);
+ }
+
+
+
+
+
+ @Override
+ public void beforeTransaction(Context ctx) {
+ log.info("*************************************** beforeTransaction ***************************************");
+ }
+
+
+ @Override
+ public void afterTransaction(Context ctx, Object result) {
+ log.info("*************************************** afterTransaction ***************************************");
+ System.out.println("result --------> " + result);
+ }
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/chaincode/GeneralChainCode/java/src/main/java/InvokingMethod.java b/chaincode/GeneralChainCode/java/src/main/java/InvokingMethod.java
new file mode 100644
index 00000000..8a0ef0eb
--- /dev/null
+++ b/chaincode/GeneralChainCode/java/src/main/java/InvokingMethod.java
@@ -0,0 +1,116 @@
+/*
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import com.google.inject.internal.util.Lists;
+import lombok.extern.java.Log;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.hyperledger.fabric.contract.Context;
+import org.hyperledger.fabric.contract.annotation.Transaction;
+import org.hyperledger.fabric.shim.ChaincodeException;
+import org.hyperledger.fabric.shim.ChaincodeStub;
+import org.hyperledger.fabric.shim.ledger.KeyValue;
+import org.hyperledger.fabric.shim.ledger.QueryResultsIterator;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Log
+public class InvokingMethod {
+
+ @Transaction
+ public static QueryResultList richQuery(final Context ctx, String s) {
+ QueryResultList resultList = new QueryResultList();
+ QueryResultsIterator queryResult = ctx.getStub().getQueryResult(s);
+ List results = Lists.newArrayList();
+ if (! IterableUtils.isEmpty(queryResult)) {
+ for (KeyValue kv : queryResult) {
+ QueryResult Result = new QueryResult();
+ Result.setKey(kv.getKey());
+ Result.setJson(kv.getStringValue());
+ results.add(Result);
+ }
+ resultList.setResultList(results);
+ }
+ return resultList;
+ }
+
+ @Transaction()
+ public static QueryResultList queryAllByKey(final Context ctx, String key) {
+ ChaincodeStub stub = ctx.getStub();
+ final String startKey = key+"1";
+ final String endKey = key+"99";
+ QueryResultList resultList = new QueryResultList();
+ QueryResultsIterator queryResult = stub.getStateByRange(startKey, endKey);
+ List results = Lists.newArrayList();
+ if (! IterableUtils.isEmpty(queryResult)) {
+ for (KeyValue kv: queryResult) {
+ QueryResult Result = new QueryResult();
+ Result.setKey(kv.getKey());
+ Result.setJson(kv.getStringValue());
+ results.add(Result);
+ }
+ resultList.setResultList(results);
+ }
+ return resultList;
+ }
+
+
+
+
+ @Transaction
+ public static String queryData(final Context ctx, final String key) {
+ ChaincodeStub stub = ctx.getStub();
+ String State = stub.getStringState(key);
+ if (StringUtils.isBlank(State)) {
+ String errorMessage = String.format("key: %s does not exist", key);
+ System.out.println(errorMessage);
+ throw new ChaincodeException(errorMessage);
+ }
+ return State;
+ }
+
+ @Transaction
+ public static String createData(final Context ctx, final String key,String json) {
+ ChaincodeStub stub = ctx.getStub();
+ String teaAreaState = stub.getStringState(key);
+ if (StringUtils.isNotBlank(teaAreaState)) {
+ String errorMessage = String.format("key: %s already exists", key);
+ System.out.println(errorMessage);
+ throw new ChaincodeException(errorMessage);
+ }
+ stub.putStringState(key, json);
+ return json;
+ }
+
+ @Transaction
+ public static String deleteData(final Context ctx,final String key){
+ ChaincodeStub stub = ctx.getStub();
+ String state = stub.getStringState(key);
+ if (StringUtils.isBlank(state)){
+ String errorMessage = String.format("Key %s does not exist",key);
+ System.out.println(errorMessage);
+ throw new ChaincodeException(errorMessage);
+ }
+ stub.delState(key);
+ return state;
+ }
+
+ @Transaction
+ public static String updateData(final Context ctx, final String key,String json) {
+ ChaincodeStub stub = ctx.getStub();
+ String state = stub.getStringState(key);
+ if (StringUtils.isBlank(state)) {
+ String errorMessage = String.format("key: %s does exists", key);
+ System.out.println(errorMessage);
+ throw new ChaincodeException(errorMessage);
+ }
+ stub.putStringState(key, json);
+ return json;
+ }
+
+
+
+
+}
diff --git a/chaincode/GeneralChainCode/java/src/main/java/QueryResult.java b/chaincode/GeneralChainCode/java/src/main/java/QueryResult.java
new file mode 100644
index 00000000..a5d9574c
--- /dev/null
+++ b/chaincode/GeneralChainCode/java/src/main/java/QueryResult.java
@@ -0,0 +1,18 @@
+/*
+ * SPDX-License-Identifier: Apache-2.0
+ */
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.hyperledger.fabric.contract.annotation.DataType;
+import org.hyperledger.fabric.contract.annotation.Property;
+
+@DataType()
+@Data
+@Accessors(chain = true)
+public class QueryResult {
+ @Property()
+ private String key;
+
+ @Property()
+ private String json;
+}
diff --git a/chaincode/GeneralChainCode/java/src/main/java/QueryResultList.java b/chaincode/GeneralChainCode/java/src/main/java/QueryResultList.java
new file mode 100644
index 00000000..aa234298
--- /dev/null
+++ b/chaincode/GeneralChainCode/java/src/main/java/QueryResultList.java
@@ -0,0 +1,15 @@
+/*
+ * SPDX-License-Identifier: Apache-2.0
+ */
+import lombok.Data;
+import org.hyperledger.fabric.contract.annotation.DataType;
+import org.hyperledger.fabric.contract.annotation.Property;
+import java.util.List;
+
+@DataType
+@Data
+public class QueryResultList {
+
+ @Property
+ List resultList;
+}