2.0生命周期 fabric java 链码安装

2023-11-20

2.0生命周期 fabric java 链码安装

步骤 :

打包&安装
批准
提交
  • 首先打包chaincode:这个步骤可以由一个组织来完成,也可以由每个组织来完成。
    在你的peer中安装chaincode:每个使用chaincode来签署交易或者查询分类账的组织都需要完成这个步骤。批准您的组织的chaincode定义:每个使用chaincode的组织都需要完成这个步骤。在可以在通道上启动chaincode之前,chaincode定义需要得到足够数量的组织的批准,以满足通道的生命周期许可策略(默认情况下是大多数)。将chaincode定义提交给通道:一旦通道上所需的组织数量得到批准,提交事务就需要由一个组织提交。提交者首先从已经批准的组织的足够多的同行那里收集背书,然后提交事务以提交chaincode定义。

  • 打包&安装 packagechaincode &installChaincode

  •    //打包
       LifecycleChaincodePackage lifecycleChaincodePackage = createLifecycleChaincodePackage(
                           // replace_label_with_name
                           chaincodeLabel,
                           chaincodeType,
                           Paths.get(System.getenv(REST_CFG_PATH)).toString(),
                           chaincodePath,
                           null);
    
       //安装
       private String lifecycleInstallChaincode(HFClient client, Collection<Peer> peers, LifecycleChaincodePackage lifecycleChaincodePackage) throws InvalidArgumentException, ProposalException, InvalidProtocolBufferException {
       
               int numInstallProposal = 0;
       
               numInstallProposal = numInstallProposal + peers.size();
       
               LifecycleInstallChaincodeRequest installProposalRequest = client.newLifecycleInstallChaincodeRequest();
               installProposalRequest.setLifecycleChaincodePackage(lifecycleChaincodePackage);
               installProposalRequest.setProposalWaitTime(1080000);
       
               Collection<LifecycleInstallChaincodeProposalResponse> responses = client.sendLifecycleInstallChaincodeRequest(installProposalRequest, peers);
               assertNotNull(responses);
       
               Collection<ProposalResponse> successful = new LinkedList<>();
               Collection<ProposalResponse> failed = new LinkedList<>();
               String packageID = null;
               for (LifecycleInstallChaincodeProposalResponse response : responses) {
                   if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
                       log.info("Successful install proposal response Txid: %s from peer %s", response.getTransactionID(), response.getPeer().getName());
                       successful.add(response);
                       if (packageID == null) {
                           packageID = response.getPackageId();
                           assertNotNull(format("Hashcode came back as null from peer: %s ", response.getPeer()), packageID);
                       } else {
                           assertEquals("Miss match on what the peers returned back as the packageID", packageID, response.getPackageId());
                       }
                   } else {
                       failed.add(response);
                   }
               }
       
               //   }
               log.info(format("Received %d install proposal responses. Successful+verified: %d . Failed: %d", numInstallProposal, successful.size(), failed.size()));
       
               if (failed.size() > 0) {
                   ProposalResponse first = failed.iterator().next();
                   log.info("Not enough endorsers for install :" + successful.size() + ".  " + first.getMessage());
               }
       
               assertNotNull(packageID);
               assertFalse(packageID.isEmpty());
       
               return packageID;
       
           }
    
  1. 查询安装状态(可做可不做) queryinstalled

       //查询已安装的链码
          private JSONObject verifyNoInstalledChaincodes(HFClient client, Collection<Peer> peers) throws ProposalException, InvalidArgumentException {
              JSONObject jsonObject = new JSONObject();
              Collection<LifecycleQueryInstalledChaincodesProposalResponse> results = client.sendLifecycleQueryInstalledChaincodes(client.newLifecycleQueryInstalledChaincodesRequest(), peers);
              assertNotNull(results);
              assertEquals(peers.size(), results.size());
          
              for (LifecycleQueryInstalledChaincodesProposalResponse result : results) {
          
                  final String peerName = result.getPeer().getName();
                  assertEquals(format("Peer returned back bad status %s", peerName), result.getStatus(), ChaincodeResponse.Status.SUCCESS);
                  log.info(format("Peer returned back bad status %s", peerName), result.getStatus(), ChaincodeResponse.Status.SUCCESS);
                  Collection<LifecycleQueryInstalledChaincodesProposalResponse.LifecycleQueryInstalledChaincodesResult> lifecycleQueryInstalledChaincodesResult = result.getLifecycleQueryInstalledChaincodesResult();
                  assertNotNull(format("Peer %s returned back null result.", peerName), lifecycleQueryInstalledChaincodesResult + "");
                  log.info(format("Peer %s returned back null result.", peerName), lifecycleQueryInstalledChaincodesResult + "");
                  // assertTrue(format("Peer %s returned back result with chaincode installed.", peerName), lifecycleQueryInstalledChaincodesResult.isEmpty());
                  log.info(format("Peer %s returned back result with chaincode installed.", peerName), lifecycleQueryInstalledChaincodesResult.isEmpty());
                  jsonObject.put(peerName, lifecycleQueryInstalledChaincodesResult);
              }
              return jsonObject;
          
          }
    
  2. 批准 approveForMyOrg

          long sequence = getSequence(chaincodeName, client, channel, org1MyPeers);
         
              //Org1 also creates the endorsement policy for the chaincode. // also known as validationParameter !
              LifecycleChaincodeEndorsementPolicy chaincodeEndorsementPolicy = LifecycleChaincodeEndorsementPolicy.fromSignaturePolicyYamlFile(Paths.get(System.getenv(REST_CFG_PATH) + "/chaincodeendorsementpolicy.yaml"));
              ChaincodeCollectionConfiguration chaincodeConfiguration = ChaincodeCollectionConfiguration.fromYamlFile(new File(System.getenv(REST_CFG_PATH) + "/PrivateDataIT.yaml"));
    
              final Peer anOrg1Peer = org1MyPeers.iterator().next();
              log.info("Org1 approving chaincode definition for my org.");
              BlockEvent.TransactionEvent transactionEvent = lifecycleApproveChaincodeDefinitionForMyOrg(client, channel,
                      Collections.singleton(anOrg1Peer),  //support approve on multiple peers but really today only need one. Go with minimum.
                      sequence, chaincodeName, chaincodeVersion, chaincodeEndorsementPolicy, chaincodeConfiguration, false, orgChaincodePackageID)
                      .get(100100, TimeUnit.SECONDS);
    
    
    
    
    
  3. 查询批准情况(可做可不做)

       //通过检查提交准备状态进行验证;用于检查有哪些机构同意,有哪些机构还没同意;
           private JSONObject verifyByCheckCommitReadinessStatus(HFClient client, Channel channel, long definitionSequence, String chaincodeName,
                                                                 String chaincodeVersion, LifecycleChaincodeEndorsementPolicy chaincodeEndorsementPolicy,
                                                                 ChaincodeCollectionConfiguration chaincodeCollectionConfiguration, boolean initRequired, Collection<Peer> org1MyPeers,
                                                                 ) throws InvalidArgumentException, ProposalException {
               JSONObject array = new JSONObject();
               JSONObject approved = new JSONObject();
               JSONObject unApproved = new JSONObject();
               LifecycleCheckCommitReadinessRequest lifecycleCheckCommitReadinessRequest = client.newLifecycleSimulateCommitChaincodeDefinitionRequest();
               lifecycleCheckCommitReadinessRequest.setSequence(definitionSequence);
               lifecycleCheckCommitReadinessRequest.setChaincodeName(chaincodeName);
               lifecycleCheckCommitReadinessRequest.setChaincodeVersion(chaincodeVersion);
               if (null != chaincodeEndorsementPolicy) {
                   lifecycleCheckCommitReadinessRequest.setChaincodeEndorsementPolicy(chaincodeEndorsementPolicy);
               }
               if (null != chaincodeCollectionConfiguration) {
                   lifecycleCheckCommitReadinessRequest.setChaincodeCollectionConfiguration(chaincodeCollectionConfiguration);
               }
               lifecycleCheckCommitReadinessRequest.setInitRequired(initRequired);
       
               Collection<LifecycleCheckCommitReadinessProposalResponse> lifecycleSimulateCommitChaincodeDefinitionProposalResponse = channel.sendLifecycleCheckCommitReadinessRequest(lifecycleCheckCommitReadinessRequest, org1MyPeers);
               for (LifecycleCheckCommitReadinessProposalResponse resp : lifecycleSimulateCommitChaincodeDefinitionProposalResponse) {
                   final Peer peer = resp.getPeer();
                   assertEquals(ChaincodeResponse.Status.SUCCESS, resp.getStatus());
                   // assertEquals(format("Approved orgs failed on %s", peer), expectedApproved, resp.getApprovedOrgs());
                   log.info(format("Approved orgs %s on %s", peer, resp.getApprovedOrgs()));
                   approved.put(peer.getName(), resp.getApprovedOrgs());
                   //assertEquals(format("UnApproved orgs failed on %s", peer), expectedUnApproved, resp.getUnApprovedOrgs());
                   log.info(format("UnApproved orgs %s on %s", peer, resp.getUnApprovedOrgs()));
                   unApproved.put(peer.getName(), resp.getUnApprovedOrgs());
                   //assertEquals(format("UnApproved orgs failed on %s", peer), expectedUnApproved, resp.getUnApprovedOrgs());
               }
               array.put("Approved", approved);
               array.put("UnApproved", unApproved);
               return array;
           }
       
       
    
  4. 提交 commitChaincodeDefinition

       long sequence = getSequence(chaincodeName, client, channel, channel.getPeers());
          
                  LifecycleCommitChaincodeDefinitionRequest lifecycleCommitChaincodeDefinitionRequest = client.newLifecycleCommitChaincodeDefinitionRequest();
          
                  lifecycleCommitChaincodeDefinitionRequest.setSequence(sequence);
                  lifecycleCommitChaincodeDefinitionRequest.setChaincodeName(chaincodeName);
                  lifecycleCommitChaincodeDefinitionRequest.setChaincodeVersion(chaincodeVersion);
          
                  LifecycleChaincodeEndorsementPolicy chaincodeEndorsementPolicy = LifecycleChaincodeEndorsementPolicy.fromSignaturePolicyYamlFile(Paths.get(System.getenv(REST_CFG_PATH) + "/chaincodeendorsementpolicy.yaml"));
                  ChaincodeCollectionConfiguration chaincodeConfiguration = ChaincodeCollectionConfiguration.fromYamlFile(new File(System.getenv(REST_CFG_PATH) + "/PrivateDataIT.yaml"));
          
                  if (null != chaincodeEndorsementPolicy) {
                      lifecycleCommitChaincodeDefinitionRequest.setChaincodeEndorsementPolicy(chaincodeEndorsementPolicy);
                  }
                  if (null != chaincodeConfiguration) {
                      lifecycleCommitChaincodeDefinitionRequest.setChaincodeCollectionConfiguration(chaincodeConfiguration);
                  }
                  Collection<Peer> org1MyPeers = channel.getPeers();
                  Collection<Peer> orgOtherPeers = Util.addOtherOrgPeers(client, channel, peerDomain);
                  Collection<Peer> endorsingPeers = Arrays.asList(org1MyPeers.iterator().next(), orgOtherPeers.iterator().next());
                  lifecycleCommitChaincodeDefinitionRequest.setInitRequired(initRequired);
                  Collection<LifecycleCommitChaincodeDefinitionProposalResponse> lifecycleCommitChaincodeDefinitionProposalResponses = channel.sendLifecycleCommitChaincodeDefinitionProposal(lifecycleCommitChaincodeDefinitionRequest,
                          endorsingPeers);
                  for (LifecycleCommitChaincodeDefinitionProposalResponse resp : lifecycleCommitChaincodeDefinitionProposalResponses) {
          
                      final Peer peer = resp.getPeer();
                      //requested sequence is 1, but new definition must be sequence 2
                      assertEquals(format("%s had unexpected status.", peer.toString()), ChaincodeResponse.Status.SUCCESS, resp.getStatus());
                      assertTrue(format("%s not verified.", peer.toString()), resp.isVerified());
                  }
          
                  CompletableFuture<BlockEvent.TransactionEvent> transactionEvent = channel.sendTransaction(lifecycleCommitChaincodeDefinitionProposalResponses);
             
    
  5. 查询提交状态(可做可不做)

          private void verifyByQueryChaincodeDefinition(HFClient client, Channel channel, String chaincodeName, Collection<Peer> peers, long expectedSequence, boolean expectedInitRequired, byte[] expectedValidationParameter,
                                                        ChaincodeCollectionConfiguration expectedChaincodeCollectionConfiguration) throws ProposalException, InvalidArgumentException, ChaincodeCollectionConfigurationException {
      
              final QueryLifecycleQueryChaincodeDefinitionRequest queryLifecycleQueryChaincodeDefinitionRequest = client.newQueryLifecycleQueryChaincodeDefinitionRequest();
              queryLifecycleQueryChaincodeDefinitionRequest.setChaincodeName(chaincodeName);
      
              Collection<LifecycleQueryChaincodeDefinitionProposalResponse> queryChaincodeDefinitionProposalResponses = channel.lifecycleQueryChaincodeDefinition(queryLifecycleQueryChaincodeDefinitionRequest, peers);
      
              assertNotNull(queryChaincodeDefinitionProposalResponses);
              assertEquals(peers.size(), queryChaincodeDefinitionProposalResponses.size());
              for (LifecycleQueryChaincodeDefinitionProposalResponse response : queryChaincodeDefinitionProposalResponses) {
                  assertEquals(ChaincodeResponse.Status.SUCCESS, response.getStatus());
                  assertEquals(expectedSequence, response.getSequence());
                  if (expectedValidationParameter != null) {
                      byte[] validationParameter = response.getValidationParameter();
                      assertNotNull(validationParameter);
                      assertArrayEquals(expectedValidationParameter, validationParameter);
                  }
      
                  if (null != expectedChaincodeCollectionConfiguration) {
                      final ChaincodeCollectionConfiguration chaincodeCollectionConfiguration = response.getChaincodeCollectionConfiguration();
                      assertNotNull(chaincodeCollectionConfiguration);
                      assertArrayEquals(expectedChaincodeCollectionConfiguration.getAsBytes(), chaincodeCollectionConfiguration.getAsBytes());
                  }
      
                  ChaincodeCollectionConfiguration collections = response.getChaincodeCollectionConfiguration();
                  assertEquals(expectedInitRequired, response.getInitRequired());
                  assertEquals("escc", response.getEndorsementPlugin());
                  assertEquals("vscc", response.getValidationPlugin());
              }
          }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.0生命周期 fabric java 链码安装 的相关文章

  • 重启Vcenter命令

    重启Vcenter命令 通过ssh登录Vcenter 输入root 输入shell 输入service control stop all 输入service control start all 停止 启动或重新启动 VMware vCent
  • linux xenserver教程,XenServer常用命令

    监控检查类 xentop 查看XenServer与VM的资源使用情况 xsconsole 进入XenServer管理面板 查看网卡 IP 系统版本 系统时间 硬件信息等 xe task list 查看XenServer临时任务进程 serv
  • 【C语言】验证哥德巴赫猜想

    文章目录 问题来源 题目要求 如何判断素数 主函数 完整代码 效果演示 写代码中的误解 总结 问题来源 这是学校的一个作业 原题如下 题目先给出了哥德巴赫猜想的背景知识 我还真不知道 2000以内的正偶数都能分解成两个质数 素数 之和 题目
  • 毕业设计-基于 PID 控制算法仿真算法研究- Matlab

    目录 前言 课题背景和意义 实现技术思路 一 基本原理 二 无超调 PID 控制器的设计 三 无超调 PID 设计的验证 代码 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一
  • 安装anaconda及修改conda config 的channels/default_channels

    先说一下安装anaconda的方法 很简单 就是去官网下载然后在本地安装 bash Anaconda3 4 4 0 Linux x86 64 sh 这个过程中要耐心 会有提问 需要输入yes来回应 并且需要按很多的回车 总之 看见让输入ye
  • 转:机器学习的理解

    转李航博士的一篇关于机器学习理解的文章 算算时间 从开始到现在 做机器学习算法也将近八个月了 虽然还没有达到融会贯通的地步 但至少在熟悉了算法的流程后 我在算法的选择和创造能力上有了不小的提升 实话说 机器学习很难 非常难 要做到完全了解算
  • Ridis持久化

    Redis持久化 RDB Redis DataBase Redis会单独创建 fork 一个子进程来进行持久化 会先将数据写入到一个临时文件中 待持久化都结束了 再用这个临时文件替换上次持久化好的文件 整个过程中 主进程是不进行io操作的
  • 8--UI 初步认识 简易计算器

    UI是App的根基 一个App应该是先有UI界面 然后在UI的基础上增加实用功能 2 UI相对简单易学 UI普遍是学习过程中最简单的一块 能快速拥有成就感和学习兴趣 3 UI至关重要 开发中的绝大部分时间都在处理UI 谨记一条IOS软件开发
  • MySQL根据某一个或者多个字段查找重复数据

    sql 查出一张表中重复的所有记录数据 1 表中有id和name 两个字段 查询出name重复的所有数据 select from xi a where a username in select username from xi group
  • 系列教程

    PDF Search 系列教程来咯 在 Part 1 中 我们将演示如何从 PDF 中提取 处理并存储图像及文本 随着神经搜索 Neural Search 技术的普及 越来越多开发者 开始尝试用 Jina 解决非结构化数据的索引和搜索问题
  • MySQL必知必会 学习笔记 第二十五章 使用触发器

    触发器在MySQL 5中增加 触发器可以在MySQL响应DELETE INSERT UPDATE语句时自动执行一条SQL语句 MySQL 5中触发器名在每个表中唯一而不是在一个数据库中唯一 其他DBMS有的重名限制是数据库范围 以后MySQ
  • lua和测试(一)

    lua做为一门高级语言 在游戏产业运用到机会越来越多了 测试掌握几门脚本语言也有一定的重要性 以下对于lua组合输入做出一些引导 测试需要掌握的关于返回数值 主要用到布尔类 前言的指引 lua的语法比较简单和清晰 学过c语言的可以很好的掌握
  • 并发编程系列之自定义线程池

    前言 前面我们在讲并发工具类的时候 多次提到线程池 今天我们就来走进线程池的旅地 首先我们先不讲线程池框架Executors 我们今天先来介绍如何自己定义一个线程池 是不是已经迫不及待了 那么就让我们开启今天的旅途吧 什么是线程池 线程池可
  • selenium+python 对输入框的输入处理

    最近自己在做项目的自动化测试 公司无此要求 在用户管理模块做修改用户信息时 脚本已经跑成功 并且的确做了update操作 但是自己登陆页面检查 信息却没有被修改 再次确定系统该模块的编辑功能可用 脚本如下 if result num gt
  • 近千万EOS被盗事件回顾,大家请保护好自己的EOS私钥

    最近有伙伴被盗了价值近千万的EOS 于是查看了这次被盗活动账号记录 这次分享出来 一是有可能大家有线索 二是也让大家意识到数字货币私钥安全的重要性 事件回顾 受害人在7 9号被偷盗人通过update auth更换了账号授权公私钥 紧接着被转
  • 零基础到GPT高手:快速学习与利用ChatGPT的完全指南

    进入人工智能时代 令人惊叹的ChatGPT技术正在引爆全球 您是否想象过能够与智能语言模型对话 提升工作效率 解锁创意 甚至实现商业化变现 在本篇文章中 我将向你揭示ChatGPT的原理 学习技巧 并展示如何利用ChatGPT提升工作效率和
  • Windows11:QT5.14.2+PCL1.12.0+VS2019环境配置

    之前在win10系统下配置了PCL1 8 1 QT5 9 1 VS2015的开发环境 由于PCL库已经更新到了1 12 1而且1 8 1一直有bug 为了使用下新的算法库 今天配置一下新的开发环境 1 安装Qt5 14 2 Qt5 14 2
  • 【b站雅思笔记】Simon‘s IELTS Course - 听力部分

    前情提要 b站up主贼开心的小林上传的Simon的听力课 资料均来源于她 参考 雅思阅读 最好的雅思课程 阅读部分全集 https www bilibili com video BV1ea4y1x7qR spm id from 333 78
  • Spring为什么要用的三级缓存解决循环依赖

    一 代码准备 Component aService public class AService Autowired private BService bService public void test System out println
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3

随机推荐

  • react_hooks系列05_useRef,useImperativeHandle,高阶组件forwordRef

    一 useRef 1 uesRef使用在官方标签上 useRef 返回一个可变的 ref 对象 其 ref 对象 current 属性被初始化为传入的参数 initialValue 返回的 ref 对象在组件的整个生命周期内保持不变 imp
  • 蓝桥杯字母阵列

    字母阵列 递归解法 仔细寻找 会发现 在下面的8x8的方阵中 隐藏着字母序列 LANQIAO SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLANQIAO RSFWFNYA XIFZVWAL COAIQNAL 我
  • 教你怎么导入导出数据

    最近在做一个项目 需要对数据进行导入导出 实现之后 自己也做了一个总结 总体来说还是比较容易的 第一次的话肯定有许多坑的 细节真的很重要 当你踏过一个又一个坑 一路路走来 你会发现自己的信心越来越强 对于数据的导入导出 我们首先写一个工具类
  • 代码检查、评审、单元测试工具 大搜集

    看书真是迅速进入一个陌生领域的最快办法 系统的 体系完整的知识比起在互联网上七拼八凑出的认识强太多了 先记下一些理论概念 软件生命周期模型 分析 设计与文档 编码与审查 测试与调试 发布与维护 软件测试对象的6种分类 单元测试 静态检查 动
  • 数据结构---线性表的静态/动态分配与顺序/链式存储

    线性表 基于严魏敏版数据结构c语言实现 谭浩强版c语言 数据元素在计算机中的存储分为顺序存储和链式存储 顺序存储 借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系 链式存储 借助指示元素存储地址的指针表示数据元素之间的逻辑关系 ps
  • matlab定义机器人位置,机器人自定位问题(数学建模)

    形形色色 各式各样的机器人正在走进人们的生产与生活 发挥着越来越重要的作用 这些机器人 一般都拥有 感官 各种传感器 大脑 智能计算的软硬件 和 执行器 各种操控设备 等 它们在自己的工作场合内 能自主感知 自主决策并完成使命 为达到这样的
  • 笔记---Linux安装OpenCV及VSCode的配置编译

    学更好的别人 做更好的自己 微卡智享 本文长度为4250字 预计阅读10分钟 前言 最近在学点新东西 教程中主要也是在Linux中使用 对于我这个以前从未接触Linux系统的人来说 正好也是个机会掌握下LInux系统 这篇就是记录在Linu
  • 批量创建文件与文件夹

    1 批量创建文件 下面们来说一下如何在pyhton中去批量创建文件 假设我要新建10个txt文件 这里我用一个for循环 for i in range 10 这里的 指代的是当前文件夹 i表示文件的名称 a表示没有该文件就新建 f open
  • Java 泛型 T,E,K,V,?

    泛型带来的好处 在没有泛型的情况的下 通过对类型 Object 的引用来实现参数的 任意化 任意化 带来的缺点是要做显式的强制类型转换 而这种转换是要求开发者对实际参数类型可以预知的情况下进行的 对于强制类型转换错误的情况 编译器可能不提示
  • 入门力扣自学笔记279 C++ (题目编号:1123)

    1123 最深叶节点的最近公共祖先 题目 给你一个有根节点 root 的二叉树 返回它 最深的叶节点的最近公共祖先 回想一下 叶节点 是二叉树中没有子节点的节点 树的根节点的 深度 为 0 如果某一节点的深度为 d 那它的子节点的深度就是
  • python 实现 softmax分类器(MNIST数据集)

    最近一直在外面 李航那本书没带在身上 所以那本书的算法实现估计要拖后了 这几天在看Andrew Ng 机器学习的课程视频 正好看到了Softmax分类器那块 发现自己之前理解perceptron与logistic regression是有问
  • JSTL和EL:

    El表达式使JSP的开发变得更加简单 简介 什么是EL Expression Language 表达式语言 El得功能 代替JSP页面中数据访问时得代码复杂编程 EL得特点 自动转换类型 EL得到某个数据时可以自动转换类型 使用简单 EL表
  • 【微信小程序】数组排序以及去重问题详解

    微信小程序中 通常有一些数据 是存在前端缓存里的 但是这个数据如果是没有处理过 需要动态处理的时候 数据就会有问题 所以 提供一些数据的几种处理方式 二维数组排序 var arr1 new Array arr1 中猫猫er E7555大号
  • FineReport 帆软实战一 帆软概述及软件下载

    前言 公司近期引进帆软报表替换原先的润乾报表 以提供更为强大的报表处理能力 因此我也开始从零学习帆软报表 帆软报表报表分为FineReport和FineBI Report可以理解为面向开发人员的报表设计器 用于开发复杂类型的报表 需要开发人
  • 计算机中的二进制表示-4和5

    十进制 二进制 5 00000000 00000000 00000000 00000101 4 11111111 11111111 11111111 11111100 负数的二进制如何得出 相信正数的二进制表示大家都懂 但是这个 4怎么来的
  • 一文教你如何在HBuilderX中使用模拟器开发调试App

    一文教你如何在HBuilderX中使用模拟器开发调试App 第一步下载HBuilderX 第二步 下载一个模拟器 这里我选择的是网易出品的mumu模拟器 第三步 打开上面安装的两个软件 接着在hbx里运行到模拟器 如下图所示 如果和图片中一
  • 从12306验证码看人工智能未来发展

    事件背景 最近12306对登陆验证过程进行了升级 让很多抢票软件失效 也引起众多网友的热议 如图 用户在登陆时需要选择和题目给出的描述相同的图片 新的验证方式推出后 不少网友也在网上发表看法 大部分网友表示此举很给力 黄牛抢票软件失效了 对
  • mysql dump 导出表_[译文]MySQL中快速逻辑备份一张单独的表

    逻辑备份在跨云环境的数据迁移和表级恢复中非常有用 8 0 22的MySQL shell引入了两个新的实用程序util dumpTable 和util exportTable 用于从MySQL中导出单独的表 在8 0 22之前 无法使用MyS
  • 电脑提示vcomp140.dll无法继续执行代码

    电脑提示vcomp140 dll无法继续执行代码怎么办 vcomp140 dll是电脑系统系统重要的动态链接库文件 丢失或者损坏的话 会导致电脑很多软件跟游戏无法打开运行 需要怎么修复 详细困扰着不少小伙伴 小编今天就把教程分享给大家 修复
  • 2.0生命周期 fabric java 链码安装

    2 0生命周期 fabric java 链码安装 步骤