1.回顾:Spring Cloud
•Eureka和众多服务执行流程
- 网关 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
- 学生查询所有
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);
}
}
- 后端实现
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);
}
}
- 前端实现
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>