我们现在需要把课程的分类做一个上下线的功能,在后台点击上线然后存入ES中,我们前端调用的使用就调用ES然后渲染界面
创建一个微服务
导入包pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
yml中开启
server:
port: 1080
spring:
application:
name: search-service
data:
elasticsearch:
cluster-nodes: 127.0.0.1:9300
cluster-name: elasticsearch
eureka:
client:
service-url:
defaultZone: http://localhost:1010/eureka
instance:
prefer-ip-address: true
instance-id: search-server:1080
写一个Resposity
@Repository public interface EsCourseElasticsearchRepository extends ElasticsearchRepository<ESCourseDoc,Long> { }
通过把这个交给Spring管理就可以操作ES了
写一个Controller
/** * 这里我们到底需要什么对象因为数据区和索引区需要根据我们的需求制定DOC, * 所以我们封装数据的时候可以传过来处理也可以在传入的时候处理,主要是我们的业务什么需要分词 * 什么不需要分词DOC文档 */ @PostMapping("/es/save") public AjaxResult save(@RequestBody ESCourseDoc esCourseDoc){ try { courseElasticsearchRepository.save(esCourseDoc); return AjaxResult.me(); } catch (Exception e) { e.printStackTrace(); return AjaxResult.me().setSuccess(false).setResultObj("保存失败"); } } @PostMapping("/es/del/{id}") public AjaxResult del(@PathVariable("id")Long id){ try { courseElasticsearchRepository.deleteById(id); return AjaxResult.me(); } catch (Exception e) { e.printStackTrace(); return AjaxResult.me().setSuccess(false).setResultObj("保存失败"); } }
因为是多服务我们开启一个配置类
//创建配置类 @Configuration @EnableFeignClients("cn.jiedada.hrm.fegin") public class ESCourseConfig { }
写入Fegin接口
@FeignClient(value = "search-service",fallbackFactory = ESCourseClientFallbackFactory.class) public interface ESCourseClient { @PostMapping("/es/save") AjaxResult save(@RequestBody ESCourseDoc esCourseDoc); @PostMapping("/es/del/{id}") AjaxResult del(@PathVariable("id")Long id); }
写FallbackFactroy
@Component public class ESCourseClientFallbackFactory implements FallbackFactory<ESCourseClient> { @Override public ESCourseClient create(Throwable throwable) { return new ESCourseClient() { @Override public AjaxResult save(ESCourseDoc esCourseDoc) { throwable.printStackTrace(); return AjaxResult.me().setSuccess(false).setResultObj("Es保存课程失败"); } @Override public AjaxResult del(Long id) { throwable.printStackTrace(); return AjaxResult.me().setSuccess(false).setResultObj("Es删除课程失败"); } }; } }
在课程Controller中写入上线下线功能
/** * 下线功能 * @return Ajaxresult转换结果 */ @RequestMapping(value="/offLineCourse/{id}",method= RequestMethod.POST) public AjaxResult offLineCourse(@PathVariable("id")Long id){ try { courseService.offLineCourse(id); return AjaxResult.me(); } catch (Exception e) { e.printStackTrace(); return AjaxResult.me().setMessage("保存对象失败!"+e.getMessage()); } } /** * 上线功能 * @return Ajaxresult转换结果 */ @RequestMapping(value="/onLineCourse/{id}",method= RequestMethod.POST) public AjaxResult onLineCourse(@PathVariable("id")Long id){ try { courseService.onLineCourse(id); return AjaxResult.me(); } catch (Exception e) { e.printStackTrace(); return AjaxResult.me().setMessage("保存对象失败!"+e.getMessage()); } }
service
//判断选入课程是否上线 //如果没有上线则修改状态为上线状态 //修改数据中的状态 //保存到ES中去 @Override public void onLineCourse(Long id) { Course course = baseMapper.selectById(id); if(course.getStatus()== 1){ throw new RuntimeException("该课程为上线状态请勿修改"); } course.setStatus(1); updateById(course); CourseMarket courseMarket = courseMarketMapper.selectById(id); CourseDetail courseDetail = courseDetailMapper.selectById(id); ESCourseDoc esCourseDoc = new ESCourseDoc(); //属性拷贝 esCourseDoc.setStartTime(new Date()); BeanUtils.copyProperties(courseMarket,esCourseDoc); BeanUtils.copyProperties(course,esCourseDoc); BeanUtils.copyProperties(courseDetail,esCourseDoc); AjaxResult ajaxResult = esCourseClient.save(esCourseDoc); //如果保存失败 if (!ajaxResult.isSuccess()){ log.error("保存到ES中失败"); throw new RuntimeException("保存到ES中失败"); } } @Override public void offLineCourse(Long id) { Course course = baseMapper.selectById(id); if(course.getStatus()== 0){ throw new RuntimeException("该课程为下线状态请勿修改"); } course.setStatus(0); updateById(course); AjaxResult ajaxResult = esCourseClient.del(id); //如果保存失败 if (!ajaxResult.isSuccess()){ log.error("删除ES中失败"); throw new RuntimeException("删除ES中失败"); } }
完成