课程的上线

1.课程管理前端上线
1.点击某一行数据(@Row-click),把选中的数据保存起来
2.点击上线按钮,判断是否有选中数据,如果没有抛出异常
3.发送上线请求到后台,把课程ID作为参数

行内点击事件:

@row-click="rowClick"

前端方法实现:

      //上线的方法
            onLineCourse(){
                if (!this.row || this.row ===""){
                    this.$message({message:'亲,请选择一门课程!',type:'eror'})
                    return;
                }
                this.$http.post("/course/course/onLineCourse/"+this.row.id).then(res=>{
                    console.log(res)
                    console.log("--------------")
                    console.log(res.data)
                    var ajaxResult = res.data;
                    if(ajaxResult.success){
                        this.$message({
                            message: '上线成功!',
                            type: 'success'
                        });
                        this.addFormVisible = false;
                        this.getCourses();
                    }else{
                        this.$message({
                            message: ajaxResult.message,
                            type: 'error'
                        });
                    }
                });
            },
            //下线的方法
            offLineCourse(){
                if (!this.row || this.row === ""){
                    this.$message({message:'亲,请选择一门课程!',type:'eror'})
                    return;
                }
                this.$http.post("/course/course/offLineCourse/"+this.row.id).then(res=>{
                    var ajaxResult = res.data;
                    if(ajaxResult.success){
                        this.$message({
                            message: '下线成功!',
                            type: 'success'
                        });
                        this.addFormVisible = false;
                        this.getCourses();
                    }else{
                        this.$message({
                            message: ajaxResult.message,
                            type: 'error'
                        });
                    }
                });
            },
            //列表的点击事件:获得该行信息
            rowClick(row){
                this.row = row
            }
2.课程上线后台
1.从数据库查询上线的课程
2.判断课程的状态为下线
3.修改Mysql中课程状态为上线
4.把课程对象封装成ES的文档对象
5.调用ES的client把文档对象存储到ES
3.ES服务的搭建
hrm-es-parent
    hrm-es-client
    hrm-es-common       //存放ES的doc映射对象
    hrm-es-service-2050
    
1.搭建hrm-es-service-2050的基础
2.导入es的依赖 ,yml中 配置es
3.创建CourseDoc文档映射对象 (hrm-es-common)
4.创建CourseElasticSearchResposity(hrm-es-service-2050)
5.创建CourseEsController ,完成  CourseDoc的保存
6.完成 hrm-es-client 接口的编写
7.别忘了要初始化索引库
 

1.hrm-es-common模块:

依赖:

<dependencies>
    <!--springboot 对spring data es支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
</dependencies>

文档映射类:

/**
 * 针对于  course 表的文档映射
 * indexName:索引库
 * type:类型(表类型)
 *  注意:文档对象中需要哪些列:1.看前端需要哪些列 2.看条件查询有哪些列
 */
@Document(indexName= "hrm",type = "course")
public class CourseDoc {
​
    //对应文档的Id
    @Id
    private Long id;
​
    //课程名称:分词
    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String name;
​
    //适用人群
    private String users;
​
    private String pic;
​
    private String courseTypeName;
​
    //课程名称
    private String gradeName;
    private String tenantName;
    private String startTime;
    private String endTime;
    private String price;
    ....
    }

2.hrm-es-service-2050模块(ES服务端):

引入hrm-es-common的依赖:

        <dependency>
            <groupId>cn.itsource.hrm</groupId>
            <artifactId>hrm-es-common</artifactId>
        </dependency>

ES服务端配置文件:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:1010/eureka
  instance:
    prefer-ip-address: true
    instance-id: hrm-es-service
server:
  port: 2050
spring:
  application:
    name: hrm-es-service
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300

配置类:

@SpringBootApplication  //1.开启自动配置 2.标记这是一个配置类,并把里面的bean放到spring管理 3.开启扫描
@EnableDiscoveryClient
public class EsServiceApplication2050 {
    public static void main(String[] args) {
        SpringApplication.run(EsServiceApplication2050.class);
    }
}

Es仓库:

@Repository
public interface CourseElasticsearchRepository extends ElasticsearchRepository<CourseDoc,Long> {
}

ES服务端controller:

@RestController
@RequestMapping("/es")
public class CourseEsController {
    @Autowired
    private CourseElasticsearchRepository courseElasticsearchRepository;
​
    //保存方法
    @PostMapping("/save")
    public AjaxResult save(@RequestBody CourseDoc courseDoc){
        courseElasticsearchRepository.save(courseDoc);
        return AjaxResult.me();
    }
​
    //删除方法
    @PostMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id){
        courseElasticsearchRepository.deleteById(id);
        return AjaxResult.me();
    }
}

3.hrm-es-client模块(Es客户端):

也会引入hrm-es-common模块的依赖:略

Feigin接口:

@FeignClient(value = "hrm-es-service",fallback= EsClientFallBack.class)
public interface EsClient {
​
    //保存方法
    @PostMapping("/es/save")
    AjaxResult save(@RequestBody CourseDoc courseDoc);
​
    //删除方法
    @PostMapping("/es/delete/{id}")
    AjaxResult delete(@PathVariable Long id);
​
}

托底类:

@Service
public class EsClientFallBack implements EsClient {
​
    @Override
    public AjaxResult save(CourseDoc courseDoc) {
        return AjaxResult.me().setSuccess(false).setMessage("Es服务不可用");
    }
​
    @Override
    public AjaxResult delete(Long id) {
        return AjaxResult.me().setSuccess(false).setMessage("Es服务不可用");
    }
​
}

4.课程模块:hrm-course-service-2020

引入Es客户端的依赖:

        <dependency>
            <groupId>cn.itsource.hrm</groupId>
            <artifactId>hrm-es-client</artifactId>
        </dependency>

实现类:CourseServiceImpl类:

需要使用事务:注解:

import org.springframework.transaction.annotation.Transactional;
@Transactional

上线功能:(注:GlobalException是自定义异常)

    //上线功能
    @Override
    public void onLineCourse(Long id) {
        //1.通过id获得对应的课程
        Course course = baseMapper.selectById(id);
        //2.判断课程的状态,是否为上线状态
        if (course == null ||  Course.STATUS_ONLINE.equals(course.getStatus())){
            throw new GlobalException("亲,该课程已是上线状态");
        }
        
        //3.不是上线状态,更改状态为上线
        course.setStatus(Course.STATUS_ONLINE);
        /*baseMapper.update(course, null);*/
        baseMapper.updateById(course );
​
        //4.将查询到的课程信息保存到ES索引库
            //1.创建Srouce的索引库
        CourseDoc courseDoc = new CourseDoc();
            //设置索引库
        courseDoc.setId(course.getId());
​
        CourseType courseType = courseTypeMapper.selectById(course.getCourseTypeId());
        courseDoc.setCourseTypeName(courseType.getName());
​
        courseDoc.setName(course.getName());
​
        courseDoc.setUsers(course.getUsers());
​
        courseDoc.setPic(course.getPic());
​
        courseDoc.setGradeName(course.getGradeName());
​
        courseDoc.setTenantName(course.getTenantName());
​
        CourseMarket courseMarket = courseMarketMapper.selectById(course.getId());
        courseDoc.setPrice(courseMarket.getPrice().toString());
​
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        courseDoc.setStartTime(simpleDateFormat.format(course.getStartTime()));
        courseDoc.setEndTime(simpleDateFormat.format(course.getEndTime()));
​
            //保存到索引库
        AjaxResult ajaxResult = esClient.save(courseDoc);
​
        System.out.println(ajaxResult.getMessage());
        //判断是否成功,不成功抛异常,自动回滚
        if (!ajaxResult.isSuccess()){
            throw new GlobalException(ajaxResult.getMessage());
        }
    }

下线功能:

    //下线功能
    @Override
    public void offLineCourse(Long id) {
        //1.通过id获得对应的课程
        Course course = baseMapper.selectById(id);
        //2.判断课程的状态,是否为下线状态
        if (course == null ||  Course.STATUS_OFFLINE.equals(course.getStatus())){
            throw new GlobalException("亲,该课程已是下线状态");
        }
        //3.不是上线状态,更改状态为上线
        course.setStatus(Course.STATUS_OFFLINE);
        /*baseMapper.update(course, null);*/
        baseMapper.updateById(course);
​
        //4.从ES索引库中删除课程
        AjaxResult ajaxResult = esClient.delete(course.getId());
​
        //判断是否成功,不成功抛异常,自动回滚
        if (!ajaxResult.isSuccess()){
            throw new GlobalException("亲,该课程已经下线");
        }
    }

5.注意:别忘了要初始化索引库

    //初始化初始化索引库
    @Test
    public void testEsCourse() throws Exception{
        elasticsearchTemplate.createIndex(CourseDoc.class);
        elasticsearchTemplate.putMapping(CourseDoc.class);
    }