sharepoint入门_SharePoint Web Services入门

sharepoint入门

SharePoint通过一组Web服务来支持互操作性和远程操作,对于SharePoint,我指的是WSS 3.0(Windows SharePoint Services)和MOSS 2007(Microsoft Office SharePoint Server)。 有许多方法可以以编程方式访问SharePoint,例如对象模型,Web服务,HTTP上的RPC以及WebDAV,所有这些方法都有其优点,其位置取决于应用程序的需求。 SharePoint RPC协议既有用又强大,它当然具有优势,特别是在添加内容时。 对象模型比Web服务更健壮且功能丰富,但是它不提供对远程操作的支持,因此,为了利用对象模型,您的代码必须在SharePoint服务器上运行,并且您必须编写.NET。代码以利用它。 远程使用SharePoint数据有多种不同的原因,无论是管理脚本还是需要使用SharePoint内容,例如在客户端计算机上运行的应用程序中的任务,或企业中的非SharePoint应用程序。 SharePoint Web服务构建在对象模型的顶部,并公开了对象模型中可用的功能的子集,并允许远程操作以及支持Web服务使用的任何语言和平台的使用。 对于大多数任务,SharePoint中附带的Web服务已经足够了,但是您可能会在对象模型中找到Web服务中尚未出现的所需操作,这将需要使用自定义Web服务实现来扩展Web服务。 在本文中,我们将直接了解WSS3和MOSS 2007中可用的Web服务,以及如何从Java和.NET使用它们。

Web服务体系结构概述

我不会深入探讨WSS和MOSS之间的详细区别,因为有许多文章仅在需要时以及与Web服务相关的地方对这一点做了很好的解释。 请记住,MOSS 2007建立在WSS 3.0之上,而WSS 3.0也建立在ASP.NET 2.0之上并且在IIS(Internet信息服务器)中运行。 对IIS和ASP.NET的扎实了解很重要,并且在使用和理解SharePoint方面还有很长的路要走。 我们将讨论的大多数SharePoint Web服务都包含在WSS 3.0中,但是MOSS 2007中还包含一些其他服务,以利用其附带的其他功能,例如更高级的企业搜索功能。

SharePoint Web服务是在ASP.NET Web服务(ASMX)中实现的,您可以在“ Web服务器扩展\ 12 \ ISAPI”下的“ Microsoft共享”目录中找到大多数这些Web服务的物理文件,这些目录通常位于“ C:\ Program Files \ Common Files \ Microsoft Shared \ Web服务器扩展\ 12 \ ISAPI”。 管理中心工具的管理Web服务位于ADMISAPI文件夹中,该文件夹的管理中心控制台包含一个名为“ _vti_adm”的虚拟目录。 创建SharePoint网站时,它将包含一个名为“ _vti_bin”的虚拟目录,该目录指向该位置。 IIS不包含任何用于子站点的应用程序或虚拟目录,但是它们包含通过SharePoint元数据和HttpModules映射到_vti_bin虚拟目录的功能。

对于每个服务,您将找到一个* .wsdl.aspx文件,该文件生成服务WSDL(Web服务描述语言),一个* .disco.aspx提供服务发现实现,以及实际的* .asmx终结点文件,其中大多数只是包含引用SharePoint程序集和类型的页面指令,其中包含该服务的实际实现。

服务文件类型 描述
* .wsdl.aspx(search.wsdl.aspx) 在SharePoint中生成WSDL(Web服务描述语言)的文件
* .disco.aspx(seach.disco.aspx) 提供发现实现的文件
* .asmx(search.asmx) Web服务终结点,其中大多数包含引用SharePoint程序集的页面指令和包含该服务实际实现的类型

开箱即用服务

SharePoint中有许多Web服务已实现OOTB(开箱即用),这些服务将解决大多数常见和基本任务,从管理任务到搜索和使用列表数据,等等。 下面是SharePoint Web服务的列表,并概述了公开的功能供您参考。 像这样的简单扩展列表可以帮助我使用Web服务,从而使我可以快速查看可用的整体服务和方法。

服务 行政
(_vti_adm / Admin.asmx) 创建删除站点和检索部署中使用的语言的管理方法
  • 创建网站
  • DeleteSite
  • 获取语​​言
  • 刷新配置缓存
警报(Alerts.asmx) 使用SharePoint列表项警报的方法
  • DeleteAlerts
  • GetAlerts
身份验证(Authentication.asmx) 客户端代理,为使用基于表单的身份验证的站点提供用户身份验证
  • 登录(用于身份验证)
  • 模式(返回当前站点的身份验证模式)
复制(Copy.asmx) 在站点之间或站点内部复制文件的方法
  • CopyIntoItems(将文档作为字节数组复制到服务器上的位置)
  • CopyIntoItemsLocal(将文档从同一服务器上的一个位置复制到另一个位置)
  • GetItem(创建可以传递给CopyIntoItems方法的文档的字节数组)
文档工作区(Dws.asmx) 管理文档工作区网站和数据的方法
  • CanCreateDwsUrl
  • CreateDws
  • 创建文件夹
  • FindDwsDoc
  • GetDwsData
  • GetDwsMetaData
  • RemoveDwsUser
  • 重命名
  • UpdateDwsData
表格(Forms.asmx) 返回使用列表内容时在用户界面中使用的表单的方法
  • 获取表格
  • GetFormCollection
成像(Imaging.asmx) 创建和管理图片库的方法
  • CheckSubwebAndList
  • CreateNewFolder
  • 删除
  • 下载
  • 编辑
  • GetItemsByIds
  • GetItemsXMLData
  • GetListItems
  • ListPictureLibrary
  • 改名
  • 上载
列表数据检索(DspSts.asmx) 对网站执行查询并在SharePoint中列出
  • 查询(对SharePoint列表和网站执行查询)
列表(Lists.asmx) 使用列表和列表数据的方法
  • 添加附件
  • AddDiscussionBoardItem
  • 添加列表
  • AddListFromFeature
  • ApplyContentTypeToList
  • 删除附件
  • DeleteContentType
  • DeleteContentTypeXmlDocument
  • 删除清单
  • GetAttachmentCollection
  • 获取清单
  • GetListAndView
  • GetListCollection
  • GetListContentType
  • GetListContentTypes
  • GetListItemChanges
  • GetListItemChangesSinceToken
  • GetListItems
  • GetVersionCollection
  • 撤消结帐
  • UpdateContentType
  • UpdateContentTypesXmlDocument
  • UpdateContentTypeXmlDocument
  • 更新清单
  • UpdateListItems
会议(Meetings.asmx) 创建和管理会议工作区网站
  • 添加会议
  • 从ICal添加会议
  • 创建工作区
  • 删除工作区
  • GetMeetingInformation
  • GetMeetingWorkspaces
  • 删除会议
  • 还原会议
  • SetAttendeeResponse
  • SetWorkspaceTitle
  • 更新会议
  • UpdateMeetingFromICal
人(People.asmx) 解决并找到校长
  • 委托人
权限(Permissions.asmx) 使用网站或列表权限的方法
  • 添加权限
  • AddPermissionCollection
  • GetPermissionCollection
  • RemovePermission
  • RemovePermissionCollection
  • 更新权限
目录管理(sharepointemailws.asmx) 管理Active Directory电子邮件通讯组及其成员的方法
  • ChangeContactsMembershipInDistributionGroup
  • ChangeUsersmembershipInDistributionGroup
  • 创建联系人
  • CreateDistributionGroup
  • 删除联系人
  • DeleteDistributionGroup
  • GetJobStatus
  • 修改联系人
  • ModifyDistributionGroup
  • RenameDistributionGroup
站点数据(SiteData.asmx) 从站点或列表返回元数据或列出数据的方法
  • 枚举文件夹
  • 获取附件
  • GetChanges
  • 获取内容
  • 获取清单
  • GetListCollection
  • GetListItems
  • GetSite
  • GetSiteAndWeb
  • GetSiteUrl
  • GetURLSegments
  • 获取网页
网站(Sites.asmx) 返回有关集合或网站模板信息的方法
  • 出口网
  • GetSiteTemplates
  • GetUpdatedFormDigest
  • ImportWeb
搜索(spsearch.asmx) 通过搜索服务进行搜索的方法
  • 询问
  • QueryEx
  • 注册
  • 状态
用户和组(usergroup.asmx) 处理用户角色定义和组的方法
  • 添加组
  • AddGroupToRole
  • 添加角色
  • AddRoleDef
  • AddUserCollectionToGroup
  • AddUserCollectionToRole
  • AddUserToGroup
  • AddUserToRole
  • GetAllUserCollectionFromWeb
  • GetGroupCollection
  • 获取清单
  • GetListAndView
  • GetListCollection
  • GetGroupCollectionFromRole
  • GetGroupCollectionFromSite
  • GetGroupCollectionFromUser
  • GetGroupCollectionFromWeb
  • GetGroupInfo
  • GetRoleCollection
  • GetRoleCollectionFromGroup
  • GetRoleCollectionFromUser
  • GetRoleCollectionFromWeb
  • GetRoleInfo
  • GetRolesAndPermissionsForCurrentUser
  • GetRolesAndPermissionsForSite
  • GetUserCollection
  • GetUserCollectionFromGroup
  • GetUserCollectionFromRole
  • GetUserCollectionFromSite
  • GetUserCollectionFromWeb
  • GetUserInfo
  • GetUserLoginFromEmail
  • 删除组
  • RemoveGroupFromRole
  • 删除角色
  • RemoveUserCollectionFromGroup
  • RemoveUserCollectionFromRole
  • RemoveUserCollectionFromSite
  • RemoveUserFromGroup
  • RemoveUserFromRole
  • RemoveUserFromSite
  • RemoveUserFromWeb
  • UpdateGroupInfo
  • UpdateRoleDefInfo
  • UpdateRoleInfo
  • UpdateUserInfo
版本(Versions.asmx) 使用文件版本的方法
  • DeleteAllVersions
  • DeleteVersion
  • GetVersions
  • RestoreVersion
视图(Views.asmx) 使用列表视图的方法
  • 添加视图
  • 删除视图
  • GetViewCollection
  • GetViewHtml
  • 更新视图
  • UpdateViewHtml
  • UpdateViewHtml2
Web部件页(WebPartPages.asmx) 使用Web部件页面的方法
  • AddWebPart
  • AddWebPartToZone
  • AssociateWorkflowMarkup
  • ConvertWebPartFormat
  • DeleteWebPart
  • ExecuteProxyUpdates
  • FetchLegalWorkflowActions
  • GetAssemblyMetaData
  • GetBindingResourceData
  • GetCustomControlList
  • GetDataFromDataSourceControl
  • GetFormCapabilityFromDataSourceControl
  • GetSafeAssemblyInfo
  • GetWebPart
  • GetWebPart2
  • GetWebPartCrossPageCompatibility
  • GetWebPartPage
  • GetWebPartPageConnectionInfo
  • GetWebPartPageDocument
  • GetWebPartProperties
  • GetWebPartProperties2
  • RemoveWorkflowAssociation
  • RenderWebPartForEdit
  • SaveWebPart
  • SaveWebPart2
  • ValidateWorkflowMarkupAndCreateSupportObjects
网(Webs.asmx) 站点和子站点的工作方法
  • CreateContentType
  • CustomizeCss
  • DeleteContentType
  • GetActivatedFeatures
  • GetAllSubWebCollection
  • 获取列
  • GetContentType
  • GetContentTypes
  • GetCustomizedPageStatus
  • GetListTemplates
  • 获取网页
  • GetWebCollection
  • RemoveContentTypeXmlDocument
  • RevertAllFileContentStreams
  • RevertCss
  • RevertFileContentStream
  • UpdateColumns
  • UpdateContentType
  • UpdateContentTypeXmlDocument
  • WebUrlFromPageUrl
MOSS搜索(Search.asmx) 通过MOSS(Microsoft Office SharePoint Server)搜索服务进行搜索的方法,其中还包括一种检索托管搜索属性的方法
  • GetSearchMetadata(搜索托管属性)
  • 询问
  • QueryEx
  • 注册
  • 状态

消费查询服务

现在,我们已经对SharePoint Web服务有了了解,再也没有什么比在阅读用户手册后大吃一惊了。 我们没有时间在这里深入研究所有Web服务,并将在下一篇文章中保留其他内容。 由于某种原因,SharePoint中的许多Web服务都采用或返回XML节点或XML编码的字符串,不幸的是,如果没有类型化的架构,这些工具将无法推断出应该是什么,并无法为我们生成这些漂亮的代理对象。 我已经看到了许多使用字符串格式对Web服务进行处理的实现,以解决缺少类型化模式的问题,并且已经在很长的一段时间内搜索了描述从这些服务传递和返回的XML的模式。 我最终创建了queryresponse.xsd,它是从文档以及这些服务传入和传出的xml的组合中推断出来的,从而使我可以使用xsd.exe(针对.NET用户)和JAXB(针对Java用户)来生成类表示形式。

注意 :如上所述,有两种不同的搜索Web服务,对于MOSS为search.asmx,对于WSS为spsearch.asmx。 这些服务的架构非常相似,但是由于已禁用WSS索引和查询服务以支持MOSS中更高级的搜索,因此尝试在运行MOSS的计算机上调用spsearch.asmx将引发异常。

使用.NET的示例

从.NET使用SharePoint Web服务非常简单直接,您只需要添加一个Web参考并使用生成的代理即可。 我们将添加一个步骤来利用我们创建的XSD生成代表查询和响应的一组类,这些类将用于序列化发送的XML和反序列化返回的XML。

配置Visual Studio 2005以将XSD.exe添加到菜单

Visual Studio包含一个名为XSD.exe的工具,可用于从XSD生成.NET类型。 但是,这是一个命令行工具,我想在Visual Studio中添加一个菜单选项,以通过IDE进行此操作。 如果您已经执行了此操作,或者有其他一些外接程序可以执行类似的操作,则可以跳过此步骤。

  1. 在Visual Studio“工具”菜单中打开“外部工具”对话框
  2. 点击“添加”
  3. 设置必要的属性,然后单击“确定”
属性
命令 XSD >> CSharp
标题 C:\ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ Bin \ xsd.exe
争论 $(ItemPath)/ c
初始目录 $(ItemDir)
使用输出窗口 已检查
下载XSD文件

此处下载XSD文件,该文件将用于生成用于对搜索请求和响应进行序列化和反序列化的代理类。 将下载的文件解压缩到工作目录中; 该文件包含XSD以及完成的项目。

创建项目并从XSD生成.NET类型现在,有了XSD,我们将创建Windows Forms项目,并从下载的XSD生成.NET类型。 打开Microsft.Search.Query.xsd后,转到工具菜单,然后选择我们在上一步中创建的XSD菜单项,以生成Microsoft_Search_Query.cs文件。

添加网络参考

首先,通过在“解决方案资源管理器”窗口中右键单击项目的“引用”节点,将Web引用添加到搜索Web服务中。 在此处,我们将选择“添加Web引用”,在URL文本框中输入“ http:// <服务器名称> / _ vti_bin / spsearch.asmx”,然后单击“转到”。 可能会提示您登录到SharePoint服务器,现在您应该具有此服务支持的方法列表。 为“ Web参考名称”添加“ SPSearch”,然后单击“添加参考”。

子类化生成代理

为了进一步简化操作,我们将使用自己的类将生成的代理子类化,以便我们可以包装QueryService来隐藏使用从Query方法生成的类在Query方法中传递和返回的XML的验证,序列化和反序列化。 XSD。

创建应用程序以调用服务

现在,我们简单地实例化一个查询类和QueryService类,然后将查询对象传递给QueryService类上的Query方法。

SPSearch.QueryService search = new SPSearch.QueryService();
Microsoft_Query_Request request = new Microsoft_Query_Request();
search.Query(request);

使用Java的示例

使用Java来使用SharePoint Web服务并没有太大区别,基本步骤相同,从提供的XSD生成类,生成Web服务代理,然后构建应用程序。 使用Java使用SharePoint Web服务时,您将面临的大多数挑战都是身份验证以及在SharePoint Web服务中使用数据集。 有许多Java IDE可以简化使用Web服务的工作,但是由于这些天我主要使用.NET,因此我将展示一个使用SDK的示例,在这种情况下,请您选择一个IDE。

注意 :此示例是使用J2SE 6.0 Update 3构建和测试的

Java SharePoint示例项目目录和根文件

包括完整的项目和生成的文件 ,以及几个批处理文件,以构建和运行示例。 您将需要使用JDK bin文件夹的主目录修改“ xjc-build.bat”和“ build-run.bat”才能运行此目录,并使用服务器设置(端点,用户名和用户名)编辑wsspsample / Main.java。密码),然后再进行构建和运行。

导入服务WSDL

首先,出于两个原因,我将从SharePoint服务器中的WSDL检索到开发计算机中。 我们将需要修改任何使用ADO.NET数据集的WSDL,以便与工具正常工作。 另外,访问SharePoint服务器上的WSDL通常需要进行身份验证,而Java生成的代理则需要构造函数中的WSDL,这给我带来了一些麻烦。

检索搜索WSDL

对于Windows SharePoint Services 3.0搜索服务,请打开Internet Explorer并导航到“ 错误! 超链接引用无效 。 然后从文件|另存为...中,将页面另存为spsearch.wsdl到工作目录。 如果您正在使用MOSS 2007,则将使用“ 错误”! 超链接引用无效

修改搜索WSDL

QueryEx方法以及MOSS 2007 GetSearchMetaData方法都将返回ADO.NET数据集。 ADO.NET数据集是动态绑定的,并以WSDL模式属性的循环引用在WSDL中表示,这给我们使用JAXB wsimport工具带来了一些问题。 我发现一些变通方法与Java JDK的早期版本很好地兼容,但是这些变通方法不适用于我使用的版本。 相反,我选择如下修改WSDL,方法是在记事本中打开WSDL,然后搜索“ s:schema”的实例,以修改在架构“ element”元素中用作ref的位置,并删除循环引用并保留模式“任何”元素。

<s:sequence>
<s:element ref="s:schema"/>
<s:any/>
</s:sequence>

被更改为以下内容:

<s:sequence>
<s:any minOccurs="0" maxOccurs="unbounded"/>
</s:sequence>

导入WSDL

现在,我们已经在本地拥有了WSDL并已对其进行了修改,我们可以使用JAXB wsimport.exe工具生成代理类。

wsimport -p wsspsample.webref.spsearch -keep spsearch.wsdl
wsimport -p wsspsample.webref.search -keep search.wsdl

我们在导入时使用-keep标志来保留Java代码,以便我们可以为应用程序调整生成的代码。 这些工具会生成带有绝对路径的代码,因此,如果您打算将应用程序移动到其他目录并将WSDL与应用程序一起存储,我们将需要修改“ webref \ search \ QueryService.java” URL并自行构建。 为此,我们只需删除WSDL的绝对路径并使用相对路径即可。

url = new URL("file:search.wsdl");
生成请求响应类

要生成Request和Response类,您将需要使用我创建的四个“ Microsoft.Search” XSD和JAXB xjc.exe工具。 在下面的内容中,我们仅禁止生成包级别注释并指定目标包,然后该工具将为我们创建类。

xjc -npa -p wsspsample.xom.query -d . Microsoft.Search.Query.xsd
xjc -npa -p wsspsample.xom.response -d . Microsoft.Search.Response.xsd
使用生成的类

我们具有传递给QueryService Query方法并从中返回的Query和Response数据包的类表示形式,以及Query Service代理。 现在是时候在应用程序中使用它了。 我们需要做的第一件事是创建一个QueryService实例,该对象的构造函数将进入并检索WSDL的本地副本并加载设置。 从QueryService实例中,我们通过getQueryServiceSoap方法检索QueryServiceSoap实例。 请注意,您将需要像使用qsp变量一样继续使用QueryServiceSoap引用,因为getQueryServiceSoap方法似乎返回了一个新实例。 然后,我们可以在此处将端点地址修改为WSDL中包含的内容以外的内容,以使我们的应用程序更具动态性,从而使其可以连接到WSDL中设置的其他SharePoint网站和SubSites。

QueryService qs = new QueryService();
QueryServiceSoap qsp = qs.getQueryServiceSoap();

BindingProvider bp = (BindingProvider)qsp;
//bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "Administrator");
//bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pass@word1");
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://barbie/_vti_bin/spsearch.asmx");

现在,我们创建一些方法来序列化查询并反序列化响应数据包。

public static String SerializeQuery(QueryPacket qp)
{
try
{
JAXBContext jc =JAXBContext.newInstance("wsspsample.xom.query");
Marshaller ma = jc.createMarshaller();
ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ma.marshal(qp, os);
return os.toString();
}
catch(JAXBException ex)
{
return "";
}
}
public static ResponsePacket DeserializeResponse(String s)
{
try
{
JAXBContext jc = JAXBContext.newInstance("wsspsample.xom.response");
Unmarshaller um = jc.createUnmarshaller();
StreamSource source = new StreamSource(new StringReader(s));
return (ResponsePacket)um.unmarshal(source);
}
catch (JAXBException ex)
{
return new ResponsePacket();
}
}

从这里我们只需创建一个QueryPacket和必要的类,设置我们的值并调用该服务。

// Create a Search Query Packet Object
QueryPacket qp = new QueryPacket();
QueryType qt = new QueryType();
ContextType ct = new ContextType();
QueryTextType ctt = new QueryTextType();

ct.setQueryText(ctt);
qt.setContext(ct);
qp.setQuery(qt);

// Set search values
ctt.setValue("sharepoint");
ctt.setType("STRING"); //This is the default - not necessary
ctt.setLanguage("en-us"); //This is the default - not necessary

// Call the web service query
String sResponse = qsp.query(SerializeQuery(qp));

// Deserialize the response
ResponsePacket resp = DeserializeResponse(sResponse);
生成并运行应用程序

我们已经生成了用于查询请求和响应的Web服务代理和对象模型,以及利用它们的应用程序,现在我们只需要动手,构建,运行和测试它。 您将需要安装SharePoint服务器,并希望将Main.java中使用的正确终结点地址设置为测试SharePoint服务器以及必要时的凭据。

参考和链接

Windows SharePoint Services 3.0 Web服务参考

翻译自: https://www.infoq.com/articles/swanson-moss-web-services/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

sharepoint入门

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SharePoint 是一种用于创建、共享和管理组织内部网站和内容的平台。它可以帮助团队协作、文档管理、数据分享和工作流程自动化。 要入门 SharePoint,以下是一些建议: 1. 了解 SharePoint 的基本概念和术语:熟悉 SharePoint 平台的基本概念,如网站、列表、库、页面和权限等。 2. 注册 SharePoint 网站:注册一个 SharePoint 网站,这是你创建和管理内容的地方。可以尝试使用 Microsoft 365 订阅或 SharePoint Online 进行注册。 3. 探索 SharePoint 网站:浏览你的 SharePoint 网站,了解其组织结构和功能。探索不同的模板和页面布局,以获取更多想法。 4. 创建列表和库:使用列表和库来组织和存储内容。例如,创建一个文档库来存储文件,或创建一个任务列表来跟踪团队的工作。 5. 学习权限管理:了解如何设置和管理用户权限,以确保只有授权人员可以访问和编辑内容。 6. 配置工作流程:利用 SharePoint 的工作流程功能来自动化业务过程。学习如何创建和配置工作流程,以提高生产力和效率。 7. 使用 SharePoint 应用程序:探索 SharePoint 应用程序,这些应用程序可以增强和扩展 SharePoint 的功能。例如,Power Automate 可以帮助你创建自定义工作流程,Power Apps 可以帮助你构建自定义应用程序。 8. 学习 SharePoint 开发:如果你具有开发经验,可以学习 SharePoint 开发来自定义和扩展 SharePoint 的功能。了解 SharePoint Framework (SPFx) 和 SharePoint Designer 等工具。 以上是入门 SharePoint 的一些建议。探索不同的功能和实践,逐步熟悉平台,并根据你的需求进行定制和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值