From 1af860b3e9a46e76a57faa4937567df06d2f69f9 Mon Sep 17 00:00:00 2001 From: Sheyu-yao Date: Tue, 20 Feb 2024 19:44:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 38 ++++ .idea/.gitignore | 8 + .idea/encodings.xml | 18 ++ .idea/misc.xml | 14 ++ .idea/uiDesigner.xml | 124 ++++++++++++ .idea/vcs.xml | 6 + common/pom.xml | 177 ++++++++++++++++++ .../com/ysy/common/config/ElasticClient.java | 29 +++ .../ysy/common/config/ErrorMessageConfig.java | 45 +++++ .../ysy/common/config/MybatisPlusConfig.java | 30 +++ .../common/config/RabbitPublisherConfig.java | 57 ++++++ .../ysy/common/contant/ResultConstants.java | 10 + .../ysy/common/contant/TokenConstants.java | 9 + .../com/ysy/common/domain/po/Company.java | 22 +++ .../com/ysy/common/domain/po/Destination.java | 23 +++ .../java/com/ysy/common/domain/po/Module.java | 23 +++ .../java/com/ysy/common/domain/po/Order.java | 33 ++++ .../com/ysy/common/domain/po/Passenger.java | 24 +++ .../java/com/ysy/common/domain/po/Plane.java | 48 +++++ .../java/com/ysy/common/domain/po/User.java | 22 +++ .../ysy/common/domain/result/PageResult.java | 30 +++ .../java/com/ysy/common/domain/result/R.java | 81 ++++++++ .../com/ysy/common/domain/result/Result.java | 84 +++++++++ .../com/ysy/common/domain/vo/PassengerVO.java | 18 ++ .../com/ysy/common/domain/vo/PlaneVO.java | 26 +++ .../java/com/ysy/common/domain/vo/UserVO.java | 18 ++ .../exception/GlobalExceptionHandler.java | 26 +++ .../ysy/common/remote/PlaneServiceRemote.java | 14 ++ .../ysy/common/remote/UserServiceRemote.java | 13 ++ .../common/utils/gateway/GatewayUtils.java | 74 ++++++++ .../com/ysy/common/utils/jwt/JwtUtil.java | 37 ++++ .../ysy/common/utils/jwt/SecurityUtils.java | 55 ++++++ .../ysy/common/utils/tools/StringUtils.java | 68 +++++++ ...ot.autoconfigure.AutoConfiguration.imports | 5 + gateway/pom.xml | 45 +++++ .../com/ysy/gateway/GatewayApplication.java | 11 ++ .../ysy/gateway/config/AuthProperties.java | 17 ++ .../ysy/gateway/filter/UserGlobalFilter.java | 72 +++++++ gateway/src/main/resources/bootstrap.yml | 34 ++++ order-service/pom.xml | 41 ++++ .../ysy/order/OrderServiceApplication.java | 13 ++ .../ysy/order/controller/OrderController.java | 130 +++++++++++++ .../com/ysy/order/mapper/OrderMapper.java | 9 + .../com/ysy/order/service/OrderService.java | 7 + .../order/service/impl/OrderServiceImpl.java | 12 ++ order-service/src/main/resources/banner.txt | 9 + .../src/main/resources/bootstrap.yml | 45 +++++ plane-service/pom.xml | 41 ++++ .../ysy/plane/PlaneServiceApplication.java | 72 +++++++ .../ysy/plane/controller/PlaneController.java | 61 ++++++ .../com/ysy/plane/mapper/CompanyMapper.java | 9 + .../ysy/plane/mapper/DestinationMapper.java | 9 + .../com/ysy/plane/mapper/ModuleMapper.java | 9 + .../com/ysy/plane/mapper/PlaneMapper.java | 9 + .../com/ysy/plane/service/PlaneService.java | 13 ++ .../plane/service/impl/PlaneServiceImpl.java | 151 +++++++++++++++ plane-service/src/main/resources/banner.txt | 9 + .../src/main/resources/bootstrap.yml | 42 +++++ pom.xml | 58 ++++++ user-service/pom.xml | 41 ++++ .../com/ysy/user/UserServiceApplication.java | 12 ++ .../ysy/user/controller/UserController.java | 60 ++++++ .../com/ysy/user/mapper/PassengerMapper.java | 9 + .../java/com/ysy/user/mapper/UserMapper.java | 9 + .../com/ysy/user/service/UserService.java | 17 ++ .../user/service/impl/UserServiceImpl.java | 74 ++++++++ user-service/src/main/resources/banner.txt | 9 + user-service/src/main/resources/bootstrap.yml | 42 +++++ 68 files changed, 2510 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 common/pom.xml create mode 100644 common/src/main/java/com/ysy/common/config/ElasticClient.java create mode 100644 common/src/main/java/com/ysy/common/config/ErrorMessageConfig.java create mode 100644 common/src/main/java/com/ysy/common/config/MybatisPlusConfig.java create mode 100644 common/src/main/java/com/ysy/common/config/RabbitPublisherConfig.java create mode 100644 common/src/main/java/com/ysy/common/contant/ResultConstants.java create mode 100644 common/src/main/java/com/ysy/common/contant/TokenConstants.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/Company.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/Destination.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/Module.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/Order.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/Passenger.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/Plane.java create mode 100644 common/src/main/java/com/ysy/common/domain/po/User.java create mode 100644 common/src/main/java/com/ysy/common/domain/result/PageResult.java create mode 100644 common/src/main/java/com/ysy/common/domain/result/R.java create mode 100644 common/src/main/java/com/ysy/common/domain/result/Result.java create mode 100644 common/src/main/java/com/ysy/common/domain/vo/PassengerVO.java create mode 100644 common/src/main/java/com/ysy/common/domain/vo/PlaneVO.java create mode 100644 common/src/main/java/com/ysy/common/domain/vo/UserVO.java create mode 100644 common/src/main/java/com/ysy/common/exception/GlobalExceptionHandler.java create mode 100644 common/src/main/java/com/ysy/common/remote/PlaneServiceRemote.java create mode 100644 common/src/main/java/com/ysy/common/remote/UserServiceRemote.java create mode 100644 common/src/main/java/com/ysy/common/utils/gateway/GatewayUtils.java create mode 100644 common/src/main/java/com/ysy/common/utils/jwt/JwtUtil.java create mode 100644 common/src/main/java/com/ysy/common/utils/jwt/SecurityUtils.java create mode 100644 common/src/main/java/com/ysy/common/utils/tools/StringUtils.java create mode 100644 common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 gateway/pom.xml create mode 100644 gateway/src/main/java/com/ysy/gateway/GatewayApplication.java create mode 100644 gateway/src/main/java/com/ysy/gateway/config/AuthProperties.java create mode 100644 gateway/src/main/java/com/ysy/gateway/filter/UserGlobalFilter.java create mode 100644 gateway/src/main/resources/bootstrap.yml create mode 100644 order-service/pom.xml create mode 100644 order-service/src/main/java/com/ysy/order/OrderServiceApplication.java create mode 100644 order-service/src/main/java/com/ysy/order/controller/OrderController.java create mode 100644 order-service/src/main/java/com/ysy/order/mapper/OrderMapper.java create mode 100644 order-service/src/main/java/com/ysy/order/service/OrderService.java create mode 100644 order-service/src/main/java/com/ysy/order/service/impl/OrderServiceImpl.java create mode 100644 order-service/src/main/resources/banner.txt create mode 100644 order-service/src/main/resources/bootstrap.yml create mode 100644 plane-service/pom.xml create mode 100644 plane-service/src/main/java/com/ysy/plane/PlaneServiceApplication.java create mode 100644 plane-service/src/main/java/com/ysy/plane/controller/PlaneController.java create mode 100644 plane-service/src/main/java/com/ysy/plane/mapper/CompanyMapper.java create mode 100644 plane-service/src/main/java/com/ysy/plane/mapper/DestinationMapper.java create mode 100644 plane-service/src/main/java/com/ysy/plane/mapper/ModuleMapper.java create mode 100644 plane-service/src/main/java/com/ysy/plane/mapper/PlaneMapper.java create mode 100644 plane-service/src/main/java/com/ysy/plane/service/PlaneService.java create mode 100644 plane-service/src/main/java/com/ysy/plane/service/impl/PlaneServiceImpl.java create mode 100644 plane-service/src/main/resources/banner.txt create mode 100644 plane-service/src/main/resources/bootstrap.yml create mode 100644 pom.xml create mode 100644 user-service/pom.xml create mode 100644 user-service/src/main/java/com/ysy/user/UserServiceApplication.java create mode 100644 user-service/src/main/java/com/ysy/user/controller/UserController.java create mode 100644 user-service/src/main/java/com/ysy/user/mapper/PassengerMapper.java create mode 100644 user-service/src/main/java/com/ysy/user/mapper/UserMapper.java create mode 100644 user-service/src/main/java/com/ysy/user/service/UserService.java create mode 100644 user-service/src/main/java/com/ysy/user/service/impl/UserServiceImpl.java create mode 100644 user-service/src/main/resources/banner.txt create mode 100644 user-service/src/main/resources/bootstrap.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..7d27483 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..82dbec8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..ccd9104 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,177 @@ + + + 4.0.0 + + com.ysy + senior_grade5_month + 1.0-SNAPSHOT + + + common + + + 17 + 17 + UTF-8 + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + + io.github.openfeign + feign-httpclient + + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + co.elastic.clients + elasticsearch-java + 8.11.1 + + + + + com.fasterxml.jackson.core + jackson-databind + 2.12.3 + + + + + com.auth0 + java-jwt + 4.4.0 + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.mysql + mysql-connector-j + runtime + + + + + com.alibaba + druid-spring-boot-starter + 1.2.20 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.2 + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.4.1 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.42 + + + + + org.apache.commons + commons-lang3 + + + + + cn.hutool + hutool-all + 5.8.20 + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + \ No newline at end of file diff --git a/common/src/main/java/com/ysy/common/config/ElasticClient.java b/common/src/main/java/com/ysy/common/config/ElasticClient.java new file mode 100644 index 0000000..a9430ba --- /dev/null +++ b/common/src/main/java/com/ysy/common/config/ElasticClient.java @@ -0,0 +1,29 @@ +package com.ysy.common.config; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.transport.rest_client.RestClientTransport; +import lombok.Data; +import org.apache.http.HttpHost; +import org.elasticsearch.client.RestClient; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "elasticsearch") +@Data +public class ElasticClient { + private String protocol; + + private String host; + + private Integer port; + + @Bean + public ElasticsearchClient getElasticsearchClient() { + RestClient restclient = RestClient.builder(new HttpHost(host, port, protocol)).build(); + RestClientTransport transport = new RestClientTransport(restclient, new JacksonJsonpMapper()); + return new ElasticsearchClient(transport); + } +} diff --git a/common/src/main/java/com/ysy/common/config/ErrorMessageConfig.java b/common/src/main/java/com/ysy/common/config/ErrorMessageConfig.java new file mode 100644 index 0000000..4b1db62 --- /dev/null +++ b/common/src/main/java/com/ysy/common/config/ErrorMessageConfig.java @@ -0,0 +1,45 @@ +package com.ysy.common.config; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.rabbit.retry.MessageRecoverer; +import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnProperty(name = "spring.rabbitmq.listener.simple.retry.enabled", havingValue = "true") +public class ErrorMessageConfig { + @Bean + public DirectExchange errorMessageExchange(){ + return new DirectExchange("error.direct"); + } + @Bean + public Queue errorQueue(){ + return new Queue("error.queue", true); + } + @Bean + public Binding errorBinding(Queue errorQueue, DirectExchange errorMessageExchange){ + return BindingBuilder.bind(errorQueue).to(errorMessageExchange).with("error"); + } + + @Bean + public MessageRecoverer republishMessageRecoverer(RabbitTemplate rabbitTemplate){ + return new RepublishMessageRecoverer(rabbitTemplate, "error.direct", "error"); + } + + /** + * 替换默认JDK序列化,org.springframework.amqp.support.converter.MessageConverter + * @return 用json格式替代默认格式 + */ + @Bean + public MessageConverter jsonConverter() { + return new Jackson2JsonMessageConverter(); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/ysy/common/config/MybatisPlusConfig.java b/common/src/main/java/com/ysy/common/config/MybatisPlusConfig.java new file mode 100644 index 0000000..2cb54bb --- /dev/null +++ b/common/src/main/java/com/ysy/common/config/MybatisPlusConfig.java @@ -0,0 +1,30 @@ +package com.ysy.common.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author DongZl + * @description: Mybatis-Plus配置 + * @Date 2024-1-10 下午 05:12 + */ +@Configuration +public class MybatisPlusConfig { + + public MybatisPlusConfig () { + System.out.println("初始化-----------"); + } + + /** + * 添加分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/common/src/main/java/com/ysy/common/config/RabbitPublisherConfig.java b/common/src/main/java/com/ysy/common/config/RabbitPublisherConfig.java new file mode 100644 index 0000000..868076d --- /dev/null +++ b/common/src/main/java/com/ysy/common/config/RabbitPublisherConfig.java @@ -0,0 +1,57 @@ +package com.ysy.common.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Slf4j +@Configuration +public class RabbitPublisherConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback { + @Autowired + private RabbitTemplate rabbitTemplate; + + @PostConstruct + public void init() { + //设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数 + rabbitTemplate.setMandatory(true); + rabbitTemplate.setConfirmCallback(this); + rabbitTemplate.setReturnsCallback(this); + } + + /** + * confirm回调,(前提: 确认模式开启:publisher-confirm-type: correlated) + * CorrelationData数据可以在rabbitTemplate.convertAndSend时传入,并这种CorrelationData的setId参数,回调时能取到 + * @param correlationData 相关数据,可以在发送消息时,进行设置该参数 + * @param ack 结果 + * @param cause 原因 + */ + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + if (ack) { + log.info("【ConfirmCallback】消息已经送达Exchange,ack已发"); + } else { + log.warn("【ConfirmCallback】消息没有送达Exchange"); + // todo 做一些处理,让消息再次发送。 消息缓存或入库,邮件提醒运维 + } + } + + /** + * return函数,(前提:退回模式开启:yml中publisher-returns: true) + * @param returned 返回的信息 + */ + @Override + public void returnedMessage(ReturnedMessage returned) { + log.debug("收到消息的return callback,exchange:{}, key:{}, msg:{}, code:{}, text:{}", + returned.getExchange(), returned.getRoutingKey(), returned.getMessage(), + returned.getReplyCode(), returned.getReplyText()); + // todo 处理 邮件发送,缓存或存到数据库 + } +} diff --git a/common/src/main/java/com/ysy/common/contant/ResultConstants.java b/common/src/main/java/com/ysy/common/contant/ResultConstants.java new file mode 100644 index 0000000..3c23aa6 --- /dev/null +++ b/common/src/main/java/com/ysy/common/contant/ResultConstants.java @@ -0,0 +1,10 @@ +package com.ysy.common.contant; + +public class ResultConstants { + public final static int SUCCESS_CODE = 200; + public final static int FAIL_CODE = 300; + public final static int ERROR_CODE = 500; + public final static String SUCCESS_MSG = "success"; + public final static String FAIL_MSG = "fail"; + public final static String ERROR_MSG = "error"; +} diff --git a/common/src/main/java/com/ysy/common/contant/TokenConstants.java b/common/src/main/java/com/ysy/common/contant/TokenConstants.java new file mode 100644 index 0000000..eb50791 --- /dev/null +++ b/common/src/main/java/com/ysy/common/contant/TokenConstants.java @@ -0,0 +1,9 @@ +package com.ysy.common.contant; + +public class TokenConstants { + public final static String TOKEN = "token"; + public final static String TOKEN_LOGIN = "tokenLogin"; + public final static String TOKEN_KEY = "tokenKey"; + public final static String USER_ID = "userId"; + public final static String USER_NAME = "username"; +} diff --git a/common/src/main/java/com/ysy/common/domain/po/Company.java b/common/src/main/java/com/ysy/common/domain/po/Company.java new file mode 100644 index 0000000..519afae --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/Company.java @@ -0,0 +1,22 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_company") +public class Company { + @TableId(value = "cid", type = IdType.AUTO) + private Long cid; + @TableField("company_name") + private String companyName; +} \ No newline at end of file diff --git a/common/src/main/java/com/ysy/common/domain/po/Destination.java b/common/src/main/java/com/ysy/common/domain/po/Destination.java new file mode 100644 index 0000000..5a07675 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/Destination.java @@ -0,0 +1,23 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_destination") +public class Destination { + @TableId(value = "did", type = IdType.AUTO) + private Long did; + @TableField("destination_name") + private String destinationName; + private Long pid; +} diff --git a/common/src/main/java/com/ysy/common/domain/po/Module.java b/common/src/main/java/com/ysy/common/domain/po/Module.java new file mode 100644 index 0000000..2baa12b --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/Module.java @@ -0,0 +1,23 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_module") +public class Module { + @TableId(value = "mid", type = IdType.AUTO) + private Long mid; + @TableField("module_name") + private String moduleName; + private Long cid; +} diff --git a/common/src/main/java/com/ysy/common/domain/po/Order.java b/common/src/main/java/com/ysy/common/domain/po/Order.java new file mode 100644 index 0000000..e9562c8 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/Order.java @@ -0,0 +1,33 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_order") +public class Order { + @TableId(value = "oid", type = IdType.AUTO) + private Long oid; + private Long pid; + @TableField("passenger_id") + private Long passengerId; + @TableField("take_price") + private Integer takePrice; + private Integer rate; + private Boolean state; + private Long uid; + + @TableField(exist = false) + private Plane plane; + @TableField(exist = false) + private Passenger passenger; +} diff --git a/common/src/main/java/com/ysy/common/domain/po/Passenger.java b/common/src/main/java/com/ysy/common/domain/po/Passenger.java new file mode 100644 index 0000000..f9dd6f3 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/Passenger.java @@ -0,0 +1,24 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_passenger") +public class Passenger { + @TableId(value = "pid", type = IdType.AUTO) + private Long pid; + @TableField("passenger_name") + private String passengerName; + private String id; + private Long uid; +} \ No newline at end of file diff --git a/common/src/main/java/com/ysy/common/domain/po/Plane.java b/common/src/main/java/com/ysy/common/domain/po/Plane.java new file mode 100644 index 0000000..74e3ee8 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/Plane.java @@ -0,0 +1,48 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_plane") +public class Plane { + @TableId(value = "pid", type = IdType.AUTO) + private Long pid; + @TableField("plane_num") + private String planeNum; + private Long sid; + private Long eid; + private Long mid; + private Long cid; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("start_time") + private Date startTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("end_time") + private Date endTime; + private Integer price; + + @TableField(exist = false) + private String startPlace; + @TableField(exist = false) + private String endPlace; + @TableField(exist = false) + private String moduleName; + @TableField(exist = false) + private String companyName; +} \ No newline at end of file diff --git a/common/src/main/java/com/ysy/common/domain/po/User.java b/common/src/main/java/com/ysy/common/domain/po/User.java new file mode 100644 index 0000000..1a86094 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/po/User.java @@ -0,0 +1,22 @@ +package com.ysy.common.domain.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@TableName("t_user") +public class User { + @TableId(value = "uid", type = IdType.AUTO) + private Long uid; + private String username; + private String password; + private Boolean role; +} diff --git a/common/src/main/java/com/ysy/common/domain/result/PageResult.java b/common/src/main/java/com/ysy/common/domain/result/PageResult.java new file mode 100644 index 0000000..2c961ad --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/result/PageResult.java @@ -0,0 +1,30 @@ +package com.ysy.common.domain.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class PageResult implements Serializable { + + private long total; + + private List list; + + public PageResult() { + } + + public PageResult(long total, List list) { + this.total = total; + this.list = list; + } + + public static PageResult toPageResult(long total, List list){ + return new PageResult(total , list); + } + + public static Result> toResult(long total, List list){ + return Result.success(PageResult.toPageResult(total, list)); + } +} diff --git a/common/src/main/java/com/ysy/common/domain/result/R.java b/common/src/main/java/com/ysy/common/domain/result/R.java new file mode 100644 index 0000000..9d11039 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/result/R.java @@ -0,0 +1,81 @@ +package com.ysy.common.domain.result; + +import com.ysy.common.contant.ResultConstants; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.HashMap; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class R { + private final static int SUCCESS_CODE = ResultConstants.SUCCESS_CODE; + + private final static int FAIL_CODE = ResultConstants.FAIL_CODE; + + private final static int ERROR_CODE = ResultConstants.ERROR_CODE; + + private final static String SUCCESS_MSG = ResultConstants.SUCCESS_MSG; + + private final static String FAIL_MSG = ResultConstants.FAIL_MSG; + + private final static String ERROR_MSG = ResultConstants.ERROR_MSG; + + private Integer code; + private String msg; + private Map data; + + public R(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public R(Integer code, String msg, String key, Object value) { + this.code = code; + this.msg = msg; + this.data = new HashMap<>(); + this.data.put(key, value); + } + + //成功结果集 + public static R success() { + return new R(SUCCESS_CODE, SUCCESS_MSG); + } + + public static R success(String msg) { + return new R(SUCCESS_CODE, msg); + } + + public static R success(Map data) { + return new R(SUCCESS_CODE, SUCCESS_MSG, data); + } + + public static R success(String key, Object value) { + return new R(SUCCESS_CODE, SUCCESS_MSG, key, value); + } + + public static R success(String msg, String key, Object value) { + return new R(SUCCESS_CODE, msg, key, value); + } + + //失败结果集 + public static R fail() { + return new R(FAIL_CODE, FAIL_MSG); + } + + public static R fail(String msg) { + return new R(FAIL_CODE, msg); + } + + //错误结果集 + public static R error() { + return new R(ERROR_CODE, ERROR_MSG); + } + + public static R error(String msg) { + return new R(ERROR_CODE, msg); + } +} diff --git a/common/src/main/java/com/ysy/common/domain/result/Result.java b/common/src/main/java/com/ysy/common/domain/result/Result.java new file mode 100644 index 0000000..2e47a01 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/result/Result.java @@ -0,0 +1,84 @@ +package com.ysy.common.domain.result; + +import com.ysy.common.contant.ResultConstants; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class Result implements Serializable { + private static final long serialVersionUID = 1L; + + public static final int SUCCESS = ResultConstants.SUCCESS_CODE; + + public static final int FAIL = ResultConstants.FAIL_CODE; + + public static final int ERROR = ResultConstants.ERROR_CODE; + + public static final String SUCCESS_MSG = ResultConstants.SUCCESS_MSG; + + public static final String FAIL_MSG = ResultConstants.FAIL_MSG; + + public static final String ERROR_MSG = ResultConstants.ERROR_MSG; + + //field + private int code; + private String msg; + private T data; + + public static Result success() { + return restResult(SUCCESS, SUCCESS_MSG, null); + } + + public static Result success(String msg) { + return restResult(SUCCESS, msg, null); + } + + public static Result success(T data) { + return restResult(SUCCESS, SUCCESS_MSG, data); + } + + public static Result success(String msg, T data) { + return restResult(SUCCESS, msg, data); + } + + public static Result fail() { + return restResult(FAIL, FAIL_MSG, null); + } + + public static Result fail(String msg) { + return restResult(FAIL, msg, null); + } + + public static Result error() { + return restResult(ERROR, ERROR_MSG, null); + } + + public static Result error(String msg) { + return restResult(ERROR, msg, null); + } + + private static Result restResult(int code, String msg, T data) { + Result apiResult = new Result<>(); + apiResult.setCode(code); + apiResult.setMsg(msg); + apiResult.setData(data); + return apiResult; + } + + /** + * 成功 + * @return 成功:true + */ + public boolean isSuccess(){ + return this.code == SUCCESS; + } + + /** + * 失败 + * @return 失败:false + */ + public boolean isError(){ + return !isSuccess(); + } +} diff --git a/common/src/main/java/com/ysy/common/domain/vo/PassengerVO.java b/common/src/main/java/com/ysy/common/domain/vo/PassengerVO.java new file mode 100644 index 0000000..c53a3e5 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/vo/PassengerVO.java @@ -0,0 +1,18 @@ +package com.ysy.common.domain.vo; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PassengerVO { + @NotBlank(message = "用户名不能为空") + private String passengerName; + @NotBlank(message = "身份证不能为空") + private String id; +} diff --git a/common/src/main/java/com/ysy/common/domain/vo/PlaneVO.java b/common/src/main/java/com/ysy/common/domain/vo/PlaneVO.java new file mode 100644 index 0000000..a40bc0f --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/vo/PlaneVO.java @@ -0,0 +1,26 @@ +package com.ysy.common.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PlaneVO { + private String company; + private String startPlace; + private String endPlace; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + private Integer pageNum = 1; + private Integer pageSize = 3; +} diff --git a/common/src/main/java/com/ysy/common/domain/vo/UserVO.java b/common/src/main/java/com/ysy/common/domain/vo/UserVO.java new file mode 100644 index 0000000..8f206d7 --- /dev/null +++ b/common/src/main/java/com/ysy/common/domain/vo/UserVO.java @@ -0,0 +1,18 @@ +package com.ysy.common.domain.vo; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserVO { + @NotBlank(message = "用户名不能为空") + private String username; + @NotBlank(message = "密码不能为空") + private String password; +} diff --git a/common/src/main/java/com/ysy/common/exception/GlobalExceptionHandler.java b/common/src/main/java/com/ysy/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..0057280 --- /dev/null +++ b/common/src/main/java/com/ysy/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,26 @@ +package com.ysy.common.exception; + +import com.alibaba.fastjson2.JSON; +import com.ysy.common.domain.result.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +@Configuration +@Slf4j +public class GlobalExceptionHandler { + @ExceptionHandler(IllegalArgumentException.class) + public R illegalArgumentExceptionHandler(IllegalArgumentException e) { + log.error("服务端报错:[{}]", e.getMessage(), e.getLocalizedMessage(), e); + return R.fail(e.getMessage()); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public R methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { + log.error("服务端报错:[{}]", e.getMessage(), e.getLocalizedMessage(), e); + return R.fail(e.getMessage()); + } +} diff --git a/common/src/main/java/com/ysy/common/remote/PlaneServiceRemote.java b/common/src/main/java/com/ysy/common/remote/PlaneServiceRemote.java new file mode 100644 index 0000000..31c025a --- /dev/null +++ b/common/src/main/java/com/ysy/common/remote/PlaneServiceRemote.java @@ -0,0 +1,14 @@ +package com.ysy.common.remote; + +import com.ysy.common.domain.po.Passenger; +import com.ysy.common.domain.po.Plane; +import com.ysy.common.domain.result.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(value = "planeService", path = "plane") +public interface PlaneServiceRemote { + @GetMapping("/{id}") + public Result byId(@PathVariable Long id); +} diff --git a/common/src/main/java/com/ysy/common/remote/UserServiceRemote.java b/common/src/main/java/com/ysy/common/remote/UserServiceRemote.java new file mode 100644 index 0000000..89fa7cb --- /dev/null +++ b/common/src/main/java/com/ysy/common/remote/UserServiceRemote.java @@ -0,0 +1,13 @@ +package com.ysy.common.remote; + +import com.ysy.common.domain.po.Passenger; +import com.ysy.common.domain.result.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(value = "userService", path = "user") +public interface UserServiceRemote { + @GetMapping("/passenger/{id}") + public Result passengerById(@PathVariable Long id); +} diff --git a/common/src/main/java/com/ysy/common/utils/gateway/GatewayUtils.java b/common/src/main/java/com/ysy/common/utils/gateway/GatewayUtils.java new file mode 100644 index 0000000..0e20a1e --- /dev/null +++ b/common/src/main/java/com/ysy/common/utils/gateway/GatewayUtils.java @@ -0,0 +1,74 @@ +package com.ysy.common.utils.gateway; + + +import com.alibaba.fastjson2.JSONObject; +import com.ysy.common.domain.result.Result; +import com.ysy.common.utils.tools.StringUtils; +import lombok.extern.log4j.Log4j2; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * @author DongZl + * @description: 网关处理工具类 + */ +@Log4j2 +public class GatewayUtils { + /** + * 添加请求头参数 + * @param mutate 修改对象 + * @param key 键 + * @param value 值 + */ + public static void addHeader(ServerHttpRequest.Builder mutate, String key, Object value) { + if (StringUtils.isEmpty(key)){ + log.warn("添加请求头参数键不可以为空"); + return; + } + if (value == null) { + log.warn("添加请求头参数:[{}]值为空",key); + return; + } + String valueStr = value.toString(); + mutate.header(key, valueStr); + log.info("添加请求头参数成功 - 键:[{}] , 值:[{}]", key , value); + } + /** + * 删除请求头参数 + * @param mutate 修改对象 + * @param key 键 + */ + public static void removeHeader(ServerHttpRequest.Builder mutate, String key) { + if (StringUtils.isEmpty(key)){ + log.warn("删除请求头参数键不可以为空"); + return; + } + mutate.headers(httpHeaders -> httpHeaders.remove(key)).build(); + log.info("删除请求头参数 - 键:[{}]",key); + } + /** + * 错误结果响应 + * @param exchange 响应上下文 + * @param msg 响应消息 + * @return + */ + public static Mono errorResponse(ServerWebExchange exchange, String msg) { + ServerHttpResponse response = exchange.getResponse(); + //设置HTTP响应头状态 + response.setStatusCode(HttpStatus.OK); + //设置HTTP响应头文本格式 + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json"); + //定义响应内容 + Result result = Result.error(msg); + String resultJson = JSONObject.toJSONString(result); + log.error("[鉴权异常处理]请求路径:[{}],异常信息:[{}],响应结果:[{}]", exchange.getRequest().getPath(), msg, resultJson); + DataBuffer dataBuffer = response.bufferFactory().wrap(resultJson.getBytes()); + //进行响应 + return response.writeWith(Mono.just(dataBuffer)); + } + } diff --git a/common/src/main/java/com/ysy/common/utils/jwt/JwtUtil.java b/common/src/main/java/com/ysy/common/utils/jwt/JwtUtil.java new file mode 100644 index 0000000..05fa5d1 --- /dev/null +++ b/common/src/main/java/com/ysy/common/utils/jwt/JwtUtil.java @@ -0,0 +1,37 @@ +package com.ysy.common.utils.jwt; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; + +import java.util.Date; +import java.util.Map; + +public class JwtUtil { + private final static Date EXPIRE_TIME = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24L); + private final static String SECRET = "qwertyuiopasdfghjkl"; + private final static String CLAIM_NAME = "claim_name"; + + public static String createToken(Map claim) { + String token = JWT.create() + .withClaim(CLAIM_NAME, claim) + //.withExpiresAt(EXPIRE_TIME) + .sign(Algorithm.HMAC256(SECRET)); + return token; + } + + public static DecodedJWT decodedJWT(String token) { + JWTVerifier build = JWT.require(Algorithm.HMAC256(SECRET)) + .build(); + DecodedJWT decodedJWT = build.verify(token); + return decodedJWT; + } + + public static Claim getClaim(String token) { + DecodedJWT decodedJWT = decodedJWT(token); + Map claims = decodedJWT.getClaims(); + return claims.get(CLAIM_NAME); + } +} diff --git a/common/src/main/java/com/ysy/common/utils/jwt/SecurityUtils.java b/common/src/main/java/com/ysy/common/utils/jwt/SecurityUtils.java new file mode 100644 index 0000000..9299f9e --- /dev/null +++ b/common/src/main/java/com/ysy/common/utils/jwt/SecurityUtils.java @@ -0,0 +1,55 @@ +package com.ysy.common.utils.jwt; + + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +/** + * 安全服务工具类 + * + * @author ruoyi + */ +public class SecurityUtils { + + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * + * @return 加密字符串 + */ + public static String encryptPassword (String password, String salt) { + return encryptMD5(password, salt); + } + + /** + * 判断密码是否相同 + * + * @param password 真实密码 + * @param encodedPassword 加密后字符 + * + * @return 结果 + */ + public static boolean matchesPassword (String password, String salt, String encodedPassword) { + return encryptMD5(password, salt).equals(encodedPassword); + } + + /** + * 计算字符串的MD5加密值,并返回Base64编码的字符串。 + * @param password 要加密的字符串 + * @return 加密后的Base64编码字符串 + */ + public static String encryptMD5(String password, String salt) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update((password + salt).getBytes()); // 加盐处理 + byte[] digest = md.digest(); + String encodeToString = Base64.getEncoder().encodeToString(digest); + return encodeToString; + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } +} diff --git a/common/src/main/java/com/ysy/common/utils/tools/StringUtils.java b/common/src/main/java/com/ysy/common/utils/tools/StringUtils.java new file mode 100644 index 0000000..8191f3a --- /dev/null +++ b/common/src/main/java/com/ysy/common/utils/tools/StringUtils.java @@ -0,0 +1,68 @@ +package com.ysy.common.utils.tools; + +import org.springframework.util.AntPathMatcher; + +import java.util.Collection; +import java.util.List; + +/** + * @author DongZl + * @description: 字符串处理工具类 + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } +} diff --git a/common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..aeaca47 --- /dev/null +++ b/common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,5 @@ +com.ysy.common.config.ElasticClient +com.ysy.common.config.ErrorMessageConfig +com.ysy.common.config.MybatisPlusConfig +com.ysy.common.config.RabbitPublisherConfig +com.ysy.common.exception.GlobalExceptionHandler diff --git a/gateway/pom.xml b/gateway/pom.xml new file mode 100644 index 0000000..44ed6f8 --- /dev/null +++ b/gateway/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.ysy + senior_grade5_month + 1.0-SNAPSHOT + + + gateway + + + 17 + 17 + UTF-8 + + + + + com.ysy + common + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + + org.projectlombok + lombok + true + + + \ No newline at end of file diff --git a/gateway/src/main/java/com/ysy/gateway/GatewayApplication.java b/gateway/src/main/java/com/ysy/gateway/GatewayApplication.java new file mode 100644 index 0000000..68099d2 --- /dev/null +++ b/gateway/src/main/java/com/ysy/gateway/GatewayApplication.java @@ -0,0 +1,11 @@ +package com.ysy.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GatewayApplication { + public static void main(String[] args) { + SpringApplication.run(GatewayApplication.class, args); + } +} \ No newline at end of file diff --git a/gateway/src/main/java/com/ysy/gateway/config/AuthProperties.java b/gateway/src/main/java/com/ysy/gateway/config/AuthProperties.java new file mode 100644 index 0000000..1ac9d72 --- /dev/null +++ b/gateway/src/main/java/com/ysy/gateway/config/AuthProperties.java @@ -0,0 +1,17 @@ +package com.ysy.gateway.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Data +@ConfigurationProperties(prefix = "auth") +@Component +@RefreshScope +public class AuthProperties { + private List excludePaths; + private List includePaths; +} diff --git a/gateway/src/main/java/com/ysy/gateway/filter/UserGlobalFilter.java b/gateway/src/main/java/com/ysy/gateway/filter/UserGlobalFilter.java new file mode 100644 index 0000000..4e26804 --- /dev/null +++ b/gateway/src/main/java/com/ysy/gateway/filter/UserGlobalFilter.java @@ -0,0 +1,72 @@ +package com.ysy.gateway.filter; + +import com.auth0.jwt.interfaces.Claim; +import com.ysy.common.utils.gateway.GatewayUtils; +import com.ysy.common.utils.jwt.JwtUtil; +import com.ysy.common.utils.tools.StringUtils; +import com.ysy.gateway.config.AuthProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.annotation.Order; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.RequestPath; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +@Component +@Order(1) +@Slf4j +public class UserGlobalFilter implements GlobalFilter { + @Autowired + private AuthProperties authProperties; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + String path = request.getPath().toString(); + HttpMethod method = request.getMethod(); + log.info("请求方式:{},请求路径:{}", path, method); + + boolean matches = StringUtils.matches(path, authProperties.getExcludePaths()); + + if (matches) { + return chain.filter(exchange); + } + + String token = request.getHeaders().getFirst("token"); + if (StringUtils.isNull(token)) { + return GatewayUtils.errorResponse(exchange, "请先登录"); + } + + Claim claim = null; + try { + claim = JwtUtil.getClaim(token); + } catch (Exception e) { + return GatewayUtils.errorResponse(exchange, "非法参数,请重新登录"); + } + + if (Boolean.FALSE.equals(stringRedisTemplate.hasKey(token))) { + return GatewayUtils.errorResponse(exchange, "会话已过期,请重新登录"); + } + + Object uid = claim.asMap().get("uid"); + String username = (String) claim.asMap().get("username"); + Object role = claim.asMap().get("role"); + + ServerHttpRequest.Builder mutate = request.mutate(); + GatewayUtils.addHeader(mutate, "uid", uid); + GatewayUtils.addHeader(mutate, "username", username); + GatewayUtils.addHeader(mutate, "role", role); + + GatewayUtils.removeHeader(mutate, "token"); + return chain.filter(exchange); + } +} diff --git a/gateway/src/main/resources/bootstrap.yml b/gateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..c690db4 --- /dev/null +++ b/gateway/src/main/resources/bootstrap.yml @@ -0,0 +1,34 @@ +server: + port: 10010 +spring: + application: + #服务名称 + name: gateway + profiles: + #配置文件生效环境 + active: dev + + cloud: + nacos: + #nacos服务器地址 + server-addr: http://124.70.132.13:8848 + #nacos服务发现配置 + discovery: + #nacos服务注册命名空间ID,默认为public + namespace: 2e6a4975-46b3-4035-b77d-92b05ae48a66 + #nacos配置文件配置 + config: + #指定读取命名空间配置,默认为public + namespace: ${spring.cloud.nacos.discovery.namespace} + #nacos配置文件类型 + file-extension: yaml + #共享配置 + shared-configs: + - data-id: common-redis.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + - data-id: common.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + diff --git a/order-service/pom.xml b/order-service/pom.xml new file mode 100644 index 0000000..be092c4 --- /dev/null +++ b/order-service/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + com.ysy + senior_grade5_month + 1.0-SNAPSHOT + + + order-service + + + 17 + 17 + UTF-8 + + + + + + com.ysy + common + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/order-service/src/main/java/com/ysy/order/OrderServiceApplication.java b/order-service/src/main/java/com/ysy/order/OrderServiceApplication.java new file mode 100644 index 0000000..a54b327 --- /dev/null +++ b/order-service/src/main/java/com/ysy/order/OrderServiceApplication.java @@ -0,0 +1,13 @@ +package com.ysy.order; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableFeignClients(basePackages = "com.ysy.common.remote") +public class OrderServiceApplication { + public static void main(String[] args) { + SpringApplication.run(OrderServiceApplication.class, args); + } +} \ No newline at end of file diff --git a/order-service/src/main/java/com/ysy/order/controller/OrderController.java b/order-service/src/main/java/com/ysy/order/controller/OrderController.java new file mode 100644 index 0000000..4f4785b --- /dev/null +++ b/order-service/src/main/java/com/ysy/order/controller/OrderController.java @@ -0,0 +1,130 @@ +package com.ysy.order.controller; + +import com.alibaba.nacos.shaded.com.google.protobuf.Message; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ysy.common.domain.po.Order; +import com.ysy.common.domain.po.Passenger; +import com.ysy.common.domain.po.Plane; +import com.ysy.common.domain.result.Result; +import com.ysy.common.remote.PlaneServiceRemote; +import com.ysy.common.remote.UserServiceRemote; +import com.ysy.order.service.OrderService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/order") +@Slf4j +public class OrderController { + @Autowired + private OrderService orderService; + + @Autowired + private HttpServletRequest request; + + @Autowired + private UserServiceRemote userServiceRemote; + + @Autowired + private PlaneServiceRemote planeServiceRemote; + + @Autowired + private RabbitTemplate rabbitTemplate; + + @GetMapping("/list") + public Result> list() { + String role = request.getHeader("role"); + if (role.equals("true")) { + List orderList = orderService.list(new LambdaQueryWrapper() + .eq(Order::getState, false) + ); + orderList.forEach(order -> { + order.setPassenger(userServiceRemote + .passengerById(order.getPassengerId()) + .getData() + ); + order.setPlane(planeServiceRemote + .byId(order.getPid()) + .getData() + ); + }); + return Result.success(orderList); + } + + Long uid = Long.valueOf(request.getHeader("uid")); + List orderList = orderService.list(new LambdaQueryWrapper() + .eq(Order::getUid, uid) + .eq(Order::getState, false) + ); + orderList.forEach(order -> { + order.setPassenger(userServiceRemote + .passengerById(order.getPassengerId()) + .getData() + ); + order.setPlane(planeServiceRemote + .byId(order.getPid()) + .getData() + ); + }); + return Result.success(orderList); + } + + @PostMapping("/add") + public Result addByOrder(@RequestBody Order order) { + String username = request.getHeader("username"); + Passenger passenger = userServiceRemote.passengerById(order.getPassengerId()).getData(); + Order build = Order.builder() + .pid(order.getPlane().getPid()) + .rate(order.getRate()) + .state(false) + .takePrice(order.getTakePrice()) + .passengerId(passenger.getPid()) + .uid(passenger.getUid()) + .build(); + orderService.save(build); + + rabbitTemplate.convertAndSend("simple.exchange", + "msg","恭喜用户:" + username + ",预定机票成功"); + return Result.success("添加订单成功"); + } + + @GetMapping("/refund/{id}") + public Result refundById(@PathVariable String id) { + Order order = orderService.getById(id); + Plane plane = planeServiceRemote.byId(order.getPid()).getData(); + long now = System.currentTimeMillis(); + long endTime = plane.getEndTime().getTime(); + //起飞前一周 + if (endTime - now >= 7 * 24 * 1000 * 60 * 60L) { + return Result.success((int) ((order.getTakePrice() - 50) * 0.4) + 50); + } + //起飞大于两天 + if (endTime - now >= 48 * 1000 * 60 * 60L) { + return Result.success((int) ((order.getTakePrice() - 50) * 0.6) + 50); + } + //起飞大于两小时 + if (endTime - now >= 4 * 1000 * 60 * 60L) { + return Result.success((int) ((order.getTakePrice() - 50) * 0.9)); + } + return Result.success(order.getTakePrice() - 50); + } + + @GetMapping("/confirm/{id}") + public Result confirmById(@PathVariable String id) { + Order order = orderService.getById(id); + order.setState(true); + orderService.updateById(order); + return Result.success("退票成功"); + } + + @RabbitListener(queues = "simple") + public void getMessage(String msg) { + log.info("消费消息成功:" + msg); + } +} diff --git a/order-service/src/main/java/com/ysy/order/mapper/OrderMapper.java b/order-service/src/main/java/com/ysy/order/mapper/OrderMapper.java new file mode 100644 index 0000000..8d7b4cb --- /dev/null +++ b/order-service/src/main/java/com/ysy/order/mapper/OrderMapper.java @@ -0,0 +1,9 @@ +package com.ysy.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.Order; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OrderMapper extends BaseMapper { +} diff --git a/order-service/src/main/java/com/ysy/order/service/OrderService.java b/order-service/src/main/java/com/ysy/order/service/OrderService.java new file mode 100644 index 0000000..c449c9b --- /dev/null +++ b/order-service/src/main/java/com/ysy/order/service/OrderService.java @@ -0,0 +1,7 @@ +package com.ysy.order.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ysy.common.domain.po.Order; + +public interface OrderService extends IService { +} diff --git a/order-service/src/main/java/com/ysy/order/service/impl/OrderServiceImpl.java b/order-service/src/main/java/com/ysy/order/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..96492d0 --- /dev/null +++ b/order-service/src/main/java/com/ysy/order/service/impl/OrderServiceImpl.java @@ -0,0 +1,12 @@ +package com.ysy.order.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ysy.common.domain.po.Order; +import com.ysy.order.mapper.OrderMapper; +import com.ysy.order.service.OrderService; +import org.springframework.stereotype.Service; + +@Service +public class OrderServiceImpl extends ServiceImpl + implements OrderService { +} diff --git a/order-service/src/main/resources/banner.txt b/order-service/src/main/resources/banner.txt new file mode 100644 index 0000000..9a830ab --- /dev/null +++ b/order-service/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + ██ ██ ████████ ██ ██ +░░██ ██ ██░░░░░░ ░░██ ██ + ░░████ ░██ ░░████ + ░░██ ░█████████ ░░██ + ░██ ░░░░░░░░██ ░██ + ░██ ░██ ░██ + ░██ ████████ ░██ + ░░ ░░░░░░░░ ░░ +:: ysy boot :: version 1.0 \ No newline at end of file diff --git a/order-service/src/main/resources/bootstrap.yml b/order-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a89fb2d --- /dev/null +++ b/order-service/src/main/resources/bootstrap.yml @@ -0,0 +1,45 @@ +server: + #服务端口 + port: 10003 + +spring: + application: + #服务名称 + name: orderService + profiles: + #配置文件生效环境 + active: dev + + cloud: + nacos: + #nacos服务器地址 + server-addr: http://124.70.132.13:8848 + #nacos服务发现配置 + discovery: + #nacos服务注册命名空间ID,默认为public + namespace: 2e6a4975-46b3-4035-b77d-92b05ae48a66 + #cluster-name: SH #服务集群设置 + config: + #指定读取命名空间配置,默认为public + namespace: ${spring.cloud.nacos.discovery.namespace} + #nacos配置文件类型 + file-extension: yaml + #共享配置 + shared-configs: + - data-id: common.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-mysql.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-redis.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-rabbitmq.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + diff --git a/plane-service/pom.xml b/plane-service/pom.xml new file mode 100644 index 0000000..28c28da --- /dev/null +++ b/plane-service/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + com.ysy + senior_grade5_month + 1.0-SNAPSHOT + + + plane-service + + + 17 + 17 + UTF-8 + + + + + + com.ysy + common + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/plane-service/src/main/java/com/ysy/plane/PlaneServiceApplication.java b/plane-service/src/main/java/com/ysy/plane/PlaneServiceApplication.java new file mode 100644 index 0000000..3a0b2de --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/PlaneServiceApplication.java @@ -0,0 +1,72 @@ +package com.ysy.plane; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch.core.BulkResponse; +import co.elastic.clients.elasticsearch.core.bulk.BulkOperation; +import com.alibaba.fastjson2.JSON; +import com.ysy.common.domain.po.Company; +import com.ysy.common.domain.po.Module; +import com.ysy.common.domain.po.Plane; +import com.ysy.plane.mapper.CompanyMapper; +import com.ysy.plane.mapper.DestinationMapper; +import com.ysy.plane.mapper.ModuleMapper; +import com.ysy.plane.mapper.PlaneMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@SpringBootApplication +@EnableScheduling +public class PlaneServiceApplication { + public static void main(String[] args) { + SpringApplication.run(PlaneServiceApplication.class, args); + } + @Autowired + private CompanyMapper companyMapper; + + @Autowired + private ModuleMapper moduleMapper; + + @Autowired + private PlaneMapper planeMapper; + + @Autowired + private DestinationMapper destinationMapper; + + @Autowired + private ElasticsearchClient elasticsearchClient; + + /** + * 在spring启动时,将航空公司和飞机型号列表存入redis,飞机列表es全量同步 + */ + @Scheduled(cron = "*/10 * * * * ?") + public void run() { + List planeList = planeMapper.selectList(null); + planeList.forEach(plane -> { + plane.setStartPlace(destinationMapper.selectById(plane.getSid()).getDestinationName()); + plane.setEndPlace(destinationMapper.selectById(plane.getEid()).getDestinationName()); + plane.setModuleName(moduleMapper.selectById(plane.getMid()).getModuleName()); + plane.setCompanyName(companyMapper.selectById(plane.getCid()).getCompanyName()); + }); + + ArrayList bulkOperations = new ArrayList<>(); + planeList.forEach(plane -> { + bulkOperations.add(BulkOperation.of(b -> b.index(i -> i.id(String.valueOf(plane.getPid())).document(plane)))); + }); + + try { + BulkResponse bulkResponse = elasticsearchClient.bulk(b -> b.operations(bulkOperations).index("plane")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/plane-service/src/main/java/com/ysy/plane/controller/PlaneController.java b/plane-service/src/main/java/com/ysy/plane/controller/PlaneController.java new file mode 100644 index 0000000..7829bc0 --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/controller/PlaneController.java @@ -0,0 +1,61 @@ +package com.ysy.plane.controller; + +import com.alibaba.fastjson2.JSON; +import com.ysy.common.domain.po.Company; +import com.ysy.common.domain.po.Module; +import com.ysy.common.domain.po.Plane; +import com.ysy.common.domain.result.PageResult; +import com.ysy.common.domain.result.Result; +import com.ysy.common.domain.vo.PlaneVO; +import com.ysy.plane.mapper.CompanyMapper; +import com.ysy.plane.mapper.ModuleMapper; +import com.ysy.plane.service.PlaneService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/plane") +public class PlaneController { + @Autowired + private PlaneService planeService; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Autowired + private CompanyMapper companyMapper; + + @Autowired + private ModuleMapper moduleMapper; + + @PostMapping("/list") + public Result> list(@RequestBody PlaneVO planeVO) { + return planeService.getPlaneListByPlaneVO(planeVO); + } + + @GetMapping("/{id}") + public Result byId(@PathVariable Long id) { + Plane plane = planeService.getPlaneById(id); + return Result.success(plane); + } + + @PostMapping("/add") + public Result add() { + return Result.success("添加成功"); + } + + @GetMapping("/company/list") + public Result> companyList() { + List companyList = companyMapper.selectList(null); + return Result.success(companyList); + } + + @GetMapping("/module/list") + public Result> moduleList() { + List moduleList = moduleMapper.selectList(null); + return Result.success(moduleList); + } +} diff --git a/plane-service/src/main/java/com/ysy/plane/mapper/CompanyMapper.java b/plane-service/src/main/java/com/ysy/plane/mapper/CompanyMapper.java new file mode 100644 index 0000000..17f5c75 --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/mapper/CompanyMapper.java @@ -0,0 +1,9 @@ +package com.ysy.plane.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.Company; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CompanyMapper extends BaseMapper { +} diff --git a/plane-service/src/main/java/com/ysy/plane/mapper/DestinationMapper.java b/plane-service/src/main/java/com/ysy/plane/mapper/DestinationMapper.java new file mode 100644 index 0000000..66244b1 --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/mapper/DestinationMapper.java @@ -0,0 +1,9 @@ +package com.ysy.plane.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.Destination; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DestinationMapper extends BaseMapper { +} diff --git a/plane-service/src/main/java/com/ysy/plane/mapper/ModuleMapper.java b/plane-service/src/main/java/com/ysy/plane/mapper/ModuleMapper.java new file mode 100644 index 0000000..ae74ab9 --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/mapper/ModuleMapper.java @@ -0,0 +1,9 @@ +package com.ysy.plane.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.Module; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ModuleMapper extends BaseMapper { +} diff --git a/plane-service/src/main/java/com/ysy/plane/mapper/PlaneMapper.java b/plane-service/src/main/java/com/ysy/plane/mapper/PlaneMapper.java new file mode 100644 index 0000000..5f0ca96 --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/mapper/PlaneMapper.java @@ -0,0 +1,9 @@ +package com.ysy.plane.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.Plane; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PlaneMapper extends BaseMapper { +} diff --git a/plane-service/src/main/java/com/ysy/plane/service/PlaneService.java b/plane-service/src/main/java/com/ysy/plane/service/PlaneService.java new file mode 100644 index 0000000..dc0b3bd --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/service/PlaneService.java @@ -0,0 +1,13 @@ +package com.ysy.plane.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ysy.common.domain.po.Plane; +import com.ysy.common.domain.result.PageResult; +import com.ysy.common.domain.result.Result; +import com.ysy.common.domain.vo.PlaneVO; + +public interface PlaneService extends IService { + Result> getPlaneListByPlaneVO(PlaneVO planeVO); + + Plane getPlaneById(Long id); +} diff --git a/plane-service/src/main/java/com/ysy/plane/service/impl/PlaneServiceImpl.java b/plane-service/src/main/java/com/ysy/plane/service/impl/PlaneServiceImpl.java new file mode 100644 index 0000000..c4c63ee --- /dev/null +++ b/plane-service/src/main/java/com/ysy/plane/service/impl/PlaneServiceImpl.java @@ -0,0 +1,151 @@ +package com.ysy.plane.service.impl; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.SortOrder; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.HighlightField; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.json.JsonData; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ysy.common.domain.po.Plane; +import com.ysy.common.domain.result.PageResult; +import com.ysy.common.domain.result.Result; +import com.ysy.common.domain.vo.PlaneVO; +import com.ysy.plane.mapper.PlaneMapper; +import com.ysy.plane.service.PlaneService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class PlaneServiceImpl extends ServiceImpl + implements PlaneService { + @Autowired + private ElasticsearchClient elasticsearchClient; + + @Override + public Result> getPlaneListByPlaneVO(PlaneVO planeVO) { + SearchRequest.Builder searchBuilder = new SearchRequest.Builder().index("plane"); + List queryList = new ArrayList<>(); + Integer from = (planeVO.getPageNum() - 1) * planeVO.getPageSize(); + + //查询航空公司 + if (StringUtils.isNotBlank(planeVO.getCompany())) { + Query query = new Query.Builder() + .match(m -> m + .field("companyName") + .query(planeVO.getCompany()) + ) + .build(); + queryList.add(query); + } + + //查询出发地 + if (StringUtils.isNotBlank(planeVO.getStartPlace())) { + Query query = new Query.Builder() + .match(m -> m + .field("startPlace") + .query(planeVO.getStartPlace()) + ) + .build(); + queryList.add(query); + } + + //查询目的地 + if (StringUtils.isNotBlank(planeVO.getEndPlace())) { + Query query = new Query.Builder() + .match(m -> m + .field("endPlace") + .query(planeVO.getEndPlace()) + ) + .build(); + queryList.add(query); + } + + //查询出发时间 + if (planeVO.getStartTime() != null) { + Query query = new Query.Builder() + .range(m -> m + .field("startTime") + .gte((JsonData) planeVO.getStartTime()) + ) + .build(); + queryList.add(query); + } + + SearchRequest searchRequest = searchBuilder + .query(q -> q + .bool(b -> b + .must(queryList) + ) + ) + .highlight(h -> h + .fields("companyName", HighlightField.of(q -> q.matchedFields("companyName"))) + .preTags("") + .postTags("") + ) + .from(from) + .size(planeVO.getPageSize()) + .sort(s -> s + .field(f -> f + .field("startTime") + .order(SortOrder.Desc) + ) + ) + .build(); + + //获取查询响应对象 + SearchResponse searchResponse = null; + try { + searchResponse = elasticsearchClient.search(searchRequest, Plane.class); + } catch (IOException e) { + throw new RuntimeException(e); + } + + //遍历集合 + List planeList = new ArrayList<>(); + long total = searchResponse.hits().total().value(); + for (Hit hit : searchResponse.hits().hits()) { + Map> highlight = hit.highlight(); + Plane source = hit.source(); + if (!highlight.isEmpty()) { + String companyName = highlight.get("companyName").get(0); + source.setCompanyName(companyName); + } + planeList.add(source); + } + + return PageResult.toResult(total, planeList); + } + + @Override + public Plane getPlaneById(Long id) { + SearchResponse searchResponse = null; + try { + searchResponse = elasticsearchClient + .search(s -> s + .query(q -> q + .match(m -> m + .field("pid") + .query(id) + ) + ) + .index("plane") + , Plane.class + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + + Plane source = searchResponse.hits().hits().get(0).source(); + return source; + } +} diff --git a/plane-service/src/main/resources/banner.txt b/plane-service/src/main/resources/banner.txt new file mode 100644 index 0000000..9a830ab --- /dev/null +++ b/plane-service/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + ██ ██ ████████ ██ ██ +░░██ ██ ██░░░░░░ ░░██ ██ + ░░████ ░██ ░░████ + ░░██ ░█████████ ░░██ + ░██ ░░░░░░░░██ ░██ + ░██ ░██ ░██ + ░██ ████████ ░██ + ░░ ░░░░░░░░ ░░ +:: ysy boot :: version 1.0 \ No newline at end of file diff --git a/plane-service/src/main/resources/bootstrap.yml b/plane-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..238b8b3 --- /dev/null +++ b/plane-service/src/main/resources/bootstrap.yml @@ -0,0 +1,42 @@ +server: + #服务端口 + port: 10002 + +spring: + application: + #服务名称 + name: planeService + profiles: + #配置文件生效环境 + active: dev + + cloud: + nacos: + #nacos服务器地址 + server-addr: http://124.70.132.13:8848 + #nacos服务发现配置 + discovery: + #nacos服务注册命名空间ID,默认为public + namespace: 2e6a4975-46b3-4035-b77d-92b05ae48a66 + #cluster-name: SH #服务集群设置 + config: + #指定读取命名空间配置,默认为public + namespace: ${spring.cloud.nacos.discovery.namespace} + #nacos配置文件类型 + file-extension: yaml + #共享配置 + shared-configs: + - data-id: common.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-mysql.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-redis.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..838bc62 --- /dev/null +++ b/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.ysy + senior_grade5_month + 1.0-SNAPSHOT + pom + + common + gateway + user-service + order-service + plane-service + + + + 17 + 17 + UTF-8 + + + + org.springframework.boot + spring-boot-starter-parent + 3.0.2 + + + + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + 2022.0.0.0-RC2 + pom + import + + + + org.springframework.cloud + spring-cloud-dependencies + 2022.0.0 + pom + import + + + + com.ysy + common + 1.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/user-service/pom.xml b/user-service/pom.xml new file mode 100644 index 0000000..6394a2a --- /dev/null +++ b/user-service/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + com.ysy + senior_grade5_month + 1.0-SNAPSHOT + + + user-service + + + 17 + 17 + UTF-8 + + + + + + com.ysy + common + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/user-service/src/main/java/com/ysy/user/UserServiceApplication.java b/user-service/src/main/java/com/ysy/user/UserServiceApplication.java new file mode 100644 index 0000000..cb556f6 --- /dev/null +++ b/user-service/src/main/java/com/ysy/user/UserServiceApplication.java @@ -0,0 +1,12 @@ +package com.ysy.user; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UserServiceApplication { + public static void main(String[] args) { + SpringApplication.run(UserServiceApplication.class, args); + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/ysy/user/controller/UserController.java b/user-service/src/main/java/com/ysy/user/controller/UserController.java new file mode 100644 index 0000000..4d0d513 --- /dev/null +++ b/user-service/src/main/java/com/ysy/user/controller/UserController.java @@ -0,0 +1,60 @@ +package com.ysy.user.controller; + +import com.ysy.common.domain.po.Passenger; +import com.ysy.common.domain.result.Result; +import com.ysy.common.domain.vo.PassengerVO; +import com.ysy.common.domain.vo.UserVO; +import com.ysy.user.mapper.PassengerMapper; +import com.ysy.user.service.UserService; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/user") +public class UserController { + @Autowired + private UserService userService; + + @Autowired + private PassengerMapper passengerMapper; + + @Autowired + private HttpServletRequest request; + + @PostMapping("/login") + public Result login(@RequestBody @Validated UserVO userVO) { + String token = userService.loginByUserVO(userVO); + return Result.success("登录成功", token); + } + + @GetMapping("/passenger/list") + public Result> passengerList() { + List passengerList = userService.passengerList(); + return Result.success(passengerList); + } + + @GetMapping("/passenger/{id}") + public Result passengerById(@PathVariable Long id) { + Passenger passenger = passengerMapper.selectById(id); + return Result.success(passenger); + } + + @PostMapping("/passenger/add") + public Result passengerAdd(@RequestBody @Validated PassengerVO passengerVO) { + userService.passengerAddByPassengerVO(passengerVO); + return Result.success("添加成功"); + } + + @GetMapping("/check") + public Result check() { + String role = request.getHeader("role"); + if (role.equals("false")) { + return Result.fail("非管理员不能添加"); + } + return Result.success("管理员验证通过"); + } +} diff --git a/user-service/src/main/java/com/ysy/user/mapper/PassengerMapper.java b/user-service/src/main/java/com/ysy/user/mapper/PassengerMapper.java new file mode 100644 index 0000000..70b9f27 --- /dev/null +++ b/user-service/src/main/java/com/ysy/user/mapper/PassengerMapper.java @@ -0,0 +1,9 @@ +package com.ysy.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.Passenger; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PassengerMapper extends BaseMapper { +} diff --git a/user-service/src/main/java/com/ysy/user/mapper/UserMapper.java b/user-service/src/main/java/com/ysy/user/mapper/UserMapper.java new file mode 100644 index 0000000..f007c39 --- /dev/null +++ b/user-service/src/main/java/com/ysy/user/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package com.ysy.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ysy.common.domain.po.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/user-service/src/main/java/com/ysy/user/service/UserService.java b/user-service/src/main/java/com/ysy/user/service/UserService.java new file mode 100644 index 0000000..8bd5f0f --- /dev/null +++ b/user-service/src/main/java/com/ysy/user/service/UserService.java @@ -0,0 +1,17 @@ +package com.ysy.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ysy.common.domain.po.Passenger; +import com.ysy.common.domain.po.User; +import com.ysy.common.domain.vo.PassengerVO; +import com.ysy.common.domain.vo.UserVO; + +import java.util.List; + +public interface UserService extends IService { + String loginByUserVO(UserVO userVO); + + void passengerAddByPassengerVO(PassengerVO passengerVO); + + List passengerList(); +} diff --git a/user-service/src/main/java/com/ysy/user/service/impl/UserServiceImpl.java b/user-service/src/main/java/com/ysy/user/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..54c97b4 --- /dev/null +++ b/user-service/src/main/java/com/ysy/user/service/impl/UserServiceImpl.java @@ -0,0 +1,74 @@ +package com.ysy.user.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ysy.common.domain.po.Passenger; +import com.ysy.common.domain.po.User; +import com.ysy.common.domain.vo.PassengerVO; +import com.ysy.common.domain.vo.UserVO; +import com.ysy.common.utils.jwt.JwtUtil; +import com.ysy.user.mapper.PassengerMapper; +import com.ysy.user.mapper.UserMapper; +import com.ysy.user.service.UserService; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Service +public class UserServiceImpl extends ServiceImpl + implements UserService { + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Autowired + private HttpServletRequest request; + + @Autowired + private PassengerMapper passengerMapper; + + @Override + public String loginByUserVO(UserVO userVO) { + User user = getOne( + new LambdaQueryWrapper() + .eq(User::getUsername, userVO.getUsername())); + + Assert.notNull(user, "用户不存在"); + + Assert.isTrue(user.getPassword().equals(userVO.getPassword()), "密码错误"); + + Map claim = BeanUtil.beanToMap(user, new HashMap<>(), false, false); + String token = JwtUtil.createToken(claim); + + stringRedisTemplate.opsForValue().set(token, "login", 15, TimeUnit.MINUTES); + return token; + } + + @Override + public List passengerList() { + Long uid = Long.valueOf(request.getHeader("uid")); + List passengerList = passengerMapper + .selectList(new LambdaQueryWrapper() + .eq(Passenger::getUid, uid) + ); + return passengerList; + } + + @Override + public void passengerAddByPassengerVO(PassengerVO passengerVO) { + Long uid = Long.valueOf(request.getHeader("uid")); + Passenger passenger = Passenger.builder() + .passengerName(passengerVO.getPassengerName()) + .id(passengerVO.getId()) + .uid(uid) + .build(); + passengerMapper.insert(passenger); + } +} diff --git a/user-service/src/main/resources/banner.txt b/user-service/src/main/resources/banner.txt new file mode 100644 index 0000000..9a830ab --- /dev/null +++ b/user-service/src/main/resources/banner.txt @@ -0,0 +1,9 @@ + ██ ██ ████████ ██ ██ +░░██ ██ ██░░░░░░ ░░██ ██ + ░░████ ░██ ░░████ + ░░██ ░█████████ ░░██ + ░██ ░░░░░░░░██ ░██ + ░██ ░██ ░██ + ░██ ████████ ░██ + ░░ ░░░░░░░░ ░░ +:: ysy boot :: version 1.0 \ No newline at end of file diff --git a/user-service/src/main/resources/bootstrap.yml b/user-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..4145220 --- /dev/null +++ b/user-service/src/main/resources/bootstrap.yml @@ -0,0 +1,42 @@ +server: + #服务端口 + port: 10001 + +spring: + application: + #服务名称 + name: userService + profiles: + #配置文件生效环境 + active: dev + + cloud: + nacos: + #nacos服务器地址 + server-addr: http://124.70.132.13:8848 + #nacos服务发现配置 + discovery: + #nacos服务注册命名空间ID,默认为public + namespace: 2e6a4975-46b3-4035-b77d-92b05ae48a66 + #cluster-name: SH #服务集群设置 + config: + #指定读取命名空间配置,默认为public + namespace: ${spring.cloud.nacos.discovery.namespace} + #nacos配置文件类型 + file-extension: yaml + #共享配置 + shared-configs: + - data-id: common.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-mysql.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + - data-id: common-redis.yaml + group: SPRING_CLOUD_COMMONS + refresh: true + + +