访问数据访问层的实体的制作方法

文档序号:6426458阅读:136来源:国知局
专利名称:访问数据访问层的实体的制作方法
技术领域
本发明涉及分别根据权利要求1和14的前序的用于访问数据访问层的实体的方法、系统。
背景技术
大多数企业和制造工艺使用数据库管理系统来存储和检索数据,即执行其任务所需的信息。用于感兴趣的特定域的此类信息的概念描述称为“物理数据模型”。软件应用程序通常被与在“数据库层级”(DB层级)上的用来处理物理数据模型信息的数据库结构保持分开。这借助于“数据提取层”(DAL)来完成,其为“逻辑数学模型”的实现。逻辑数据模型的非常常见的类型是“实体关系模型”(ERM),其中,根据实体、即表示真实世界对象的数据结构及其之间的关系来描述数据。例如,在生产环境数据模型中,例如在制造执行系统(MES)中,我们将说“机器属于特定生产线”。在本示例中,“机器”和“生产线”是我们的数据模型的实体,同时“属于”是其之间的关系。在数据模型之上放置施加于信息的一组算法、约束和规则的描述这是“企业逻辑”(BL)层级。例如,参考前一示例,我们可以说“一个人只有当他/她具有特定技能组时才能操作特定机器”。“人”、“机器”和“技能”是我们的逻辑数据模型的实体,“具有”是人和技能之间的关系,并且以上句子是由我们的企业逻辑施加的约束。当在特定域中开发一般软件解决方案时,在DB和DAL两个层级,通常以固定的数据模型来构造信息基于关于真实过程的一般知识来定义实体和关系。这适用于企业逻辑层级,其中,要求所实现的算法、规则和约束来适合其中将使用该解决方案的所有特定情况。遗憾的是,主要缺点是每当将一般解决方案应用于特定情况时,在DB、DAL、BL层级处常常需要繁重的定制。举例说明此问题的简单示例是处理关于人的信息。在一般数据模型中,对应于人的实体包含通常表示我们感兴趣的域中的人的所有性质,例如在本示例中,人类资源管理系统,姓氏、名字、出生时间和地点等。如果在USA使用此一般数据模型,需要将其扩展至包括重要的SSN (社会安全号码)信息,其出于税收的目的唯一地识别那个国家中的人。在此极其简单的附加性质情况下,DB层级上的定制是与现有的一个呈1 1关系的表格或附加表格的附加列。关于数据读取过程,在DB层级,经由SQL联接子句将读取语句修改为包括新添加的性质,但是遗憾的是这在DAL层级是不真实的。此外,大多数问题在定制数据写入过程时出现。事实上,关系数据库不具有对应于用于读取的“联接”子句的写结构。在DAL和BL层级,问题甚至更复杂,事实上,在不同的情况下必须保持/扩展/覆写由基本实体实现的预先存在的写逻辑。正如此非常简单的示例性情况所示,常见定制在将一般解决方案应用于特定情况时如何要求包括附加实体、性质和关系及附加的不同行为、约束和检查是显而易见的。
因此,本领域中的要求是通过以高效且灵活的方式对DAL层进行定制来适应特定解决方案的数据模型,其常常不同于由通用解决方案实现的一般数据模型。遗憾的是,通常通过部分地或完全取代产品持续(product persistence)层来完成DAL层的定制,这意味着相当大的开发努力。因此,在实际情况中,常常发生的是一般产品DAL和BL层通常被丢弃并从头开始重新写入,以便获得代表(typical of)物理数据处理层的弹性和灵活性。这是由于在DAL 层级、实体是刚性的且两个或更多实体的数据不可以高效的方式分组的事实。遗憾的是,跳过DAL 层的主要缺点是可能丢失用于数据模型的实体的某些持续功能和与之一起的可用于编程短语的某些控制和检查能力。

发明内容
因此,本发明的目的是通过提供用于访问数据访问层的实体并还针对上数据层实现代表访问数据库物理层的灵活性的方法和系统来克服上述缺点。由用于访问数据访问层的实体的方法和系统来实现上述目的,数据访问层遵循其中根据实体及其之间的关系来描述数据的实体关系模型;其中,实体提供有CRUD接口 ;本发明包括以下各项
a)定义元实体,在下文中称为虚拟实体,作为一个或多个实体的各部分的组合物而得
到;
b)经由虚拟实体描述符将虚拟实体描述为其中经由链接以父子结构来连接实体的分级结构;以所述虚拟实体描述符,指定从每个实体获取哪些性质以形成虚拟实体的部分实体;
c)在虚拟实体上提供CRUD接口;
d)在运行时间,经由其CRUD接口来访问虚拟实体,所述访问被实现为对访问组成虚拟实体的实体的CRUD方法的一组调用。在提出的发明的实施例中,可以方便地从由以下各项中的一个或多个组成的组中选择连接父和子实体的链接
一直接链接,其中,所述父实体包括参考子实体的一组性质。一返回链接,其中,所述子实体包括参考父实体的一组性质;
一枢轴返回链接,其中,针对给定枢轴标识符的每个期望值将一组子实体性质复制一次。在提出的发明的实施例中,至少一个子实体可以有利地是可选副实体,意味着父实体与子实体之间的关系本身并不是强制性的。在提出的发明的实施例中,至少一个直接链接子实体可以方便地是查找副实体, 意味着至少一组性质被标记为唯一地识别子实体实例的标识符且查找副实体被用于基于其标识符组对特定实例进行定位,并用于从储存库读取其性质,使得能够在父实体中更新参考该组的链接性质。在提出的发明的实施例中,可以将关于实体的信息存储在可以是数据库、优选地关系数据库中的储存库中。在提出的发明的实施例中,可以经由读取方法或经由写入方法来执行项目d)的虚拟实体的访问。 在提出的发明的实施例中,可以优选地将虚拟实体上的读取方法实现为组成虚拟实体的实体上的读取方法的调用。在提出的发明的实施例中,可以通过由以下各项中的一个或多个组成的组的选择来有利地实现虚拟实体实例的集合
—“.NET”标准对象;
—被束缚于 Microsoft ObjectDataSource (微软对象数据源)的 Microsoft DataSet (微软数据集)和/或DataTable (数据表)对象;
一适合于向第三方ASP. NET控制提供数据的其它标准表示。在提出的发明的实施例中,写入方法可以是编辑方法,其中
一对虚拟实体的分级结构执行检验以便判定其每个部分实体的处理顺序 一如果用直接链接将子实体链接到父实体,则在父实体之前处理子实体; 一如果用返回链接将子实体链接到父实体,则在父实体之后处理子实体; 一其中,每个部分实体的处理包括以下子步骤 一检查部分实体以检验其是否将被修改; 一如果其将被修改
从数据库检索最新完整实体实例; 在当前部分实体的分级位置上执行检验
一如果当前部分实体是根实体或被直接链接到其父它通过其查找标识符(如果被标记为被查找)之一或通过其唯一密钥之一来进行检索;
一如果其被成功地检索,用数据库上的新值来更新它,除非其为未被标记为“可更新”的查找实体;否则,
如果当前部分实体被返回链接到其父如果当前部分实体不是可通过唯一密钥检索的,创建具有新值的实体实例;否则如果其可访问性质的所有新值是无效的,从数据库去除整个实体实例,否则如果可访问性质的至少一个新值不是无效的,则用新值来更新当前部分实体。在提出的发明的实施例中,写入方法还可以是删除方法,其中
一如果用返回链接将子实体链接到父实体,则之前删除子实体并之后删除父实体;否
则,
一如果用直接链接将子实体链接到父实体,则只删除父实体。在提出的发明的实施例中,对于至少一个实体的CRUD接口的方法中的至少一个而言,可以优选地关联将在运行时间执行的至少插件,其中,插件是实现定制动作的外部软件模块。在提出的发明的实施例中,其中,所述至少一个实体可以方便地是虚拟实体。在提出的发明的实施例中,所述实体可以是定制实体,用包含在动态实体描述符结构中的信息以动态的方式生成;其中,所述动态实体描述符结构包括以下信息
一关于在数据访问层中如何表示实体的信息; 一关于在储存库中如何存储实体数据的信息;
一关于将如何写入实体和调用哪些外部提供商以执行写入操作的信息。
此外,可以提供计算机程序元件,包括用于在被加载在计算设备的数字处理器中时执行根据上述方法的步骤的计算机程序代码。另外,可以提供存储在计算机可用介质上的计算机程序产品,包括用于促使计算设备执行所述方法的计算机可读程序代码。用提出的发明的实施例,以高效的方式处理数据模型信息,同时使在识别一般结构和关于特定域中的数据的性质时通常所需的开发努力最小化。提出的发明的实施例允许读和写操作两者中的属于不同实体的数据的高性能和灵活的组合。提出的发明的实施例在DAL层处针对读和写操作两者允许SQL语言在数据库层级针对读操作提供的类似种类的灵活性。提出的发明的实施例允许BL层的完整或部分定制。 提出的发明的实施例不要求定制数据访问类的开发。用提出的发明的实施例,组成基本构建块、库或动态定义实体以创制期望逻辑数据模型是非常简单的。事实上,在此组成过程中,保留原始企业逻辑还是将其扩展/重写以适合特定模型需要的选择只能涉及虚拟实体的一小部分上的特定动作以及整个虚拟实体。提出的发明的实施例允许展示统一界面,即用于应用程序必须处理的所有数据模型实体的交互规则集合,从基本库实体到由许多标准和定制副实体行为组成的复杂聚合。


现在将参考附图在优选但非排他性的实施例中描述本发明,在附图中
图1是示意性地举例说明现有技术中的用于数据访问的3层数据模型的方框图; 图2是示意性地举例说明根据提出的发明的示例性实施例的用于数据的3层数据模型的方框图3是示意性地举例说明根据提出的发明的示例性实施例的被定义为真实实体的分级结构的虚拟实体的不同示例的图4是示意性地举例说明根据提出的发明的示例性实施例的被定义为真实实体的分级结构的虚拟实体的不同示例的图5是示意性地举例说明根据提出的发明的示例性实施例的被定义为真实实体的分级结构的虚拟实体的不同示例的图6是示意性地举例说明根据提出的发明的示例性实施例的被定义为真实实体的分级结构的虚拟实体的不同示例的图7是示意性地举例说明根据提出的发明的示例性实施例的被定义为真实实体的分级结构的虚拟实体的不同示例的图8是示意性地举例说明根据提出的发明的示例性实施例的被定义为真实实体的分级结构的虚拟实体的不同示例的图9是示意性地举例说明根据提出的发明的示例性实施例的用于实体操作的插件执行的示例的流程图10是示意性地举例说明根据本发明的示例性实施例的包含在动态实体描述符结构中的信息的类型的图。
具体实施例方式
根据提出的发明,DAL层遵循其中根据实体及其之间的关系来描述数据的ERM模型。实体展示CRUD界面,即其在适用时支持四个基本存储操作创建、读取、更新、删除。应注意的是最小CRUD界面要求至少支持读取操作。提出的发明引入“实体聚合”的概念,根据该概念
一如果在两个实体之间存在关系,即一个实体包含对另一个实体的参考,则能够将其
水口
一可以对该聚合进行迭代,因此给出分级结构,即聚合实体的树一此类聚合的结果是称为“虚拟实体”的元实体
一基本实体如何被链接以便获得虚拟实体的描述称为“虚拟实体描述符” 一虚拟实体自动地展示CRUD界面。实体表明其之间的允许链接(关系)。这每当实体包含对另一实体的参考、即唯一地识别另一实体的实例的一组性质时发生。虚拟实体描述符是分级、即树形结构,其中子实体通过“链接”性质被连接到父实体,并且其中,指定从结构的一组不同实体中采取哪些性质来形成新的虚拟实体。在其它发明实施例中,可以优选地对此类性质给定新名称“别名”。可以将提出的发明实现为基于实体关系逻辑数据模型的架构。可以将虚拟实体描述符看作一类架构。可以优选地将虚拟实体描述符串行化和去串行化以便在不写入代码的情况下被容易地使用,例如可行的表示是XML语言。有利地,用提出的发明,特定解决方案的DAL和BL层可以基于虚拟实体而不是类对象。事实上,提出的发明通过提供虚拟实体描述符的库来避免在应用和部署努力方面具有其明显缺点的不断地扩展定制聚合企业对象的库的需要。在运行时间,经由虚拟实体的CRUD界面来访问虚拟实体。经由读取或写入方法的访问被实现为对访问构成虚拟实体的实体的CRUD方法的一组调用。图1和图2分别示意性地举例说明现有技术和发明示例中的用于数据访问的3层数据模型的差别。在BL层级,在如图1所示的现有技术中,存在将特定企业逻辑实现为类的每个解决方案定制,替代地在如图2所示的示例性实施例中,存在作为虚拟实体描述符的企业实体的和可选地插件的定义。在DAL层级,在如图1所示的现有技术中,存在一般域实体,而在如图2所示的示例性实施例中,存在一般域CRUD实体。在图2中,BL层级的虚拟实体的定义不要求对数据库层级的直接访问和DAL层级的跳过,对于如图1所示的现有技术解决方案而言情况常常如此。链接类型
在虚拟实体中,可以将副实体、即子实体直接链接或返回链接到父实体。在其它实施例中,返回链接还可以是枢轴链接(pivot-link)。在本文中,术语“直接链接”的副实体指示父实体包括参考副实体的一组性质。替代地,在术语“返回链接”副实体的情况下,意图在于副实体参考父实体。
用示例1、4和5来举例说明直接链接、返回链接和枢轴链接之间的差别。示例1 盲接链接
在示例性实施例中,在M ES情况中,让我们假设以下三个基本DAL实体是生产订单管理组件的一部分
-“运动(campaign)”实体,表示制造特定数量的产品的生产请求。-“订单”实体,表示生产特定材料所需的操作,以及相关信息。运动由一个或多个订单组成。一“条目”实体表示用于完成整个生产订单的执行的制造步骤。订单由一个或多个条目组成。虚拟实体的非常简单的示例可以聚合以下性质数据 一条目标识符(从条目获取)
一条目估计起始时间(从条目获取) 一条目估计结束时间(从条目获取) 一条目所属的订单的标识符(从订单获取) 一由订单生成的最终材料的标识符(从订单获取) 一订单所属的运动的标识符(从运动获取)
在本简单示例情况下,虚拟实体被以图形方式表示为如图3的虚拟实体图表Tl所示的三个级联直接链接实体的树。本示例中的链接性质是由订单和条目实体两者展示的订单标识符和由运动和订单实体两者展示的运动标识符。副实体类型
在提出的发明的实施例中,可以提供其它两个类型的副实体,例如“可选”副实体或“查找”副实体。可选副实体
根据第一附加副实体类型,如果父实体与副实体之间的关系本身不是强制性的,即参考实体不一定指向被参考实体的实例,则可以将副实体标记为“可选”副实体。示例2 可选副实体
在示例性实施例中,让我们假设条目实体包含称为参考被关联到条目的执行设备的设备ID的性质,如果有的话,如图3的虚拟实体图T2中所示。在这种情况下,由于该关联不是强制性的,即条目不一定具有关联设备,所以此类副实体被标记为可选的。在此虚拟实体描述符上调用的读取方法返回所有条目实例,无论它们是否指向相关设备。对于不存在到设备实体的关联的虚拟实体实例而言,从设备实体提取的性质具有无效值。杳找副实体
根据第二附加副实体类型,可以将直接链接的副实体标记为“查找”副实体。要求至少一组性质的查找副实体被标记为唯一地识别副实体实例的“标识符”。在查找副实体中,以与对于非查找副实体而言不同的方式来实现写入方法,而读取方法的实现不受影响。实际上,查找副实体并不意图被写入,而是意图被用于基于其标识符组对特定实例进行定位并用于从储存库读取其性质,使得能够在父实体中更新对其进行参考的链接性质。在写入期间 ,从数据库搜索并读取与对至少一个标识符给定的值匹配的副实体实例,并且在父实体中更新所有链接性质。结果是副实体未被修改,但是在然后可以参考不同实例的父实体中发生更新。在本发明的其它实施例中,还可以提供具有混合查找性质的副实体,在本文中称为“可创建”和/或“可更新”查找副实体。在“可创建”查找副实体中,如果未发现匹配的副实体实例,现在用给定性质值创建一个新的,并且父实体将对其进行参考。在“可更新”副实体中,当识别并检索到匹配的副实体实例时,在数据库中更新任何经修改的性质。示例3 杳找副实体
图3的虚拟实体图T3a和T3b描述两个虚拟实体描述符,其不同之处在于在第二虚拟实体描述符中运动副实体被标记为“查找”。对于第一虚拟实体而言,此虚拟实体的实例上的写入方法的调用意味着根据数据,可以调用订单和运动实例两者上的写入方法。替代地,对于第二虚拟实体而言,此虚拟实体的实例上的写入方法的调用意味着只有订单实例被写入,并且特别地,其指向与针对其“标识符性质”给定的值、例如 Campaign. Name (运动.名称)给定的值匹配的运动实例。枢轴链接
在提出的发明的实施例中,优选的是将某些返回链接副实体标记为枢轴链接副实体。事实上,应注意的是在返回链接中,副实体通过一个或多个性质来参考父实体。遗憾的是,这意味着除非关系是一对一的,在结果得到的一组虚拟实体实例中,重复来自父实体的性质值,因为可能存在参考同一父实体实例的多个副实体实例。枢轴链接不具有此类缺陷,如用描绘返回链接与枢轴返回链接之间的差异的示例4和5举例说明的那样。示例4 返回链接副实体
让我们假设实体EntryProperty (条目实体)表示被关联到条目实体的性质。其通过性质EntryID (条目ID)来参考条目性质并展示表示性质名称的名称性质。用 EntryPropertyValue (条目性质值)实体来表示EntryProperty (条目性质)实例所取的值, 其借助于性质EntryProperty. Name (条目性质.名称)来参考EntryProperty (条目性质), 并展示表示性质值的Value性质,如图4中的虚拟实体图T4所示。在表1中举例说明结果得到的虚拟实体实例的样本集。
茶 IUD条丨丨fM·丨 ι. Kft^llfl ;H<ii,f('i
% 11 i__propA__via_
|>U Iprop Vlh
^lTn IV>pT— vic
,1112_ PWPA_ v2a_
ill 2__propB__ν _
^ 11 3__propB__v3h_
"f1! 3propC... vie
— ——-—表 1存在其中此类数据聚合没有用的许多常见情况。因此,在某些此类情况中,期望具有“枢转”副实体数据组织,其中,针对给定“枢轴标识符”的每个期望值将一组副实体性质(和副副实体)复制一次。枢轴标识符是枢转副实体的一组性质,其值被用来识别将在虚拟实体中枢转的实例。这些值被称为“枢轴值”。如果针对给定枢转副实体指定N个枢轴值,则从其开始的子树将被复制N次,每个枢轴值一次。示例5 枢轴链接副实体
在本示例中,与示例4相比,结果得到的虚拟实体是完全不同的,因为EntryProperty (条目性质)在其Name (名称)性质上枢转,如图4的虚拟实体图T5a所示。假设3 个枢轴值,给定“pr0pA”、“pr0pB”、“pr0pC”,从 EntryProperty (条目性质) 开始的子结构在内部被复制3次,如图4的虚拟实体图T5b中所示。因此,枢轴值变成如在表2中举例说明的复制性质的前缀。有利地,可以指定独立的别名。
权利要求
1.一种用于访问数据访问层的实体的方法,所述数据访问层遵循实体关系模型,其中根据实体及其之间的关系来描述数据;其中,为实体提供CRUD界面;所述方法的特征在于其包括以下步骤a)定义元实体,在下文中称为虚拟实体,作为一个或多个实体的各部分的组合物而得到;b)经由虚拟实体描述符将虚拟实体描述为其中经由链接以父子结构来连接实体的分级结构;在所述虚拟实体描述符中,指定从每个实体获取哪些性质以形成虚拟实体的部分实体;c)在虚拟实体上提供CRUD界面;d)在运行时间,经由其CRUD界面来访问虚拟实体,所述访问被实现为对访问组成虚拟实体的实体的CRUD方法的一组调用。
2.根据权利要求1所述的方法,其中,连接父和子实体的链接选自由以下各项中的一个或多个组成的组一直接链接,其中,所述父实体包括参考子实体的一组性质; 一返回链接,其中,所述子实体包括参考父实体的一组性质;一枢轴返回链接,其中,针对给定枢轴标识符的每个期望值将一组子实体性质复制一次。
3.前述权利要求中的任一项的方法,其中,至少一个子实体是可选副实体,意味着父实体与子实体之间的关系本身不是强制性的。
4.前述权利要求中的任一项的方法,其中,至少一个直接链接子实体是查找副实体, 意味着至少一组性质被标记为唯一地识别副实体实例的标识符,并且所述查找副实体被用于基于其标识符组对特定实例进行定位,并且用于从储存库读取其性质,使得在父实体中能够更新参考该组的链接性质。
5.前述权利要求中的任一项的方法,其中,关于实体的信息被存储在储存库中,其是数据库,优选地是关系数据库。
6.前述权利要求中的任一项的方法,其中,步骤d)的虚拟实体的访问是经由读取方法或经由写入方法。
7.权利要求6的方法,其中,虚拟实体上的读取方法被实现为组成虚拟实体的实体上的读取方法的调用。
8.根据前述权利要求中的任一项所述的方法,其中,所述虚拟实体实例的集合被实现为由以下各项中的一个或多个组成的组的选择—“.NET”标准对象;—専 Microsoft ObjectDataSource 的 Microsoft DataSet 禾口 / $ DataTable 对象;一适合于向第三方ASP. NET控制提供数据的其它标准表示。
9.权利要求6的方法,其中,所述写入方法是编辑方法,其中一对虚拟实体的分级结构执行检验以便判定其每个部分实体的处理顺序 一如果用直接链接将子实体链接到父实体,则在父实体之前处理子实体; 一如果用返回链接将子实体链接到父实体,则在父实体之后处理子实体;一其中,每个部分实体的处理包括以下子步骤 一检查部分实体以检验其是否将被修改; 一如果其将被修改 从数据库检索最新完整实体实例; 在当前部分实体的分级位置上执行检验一如果当前部分实体是根实体或被直接链接到其父如果被标记为被查找,通过其查找标识符之一或通过其唯一密钥之一来进行检索;一如果其被成功地检索,用数据库上的新值来更新它,除非其为未被标记为“可更新”的查找实体;否则, 如果当前部分实体被返回链接到其父如果当前部分实体不是可通过唯一密钥检索的,创建具有新值的实体实例;否则如果其可访问性质的所有新值是无效的,从数据库去除整个实体实例,否则如果可访问性质的至少一个新值不是无效的,则用新值来更新当前部分实体。
10.权利要求6的方法,其中,所述写入方法是删除方法,其中一如果用返回链接将子实体链接到父实体,则之前删除子实体并之后删除父实体;否则,一如果用直接链接将子实体链接到父实体,则只删除父实体。
11.根据前述权利要求中的任一项所述的方法,其中,对于至少一个实体的CRUD界面的方法中的至少一个而言,关联将在运行时间执行的至少插件,其中,插件是实现定制动作的外部软件模块。
12.根据权利要求11所述的方法,其中,所述至少一个实体是虚拟实体。
13.根据前述权利要求中的任一项所述的方法,其中,所述实体是定制实体,用包含在动态实体描述符结构(DED)中的信息以动态的方式生成;其中,所述动态实体描述符结构 (DED)包括以下信息一关于在数据访问层中如何表示实体的信息(ERI); 一关于在储存库(DB)中如何存储实体数据的信息(ESI);一关于将如何对实体进行写入并调用哪些外部提供者(WOP)以执行写入操作的信息 (EWI)。
14.一种具有用于执行根据权利要求1至13中的任一项所述的方法的步骤的装置的系统。
15.权利要求1至13中的任一项所述的方法,其特征在于其在软件中实现。
全文摘要
公开了访问数据访问层的实体。本发明提供了一种用于数据访问层的实体的方法和系统,所述数据访问层遵循实体关系模型,其中,根据实体及其之间的关系来描述数据;其中,为实体提供CRUD界面;本发明包括以下各项a)定义元实体,在下文中称为虚拟实体,作为一个或多个实体的各部分的组合物而得到;b)经由虚拟实体描述符将虚拟实体描述为其中经由链接以父子结构来连接实体的分级结构;在所述虚拟实体描述符中,指定从每个实体获取哪些性质以形成虚拟实体的部分实体;c)在虚拟实体上提供CRUD界面;d)在运行时间,经由其CRUD界面来访问虚拟实体,所述访问被实现为对访问组成虚拟实体的实体的CRUD方法的一组调用。
文档编号G06F17/30GK102289448SQ201110162350
公开日2011年12月21日 申请日期2011年6月16日 优先权日2010年6月17日
发明者博埃罗 A., 科尔索 D. 申请人:西门子公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1