课程上下线实现
改造课程删除和修改
前台:

选中触发事件
[外链图片转
上线

下线

后台:
Controller
//上线
//参数,long[] 支持批量上线
//返回值:Ajaxresult只关心成功与否
@PostMapping("/online")
public AjaxResult onLine(Long[] ids){
return courseService.onLine(ids);
}
//下线
@PostMapping("/offline")
public AjaxResult offline(Long[] ids){
return courseService.offLine(ids);
}
Service
把Course转换成EsCourse
/**
* 进行转换分为三个步骤来做:
* 1 声明要返回
* 2 转换
* 3返回
* @param courses
* @return
*/
private List<EsCourse> courses2EsCourses(List<Course> courses) {
//1 声明要返回
List<EsCourse> result = new ArrayList<>();
//2 转换
for (Course course : courses) {
result.add(course2EsCourse(course));
}
//3返回
return result;
}
//把一个course转换为EsCourse
private EsCourse course2EsCourse(Course course) {
//1 声明要返回
EsCourse result = new EsCourse();
// 2 转换
result.setId(course.getId());
result.setName(course.getName());
result.setUsers(course.getUsers());
result.setCourseTypeId(course.getCourseTypeId());
//type-同库-没有做关联查询
if (course.getCourseType() != null)
result.setCourseTypeName(course.getCourseType().getName());
result.setGradeId(course.getGrade());
result.setGradeName(course.getGradeName());
result.setStatus(course.getStatus());
result.setTenantId(course.getTenantId());
result.setTenantName(course.getTenantName());
result.setUserId(course.getUserId());
result.setUserName(course.getUserName());
result.setStartTime(course.getStartTime());
result.setEndTime(course.getEndTime());
//Detail
result.setIntro(null);
//resource
result.setResources(null);
//market
result.setExpires(null);
result.setPrice(null);
result.setPriceOld(null);
result.setQq(null);
// 3返回
return result;
}
CourseServiceImpl
@Override
public AjaxResult onLine(Long[] ids) {
try{
//1添加索引库
// 通过id查询数据库里面课程
List<Course> courses = courseMapper
.selectBatchIds(Arrays.asList(ids));
//转换为doc
List<EsCourse> esCourses = courses2EsCourses(courses);
//批量添加就ok
repository.saveAll(esCourses);
//2 修改数据库状态和上线时间 - ids,time
Map<String,Object> params = new HashMap<>();
params.put("ids",ids);
params.put("onLineTime",new Date());
courseMapper.onLine(params);
return AjaxResult.me();
}catch (Exception e){
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage("上线失败!"+e.getMessage());
}
}
Mapper
链表查询
CourseMapper
<!-- 上线-->
<!-- void onLine(Map<String, Object> params);-->
<update id="onLine" parameterType="map">
update t_course set status=1,start_time=#{onLineTime} where id in
<foreach collection="ids" separator="," open="(" close=")" item="id">
#{id}
</foreach>
</update>
<!-- void offLine(Map<String, Object> params);-->
<update id="offLine" parameterType="map">
update t_course set status=0 , end_time=#{offLineTime} where id in
<foreach collection="ids" separator="," open="(" close=")" item="id">
#{id}
</foreach>
</update>
Nginx
项目开发完成后,前端项目需要服务器部署.
npm run build 原来是拷贝到tomcat,但是有问题,tomcat是Servlet容器,处理静态页面效率低下。
需要专门的http服务器-nginx就是其中一个。
Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊戈尔·西索夫(Igor Sysoev)所开发,官方测试 nginx 能够支支撑 5 万并发连接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。
Nginx 应用场景:
1、http 服务器。Nginx 是一个 http 服务可以独立提供 http 服务。可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
安装-windows
安装-解压就ok
命令:
启动 start nginx.exe localhost 默认端口是80
停止 nginx.exe -s stop
重载 nginx.exe -s reload 修改了配置文件的时候需要重新加载.

如果端口被占用解决方法:
1、打开命令窗口(以管理员身份运行)
开始—->运行—->cmd,或者是 window+R 组合键,调出命令窗口。
2、查找所有运行的端口
输入命令:
netstat -ano
3、查看被占用端口对应的 PID
输入命令:
netstat -aon|findstr "8081"
4、查看指定 PID 的进程
继续输入命令:
tasklist|findstr "9088"
结束进程
强制(/F参数)杀死 pid 为 9088 的所有进程包括子进程(/T参数):
taskkill /T /F /PID 9088
Nginx静态网站部署
前端项目:
vuecli项目
Css+div
静态网站的部署-部署阶段
1)npm管理js vuecli
Npm run build 打包并部署
2)直接引入js 传统静态
直接拷贝就ok
静态网站动态调试-开发阶段
开发阶段: vuecli可以npm run dev启动调试,传统导入js开发的模式,没法直接服务器方式调试,需要安装 live-server服务器,这个服务器很简单就是node一个模块.
1)创建项目-课程管理
不同静态项目
2)拷贝项目
拷贝前端写好项目原型
3)运行项目-搭建一个前端服务器
npm install -g live-server
live-server --port=6002

修改contextpath

Nginx配置虚拟主机 (不同域名或端口转发不同的目录)
虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
端口绑定
1)上传静态网站:
前端网站hrm_web_course nginx/hrm_web_course下
前端网站hrm_web_system打包后 上传至 nginx/hrm_web_system 下
2)修改Nginx 的配置文件:conf/nginx.conf
server {
listen 82;
server_name localhost;
location / {
root hrm_web_course;
index index.html;
}
}
server {
listen 83;
server_name localhost;
location / {
root hrm_web_system;
index index.html;
}
}
3)访问测试: 重新加载Nginx
地址栏输入http://localhost:82 查看对应效果
地址栏输入http://localhost:83 查看对应效果
域名绑定
域名([Domain Name](https://baike.baidu.com/item/Domain Name)),是由一串用“点”分隔的字符组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置,地理上的域名,指代有行政自主权的一个地方区域)。域名是一个IP地址上有“面具” 。
域名解析分两步:
hosts:本地域名
远程域名:在网络上找DNS(域名解析服务器)来解析域名
域名等级
(1)顶级域名
顶级域名又分为两类:
国家顶级域名:例如中国是cn,美国是us,日本是jp等
国际顶级域名:例如表示工商企业的 .Com .Top,表示网络提供商的.net,表示非盈利组织的.org,表示教育的.edu,以及没有限制的中性域名如.xyz等。
(2)二级域名
例如 ibm,yahoo,microsoft等;在国家顶级域名下,它是表示注册企业类别的符号,例如.top,com,edu,gov,net等。
例如:map.baidu.com
(3)三级域名
三级域名用字母( A~Z,a~z,大小写等)、数字(0~9)和连接符(-)组成, 各级域名之间用实点(.)连接,三级域名的长度不能超过20个字符。
例如:map.baidu.com
平时买域名,一般都是二级,然后通过功能划分三级域名。
***域名与IP绑定:***一个域名对应一个 ip 地址,一个 ip 地址可以被多个域名绑定。
配置域名
host
127.0.0.1 system.hrm.com
127.0.0.1 course.hrm.com
nginx.conf
server {
listen 80;
server_name system.hrm.com;
location / {
root hrm_web_system;
index index.html;
}
}
server {
listen 80;
server_name course.hrm.com;
location / {
root hrm_web_course;
index home.html;
}
}
刷新配置 nginx.exe -s reload
测试:
地址栏输入http://system.hrm.com/
地址栏输入http://course.hrm.com/
nginx反向代理
静态项目可以通过虚拟主机实现,但动态tomcat网站就不行,nginx无法解释运行.
什么是反向代理?
代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理。
反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器。
代理&反向代理
虽然正向代理服务器和反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。
1、正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。
2、正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
3、正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
4、正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。
反向代理配置
host配置域名
nginx.conf
配置语法

server {
listen 80;
server_name course.hrm.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:6002; #访问域名为course.hrm.com都交给6002处理
index index.html index.htm home.html;
}
}
server {
listen 80;
server_name system.hrm.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:6001; #访问域名为admin.hrm.com都交给6001处理
index index.html index.htm;
}
}
反向代理原理

反向代理的规则可以通过域名的不同来进行区别,也可以通过uri的不同来进行区别。
RabbitMQ
MQ全称为Message Queue,即消息队列. 它也是一个队列,遵循FIFO原则.先进先出
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开 发中应用非常广泛。
RabbitMQ是基于AMQP协议实现一种Mq.
使用场景
开发中消息队列通常有如下应用场景:
1、提高系统响应速度
任务异步处理。 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
2、提高系统稳定性
系统挂了关系,操作内容放到消息队列.
3、异步化
4、解耦
应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
5、排序保证 FIFO
秒杀
6、消除峰值 消峰
市场上还有哪些消息队列
ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ、Redis(秒杀)。
为什么使用RabbitMQ呢?
- 使得简单,功能强大。
- 基于AMQP协议。
- 社区活跃,文档完善。
- 高并发性能好,这主要得益于Erlang语言。Erlang(['ə:læŋ])是一种通用的面向并发的编程语言。erlang多用于交换机领域程序开发
- Spring Boot默认已集成RabbitMQ因为RabbitMQ是由Erlang编写的,所以在安装RabbitMQ必须要先安装erlang。
AMQP是什么 ?
总结:AMQP是一套公开的消息队列协议,最早在2003年被提出,它旨在从协议层定义消息通信数据的标准格式, 为的就是解决MQ市场上协议不统一的问题。RabbitMQ就是遵循AMQP标准协议开发的MQ服务。
JMS是什么 ?
总结: JMS是java提供的一套消息服务API标准,其目的是为所有的java应用程序提供统一的消息通信的标准,类似java的 jdbc,只要遵循jms标准的应用程序之间都可以进行消息通信。它和AMQP有什么 不同,jms是java语言专属的消 息服务标准,它是在api层定义标准,并且只能用于java应用;而AMQP是在协议层定义的标准,是跨语言的 。
RabbitMQ的工作原理

组成部分说明如下:
Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
消息发布接收流程:
-----发送消息-----
- 生产者和Broker建立TCP连接。
- 生产者和Broker建立通道。
- 生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
- Exchange将消息转发到指定的Queue(队列)
----接收消息-----
- 消费者和Broker建立TCP连接
- 消费者和Broker建立通道
- 消费者监听指定的Queue(队列)
- 当有消息到达Queue时Broker默认将消息推送给消费者。
- 消费者接收到消息。
下载安装
因为RabbitMQ是由Erlang编写的,所以在安装RabbitMQ必须要先安装erlang。

path 到bin
1、下载erlang
地址如下:
http://erlang.org/download/otp_win64_20.3.exe 或去老师提供的软件包中找到 otp_win64_20.3.exe,以管理员方式运行此文件,安装。
erlang安装完成需要配置erlang环境变量: ERLANG_HOME=D:\Program Files\erl9.3 在path中添 加%ERLANG_HOME%\bin;
2、安装RabbitMQ
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.3
或去老师提供的软件包中找到 rabbitmq-server-3.7.3.exe,以管理员方式运行此文件,安装。
3、启动
安装成功后会自动创建RabbitMQ服务并且启动。
1)从开始菜单启动RabbitMQ 完成在开始菜单找到RabbitMQ的菜单:
RabbitMQ Service-install :安装服务
RabbitMQ Service-remove 删除服务
RabbitMQ Service-start 启动
RabbitMQ Service-stop 停止
2)如果没有开始菜单则进入安装目录下sbin目录手动启动:
安装并运行服务
rabbitmq-service.bat install 安装服务
rabbitmq-service.bat stop 停止服务
rabbitmq-service.bat start 启动服务
4、安装Management
重新启动, 登录RabbitMQ
进入浏览器,输入:http://localhost:15672
初始账号和密码:guest/guest
注意:
- 安装erlang和rabbitMQ以管理员身份运行。
- 当卸载重新安装时会出现RabbitMQ服务注册失败,此时需要进入注册表清理erlang 搜索RabbitMQ、ErlSrv,将对应的项全部删除。
件,安装。
3、启动
安装成功后会自动创建RabbitMQ服务并且启动。
1)从开始菜单启动RabbitMQ 完成在开始菜单找到RabbitMQ的菜单:
RabbitMQ Service-install :安装服务
RabbitMQ Service-remove 删除服务
RabbitMQ Service-start 启动
RabbitMQ Service-stop 停止
2)如果没有开始菜单则进入安装目录下sbin目录手动启动:
安装并运行服务
rabbitmq-service.bat install 安装服务
rabbitmq-service.bat stop 停止服务
rabbitmq-service.bat start 启动服务
4、安装Management
重新启动, 登录RabbitMQ
进入浏览器,输入:http://localhost:15672
初始账号和密码:guest/guest
注意:
- 安装erlang和rabbitMQ以管理员身份运行。
- 当卸载重新安装时会出现RabbitMQ服务注册失败,此时需要进入注册表清理erlang 搜索RabbitMQ、ErlSrv,将对应的项全部删除。
启动测试-重启电脑
本文介绍了如何利用Nginx作为HTTP服务器和反向代理,以及RabbitMQ作为消息队列在课程管理系统中的应用。内容包括Nginx的端口管理和配置虚拟主机,以及RabbitMQ的安装、工作原理和消息发布接收流程。
1524

被折叠的 条评论
为什么被折叠?



