学成在线--14.使用RabbitMQ完成页面发布

文章目录

  • 一.技术方案
  • 二.页面发布——消费方
    • 1.需求分析
    • 2.创建Cms Client工程
      • 1)创建maven工程
      • 2)配置文件
      • 3)启动类
    • 3.RabbitmqConfig配置类
    • 4.定义消息格式
    • 5.PageDao
      • 1)使用CmsPageRepository 查询页面信息
      • 2)使用CmsSiteRepository查询站点信息,主要获取站点物理路径
    • 6.PageService
    • 7.ConsumerPostPage
  • 三.页面发布——生产方
    • 1.需求分析
    • 2.RabbitMQ配置
      • 1)配置Rabbitmq的连接参数
      • 2)在pom.xml添加依赖
      • 3)RabbitMQConfig配置
    • 3.Api接口
    • 4.PageService
    • 5.CmsPageController
  • 四.页面发布——前端
    • 1.API方法
    • 2.页面
      • 1)修改page_list.vue,添加发布按钮
      • 2)添加页面发布事件
  • 五.测试

一.技术方案

本项目使用MQ实现页面发布的技术方案如下:
在这里插入图片描述技术方案说明:
1、平台包括多个站点,页面归属不同的站点。
2、发布一个页面应将该页面发布到所属站点的服务器上。
3、每个站点服务部署cms client程序,并与交换机绑定,绑定时指定站点Id为routingKey。指定站点id为routingKey就可以实现cms client只能接收到所属站点的页面发布消息。
4、页面发布程序向MQ发布消息时指定页面所属站点Id为routingKey,将该页面发布到它所在服务器上的cms client。

路由模式分析如下:
发布一个页面,需发布到该页面所属的每个站点服务器,其它站点服务器不发布。
比如:发布一个门户的页面,需要发布到每个门户服务器上,而用户中心服务器则不需要发布。
所以本项目采用routing模式,用站点id作为routingKey,这样就可以匹配页面只发布到所属的站点服务器上。

页面发布流程图如下:
在这里插入图片描述1、前端请求cms执行页面发布。
2、cms执行静态化程序生成html文件。
3、cms将html文件存储到GridFS中。
4、cms向MQ发送页面发布消息。
5、MQ将页面发布消息通知给Cms Client。
6、Cms Client从GridFS中下载html文件。
7、Cms Client将html保存到所在服务器指定目录。

二.页面发布——消费方

1.需求分析

功能分析:
创建Cms Client工程作为页面发布消费方,将Cms Client部署在多个服务器上,它负责接收到页面发布的消息后从GridFS中下载文件在本地保存。

需求如下:
1、将cms Client部署在服务器,配置队列名称和站点ID。
2、cms Client连接RabbitMQ并监听各自的“页面发布队列”
3、cms Client接收页面发布队列的消息
4、根据消息中的页面id从mongodb数据库下载页面到本地

调用dao查询页面信息cmspage,获取到页面的物理路径;调用dao查询站点信息,得到站点的物理路径
服务器物理路径=站点物理路径+页面物理路径+页面名称。
从GridFS查询静态文件内容,将静态文件内容保存到服务器物理路径下。

2.创建Cms Client工程

创建工程 xc-service-manage-cms-client
文件路径:xcEduService01\xc-service-manage-cms-client
在这里插入图片描述

1)创建maven工程

文件位置:xcEduService01\xc-service-manage-cms-client\pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>xc-framework-parent</artifactId><groupId>com.xuecheng</groupId><version>1.0-SNAPSHOT</version><relativePath>../xc-framework-parent/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><artifactId>xc-service-manage-cms-client</artifactId><dependencies><dependency><groupId>com.xuecheng</groupId><artifactId>xc-framework-model</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency></dependencies>
</project>

2)配置文件

在resources下配置application.yml和logback-spring.xml
文件位置:xcEduService01\xc-service-manage-cms-client\src\main\resources\application.yml

server:port: 31000
spring:application:name: xc-service-manage-cms-clientdata:mongodb:uri:  mongodb://root:123@localhost:27017database: xc_cmsrabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guestvirtualHost: /
xuecheng:mq:#cms客户端监控的队列名称(不同的客户端监控的队列不能重复)queue: queue_cms_postpage_01routingKey: 5a751fab6abb5044e0d19ea1	#此routingKey为门户站点ID

说明:在配置文件中配置队列的名称,每个 cms client在部署时注意队列名称不要重复

3)启动类

文件位置:xcEduService01\xc-service-manage-cms-client\src\main\java\com\xuecheng\manage_cms_client\ManageCmsClientApplication.java

package com.xuecheng.manage_cms_client;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@EntityScan("com.xuecheng.framework.domain.cms")//扫描实体类
@ComponentScan(basePackages={"com.xuecheng.framework"})//扫描common包下的类
@ComponentScan(basePackages={"com.xuecheng.manage_cms_client"})//扫描本项目下的所有类
public class ManageCmsClientApplication {public static void main(String[] args) {SpringApplication.run(ManageCmsClientApplication.class,args);}
}

3.RabbitmqConfig配置类

文件位置:xcEduService01\xc-service-manage-cms-client\src\main\java\com\xuecheng\manage_cms_client\config\RabbitmqConfig.java

package com.xuecheng.manage_cms_client.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author Administrator* @version 1.0**/
@Configuration
public class RabbitmqConfig {//队列bean的名称public static final String QUEUE_CMS_POSTPAGE = "queue_cms_postpage";//交换机的名称public static final String EX_ROUTING_CMS_POSTPAGE="ex_routing_cms_postpage";//队列的名称@Value("${xuecheng.mq.queue}")public  String queue_cms_postpage_name;//routingKey 即站点Id@Value("${xuecheng.mq.routingKey}")public  String routingKey;/*** 交换机配置使用direct类型* @return the exchange*/@Bean(EX_ROUTING_CMS_POSTPAGE)public Exchange EXCHANGE_TOPICS_INFORM() {return ExchangeBuilder.directExchange(EX_ROUTING_CMS_POSTPAGE).durable(true).build();}//声明队列@Bean(QUEUE_CMS_POSTPAGE)public Queue QUEUE_CMS_POSTPAGE() {Queue queue = new Queue(queue_cms_postpage_name);return queue;}/*** 绑定队列到交换机** @param queue    the queue* @param exchange the exchange* @return the binding*/@Beanpublic Binding BINDING_QUEUE_INFORM_SMS(@Qualifier(QUEUE_CMS_POSTPAGE) Queue queue, @Qualifier(EX_ROUTING_CMS_POSTPAGE) Exchange exchange) {return BindingBuilder.bind(queue).to(exchange).with(routingKey).noargs();}}

4.定义消息格式

消息内容采用json格式存储数据,如下:
页面id:发布页面的id

{
"pageId":""
}

5.PageDao

1)使用CmsPageRepository 查询页面信息

文件位置:xcEduService01\xc-service-manage-cms-client\src\main\java\com\xuecheng\manage_cms_client\dao\CmsPageRepository.java

package com.xuecheng.manage_cms_client.dao;import com.xuecheng.framework.domain.cms.CmsPage;
import org.springframework.data.mongodb.repository.MongoRepository;public interface CmsPageRepository extends MongoRepository<CmsPage,String> {//根据页面名称查询CmsPage findByPageName(String pageName);//根据页面名称、站点Id、页面webpath查询CmsPage findByPageNameAndSiteIdAndPageWebPath(String pageName, String siteId, String pageWebPath);
}

2)使用CmsSiteRepository查询站点信息,主要获取站点物理路径

文件位置:xcEduService01\xc-service-manage-cms-client\src\main\java\com\xuecheng\manage_cms_client\dao\CmsSiteRepository.java

package com.xuecheng.manage_cms_client.dao;import com.xuecheng.framework.domain.cms.CmsSite;
import org.springframework.data.mongodb.repository.MongoRepository;public interface CmsSiteRepository extends MongoRepository<CmsSite,String> {
}

6.PageService

在Service中定义保存页面静态文件到服务器物理路径方法:
文件位置:xcEduService01\xc-service-manage-cms-client\src\main\java\com\xuecheng\manage_cms_client\service\PageService.java

package com.xuecheng.manage_cms_client.service;import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.xuecheng.framework.domain.cms.CmsPage;
import com.xuecheng.framework.domain.cms.CmsSite;
import com.xuecheng.manage_cms_client.dao.CmsPageRepository;
import com.xuecheng.manage_cms_client.dao.CmsSiteRepository;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.stereotype.Service;import java.io.*;
import java.util.Optional;/*** @author Administrator* @version 1.0**/
@Service
public class PageService {private static  final Logger LOGGER = LoggerFactory.getLogger(PageService.class);@AutowiredGridFsTemplate gridFsTemplate;@AutowiredGridFSBucket gridFSBucket;@AutowiredCmsPageRepository cmsPageRepository;@AutowiredCmsSiteRepository cmsSiteRepository;//保存html页面到服务器物理路径public void savePageToServerPath(String pageId){//根据pageId查询cmsPageCmsPage cmsPage = this.findCmsPageById(pageId);//得到html的文件id,从cmsPage中获取htmlFileId内容String htmlFileId = cmsPage.getHtmlFileId();//从gridFS中查询html文件InputStream inputStream = this.getFileById(htmlFileId);if(inputStream == null){LOGGER.error("getFileById InputStream is null ,htmlFileId:{}",htmlFileId);return ;}//得到站点idString siteId = cmsPage.getSiteId();//得到站点的信息CmsSite cmsSite = this.findCmsSiteById(siteId);//得到站点的物理路径String sitePhysicalPath = cmsSite.getSitePhysicalPath();//得到页面的物理路径String pagePath = sitePhysicalPath + cmsPage.getPagePhysicalPath() + cmsPage.getPageName();//将html文件保存到服务器物理路径上FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(new File(pagePath));IOUtils.copy(inputStream,fileOutputStream);} catch (Exception e) {e.printStackTrace();}finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}//根据文件id从GridFS中查询文件内容public InputStream getFileById(String fileId){//文件对象GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));//打开下载流GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());//定义GridFsResourceGridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);try {return gridFsResource.getInputStream();} catch (IOException e) {e.printStackTrace();}return null;}//根据页面id查询页面信息public CmsPage findCmsPageById(String pageId){Optional<CmsPage> optional = cmsPageRepository.findById(pageId);if(optional.isPresent()){return optional.get();}return null;}//根据站点id查询站点信息public CmsSite findCmsSiteById(String siteId){Optional<CmsSite> optional = cmsSiteRepository.findById(siteId);if(optional.isPresent()){return optional.get();}return null;}
}

7.ConsumerPostPage

在cms client工程的mq包下创建ConsumerPostPage类,ConsumerPostPage作为发布页面的消费客户端,监听
页面发布队列的消息,收到消息后从mongodb下载文件,保存在本地。

文件位置:xcEduService01\xc-service-manage-cms-client\src\main\java\com\xuecheng\manage_cms_client\mq\ConsumerPostPage.java

package com.xuecheng.manage_cms_client.mq;import com.alibaba.fastjson.JSON;
import com.xuecheng.framework.domain.cms.CmsPage;
import com.xuecheng.manage_cms_client.service.PageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Map;/*** 监听MQ,接收页面发布消息* @author Administrator* @version 1.0**/
@Component
public class ConsumerPostPage {private static  final Logger LOGGER = LoggerFactory.getLogger(ConsumerPostPage.class);@AutowiredPageService pageService;@RabbitListener(queues = {"${xuecheng.mq.queue}"})public void postPage(String msg){//解析消息Map map = JSON.parseObject(msg, Map.class);//得到消息中的页面idString pageId = (String) map.get("pageId");//校验页面是否合法CmsPage cmsPage = pageService.findCmsPageById(pageId);if(cmsPage == null){LOGGER.error("receive postpage msg,cmsPage is null,pageId:{}",pageId);return ;}//调用service方法将页面从GridFs中下载到服务器pageService.savePageToServerPath(pageId);}
}

三.页面发布——生产方

1.需求分析

管理员通过 cms系统发布“页面发布”的消费,cms系统作为页面发布的生产方。
需求如下:
1、管理员进入管理界面点击“页面发布”,前端请求cms页面发布接口。
2、cms页面发布接口执行页面静态化,并将静态化页面存储至GridFS中。
3、静态化成功后,向消息队列发送页面发布的消息。
1) 获取页面的信息及页面所属站点ID。
2) 设置消息内容为页面ID。(采用json格式,方便日后扩展)
3) 发送消息给ex_cms_postpage交换机,并将站点ID作为routingKey。

工程位置:xcEduService01\xc-service-manage-cms

2.RabbitMQ配置

1)配置Rabbitmq的连接参数

在application.yml添加如下配置:

server:port: 31001
spring:application:name: xc-service-manage-cmsdata:mongodb:uri:  mongodb://root:123@localhost:27017database: xc_cmsrabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guestvirtualHost: /freemarker:cache: false  #关闭模板缓存,方便测试settings:template_update_delay: 0

2)在pom.xml添加依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

3)RabbitMQConfig配置

由于cms作为页面发布方要面对很多不同站点的服务器,面对很多页面发布队列,所以这里不再配置队列,只需要
配置交换机即可。
文件位置:xcEduService01\xc-service-manage-cms\src\main\java\com\xuecheng\manage_cms\config\RabbitmqConfig.java

package com.xuecheng.manage_cms.config;import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author Administrator* @version 1.0**/
@Configuration
public class RabbitmqConfig {//交换机的名称public static final String EX_ROUTING_CMS_POSTPAGE="ex_routing_cms_postpage";/*** 交换机配置使用direct类型* @return the exchange*/@Bean(EX_ROUTING_CMS_POSTPAGE)public Exchange EXCHANGE_TOPICS_INFORM() {return ExchangeBuilder.directExchange(EX_ROUTING_CMS_POSTPAGE).durable(true).build();}}

3.Api接口

在api工程定义页面发布接口:
文件位置:xcEduService01\xc-service-api\src\main\java\com\xuecheng\api\cms\CmsPageControllerApi.java

    //页面发布@ApiOperation("页面发布")public ResponseResult post(String pageId);

4.PageService

在PageService中定义页面发布方法,代码如下:
文件位置:xcEduService01\xc-service-manage-cms\src\main\java\com\xuecheng\manage_cms\service\PageService.java

    //页面发布public ResponseResult post(String pageId){//执行页面静态化String pageHtml = this.getPageHtml(pageId);//将页面静态化文件存储到GridFs中CmsPage cmsPage = saveHtml(pageId, pageHtml);//向MQ发消息sendPostPage(pageId);return new ResponseResult(CommonCode.SUCCESS);}//向mq 发送消息private void sendPostPage(String pageId){//得到页面信息CmsPage cmsPage = this.getById(pageId);if(cmsPage == null){ExceptionCast.cast(CommonCode.INVALID_PARAM);}//创建消息对象Map<String,String> msg = new HashMap<>();msg.put("pageId",pageId);//转成json串String jsonString = JSON.toJSONString(msg);//发送给mq//站点idString siteId = cmsPage.getSiteId();rabbitTemplate.convertAndSend(RabbitmqConfig.EX_ROUTING_CMS_POSTPAGE,siteId,jsonString);}//保存html到GridFSprivate CmsPage saveHtml(String pageId,String htmlContent){//先得到页面信息CmsPage cmsPage = this.getById(pageId);if(cmsPage == null){ExceptionCast.cast(CommonCode.INVALID_PARAM);}ObjectId objectId = null;try {//将htmlContent内容转成输入流InputStream inputStream = IOUtils.toInputStream(htmlContent, "utf-8");//将html文件内容保存到GridFSobjectId = gridFsTemplate.store(inputStream, cmsPage.getPageName());} catch (IOException e) {e.printStackTrace();}//将html文件id更新到cmsPage中cmsPage.setHtmlFileId(objectId.toHexString());cmsPageRepository.save(cmsPage);return cmsPage;}

5.CmsPageController

编写Controller实现api接口,接收页面请求,调用service执行页面发布
文件位置:xcEduService01\xc-service-manage-cms\src\main\java\com\xuecheng\manage_cms\controller\CmsPageController.java

@Override
@PostMapping("/postPage/{pageId}")
public ResponseResult post(@PathVariable("pageId") String pageId) {return pageService.post(pageId);
}

四.页面发布——前端

用户操作流程:
1、用户进入cms页面列表。
2、点击“发布”请求服务端接口,发布页面。
3、提示“发布成功”,或发布失败。

1.API方法

在 cms前端添加 api方法
文件位置:xc-ui-pc-sysmanage\src\module\cms\api\cms.js

/*发布页面*/
export const page_postPage= id => {
return http.requestPost(apiUrl+'/cms/page/postPage/'+id)
}

2.页面

文件位置:xc-ui-pc-sysmanage\src\module\cms\page\page_list.vue

1)修改page_list.vue,添加发布按钮

<el‐table‐column label="发布" width="80">
<template slot‐scope="scope">
<el‐button
size="small" type="primary" plain @click="postPage(scope.row.pageId)">发布
</el‐button>
</template>
</el‐table‐column>

2)添加页面发布事件

postPage (id) {
this.$confirm('确认发布该页面吗?', '提示', {
}).then(() => {
cmsApi.page_postPage(id).then((res) => {
if(res.success){
console.log('发布页面id='+id);
this.$message.success('发布成功,请稍后查看结果');
}else{
this.$message.error('发布失败');
}
});
}).catch(() => {
});
},

五.测试

这里测试轮播图页面修改、发布的流程:
1、修改轮播图页面模板或修改轮播图地址
注意:先修改页面原型,页面原型调试正常后再修改页面模板。
2、执行页面预览
3、执行页面发布,查看页面是否写到网站目录
4、刷新门户首页并观察轮播图是否变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Log4J日志配置详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Log4j简介 Log4j有三个主要的组件&#xff1a;Loggers(记录器)&#xff0c;Appenders (输出源)和Layouts(布局)。这里可简单理解为日…

中文编码杂谈

编码问题的例子 在windows自带的notepad&#xff08;记事本&#xff09;程序中输入“联通”两个字&#xff0c;保存后再次打开&#xff0c;会发现“联通”不见了&#xff0c;代之以“”的乱码。这是windows平台上典型的中文编码问题。即文件保存的时候是按照ANSI编码&#xff…

easyUI 日期控件修改...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 个人觉得easyUI挺好用的。 它的中文文档地址&#xff1a; http://www.zi-han.net/case/easyui/ 日期本来效果是这样的&#xff1a; 改…

面向对象分析的三个模型与5个层次

在面向对象分析中&#xff0c;主要由对象模型、动态模型和功能模型组成。对象模型是最基本、最重要、最核心的。 面向对象建模得到的模型包含系统的3个要素&#xff0c;即静态结构(对象模型)、交互次序(动态模型)和数据变换(功能模型)。解决的问题不同&#xff0c;这3个子模型…

学成在线--15.课程计划查询

文章目录一.需求分析二.页面原型1.tree组件介绍2.webstorm配置jsx三.API接口1.数据模型2.自定义模型类3.接口定义四.sql语句五.服务器端1.Dao1&#xff09;Mapper接口2&#xff09;Mapper映射文件2.Service3.Controller4.测试六.前端1.Api方法2.Api调用1&#xff09;定义查询课…

团队作业-项目答辩

1. 王书磊 1600802063 http://www.cnblogs.com/wsl-1117/ 刘令斌 1600802017 http://www.cnblogs.com/liulingbin/ 许浩然 1600802066 https://www.cnblogs.com/xuhaoran1/ 成明龙 1600802038 http://www.cnblogs.com/CMLCML/ 2这是我们的效果图. 3.&#xff08;1&#xff09;修…

Java构造和解析Json数据的两种方法详解一

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在www.json.org上公布了很多JAVA下的json构造和解析工具&#xff0c;其中org.json和json-lib比较简单&#xff0c;两者使用上差不多但还是…

JsRender 前端渲染模板常用API学习

JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的&#xff0c;使用的情况有以下几种。 把html字符串编译编译成模板获取使用script标签声明的模板&#xff0c;并返回一个模板对象把html字符串或者在script标签中声明的模板注册成命名模板获取之前就…

状态图

状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态图是为了以下的研究目的&#xff1a;研究类、角色、子系统、或组件的复杂行为。

我身边的手机应用开发者

手机应用火了&#xff0c;我身边的一位朋友(A君)也投身到开发者行列&#xff0c;不过他还算聪明并没有辞掉工作专做手机应用软件开发。 其原因在于他们领导打算做一款自己的应用软件&#xff0c;正当A君愁到底是做IOS平台还是Android平台的时候&#xff0c;领导说&#xff1a;…

学成在线--16.添加课程计划

文章目录一.需求分析二.API接口三.后端1.Dao2.Service3.Controller4.测试四.前端1.页面原型说明1&#xff09;添加按钮2&#xff09;视图部分3&#xff09;在数据模型中添加如下变量4&#xff09;定义表单提交方法和重置方法2.Api调用1&#xff09;定义 api方法2&#xff09;调…

理解 maven 的核心概念

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 本文以类图的方式&#xff0c;介绍 maven 核心的 12 个概念及相互之间的关系。 Table of Contents 1 maven管理的目标&#xff1a;工程…

C#关键字的使用

params object[] 用于函数多参数的定义public static void Write(string format, params object[] arg);explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 例如&#xff0c;在下面的示例中&#xff0c;此运算符将名为 Fahrenheit 的类转换为名为 Ce…

maven 中 pom.xml 配置文件标签说明,dependencyManagement和dependencies区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 参考&#xff1a;http://zhaoshijie.iteye.com/blog/2094478http://blog.csdn.net/cpf2016/article/details/45674377 还有一篇转载文章…

学成在线--17.我的课程

文章目录一.需求分析二.API接口三.PageHelper1.PageHelper介绍2.添加依赖3.配置pageHelper四.Dao1.mapper 接口2.mapper.xml映射文件3.测试Dao五.Service六.Controller七.前端1.创建course_list.vue2.路由3.定义API方法4.前端视图course_list.vue详解1&#xff09;API调用--在视…

学成在线--18.新增课程(课程分类查询)

文章目录一.需求分析二.课程分类查询介绍三.数据结构四.数据格式五.数据模型六.Api接口七.服务器端1.Dao1&#xff09;定义mapper2&#xff09;定义mapper映射文件2.Service3.Controller八.接口测试一.需求分析 用户操作流程如下&#xff1a; 1、用户进入“我的课程”页面&…

POI 方式-excle 表格导出实现-java-poi

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; jsp 页面 用的Bootstrap &#xff1a; <li class"dropdown"> <a href"javascript:void(0)…

学成在线--19.新增课程(数据字典)

文章目录一.介绍二.数据模型三.数据模型类四.字典查询API接口五.服务器端1.Dao2.Service3.Controller一.介绍 在新增课程界面需要选择课程等级、课程状态等&#xff0c;这些信息统一采用数据字典管理的方式。 本项目对一些业务的分类配置信息&#xff0c;比如&#xff1a;课程…

程序员的进化

对于很多同学来说&#xff0c;他们对程序员的职业生涯非常关注。而这本质上是一个进化的过程。我们将如何进化&#xff1f;在每个进化阶段我们应该如何提高自己&#xff1f;下面的文章根据我自己的切身经历和阅读过的书&#xff0c;为程序员每个阶段的进化提供了不同的学习思路…

学成在线--20.新增课程(最后完善)

文章目录一.效果展示二.服务端1.Api接口2.Dao3.Service4.Controller三.前端1.页面完善1&#xff09;创建course_add.vue页面2&#xff09;course_add.vue页面路由3&#xff09;course_list.vue中添加链接2.查询数据字典1&#xff09;视图中代码2&#xff09;定义Api方法3&#…