首页> 中国专利> 一种基于联盟链的链上-链下协同电子病历数据共享方法

一种基于联盟链的链上-链下协同电子病历数据共享方法

摘要

本发明提供一种基于联盟链的链上‑链下协同电子病历数据共享方法,涉及计算机数据共享技术领域。本发明通过搭建区块链平台,建立区块链分布式超级账本Hyperledger Fabric区块链网络;设计电子病历系统的“写入病历功能”;选用MySQL数据库作为区块链数据库,用于电子病历的存储;实现对于某一病人历史病历数据的查询、修改和删除操作;上传病历时使用患者和医生的公钥对该病历的摘要进行数字签名来控制用户访问权限,保护患者隐私,同时防止数据被篡改。本专利建立一种多联盟链架构,使用联盟链的通道技术实现跨院安全传输数据,并使用json文本作为临时载体,实现不同医院数据库之间的医疗数据转化,解决当前因数据格式而共享困难的问题。

著录项

  • 公开/公告号CN112559627B

    专利类型发明专利

  • 公开/公告日2023.08.04

    原文格式PDF

  • 申请/专利权人 东北大学;

    申请/专利号CN202011449779.7

  • 申请日2020.12.11

  • 分类号G06F16/27(2019.01);G06F16/23(2019.01);G06F21/62(2013.01);G06F21/64(2013.01);G16H10/60(2018.01);

  • 代理机构沈阳东大知识产权代理有限公司 21109;

  • 代理人李梁

  • 地址 110819 辽宁省沈阳市和平区文化路3号巷11号

  • 入库时间 2023-08-26 00:14:57

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-08-04

    授权

    发明专利权授予

说明书

技术领域

本发明涉及计算机数据共享技术领域,尤其涉及一种基于联盟链的链上-链下协同电子病历数据共享方法。

背景技术

近年来,随着计算机功能的不断开发与利用,电子病历逐渐步入人们的眼中。电子病历因其传阅方便、保存持久、节约资源等优势,在医疗领域中得到了广泛的利用。但其也不可避免的具有易篡改等缺点,可能导致医疗纠纷的发生。

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,它本质上是一个去中心化的数据库。基于区块链技术的有公有链、联盟链和私有链三种形式,联盟链本质上仍然是一种私有链,只不过它比单个小组织开发的私有链更大,却又没有公有链这么大的规模,可以理解为它是介于私有链和公有链之间的一种区块链。区块链的三大特点包含去中心化,防篡改,可追溯。去中心化使得每个节点都是平等的,每个节点都能修改和查询信息。区块中的Merkle树的中间节点和根节点是由它的两个孩子节点进行哈希运算得到的,因而当叶子节点的数据有任何改变时,都会逐级向上传递,改变它的父节点的值,一直到Merkle树根节点的哈希值发生改变,这样,网络中的节点就可以发现数据被更改,从而实现防篡改。对医疗数据的任何操作都会产生一笔交易,且该交易会被上传到区块中,从而被区块链所记录,因这些数据信息具备唯一性,所以是可以被查询追溯的。联盟链由参与成员机构共同维护,并提供了对参与成员的管理、认证、授权、监控、审计等全套安全管理功能。

所以采用基于医疗联盟链的电子病历可以使得其本身易篡改的缺点得到改善并且可以提高电子病历的安全性,使电子病历可以更加准确的反映病人的信息。

其实,对于区块链,国家层面早在2016年12月发布的《国务院关于印发“十三五”国家信息化规划的通知》中就已经提及区块链。近几年,各省市也都在积极布局区块链,并出台相应的激励政策。目前,全球医疗保健行业主要项目中,溯源领域的使用量占比达38%。我国“区块链+医疗”的落地项目多在上海、北京、浙江、江苏等地,主要包括医疗器械/药品/疫苗防伪溯源、电子处方流转、电子病历、医院电子票据和医疗保险等应用场景。

由于区块链作为一个近十年才被提出来的新兴共享账本和数据库概念,还有很多未被开发和探究的领域,而其去中心化、分布式数据存储、全程留痕、集体维护等性质又恰好契合目前内涵逐步被共识为EHR,即医疗机构之间,包括医疗机构之间以个人为中心的信息集成的电子病历的发展需要。因此将这一共通点作为出发点对区块链技术和电子病历进行综合。

发明内容

针对现有技术的不足,本发明提供一种基于联盟链的链上-链下协同电子病历数据共享方法。

一种基于联盟链的链上-链下协同电子病历数据共享方法,包括以下步骤:

步骤1:搭建区块链平台,建立区块链分布式超级账本HyperledgerFabric区块链网络;

步骤1-1:利用HyperledgerFabric平台的开源代码配置环境并设置区块数据模型;

步骤1-2:设计生成区块的生成区块函数CreatBlock、计算哈希值函数Calculatehash和检验数据是否篡改的检验函数Examine;

所述生成区块函数CreatBlock如下所示:

Newblock=CreateBlock(blockHeaders,blockBody)

其中Newblock为创建的新区块;CreatBlock为创建区块函数,由超级账本中的peer节点(智能合约)模块执行;区块由区块头和区块体组成,区块头(blockHeaders)包括区块的高度(blockHeight)、区块的哈希值(Hash)、前一个区块的哈希值(prevBlockHash),时间戳(timeStamp)、Merkle树根的哈希值(merkleRoot);区块体(blockBody)包括区块内的交易(transactions)和区块的交易数量(numTransactions)。

所述计算哈希值函数Calculatehash如下所示:

Hash=SHA(h)

其中SHA为SHA256函数;h包括前驱区块哈希值(prevBlockHash)、Merkle(默克尔树)根哈希值(merkleRoot)、时间戳(timeStamp);Hash为当前区块哈希值。

所述检验函数Examine如下所示:

Consistent=Examine(thash(a),dhash(a))

其中Examine为检验两个参数是否相等的函数,返回值为布尔类型,Consistent返回为True说明病历数据一致,没有被篡改;返回为False说明病历数据不一致,被篡改了。thash是病人a所在叶子节点中存储的哈希值;dhash是本地数据库中病人a病历数据通过SHA256算法得到的哈希值。

步骤1-3:利用Hyperledger Fabric多通道方案,一家医疗组织的节点处于同一通道,所有医疗组织选举主节点加入到一个通道实现数据共享;

步骤2:设计电子病历系统的“写入病历功能”;选用MySQL数据库作为区块链数据库,用于电子病历的存储;所述电子病历的存储分为链上存储和链下存储,电子病历的内容包括病人基本信息、入院出院记录,会诊记录、手术记录、死亡记录和知情同意书信息;

所述链上存储对用户输入的电子病历进行哈希运算形成摘要,同时使用患者和医生的公钥对该摘要进行数字签名,该签名结果用于验证用户身份,控制其访问权限;将摘要、签名后的结果、患者的身份信息和病历上传时间作为交易内容存储在区块链上;

所述链下存储保留用户未经处理的原始病历信息存储到链下的MySQL数据库中,通过从数据库中提取用户所请求的病历,对其进行运算得到摘要,将该摘要与存储在区块链中的摘要进行对比来验证数据的完整性;

所述链上存储包括以下步骤:

步骤S1:用户进行链上存储电子病历时,客户端节点将交易内容发送给背书节点,背书节点进行签名验证;

步骤S2:签名验证无误后,通过智能合约对交易模拟执行,返回交易背书;

步骤S3:客户端节点将交易背书发送给排序节点Orderer,Orderer节点通过内部的卡夫卡共识机制kafka对所有交易进行排序打包后对所有节点广播区块,主节点保存区块、更新世界状态;

步骤3:对于某一病人历史病历数据的查询、修改和删除操作,实现两个医院之间的数据共享和存储;

步骤3-1:用户请求对病历数据进行查询、修改和删除操作前,需向由验证节点构成的协作网络发送患者的身份信息和签名,以及所请求病历的主治医生的签名来验证身份,验证节点通过遍历所有区块的默克尔树merkle中存储的transaction,并使用发送的用户签名和主治医生签名对transaction中的签名结果进行解密,对比解密后的摘要和上传的摘要是否一致来控制其访问权限,一致则身份验证通过,否则身份验证失败,拒绝该用户访问;

步骤3-2:协作网络从所有节点中选举出主节点,主节点代替用户在数据库中对数据进行查询、修改和删除操作,每种操作分为本院和跨院两种情况,其中,所有的跨院操作在进行数据传递时使用json文本作为临时存储载体,经json解析器和Map映射函数实现两个医院之间的数据共享和存储;

所述查询数据为,用户通过客户端发起查询请求并提供病人的签名和主治医生的签名及所要修改病历信息的关键字和病历的归属医院,由于每家医院所选举出的主节点位于同一通道内,即各主节点通过通道进行数据交互,由此实现用户在身份验证通过后进行跨院查询所需病人的病历信息;本地医院的主节点判断其所查询病历的归属地是否是本院,如果是则进行本院查询,如果不是则进行跨院查询;

所述本院查询通过步骤3中验证用户的身份信息和选取主节点,用户身份验证通过后,主节点在数据库的查询板块输入用户提供的患者姓名、身份证、就诊日期、病情种类任意关键字查询获得对应数据,待病历完整性验证通过后,主节点将病历数据发送给客户端,并产生相应的交易上传至区块;

所述跨院查询通过本院的主节点经通道向被请求医院的主节点发送病历关键字和该病历所属患者及主治医生的签名,被请求医院的主节点通过两份签名验证其身份,验证通过后,主节点从数据库中获取要查询的信息并验证完整性,完整性验证通过后,将获得的数据经转义保存到db.json文本中,并发送给当前用户所在医院的主节点后删除,产生查询交易上传至区块,当前用户所在医院的主节点得到db.json文本后将其发送给客户端,并产生查询交易上传至区块。

所述修改数据为,用户通过客户端发起修改请求并提供病人的签名和主治医生的签名及所要修改病历信息的关键字和病历的归属医院,由于每家医院所选举出的主节点位于同一通道内,即各主节点通过通道进行数据交互,由此实现用户在身份验证通过后进行跨院修改所请求病人的病历信息,本地医院的主节点判断其所修改病历的归属地是否是本院,如果是进行本院修改,如果不是则进行跨院修改;

所述本院修改通过步骤3所述验证用户的身份信息和选取主节点,用户身份验证通过后,主节点从数据库中获取请求的病历数据,并在数据完整性验证通过后返回数据给客户端供用户修改,用户修改后的数据经客户端发送给主节点保存至本地数据库模块,主节点将产生的交易上传至区块;

所述跨院修改为,本地医院的主节点经通道向被请求医院的主节点发送修改请求、病历关键字和两份签名,被请求医院主节点通过两份签名验证其身份,在访问权限和数据完整性通过后,将所需的病历数据经转义后保存到db.json文本中,并通过通道将该文本发送给请求医院,请求医院经json解析器和Map映射函数将该文本中存储的数据存到本地的数据库中,并上传相应的transaction至区块后删除db.json文本,同时返回写入成功的信号给被请求医院,被请求医院接收信号后将请求的病历从本地数据库中删除,并将产生的交易上传至区块;

所述删除数据为,用户通过客户端发起删除请求并提供病人的签名和主治医生的签名及所要删除病历信息的关键字和病历的归属医院,由于每家医院所选举出的主节点位于同一通道内,即各主节点通过通道进行数据交互,由此实现用户在身份验证通过后进行跨院删除所请求病人的病历信息,本地医院的主节点判断其所删除病历的归属地是否是本院,如果是进行本院删除,如果不是则进行跨院删除;

所述本院删除数据通过步骤3所述验证用户的身份信息和选取主节点,用户身份验证通过后,主节点通过其提供的关键字查询病人的相关病历数据,待数据完整性验证通过后删除数据,并返回删除成功的结果给客户端,同时将产生的交易上传至区块。

所述跨院删除数据为,本地医院的主节点经通道向被请求医院的主节点发送删除请求、病历关键字和两份签名,被请求医院主节点通过两份签名验证其身份,在身份验证和数据完整性验证通过后删除相关的数据,并将产生的交易上传至区块,返回删除成功的结果给请求医院,请求医院将产生的交易上传至区块并返回删除成功的信号给客户端。

采用上述技术方案所产生的有益效果在于:

本发明提出了一种基于联盟链的链上-链下协同电子病历数据共享方法,采用链上存储医疗信息的摘要,链下存储原始医疗数据的方式来验证数据在下载时的完整性,保证数据的安全。上传病历时使用患者和医生的公钥对该病历的摘要进行数字签名来控制用户访问权限,保护患者隐私,同时防止数据被篡改。本专利建立一种多联盟链架构,使用联盟链的通道技术实现跨院安全传输数据,并使用json文本作为临时载体,实现不同医院数据库之间的医疗数据转化,解决当前因数据格式而共享困难的问题。

附图说明

图1为本发明病历数据共享方法总体流程图;

图2为本发明实施例系统的整体架构图;

图3为本发明实施例病历数据存储流程图;

图4为本发明实施例病历数据操作流程图;

图5为本发明实施例数据库与json文本转换实现跨院数据共享图。

具体实施方式

下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。

一种基于联盟链的链上-链下协同电子病历数据共享方法,总体流程图如图1所示,本实施例中软件平台为Hyperledger Fabric,包括以下步骤:

步骤1:搭建区块链平台,建立区块链分布式超级账本Hyperledger Fabric区块链网络;

步骤1-1:利用Hyperledger Fabric平台的开源代码配置环境并设置区块数据模型;

本实施方式中采用Go语言来搭建区块链。安装和配置开发环境后,定义结构体Block作为区块的数据模型,其数据成员包括blockHeight(区块高度)、Hash(哈希值)、PrevBlockhash(前一区块哈希值)、Timestamp(时间戳)、Merkle根,transactions(区块内的交易)和numTransactions(区块的交易数量)。再定义一个结构体Chain表示整条区块链。

步骤1-2:设计生成区块的生成区块函数CreatBlock、计算哈希值函数Calculatehash和检验数据是否篡改的检验函数Examine;

所述生成区块函数CreatBlock如下所示:

Newblock=CreateBlock(blockHeaders,blockBody)

其中Newblock为创建的新区块;CreatBlock为创建区块函数,由超级账本中的peer节点(智能合约)模块执行;区块由区块头和区块体组成,区块头(blockHeaders)包括区块的高度(blockHeight)、区块的哈希值(Hash)、前一个区块的哈希值(prevBlockHash),时间戳(timeStamp)、Merkle树根的哈希值(merkleRoot);区块体(blockBody)包括区块内的交易(transactions)和区块的交易数量(numTransactions)。

所述计算哈希值函数Calculatehash如下所示:

Hash=SHA(h)

其中SHA为SHA256函数;h包括前驱区块哈希值(prevBlockHash)、Merkle(默克尔树)根哈希值(merkleRoot)、时间戳(timeStamp);Hash为当前区块哈希值。

所述检验函数Examine如下所示:

Consistent=Examine(thash(a),dhash(a))

其中Examine为检验两个参数是否相等的函数,返回值为布尔类型,Consistent返回为True说明病历数据一致,没有被篡改;返回为False说明病历数据不一致,被篡改了。thash是病人a所在叶子节点中存储的哈希值;dhash是本地数据库中病人a病历数据通过SHA256算法得到的哈希值。

步骤1-3:利用HyperledgerFabric多通道方案,一家医疗组织的节点处于同一通道,所有医疗组织选举主节点加入到一个通道实现数据共享;

本实施例中使用configtxgen工具,用configtx.yaml配置文件中的模板,生成新建通道的配置交易文件。锚节点配置更新文件用来对组织的锚节点进行配置,同样基于configtx.yaml配置文件生成新建通道文件,每个组织都需要分别生成且注意指定对应的组织名称。启动网络,进入docker容器并使用peer channel create命令创建通道。使用peer channeljoin命令将成员节点加入通道中,更新锚节点配置。重复以上操作,建立每家医疗机构的通道网络。至此,一个涵盖多家医疗结构的多链多通道的区块链网络基本架构搭建完成。

步骤2:设计电子病历系统的“写入病历功能”;选用MySQL数据库作为区块链数据库,用于电子病历的存储;所述电子病历的存储分为链上存储和链下存储,电子病历的内容包括病人基本信息、入院出院记录,会诊记录、手术记录、死亡记录和知情同意书信息,如图3所示;

所述链上存储通过SHA256算法对用户输入的电子病历进行哈希运算形成摘要,同时使用患者和医生的公钥对该摘要进行数字签名,该签名结果用于验证用户身份,控制其访问权限,保证数据安全;将摘要、签名后的结果、患者的身份信息和病历上传时间作为交易内容存储在区块链上;

所述链下存储保留用户未经处理的原始病历信息存储到链下的MySQL数据库中,通过从数据库中提取用户所请求的病历,对其进行SHA256运算得到摘要,将该摘要与存储在区块链中的摘要进行对比来验证数据的完整性,防止数据被篡改;

所述链上存储包括以下步骤:

步骤S1:用户进行链上存储电子病历时,客户端节点将交易内容发送给背书节点,背书节点进行签名验证;

步骤S2:签名验证无误后,通过智能合约对交易模拟执行,返回交易背书;

步骤S3:客户端节点将交易背书发送给排序节点Orderer,Orderer节点通过内部的卡夫卡共识机制kafka对所有交易进行排序打包后对所有节点广播区块,主节点保存区块、更新世界状态;

步骤3:对于某一病人历史病历数据的查询、修改和删除操作,实现两个医院之间的数据共享和存储;如图4所示;

本实施例中以用户n、医院A、B、病人1,2和主节点甲、乙为例并假定用户n来自A医院,病人1的病历信息存储在A医院,病人2的病历信息存储在B医院。主节点甲为A医院的主节点,主节点乙为B医院的主节点。

步骤3-1:用户n请求对某病历数据进行操作前,需通过hyperledger fabric中的client节点向A医院的协作网络的验证节点构成的协作网络发送患者的身份信息和签名,以及所请求病历的主治医生的签名来验证身份。验证节点通过遍历所有区块的merkle树中存储的transaction,并使用发送的用户签名和主治医生签名对transaction中的签名结果进行解密,对比解密后的摘要和上传的摘要是否一致来控制其访问权限。存在一致的情况则身份验证通过,可以访问所需数据;否则身份验证失败,拒绝该用户访问。

步骤3-2:A医院从所有验证节点中选举出主节点甲。选举过程在Gossip层实现,一个节点启动的时候它先等网络稳定再开始参与主节点选举,一次主节点选举的有效时间是10s。这样可以有效避免强制设置主节点出现的发生故障无法分发区块的问题。主节点根据用户的请求进行相关的操作,其中,所有跨院请求在传输医疗数据时,被请求医院从数据库中提取需要的医疗数据,将其转换为json语言保存到db.json文本中,实施例数据库与json文本转换实现跨院数据共享图如图5所示,发送给请求医院后删除文本。请求医院获得db.json文本后,利用json解析器对数据进行转义,再将处理后的数据根据Map映射函数存储到本地的数据中,并删除db.json文本,架构图如图2所示。

所述查询数据为,用户n通过客户端发起查询请求并提供病人的签名和主治医生的签名及所要查询病历信息的关键字和病历的归属医院。由于每家医院所选举出的主节点位于同一通道内,即各主节点通过通道进行数据交互,由此实现用户n在身份验证通过后进行跨院查询所需病人的病历信息。本地医院的主节点判断其所查病历的归属地是否是本院,如果是则跳转至本院查询。如果不是,则跳转至跨院查询。

所述本院查询为,用户n想要查询病人1的病历记录。通过步骤3-1所述验证用户n的身份信息和选取主节点甲。身份验证通过后,主节点甲进入本地数据库并在数据库的查询板块输入用户提供的病历信息的关键字进行查询来获得所需的电子病历,并验证该电子病历数据的完整性。在保证数据的完整性条件下主节点甲将电子病历数据发送给客户端,并产生用户n查询病人1的交易上传至区块;

所述跨院查询为用户n想要查询病人2的病历记录。进行跨院查询时,本地医院的主节点甲经通道找到用户n提供的病历归属医院B,将用户n发送的两份签名、查询请求和病历信息关键字发送医院B的主节点乙。主节点乙根据两份签名验证用户n的身份,待身份验证通过后,主节点乙进入到数据库查询对应病人2的病历信息并验证电子病历的完整性,通过完整性验证后,将病人2的病历信息经转义保存到db.json文本中,并在通道中将该文本发送给主节点甲后删除,同时产生用户n查询病人2的交易上传至区块。主节点甲将得到的db.json文本发送给客户端,同时产生用户n跨院查询病人2的交易上传至区块。

所述修改数据为,用户n通过客户端发起修改请求并提供病人的签名和主治医生的签名及所要修改病历信息的关键字和病历的归属医院。由于每家医院所选举出的主节点位于同一通道内,即各主节点通过通道进行数据交互,由此实现用户n在身份验证通过后进行跨院修改所请求病人的病历信息。本地医院的主节点判断其所修改病历的归属地是否是本院,如果是则跳转至本院修改。如果不是则跳转至跨院修改。

所述本院修改为,用户n修改病人1的病历记录。通过步骤3-1所述验证用户n的身份信息和选取主节点甲。用户n身份验证通过后,主节点甲通过用户n提供的病历关键字访问数据库中本医院的数据板块,在验证病历的完整性后返回病人1的历史数据信息给客户端,用户n通过客户端修改需要修改的医疗数据,修改完成后客户端将修改后的医疗数据发送给主节点保存到数据库中A医院的数据板块,同时产生用户n修改病人1的交易上传至区块,有效防止病人病历被篡改块;

所述跨院修改为,用户n修改病人2的病历记录。进行跨院修改时,本地医院的主节点甲经通道找到用户n提供的病历归属医院B,将用户n提供的两份签名、修改请求和病历信息关键字发送给医院B的主节点乙。主节点乙根据两份签名验证用户n的身份信息,身份验证通过后,主节点乙通过查询数据库获得病人2的历史病历数据,待病历完整性验证通过后将病历数据经转义保存到db.json文本中,并经通道将该文本发送给主节点甲后删除。主节点甲将获取的db.json文本信息内容经json解析器和Map映射函数写入到本地的数据库中,并根据步骤2-1-1所述上传相应的transaction至区块后删除该文本,同时返回写入成功的信号给主节点乙。主节点乙接收到写入成功的信号后从数据库中删除用户n请求的病历数据,并产生用户n跨院修改病人2的交易上传至区块。此时,用户n再通过本院修改数据即可;

所述删除数据为,由于病人死亡等原因其家属n想删除病人的历史病历,可通过客户端发起修改请求并提供病人的签名和主治医生的签名及所要删除病历信息的关键字和病历的归属医院。由于每家医院所选举出的主节点位于同一通道内,即各主节点通过通道进行数据交互,由此实现用户n在身份验证通过后进行跨院删除所请求病人的病历信息。本地医院的主节点判断其所删除病历的归属地是否是本院,如果是进行本院删除,如果不是则进行跨院删除;

所述本院删除为,用户n删除病人1的病历记录。通过步骤3-1所述验证用户n的身份信息和选取主节点甲。身份验证通过后,主节点甲通过提供的病历关键字查询数据库获取病人1的被请求的病历数据,并验证其数据完整性,验证通过后删除这些数据,生成用户n删除病人1的交易上传至区块,同时返回删除成功的消息给客户端。

所述跨院删除数据为,用户n删除病人2的病历记录。进行跨院删除时,主节点甲经通道找到用户n提供的病历归属医院B,将用户n发送的两份签名、删除请求和病历信息关键字发送医院B的主节点乙。医院的主节点乙根据两份签名验证用户n的身份,待验证通过后,主节点乙通过所提供的病历关键字查询本地数据库板块获取请求的电子病历,验证数据完整性后从数据库中删除请求的病历数据,上传用户n删除病人2的的交易至区块,并经通道返回删除成功的消息给主节点甲。主节点甲将病人2跨院删除数据产生的交易上传至区块,同时返回删除成功的消息给客户端。

以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开的实施例中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开的实施例中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号