在这里插入代码片
接口Api:
@ApiOperation("播放视频页面,根据课程id查询课程计划信息")
public Map<String,CoursePub> getall(String id);
搜索服务中的Service
/**
* 播放视频栏目录,的课程列表
* @param id 课程id
* @return 课程详细对象表
*/
public Map<String,CoursePub> getall(String id) {
//定义一个搜索对象,指定一个表的索引库xc_course
SearchRequest searchRequest = new SearchRequest(index);
//指定这张表的所属类型
searchRequest.types(type);
//定义按什么规则搜索的对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//按课程id列精确匹配
searchSourceBuilder.query(QueryBuilders.termQuery("id",id));
//不需要设置过滤的字段,因为我们要全部取出来
// searchSourceBuilder.fetchSource()
//把规则搜索,添加进搜索对象,准备
searchRequest.source(searchSourceBuilder);
//准备一个最终要返回的数据map
HashMap<String, CoursePub> map = new HashMap<>();
//开始用高可用ES取数据
try {
//得到搜索的对象数据
SearchResponse search = restHighLevelClient.search(searchRequest);
//把数据集拿出来
SearchHits hits = search.getHits();
//把数据集,分离为数组,每个数组,里面是一行数据
SearchHit[] searchHits = hits.getHits();
//遍历,得到源文档
for (SearchHit searchHit : searchHits) {
//准备一个要封装的课程对象
CoursePub coursePub = new CoursePub();
//获取这一行数据的源文档
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
//开始取字段,并封装coursePub
//课程id
String courseId = (String) sourceAsMap.get("id");
String name = (String) sourceAsMap.get("name");
String grade = (String) sourceAsMap.get("grade");
String charge = (String) sourceAsMap.get("charge");
String pic = (String) sourceAsMap.get("pic");
String description = (String) sourceAsMap.get("description");
String teachplan = (String) sourceAsMap.get("teachplan");
coursePub.setId(courseId);
coursePub.setName(name);
coursePub.setPic(pic);
coursePub.setGrade(grade);
coursePub.setTeachplan(teachplan);
coursePub.setDescription(description);
//添加进要返回数据的map
map.put(courseId,coursePub);
}
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
Controller
/**
* 播放视频栏,的课程列表
* @param id 课程id
* @return 课程详细对象表
*/
@Override
@GetMapping("/getall/{id}")
public Map<String, CoursePub> getall(@PathVariable("id") String id) {
return esCourseService.getall(id);
}
配置虚拟主机
学习中心的二级域名为ucenter.xuecheng.com,我们在nginx中配置ucenter虚拟主机。
#后端搜索服务
location /openapi/search/ {
proxy_pass http://search_server_pool/search/;
}
前端需要添加的代码:
if (!view_course||!view_course[this.courseId]){
this.$message.error("获取课程信息失败")
return;
}
//根据课程id拿到课程信息
let courseInfo = view_course[this.courseId];
//取出teachplan的串
let teachplanString = courseInfo.teachplan;
//把串转成对象
let teachplanObj = JSON.parse(teachplanString);
//取到课程计划,//转为对象后,再得到课程计划的属性。属性是一个map集合。
this.teachplanList = teachplanObj.children;
课程发布存储媒资信息
课程媒资信息是在课程发布的时候存入ElasticSearch索引库,因为课程发布后课程信息将基本不再修改,具体的业务流程如下:
1、课程发布,向课程媒资信息表写入数据。
1)根据课程id删除teachplanMediaPub中的数据
2)根据课程id查询teachplanMedia数据
3)将查询到的teachplanMedia数据插入到teachplanMediaPub中
2、Logstash定时扫描课程媒资信息表,并将课程媒资信息写入索引库。
2.2.2 数据模型
在xc_course数据库创建课程计划媒资发布表:
CREATE TABLE `teachplan_media_pub` (
`teachplan_id` varchar(32) NOT NULL COMMENT '课程计划id',
`media_id` varchar(32) NOT NULL COMMENT '媒资文件id',
`media_fileoriginalname` varchar(128) NOT NULL COMMENT '媒资文件的原始名称',
`media_url` varchar(256) NOT NULL COMMENT '媒资文件访问地址',
`courseid` varchar(32) NOT NULL COMMENT '课程Id',
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT
'logstash使用',
PRIMARY KEY (`teachplan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
实体类中加入时间戳属性:
@Column(name="timestamp")
private Date timestamp;//时间戳
Dao
Service
编写保存课程计划媒资信息方法,并在课程发布时调用此方法。
1、保存课程计划媒资信息方法
本方法采用先删除该课程的媒资信息,再添加该课程的媒资信息。
先删后插的方法:
/**
* 向TeachplanMediaPub中保存媒资信息,先删后插
* @param courseId 课程id
*/
private void saveTeachplanMediaPub(String courseId){
//先删除,同样课程的媒资记录
teachplanMediaPubRepository.deleteByCourseId(courseId);
//然后,teachplanMedia中,取数据媒资文件集合,这个方法是自定义的
List<TeachplanMedia> teachplanMediaList = teachplanMediaRepository.findByCourseId(courseId);
//把取到的数据,复制进pub媒资对象中
List<TeachplanMediaPub> teachplanMediaPubs = new ArrayList<>();
//遍历媒资文件数据集合
for (TeachplanMedia teachplanMedia