ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

互联网微服务SpringCloud

2021-06-07 20:32:48  阅读:128  来源: 互联网

标签:服务 spring SpringCloud boot springframework 互联网 import org com


1.回顾:Spring Cloud

•Eureka和众多服务执行流程

  1. 网关 Zuul
    2.1 现有问题?
    •不同的服务,有不同的端口号,在访问的时候,就需要写不同的访问路径
    http://localhost:9010/classes
    http://localhost:9020/student
    2.2 网关zuul执行原理分析

2.3 Zuul网关入门

•创建项目:day42-cloud-zuul

•修改pom.xml文件,添加zuul依赖

     <dependencies>
        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!--添加eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

•添加yml文件,配置端口号、服务名 、注册中心地址

服务端口号

server:
port: 10010

服务名

spring:
  application:
    name: zuul
eureka:
  client:
    service-url: #注册中心位置
      defaultZone: http://localhost:10086/eureka/
  instance: #web页面显示效果和访问路径
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true

•启动类,开启Zuul

 package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy        //开启网关zuul
@EnableEurekaClient     //开启eureka客户端
public class Day42ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(Day42ZuulApplication.class,args);
    }
}

•测试

 http://localhost:10010/classes-service/classes
http://localhost:10010/student-service/student
  1. 学生查询所有
    3.1 需求分析

•后端编写项目的个数
1.父项目:day43-student-parent
2.注册中心:day43-student-eureka
3.网关服务:day43-student-zuul
4.domain项目:day43-student-domain ,用于存放所有的JavaBean
5.班级服务:day43-student-service-classes
6.学生服务:day43-student-service-student

3.1 数据库

班级数据库

CREATE DATABASE day43_classes;
USE day43_classes;
CREATE TABLE `tb_class` (
  `c_id` VARCHAR(32) NOT NULL COMMENT '班级ID',
  `c_name` VARCHAR(50) DEFAULT NULL COMMENT '班级名称',
  `desc` VARCHAR(200) DEFAULT NULL COMMENT '班级描述',
  PRIMARY KEY (`c_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


INSERT  INTO `tb_class`(`c_id`,`c_name`,`desc`) VALUES ('c001','Java12班','99999996666'),('c0010','奥术大师大所大','阿达的'),('c0011','快男李进','java34第一快男'),('c0014','马保涛','d\'s\'da\'ddsdad'),('c0015','战术大师 马宝涛','666'),('c002','Java34班','。。。。'),('c003','Java56班','00000'),('c004','Java78班','。。。。66'),('c005','测试班222','测试测试222'),('c006','测试','描述测试'),('c007','测试222','测试222');

学生数据库

CREATE DATABASE day43_student;
USE day43_student;

CREATE TABLE `tb_student` (
  `s_id` VARCHAR(32) NOT NULL COMMENT '学生ID',
  `sname` VARCHAR(50) DEFAULT NULL COMMENT '姓名',
  `age` INT(11) DEFAULT NULL COMMENT '年龄',
  `birthday` DATETIME DEFAULT NULL COMMENT '生日',
  `gender` CHAR(1) DEFAULT NULL COMMENT '性别',
  `c_id` VARCHAR(32) DEFAULT NULL,
  `city_ids` VARCHAR(32) DEFAULT NULL COMMENT '城市:320000,321300,321322',
  PRIMARY KEY (`s_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;



INSERT  INTO `tb_student`(`s_id`,`sname`,`age`,`birthday`,`gender`,`c_id`,`city_ids`) VALUES ('s001','赵三33',21,'2001-01-17 00:00:00','1','c002','320000,321300,321322'),('s002','钱四444',1900,'2001-05-16 00:00:00','1','c003','320000,321300,321322'),('s003','孙五56',189,'2022-03-15 00:00:00','0','c001','320000,321300,321322'),('s004','张三',20,'2020-12-21 00:00:00','0','c001','320000,321300,321322'),('s008','xxx',18,'2020-12-21 00:00:00','0','c001','140000,140800,140823'),('s009','123',18,'2020-11-01 00:00:00','0','c001','130000,130100,130127'),('s010','xx',18,'2020-11-02 00:00:00','0','c001','130000,131000,131003');

3.2 搭建环境
3.2.1 父项目:
•创建项目:day43-student-parent
•修改pom.xml文件,spring boot、版本变量、依赖锁定

   <!-- 1 确定spring boot的版本-->
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.3.5.RELEASE</version>
   </parent>

   <!--2  确定版本-->
   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <java.version>1.8</java.version>
       <spring-cloud-release.version>Hoxton.SR9</spring-cloud-release.version>
       <mybatis.starter.version>1.3.2</mybatis.starter.version>
       <mapper.starter.version>2.0.2</mapper.starter.version>
       <mysql.version>5.1.32</mysql.version>
       <pageHelper.starter.version>1.2.5</pageHelper.starter.version>
       <durid.starter.version>1.1.10</durid.starter.version>
       <swagger.version>2.7.0</swagger.version>
       <student.varsion>1.0-SNAPSHOT</student.varsion>
   </properties>

   <!-- 3 锁定版本-->
   <dependencyManagement>
       <dependencies>
           <!-- sprig cloud -->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>${spring-cloud-release.version}</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
           <!-- mybatis启动器 -->
           <dependency>
               <groupId>org.mybatis.spring.boot</groupId>
               <artifactId>mybatis-spring-boot-starter</artifactId>
               <version>${mybatis.starter.version}</version>
           </dependency>
           <!-- 通用Mapper启动器 -->
           <dependency>
               <groupId>tk.mybatis</groupId>
               <artifactId>mapper-spring-boot-starter</artifactId>
               <version>${mapper.starter.version}</version>
           </dependency>
           <!-- 分页助手启动器 -->
           <dependency>
               <groupId>com.github.pagehelper</groupId>
               <artifactId>pagehelper-spring-boot-starter</artifactId>
               <version>${pageHelper.starter.version}</version>
           </dependency>
           <!-- mysql驱动 -->
           <dependency>
               <groupId>mysql</groupId>
               <artifactId>mysql-connector-java</artifactId>
               <version>${mysql.version}</version>
           </dependency>
           <!-- Druid连接池 -->
           <dependency>
               <groupId>com.alibaba</groupId>
               <artifactId>druid-spring-boot-starter</artifactId>
               <version>${durid.starter.version}</version>
           </dependency>
           <!--swagger2-->
           <dependency>
               <groupId>io.springfox</groupId>
               <artifactId>springfox-swagger2</artifactId>
               <version>${swagger.version}</version>
           </dependency>
           <dependency>
               <groupId>io.springfox</groupId>
               <artifactId>springfox-swagger-ui</artifactId>
               <version>${swagger.version}</version>
           </dependency>
       </dependencies>
   </dependencyManagement>

3.2.2 注册中心:
•创建项目:day43-student-eureka

•修改pom.xml文件

     <dependencies>
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

•添加yml文件

端口号

server:
 port: 10086

服务名称

spring:
 application:
   name: day43-student-eureka

eureka的配置

eureka:
  client:
    service-url:
      defaultZone: http://localhost:${server.port}/eureka/  # 注册中心的地址
    register-with-eureka: false       # 是否注册自己的信息到注册中心,默认是true
    fetch-registry: false             # 是否拉取其它服务的信息,默认是true

•编写启动类

package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;



@SpringBootApplication
@EnableEurekaServer     // 开启eureka注册中心服务
public class Day43EurekaApplication {
   public static void main(String[] args) {
       SpringApplication.run(Day43EurekaApplication.class, args);
   }
}

3.2.3 网关服务:
•创建项目:day43-student-zuul

•修改pom.xml

 <dependencies>
        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!--添加eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

•添加yml

服务端口号

server:
 port: 10010

服务名

spring:
  application:
    name: zuul
eureka:
  client:
    service-url: #注册中心位置
      defaultZone: http://localhost:10086/eureka/
  instance: #web页面显示效果和访问路径
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true

•创建启动类

 package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;


@SpringBootApplication
@EnableZuulProxy        //开启网关zuul
@EnableEurekaClient     //开启eureka客户端
public class Day43ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(Day43ZuulApplication.class,args);
    }
}

3.2.4 domain项目:
•创建项目:day43-student-domain

•修改pom.xml


 <dependencies>
        <!--jpa : @Table、@Id、@Column -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
        </dependency>
        <!--lombok @Data-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--jackson @JSONFormat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>


    </dependencies>

3.2.5 班级服务:
•创建项目:day43-student-service-classes

•修改pom.xml文件

 <dependencies>

        <!--自定义domain项目-->
        <dependency>
            <groupId>com.czxy.cloud</groupId>
            <artifactId>day43-student-domain</artifactId>
        </dependency>

        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--spring boot监控(可选)-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
        </dependency>
        <!-- 分页助手启动器 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
    </dependencies>

•添加yml文件

#端口号
server:
 port: 9010
#服务名
spring:
 application:
   name: classes-service
 datasource:
   driverClassName: com.mysql.jdbc.Driver
   url: jdbc:mysql://127.0.0.1:3306/day43_classes?useUnicode=true&characterEncoding=utf8
   username: root
   password: 1234
   druid:    #druid 连接池配置
     initial-size: 1       #初始化连接池大小
     min-idle: 1           #最小连接数
     max-active: 20        #最大连接数
     test-on-borrow: true  #获取连接时候验证,会影响性能
#注册中心相关配置
eureka:
 client:
   service-url: #注册中心位置
     defaultZone: http://localhost:10086/eureka/
 instance: #web页面显示效果和访问路径
   instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
   prefer-ip-address: true
#开启log4j打印SQL语句
logging:
 level:
   com:
     czxy:
       mapper: debug

•启动类

 package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient     //开启eureka客户端
public class Day43ClassesApplication {
    public static void main(String[] args) {
        SpringApplication.run(Day43ClassesApplication.class,args);
    }
}

3.2.6 学生服务:
•创建项目:day43-student-service-student

•修改pom.xml文件 (与班级pom相同)

 <dependencies>

        <!--自定义domain项目-->
        <dependency>
            <groupId>com.czxy.cloud</groupId>
            <artifactId>day43-student-domain</artifactId>
        </dependency>

        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--spring boot监控(可选)-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
        </dependency>
        <!-- 分页助手启动器 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
    </dependencies>

•添加yml文件

 #端口号
server:
  port: 9020
#服务名
spring:
  application:
    name: student-service
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/day43_student?useUnicode=true&characterEncoding=utf8
    username: root
    password: 1234
    druid:    #druid 连接池配置
      initial-size: 1       #初始化连接池大小
      min-idle: 1           #最小连接数
      max-active: 20        #最大连接数
      test-on-borrow: true  #获取连接时候验证,会影响性能
#注册中心相关配置
eureka:
  client:
    service-url: #注册中心位置
      defaultZone: http://localhost:10086/eureka/
  instance: #web页面显示效果和访问路径
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true
#开启log4j打印SQL语句
logging:
  level:
    com:
      czxy:
        mapper: debug

•启动类

 package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@SpringBootApplication
@EnableEurekaClient     //开启eureka客户端
public class Day43StudentApplication {
    public static void main(String[] args) {
        SpringApplication.run(Day43StudentApplication.class,args);
    }
}
  1. 后端实现
    4.1 班级操作
    4.1.1 通用:domain项目
    •复制vo

•编写JavaBean:Classes

package com.czxy.domain;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;


@Table(name="tb_class")
@Data
public class Classes {
   @Id
   @Column(name="c_id")
   private String cid;

   @Column(name="c_name")
   private String cname;

   @Column(name="`desc`")
   private String desc;
}

4.1.2 后端实现


 package com.czxy.mapper;

import com.czxy.domain.Classes;
import tk.mybatis.mapper.common.Mapper;


@org.apache.ibatis.annotations.Mapper
public interface ClassesMapper extends Mapper<Classes> {
}
•Service
package com.czxy.service;

import com.czxy.domain.Classes;
import com.czxy.mapper.ClassesMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;


@Service
@Transactional
public class ClassesService {

   @Resource
   private ClassesMapper classesMapper;


   /**
    * 查询所有
    * @return
    */
   public List<Classes> findAll() {
       List<Classes> list = classesMapper.selectAll();
       return list;
   }


   /**
    * 查询详情
    * @param classId
    * @return
    */
   public Classes findById(String classId){
       Classes classes = classesMapper.selectByPrimaryKey(classId);
       return classes;
   }

}

•Controller

 package com.czxy.controller;

import com.czxy.domain.Classes;
import com.czxy.service.ClassesService;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/classes")
public class ClassesController {

    @Resource
    private ClassesService classesService;

    /**
     * 查询所有
     * @return
     */
    @GetMapping
    public BaseResult findAll(){
        // 查询
        List<Classes> list = classesService.findAll();
        // 返回
        return BaseResult.ok("查询成功", list );
    }



    /**
     * 查询详情
     * @param classId
     * @return
     */
    @GetMapping("/{id}")
    public BaseResult<Classes> findById(@PathVariable("id") String classId ){
        // 查询
        Classes classes = classesService.findById(classId);

        if(classes != null) {
            // 返回
            return BaseResult.ok("查询成功", classes);
        } else {
            return BaseResult.error("查询失败");
        }
    }


}

4.1.3 测试

http://localhost:9010/swagger-ui.html
http://localhost:10010/classes-service/swagger-ui.html

4.2 学生操作
4.2.1 通用:domain项目

package com.czxy.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Table(name="tb_student")
@Data
public class Student {

    @Id
    @Column(name="s_id")
    private String sid;         //学生ID

    @Column(name="sname")
    private String sname;         //姓名

    @Column(name="age")
    private Integer age;         //年龄

    @Column(name="birthday")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;         //生日

    @Column(name="gender")
    private String gender;      //性别

    @Column(name="c_id")
    private String cid;         //班级外键

    @Column(name="city_ids")
    private String cityIds;    //城市

    private Classes classes;    //班级对象

//    @Transient
//    private Integer courseCount;        //选课数
//
//    private List<Course> courseList = new ArrayList<>();    //选课详情
//
//    private List<String> courseIds = new ArrayList();


}

4.2.2 整合Feign
•修改pom,添加feign

  <!-- feign 远程调用 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

•修改启动类,开启feign

 package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;


@SpringBootApplication
@EnableEurekaClient     //开启eureka客户端
@EnableFeignClients     // 开启feign 远程调用
public class Day43StudentApplication {
    public static void main(String[] args) {
        SpringApplication.run(Day43StudentApplication.class,args);
    }
}
 

4.2.3 后端实现

•拷贝 config

•StudentVo,当前项目自定义封装数据

 package com.czxy.vo;

import lombok.Data;

`
@Data
public class StudentVo {
    private String cid;     //班级
    private String sname;       //姓名
    private String startAge;    //开始年龄
    private String endAge;      //结束年龄


}
•编写ClassesFeign,进行远程调用
 package com.czxy.feign;

import com.czxy.domain.Classes;
import com.czxy.vo.BaseResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;


@FeignClient(value = "classes-service" , path = "/classes")
public interface ClassesFeign {

    /**
     * 查询详情
     * @param classId
     * @return
     */
    @GetMapping("/{id}")
    public BaseResult<Classes> findById(@PathVariable("id") String classId );
}

•编写StudentMapper,进行数据库操作

 package com.czxy.mapper;

import com.czxy.domain.Student;
import tk.mybatis.mapper.common.Mapper;


@org.apache.ibatis.annotations.Mapper
public interface StudentMapper extends Mapper<Student> {

}

•编写StudentService,需要使用ClassesFeign进行远程调用

 package com.czxy.service;

import com.czxy.domain.Classes;
import com.czxy.domain.Student;
import com.czxy.feign.ClassesFeign;
import com.czxy.mapper.StudentMapper;
import com.czxy.vo.BaseResult;
import com.czxy.vo.StudentVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;


@Service
@Transactional
public class StudentService {

    @Resource
    private StudentMapper studentMapper;

    @Resource
    private ClassesFeign classesFeign;


    /**
     * 查询所有 + 分页
     * @return
     */
    public PageInfo<Student> findAllByCondition(StudentVo studentVo, Integer pageSize, Integer pageNum){
        // 拼凑条件
        Example example = new Example(Student.class);
        Example.Criteria criteria = example.createCriteria();
        if(studentVo != null){
            //等值查询
            if(studentVo.getCid() != null && !"".equals(studentVo.getCid())) {
                criteria.andEqualTo("cid",studentVo.getCid());
            }
            // 模糊查询
            if(studentVo.getSname() != null && !"".equals(studentVo.getSname())) {
                criteria.andLike("sname","%"+studentVo.getSname()+"%");
            }
            // 区间查询
            if(studentVo.getStartAge() != null && !"".equals(studentVo.getStartAge())){
                criteria.andGreaterThanOrEqualTo("age",studentVo.getStartAge());
            }
            if(studentVo.getEndAge() != null && !"".equals(studentVo.getEndAge())) {
                criteria.andLessThanOrEqualTo("age",studentVo.getEndAge());
            }
        }

        // 分页
        PageHelper.startPage(pageNum,pageSize);

        // 条件查询
        List<Student> list = studentMapper.selectByExample(example);

        // 关联查询
        for(Student student : list){
            // 查询班级外键对应的对象
            BaseResult<Classes> baseResult = classesFeign.findById(student.getCid());
            Classes classes = baseResult.getData();
            student.setClasses(classes);


        }

        // 分页封装
        PageInfo pageInfo = new PageInfo(list);
        return pageInfo;
    }



}

•编写StudentController,完成功能

 package com.czxy.controller;

import com.czxy.domain.Student;
import com.czxy.service.StudentService;
import com.czxy.vo.BaseResult;
import com.czxy.vo.StudentVo;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/student")
public class StudentController {

    @Resource
    private StudentService studentService;

    /**
     * 条件查询
     * @param studentVo
     * @return
     */
    @PostMapping("/condition/{pagesize}/{pagenum}")
    public BaseResult conditioin(@RequestBody StudentVo studentVo, @PathVariable("pagesize") Integer pagesize , @PathVariable("pagenum") Integer pagenum){
        // 添加
        PageInfo<Student> pageInfo = studentService.findAllByCondition(studentVo,pagesize,pagenum);
        // 返回
        return BaseResult.ok("查询成功", pageInfo);
    }



}
  1. 前端实现
    5.1 修改项
    •步骤一:修改main.js,访问入门网关10010

•步骤二:所有的请求,必须添加服务名前缀

•步骤三:访问时,存在跨域问题。需要修改网关添加跨域配置

5.1 参考代码

<template>
  <div>
    <!-- 添加按钮 -->
    <el-button type="primary" @click="$message.success('添加成功')">添加</el-button>

    <!-- 条件start -->
    <el-form :inline="true" :model="studentVo" size="mini" class="demo-form-inline">
      <el-form-item label="班级">
        <el-select v-model="studentVo.cid" @change="condition(1)" placeholder="请选择班级">
          <el-option label="--请选择--" value=""></el-option>
          <el-option v-for="(classes,index) in classesList" :key="index" :label="classes.cname" :value="classes.cid"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="姓名">
        <el-input v-model="studentVo.sname" placeholder="请输入姓名"></el-input>
      </el-form-item>
      <el-form-item label="年龄">
        <el-col :span="11">
          <el-input v-model="studentVo.startAge" placeholder="请输入开始年龄"></el-input>
        </el-col>
        <el-col class="line" :span="2">-</el-col>
        <el-col :span="11">
          <el-input v-model="studentVo.endAge" placeholder="请输入结束年龄"></el-input>
        </el-col>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="condition(1)">查询</el-button>
      </el-form-item>
    </el-form>
    <!-- 条件end -->

    <!-- 列表start -->
    <el-table
      :data="pageInfo.list"
      border
      style="width: 100%" @selection-change="handleSelectionChange">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        prop="sid"
        fixed
        label="学生ID"
        width="120">
      </el-table-column>
      <el-table-column
        prop="classes.cname"
        fixed
        label="班级名称"
        width="120">
      </el-table-column>
      <el-table-column
        prop="sname"
        label="学生姓名"
        width="120">
      </el-table-column>
      <el-table-column
        prop="age"
        label="年龄"
        width="120">
      </el-table-column>
      <el-table-column
        prop="birthday"
        label="生日"
        width="120">
      </el-table-column>
      <el-table-column
        prop="gender"
        label="性别"
        width="120">
        <template slot-scope="scope">
          {{scope.row.gender == 1 ? '男' : '女'}}
        </template>
      </el-table-column>
      <el-table-column
        prop="courseCount"
        label="选课数"
        width="120">
      </el-table-column>
      <el-table-column
        label="选课详情"
        width="300">
        <template slot-scope="scope">
          <el-tag type="success"
            v-for="(course,index) in scope.row.courseList" :key="index"
            closable
            @close="handleClose(course.cid)">
            {{course.cname}}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column
        prop="cityIds"
        label="城市"
        width="120">
      </el-table-column>
      <el-table-column
        label="操作"
        fixed="right"
        width="150">
        <template slot-scope="scope">
          <!-- @click="handleEdit(scope.$index, scope.row)" -->
          <el-button size="mini" @click="$message.success('修改成功')" >编辑</el-button>
          <el-button size="mini" type="danger" @click="$message.success('删除成功')" >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 列表end -->

    <!-- 批量删除start -->
    <el-button type="primary" @click="$message.success('批量删除成功')">批量删除</el-button>
    <!-- 批量删除end -->

        <!-- 分页条 start -->
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="pageInfo.pageNum"
      :page-sizes="[1, 2, 3, 5,10]"
      :page-size="pageInfo.pageSize"
      layout="total, sizes, prev, pager, next, jumper"
      :total="pageInfo.total">
    </el-pagination>
    <!-- 分页条 end -->



  </div>
</template>

<script>
export default {
  data() {
    return {
      studentVo: {  // 条件查询

      },
      pageInfo: {   //分页信息
        pageSize: 2,    //每页个数
        pageNum: 1      //第几页(当前页)
      },
      classesList: [],          //查询所有班级
      pageNum: 1,         //第几页
      studentVo: {        //条件查询
        cid: ''
      }
    }
  },
  methods: {
    async condition(pageNum) {
      // 如果设置pageNum表示指定跳转页面,如果没有设置表示跳转当前页
      if(pageNum){
        this.pageInfo.pageNum = pageNum
      }
      // 发送ajax
      let { data } = await this.$http.post(`/student-service/student/condition/${this.pageInfo.pageSize}/${this.pageInfo.pageNum}`,this.studentVo)
      // 处理结果
      if(data.code == 1) {
        // 成功
        this.pageInfo = data.data
      } else {
        // 失败
        this.$message.error(data.message)
      }
    },
    handleSizeChange(val) {   // 改变每页个数,从第一页查询
      console.log(`每页 ${val} 条`);
      this.pageInfo.pageSize = val
      // this.pageInfo.pageNum = 1
      this.condition()
    },
    handleCurrentChange(val) {  //改变当前页
      console.log(`当前页: ${val}`);
      this.pageInfo.pageNum = val
      this.condition()
    },
    async findAllClasses() {
      // ajax查询
      let { data } = await this.$http.get('/classes-service/classes')
      // 处理
      if(data.code == 1) {
        // 存储数据
        this.classesList = data.data
      } else {
        // 错误
        this.$message.error(data.message)
      }
    },
    handleSelectionChange(val) {
      this.multipleSelection = val;
    }
  },
  mounted() {
    // 查询所有的学生
    this.condition()
    // 查询所有的班级
    this.findAllClasses()
  },
}
</script>

<style>
  .line {
    text-align: center;
  }
  .el-tag + .el-tag {
    margin-left: 10px;
  }
</style>

标签:服务,spring,SpringCloud,boot,springframework,互联网,import,org,com
来源: https://blog.csdn.net/qq_48469418/article/details/117673279

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有