第6天-讲义页面发布课程管理_第1页
第6天-讲义页面发布课程管理_第2页
第6天-讲义页面发布课程管理_第3页
第6天-讲义页面发布课程管理_第4页
第6天-讲义页面发布课程管理_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

学成第6天讲义-页面发布课程管页面发本项目使用MQ实现页面发布的技术方案技术方案说明、每个站点服务部署cscliet程序,并与交换机绑定,绑定时指定站点d为otinKy。指定站点id为otinKy就可以实现cscliet只能接收到所属站点的页面发布消息。路由模式分析如页面发布流程图如下5、MQ将页面发布消息通知给CmsClient6、CmsClient从GridFS中html文件7、CmsClient将html保存到所在服务器需求分功能分析创建CmsClient工程作为页面发布消费方,将CmsClient部署在多个服务器上,它负责接收到页面发布的消息后需求如下1、将cmsClient部署在服务器,配置队列名称和站点ID。2、cmsClient连接RabbitMQ并各自的“页面发布队列”3、cmsClient接收页面发布队列的消息调用a查询页面信息,获取到页面的物理路径,调用da查询站点信息,得到站点的物理路径页面物理路径站点物理路径页面物理路径页面名称。创建CmsClient工<?xml<?xmlversion="1.0"<projectinstance""‐<relativePath>../xc‐framework‐parent/pom.xml</rlative<artifactId>xc‐service‐manage‐cms‐clien<versio<artifatId>spring 2、配置文在resources下配置application.yml和logback-spring.xmlport:port:31000name:uri:mongodb://root:123@localhost:27017database:xc_cmshost:port:5672username:guestpassword:guestvirtualHost:/#cms客户 的队列名称(不同的客户 的队列不能重复queue:queue_cms_postroutingKey: #此routingKey为门户站点说明:在配置文件中配置队列的名称,每个cmsclient在部署时注意队列名称不要重复.cms")//扫描实体@ComponentScan(basePackages={"com.xuecheng.framework"})扫 mon下的所有publicclassManageCmsClientApplication{publicstaticvoidmain(String[]args){ }}RabbitmqConfig消息队列设置如2、每个CmsClient创建一个队列与 packagecom.xuecheng.manage_cms_client.config;importorg.springframework.amqp.core.*;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;import@author@versionpublicclassRabbitmqConfig//队列beanpublicstaticfinalStringQUEUE_CMS_POSTPAGE="queuecms_p//交换机的名publicstaticfinalStringEX_ROUTING_CMSPOSTPGE="//队列的名 uepublicStringqueue_cms_pstpa//routingKey即站点Id@Value("${xuecheng.mqoutingKey}")publicStringroutingKey;交换机配置使用direct类@return publicExchangeEXCHAGE_TOPICS_INFORM()return} 队publicQueueQUEUE_CMS_POSTPAGE()Queuequeue=newQueue(queue_cms_postpage_name);returnqueue;}绑定队列到交换@param the@paramexchangethe**@returnthepublicBindingBINDING_QUEUE_INFORM_SMS(@Qualifier(QUEUE_CMS_POSTPAGE)Queuequeue,@Qualifier(EX_ROUTING_CMS_POSTPAGE)Exchangeexchange){return}}定义消息格{{}1、使用CmsPageRepository查询页面publicpublicinterfaceCmsPageRepositoryextendsMongRepository<CmsPage,String>} publicpublicinterfacCmsSiteRepositryextendsMongoRepository<CmsSite,String>}packagepackageimportcom.mongodb.client.gridfs.GridFSBucket;importcom.mongodb.client.gridfs.GridFSDownloadStream;importcom.mongodb.client.gridfs.model.GridFSFile;importcom.xuecheng.framework. importcom.xuecheng.framework. importcom.xuecheng.framework. importcom.xuecheng.framework.exception.ExceptionCast;importcom.xuecheng.manage_cms_client.dao.CmsPageRepository;import importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.gridfs.GridFsResource;importorg.springframework.data.mongodb.gridfs.GridFsTemplate;importorg.springframework.stereotype.Service;importimport@author@versionpublicclassPageServiceCmsPageRepositorycmsPageRepository;CmsSiteRepositoryGridFsTemplategridFsTemplate;GridFSBucket//将页面html保存到页面物理publicvoidsavePageToServerPath(StringOptional<CmsPage>optional ExceptinCast}//取出页面物理路CmsPagecmsPage=//页面所属站CmsSitecmsSie=//页面物理路StringpagePath=msSite.getSitePhysicalPath()+cmsPage.getPagePhysicalPath()+//查询页面静态文StringhtmlFileId=cmsPage.getHtmlFileId();InputStreaminputStream=this.getFileById(htmlFileId);if(inputStream==null){}FileOutputStreamfileOutputStream=null;try{fileOutputStream=newFileOutputStream(new//将文件内容保存到服务物理路}catch(Exceptione)}finallytry}catch(IOException{}try}catch(IOException{}}}//根据文件id获取文件内publicInputStreamgetFileById(StringfileId){try{GridFSFilegridFSFile= GridFSDownloadStreamgridFSDownloadStream= GridFsResourcegridFsResource=neGridFsRsource(gridFSFile,gridFSDownloadStream);returngridFsResource.getInputStream();}catch(IOException{}return}//根据站点id得到站publicCmsSiteetCmsSiteById(StringOptional<CmsSite>optional=cmsSiteRepository.findById(siteId);if(optonalisPresent()){CmsSitecmsSite=optional.get();returcmsSite;}return}}在cscliet工程的m包下创建CsrPstP类,CsrPstP作为发布页面的消费客户端,页面发布队列的消息,收到消息后从mongodb文件,保存在本地。packagepackageimportimport importcom.xuecheng.manage_cms_client.dao.CmsPageRepository;importcom.xuecheng.manage_cms_client.service.PageService;importorg.slf4j.Logger;importimportorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframew importjava.util.Map;importjava.util.Optional;@author@versionpublicclassConsumerPostPageprivatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(CnsumePostPge.class);CmsPageRepositorycmsPageRepository;PageService publicvoidpostPage(Stringmsg){//解析消Mapmap=JSON.parseObject(msgMap.class);LOGGER.info("receivecmspostpage:{}",msg.toString());//取出页面StringpageId=(String)ma//查询页面信Optional<CmPage>optional=cmsPageRepository.findById(pageId);LOGER.error("receecmspostpage,cmsPageisnull:{}",msg.toString());return;}//将页面保存到服务器物理路pageService.sav}}需求分管理员通过cms系统发布“页面发布”的消费,cms系统作为页面发布的生产需求如下2、cms页面发布接口执行页面静态化,并将静态化页面至GridFS中RabbitMQ在application.ymlhost:port:5672username:guestpassword:guestvirtualHost:/2、在pom.xml<groupId>org.spri<artifactIdspring‐3、RabbitMQConfig配置由于cm配置交换机即可。在cms工程只配置交换机名称即可packagepackageimportimportorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;import.3Apipackageimportimportorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importpublicclassRabbitmqConfig//publicstaticfinalString交换机配置使用direct@returnthepublicExchangeEXCHANGE_TOPICS_INFORM()return}}@ApiOperation("@ApiOperation("发布页面publicResponseResultpost(Stringp1.3.4 代码如下////页面发publicResponseResultpostPage(String//执行静态StringpageHtml=this.getPageHtml(pageId);}//保存静态化CmsPagecmsPage=saveHtml(pageId,//returnnew}//发送页面发布消privatevoidsendPostPage(StringCmsPagecmsPage=this.getById(pageId);if(cmsPage==null){CmsPagecmsPage=this.getById(pageId);if(cmsPage==null){}Map<String,String>msgMap=newHashMap<>();//Stringmsg=//获取站点id作为StringsiteId=this.rabbitTemplate.convertAndSend(RabbitmqConfig.EX_ROUTING_CMS_POSTPAGE,siteId,}//privateCmsPagesaveHtml(StringpageId,String//Optional<CmsPage>optional=cmsPageRepository.findById(pageId)}CmsPagecmsPage= StringhtmlFileId=cmsPage.getHtmlFileId(); }//保存html文件到InputStreaminputStream=IOUtilstoInputStream(conteObjectIdobjectId=gridFsTemplate.sore(inputStream,//文件StringfileId=objectId.toStri cmsPageRepositorysave(cmsPage);returncmsage;}1.3.5 publicResponseResultpost(@PathVariable("pageId")String{return}用户操作流程2、点击“发布”请求服务端接口,发布API在cms前端添加api/*/*发布页面exportconstpage_postPage=id=>return}页<el‐table‐column<el‐table‐columnlabel="发布"<templatesize="small"type="primary"pain@click="p geId)">发添加页面发布事postPagepostPage(id)this.$confirm('确认发布该页面吗?','提示',{}).then((){cmsApi.page_postPage(id).then((res)=>{console.log('发布页面this.$message.success('发布成功,请稍后查看结果this.$message.error('发布失败}}).catch(()=>2、执行页面预课程管教育平台的课程信息相当于平台的商品。课程管理是管理功能中最重要的模块。本项目为教学机构提1、分类管2、新增课3、修改课4、预览课5、发布课用户的操作流程如下1、进入课2、点击“添加课程”5、编上传课程信息主要是设置课程的方式及价格7、编辑课程计添加课程计划下:1、前后端工程导课程管理服务端工程采用SpringBoot技术构建,技术层技术使用SpringdataJpa(与SpringdataMongodb类2、课程计划功课程计划功能采用全程教课程、新增课程、修改课程、课程四个功能采用实战方式,课堂上会讲解每个功能的需求及,讲完成学生开始实战,由导师进行技术指导。4、参考文实战结束提供每个功能的开档,学生参考文档并修正功能缺陷搭建数据库环创建数据数据表介数据表结构如下导入课程管理服务工持久层技术介绍课程管理服务使用MySQL数据库课程信息,持久层技术如下1、springdatajpa:用于表的基本CRUD。3、druid:使用阿里巴巴提供的springboot整合druid包druid-spring-boot-starterdruid-spring-boot-starter地址 /alibaba/druid/tree/master/druid-spring-boot-导入导入课程管理前端工课程管理属于教学管理子系统的功能,使用用户为教学机构的管理和老师,为保证系统的可性,单独创建一个教学管理前端工程。教学管理前端工程与系统管理前端的工程结构一样,也采用vuejs框架来实现。从课程资料 拷贝c-i-pcteach.zip到工程,使用webom打开,动工:效果图如下:课程计什么是课程计划课程计划包括两级,第一级是课程的大章节、第二级是大章节下属的小章节,每个小章节通常是一段,学生击小章节学习。教学管理对课程计划如何管理需求分页面原tree组件介本功能使用element-ui的tree1、组:data="data"show‐checkboxnode‐key="id"default‐:expand‐on‐clic:render‐ontent=renderC2、数据对letletid=export{data(){{dataid:label一级1',[{id:label:'二级[{id:9,},},id:label:'三级}}}JSX是Javascript和XML结合的一种格式,它是React的组成部分,JSX和XML语法类似,可以定义属性以素。唯一特殊的是可以用大括号来加入JavaScript表达式。遇到HTML(以<开头),就用HTML规则解析;遇到代码块(以{开头),就用JavaScrit规则解析。下面是的一个例子设置方法如下:1、Javascriptversion选择ReactJSX(如果没有就选择JSX2、HTML类型文件中增加preferences->Editor->FileTypes中找到上边框中HTML在下边加一个如果已经在vuetemplate中已存在.vue则把它改为.vue2(因为要在Html中添加API课程计划为树型结构,由树根(课程)和树枝(章节)组成,为了保证系统的可扩展性,在系统设计时将课程计划设置为树型结构。@GenericGenerator(name="jpa‐uuid",strategy="uuid")publicclassTeachplanimplementsSerializable{privatestaticfinallongserialVersionUID=@GeneratedValue(generator=@Column(length=32)privateStringid;privateStringpname;privateStringparentid;privateStringgrade;privateStringptype;privateStringdescription;privateStringcourseid;privateStringstatus;privateIntegerorderby;privateDoubletimelength;privateString}id:label一级1',[{id:label:二级publicclassTeachplanNodeextends{List<TeachplanNode>}根据课程i查询课程的计划接口如下,在ai工程创建cors包,创建CoursCotllerAi接口类并定义接口方法如下:publicpublicinterface{@ApiOperation("课程计划查询publicTeachplanNodefindTeachplanList(String}课程管理服a.idone_id,a.pnameone_pname,b.idtwo_id,b.pnametwo_pname,c.idthree_id,c.pnamethree_pnameteachplanLEFTJOINteachplanbONa.id=b.parentidLEFTJOINteachplancONb.id=c.parentidWHEREa.parentid=ANDa.courseid='402885816243d2dd0162ORDERBYa.orderby,1)mapperpublicinterfaceTeachplanMapperpublicTeachplanNodeselectList(String}2)mapper文<resultMap<resultMap<idproperty="id".course.ext.TeachplanNode"id="teachplanMap"<resultproperty="pname"<collection<idproperty="id"<resultproperty="pname"<collectionproperty="children" <idproperty="id"<resultproperty="pname"<selectid="selectList"resultMap="teachplanMap"parameterType="java.lang.String">a.idone_id,a.pnameone_name,b.idtwo_id,b.pnametwo_name,c.idthree_id,c.pnameEFTJOINteachplanONa.id=LEFTJOINteachplancONb.id=c.parentidWHEREa.parentid=<iftest="_parameter!=nulland_paramter!=''">anda.courseid=#{courseId}ORDERBYa.orderby,说明:针对输入参数为简单类型}中可以是任意类型,判断参数是否为空要用_paameter(它属于mybtis置参数)publicclass{TeachplanMapper//查询课程计publicTeachplanNodefindTeachplanList(StringTeachplanNodeteachplanNode=teachplanMapper.selectList(courseId);returnteachplanNode;}} publicclassCourseControllerimplements{CourseService publicTeachplanNodefindTeachplanList(String{return}}Get请求:前端页Api方/*/*查询课程计划exportconstfindTeachplanList=courseid=>return}Api调1、在mounted钩子方法中查询课程计定义查询课程计划的方法,赋值给数据对象findTeachplan(){courseApi.findTeachplanList(this.courseid).then((res)=>{findTeachplan(){courseApi.findTeachplanList(this.courseid).then((res)=>{this.teachplanList=[];//this.teachplanList=res.children;}在mounted//课程this.courseid=//}修改树结点的属defaultProps:defaultProps:children:'children',label:'pname'}需求分用户操作流程1、进入课程计划页面,点击“添加课程计划不选择结点表示当前课程计划为该课程的一级结1、视图部<el‐dialog<el‐dialogtitle="添加课程计划":visible.sync="teachplayFormVisible<el‐formref="teachplayForm":model="teachplanActive"style="width:600px;":rules="teachplanRules"<el‐form‐item 结点"><el‐selectv‐model="teachplanActive.parentid"placeholder="不填表示根结点v‐for="itemin<el‐form‐itemlabel="章节 名称"<el‐input<el‐inputv‐model="teachplanActive.pname"<el‐form‐itemlabel="课程类型<el‐radio‐group<el‐radioclass="radio" <el‐radioclass="radio"label='2'>文档<el‐form‐itemlabel="学习时长(分钟)请输入数字"><el‐inputtype="number"v‐model="teachplanActive.timelength"auto‐complete="off"<el‐form‐itemlabel="排序字段<el‐inputv‐model="teachplanActive.orderby"auto‐complete="off"<el‐form‐itemlabel="章节 介绍"<el‐inputtype="textarea"v‐model="teachplanActive.description"<el‐form‐itemlabel="状态"<el‐radio‐groupv‐model="teachplanActive.statu"<el‐radioclass="radio"label="0未发布<el‐radioclass="radio"label='1'>已发布</el<el‐form‐item<el‐buttontype="primary"v‐on:click="addTacplan">提交<el‐buttontype="primary"v‐n:click="resetForm重置2、数据模teachplanRules:{pname:{required:true,message:'请输入课程计划名称',trigger:status:{required:true,message:'请选择状态',trigger:']3<el‐button<el‐buttontype="primary"@click="teachplayFormVisible=true">添加课程计划////提交课程计//this.teachplanActive={}API1)添加课程计@ApiOperation("@ApiOperation("添加课程计划publicResponseResultaddTeachplan(Teacplan课程管理服publicpublicinterfaceeachplanepositoryextendsJpaRepository<Teachplan,String>//定义方法根据课程id和父结点id查询出结点列表,可以使用此方法实现查publicList<Teachpla>findByCourseidAndParentid(Stringcou

温馨提示

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

评论

0/150

提交评论