中软杯国内航班查询与机票预定系统1

112 阅读4分钟

日期:2022年6月10日

正文


完成基本功能要求——在给定日期、航班号或给定日期、出发地、目的地两种组合模式下的航班查询,查询结果中至少应当包含航班的起降时间、剩余座位数、票价

上一个月完成了后台接口的所有,这个月开始写前台小程序的接口,首先完成基本功能中的多条件组合查询,这个很简单,转化成sql语句就是“select {想要查询的字段} from {表名} where {条件1} and {条件2} and ....”

思路理清,目标明确之后下面是

具体实现步骤

1.通过easy-code插件连接数据库表,然后生成对应的Mybatis-plus的代码

之前发过easy-code的基本使用方法,不懂得可以查看我之前的博客:www.yuque.com/u22371353/i…

完成之后会生成如下目录及文件

2.手动配置pom文件以及application.properties文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>service</artifactId>
        <groupId>com.domestic</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-flight</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
    </dependencies>


</project>
# 服务端口
server.port=8001
# 服务名
spring.application.name=service-flight

# 环境设置:dev,test,prod
spring.profiles.active=dev

# mysql数据库连接
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/highestplane?serverTimezone=GMT%2B8
#spring.datasource.username=root
#spring.datasource.password=root

# 配置多数据源
# 指定默认主数据源
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/highestplane?serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
# 指定副数据源
spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://localhost:3306/highestplane?serverTimezone=GMT%2B8
spring.datasource.dynamic.datasource.slave_1.username=root
spring.datasource.dynamic.datasource.slave_1.password=root

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=redis
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
#最小空闲

#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# 返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3.修改controller中生成的代码

由于easy-code只会生成简单的增删该查代码,所以需要我们对第一个按条件查询所有的代码稍作修改即可实现

这个是默认easy-code生成的按条件查询所有的代码

    @GetMapping("findAll")
    public R selectAll(Page<Flight> page, Flight flight) {

        return success(this.flightService.page(page, new QueryWrapper<>(flight)));
    }

稍作修改:这里的select是我们新自定义的方法,一开始会报红,alt+enter创建service目录下的接口方法即可

    //日期+起飞城市+目的地城市查询
    @GetMapping("select")
    public R select(Flight flight) {

        List<Flight> list = flightService.select(flight);

        return success(list);
    }

这里的select是我们新自定义的方法,一开始会报红,alt+enter创建service目录下的接口方法即可

下图是创建好的接口方法

只有接口没有实现类同样会报错,在impl目录下中的对应实现类重写接口方法

注意:具体的逻辑代码就是在这里实现的

package com.domestic.flightservice.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.domestic.commonutils.MD5;
import com.domestic.flightservice.dao.FlightDao;
import com.domestic.flightservice.entity.Flight;
import com.domestic.flightservice.service.FlightService;
import com.domestic.servicebase.exceptionhandler.FlightException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.sql.Date;
import java.time.LocalTime;
import java.util.List;

/**
 * 航班信息(Flight)表服务实现类
 *
 * @author makejava
 * @since 2022-06-10 10:09:36
 */
@Service("flightService")
public class FlightServiceImpl extends ServiceImpl<FlightDao, Flight> implements FlightService {

    //日期+起飞城市+目的地城市查询
    @Override
    public List<Flight> select(Flight flight) {
        Date flightDate = flight.getFlightDate();
        String startPlace = flight.getStartPlace();
        String endPlace = flight.getEndPlace();
        Integer lowestPrice = flight.getLowestPrice();
        String startTime = flight.getStartTime();
        String flightDuration = flight.getFlightDuration();
        //用户输入非空判断
        if (StringUtils.isEmpty(flightDate)
                || StringUtils.isEmpty(startPlace)
                || StringUtils.isEmpty(endPlace)){

            throw new FlightException(-1,"请输入完整的查询信息!");
        }

        QueryWrapper<Flight> wrapper = new QueryWrapper<>();
        wrapper.eq("flight_date",flightDate);
        wrapper.eq("start_place",startPlace);
        wrapper.eq("end_place",endPlace);

        if (!StringUtils.isEmpty(lowestPrice)){ //前端价格传值则升序排列
        wrapper.orderByAsc("lowest_price");
        }
        if (!StringUtils.isEmpty(flightDuration)){ //前端飞行时长传值则升序排列
            wrapper.orderByAsc("flight_duration");
        }
        if (!StringUtils.isEmpty(startTime)){ //前端起飞时间传值则升序排列
            wrapper.orderByAsc("start_time");
        }
        //根据条件做查询
        List<Flight> date_list = baseMapper.selectList(wrapper);

        //查询数据库中是否有值
        if(date_list.isEmpty()) {
            throw new FlightException(-1,"暂无航班!");
        }
        return date_list;
    }

}

4.手动写FlightApplication启动类

package com.domestic.flightservice;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableDiscoveryClient  //nacos注册
@ComponentScan(basePackages = {"com.domestic"}) //包扫描注解扫描配置的swagger
public class FlightApplication {
    public static void main(String[] args) {

        SpringApplication.run(FlightApplication.class,args);
    }
}

5.这时候有一个坑,直接启动会报错

错误原因:这个错误就是mapper接口没有实现类

解决方案:加入@MapperScan注解

收获:我这里是加在了自定义的config类中,这里可以配置一些所需要的插件信息以及像MapperScan等的包扫描注解

package com.domestic.flightservice.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
//import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@MapperScan("com.domestic.flightservice.dao")
public class FlightConfig {

    /**
     * 逻辑删除插件
     */
/*
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
*/

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    /**
     * 性能分析插件
     */
    @Bean
    @Profile({"dev","test"})    //设置dev和test环境开启,保证我们的效率
    public PerformanceInterceptor performanceInterceptor() {

        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(100); //设置sql执行的最大时间,超过时间不执行 单位毫秒(ms)
        performanceInterceptor.setFormat(true);//是否开启输出格式化支持
        return performanceInterceptor;
    }
}

6.启动FlightApplication测试easy-code给我们生成的基本的MP增删改查代码

swagger输入查询条件

总结


今天完成了基本功能要求的一项,现在回想起来有easy-code工具的加持下感觉并不难,这也是我第一次完整的写出controller+service+impl,这是我对spring-cloud的项目的目录结构有了更清楚地认识,唯一一个回想起来花费我很长时间的就是哪个mapperscan的注解,因为之前的做的小demo根本不会用到config配置类,甚至连结果都是在控制台输出的,我是比葫芦画瓢的看老师的实战项目视频才解决的这个问题,这个算是一个值得注意的难点;重点还是在impl中写的逻辑代码,这个是要你结合你的数据库以及想要实现的结果来自行编写的,需要很清晰的目的,以及较为完善的数据库设计,数据库设计不好会影响到后续一系列的代码。