云服务器内容精选

  • 使用SSH协议在TortoiseGit客户端克隆代码 本节内容指导如何使用TortoiseGit客户端克隆代码托管服务的仓库到本地环境中。 下载并安装TortoiseGit客户端。 获取仓库地址。 在仓库主页中,单击“克隆/下载”按钮,获取SSH地址,通过这个地址,可以在本地计算机连接代码托管仓库。 您可在代码托管服务仓库列表中“仓库地址”下获取SSH地址。 进入您的本地仓库目录下,右键选择“Git克隆”菜单选项,如下图所示。 在弹出的窗口中将上述复制的SSH地址粘贴到URL输入框中,勾选“加载Putty密钥”并选择私钥文件,最后单击“确定”,如下图所示。 单击“确定”之后即开始克隆仓库,如果您是第一次克隆TortoiseGit客户端会询问您是否信任远程仓库,单击“是”即可。 克隆用时受仓库大小影响,克隆的动作如下图所示。
  • 使用SSH协议在Git Bash客户端克隆代码 本节内容指导如何使用Git Bash客户端克隆代码托管服务的仓库到本地环境中。 下载并安装Git Bash客户端。 设置SSH密钥。 获取仓库地址。 在仓库主页中,单击“克隆/下载”按钮,获取SSH地址,通过这个地址,可以在本地计算机连接代码托管仓库。 如果您未配置SSH密钥,你可单击上图中“SSH密钥管理”链接进行配置,详情请参考SSH密钥。 您可在代码托管服务仓库列表中“仓库地址”下获取SSH地址。 打开Git Bash客户端。 在本地计算机上新建一个文件夹用于存放代码仓库,在空白处单击鼠标右键,打开Git Bash客户端。 克隆仓库时会自动初始化,无需执行init命令。 输入如下命令,克隆代码托管仓库。 git clone 仓库地址 命令中“仓库地址”即3中获取的SSH地址。 如果您是第一次克隆仓库,会询问您是否信任远程仓库,输入“yes”即可。 执行成功后,您会看到多出一个与您在代码托管服务新建的仓库同名的文件夹,并且其中有一个隐藏的.git文件夹,则说明克隆仓库成功。 此时您位于仓库上层目录,执行如下命令,进入仓库目录。 cd 仓库名称 进入仓库目录,可以看到此时Git默认为您定位到master分支。 客户端在git clone代码仓库时失败的原因排查: 确保您的网络可以访问代码托管服务。 请在git客户端使用如下测试命令验证网络连通性(其中“**********.com”为代码仓库地址)。 ssh -vT git@**********.com 如果返回内容含有“Could not resolve hostname **********.com: Name or service not known”,则您的网络被限制,无法访问代码托管服务,请求助您本地所属网络管理员。 请检查建立的SSH密钥配对关系,必要时重新生成密钥并到代码托管控制台进行配置。 只有开启IP白名单的机器才可以在Git客户端克隆。
  • 目录结构介绍 表1 IaC Spec包结构说明 位置 类型 个数 描述 iacspec_{service}_{version}.zip 文件 1 IaC压缩包。 └── package.json 文件 1 包描述文件,相关说明请参见包描述文件介绍。 └── global/ 文件夹 1 全局默认的IaC描述,包含完整文件结构,放置被所有规格目录所复用的配置文件。 │ └── meta.yaml 文件 1 变更策略描述,相关说明请参见在IaC3.0代码中定义流水线。 │ └── environment/ 文件夹 1 定义component1,公共资源。 │ └── resources.yaml 文件 1 公共资源列表,相关说明请参见在IaC3.0代码中声明资源。 │ └── values.yaml 文件 1 公共资源参数值,在resources.yaml中通过$ref的方式来引用。 │ └── {microservice}/ 文件夹 0-N 定义component2,微服务资源。 │ └── resources.yaml 文件 1 微服务资源列表,相关说明请参见在IaC3.0代码中声明资源。 │ └── values.yaml 文件 1 微服务资源参数值,在resources.yaml中通过$ref的方式来引用。 │ └── configs/ 文件夹 1 微服务配置目录。 │ └── config_schema.yaml 文件 1 声明微服务的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。在resources.yaml中通过$ref的方式来引用。 │ └── {cluster}_config_records.yaml 文件 0-N 微服务的业务配置项,在resources.yaml中通过$ref的方式来引用。 └── specs/ 文件夹 1 环境特定的IaC描述,结构与global相同,但仅包含与global有差异的文件。 │ └── cn_product_cbu/ 文件夹 1 中国区生产环境,命名采用站点级Cloud Map的名称,可以在环境管理界面查看可选的站点级Cloud Map名称列表。 │ └── environment/ 文件夹 0-1 环境公共资源。 │ └── values.yaml 文件 0-1 公共资源参数值。 │ └── {microservice}/ 文件夹 0-N 微服务资源。 │ └── values.yaml 文件 0-1 微服务资源参数值。 │ └── configs/ 文件夹 0-1 微服务配置目录。 │ └── {cluster}_config_records.yaml 文件 0-N 微服务的业务配置项。 │ └── aaa_product_cbu/ 文件夹 1 亚非拉生产环境。 │ └── eu_product_cbu/ 文件夹 1 欧洲生产环境。
  • global与specs的协同关系 global文件夹:放置被所有规格目录所复用的配置文件。 global文件夹里面的微服务都可以被规格文件夹specs中的代码复用(可根据meta.yaml指定复用哪些微服务,取决于你在相应环境的部署规划)。 global文件夹的作用类似于Java中的父类,spec类似于继承了global的子类,实际部署时还是使用的specs中的文件,但specs中的文件可以继承和复用global文件。 meta.yaml:描述变更的组件与过程。 {microservice}:描述要变更的微服务。 resources.yaml:微服务变更的主体文件,其他所有的values.yaml、config文件夹中的yaml等文件都围绕此文件展开。文件名必须为resources.yaml。 其他文件:为变量配置文件,其定义的内容都会被resources.yaml引用,文件名称可自定义。 spec文件夹:同一个服务在不同用途环境下所需配置文件(基础设施)。这个文件目录是必须的。 specs是在环境上部署服务时,最终使用的配置文件,当部署服务时,第一关注点和入口就是specs。 specs目录下的规格文件夹,命名采用站点级Cloud Map的名称(cn_product_cbu、eu_product_cbu)。可以在环境管理界面查看可选的站点级Cloud Map名称列表。 当某个规格被选用于部署时,会先将该规格目录下所有文件与global目录进行合并,得到该规格目录最终的所有配置文件,再进行部署动作。
  • IaC目录规划 IaC脚本开发规范请参考应用平台IaC部署代码开发,本实践中,IaC包结构规划如下: 表1 IaC Spec包结构说明 位置 描述 iacspec IaC压缩包 └── global/ 全局默认的IaC描述,包含完整文件结构。 │ └── meta.yaml 变更策略描述 └── specs/ 环境特定的IaC描述,结构与global相同,但仅包含与global有差异的文件。 │ └── cn_green_cbu_default/ 研发联调环境,命名采用站点级Cloud Map的名称,可以在环境管理界面查看可选的站点级Cloud Map名称列表。 │ └── DemoOrgidLogin/ 微服务DemoOrgidLogin。 │ └── config/ DemoOrgidLogin的配置目录。 │ └── aiops_sidecar_param.json 接入AIOps服务的配置文件。 │ └── config_records.yaml DemoOrgidLogin的业务配置项。 │ └── config_schema.yaml 声明DemoOrgidLogin的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。 │ └── envs.yaml 用于配置和管理DemoOrgidLogin的环境变量。 │ └── hosts.yaml 配置主机域名映射。 │ └── resources.yaml DemoOrgidLogin的资源列表。 │ └── values.yaml 定义DemoOrgidLogin的资源列表中使用的变量。 │ └── DemoServiceAService/ 微服务DemoServiceAService │ └── config/ ServiceA的配置目录。 │ └── aiops_sidecar_param.json 接入AIOps服务的配置文件。 │ └── config_records.yaml ServiceA的业务配置项。 │ └── config_schema.yaml 声明ServiceA的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。 │ └── envs.yaml 用于配置和管理ServiceA的环境变量。 │ └── hosts.yaml 配置主机域名映射。 │ └── resources.yaml ServiceA的资源列表。 │ └── values.yaml 定义ServiceA的资源列表中使用的变量。 │ └── DemoServiceBService/ 微服务DemoServiceBService。 │ └── config/ ServiceB的配置目录。 │ └── aiops_sidecar_param.json 接入AIOps服务的配置文件。 │ └── config_records.yaml ServiceB的业务配置项。 │ └── config_schema.yaml 声明ServiceB的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。 │ └── envs.yaml 用于配置和管理ServiceB的环境变量。 │ └── hosts.yaml 配置主机域名映射。 │ └── resources.yaml ServiceB的资源列表。 │ └── values.yaml 定义ServiceB的资源列表中使用的变量。 └── package.json 包描述文件。
  • 带global的多文件描述结构 Spec包通过不同规格目录来描述同一个服务在不同用途环境下所需的基础设施。但是,同一服务的不同的规格仍然存在大量相同的配置,需要一种机制来完成不同规格间配置的复用。因此,IaC支持放置一个global目录,其与specs目录同级,用于放置被所有规格目录所复用的配置文件。而各具体规格目录,只需包含与 global 目录的增量差异文件即可。 当某个规格被选用于部署时,会先将该规格目录下所有文件与global目录进行合并,得到该规格目录最终的所有配置文件,再进行部署动作。 合并策略:若文件的相对路径相同,则规格目录下的文件保留, global目录下的文件被覆盖,其他文件则共存。 带global的多文件描述结构样例如下: ├── package.json # 包描述文件(必须) ├── global # global目录:放置所有规格目录所复用的配置文件 │ │ │ ├── meta.yaml # IaC 主体描述文件,内容不包含 components │ ├── WiseEyeChaosMonkeyMgrService # 组件一:ChaosMonkey 管理服务,名称需要为该服务下的微服务名称。 │ │ └── resources.yaml # 组件一的资源列表 │ ├── WiseEyeChaosMonkeyPortal # 组件二:ChaosMonkey 网页服务 │ │ └── resources.yaml # 组件二的资源列表 │ ├── environment # 组件三:环境 │ │ └── resources.yaml # 组件三的资源列表 │ └── functions # 组件四:函数 │ ├── resources.yaml # 组件四的资源列表 │ └── values.yaml # 组件四的values.yaml │ └── specs # 规格总目录(必须) ├── cn_dev_default # cn_dev_default 规格目录,一般可用于描述一个开发用途的服务环境所使用的基础设施 └── cn_product_default # cn_product_default 规格目录,一般可用于描述一个生产用途的服务环境所使用的基础设施 └── functions # 与global下functions目录的相对路径一致 └── values.yaml # 用于覆盖global下functions目录的values.yaml
  • 单文件描述结构 单文件描述结构样例如下: ├── package.json # 包描述文件(必须) └── specs # 规格总目录(必须) ├── cn_dev_default # cn_dev_default规格目录,可用于描述一个开发用途的服务环境所使用的基础设施 └── cn_product_default # cn_product_default规格目录,可用于描述一个生产用途的服务环境所使用的基础设施 └── meta.yaml # IaC主体描述文件 IaC主体描述文件meta.yaml type: WiseCloud::Environment # 描述环境类型,当前仅支持 WiseCloud::Environment components: # 定义服务环境所包含的组件列表,每个组件包含一个资源列表 - name: environment # 组件名称 resources: # 资源列表 - name: fgc_cloudmap # 资源名称,同类型的资源的名称在整个服务环境中唯一 type: WiseCloud::Endpoint::CloudMap # 资源类型 properties: # 资源属性:具体包含哪些属性,由资源类型决定 ... - name: FGCActionInvokerService resources: ... - name: FGCAbilityCenterService resources: ... applyPipeline: default # 默认选用名为default的组件编排流水线 pipelines: # 定义可用的组件编排流水线 - name: default # 流水线的名称,作为流水线被引用的唯一标识 action: Serial # 串行编排 tasks: # 串行编排的任务列表 - name: apply-environment # 任务名称 action: Apply # 应用变更 component: # 变更组件的相关约束 name: environment # 变更的组件名称 - name: parallel-others action: Parallel # 并行编排 tasks: # 并行编排的任务列表 - name: apply-FGCActionInvokerService # 任务名称 action: Apply # 应用变更 component: # 变更组件的相关约束 name: FGCActionInvokerService # 变更的组件名称 - name: apply-FGCAbilityCenterService # 任务名称 action: Apply # 应用变更 component: # 变更组件的相关约束 name: FGCAbilityCenterService # 变更的组件名称 以上示例清晰地展示了IaC3.0的资源组织结构: Nuwa,CloudMap等资源,依照业务需要,可划分到不同的组件中。 一个组件可对应于一个微服务,或是服务内共享的中间件集合。 全体组件的集合,则汇总描述了整个服务环境的期望部署状态 组件编排流水线,则是以组件为最小粒度来描述服务环境是如何做部署状态的迁移的。其可以处理组件间的升级依赖关系,以及通过多阶段方式提供灰度升级能力。
  • 多文件描述结构 为了避免诸多资源的描述都集中于meta.yaml,而造成文件内容过长难以管理。通过引入resources.yaml和文件引用语法,可以将单文件结构改造为多文件描述目录结构,样例如下: ├── package.json # 包描述文件(必须) └── specs # 规格总目录(必须) ├── cn_dev_default # cn_dev_default规格目录,可用于描述一个开发用途的服务环境所使用的基础设施 └── cn_product_default # cn_product_default规格目录,可用于描述一个生产用途的服务环境所使用的基础设施 └── meta.yaml └── VirtualAppManangerService ├── config │ └── business_config.yaml │ └── nginx.conf ├── db │ └── schema.sql ├── values.yaml └── resources.yaml
  • 包描述文件介绍 iacspec包描述文件package.json样例如下: { "type": "iacspec", # 代码包类型 "name": "service/1180196813870297088", # 代码包名称,格式:service/{自有服务Id}(必须) "version": "1.0.0" # 代码包版本号(必须) } 表1 package.json字段说明 位置 类型 必填 描述 type string 是 包类型,常量:iacspec或iacpatch。 name string 是 包名称 iacspec包名称格式:service/{service-id},其中service-id为服务ID。 iacpatch包名称格式:service/{service-id}/{component-name},其中{service-id}为服务ID,{component-name}为组件名称。 您可以在AppStage运维中心工作台右上角的个人账号信息管理中,选择“租户管理”,查看服务ID。 version string 是 版本号。 父主题: 应用平台IaC部署代码开发
  • 链代码结构 Java语言的链代码结构如下: package main // 引入必要的包,系统自动操作,只要在maven或gradle中配置即可 import org.hyperledger.fabric.shim.ChaincodeBase; import org.hyperledger.fabric.shim.ChaincodeStub; public class SimpleChaincodeSimple extends ChaincodeBase { @Override public Response init(ChaincodeStub stub) { // 在该方法中实现链代码初始化或升级时的处理逻辑 // 编写时可灵活使用stub中的API } @Override public Response invoke(ChaincodeStub stub) { // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 // 编写时可灵活使用stub中的API } //主函数,需要调用shim.Start()方法 public static void main(String[] args) { new SimpleChaincode().start(args); } }
  • 链代码接口 链代码启动必须通过调用shim包中的start方法。实际开发中, 您需要自行定义一个类,来继承ChaincodeBase。以下为继承时必须重写的方法: public class SimpleChaincodeSimple extends ChaincodeBase { @Override public Response init(ChaincodeStub stub) { } @Override public Response invoke(ChaincodeStub stub) { } } init方法:在链代码实例化或升级时被调用,完成初始化数据的工作。 Invoke方法:更新或查询账本数据状态时被调用, 需要在此方法中实现响应调用或查询的业务逻辑。
  • 下载源码包 下载Fabric源码包作为三方库。仅适用于Fabric架构版本的区块链实例。 请根据实际需求,选择下载对应版本的Fabric源码包: https://github.com/hyperledger/fabric/tree/release-2.2 Fabric源码包选择和创建的区块链实例版本对应,即如果创建区块链实例时,Hyperledger Fabric增强版内核是v2.2(4.X.X版本),则Fabric源码包对应选择2.2版本。
  • 开发环境准备 请根据自身业务选择Go或Java开发环境。推荐使用CloudIDE(支持在线、快速地构建链代码开发环境)。 Go开发环境准备: 安装Go开发环境。安装包下载地址为:https://go.dev/dl/。(请选择1.9.2之后的版本) 各个系统对应的包名(以1.11.12版本为例): 操作系统 包名 Windows go1.11.12.windows-amd64.msi Linux go1.11.12.linux-amd64.tar.gz Windows下您可以使用.msi后缀的安装包来安装。默认情况下.msi文件会安装在“C:\Go”目录下。您可以将“C:\Go\bin”目录添加到Path环境变量中。添加后您需要重启命令窗口才能生效。 Linux下,您需要将下载的二进制包解压至/usr/local目录。将/usr/local/go/bin目录添加至Path环境变量: export PATH=$PATH:/usr/local/go/bin 安装完go语言后可以通过命令go version查看版本信息,以及通过go env命令来查看相关路径配置。 安装Go编辑器。编辑器可自行选择,推荐使用Goland:https://www.jetbrains.com/go/download。 Java开发环境准备: 仅适用于Fabric架构版本的区块链实例。 安装Java开发环境。下载JDK并安装(建议选择最新版本):https://www.oracle.com/technetwork/java/javase/downloads/index.html。 各个系统对应的包名(以15.0.2版本为例): 操作系统 包名 Windows jdk-15.0.2_windows-x64_bin.exe Linux jdk-15.0.2_linux-x64_bin.tar.gz Windows下您可以使用 .exe后缀的安装包来安装。 Linux下,您需要将下载的二进制包解压至/usr/local目录。 export PATH=$PATH:/usr/local/go/bin 配置环境变量(若无则新建): JAVA_HOME为jdk安装目录如“C:\Program Files (x86)\Java\jdk1.8.0_91”或“/usr/java/jdk1.8.0_91”(以下均略去双引号); CLASSPATH为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; ”; 在Path中新增两条“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”。 安装完jdk后,可以通过命令java -version查看版本信息。 安装Java编辑器。编辑器可自行选择,推荐使用IntelliJ IDEA。
  • 链代码示例(1.4风格) Fabric架构版本的区块链实例: 如下是一个账户转账的链代码示例(1.4风格)仅供安装实例化,若您需要调测请参考Fabric官方示例中的链代码。 package main import ( "fmt" "strconv" "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer" )type SimpleChaincode struct {}// 初始化数据状态,实例化/升级链代码时被自动调用func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {// println函数的输出信息会出现在链代码容器的日志中fmt.Println("ex02 Init")// 获取用户传递给调用链代码的所需参数_, args := stub.GetFunctionAndParameters()var A, B string // 两个账户var Aval, Bval int // 两个账户的余额var err error// 检查合法性, 检查参数数量是否为4个, 如果不是, 则返回错误信息if len(args) != 4 {return shim.Error("Incorrect number of arguments. Expecting 4")}A = args[0] // 账户A用户名Aval, err = strconv.Atoi(args[1]) // 账户A余额if err != nil {return shim.Error("Expecting integer value for asset holding")}B = args[2] // 账户B用户名Bval, err = strconv.Atoi(args[3]) // 账户B余额if err != nil {return shim.Error("Expecting integer value for asset holding")}fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)// 将账户A的状态写入账本中err = stub.PutState(A, []byte(strconv.Itoa(Aval)))if err != nil {return shim.Error(err.Error())}// 将账户B的状态写入账本中err = stub.PutState(B, []byte(strconv.Itoa(Bval)))if err != nil {return shim.Error(err.Error())}return shim.Success(nil)}// 对账本数据进行操作时(query, invoke)被自动调用func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {fmt.Println("ex02 Invoke")// 获取用户传递给调用链代码的函数名称及参数function, args := stub.GetFunctionAndParameters()// 对获取到的函数名称进行判断if function == "invoke" {// 调用 invoke 函数实现转账操作return t.invoke(stub, args)} else if function == "delete" {// 调用 delete 函数实现账户注销return t.delete(stub, args)} else if function == "query" {// 调用 query 实现账户查询操作return t.query(stub, args)}// 传递的函数名出错,返回 shim.Error()return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"")}// 账户间转钱func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {var A, B string // 账户A和Bvar Aval, Bval int // 账户余额var X int // 转账金额var err errorif len(args) != 3 {return shim.Error("Incorrect number of arguments. Expecting 3")}A = args[0] // 账户A用户名B = args[1] // 账户B用户名// 从账本中获取A的余额Avalbytes, err := stub.GetState(A)if err != nil {return shim.Error("Failed to get state")}if Avalbytes == nil {return shim.Error("Entity not found")}Aval, _ = strconv.Atoi(string(Avalbytes))// 从账本中获取B的余额Bvalbytes, err := stub.GetState(B)if err != nil {return shim.Error("Failed to get state")}if Bvalbytes == nil {return shim.Error("Entity not found")}Bval, _ = strconv.Atoi(string(Bvalbytes))// X为转账金额X, err = strconv.Atoi(args[2])if err != nil {return shim.Error("Invalid transaction amount, expecting a integer value")}// 转账Aval = Aval - XBval = Bval + Xfmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)// 更新转账后账本中A余额err = stub.PutState(A, []byte(strconv.Itoa(Aval)))if err != nil {return shim.Error(err.Error())}// 更新转账后账本中B余额err = stub.PutState(B, []byte(strconv.Itoa(Bval)))if err != nil {return shim.Error(err.Error())}return shim.Success(nil)}// 账户注销func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response {if len(args) != 1 {return shim.Error("Incorrect number of arguments. Expecting 1")}A := args[0] // 账户用户名// 从账本中删除该账户状态err := stub.DelState(A)if err != nil {return shim.Error("Failed to delete state")}return shim.Success(nil)}// 账户查询func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {var A stringvar err errorif len(args) != 1 {return shim.Error("Incorrect number of arguments. Expecting name of the person to query")}A = args[0] // 账户用户名// 从账本中获取该账户余额Avalbytes, err := stub.GetState(A)if err != nil {jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"return shim.Error(jsonResp)}if Avalbytes == nil {jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"return shim.Error(jsonResp)}jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"fmt.Printf("Query Response:%s\n", jsonResp)// 返回转账金额return shim.Success(Avalbytes)}func main() {err := shim.Start(new(SimpleChaincode))if err != nil {fmt.Printf("Error starting Simple chaincode: %s", err)}} 父主题: Go语言链代码开发
  • 业务流程管理 常见的区块链业务开发管理需要操作人员监控链上交易数据来掌握该笔业务的流程走向,即使使用区块链浏览器也需操作人员对浏览器中的数据进行筛选过滤,无疑增加了操作人员的工作量以及需要操作人员无一遗漏的筛选出正确交易才能开展下一步业务流程。 BCS提供以业务为维度的管理流程,操作人员通过界面更加直观地查看该笔业务的当前进展和历史交易数据。并且针对用户管理,提供了以角色和群组的细粒度访问授权(Hyperledger Fabric增强版目前不支持细粒度,功能正在开发中),不同角色或群组的用户授予不同的权限,例如仓库管理员仅可处理货物的发放、货物收件人员仅可确认货物的签收。该功能使用户更多的精力放在处理业务,丰富了区块链上层业务和人员管理,极大地增加了区块链的易用性。 用户权限管理 智能合约的发起者作为该合约的管理员,可通过用户管理页面User Management进行用户权限管理。首先根据实际业务设置角色,例如买家、卖家和仓库管理员等角色。然后设置群组,每个群组可包含多个或单个角色。最后添加用户,管理员为其设置用户名和登录密码,并选择对应的群组。 业务监控 用户可通过用户名和密码登录到业务监控页面,查看当前业务流程和业务历史交易数据,通过图形化呈现业务进展和下一步流程走向。并且通过状态标识,可直观的查看当前业务是否完成。 业务处理 业务处理包括接口调用业务处理、自动业务处理和人工处理三种业务处理方式。接口调用业务处理指用户通过调用合约SDK发起交易进行业务处理;自动业务处理指根据业务逻辑判断,满足一定要求后自动发起交易进行业务处理;人工处理指根据用户角色,不同用户拥有特定的权限执行相应的人工处理业务,以角色为维度进行细粒度访问授权(Hyperledger Fabric增强版目前不支持细粒度,功能正在开发中)。 父主题: 区块链应用低代码开发功能