RSS

Monthly Archives: 六月 2010

《SharePoint 2010 应用程序开发指南》第二章预览

第二章详细介绍了Visual Studio 2010中内置的SharePoint Developer Tools。发现任何问题,请告诉我(kaneboy [a] gmail.com)。

第二章 使用Visual Studio 2010    2
第一节 建立开发环境    2
2.1.1 建立开发环境的可选方案    3
2.1.2 在Windows 7 x64操作系统中安装SharePoint 2010    6
第二节 SharePoint 2010项目模板与项模板    28
2.2.1 项目模板    28
2.2.2 项模板    35
2.2.3 可替换Token    40
第三节 使用Visual Studio 2010中的SharePoint开发人员工具    42
2.3.1 SharePoint网站连接器    43
2.3.2 SharePoint 2010项目结构    47
2.3.2 Feature设计器与解决方案包设计器    73
第四节 导入解决方案包    87
第五节 总结    106

点击“full”按钮可以全屏阅读。

 

Posted by on 2010/06/18 in 未分类

Leave a comment

Quick Tip : 为什么不能在子网站创建自定义权限级别?

在SharePoint 2010中,如果一个子网站是继承其父网站的权限,那么从网站设置中打开网站权限页面,你会看到:
image

点击Ribbon区域的“停止继承权限”,管理员就可以断掉当前网站与父网站的权限继承,自定义网站的权限设置:
image

但是,如果你还想在网站中创建自定义的权限级别,当点击Ribbon区域的“权限级别”按钮后,你可能会看到:
image 

在上面的截图中,显示网站的权限级别继承自父网站,你不能创建自定义的权限级别。没错,虽然网站的权限设置已经从父网站断开了,但是权限级别仍然有可能继承自父网站。如果你希望在子网站中能创建和管理自定义权限级别,那么…

从“开始”菜单中打开“SharePoint 2010 Management Shell”,然后输入如下这些指令:
image

然后刷新一下页面,就能够修改网站的权限级别啦:
image 

参考:
SPRoleDefinitionCollection.BreakInheritance Method

 

Posted by on 2010/06/18 in 未分类

1 Comment

“SharePoint 2010应用程序开发指南”节选 – 第二章 使用Visual Studio 2010 – 第一节

关于《SharePoint 2010应用程序开发指南》,我和杜伟同学正在撰写中,希望下半年早点写完。通常书正式出版的时候,出版社都会挑选2、3章,将电子版开放出来以供预览,我想了一下,与其等到定稿后、出版前才提供预览,不如早点将一些节选的章节开放出来,让大家"一起来找茬"…

 

大家在阅读的过程中,发现内容有任何的问题,都可以给我发邮件(kaneboy [at] gmail.com)告诉我。这次发布的是第二章《使用Visual Studio 2010》的第一节《建立开发环境》。第二章的完整目录如下。

 

第二章 使用Visual Studio 2010    2

第一节 建立开发环境    2

2.1.1 建立开发环境的可选方案    3

2.1.2 在Windows 7 x64操作系统中安装SharePoint 2010    6

第二节 SharePoint 2010项目模板与项模板    27

2.2.1 项目模板    28

2.2.2 项模板    35

第三节 使用Visual Studio 2010中的SharePoint开发人员工具    40

2.3.1 SharePoint网站连接器    40

2.3.2 SharePoint 2010项目结构    44

2.3.2 Feature设计器与解决方案包设计器    70

第四节 导入解决方案包    80

第五节 总结    100

 

第一节 建立开发环境

 

要开发SharePoint 2010应用程序,开发人员必须构建一个SharePoint 2010开发环境。开发SharePoint 2010应用程序有一个基本的需求,就是所有的开发工作几乎都需要依赖于SharePoint 2010系统,换句话说,开发环境中除了Visual Studio 2010之外,还必须直接安装有SharePoint 2010。在本地安装一个Visual Studio 2010,然后使用远程服务器上的一个SharePoint 2010系统,这种方式是不受支持的。

 

另外需要注意的是,只有Visual Studio 2010专业版以上的版本,才内置了SharePoint 2010开发人员工具,并且SharePoint 2010项目模板只有C#和Visual Basic.Net这两个语言版本。

 

2.1.1 建立开发环境的可选方案

 

SharePoint 2010必须使用x64架构,在很多时候,这会给创建SharePoint 2010开发环境带来一些麻烦。但是相比之前的版本,SharePoint 2010除了能被安装到Windows Server 2008 x64和Windows Server 2008 R2 x64这两个服务器操作系统之外,它还能被安装到Windows Vista x64 SP1和Windows 7 x64客户端操作系统之上。所以开发人员可以有多种选择,来建立自己的SharePoint 2010开发环境。表格 2-1列出了开发人员可选的几个主要方法。

 

方法

说明

优点

缺点

运行在开发人员本地机器上的虚拟机

在开发人员的本地机器上使用虚拟机技术,在虚拟机中安装Windows Server 2008/2008 R2 x64、SharePoint 2010、Visual Studio 2010,构建出一个完整的开发环境。所有的开发工作都在这个虚拟机中进行。

如果开发人员本地机器的操作系统是Windows Server 2008/2008 R2 x64,那么可以选择使用操作系统内置的Hyper-V功能,来创建和使用虚拟机。

如果开发人员本地机器的操作系统是Vista SP1 x64或Windows 7 x64,那么可以选择使用其他第三方的虚拟机软件,例如VMware Workstation或Virtual Box。

  • 开发环境和SharePoint 2010的实际运行环境比较一致。
  • 虚拟机里面的开发环境非常独立,不会受到额外不相干的软件的干扰。
  • 开发团队可以创建一个标准的开发环境虚拟机,然后共享给每个开发人员使用。
  • 虚拟机很容易备份。同时常见的虚拟机软件都会包含分支和回滚功能,这样使得开发环境具有较大的灵活性。
  • 需要高性能的开发机器,特别是需要大量内存。如果希望虚拟机运行流畅,开发机器的内存最好不要低于8GB。
  • 绝大多数的虚拟机软件,都要求宿主虚拟机的开发机器上必须安装64位的操作系统。(有些虚拟机软件,例如VMware Workstation,支持在32位的宿主操作系统上运行64位的虚拟机。)
  • 开发机器的CPU必须支持Virtualization Technology、EMT64和Execute Disable Bit。

直接在本地机器上安装SharePoint 2010

开发人员可以在
自己的本地开发机器上直接安装SharePoint 2010和Visual Studio 2010,然后把开发机器直接作为开发环境使用。

如果开发人员本地机器的操作系统是Windows Server 2008/2008 R2 x64,那么直接安装SharePoint 2010会比较简单,基本上和部署一个单服务器的SharePoint 2010没有什么区别。

如果开发人员本地机器的操作系统是Vista SP1 x64或Windows 7 x64,那么直接安装SharePoint 2010需要特别的操作,和常规的SharePoint 2010部署并不相同。

如果开发人员希望将开发环境和工作环境(用来收发邮件、存储和听MP3等等)分开,可以考虑使用多系统启动,将开发环境安装在一个独立的系统中。在多系统启动时,甚至可以考虑采用VHD Boot系数。

  • SharePoint 2010环境的运行速度比使用虚拟机技术要快。
  • 开发环境难以备份和移植。
  • 开发机器上的操作系统无论是Windows 2008/2008 R2,还是Vista或Windows 7,都必须是64位版本。
  • 开发环境容易受到日常工作环境中安装的众多软件的影响。
  • 即使在不做开发的时候,保持运行的SharePoint 2010后台服务也会影响到开发机器操作系统的性能。

使用专用的开发服务器

开发团队在专用的服务器上,使用虚拟机技术为每个开发人员创建独立SharePoint 2010开发环境。开发人员可以通过远程桌面的方式连接并使用开发环境。

  • 拥有虚拟机开发环境的各种好处。
  • 由于开发环境不位于开发人员的本地机器上,所以不需要本地机器具备太高的性能。
  • 开发环境的维护和管理,都可以集中在服务器端进行。
  • 开发团队需要有可用的服务器资源。
  • 由于服务器需要为每个开发人员提供独立的开发环境,这意味着服务器上可能需要同时运行多个虚拟机,这对服务器的性能有较高的要求。
  • 由于开发人员需要使用远程桌面连接到服务器上的开发环境,开发人员的效率可能会受到本地机器与服务器之间网络连接速度的影响。

表格 2-1:创建SharePoint 2010开发环境的可选方法列表

 

提示 有关VHD Boot的详细信息,请参考http://edge.technet.com/Media/Windows-7-Boot-from-VHD/

 

选择何种方式来建立开发环境,基本上取决于开发团队所拥有的资源。如果拥有比较好的硬件资源(比如开发机器拥有8GB的内存),那么推荐使用Hyper-V或其他第三方的虚拟机技术,在虚拟机中构建一个SharePoint 2010开发环境。虚拟机的好处是可以为开发团队创建一个标准、一致的开发环境,并且开发环境不会受到其他杂七杂八软件的干扰。如果开发人员的本地机器并没有那么"强劲",并且习惯使用Windows Vista x64 SP1或Windows 7 x64作为自己的主操作系统,那么可以选择直接将SharePoint 2010安装到本地机器的操作系统中。

 

提示 无论开发团队最终选择何种方式来为开发人员建立开发环境,但基本原则是每个开发人员都应该有独立的开发环境,而不能多个开发人员(甚至整个开发团队)共享一个开发环境。共享的开发环境通常会导致较低的开发效率。

 

2.1.2 Windows 7 x64操作系统中安装SharePoint 2010

 

使用虚拟机技术,或是直接将SharePoint 2010安装到Windows Server 2008/2008 R2 x64操作系统上,和部署一个单服务器SharePoint 2010系统区别不大,所以在本书中不再单独讲述。但由于直接将SharePoint 2010安装到Windows 7 x64操作系统中是SharePoint 2010的新特性,而且很多开发人员的本地机器上也是使用的此操作系统,所以我们将在本节介绍如何在Windows 7 x64操作系统中安装SharePoint 2010,以构建一个开发环境。我们相信对于很对开发人员而言,这算得上是一种经济且实用的方案。

 

对准备在Windows 7操作系统上安装SharePoint 2010的开发人员而言,一个好消息是,开发环境不一定需要加入到域中。无论你的开发机器是否已经加入了域,都没有关系。

 

在安装之前,建议将Windows 7内置的用户帐户控制(UAC)关闭。通过"控制面板 – 系统和安全 – 更改用户帐户控制设置",打开如图 2- 1所示的界面,然后将滑条滑动到最下面的一个选项。

 

2- 1:设置Windows 7中的UAC

 

提示 虽然SharePoint 2010也可以被安装到Vista SP1 x64操作系统中,但篇幅所限,所以本书仅介绍如何使用Windows 7 x64建立开发环境。如果你使用的是Vista SP1 x64,请参考SharePoint SDK中的相关章节:http://msdn.microsoft.com/en-us/library/ee554869.aspx

 

我们将要安装的SharePoint 2010开发环境具有如下特点:

  • 我们将直接在Windows 7系统中安装SQL Server 2008 R2,作为SharePoint 2010的数据库。
  • SharePoint 2010将以服务器场模式安装。

 

2.1.2.1 安装所需补丁与组件

 

首先,我们需要在Windows 7操作系统上安装SharePoint 2010所需要的各种补丁与组件。下面是所有必需补丁与组件的列表以及它们的下载地址,如果在下载页面上显示有多个平台版本(x86、x64、IA64),请确保下载并安装x64版本:

  • ADO.NET Data Services Update for .NET 3.5 SP1:http://www.microsoft.com/downloads/details.aspx?familyid=79d7f6f8-d6e9-4b8c-8640-17f89452148e&displaylang=en
  • Microsoft Sync Framework 1.0:http://go.microsoft.com/fwlink/?LinkID=141237
  • SQL Server 2008 Native Client:http://go.microsoft.com/fwlink/?LinkId=123718
  • Windows Identity Foundation:http://www.microsoft.com/downloads/details.aspx?FamilyID=eb9c345f-e830-40b8-a5fe-ae7a864c4d76&displaylang=en
  • Chart Controls:http://go.microsoft.com/fwlink/?LinkID=122517
  • ADOMD.Net:http://download.microsoft.com/download/A/D/0/AD021EF1-9CBC-4D11-AB51-6A65019D4706/SQLSERVER2008_ASADOMD10.msi
  •  

    以管理员身份打开命令提示符,如图 2- 2所示。

     

    2- 2:以管理员身份打开命令提示符

     

    在打开的命令提示符窗口中,输入如下指令,回车并运行。注意,下面的指令文本是一整行,而并非多条指令,在输入指令时,请确保指令文本中间没有换行符。建议先打开记事本,然后将指令先在记事本中输入完整,然后粘贴到命令提示符中后回车运行。

     

    start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ManagementScriptingTools;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-RequestFiltering;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI;WCF-HTTP-Activation;WCF-NonHTTP-Activation

     

    等待一会儿,在上面这行指令运行完成后。打开"控制面板 – 程序 – 打开或关闭Windows功能",在打开的窗口中,确认如图 2- 3与图 2- 4所示的Windows功能,都已经启用了。如果有缺失的功能,可以在这个窗口手工启用它们。

     

    2- 3:需要启用的Windows 7功能(1

     

    2- 4:需要启用的Windows 7功能(2

     

    2.1.2.2 安装SQL Server 2008 R2

     

    接下来,在Windows 7操作系统中安装SQL Server 2008 R2。在Windows 7中安装SQL Server 2008 R2并没有什么特别的,基本上和在Windows Server 2008/2008 R2操作系统中一样。图 2- 5到图 2- 9展示了笔者在自己的开发环境中安装SQL Server 2008 R2的设置,图片中的"kaneboy-pc\kaneboy"是笔者环境中开发机器的管理员帐户,其中"kaneboy-pc"是机器名。

     

    2- 5:安装SQL Server 2008 R21

     

    2- 6:安装
    SQL Server 2008 R22

     

    2- 7:安装SQL Server 2008 R23

     

    2- 8:安装SQL Server 2008 R24

     

    2- 9:安装SQL Server 2008 R25

     

    安装完成后,如果一切顺利,在Windows 7的任务管理器中,应该可以看到SQL Server相关服务的进程,如图 2- 10所示。

     

    2- 10SQL Server相关服务的进程

     

    提示 如果你选择安装SQL Server 2008,而不是SQL Server 2008 R2,那么在安装完成SQL Server 2008之后,需要继续分别安装下面这两个SQL Server 2008的更新包:

    • SQL Server 2008 SP1
    • SQL Server 2008 SP1 CU2(积累更新包2,下载地址:http://support.microsoft.com/kb/970315)或更高版本的CU

     

    2.1.2.3 安装SharePoint 2010

     

    为了将SharePoint 2010安装到系统中,建议将SharePoint 2010的安装文件先复制到Windows 7磁盘文件系统中。如果你手里的SharePoint 2010安装介质是光盘或ISO文件,只需直接将光盘或ISO中包含的文件直接复制到Windows 7中即可。如果安装介质是一个.exe可执行文件,那么可以通过在命令提示符中,在安装程序的后面加上"/extract"参数(例如:"SharePointServer2010.exe /extract")运行安装程序,就能将安装程序解压到指定的磁盘文件夹中。

     

    2- 11:将安装文件复制到Windows 7磁盘文件系统中

     

    打开"PrerequisiteInstallerFiles\FilterPack"文件夹,双击并运行"FilterPack.msi"。这是唯一一个内置在SharePoint 2010安装文件中的额外必需组件,它包含了SharePoint 2010搜索引擎将用到的各种iFilter。

     

    打开"Files\SetupFarm"文件夹中的"config.xml"文件,在"<Configuration>"节点中增加一个新的XML节点:

     

    <Setting Id="AllowWindowsClientInstall" Value="True"/>

     

    2- 12:修改后的"config.xml"文件

     

    以管理员身份打开命令提示符(如图 2- 2所示),将当前文件夹设置为放置SharePoint 2010安装文件的目录,然后执行"setup.exe /config Files\SetupFarm\config.xml"指令,启动SharePoint 2010安装程序,如图 2- 13所示。

     

    2- 13:执行SharePoint 2010安装程序

     

    在如图 2- 14所示的安装类型选择界面中,选择"服务器场"类型。在如图 2- 15所示的服务器类型选择界面中,选择"完整"类型。

     

    2- 14:安装类型选择界面

     

    2- 15:服务器类型选择界面

     

    耐心等待SharePoint 2010安装完成,当出现如所示的提示界面时,不要选择"立即运行SharePoint产品配置向导"复选框,直接点击"关闭"按钮即可,如图 2- 16所示。

     

    2- 16SharePoint 2010安装完成

     

    以管理员身份打开命令提示符窗口,将当前目录设置为"Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN"目录,然后在命令提示符窗口中输入"psconfig.exe –cmd configdb –create –server <开发机器的机器名> -database SharePoint_Config –user <开发机器管理员帐户> -password <开发机器管理员帐户的密码> -passphrase <指定一个用来加密SharePoint服务器场通讯的密码>"指令并运行,这将为SharePoint 2010系统创建配置数据库。图 2- 17是运行此指令后的输出结果。虽然在执行过程中,会输出"本地帐户应只能在独立模式中使用"之类的信息,但这并不会阻止成功创建配置数据库。

     

    2- 17:在命令行使用SharePoint配置向导创建配置数据库

     

    然后,直接从开始菜单中打开SharePoint 2010产品配置向导,配置向导会发现我们之前通过命令行所创建的配置数据库,在图 2- 18所示的界面上,选择"不断开与此服务器场的连接",点击"下一步"。

     

    2- 18:运行SharePoint 2010产品配置向导(1

     

    在图 2- 19所示的界面中,为SharePoint管理中心手工指定一个端口号或是使用默认的随机端口号,然后连续点击"下一步",完成SharePoint 2010产品配置向导的运行。如果一切顺利,你将看到如图 2- 20所示的界面。

     

    2- 19:运行SharePoint 2010产品配置向导(2

     

    2- 20SharePoint 2010配置成功

     

    SharePoint 2010产品配置向导运行成功完成之后,会自动打开SharePoint 2010管理中心。第一次打开管理中心网站时,会提示管理员运行服务器场配置向导。建议管理员使用这个配置向导,对服务器场进行初始设置、安装必要的服务并创建第一个网站集。如何对SharePoint 2010服务器场进行配置管理已经超出了本书的范围,读者可以参考/*《SharePoint 2010管理员指南》*/一书。

     

    2- 21SharePoint 2010服务器场配置向导

     

    提示Windows 7操作系统上运行完成配置向导,第一次打开SharePoint 2010管理中心网站时,有可能无法正常打开。如果遇到这样的情况,建议将当前浏览器关闭,然后使用"IISReset"指令重新启动IIS,然后再尝试通过开始菜单打开SharePoint 2010管理中心。

     

    提示Windows 7操作系统上,无法安装Office Web Applications组件。

     

    2.1.2.4 安装其他软件

     

    在成功安装SharePoint 2010之后,开发人员可以继续在

     

    Posted by on 2010/06/07 in 未分类

    3 Comments

    ECB菜单控制器(for SharePoint 2007)

    下图中显示的这个菜单也就是所谓的ECB(Edit Control Block)菜单。在SharePoint 2007中,所有列表项、文档、文件夹都有ECB菜单。ECB菜单不仅会出现在列表或文档库的视图页面中,如果我们在任何一个页面中放置一个列表视图Web部件(List View Web Part),同样在这个Web部件中,也可以显示ECB菜单。

    image

    ECB菜单控制器的作用,就是可以让网站管理员能够向任何ECB菜单中添加自己想要的自定义菜单项,同时也能删除任何一个ECB菜单中的任何内置菜单项。通过基于“规则”的管理,管理员能够以非常灵活的方式,控制ECB菜单的显示。

    下面是一些场景示例,举例说明了通过ECB菜单控制器能做到的控制粒度:
    ● 将整个网站的所有列表项与文件的ECB菜单中的“管理权限”菜单项去掉,但是保留文件夹ECB菜单上的“管理权限”菜单项。
    ● 向网站中内容类型为“联系人”的列表项(无论其位于哪个列表中)的ECB菜单中,添加一个“添加此人为好友”的菜单项。
    ● 从“共享文档”文档库的ECB菜单中,去掉除“查看属性”之外的所有内置菜单项,同时为这个文档库的所有文件夹的ECB菜单添加一个“将此文件夹归档”菜单项。
    ● 将显示在网站首页上的所有ECB菜单中的“删除”菜单项去掉,但保留首页上文件夹ECB菜单中的“删除”菜单项。

    后面的部分是ECB菜单控制器的简单使用说明。

    下载ECB菜单控制器的安装文件后(这是一个.wsp解决方案包),将其安装到SharePoint 2007系统中。它会在网站层次安装一个Feature,进入到网站功能管理页面,激活“ECB菜单项控制器”Feature。ECB菜单控制器以网站层级来激活或关闭,管理员可以在需要此功能的网站中激活它。

    image 

    激活Feature后,在网站管理页面的外观区域,会多出一个“ECB菜单项”链接。点击此链接,就会打开ECB菜单项控制规则管理界面。

    image 

    在ECB菜单项控制规则管理界面,管理员可以添加两种规则,“ECB菜单项添加规则”和“ECB菜单项移除规则”。前者用来定义一个新增ECB菜单项的规则,后者用来定义一个将内置ECB菜单项删除的规则。

    image 

    下图是创建一个ECB菜单项添加规则的界面。

    image 

    每个属性的说明如下:
    ● 新ECB菜单项标题:新建的ECB菜单项的显示文本。
    ● 新ECB菜单项点击事件:用户点击新建的ECB菜单项时,执行的JS脚本,可以包含预定义的Token。
    ● 新ECB菜单项显示顺序:如果有多个新建的ECB菜单项,可以通过这个属性定义它们的显示顺序。
    ● 应用于列表:用来指定当前规则只作用于某个特定的列表(或文档库),如果留空则表示将作用于所有列表。
    ● 应用于特定页面:用来指定当前规则只作用于某个特定的页面,可以只在这个属性中输入Url的一部分,例如输入“Forms/AllItems.aspx”,就● 可以指定当前规则仅作用于所有列表的默认视图页面。
    ● 应用于内容类型:如果只希望新的ECB菜单项只出现在某个内容类型的列表项(或文档)的ECB菜单中,那么就可以使用这个属性。例如,● 由于所有文件夹的内容类型都是“Folder”,如果希望给所有文件夹应用规则,那么可以指定将规则应用于“Folder”内容类型。
    ● 应用于文件夹:一个是/否选项,用来直接指定当前规则是否将应用于文件夹。
    ● 网站管理员例外:一个是/否选项,用来指定在管理员浏览页面时,是否也应用规则。这个选项更多的用于删除ECB菜单项的场景。
    ● 启用规则:一个是/否选项,指定此规则是否生效。

    下面是创建ECB菜单项移除规则的界面。

    image 

    ECB菜单项移除规则非常简单,只需要直接指定要移除的菜单项即可,例如“管理权限”。支持指定并移除二级菜单项,例如可以将“发送到”菜单项下面的某个子菜单项隐藏。移除规则的可设置条件和添加规则是一样的。

    关于ECB菜单控制器的一些额外功能说明:
    ● 一个规则所包含的所有条件,将是“与”的关系。即只有在规则所包含的多个条件都满足的情况下,规则才会生效。所有的条件都是可选的,如果某个规则没有设置任何条件,那么这个规则将被应用到网站的所有位置(所有列表、文档库、页面上)。
    ● ECB菜单控制器对普通页面上的列表视图Web部件也同样生效。

    下载ECB菜单控制器安装包。这个组件并未经过完整测试,我的开发和使用环境都是英文版的SharePoint 2007。如果你在使用中遇到任何问题,请告诉我(kaneboy [a] gmail.com)。

     

    Posted by on 2010/06/01 in 未分类

    2 Comments