用于内容资源管理的方法和装置与流程

文档序号:11832011阅读:177来源:国知局
用于内容资源管理的方法和装置与流程

本发明的各实施方式涉及内容资源管理,并且更具体地涉及用于例如在表现性状态转移(Representational State Transfer,REST)架构下的内容资源管理方法和装置。



背景技术:

REST是一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST描述了一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是REST风格(RESTful)。

REST应用程序编程接口(Application Programming Interface,API)为WEB应用能力之间常用的互操作接口,即遵循REST风格的API,遵循REST风格的API对应的系统成为遵循REST风格的系统。REST风格的系统特点包括:对外开放的信息为资源;资源通过传统WEB的通用资源标识符(Uniform Resource Identifier,URI)来标识;以及对外开放有限的资源操作,包括:增加、修改、删除、获取。

在为用户开发REST系统中,通常需要开发系统默认内容资源,例如,文档、文件夹、用户、组等,并且针对系统内容管理核心的数据模型创建软件或者服务,例如开发系统REST服务以提供REST API,实现诸如文档管理、文件夹管理等的、针对系统默认内容资源的一些默认的行为。

当用户为其自身的用户(以后成为“终端用户”)提供服务时,需要有效地对内容资源进行管理。但是,在REST框架下,按照现有方式,任何对于内容资源的管理(例如修改、扩展等等)都需要开发者来开发用户的订制资源、修改系统默认内容资源并且定义相应的行 为,即修改已经开发成型的REST API。

因此,需要提供一种便于用户进行内容资源管理的技术方案



技术实现要素:

为了解决一个或多个现有技术中存在的问题,根据本发明的实施方式提出一种便于用户进行内容资源管理的技术方案。

根据本公开的第一方面,提供一种用于内容资源管理的方法。该方法包括:与内容服务服务器进行通信,以获取在内容服务器中存储的内容资源;加载配置组件,其中配置组件定义有管理内容资源的功能性接口;基于配置组件来管理从内容服务器获取的内容资源。

根据本公开第一方面的一个实施方式,基于配置组件来管理从内容服务器获取的内容资源包括:基于配置组件来加载来自内容服务器的由用户定制的内容资源,其中用户定制的内容资源不同于系统默认内容资源。

根据本公开第一方面的又一实施方式,可选地或者附加地,基于配置组件来管理从内容服务器获取的内容资源包括:至少基于配置组件来表现对于从内容服务器获取的内容资源的视图。

根据本公开第一方面的又一实施方式,可选地或者附加地,基于配置组件来管理从内容服务器获取的内容资源包括:基于配置文档,去激活从内容服务器获取的内容资源中的一个或多个内容资源。

根据本公开的第二方面,提供一种用于内容资源管理的装置。该装置包括:通信层单元,被配置为与内容服务服务器进行通信,以获取在内容服务器中存储的内容资源;加载单元,被配置为加载配置组件,其中配置组件定义有管理内容资源的功能性接口;内容资源管理单元,被配置为基于配置组件来管理从内容服务器获取的内容资源。

根据本公开的第二方面的一个实施方式,内容资源管理单元被配置为:基于配置组件来加载来自内容服务器的由用户定制的内容资源,其中用户定制的内容资源不同于系统默认内容资源。

根据本公开的第二方面的又一实施方式,可选地或者附加地,内 容资源管理单元被配置为:至少基于配置组件来表现对于从内容服务器获取的内容资源的视图。

根据本公开的第二方面的又一实施方式,可选地或者附加地,内容资源管理单元被配置为:基于配置文档,去激活从内容服务器获取的内容资源中的一个或多个内容资源。

根据本公开的第三方面,提供一种应用服务器。该应用服务器包括根据本公开的用于内容资源管理的装置。

根据本公开的第四方面,提供一种应用服务器。该应用服务器包括一个或多个处理器以及存储有计算机程序指令的存储器。当由一个或多个处理器执行计算机程序指令时使得应用服务器执行根据本公开的用于内容资源管理的方法。

根据本公开的第五方面,提供一种包括计算机程序指令的计算机程序产品。当由计算设备执行计算机程序指令时使得计算设备执行根据本公开的用于内容资源管理的方法。

根据本发明各个实施方式,在配置组件中提供用于进行管理内容资源的功能性接口,使得用户能够容易地通过设置配置组件中的功能接口,来根据需求对内容资源进行管理,而无需重新开发系统提供的应用程序编程接口和行为。

附图说明

图1是示出能够用于支持本公开实施方式的示例性服务器实现架构的示意图;

图2是示出根据本公开一个实施方式的用于实现内容资源管理的方法的流程图;

图3是示出内容资源的示意图,其中内容资源包括包括添加的用户定制内容资源和系统默认内容资源;

图4是示出根据本公开一个实施方式的用于实现内容资源管理的装置的框图;

图5是示出能够用于实现根据本公开的实施方式的计算设备的示 意性框图。

具体实施方式

图1是示出能够用于支持本公开实施方式的示例性应用服务器实现架构100的示意图。

支持本公开实施方式的示例性服务器实现架构例如可以是基于Spring框架来开发的Spring REST MVC(Model View Controller)。这里对于Spring REST MVC的描述仅旨在给出一种示例性的服务器实现架构,而并非以该示例中的任何细节对本公开的范围进行任何限制。本领域的技术人员可以理解,还可以采用任何其它适合的涉及框架来支持根据本公开的各个实施方式。

具体地,在图1的示例中,服务器实现架构100可以是核心REST MVC。根据图1所示的服务器实现架构100包括四层,即,持久(Persistence)层110、模型(Model)层120、资源控制器(Resource Controller)130、以及视图(View)层140。在应用服务器系统中,一个内容资源(例如文档、文件夹、用户等)从通信到表现需要通过上述四层。

持久层110是具有对于登录的会话管理器意识的API(例如,DFC(Documentum Foundation Classes)API)的封装器。持久层110提供的持久层API能够实现客户机和服务器之间的通信。持久层API的输入和输出都是模型类。在持久层110向资源控制器输出的结果是可序列化的模型。

模型层120用来存放数据的编程语言的数据结构(例如,Java数据结构),而且是可以序列化的模型(直接被序列化成XML(Extensive Markup Language)或JSML(Java Speech API Markup Language)或者从XML或JSML反序列化为模型)。

资源控制器层130定义了资源HTTP接口。在资源控制器层130例如可以定义所访问资源的位置,即统一资源标识符(URI),以及定义访问的请求方法(例如创建请求、删除请求、添加请求等),以 及请求中的参数。资源控制器层130的输出是模型。

视图层140定义了对于内容资源的属性、链接以及其它特征的表现。通常内容服务器包括数据存储和数据库。内容资源对象的内容数据存储在数据存储中,内容资源对象的属性作为元数据(metadata)存储在数据库中。

根据本公开的各个实施方式,为了能够实现对于内容资源的管理,引入了对于配置组件(图1中未示出)的加载,以便在启用时(部署和/或运行时)对内容资源进行管理。

图2是示出根据本公开一个实施方式的用于实现内容资源管理的方法的流程图。

如图2所示,在步骤S210中,应用服务器与内容服务服务器进行通信,以获取在内容服务器中存储的内容资源。例如,如上文所述,应用服务器可以通过持久层110与内容服务器进行通信。在步骤S220中,加载配置组件,该配置组件定义有管理内容资源的功能性接口。在步骤S230中,基于配置组件来管理从内容服务器获取的内容资源。

以下通过具体的实施方式来详细讨论对内容资源的管理。

扩展内容资源

对于定制资源开发而言,用户可能需要扩展新的内容资源。图3是示出一个内容资源的示意图。内容资源300包括系统默认内容资源310和需要添加的用户定制内容资源320。其中系统默认内容资源310中可以包括开发者已经为系统开发成型的一个或多个内容资源项310-1、310-2,…,310-N,这些内容资源项之间具有链接关系(未示出)。用户定制内容资源320中可以包括一个或多个内容资源项320-1、320-2,…,320-M,这些内容资源项之间也具有用户定制的链接关系(未示出)。系统默认内容资源310中的任何内容资源项(例如,310-1、310-2,…,310-N中的一个或多个)可以与用户定制内容资源320中的一个或多个内容资源项320-1、320-2,…,320-M存在链接关系的集合330,其中包括系统默认内容资源310中的内容资源项和用户定制内 容资源320中的内容资源项之间可能存在的所有链接关系。虽然在图3中将链接关系集合330示出为双向箭头,但是应该理解链接关系集合330中的每个链接关系总是单向的。在扩展内容资源时,用户可能需要向系统默认内容资源310中的一个或多个内容资源项添加链接关系,以便恰当地将系统默认内容资源310和用户定制内容资源320链接。在配置的时候会打破原有的关联性。系统可以自动检测资源之间的关联性,并且在加载配置组件时根据相应的功能性(例如,添加、去激活等)来修改资源项之间的链接关系。

在扩展内容资源的实施方式中,图2的步骤S230可以包括基于配置组件来加载来自内容服务器的由用户定制的内容资源。这里用户定制的内容资源(例如如标号320所示)与系统默认内容资源(例如如标号310所示)不同。添加既有资源项与所扩展的用户定制内容资源项之间的链接。一方面,用户需要控制用户定制资源项如何与系统默认内容资源之间的链接。用户知晓从用户定制资源到达系统默认内容资源需要增加哪些链接。另一方面,用户需要控制既系统默认内容资源如何到达用户定制资源。

配置组件的功能性接口可以包括定制内容资源注册接口。定制内容资源注册接口至少指定:用户定制的内容资源的内容资源名称;用户定制的内容资源与系统默认内容资源的链接关系;与用户定制的内容资源的统一资源标识符相关的信息。

一些实施方式中,定制内容资源注册接口中指定的与用户定制的内容资源的统一资源标识符相关的信息可以是内容资源的URI。在另一些可选或者附加的实施方式中,定制内容资源注册接口中指定的与用户定制的内容资源的统一资源标识符相关的信息可以包括统一资源标识符模板。可以根据统一资源标识符模板来生成用户定制的内容资源的统一资源标识符。如果统一资源标识符模板中包括一个或多个变量,则在一些实施方式中,定制内容资源注册接口还可以指定统一资源标识符模板中变量和用户定制的内容资源的属性之间的映射关系。

作为一个具体示例,根据一种配置组件的具体实现,在REST归档文件中,例如YAML文件rest-api-custom-resource-registry.yaml提供了一种定制内容资源注册接口resource-link-registry(资源-链接-注册),以指定需要添加的用户定制内容资源并且向系统默认内容资源添加相关链接关系。

以下给出一种对于定制内容资源注册接口的示例性语法:

在以下表1中给出了对定制内容资源注册接口的详细描述。

表1

例如,定制内容资源注册接口可以具体配置如下以添加资源“object”,并添加资源“object”到系统默认内容资源“acl”的链接关系'http://identifiers.emc.com/linkrel/acl':

在该示例中,与用户定制的内容资源的统一资源标识符相关的信息通过统一资源标识符模板X_ACL_RESOURCE_TEMPLATE来生成。

统一资源标识符模板可以在配置模块的模板注册接口uri-template-registry中通过定义。以下给出一种模板注册接口的示例性语法:

例如,在上述示例中,统一资源标识符模板X_ACL_RESOURCE_TEMPLATE可以定义为:

uri-template-registry:

-name: X_ACL_RESOURCE_TEMPLATE

href: '{repositoryUri}/objects/{objectId}/acl{ext}'

并且,由于统一资源标识符模板X_ACL_RESOURCE_TEMPLATE包括变量objectId,因此在定制内容资源注册接口resource-link-registry中需要指定统一资源标识符模板中变量和用户定制的内容资源的属性之间的映射关系value-mapping:[objectId:r_object_id]。

根据本公开的一些实施方式,可以提供系统核心归属文档来指定所有根资源。如果所添加的用户定制资源包括根内容资源(即没有链接到该定制资源的上层资源),则开发者可以修改系统核心归属文档来注册根内容资源。一旦注册了用户定制的根资源,则系统核心归属文档将会包含对于该根内容资源的附加条目,以便链接到用户定制的内容资源。

通过上文的示例,详细描述了如何通过配置组件来扩展内容资源。用户在配置组件中利用定制内容资源注册接口进行相关配置。在应用程序部署阶段,基于加载的配置组件,例如资源控制器层130可以加载用户定制的内容资源并且创建用户定制的内容资源和系统默认内容资源之间的链接关系。视图层140可以对用户定制的内容资源的属性以及其与系统默认内容资源之间的链接关系进行表现。

定制内容资源视图

视图是应用程序中处理数据显示的部分。通常视图是例如视图层140依据模型数据创建的。每个内容资源项都定义一个视图,例如内容资源具有何种属性、链接在视图中展现出来。

一些情况下,用户可能需要定制所需的内容资源视图,而不使用系统默认的对系统默认内容资源的视图表现。在内容资源扩展的情况 下,用户也很可能希望针对用户定制的内容资源定制内容资源视图。

根据本公开的一些实施方式,图2的步骤S230可以包括至少基于配置组件来表现从内容服务器获取的内容资源的视图。在示例性实现中,在视图层140中可以配置有接口以便读取加载的配置组件,从而将配置组件中的用户配置和系统定义的视图结合起来,来最终表现内容资源项。

根据一个或多个实施方式,配置组件的功能性接口可以包括内容资源视图注册接口。内容资源视图接口至少指定:用户被表现的内容资源名称;指定被表现的内容资源视图的信息。内容资源视图接口所指定的内容资源既可以包括系统默认内容资源和/或用户定制的内容资源。也就是说,无论统默认内容资源还是用户定制的内容资源,用户都可以通过配置组件来对其视图表示进行定制。

以下给出一种内容资源视图注册接口的实行语法:

resource-view-registry:

-resource: <资源代码名称>

view: <用户定制视图的类的规范名称>

例如,用户希望利用编写的类来定制资源repository,则示例性的内容资源视图注册接口如下:

resource-view-registry:

-resource:repository

view: [org.acme.view.impl.custom.RepositoryViewExtend]

本领域的技术人员可以理解,用户可以通过编写定制视图的代码,可以按需要对定制内容资源的表现的视图。例如,用户可以修改/替换内容资源项的视图,定制不显示(隐藏)某一内容资源项的某些属性/链接,甚至可以定制不显示(隐藏)一个或多个特定内容资源项,等等。

内容资源去激活

开发者开发REST服务以提供REST API实现诸如文档管理、文件夹管理等的、针对系统默认内容资源的一些默认的行为。用户可能不希望终端用户对一些内容资源进行操作。比如,在管理文档资源中,提供默认行为包括锁定、修改、提供新的版本等。但是用户可能不希望终端用户进行其中的某些操作,比如修改。

根据本公开的一个或多个实施方式,图2中的步骤S230例如可以包括:基于配置文档,去激活从内容服务器获取的内容资源中的一个或多个内容资源。在示例性实现中,资源控制器140可以读取加载的配置组件,以在应用程序的部署阶段控制不加载被去激活的一个或多个内容资源;以及在加载除了被去激活的内容资源以外的其它内容资源时,去除与被去激活的内容资源有关的链接。在一些实施方式中,可选地或者附加地,资源控制器140还可以被配置为不加载那些仅由被去激活的内容资源所指向的那些内容资源(即被去激活的内容资源的下层资源)。

根据本公开的实施方式,配置组件的功能性接口可以包括去激活内容资源注册接口。通过去激活内容资源注册接口用户可以至少指定被去激活的内容资源的名称。

以下给出一种对于去激活内容资源注册接口的示例性语法:

disabling-resource-registry:

-resource: [<name1>,<name2>,...] <去激活资源的代码名称列表>

根据本公开的一个或多个实施方式,可选地或者附加地,视图层140可以在表现除了被去激活的内容资源以外的其它内容资源的视图时,不表现与被去激活的内容资源有关的链接的视图。由此,终端用户无法通过表现的链接关系来访问去激活的资源。

可选地或者附加地,在一些实现中,如果终端用户的查询结果涉及到去激活的内容资源(例如包括指向去激活内容资源的链接、或者具有指向去激活内容资源的属性等),则视图层140可以被配置为不表现与相应被去激活内容资源的有关的链接关系。具体地,在通过持久层110获取了查询操作的通信结果后,视图层140可以被配置为基 于配置组件而不表现指向去激活内容资源的链接。由此,最终用户不能够通过查询结果链接到去激活的内容资源。

可选地或者附加地,在另一些实现中,如果某些内容资源的属性包括链接,而该链接所指向的内容资源已经被去激活,则视图层140可以被配置为不将该链接呈现给最终用户。

在一个或者多个实施方式中,如果被去激活的一个或多个内容资源包括根内容资源,则可以在系统核心归属文档中去除被去激活的根资源,以便通过系统核心归属文档无法链接到被去激活的根资源。

在这些实施方式中,资源控制器140可以在应用程序部署到应用服务器时即通过检测配置组件来确定需要去激活哪个内容资源,从而不再加载相应的内容资源。从安全性的角度考虑,通过这样的方式,终端用户不能通过任何链接关系找到去激活的资源,由此使得更加安全地管理资源。

可选地或者附加地,在一些实现方式中,如果终端用户试图通过去激活内容资源对应的URI来访问去激活的内容资源,则系统可以被设计为返回相应的错误状态码。

可选地或者附加地,在一些实现方式中,如果最终用户请求针对已经被去激活的内容资源创建实例,则系统可以被涉及为返回相应的错误状态码,以拒绝最终用户的请求。

本领域的技术人员可以理解,虽然上文中基于内容资源去激活的功能项给出了许多具体实施方式,但是开发者可以根据需求设计如何去激活与去激活内容资源相关的资源和/或链接关系(例如通过资源控制器130),并且还可以根据需求设计如何处理内容资源去激活之后的视图表现(例如通过视图层140)。上文描述的各种实施方式均提供了有利的技术效果,但是这些实施方式并非是穷举的,本领域技术人员能够想到的其它适当方式也包括在本公开的范围之内。

需要指出的是,以上虽然基于扩展内容资源、定制内容资源视图、去激活内容资源的三个具体示例分别描述了根据本公开的内容资源管理方案,但是本领域的技术人员可以理解,上述三个单独描述的示 例可以进行组合应用,而不会超出本公开的范围。例如,可以将去激活内容资源和扩展内容资源相结合,由此通过在配置组件中通过配置的方式实现对现有内容资源的替换。本领域的技术人员可以想到并且使用更多的组合性配置,来实现所需的内容资源管理功能。

还需要理解的是,虽然本文对于配置组件提供的功能项仅给出三个具体示例,但是这些示例并不是穷举或者限制性的。例如,可以单独为隐藏属性功能定义隐藏属性注册接口,从而使得资源管理单元,例如资源控制器层130和/或视图层140能够根据用户定制实现对指定属性的隐藏。本领域的技术人员可以定义更多地功能项,以便在加载配置组件后系统能够实现相应地功能。

图4是示出根据本公开一个实施方式的用于实现内容资源管理的装置的框图。

如图4所示,根据本公开一个实施方式的用于实现内容管理的装置400包括:通信层单元410、加载单元420以及内容资源管理单元430。

通信层单元410被配置为与内容服务服务器进行通信,以获取在内容服务器中存储的内容资源。加载单元420被配置为加载配置组件,其中配置组件定义有管理内容资源的功能性接口。内容资源管理单元430被配置为基于加载的配置组件来管理从内容服务器获取的内容资源。

根据本公开的一个或多个实施方式,内容资源管理单元430可以被配置为基于配置组件来加载来自内容服务器的由用户定制的内容资源。用户定制的内容资源不同于系统默认内容资源。相应地,配置组件的功能性接口例如可以包括定制内容资源注册接口。定制内容资源注册接口至少指定:用户定制的内容资源的内容资源名称;用户定制的内容资源与系统默认内容资源的链接关系;与用户定制的内容资源的统一资源标识符相关的信息。在一些实施方式中,与用户定制的内容资源的统一资源标识符相关的信息包括统一资源标识符模板。预定义的统一资源标识符模板可以被用来生成用户定制的内容资源的 统一资源标识符,以便提高生成URI的效率。如果统一资源标识符模板中包含变量,则定制内容资源注册接口还可以指定统一资源标识符模板中变量和用户定制的内容资源的属性之间的映射关系。在一些实施方式中,如果用户定制的内容资源为根内容资源,则内容资源管理单元被配置为,基于配置组件,在系统核心归属文档中注册用户定制的内容资源,由此可以通过系统核心归属文档链接到用户定制的内容资源。

根据本公开的一个或多个实施方式,内容资源管理单元430可以被配置为至少基于配置组件来表现对于从内容服务器获取的内容资源的视图。相应地,配置组件的功能性接口例如可以包括内容资源视图注册接口。内容资源视图接口至少指定用户被表现的内容资源名称;指定被表现的内容资源视图的信息。其中被表现的内容资源既可以包括系统默认内容资源,又可以包括用户定制的内容资源,或者其二者。

根据本公开的一个或多个实施方式,内容资源管理单元430可以被配置为基于配置文档,去激活从内容服务器获取的内容资源中的一个或多个内容资源。更具体地,内容资源管理单元430可以被配置为不加载被去激活的一个或多个内容资源,并且,内容资源管理单元430可以在加载除了被去激活的内容资源以外的其它内容资源时,去除与被去激活的内容资源有关的链接。可选地或者附加地,内容资源管理单元430被配置为在表现除了被去激活的内容资源以外的其它内容资源的视图时,不表现与被去激活的内容资源有关的链接的视图。根据一个实施方式,如果被去激活的一个或多个内容资源包括根内容资源,则内容资源管理单元430可以被配置为在系统核心归属文档中去除被去激活的根资源,以便使得最终用户通过系统核心归属文档无法链接到被去激活的根资源。在一个或多个实施方式中,配置组件的功能性接口可以包括去激活内容资源注册接口。去激活内容资源注册接口至少指定被去激活的内容资源的名称。

根据本发明各个实施方式,根据本发明的各个实施方式,在配置 组件中提供用于进行管理内容资源的功能性接口,使得用户能够容易地通过设置配置组件中的功能接口,来根据需求对内容资源进行管理,而无需重新开发系统提供的应用程序编程接口和行为。

图5是示出能够用于实现根据本公开的实施方式的计算机系统的示意性框图。

下面参考图5,其示出了适于用来实现本发明实施例的计算机系统500的示意性框图。如图5所示,计算机系统500包括中央处理单元(CPU)501,其可以根据存储在只读存储器(ROM)502中的程序或者从存储部分508加载到随机访问存储器(RAM)503中的程序而执行各种适当的动作和处理。在RAM 503中,还存储有计算机系统500操作所需的各种程序和数据。CPU 501、ROM 502以及RAM 503通过总线404彼此相连。输入/输出(I/O)接口505也连接至总线504。

以下部件连接至I/O接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至I/O接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器510上,以便于从其上读出的计算机程序根据需要被安装入存储部分508。

本发明的实施方式可以在软件、硬件、应用逻辑或软件、硬件和应用逻辑的组合中实现。在示例性实施方式中,应用逻辑、软件或指令集合维持在各种常规计算机可读介质的任何一个上。在本文的上下文中,“计算机可读介质”可以是能包含、存储、传送、传播或传输供诸如计算机之类的指令执行系统、装置或设备使用的或者与诸如计算机之类的指令执行系统、装置或设备有关的指令的任何介质或装置。计算机可读介质可以包括计算机可读存储介质,该计算机可读存储介质可以是能包含或存储供诸如计算机之类的指令执行系统、装置或设备使用的或者与诸如计算机之类的指令执行系统、装置或设备有关的指令的任何介质或 装置。

必要时,这里讨论的不同功能可以按照不同顺序执行和/或彼此并行执行。此外,必要时,上述功能中的一个或多个功能可以是可选的或者可以进行组合。

尽管在独立权利要求中阐明了本发明的各个方面,但本发明的其它方面包括来自所述实施方式和/或具有独立权利要求特征的从属权利要求的特征的其它组合,而不仅仅包括权利要求中明确阐明的组合。

这里还应注意的是,尽管上面描述了本发明的示例性实施方式,但这些描述不应在限制的意义上来看。相反,在不脱离所附权利要求书限定的本发明的范围的情况下可以进行各种变形和修改。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1