Browse Source

feat cloud

1 month ago
parent
commit
4d65e6b4b8
66 changed files with 2577 additions and 0 deletions
  1. 38 0
      .gitignore
  2. 8 0
      .idea/.gitignore
  3. 6 0
      .idea/ApifoxUploaderProjectSetting.xml
  4. 26 0
      .idea/encodings.xml
  5. 19 0
      .idea/misc.xml
  6. 6 0
      .idea/vcs.xml
  7. 246 0
      docker-compose.yml
  8. 23 0
      edu-travel-common/edu-travel-common-constant/pom.xml
  9. 28 0
      edu-travel-common/edu-travel-common-constant/src/main/java/edu/travel/FinalParam.java
  10. 10 0
      edu-travel-common/edu-travel-common-constant/src/main/java/edu/travel/RPCStatus.java
  11. 38 0
      edu-travel-common/edu-travel-common-constant/src/test/java/edu/travel/AppTest.java
  12. 23 0
      edu-travel-common/edu-travel-common-core/pom.xml
  13. 13 0
      edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/App.java
  14. 38 0
      edu-travel-common/edu-travel-common-core/src/test/java/edu/travel/AppTest.java
  15. 30 0
      edu-travel-common/edu-travel-common-datasource/pom.xml
  16. 13 0
      edu-travel-common/edu-travel-common-datasource/src/main/java/edu/travel/App.java
  17. 38 0
      edu-travel-common/edu-travel-common-datasource/src/test/java/edu/travel/AppTest.java
  18. 30 0
      edu-travel-common/edu-travel-common-feign/pom.xml
  19. 46 0
      edu-travel-common/edu-travel-common-feign/src/main/java/edu/travel/config/HeaderInterceptor.java
  20. 38 0
      edu-travel-common/edu-travel-common-feign/src/test/java/edu/travel/AppTest.java
  21. 26 0
      edu-travel-common/edu-travel-common-resp/pom.xml
  22. 19 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/BaseResponse.java
  23. 32 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/PageResponse.java
  24. 16 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCBaseResponse.java
  25. 14 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCPageResponse.java
  26. 38 0
      edu-travel-common/edu-travel-common-resp/src/test/java/edu/travel/AppTest.java
  27. 21 0
      edu-travel-common/edu-travel-common-utils/pom.xml
  28. 83 0
      edu-travel-common/edu-travel-common-utils/src/main/java/edu/travel/EncryptUtil.java
  29. 100 0
      edu-travel-common/edu-travel-common-utils/src/main/java/edu/travel/RSAUtill.java
  30. 38 0
      edu-travel-common/edu-travel-common-utils/src/test/java/edu/travel/AppTest.java
  31. 31 0
      edu-travel-common/pom.xml
  32. 144 0
      edu-travel-gateway/pom.xml
  33. 15 0
      edu-travel-gateway/src/main/java/edu/travel/GatewayApplication.java
  34. 41 0
      edu-travel-gateway/src/main/java/edu/travel/config/AuthorizationManager.java
  35. 35 0
      edu-travel-gateway/src/main/java/edu/travel/config/CorsAutoConfiguration.java
  36. 26 0
      edu-travel-gateway/src/main/java/edu/travel/config/CustomServerAuthenticationEntryPoint.java
  37. 41 0
      edu-travel-gateway/src/main/java/edu/travel/config/JwtAuthenticationManager.java
  38. 116 0
      edu-travel-gateway/src/main/java/edu/travel/config/ResourceServerConfig.java
  39. 39 0
      edu-travel-gateway/src/main/java/edu/travel/config/TokenConfig.java
  40. 23 0
      edu-travel-gateway/src/main/java/edu/travel/config/WebConfig.java
  41. 15 0
      edu-travel-gateway/src/main/java/edu/travel/config/WhiteListConfig.java
  42. 60 0
      edu-travel-gateway/src/main/java/edu/travel/filter/GateWayFilter.java
  43. 15 0
      edu-travel-gateway/src/main/resources/bootstrap-dev.yml
  44. 15 0
      edu-travel-gateway/src/main/resources/bootstrap-prod.yml
  45. 9 0
      edu-travel-gateway/src/main/resources/bootstrap.yml
  46. 23 0
      edu-travel-model/edu-travel-model-tenant/pom.xml
  47. 13 0
      edu-travel-model/edu-travel-model-tenant/src/main/java/edu/travel/App.java
  48. 38 0
      edu-travel-model/edu-travel-model-tenant/src/test/java/edu/travel/AppTest.java
  49. 33 0
      edu-travel-model/pom.xml
  50. 149 0
      edu-travel-oauth/pom.xml
  51. 18 0
      edu-travel-oauth/src/main/java/edu/travel/OauthServerApplication.java
  52. 17 0
      edu-travel-oauth/src/main/java/edu/travel/advisor/MyValidDataRestControllerAdvice.java
  53. 123 0
      edu-travel-oauth/src/main/java/edu/travel/config/AuthorizationServer.java
  54. 45 0
      edu-travel-oauth/src/main/java/edu/travel/config/TokenConfig.java
  55. 34 0
      edu-travel-oauth/src/main/java/edu/travel/config/WebSecurityConfig.java
  56. 22 0
      edu-travel-oauth/src/main/java/edu/travel/exception/MyValidDataException.java
  57. 45 0
      edu-travel-oauth/src/main/java/edu/travel/filter/TokenAuthenticationFilter.java
  58. 14 0
      edu-travel-oauth/src/main/java/edu/travel/service/UserServiceImpl.java
  59. 24 0
      edu-travel-oauth/src/main/resources/bootstrap-dev.yml
  60. 24 0
      edu-travel-oauth/src/main/resources/bootstrap-prod.yml
  61. 9 0
      edu-travel-oauth/src/main/resources/bootstrap.yml
  62. 30 0
      edu-travel-remote/pom.xml
  63. 28 0
      edu-travel-service/edu-travel-service-tenant/pom.xml
  64. 38 0
      edu-travel-service/edu-travel-service-tenant/src/test/java/edu/travel/AppTest.java
  65. 26 0
      edu-travel-service/pom.xml
  66. 95 0
      pom.xml

+ 38 - 0
.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

+ 8 - 0
.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

+ 6 - 0
.idea/ApifoxUploaderProjectSetting.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ApifoxUploaderProjectSetting">
+    <option name="apiAccessToken" value="APS-zVX12fxhdOW93TBWYxvewP8rxF9dEXvJ" />
+  </component>
+</project>

+ 26 - 0
.idea/encodings.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/edu-travel-common/edu-travel-common-constant/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/edu-travel-common-core/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/edu-travel-common-datasource/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/edu-travel-common-feign/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/edu-travel-common-resp/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/edu-travel-common-utils/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-gateway/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-model/edu-travel-model-tenant/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-model/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-model/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-oauth/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-remote/edu-travel-remote-user/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-remote/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-remote/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-service/edu-travel-service-tenant/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-service/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/edu-travel-service/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 19 - 0
.idea/misc.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+    <option name="ignoredFiles">
+      <set>
+        <option value="$PROJECT_DIR$/edu-travel-remote/edu-travel-remote-user/pom.xml" />
+      </set>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="zulu-17" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 246 - 0
docker-compose.yml

@@ -0,0 +1,246 @@
+version: '3'
+services:
+  #amd64架构用这个
+  mysqlmaster01:
+    ports:
+      - 3306:3306
+    image: docker.io/mysql:5.7
+    container_name: mysql-master01
+    environment:
+      MYSQL_ROOT_PASSWORD: 558800
+    restart: always
+    volumes:
+      - /Users/a1/vmdata/mysqlmaster01/data:/var/lib/mysql
+  mysqlmaster02:
+    ports:
+      - 3307:3306
+    image: docker.io/mysql:5.7
+    container_name: mysql-master02
+    environment:
+      MYSQL_ROOT_PASSWORD: 558800
+    restart: always
+    volumes:
+      - /Users/a1/vmdata/mysqlmaster02/data:/var/lib/mysql
+  mysqlservice:
+    ports:
+      - 3308:3306
+    image: docker.io/mysql:5.7
+    container_name: mysql-service
+    environment:
+      MYSQL_ROOT_PASSWORD: 558800
+    volumes:
+      - /Users/a1/vmdata/mysql-service/data:/var/lib/mysql
+    restart: always
+  mysqlmasterarm64:
+    ports:
+      - 3306:3306
+    image: arm64v8/mysql:latest
+    container_name: mysql-master01
+    environment:
+      MYSQL_ROOT_PASSWORD: 558800
+    restart: always
+    volumes:
+      - /Users/a1/vmdata/mysqlmaster01/data:/var/lib/mysql
+#  pgmaster01:
+#    image: library/postgres:14
+#    ports:
+#      - 1922:5432
+#    restart: always
+#    container_name: pgmaster01
+#    volumes:
+#      - /Users/a1/vmdata/pg01-service/data:/var/lib/postgresql/data
+#    environment:
+#      POSTGRES_PASSWORD: 558800
+  nginx:
+    image: nginx:1.18.0
+    container_name: nginx
+    ports:
+      - 8888:80
+    restart: always
+    volumes:
+      - /Users/a1/vmdata/nginx/html:/usr/share/nginx
+      - /Users/a1/vmdata/nginx/logs:/var/log/nginx
+      - /Users/a1/vmdata/nginx/conf:/etc/nginx/conf.d
+      - /Users/a1/vmdata/nginx/nginx.conf:/etc/nginx/nginx.conf
+  nacos01:
+    container_name: nacos-server01
+    hostname: nacos-server01
+    image: nacos/nacos-server:v2.2.0-slim
+    environment:
+      - MODE=cluster
+      - PREFER_HOST_MODE=hostname
+      - NACOS_SERVERS=nacos-server01:8848 nacos-server02:8849 nacos-server03:8850
+      - SPRING_DATASOURCE_PLATFORM=mysql
+      - MYSQL_SERVICE_HOST=192.168.1.38
+      - MYSQL_SERVICE_PORT=3306
+      - MYSQL_SERVICE_USER=root
+      - MYSQL_SERVICE_PASSWORD=558800
+      - MYSQL_SERVICE_DB_NAME=nacos
+      - JVM_XMS=512m
+      - JVM_XMX=512m
+      - JVM_XMN=256m
+      - JVM_MS=64m
+      - JVM_MMS=128m
+    volumes:
+      - /Users/a1/vmdata/nacos1/logs:/home/nacos/logs
+      - /Users/a1/vmdata/nacos1/init.d/custom.properties:/home/nacos/init.d/custom.properties
+    ports:
+      - 8848:8848
+      - 9848:9848
+      - 9849:9849
+      - 9555:9555
+    extra_hosts:
+      # master_1容器可以使用的host访问nacos-server02 nacos-server03
+      - nacos-server02:192.168.1.38
+      - nacos-server03:192.168.1.38
+    privileged: true
+    restart: always
+  nacos02:
+    container_name: nacos-server02
+    hostname: nacos-server02
+    image: nacos/nacos-server:v2.2.0-slim
+    environment:
+      - MODE=cluster
+      - PREFER_HOST_MODE=hostname
+      - NACOS_SERVERS=nacos-server01:8848 nacos-server02:8849 nacos-server03:8850
+      - SPRING_DATASOURCE_PLATFORM=mysql
+      - MYSQL_SERVICE_HOST=192.168.1.38
+      - MYSQL_SERVICE_PORT=3306
+      - MYSQL_SERVICE_USER=root
+      - MYSQL_SERVICE_PASSWORD=558800
+      - MYSQL_SERVICE_DB_NAME=nacos
+      - JVM_XMS=512m
+      - JVM_XMX=512m
+      - JVM_XMN=256m
+      - JVM_MS=64m
+      - JVM_MMS=128m
+    volumes:
+      - /Users/a1/vmdata/nacos2/logs:/home/nacos/logs
+      - /Users/a1/vmdata/nacos2/init.d/custom.properties:/home/nacos/init.d/custom.properties
+    ports:
+      - 8849:8848
+      - 9850:9848
+      - 9851:9849
+      - 9556:9555
+    extra_hosts:
+      # master_1容器可以使用的host访问nacos-server02 nacos-server03
+      - nacos-server01:192.168.1.38
+      - nacos-server03:192.168.1.38
+    privileged: true
+    restart: always
+  nacos03:
+    container_name: nacos-server03
+    hostname: nacos-server03
+    image: nacos/nacos-server:v2.2.0-slim
+    environment:
+      - MODE=cluster
+      - PREFER_HOST_MODE=hostname
+      - NACOS_SERVERS=nacos-server01:8848 nacos-server02:8849 nacos-server03:8850
+      - SPRING_DATASOURCE_PLATFORM=mysql
+      - MYSQL_SERVICE_HOST=192.168.1.38
+      - MYSQL_SERVICE_PORT=3306
+      - MYSQL_SERVICE_USER=root
+      - MYSQL_SERVICE_PASSWORD=558800
+      - MYSQL_SERVICE_DB_NAME=nacos
+      - JVM_XMS=512m
+      - JVM_XMX=512m
+      - JVM_XMN=256m
+      - JVM_MS=64m
+      - JVM_MMS=128m
+    volumes:
+      - /Users/a1/vmdata/nacos3/logs:/home/nacos/logs
+      - /Users/a1/vmdata/nacos3/init.d/custom.properties:/home/nacos/init.d/custom.properties
+    ports:
+      - 8850:8848
+      - 9852:9848
+      - 9853:9849
+      - 9557:9555
+    extra_hosts:
+      # master_1容器可以使用的host访问nacos-server02 nacos-server03
+      - nacos-server01:192.168.1.38
+      - nacos-server02:192.168.1.38
+    privileged: true
+    restart: always
+  nacosarm64:
+    image: gehuiwin/nacos:2.0.3
+    hostname: nacos-serverarm01
+    container_name: nacos-serverarm01
+    privileged: true
+    restart: always
+    ports:
+      - 8848:8848
+    volumes:
+      - /Users/a1/vmdata/nacosarm01/logs:/home/nacos/logs
+    environment:
+      - MODE=cluster
+      - PREFER_HOST_MODE=hostname
+      - NACOS_SERVERS=nacos-serverarm01
+      - SPRING_DATASOURCE_PLATFORM=mysql
+      - MYSQL_SERVICE_HOST=192.168.1.38
+      - MYSQL_SERVICE_PORT=3306
+      - MYSQL_SERVICE_USER=root
+      - MYSQL_SERVICE_PASSWORD=558800
+      - MYSQL_SERVICE_DB_NAME=nacos
+      - JVM_XMS=512m
+      - JVM_XMX=512m
+      - JVM_XMN=256m
+      - JVM_MS=64m
+      - JVM_MMS=128m
+  redis: # 服务名称
+    image: redis:6.0.0 # redis镜像版本
+    container_name: redis # 容器名称
+    ports:
+      - 6379:6379 # 指定宿主机端口与容器端口映射关系,宿主机:容器
+    volumes:
+      - /Users/a1/vmdata/redis/redis.conf:/etc/redis/redis.conf # 映射配置文件目录,宿主机:容器
+      - /Users/a1/vmdata/redis/data:/data # 映射数据目录,宿主机:容器
+    restart: always # 容器开机自启
+    privileged: true # 获取宿主机root权限
+    command: ["redis-server","/etc/redis/redis.conf"] # 指定配置文件启动redis-server进程
+  minio:
+    image: minio/minio
+    container_name: minio
+    ports:
+      - 9010:9000
+      - 9011:9011
+    environment:
+      TZ: Asia/Shanghai
+      MINIO_ACCESS_KEY: minio
+      MINIO_SECRET_KEY: minio123
+    volumes:
+      - /Users/a1/vmdata/minio/data:/data
+    command: server /data --console-address ":9011"
+  kafka:
+    container_name: kafka
+    image: 'bitnami/kafka:3.5'
+    ports:
+      - '19092:9092'
+      - '19093:9093'
+    environment:
+      ### 通用配置
+      # 允许使用kraft,即Kafka替代Zookeeper
+      - KAFKA_ENABLE_KRAFT=yes
+      - KAFKA_CFG_NODE_ID=1
+      # kafka角色,做broker,也要做controller
+      - KAFKA_CFG_PROCESS_ROLES=controller,broker
+      # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
+      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
+      # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
+      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.38:19092
+      # 定义安全协议
+      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
+      # 集群地址
+      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
+      # 指定供外部使用的控制类请求信息
+      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
+      # 设置broker最大内存,和初始内存
+      - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
+      # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
+      - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
+      # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
+      - ALLOW_PLAINTEXT_LISTENER=yes
+      # 不允许自动创建主题
+      - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
+      # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
+      - KAFKA_BROKER_ID=1
+

+ 23 - 0
edu-travel-common/edu-travel-common-constant/pom.xml

@@ -0,0 +1,23 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-constant</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-constant</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+    </dependencies>
+</project>

+ 28 - 0
edu-travel-common/edu-travel-common-constant/src/main/java/edu/travel/FinalParam.java

@@ -0,0 +1,28 @@
+package edu.travel;
+
+public interface FinalParam {
+    /**
+     * JWT存储权限前缀
+     */
+    String AUTHORITY_PREFIX = "ROLE_";
+
+    /**
+     * JWT存储权限属性
+     */
+    String AUTHORITY_CLAIM_NAME = "authorities";
+
+    /**
+     * 认证信息Http请求头
+     */
+    String JWT_TOKEN_HEADER = "Authorization";
+
+    /**
+     * JWT令牌前缀
+     */
+    String JWT_TOKEN_PREFIX = "Bearer ";
+
+    /**
+     * JWT载体key
+     */
+    String JWT_PAYLOAD_KEY = "payload";
+}

+ 10 - 0
edu-travel-common/edu-travel-common-constant/src/main/java/edu/travel/RPCStatus.java

@@ -0,0 +1,10 @@
+package edu.travel;
+
+public interface RPCStatus {
+
+     final Integer RESOURCES_NOT_FOUND = 404;
+
+     final Integer RESOURCES_SUCCESS = 200;
+
+     final Integer RESOURCES_ERROR = 500;
+}

+ 38 - 0
edu-travel-common/edu-travel-common-constant/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 23 - 0
edu-travel-common/edu-travel-common-core/pom.xml

@@ -0,0 +1,23 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-core</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-core</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+    </dependencies>
+</project>

+ 13 - 0
edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/App.java

@@ -0,0 +1,13 @@
+package edu.travel;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}

+ 38 - 0
edu-travel-common/edu-travel-common-core/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 30 - 0
edu-travel-common/edu-travel-common-datasource/pom.xml

@@ -0,0 +1,30 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-datasource</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-datasource</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 13 - 0
edu-travel-common/edu-travel-common-datasource/src/main/java/edu/travel/App.java

@@ -0,0 +1,13 @@
+package edu.travel;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}

+ 38 - 0
edu-travel-common/edu-travel-common-datasource/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 30 - 0
edu-travel-common/edu-travel-common-feign/pom.xml

@@ -0,0 +1,30 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-feign</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-feign</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 46 - 0
edu-travel-common/edu-travel-common-feign/src/main/java/edu/travel/config/HeaderInterceptor.java

@@ -0,0 +1,46 @@
+package edu.travel.config;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Enumeration;
+
+@Configuration
+public class HeaderInterceptor{
+    @Bean
+    public RequestInterceptor requestInterceptor() {
+        return new RequestInterceptor() {
+            @Override
+            public void apply(RequestTemplate template) {
+                /**
+                 *   从 consumer 获取 请求header参数    透传到 provider
+                 */
+                RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+                if (requestAttributes != null) {
+                    ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
+                    if (servletRequestAttributes!=null){
+                        HttpServletRequest request = servletRequestAttributes.getRequest();
+
+                        Enumeration<String> headerNames = request.getHeaderNames();
+                        if (headerNames != null) {
+                            while (headerNames.hasMoreElements()) {
+                                String name = headerNames.nextElement();
+                                String values = request.getHeader(name);
+                                template.header(name, values);
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+                ;
+    }
+
+}

+ 38 - 0
edu-travel-common/edu-travel-common-feign/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 26 - 0
edu-travel-common/edu-travel-common-resp/pom.xml

@@ -0,0 +1,26 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-resp</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-resp</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 19 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/BaseResponse.java

@@ -0,0 +1,19 @@
+package edu.travel.resp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BaseResponse<T> implements Serializable {
+
+    private Integer code;
+
+    private String msg;
+
+    private T data;
+}

+ 32 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/PageResponse.java

@@ -0,0 +1,32 @@
+package edu.travel.resp;
+
+import lombok.Data;
+
+@Data
+public class PageResponse extends BaseResponse {
+    private int total;
+    private int size;
+
+    private PageResponse() {
+    }
+    private PageResponse(int code, String msg,Object data) {
+        super(code, msg, data);
+    }
+    private PageResponse(int code, String msg) {
+        super(code, msg, null);
+    }
+    private PageResponse(int code, String msg,Object data,int total,int size) {
+        super(code, msg, data);
+        this.total = total;
+        this.size = size;
+    }
+    public static <R> BaseResponse<R> out(Integer code,String msg,R data,int total, int size){
+        return new PageResponse(code,msg,data,total,size);
+    }
+    public static <R> BaseResponse<R> out(Integer code,String msg,R data){
+        return new PageResponse(code,msg,data);
+    }
+    public static  BaseResponse out(Integer code,String msg){
+        return new PageResponse(code,msg);
+    }
+}

+ 16 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCBaseResponse.java

@@ -0,0 +1,16 @@
+package edu.travel.rpc;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RPCBaseResponse<T> implements Serializable {
+    private int code;
+    private String msg;
+    private T data;
+}

+ 14 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCPageResponse.java

@@ -0,0 +1,14 @@
+package edu.travel.rpc;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RPCPageResponse<T> extends RPCBaseResponse<T> {
+    private int total;
+    private int  currentPage;
+    private int pageSize;
+}

+ 38 - 0
edu-travel-common/edu-travel-common-resp/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 21 - 0
edu-travel-common/edu-travel-common-utils/pom.xml

@@ -0,0 +1,21 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-utils</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-utils</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+
+</project>

+ 83 - 0
edu-travel-common/edu-travel-common-utils/src/main/java/edu/travel/EncryptUtil.java

@@ -0,0 +1,83 @@
+package edu.travel;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Base64;
+
+public class EncryptUtil {
+
+    public static String encodeBase64(byte[] bytes) {
+        String encoded = Base64.getEncoder().encodeToString(bytes);
+        return encoded;
+    }
+
+    public static byte[] decodeBase64(String str) {
+        byte[] bytes = null;
+        bytes = Base64.getDecoder().decode(str);
+        return bytes;
+    }
+
+    public static String encodeUTF8StringBase64(String str) {
+        String encoded = null;
+        try {
+            encoded = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+
+        }
+        return encoded;
+
+    }
+
+    public static String decodeUTF8StringBase64(String str) {
+        String decoded = null;
+        byte[] bytes = Base64.getDecoder().decode(str);
+        try {
+            decoded = new String(bytes, "utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return decoded;
+    }
+
+    public static String encodeURL(String url) {
+        String encoded = null;
+        try {
+            encoded = URLEncoder.encode(url, "utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return encoded;
+    }
+
+
+    public static String decodeURL(String url) {
+        String decoded = null;
+        try {
+            decoded = URLDecoder.decode(url, "utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return decoded;
+    }
+
+    public static void main(String[] args) {
+        String str = "abcd{'a':'b'}";
+        String encoded = EncryptUtil.encodeUTF8StringBase64(str);
+        String decoded = EncryptUtil.decodeUTF8StringBase64(encoded);
+        System.out.println(str);
+        System.out.println(encoded);
+        System.out.println(decoded);
+
+        String url = "== wo";
+        String urlEncoded = EncryptUtil.encodeURL(url);
+        String urlDecoded =EncryptUtil.decodeURL(urlEncoded);
+
+        System.out.println(url);
+        System.out.println(urlEncoded);
+        System.out.println(urlDecoded);
+    }
+
+
+}

File diff suppressed because it is too large
+ 100 - 0
edu-travel-common/edu-travel-common-utils/src/main/java/edu/travel/RSAUtill.java


+ 38 - 0
edu-travel-common/edu-travel-common-utils/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 31 - 0
edu-travel-common/pom.xml

@@ -0,0 +1,31 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>EduTravel</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common</artifactId>
+    <packaging>pom</packaging>
+
+    <name>edu-travel-common</name>
+    <url>http://maven.apache.org</url>
+    <modules>
+        <module>edu-travel-common-core</module>
+        <module>edu-travel-common-feign</module>
+        <module>edu-travel-common-datasource</module>
+        <module>edu-travel-common-constant</module>
+        <module>edu-travel-common-utils</module>
+        <module>edu-travel-common-resp</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+    </dependencies>
+</project>

+ 144 - 0
edu-travel-gateway/pom.xml

@@ -0,0 +1,144 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>EduTravel</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-gateway</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-gateway</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-oauth2-resource-server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-oauth2-jose</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.nimbusds</groupId>
+            <artifactId>nimbus-jose-jwt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-constant</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-utils</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-datasource</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-resp</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <env>dev</env>
+                <versionCode>${version}-SNAPSHOT</versionCode>
+                <spark.compiler.score>compile</spark.compiler.score>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+
+        <profile>
+            <id>prod</id>
+            <properties>
+                <env>prod</env>
+                <versionCode>${version}</versionCode>
+                <spark.compiler.score>provided</spark.compiler.score>
+            </properties>
+        </profile>
+    </profiles>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>@</delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <!-- 打包插件 -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!-- maven 打包时跳过测试 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!--开启过滤,用指定的参数替换directory下的文件中的参数-->
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+</project>

+ 15 - 0
edu-travel-gateway/src/main/java/edu/travel/GatewayApplication.java

@@ -0,0 +1,15 @@
+package edu.travel;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@EnableDiscoveryClient
+@SpringBootApplication
+public class GatewayApplication
+{
+    public static void main( String[] args )
+    {
+       SpringApplication.run(GatewayApplication.class, args);
+    }
+}

+ 41 - 0
edu-travel-gateway/src/main/java/edu/travel/config/AuthorizationManager.java

@@ -0,0 +1,41 @@
+package edu.travel.config;
+
+import edu.travel.FinalParam;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.security.authorization.AuthorizationDecision;
+import org.springframework.security.authorization.ReactiveAuthorizationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.server.authorization.AuthorizationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.PathMatcher;
+import reactor.core.publisher.Mono;
+
+@Component
+public class AuthorizationManager implements ReactiveAuthorizationManager<AuthorizationContext> {
+    @Override
+    public Mono<AuthorizationDecision> check(Mono<Authentication> mono, AuthorizationContext authorizationContext) {
+        ServerHttpRequest request = authorizationContext.getExchange().getRequest();
+        String path = request.getURI().getPath();
+        PathMatcher pathMatcher = new AntPathMatcher();
+        // 1. 对应跨域的预检请求直接放行
+        if (request.getMethod() == HttpMethod.OPTIONS) {
+            return Mono.just(new AuthorizationDecision(true));
+        }
+        if (pathMatcher.match("**.no", path)) {
+            return Mono.just(new AuthorizationDecision(true));
+        }else if (pathMatcher.match("/oauth2/**",path)){
+            return Mono.just(new AuthorizationDecision(true));
+        }else {
+            String token = request.getHeaders().getFirst(FinalParam.JWT_TOKEN_HEADER);
+            if (StringUtils.isNotBlank(token)){
+                return Mono.just(new AuthorizationDecision(true));
+            }else {
+                return Mono.just(new AuthorizationDecision(false));
+
+            }
+        }
+    }
+}

+ 35 - 0
edu-travel-gateway/src/main/java/edu/travel/config/CorsAutoConfiguration.java

@@ -0,0 +1,35 @@
+package edu.travel.config;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.cloud.gateway.config.GlobalCorsProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+@Configuration
+@ConditionalOnBean(GlobalCorsProperties.class)
+public class CorsAutoConfiguration {
+    @Autowired
+    private GlobalCorsProperties globalCorsProperties;
+    @Bean
+    public CorsWebFilter corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+        source.registerCorsConfiguration("/**", buildConfig());
+        globalCorsProperties.getCorsConfigurations().forEach((path, corsConfiguration) -> source.registerCorsConfiguration(path, corsConfiguration));
+        return new CorsWebFilter(source);
+    }
+
+    private CorsConfiguration buildConfig() {
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        //在生产环境上最好指定域名,以免产生跨域安全问题
+        corsConfiguration.addAllowedOrigin("*");
+        corsConfiguration.addAllowedHeader("*");
+        corsConfiguration.addAllowedMethod("*");
+        return corsConfiguration;
+    }
+}

+ 26 - 0
edu-travel-gateway/src/main/java/edu/travel/config/CustomServerAuthenticationEntryPoint.java

@@ -0,0 +1,26 @@
+package edu.travel.config;
+
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.server.ServerAuthenticationEntryPoint;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+
+public class CustomServerAuthenticationEntryPoint implements ServerAuthenticationEntryPoint {
+    @Override
+    public Mono<Void> commence(ServerWebExchange exchange, AuthenticationException e) {
+        return Mono.defer(() -> Mono.just(exchange.getResponse()))
+                .flatMap(response -> {
+                    response.setStatusCode(HttpStatus.UNAUTHORIZED);
+                    String body = "{\"code\":401,\"msg\":\"token不合法或过期\"}";
+                    DataBuffer buffer = response.bufferFactory().wrap(body.getBytes(StandardCharsets.UTF_8));
+                    return response.writeWith(Mono.just(buffer))
+                            .doOnError(error -> DataBufferUtils.release(buffer));
+                });
+
+    }
+}

+ 41 - 0
edu-travel-gateway/src/main/java/edu/travel/config/JwtAuthenticationManager.java

@@ -0,0 +1,41 @@
+package edu.travel.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.ReactiveAuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken;
+import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Mono;
+
+@Component
+public class JwtAuthenticationManager implements ReactiveAuthenticationManager {
+    @Autowired
+    private TokenStore tokenStore;
+    @Override
+    public Mono<Authentication> authenticate(Authentication authentication) {
+        return Mono.justOrEmpty(authentication)
+                .filter(a -> a instanceof BearerTokenAuthenticationToken)
+                .cast(BearerTokenAuthenticationToken.class)
+                .map(BearerTokenAuthenticationToken::getToken)
+                .flatMap((accessToken -> {
+                    //解析令牌
+                    OAuth2AccessToken oAuth2AccessToken = this.tokenStore.readAccessToken(accessToken);
+                    if (oAuth2AccessToken == null) {
+                        return Mono.error(new InvalidBearerTokenException("无效的token"));
+                    } else if (oAuth2AccessToken.isExpired()) {
+                        return Mono.error(new InvalidBearerTokenException("token已过期"));
+                    }
+                    OAuth2Authentication oAuth2Authentication = this.tokenStore.readAuthentication(accessToken);
+                    if (oAuth2Authentication == null) {
+                        return Mono.error(new InvalidBearerTokenException("无效的token"));
+                    } else {
+                        return Mono.just(oAuth2Authentication);
+                    }
+                }))
+                .cast(Authentication.class);
+    }
+}

+ 116 - 0
edu-travel-gateway/src/main/java/edu/travel/config/ResourceServerConfig.java

@@ -0,0 +1,116 @@
+package edu.travel.config;
+
+import com.alibaba.fastjson.JSON;
+import edu.travel.FinalParam;
+import edu.travel.resp.PageResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.authentication.ReactiveAuthenticationManager;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.config.web.server.SecurityWebFiltersOrder;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.oauth2.jwt.Jwt;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
+import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
+import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter;
+import org.springframework.security.oauth2.server.resource.web.server.ServerBearerTokenAuthenticationConverter;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+import org.springframework.security.web.server.ServerAuthenticationEntryPoint;
+import org.springframework.security.web.server.authentication.AuthenticationWebFilter;
+import org.springframework.security.web.server.authorization.ServerAccessDeniedHandler;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.Charset;
+
+@Configuration
+@EnableWebFluxSecurity
+public class ResourceServerConfig {
+    @Autowired
+    private AuthorizationManager authorizationManager;
+    @Autowired
+    private WhiteListConfig whiteListConfig;
+    @Autowired
+    private ReactiveAuthenticationManager authenticationManager;
+    @Autowired
+    private TokenStore tokenStore;
+    @Bean
+    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
+        AuthenticationWebFilter authenticationWebFilter = new AuthenticationWebFilter(authenticationManager);
+        authenticationWebFilter.setServerAuthenticationConverter(new ServerBearerTokenAuthenticationConverter());
+
+        http
+                .csrf().disable()
+                .authorizeExchange()
+                //对oauth的端点进行放行
+                .pathMatchers("/oauth2/**").permitAll()
+                //其他请求必须鉴权,使用鉴权管理器
+                .anyExchange().access(authorizationManager)
+                .and()
+                //鉴权异常处理
+                .exceptionHandling()
+                .authenticationEntryPoint(authenticationEntryPoint())
+                .accessDeniedHandler(accessDeniedHandler())
+                .and()
+                .addFilterAt(authenticationWebFilter, SecurityWebFiltersOrder.AUTHENTICATION)
+
+        //跨域过滤器
+//                .addFilterAt(corsWebFilter, SecurityWebFiltersOrder.CORS)
+        //token认证过滤器
+//                .addFilterAt(authenticationWebFilter, SecurityWebFiltersOrder.AUTHENTICATION)
+        // .addFilterAfter(authenticationFilter, SecurityWebFiltersOrder.AUTHENTICATION)
+        ;
+        return http.build();
+    }
+    @Bean
+    public ServerAuthenticationEntryPoint authenticationEntryPoint() {
+        return (exchange, e) -> {
+            Mono<Void> mono = Mono.defer(() -> Mono.just(exchange.getResponse()))
+                    .flatMap(response -> {
+                        response.setStatusCode(HttpStatus.OK);
+                        response.getHeaders().set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
+                        response.getHeaders().set("Access-Control-Allow-Origin", "*");
+                        response.getHeaders().set("Cache-Control", "no-cache");
+                        String body = JSON.toJSONString(PageResponse.out(401, "token is empty"));
+                        DataBuffer buffer = response.bufferFactory().wrap(body.getBytes(Charset.forName("UTF-8")));
+                        return response.writeWith(Mono.just(buffer))
+                                .doOnError(error -> DataBufferUtils.release(buffer));
+                    });
+            return mono;
+        };
+    }
+    @Bean
+    ServerAccessDeniedHandler accessDeniedHandler() {
+        return ((exchange, denied) -> {
+            Mono<Void> mono = Mono.defer(() -> Mono.just(exchange.getResponse()))
+                    .flatMap(response -> {
+                        response.setStatusCode(HttpStatus.OK);
+                        response.getHeaders().set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
+                        response.getHeaders().set("Access-Control-Allow-Origin", "*");
+                        response.getHeaders().set("Cache-Control", "no-cache");
+                        String body = JSON.toJSONString(PageResponse.out(401, "USER_ACCESS_UNAUTHORIZED"));
+                        DataBuffer buffer = response.bufferFactory().wrap(body.getBytes(Charset.forName("UTF-8")));
+                        return response.writeWith(Mono.just(buffer))
+                                .doOnError(error -> DataBufferUtils.release(buffer));
+                    });
+            return mono;
+        });
+    }
+    @Bean
+    public Converter<Jwt, ? extends Mono<? extends AbstractAuthenticationToken>> jwtAuthenticationConverter() {
+        JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
+        jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName(FinalParam.AUTHORITY_CLAIM_NAME);
+        JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
+        jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
+
+        return new ReactiveJwtAuthenticationConverterAdapter(jwtAuthenticationConverter);
+    }
+}

+ 39 - 0
edu-travel-gateway/src/main/java/edu/travel/config/TokenConfig.java

@@ -0,0 +1,39 @@
+package edu.travel.config;
+
+import edu.travel.RSAUtill;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
+
+import java.security.PrivateKey;
+@Configuration
+public class TokenConfig {
+    @Value("${OAUTH_KEY}")
+    private String key;
+    @Value("${PRIVATE_KEY}")
+    private String privateKey;
+    @Bean
+    public TokenStore tokenStore() {
+        //JWT令牌存储方案
+        return new JwtTokenStore(accessTokenConverter());
+    }
+
+    @Bean
+    public JwtAccessTokenConverter accessTokenConverter() {
+        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
+        try {
+            PrivateKey privateKeyFromString = RSAUtill.getPrivateKeyFromString(privateKey);
+            String decrypt = RSAUtill.decrypt(key, privateKeyFromString);
+            converter.setSigningKey(decrypt); //对称秘钥,资源服务器使用该秘钥来验证
+//        converter.setKeyPair(keyPair());
+            return converter;
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+}

+ 23 - 0
edu-travel-gateway/src/main/java/edu/travel/config/WebConfig.java

@@ -0,0 +1,23 @@
+package edu.travel.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.codec.ServerCodecConfigurer;
+import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
+import org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader;
+import org.springframework.web.reactive.config.EnableWebFlux;
+import org.springframework.web.reactive.config.WebFluxConfigurer;
+
+@EnableWebFlux
+@Configuration
+public class WebConfig implements WebFluxConfigurer {
+    @Override
+    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
+        SynchronossPartHttpMessageReader partReader = new SynchronossPartHttpMessageReader();
+        partReader.setMaxParts(1);
+        partReader.setMaxDiskUsagePerPart(10L * 1024L);
+        partReader.setEnableLoggingRequestDetails(true);
+        MultipartHttpMessageReader multipartReader = new MultipartHttpMessageReader(partReader);
+        multipartReader.setEnableLoggingRequestDetails(true);
+        configurer.defaultCodecs().multipartReader(multipartReader);
+    }
+}

+ 15 - 0
edu-travel-gateway/src/main/java/edu/travel/config/WhiteListConfig.java

@@ -0,0 +1,15 @@
+package edu.travel.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "whitelist")
+public class WhiteListConfig {
+    private List<String> urls;
+
+}

+ 60 - 0
edu-travel-gateway/src/main/java/edu/travel/filter/GateWayFilter.java

@@ -0,0 +1,60 @@
+package edu.travel.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.nimbusds.jose.JWSObject;
+import edu.travel.EncryptUtil;
+import edu.travel.FinalParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.text.ParseException;
+import java.util.*;
+
+@Component
+public class GateWayFilter implements GlobalFilter, Ordered {
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        //获取到token
+        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
+        if (StringUtils.isBlank(token) || token.equals("null")) {
+            return chain.filter(exchange);
+        }
+        //替换token
+        String realToken = token.replace("Bearer ", "");
+        try {
+            JWSObject jwsObject = JWSObject.parse(realToken);
+            String userStr = jwsObject.getPayload().toString();
+            JSONObject jsonObject = JSON.parseObject(userStr);
+            String all = jsonObject.get(FinalParam.AUTHORITY_CLAIM_NAME).toString().replaceAll("\"", "");
+            String[] split = all.substring(all.indexOf("[") + 1, all.length() - 1).split(",");
+            List<String> authorities = new ArrayList<String>(Arrays.asList(split));
+            String principal = jsonObject.getObject("user_name", String.class);
+            String client_id = jsonObject.getObject("client_id", String.class);
+            Map<String, Object> map = new HashMap<>();
+            //获取权限
+            map.put("authorities", authorities);
+            //获取客户端
+            map.put("client_id", client_id);
+            //获取用户
+            map.put("principal", principal);
+            String tokens = EncryptUtil.encodeUTF8StringBase64(JSON.toJSONString(map));
+            ServerHttpRequest request = exchange.getRequest().mutate().header("token", tokens).build();
+            exchange = exchange.mutate().request(request).build();
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return chain.filter(exchange);
+    }
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+}

+ 15 - 0
edu-travel-gateway/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,15 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        namespace: edu-@env@
+      config:
+        file-extension: yaml
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        refresh-enabled: true
+        namespace: edu-@env@
+        shared-configs:
+          - data-id: system-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true

+ 15 - 0
edu-travel-gateway/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,15 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        namespace: edu-@env@
+      config:
+        file-extension: yaml
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        refresh-enabled: true
+        namespace: edu-@env@
+        shared-configs:
+          - data-id: system-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true

+ 9 - 0
edu-travel-gateway/src/main/resources/bootstrap.yml

@@ -0,0 +1,9 @@
+server:
+  port: 18888
+spring:
+  application:
+    name: gateway-@env@
+  profiles:
+    active: @env@
+  main:
+    allow-bean-definition-overriding: true

+ 23 - 0
edu-travel-model/edu-travel-model-tenant/pom.xml

@@ -0,0 +1,23 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-model</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-model-tenant</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-model-tenant</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+    </dependencies>
+</project>

+ 13 - 0
edu-travel-model/edu-travel-model-tenant/src/main/java/edu/travel/App.java

@@ -0,0 +1,13 @@
+package edu.travel;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}

+ 38 - 0
edu-travel-model/edu-travel-model-tenant/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 33 - 0
edu-travel-model/pom.xml

@@ -0,0 +1,33 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>EduTravel</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-model</artifactId>
+    <packaging>pom</packaging>
+
+    <name>edu-travel-model</name>
+    <url>http://maven.apache.org</url>
+    <modules>
+        <module>edu-travel-model-tenant</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-annotation</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 149 - 0
edu-travel-oauth/pom.xml

@@ -0,0 +1,149 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>EduTravel</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-oauth</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-oauth</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.nimbusds</groupId>
+            <artifactId>nimbus-jose-jwt</artifactId>
+        </dependency>
+        <!--security -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-datasource</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-utils</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-resp</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <env>dev</env>
+                <versionCode>${version}-SNAPSHOT</versionCode>
+                <spark.compiler.score>compile</spark.compiler.score>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <env>prod</env>
+                <versionCode>${version}</versionCode>
+                <spark.compiler.score>provided</spark.compiler.score>
+            </properties>
+        </profile>
+    </profiles>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>@</delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <!-- 打包插件 -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!-- maven 打包时跳过测试 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!--开启过滤,用指定的参数替换directory下的文件中的参数-->
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+</project>

+ 18 - 0
edu-travel-oauth/src/main/java/edu/travel/OauthServerApplication.java

@@ -0,0 +1,18 @@
+package edu.travel;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * Hello world!
+ *
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+public class OauthServerApplication
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}

+ 17 - 0
edu-travel-oauth/src/main/java/edu/travel/advisor/MyValidDataRestControllerAdvice.java

@@ -0,0 +1,17 @@
+package edu.travel.advisor;
+
+import edu.travel.exception.MyValidDataException;
+import edu.travel.resp.PageResponse;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletResponse;
+
+@RestControllerAdvice
+public class MyValidDataRestControllerAdvice {
+    @ExceptionHandler(MyValidDataException.class)
+    public PageResponse checkData(MyValidDataException myValidDataException){
+        myValidDataException.printStackTrace();
+        return (PageResponse) PageResponse.out(HttpServletResponse.SC_OK,"出错");
+    }
+}

+ 123 - 0
edu-travel-oauth/src/main/java/edu/travel/config/AuthorizationServer.java

@@ -0,0 +1,123 @@
+package edu.travel.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.crypto.password.NoOpPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.ClientDetailsService;
+import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
+import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices;
+import org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices;
+import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
+import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
+import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+
+import javax.sql.DataSource;
+import java.util.Arrays;
+
+@Configuration
+@EnableAuthorizationServer
+public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {
+
+    @Autowired
+    private TokenStore tokenStore;
+
+    @Autowired
+    private ClientDetailsService clientDetailsService;
+
+    @Autowired
+    private AuthorizationCodeServices authorizationCodeServices;
+
+    @Autowired
+    private AuthenticationManager authenticationManager;
+
+    @Autowired
+    private JwtAccessTokenConverter accessTokenConverter;
+
+    //密码编码器
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return  NoOpPasswordEncoder.getInstance();
+    }
+    //ClientDetailsService和AuthorizationCodeServices从数据库读取数据。
+    //将客户端信息存储到数据库
+    @Bean
+    public ClientDetailsService clientDetailsService(DataSource dataSource) {
+        ClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);
+        ((JdbcClientDetailsService) clientDetailsService).setPasswordEncoder(passwordEncoder());
+        return clientDetailsService;
+    }
+    //客户端详情服务
+    @Override
+    public void configure(ClientDetailsServiceConfigurer clients)
+            throws Exception {
+
+        clients.withClientDetails(clientDetailsService);
+        /*clients.inMemory()// 使用in-memory存储
+                .withClient("c1")// client_id
+                .secret(new BCryptPasswordEncoder().encode("secret"))//客户端密钥
+                .resourceIds("res1")//资源列表
+                .authorizedGrantTypes("authorization_code", "password","client_credentials","implicit","refresh_token")// 该client允许的授权类型authorization_code,password,refresh_token,implicit,client_credentials
+                .scopes("all")// 允许的授权范围
+                .autoApprove(false)//false跳转到授权页面
+                //加上验证回调地址
+                .redirectUris("http://www.baidu.com")
+                ;*/
+    }
+
+    //令牌管理服务
+    //AuthorizationServerTokenServices 接口定义了一些操作使得你可以对令牌进行一些必要的管理,令牌可以被用来加载身份信息,里面包含了这个令牌的相关权限。
+    @Bean
+    public AuthorizationServerTokenServices tokenService() {
+        DefaultTokenServices service=new DefaultTokenServices();
+        service.setClientDetailsService(clientDetailsService);//客户端详情服务
+        service.setSupportRefreshToken(true);//支持刷新令牌
+        service.setTokenStore(tokenStore);//令牌存储策略
+        //令牌增强
+        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
+        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));
+        service.setTokenEnhancer(tokenEnhancerChain);
+
+        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
+        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
+        return service;
+    }
+    @Bean
+    public AuthorizationCodeServices authorizationCodeServices(DataSource dataSource) {
+        return new JdbcAuthorizationCodeServices(dataSource);//设置授权码模式的授权码如何存取
+    }
+
+    //配置令牌访问端点
+
+    @Override
+    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
+        endpoints
+                .authenticationManager(authenticationManager)//认证管理器
+                .authorizationCodeServices(authorizationCodeServices)//授权码服务
+                .tokenServices(tokenService())//令牌管理服务
+                .allowedTokenEndpointRequestMethods(HttpMethod.POST)
+                .allowedTokenEndpointRequestMethods(HttpMethod.GET);
+    }
+
+    //令牌访问端口安全策略
+    @Override
+    public void configure(AuthorizationServerSecurityConfigurer security){
+        security
+                .tokenKeyAccess("permitAll()")//oauth/token_key是公开
+                .checkTokenAccess("permitAll()")//oauth/check_token公开
+                .allowFormAuthenticationForClients()				//表单认证(申请令牌)
+        ;
+    }
+
+
+}

+ 45 - 0
edu-travel-oauth/src/main/java/edu/travel/config/TokenConfig.java

@@ -0,0 +1,45 @@
+package edu.travel.config;
+
+import edu.travel.RSAUtill;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
+
+import java.security.PrivateKey;
+
+@Configuration
+public class TokenConfig {
+    @Value("${OAUTH_KEY}")
+    private String key;
+    @Value("${PRIVATE_KEY}")
+    private String privateKey;
+    @Bean
+    public TokenStore tokenStore() {
+        //JWT令牌存储方案
+        return new JwtTokenStore(accessTokenConverter());
+    }
+
+    @Bean
+    public JwtAccessTokenConverter accessTokenConverter() {
+        try {
+            PrivateKey privateKeyFromString = RSAUtill.getPrivateKeyFromString(privateKey);
+            String decrypt = RSAUtill.decrypt(key, privateKeyFromString);
+            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
+            //对称秘钥,资源服务器使用该秘钥来验证
+//        converter.setKeyPair(keyPair());
+            converter.setSigningKey(decrypt);
+            return converter;
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+
+
+}

+ 34 - 0
edu-travel-oauth/src/main/java/edu/travel/config/WebSecurityConfig.java

@@ -0,0 +1,34 @@
+package edu.travel.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    //认证管理器
+    @Bean
+    @Override
+    public AuthenticationManager authenticationManagerBean() throws Exception {
+        return super.authenticationManagerBean();
+    }
+
+    //安全拦截机制(最重要)
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.csrf().disable()
+                .authorizeRequests()
+                .antMatchers(new String[]{"/publicKey","/client/**","/register","/oauth/**"}).permitAll()
+                .anyRequest().authenticated()
+                .and()
+                .formLogin()	//设置SpringSecurity默认Form登录
+        ;
+
+    }
+
+}

+ 22 - 0
edu-travel-oauth/src/main/java/edu/travel/exception/MyValidDataException.java

@@ -0,0 +1,22 @@
+package edu.travel.exception;
+
+public class MyValidDataException extends Exception{
+    public MyValidDataException() {
+    }
+
+    public MyValidDataException(String message) {
+        super(message);
+    }
+
+    public MyValidDataException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public MyValidDataException(Throwable cause) {
+        super(cause);
+    }
+
+    public MyValidDataException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}

+ 45 - 0
edu-travel-oauth/src/main/java/edu/travel/filter/TokenAuthenticationFilter.java

@@ -0,0 +1,45 @@
+package edu.travel.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import edu.travel.EncryptUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class TokenAuthenticationFilter extends OncePerRequestFilter {
+    @Override
+    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
+        String token = httpServletRequest.getHeader("token");
+        if (StringUtils.isNotBlank(token)){
+            String json = EncryptUtil.decodeUTF8StringBase64(token);
+            //将token转成json对象
+            JSONObject jsonObject = JSON.parseObject(json);
+            //用户身份信息
+            String username  = jsonObject.getString("principal");
+//            ClientRemoteDTO user = new ClientRemoteDTO();
+//            user.setId(Long.valueOf(username));
+            //用户权限
+            JSONArray authoritiesArray = jsonObject.getJSONArray("authorities");
+            String[] authorities = authoritiesArray.toArray(new String[authoritiesArray.size()]);
+            //将用户信息和权限填充 到用户身份token对象中
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(null, null, AuthorityUtils.createAuthorityList(authorities));
+            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));
+            //将authenticationToken填充到安全上下文
+            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+        }
+        filterChain.doFilter(httpServletRequest,httpServletResponse);
+    }
+}

+ 14 - 0
edu-travel-oauth/src/main/java/edu/travel/service/UserServiceImpl.java

@@ -0,0 +1,14 @@
+package edu.travel.service;
+
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceImpl implements UserDetailsService {
+    @Override
+    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
+        return null;
+    }
+}

+ 24 - 0
edu-travel-oauth/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,24 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        namespace: edu-@env@
+      config:
+        file-extension: yaml
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        refresh-enabled: true
+        namespace: edu-@env@
+        shared-configs:
+          - data-id: mybatis-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          - data-id: reids-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          - data-id: datasource-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          - data-id: system-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true

+ 24 - 0
edu-travel-oauth/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,24 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        namespace: edu-@env@
+      config:
+        file-extension: yaml
+        server-addr: chang.server:8848,chang.server:8849,chang.server:8858
+        refresh-enabled: true
+        namespace: edu-@env@
+        shared-configs:
+          - data-id: mybatis-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          - data-id: reids-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          - data-id: datasource-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          - data-id: system-config-dev.yaml
+            group: DEFAULT_GROUP
+            refresh: true

+ 9 - 0
edu-travel-oauth/src/main/resources/bootstrap.yml

@@ -0,0 +1,9 @@
+server:
+  port: 10001
+spring:
+  application:
+    name: oauth2-@env@
+  profiles:
+    active: @env@
+  main:
+    allow-bean-definition-overriding: true

+ 30 - 0
edu-travel-remote/pom.xml

@@ -0,0 +1,30 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>EduTravel</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-remote</artifactId>
+    <packaging>pom</packaging>
+
+    <name>edu-travel-remote</name>
+    <url>http://maven.apache.org</url>
+    <modules>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 28 - 0
edu-travel-service/edu-travel-service-tenant/pom.xml

@@ -0,0 +1,28 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-service</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-service-tenant</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-service-tenant</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 38 - 0
edu-travel-service/edu-travel-service-tenant/src/test/java/edu/travel/AppTest.java

@@ -0,0 +1,38 @@
+package edu.travel;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 26 - 0
edu-travel-service/pom.xml

@@ -0,0 +1,26 @@
+<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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>EduTravel</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <packaging>pom</packaging>
+
+    <artifactId>edu-travel-service</artifactId>
+    <modules>
+        <module>edu-travel-service-tenant</module>
+    </modules>
+
+    <name>edu-travel-service</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+    </dependencies>
+</project>

+ 95 - 0
pom.xml

@@ -0,0 +1,95 @@
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>edu.travel</groupId>
+  <artifactId>EduTravel</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <modules>
+    <module>edu-travel-common</module>
+    <module>edu-travel-gateway</module>
+    <module>edu-travel-service</module>
+    <module>edu-travel-common/edu-travel-common-feign</module>
+    <module>edu-travel-remote</module>
+    <module>edu-travel-oauth</module>
+    <module>edu-travel-model</module>
+    <module>edu-travel-service/edu-travel-service-tenant</module>
+    <module>edu-travel-common/edu-travel-common-utils</module>
+  </modules>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.3.12.RELEASE</version>
+    <relativePath/>
+  </parent>
+  <name>EduTravel</name>
+  <url>http://maven.apache.org</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <spring.cloud.version>Hoxton.SR12</spring.cloud.version>
+    <mysql.version>8.0.22</mysql.version>
+    <druid.version>1.2.16</druid.version>
+    <mybatis.plus.verion>3.5.4.1</mybatis.plus.verion>
+    <fastjson.version>1.2.83</fastjson.version>
+    <hutool.version>5.8.23</hutool.version>
+    <alibaba.version>2.2.10-RC1</alibaba.version>
+    <mybaits.plus.annotation.version>3.5.4.1</mybaits.plus.annotation.version>
+    <bootstrap.version>4.1.3</bootstrap.version>
+
+  </properties>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.springframework.cloud</groupId>
+        <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        <version>${bootstrap.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.alibaba.cloud</groupId>
+        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+        <version>${alibaba.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.springframework.cloud</groupId>
+        <artifactId>spring-cloud-dependencies</artifactId>
+        <version>${spring.cloud.version}</version> <!-- 或者使用具体的子版本 -->
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>mysql</groupId>
+        <artifactId>mysql-connector-java</artifactId>
+        <version>${mysql.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>druid-spring-boot-starter</artifactId>
+        <version>${druid.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus-boot-starter</artifactId>
+        <version>${mybatis.plus.verion}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>fastjson</artifactId>
+        <version>${fastjson.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>cn.hutool</groupId>
+        <artifactId>hutool-all</artifactId>
+        <version>${hutool.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus-annotation</artifactId>
+        <version>${mybaits.plus.annotation.version}</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+</project>

Some files were not shown because too many files changed in this diff