getall(String id);搜索服务中的Service/** * 播放视频栏目录,的课程列表 * @param id 课程id * @return 课程详细对象表 ..._edge浏览器 localhost 跨域">
赞
踩
在这里插入代码片
接口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<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。