CMS模块化开发_第1页
CMS模块化开发_第2页
CMS模块化开发_第3页
CMS模块化开发_第4页
CMS模块化开发_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CMS模块化开发什么是CMSCMS是ContentManagementSystem的缩写,意为“内容管理系统”。CMS具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理,它也可以处理图片、Flash动画、声像流、图像甚至电子邮件档案。CMS其实是一个很广泛的称呼,从一般的博客程序,新闻发布程序,到综合性的网站管理程序都可以被称为内容管理系统。根据不同的需求,CMS有几种不同的分类方法。比如,根据应用层面的不同,可以被划分为: 重视后台管理的CMS 重视风格设计的CMS 重视前台发布的CMS等等。就目前已经存在的各种CMS来说,最终界面上都是大同小

2、异,但是在编程风格与管理方式上来讲却是相差万别。就CMS本身被设计出来的出发点来说,应该是方便一些对于各种网络编程语言并不是很熟悉的用户用一种比较简单的方式来管理自己的网站。这虽然是本身的出发点,但由于各个CMS系统的原创者们自己本身的背景与对“简单”这两个字的理解程度的不同,就造成了现在没有统一的标准群雄纷争的局面。我们所熟悉的CMS系统应有的基本模块在进行WEB系统开发中,最常用到的功能模块有以下几种: 下载管理(download)系统 文章管理(article)系统 图片管理(picture)系统当然,另外仍然有许多业务模块在应用中得到广泛应用,比如会员管理系统、权限管理系统等等,它们与

3、基本模块相互协作,共同构成强大的CMS系统,这与本文所描述的系统开发思想并不冲突。而在模块的通用性及可扩展性上来讲,我们只择选一些具有广泛代表意义的来进行描述。为什么使用模块化进行CMS系统的开发?模块化开发的好处在于:1 .子系统无关性。我们这里所描述的子系统无关性指:在一个CMS系统中相应的子系统(相应模块)不进行相互制约与影响,这体现在当一个子系统(相应模块)崩溃时,不至于影响到其它模块的正常运行。2 .高效协同开发。团队开发过程中,由于子系统的无关性,每个团队小组或者团队成员负责自己的子系统开发,而无须关心其它子系统。达到高效分工协同开发的目的。3 .可扩展性。由核心系统统一管理,很轻

4、松在原系统的基础上开发扩展模块及相应的插件,如评论、留言板及添加子系统(功能模块)。使用模块化开发的前提是,你必须有一个很好的前期规划,做好基本资源仓库的资料收集及搭建统一核心管理平台。单一入口应用程序概述为什么这里会讲到单一入口?这与我们的核心管理平台有很大的关系。我们需要一个统一、标准的核心管理平台来支撑整个系统平台的运作,这是模块化开发的基础。什么是单一入口应用程序?在解释什么是单一入口应用程序之前,我们先来看看传统的web应用程序。list.php列表程序view.php内容显示程序这两个页面不但分别实现了两个功能,还成为了应用程序的两个入口。所以单一入口的应用程序实际上就是说用一个文

5、件处理所有的HTTP请求。例如不管是列表功能还是内容显示程序功能,都是从浏览器访问特定的文件。这个特定的文件就是这个应用程序的单一入口。单一入口的处理方式:当服务器收到一个http请求时,会解析此请求,并决定访问那个文件。如现在我们看看通过单一入口程序的处理方式。发现,实际上默认执行文件(一般为index或者default)执行了二次整理解析,我们可能实现的程序如下:1 |?Php2 requireonce(rrinclude/class,base»phprr);$app=newapp();4app->run();5?|其中class.base.php文件可能有如下程序:<

6、;?phpClassbase(Var$mod;Var$file;Functionget_module()(/getmoduleFunctonget_file()(/getfileFunctionrun()(Require_once($this->mod.$this->file);?>那么我们很可能将执行结果定位于module/article/list.php,由list.php程序来进行相关操作。当然,对于一个安全、健壮的系统来说,上面的处理方式明显过于简单,我们只是以实例说明。那么OK,同学们会说,单一入口,对我们有什么好处吗?那么我们说一下其优势:因为所有的执行操作都由一

7、个文件去进行维护,进行管理,那么我们很轻易的对全局系统进行安全检测,核心类库的布署及相应的过滤。当我们添加一个模块时,我们仅仅需要在我们规划的相应目录下添加相应程序就OK。当然,它也是有一定缺点的,任何事物都是两面性的。你在使用单一入口时,你必须对整体框架有一个长期的规划,这点是需要技术和经验的积累才能完成的。你在后续的程序写作中添加一些东西到index.php文件中也未尝不可,但我并不建议在已存在的执行文件中添加或者删除(删除绝对不允许的)一些功能,这有可能会影响到或者改变我们系统设计之初的一些思想,甚至背离了我们的初衷。模块化CMS结构应用前者我们提到了在CMS开发过程中的一些基本模块,本

8、文就以这些为例。早在2005年四月份,笔者发布了phpsohov1.0,这个系统原来的设想是设计一个强大的平台,通过单一入口,进行多个系统的聚合,但最后由于种种原因被遗弃了。这个系统应用了模块化及单一入口,大家可以到网上搜索一下源码。OK,话转回来,我们开始详细讲述模块化CMS的设计应用。在此文中,我们以应用视角分布讲解,着重讲以后台为主的CMS设计,因为前台的灵活多样性,我们可以有很多种方案去处理。我们布署文件目录:demoadmindata.driverimagesincludeGnodulet-emplateadmin,phpajax.phpctk.phpglobal,phpindex,

9、phplogin,php首先从后台的单一入口讲起。在管理系统中,我们使用了单一人口的模式进行项目模块的管理,功能而产生的。admin.php文件即是为此我们在admin.php文件中,对http请求执行了二次解析,在getAdminModuleJobFile函数中,我们进行了模块定位工作。通过这个函数,我们可以很轻松的把类似于http:定位干/module/article/admin/add.php当然,在此文件中,我们还执行了另一情况检查:admin.php?act=login。这是一个例外,只有我们在执行login及logout操作时,act才会存在。Admin.php可能文件如下所示:1

10、<?php2ob_stai:t(1ob_gzhandlEi:1&&3t81:七(;3define(lPHPSOHD_SYSTEMl,true);4require_otLce(include/config*incphp):requii:e_orLce(ROOTPATH."/include/function.phprr);6require_once(ROOTPATH.1/admin/global.php1);7if(act=(Login1)8header("Location:adnin.php;file=loinrr;101112Module=inNodu

11、leJobFile($nod);1314专file=ffile?tile:1indeK1;155jobFiles=rrmodule/EileJ.php"1617!file_existsjobFiles)&&exit厂对不起,相应文件不存在1r18requireoncejobFiles);1920'functiongetAdninModuleJobFile($bck1='cm3')21(=*mod?($aod='cm3'?1':$mod):111;23if($mcidule)24(25If|!file_exists(MOD

12、_PATFi.rr/(niodule)r,)2627module=R0CT_PATH.r,/!$nodule>/aduLirLr'26)29else30(31module=HOD_FATH.rr/module/admiii,r;32)33134else3536Module=R00T_PATH.rVa(iainrr;3736returnModule;39402>Top页面对我们的整个通过admin.php的描述,应该很轻松的了解我们这次设计的基本理念了。/admin目录对于我们来说,仅仅是提供一个初始的平台界面,当然。管理系统来说是很重要的。目录结构如下:/二加m。/Iadm

13、int?im5_Itemplatenl白讣虱.php函index,php我们通过index.php分别载入top、left、right框体页面,index.php文件可能如下:1 |?Php2 if(l$action3 (4 includetemplateindexrr);5 16 itaction='top')7 1Bincludetemplate(rradnin_voprr);910ifSaction='menu')111ZincludeteuplateC*adnin_inenurr);13)14if(WactigN-nain")15t16incl

14、udetenpla'Ce(rradnLrL_iiiainfr);17118?|那么我们知道,此次系统的关键在于module目录中,此目录存放了我们所根据系统平台开发的相应模块。如下图:module6-article,Ldownloadt,1亡jpicture我们以article模块进行实例操作。在article的模块目录下,我们做以下目录布署:module上口articleadminli1include庄jLcibal.phpnflsql.class,php二星国围3虎国国围EaCPadd.phpauditing.phpdrop.phpedit,phpindex.Jitmlleft.p

15、hpli与匕phptrash.phpinclude它国global.phpdisql.cl&ME.phpajax.phpcategory,phpdisplay,phpindax.php顾名思义,admin目录是此模块(article)模块的管理程序,此目录中文件的相应功能大家通过文件名就可以看得出来,不再一一进行解说。Include目录主要为模块前台所需要的公共文集。相对于比较陌生的是cp文件夹,那么这个文夹是干什么的呢?OK,让我们打开此文件夹,里面的文件可能如下:ajax,phpcategory,phpdisplay.phpindK.phpucs33igLELF广L.里面只有四个文

16、件,且这四个文件一一对应了模块根目录下的文件。想明白这个文件目录的用处,还须从我们设计中心思想讲起。比如说我们在一个CMS系统中需要这样一些频道:财经新闻、体育新闻、娱乐新闻等等。不难发现,这些频道有一个共性:他们都属于文章系统的范畴,而不同的仅仅是他们的表现形式(前台模板)的差异。那么我们有必要反复的进行书写相似或者说相同的代码吗?有没有一种方案使我们能够很好的利用已有的资源进行循环利用呢?答案是肯定的。于是,频道设计理念被我们引入到当前实例中来。我们假设channel-13同为文章模块(module/article)中的分支频道,那么,我们可以使用它的执行流程如下图所示:在cp/index

17、.php文件中,我们执行以下程序:1 <?php2 require_onjce(1.*/glohal.php1);5channeldir=basenate(dimame(_FILE_);4 tequii:e_orLce(MODULE_PATH.rTarticle/index.php");5 Q我们引入了前台的全局文件global.php,并且根据相应的一些参数得到了$channeldir(频道所属目录),将系统执行解析程序定位在此module/article/index.php,其它类似,改变的只是定位的执行程序而已。那么有一点我们可以确定,我们必须有一个channeldir这

18、个变量存在,而这个变量是通过URL剖析后得到的。设计思想清晰了,我们制定这么一个流程出来,以应付我们的需求:系统管理中心X海加新频道聂道名称二频道关徒字:聂道描述二游道类型二©兼统内部舞道颗道使用的功格筏型;新闻模块叛道目录;只能是英文0外方柒道新闻模块下载模块图片模块添飙后就严瞄改.录入后当此频道准备链接到网站中闲其他荥尊时,话使用这种方式口舞道模板二链撞地址:L疵面面默板,ig当然,我们这些模块是已经录入到数据库中的,比如我们可能存在着这么几个数据表:注:表结构已经精简,只为描述思想而定,如果实际使用,请按相应系统设计需要改变。DROPTABLEIFEXISTScms_iaodu

19、le'createcoble'cm3!_m0dule*(idintunsignednotnullautoincnemennaaevatchat(50)notnull,sinvatchai:(50)notnull,enablecopyint(1)notnull,primarykey(id)fkeysign(sign)rh;DROPTABLEIFEXISTS'cas_chanxiel'2 createtable'cxschaiuiel'3 (idintunsignednotnullmutO_inctenBirt,namevarchar(50)notn

20、ullxoduleidincunsignednotnul1,templateidint(3)notnull,channeldirvarchai(100)notnull,primarykey(id)tL0|j;我们已经了解了模块与频道之间的对应关系,接下来,一切都变得容易多了。回过头来,看我们的后台文件操作流程:我们的后台管理页面为框架结构,分为top,left,right三个框体。在top程序处理中,我们可以通过数据得到我们已经设定的频道(这里不是模块,而是频道)。模块并不能直接用来操作,而必须依赖于频道的基础上进行相应的操作。我在后台中已经添加系统管理中心-频道管理设置12Articlesa

21、rticle新闻模块23Downbaddownload下载模读上图中的的两个频道,分别隶属于新闻模块、下载模块。如下图:Articles|菜单紧统管理臼帮助Download|起蛤页系统设置网站核心配置E更新网站首页管理员设置囹频道管理设置友皆健接管理友情链接管理模板管理S模板方案管理囹更新模棱羲存囹模块模板管理系装信息服务器操作标PHP版本:GD版本:IP库版本:那么当我们点击top中的Articles链接时,可能会给出这样的地址:http:现在很清晰了,系统二次解析后,执行的是module/article/left.php,其中channelid参数为正整数。菜单帮助日文章管理泰加文章审核文

22、章国管理文章0回收站经目管理添加栏目0营理栏目匚叛道设置频道资料设置国美联链接管理日扩展管理国评论管理现在回头看看我们的article/admin中的操作,left.php文件很忠实的没有做任何处理,只是列出了一些菜单列表,但它们有一个共同点,就是将$channelid=int传递给了相应的操作程序。点击添添加文章之后,链接指向了admin.php?channelid=int&mod=article&file=add,我们可以很清晰的看出来,由module/article/admin/add.php来执行指令的处理操作了。在add.php文件中,我们执行了如下操作:11?php

23、Eequire_onc&(rrincLu.de/global.phprf);3if()4(S内容略6include七已叩latE;78elself($do=-'post*)9(10处理过程略11)12else13(14die(rrEEEOE;rr);1516?l由于图片大小所限,我略去了操作过程。这里引入了global.php,此文件作用在于:1 .判断相应频道所属模块2 .得到相应频道目录3 .权限判断如下图所示:1<?php<channelid&&die(r,<spanstyle=1color:red1</spatL>r,);3

24、 这里执行权限判断4 /7!permissiarL&&die("Error;56_channel_uache_file=C_T*rcache/chaimel_(channelid)*php";file_exlsts_channel_cache_flie)0updare_channal($channelidj;Srequire_once_channel_cache_file);910r,/cjlotoal.inc.phprr);1112?>其它文件操作思路同上。到此为止,后台的操作思路已经完成。其它模块类似,不一一说明。前台模块处理对于前台模块,我们怎么

25、进行操作呢?前台设计同样是我们需要也必须考虑的问题。那么我们怎么在现在的系统站进行扩展呢?我们需要的是:1 .只调用我们使用的数据2 .尽量的无关性模板设计3 .简单的操作我们有很多选择,在前端的模板表现方面,如著名的smarty、phplib它们各自有各自的特点,这里不一一讲述。一般情况下,这些模板都允许使用php函数,而根据我们的需要,我们可以很轻松的以模块加载的方式来完成前台模板的设计。我选择了轻便小巧的discuz论坛系统的模板。当然,对它进行了一些小小的改造。由于一些原因,不能发布其源码,不过,可以提示大家的是,你只需要将(tempiate-prereplace(l,r/n,liHa

26、tEipvtags(1,11)r(t.empiate);这行源码复制,然后在适当的位置COPY入,然后俏微修改,就能很方便的使用了。比如:fteuplatepEecr_replace(,¥/load_module3+a+?)MlnSrtT/ie3,r,*'stripvtags1M?>n!z11),rr;我们只是将eval改成load_module就可以使用dz的模板调用自定义的PHP函数了。当然,你不改也没有关系,你可以通过eval来调用。我只是出于一种习惯而已。拿两个文件来举例:1 .网站首页文件(/index.php)2 .文章系统首页文件(/module/arti

27、cle/index.php)实际上,在后台创建频道的过程中,根据我们输入的条件,已经产生了/article目录,里面的文件就是我们上面所述module/article/cp目录下的所有文件。下图所示首页文件代码:tetjuireonce('global.php');:eetjuireoncet'include/load_tags,php1);l$IMG_FATH=DOCUFENT_PATH.images/.$_config'defaulttemplatt1;.includetemplate(f,index,r);?>你会感到很奇怪吗?在首页文件里面,我们什

28、么都没有做,但为什么我们能看到:一呷*.jyoniahTfOnlyZest|ArticlesDownloadMainMenuArticleCategories3jjwJJtvw3LinLJKaBSDSPerlStTdQwindowsSNews后OthersDownloadCategories序PeriaTd回NixHacking日Otherstest关于:L"*7负曩均黄的一些最近比较关注7层负载均衡口3如果“心流量耗尽了带宽,我疗则肯定吃不了兜着走口不一.eb负载均衡点值这段时间有点想玩玩臂时负羲均但是想想有点恐怖没实施过,这种结果呢?那么请你看一下两个源文件:TemplateZd

29、efaultZindex.htm及include/load_tags.php<DIVclass=box><H5>4hb3p;HocAtclclesihbsp<DIVclass>body><!-(loadl_Mdule10ad_artic1e("td=article£tC=listJdoxschaime11d=1en=2Stocder=hits>E5Cifiliniit=10r")-></DIV>C/DIV5<DIVclass=3ox><H5>&Hbsp;Ho匕D

30、osmloadsnbap;</H5><DIVcla33*body<!-(loadjmodxileload_dowiload(rrtd=dlGwnloadtf=ListL_boxichannelid=2*len=254ordeE=hit3DESC&linit=lQN')></DIV></DIV>图片太小了,可能大家看不清:里面有一行代码是这样子的:<!-load_moduleload_article("td=article&tf=list_box&channelid=1&len=25&a

31、mp;order=hitsDESC&limit=10")->很显示,我们执行了外部的函数load_article,并且里面传递了一串字符,这个函数的内容如functionload_aEticle(Sparse)global专曲;parse_3t.r(Sparse);*.ichanneliddie("Error:channelsoutceworngrr);_channel_caehe_fi1e-C_T,'rcache/channtl_(?channelid)+php"!file_exists($_channel_cache_flie)&

32、&Update_channel(?channelid);lequire($_channel_cache_fi1e);older=folder?5Colder:rrtf,;?SQL=11SELECT?folderFROH-litou_article-WHERE1rr;(SQL,="AND'channelid'='Schannelid'andLtEa3h'O'and"auditing"='11rr;&SQL,*(order?”ORbERBYfotdet":SQL,="limit

33、Hinitrr:query=$db->query(?5QL);whileres#di)->£ecch_ariaytfquery)(res'htmlEile1=5res'htmlfiles1?D_T.(_channel1channeldir1,date(rr/Y/ind/rrftes'posttime1),$re31id1¥rr.htmL":"dlflplay»php?ite>-aEticleAiteibid"(4Ees4id1),r;?res1Itiae1=date(rrm/dr?res1po

34、sttime1);$re3(1Ititle1=$len?gbsubstcresftitle'lDlen);res1title1;-“划)$IMG_PATH=get_mig_path();<templatefile=;meludetemp1aceatefile);哈哈,这下你明白了吧,我们就是利用了在模板中执行不同的函数,来进行调入相应的资料的。而$parse是做为一个字符串传入的一组条件,我们可以通过parse_str函数来讲此条件展来并按条件来调用数据及按条件把模板定位于不同的小模板中。下面是module/article/index.php源码:1 <?php2 reqv

35、i:e_once(M0DR00T,rracticLe/include/sql,classTphprT);.二I4 tzequiEeonce(Tr+./include/load_tags.phprr;5 requireoncetMOD_ROOT.rTatticle/global.inc.pliprr);5?channelid=article:getChanneDirByChadir(channeldir);39 $_chaimEl_c&jchje_fiLe=C_T."cache/clianne1_$channelidJ.plip;!file_exists($_channeJ._

36、cache_Eile)&&updave_channel(channelid);11 include(S_charmel_cache_file);12 13 5IHG_PATH=D_T."images/".?_config1deEaultteaplate1;1415 5UEB_TITLE=$channel'nane'.fr-,r.$UEE_TITLE;16I1.1(tempiatefiles-4_channel1tpldir.*F/index*r;18includetemplate(templatefiles):1Q此文件模板同上。扩展我们系统

37、在系统固有模块之外,我们有两种扩展需求:1 .添加同基本模块相同的模块,如download2 .添加独立模块及与其它基本模块关联的插件模块(如:评论,推荐,评星等等)关于第一点很容易理解,你只需要参阅以上分析的article模块就可以做出来,但一定要记往,一定要在cms_module表中添加相应模块。一般我们做开源或者以作品形式发布时,都会写一个小的模块安装程序,如article_module_install.php,由此产生相应的数据到数据库中。第二点,是我们根据模块化开发思想又一大便利之处。比如,我们需要一个member模块,此模块参与了后台管理,有自己的管理方式。比如我们需要对会员进行认

38、证,删除,编辑会员。那么根据我们的admin.php入口文件,我们可以在根目录,做以下目录布署:member,(QadminI,'Iinclude&AA.phpdrop.php国电dit.php虚Ilist,phpincludelogin,phpregister,phpuser,php根据系统处理规则,当系统入口为以下之一时,系统自动匹配到/member/admin/*.php文件:admin.php?mod=cms&file=*Admin.php?file=*由于,我们就可以对member进行后台管理,当然,你需要做的是在member/admin/目录下做通配文件,如

39、global.php,里面进行权限及其它过滤检测。系统前台同基础模块。当然,用户模块一般是我们在做基础开发时就已经考虑的,并且可能已经并入到了我们的开发计划中。而其它如评论模块同member开发思路一样,我们需要做的可能更简单。如,我们已经设计了相应插件模块的表,当我们有新的插件模块时,就更新到数据库中,表结构可能如下:DROPTABLEIFEXISTS'das_hack_Kic(iule'iccteatetable'ciii3_hacR_aodule'17(idintunsignednotnullauto_incremenCjnamevarchai:(SOJn

40、otnull,Kiod_dii:varchar(50)notnull/21disenableint(1)notnull,simuiarytext,priifliarykey(id)】;25DROPTABLEIFEXISTS.C33EC:_channel、;二7createtable-CDS_hack_channel'28(hidintunsignednotnull.channelidincunsignednotnullfJ1key(hid,channelid)32);第一个表为插件模块表,其中disenable为是否使用标记。第二个表为插件模块与频道关联表,在添加(编辑)频道时,我们可

41、以选择现有的插件模块是否与之关联。如,article我需要一个评论关联,而download并不需要。我们在开发这类插件模块时,由于是配合其它程序工作的,前台模块往往只需要一个执行文件。如在comment模块中,前台我只用了一个文件。在文章内容页面的模板中添加以下语句:<divid="comment"></div>loadConmeiit=functionJ(varajax_url=M(lTEB_RDOT)coiiLiiiEnt./ajax.php?action=loadcojmentfi"r+rrchanneLid=$_chatmel1id

42、1;counnentResponsc=function(respouse)(doc(rrcoimenCr).innerHTHL=response.tesponseText;Request.sendGET(ajaxurl+r,r5;nocache=Fr+Math»rand0to(),conmentResponse;)一loadCouuuenc();完成对评论的载入。通过以下语句完成对文章评论的提交:<divid="formInput"style="display:block;">NickName:<inputname="

43、;poster"id="poster"size="15"style="color:#369"><!-if$_config'enablecommentcheckcode'->CheckCode:<inputid="chkcode"name="chkcode"size="8"style="color:#369">&nbsp;<imgsrc="D_Tck.php"id=&q

44、uot;chkcodeImg"align="absmiddle"><!-/if-><br>CommentContent:<br><textareastyle="width:350px;height:80px;"name="content"id="content"></textarea><br><spanstyle="padding-left:120px;"><inputtype="

45、button"onclick="chkCommentInput()"value="PostComment"></span></div>postConnterLt-functionfvarpcst_url=frWEB_R00Tcoimeiit/ajax.pl*p?action=post£-r+"chamiH工c1uctiarnimd'&rr+rrcati(i=?_article1catid1一1.tn1十,ritemid=$itemid"vardstr="pos

46、ter=r,+doc(rFposter").value+hr£conteiit=rr+(ioc(r'content.Tr).value+r,£chkco(ie-M+doc(r,chJ:coderr)*valut;postRespouse=functionftu亨pon方(switcli(response,reapunseText)(caser,succes3hr;al已"L你的评的已经成功提交.管理员审核之后将含显示在本奥面.谢谢你的邕doc(,rchcodeImgr,),stc="D_Tck+php?,r4-Tr£-nocacie=rr+lTattifrandom();djoe(,rpcstet,r).value=,rrr;doc(r'ccntenrrr).valuE=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论