Browse Source

后端初始配置

Linyt 1 year ago
parent
commit
e49140ba42
40 changed files with 1737 additions and 14 deletions
  1. 12 0
      .idea/dataSources.xml
  2. 13 0
      .idea/libraries/Maven__com_alibaba_fastjson_1_2_74.xml
  3. 13 0
      .idea/libraries/Maven__com_auth0_java_jwt_3_8_1.xml
  4. 13 0
      .idea/libraries/Maven__commons_codec_commons_codec_1_14.xml
  5. 13 0
      .idea/libraries/Maven__io_lettuce_lettuce_core_5_3_4_RELEASE.xml
  6. 13 0
      .idea/libraries/Maven__io_netty_netty_buffer_4_1_52_Final.xml
  7. 13 0
      .idea/libraries/Maven__io_netty_netty_codec_4_1_52_Final.xml
  8. 13 0
      .idea/libraries/Maven__io_netty_netty_common_4_1_52_Final.xml
  9. 13 0
      .idea/libraries/Maven__io_netty_netty_handler_4_1_52_Final.xml
  10. 13 0
      .idea/libraries/Maven__io_netty_netty_resolver_4_1_52_Final.xml
  11. 13 0
      .idea/libraries/Maven__io_netty_netty_transport_4_1_52_Final.xml
  12. 13 0
      .idea/libraries/Maven__io_projectreactor_reactor_core_3_3_10_RELEASE.xml
  13. 13 0
      .idea/libraries/Maven__org_apache_commons_commons_pool2_2_8_1.xml
  14. 13 0
      .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_test_2_3_1.xml
  15. 13 0
      .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_test_autoconfigure_2_3_1.xml
  16. 13 0
      .idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml
  17. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_4_RELEASE.xml
  18. 13 0
      .idea/libraries/Maven__org_springframework_data_spring_data_commons_2_3_4_RELEASE.xml
  19. 13 0
      .idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_3_4_RELEASE.xml
  20. 13 0
      .idea/libraries/Maven__org_springframework_data_spring_data_redis_2_3_4_RELEASE.xml
  21. 13 0
      .idea/libraries/Maven__org_springframework_spring_context_support_5_2_9_RELEASE.xml
  22. 13 0
      .idea/libraries/Maven__org_springframework_spring_oxm_5_2_9_RELEASE.xml
  23. 13 0
      .idea/libraries/Maven__redis_clients_jedis_3_3_0.xml
  24. 87 0
      .idea/mybatisx/templates.xml
  25. 29 7
      java.iml
  26. 27 6
      java/pom.xml
  27. 19 0
      java/src/main/java/boot/common/interceptor/AuthCheck.java
  28. 140 0
      java/src/main/java/boot/common/interceptor/PermissionInterceptor.java
  29. 55 0
      java/src/main/java/boot/common/respond/ApiCode.java
  30. 231 0
      java/src/main/java/boot/common/respond/ApiResult.java
  31. 27 0
      java/src/main/java/boot/common/respond/EException.java
  32. 15 0
      java/src/main/java/boot/common/respond/UnAuthenticatedException.java
  33. 95 0
      java/src/main/java/boot/common/utils/JwtToken.java
  34. 406 0
      java/src/main/java/boot/common/utils/RedisUtils.java
  35. 18 0
      java/src/main/java/boot/modules/user/mapper/UserMapper.java
  36. 214 0
      java/src/main/java/boot/modules/user/pojo/User.java
  37. 13 0
      java/src/main/java/boot/modules/user/service/UserService.java
  38. 22 0
      java/src/main/java/boot/modules/user/service/impl/UserServiceImpl.java
  39. 1 1
      java/src/main/resources/application.yaml
  40. 40 0
      java/src/main/resources/mapper/UserMapper.xml

+ 12 - 0
.idea/dataSources.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
+    <data-source source="LOCAL" name="@localhost" uuid="efc5cd34-c160-43d7-ba1d-0171fad19297">
+      <driver-ref>mysql.8</driver-ref>
+      <synchronize>true</synchronize>
+      <jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
+      <jdbc-url>jdbc:mysql://localhost:3306</jdbc-url>
+      <working-dir>$ProjectFileDir$</working-dir>
+    </data-source>
+  </component>
+</project>

+ 13 - 0
.idea/libraries/Maven__com_alibaba_fastjson_1_2_74.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.alibaba:fastjson:1.2.74">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/com/alibaba/fastjson/1.2.74/fastjson-1.2.74.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/com/alibaba/fastjson/1.2.74/fastjson-1.2.74-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/com/alibaba/fastjson/1.2.74/fastjson-1.2.74-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_auth0_java_jwt_3_8_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.auth0:java-jwt:3.8.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/com/auth0/java-jwt/3.8.1/java-jwt-3.8.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/com/auth0/java-jwt/3.8.1/java-jwt-3.8.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/com/auth0/java-jwt/3.8.1/java-jwt-3.8.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__commons_codec_commons_codec_1_14.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: commons-codec:commons-codec:1.14">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/commons-codec/commons-codec/1.14/commons-codec-1.14.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/commons-codec/commons-codec/1.14/commons-codec-1.14-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/commons-codec/commons-codec/1.14/commons-codec-1.14-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_lettuce_lettuce_core_5_3_4_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.lettuce:lettuce-core:5.3.4.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/lettuce/lettuce-core/5.3.4.RELEASE/lettuce-core-5.3.4.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/lettuce/lettuce-core/5.3.4.RELEASE/lettuce-core-5.3.4.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/lettuce/lettuce-core/5.3.4.RELEASE/lettuce-core-5.3.4.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_netty_netty_buffer_4_1_52_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.netty:netty-buffer:4.1.52.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-buffer/4.1.52.Final/netty-buffer-4.1.52.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-buffer/4.1.52.Final/netty-buffer-4.1.52.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-buffer/4.1.52.Final/netty-buffer-4.1.52.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_netty_netty_codec_4_1_52_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.netty:netty-codec:4.1.52.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-codec/4.1.52.Final/netty-codec-4.1.52.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-codec/4.1.52.Final/netty-codec-4.1.52.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-codec/4.1.52.Final/netty-codec-4.1.52.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_netty_netty_common_4_1_52_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.netty:netty-common:4.1.52.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-common/4.1.52.Final/netty-common-4.1.52.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-common/4.1.52.Final/netty-common-4.1.52.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-common/4.1.52.Final/netty-common-4.1.52.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_netty_netty_handler_4_1_52_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.netty:netty-handler:4.1.52.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-handler/4.1.52.Final/netty-handler-4.1.52.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-handler/4.1.52.Final/netty-handler-4.1.52.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-handler/4.1.52.Final/netty-handler-4.1.52.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_netty_netty_resolver_4_1_52_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.netty:netty-resolver:4.1.52.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-resolver/4.1.52.Final/netty-resolver-4.1.52.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-resolver/4.1.52.Final/netty-resolver-4.1.52.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-resolver/4.1.52.Final/netty-resolver-4.1.52.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_netty_netty_transport_4_1_52_Final.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.netty:netty-transport:4.1.52.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-transport/4.1.52.Final/netty-transport-4.1.52.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-transport/4.1.52.Final/netty-transport-4.1.52.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/netty/netty-transport/4.1.52.Final/netty-transport-4.1.52.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.projectreactor:reactor-core:3.3.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/projectreactor/reactor-core/3.3.10.RELEASE/reactor-core-3.3.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/projectreactor/reactor-core/3.3.10.RELEASE/reactor-core-3.3.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/io/projectreactor/reactor-core/3.3.10.RELEASE/reactor-core-3.3.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_commons_commons_pool2_2_8_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.commons:commons-pool2:2.8.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/apache/commons/commons-pool2/2.8.1/commons-pool2-2.8.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/apache/commons/commons-pool2/2.8.1/commons-pool2-2.8.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/apache/commons/commons-pool2/2.8.1/commons-pool2-2.8.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_test_2_3_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.3.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/mybatis/spring/boot/mybatis-spring-boot-starter-test/2.3.1/mybatis-spring-boot-starter-test-2.3.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/mybatis/spring/boot/mybatis-spring-boot-starter-test/2.3.1/mybatis-spring-boot-starter-test-2.3.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/mybatis/spring/boot/mybatis-spring-boot-starter-test/2.3.1/mybatis-spring-boot-starter-test-2.3.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_test_autoconfigure_2_3_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-test-autoconfigure:2.3.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/mybatis/spring/boot/mybatis-spring-boot-test-autoconfigure/2.3.1/mybatis-spring-boot-test-autoconfigure-2.3.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/mybatis/spring/boot/mybatis-spring-boot-test-autoconfigure/2.3.1/mybatis-spring-boot-test-autoconfigure-2.3.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/mybatis/spring/boot/mybatis-spring-boot-test-autoconfigure/2.3.1/mybatis-spring-boot-test-autoconfigure-2.3.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.reactivestreams:reactive-streams:1.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_4_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.4.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/boot/spring-boot-starter-data-redis/2.3.4.RELEASE/spring-boot-starter-data-redis-2.3.4.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/boot/spring-boot-starter-data-redis/2.3.4.RELEASE/spring-boot-starter-data-redis-2.3.4.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/boot/spring-boot-starter-data-redis/2.3.4.RELEASE/spring-boot-starter-data-redis-2.3.4.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_data_spring_data_commons_2_3_4_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.data:spring-data-commons:2.3.4.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-commons/2.3.4.RELEASE/spring-data-commons-2.3.4.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-commons/2.3.4.RELEASE/spring-data-commons-2.3.4.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-commons/2.3.4.RELEASE/spring-data-commons-2.3.4.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_3_4_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.data:spring-data-keyvalue:2.3.4.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-keyvalue/2.3.4.RELEASE/spring-data-keyvalue-2.3.4.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-keyvalue/2.3.4.RELEASE/spring-data-keyvalue-2.3.4.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-keyvalue/2.3.4.RELEASE/spring-data-keyvalue-2.3.4.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_data_spring_data_redis_2_3_4_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.data:spring-data-redis:2.3.4.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-redis/2.3.4.RELEASE/spring-data-redis-2.3.4.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-redis/2.3.4.RELEASE/spring-data-redis-2.3.4.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/data/spring-data-redis/2.3.4.RELEASE/spring-data-redis-2.3.4.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_context_support_5_2_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-context-support:5.2.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/spring-context-support/5.2.9.RELEASE/spring-context-support-5.2.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/spring-context-support/5.2.9.RELEASE/spring-context-support-5.2.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/spring-context-support/5.2.9.RELEASE/spring-context-support-5.2.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_oxm_5_2_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-oxm:5.2.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/spring-oxm/5.2.9.RELEASE/spring-oxm-5.2.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/spring-oxm/5.2.9.RELEASE/spring-oxm-5.2.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/org/springframework/spring-oxm/5.2.9.RELEASE/spring-oxm-5.2.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__redis_clients_jedis_3_3_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: redis.clients:jedis:3.3.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/redis/clients/jedis/3.3.0/jedis-3.3.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/redis/clients/jedis/3.3.0/jedis-3.3.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../../apache-maven-3.8.8/maven/redis/clients/jedis/3.3.0/jedis-3.3.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 87 - 0
.idea/mybatisx/templates.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="TemplatesSettings">
+    <option name="templateConfigs">
+      <TemplateContext>
+        <option name="generateConfig">
+          <GenerateConfig>
+            <option name="annotationType" value="NONE" />
+            <option name="basePackage" value="user" />
+            <option name="basePath" value="src/main/java/boot/modules" />
+            <option name="classNameStrategy" value="camel" />
+            <option name="encoding" value="UTF-8" />
+            <option name="extraClassSuffix" value="" />
+            <option name="ignoreFieldPrefix" value="" />
+            <option name="ignoreFieldSuffix" value="" />
+            <option name="ignoreTablePrefix" value="" />
+            <option name="ignoreTableSuffix" value="" />
+            <option name="moduleName" value="java" />
+            <option name="modulePath" value="$PROJECT_DIR$/java/" />
+            <option name="moduleUIInfoList">
+              <list>
+                <ModuleInfoGo>
+                  <option name="basePath" value="${domain.basePath}" />
+                  <option name="configFileName" value="serviceImpl.ftl" />
+                  <option name="configName" value="serviceImpl" />
+                  <option name="encoding" value="${domain.encoding}" />
+                  <option name="fileName" value="${domain.fileName}ServiceImpl" />
+                  <option name="fileNameWithSuffix" value="${domain.fileName}ServiceImpl.java" />
+                  <option name="modulePath" value="$PROJECT_DIR$/java/" />
+                  <option name="packageName" value="${domain.basePackage}.service.impl" />
+                </ModuleInfoGo>
+                <ModuleInfoGo>
+                  <option name="basePath" value="${domain.basePath}" />
+                  <option name="configFileName" value="mapperInterface.ftl" />
+                  <option name="configName" value="mapperInterface" />
+                  <option name="encoding" value="${domain.encoding}" />
+                  <option name="fileName" value="${domain.fileName}Mapper" />
+                  <option name="fileNameWithSuffix" value="${domain.fileName}Mapper.java" />
+                  <option name="modulePath" value="$PROJECT_DIR$/java/" />
+                  <option name="packageName" value="${domain.basePackage}.mapper" />
+                </ModuleInfoGo>
+                <ModuleInfoGo>
+                  <option name="basePath" value="${domain.basePath}" />
+                  <option name="configFileName" value="serviceInterface.ftl" />
+                  <option name="configName" value="serviceInterface" />
+                  <option name="encoding" value="${domain.encoding}" />
+                  <option name="fileName" value="${domain.fileName}Service" />
+                  <option name="fileNameWithSuffix" value="${domain.fileName}Service.java" />
+                  <option name="modulePath" value="$PROJECT_DIR$/java/" />
+                  <option name="packageName" value="${domain.basePackage}.service" />
+                </ModuleInfoGo>
+                <ModuleInfoGo>
+                  <option name="basePath" value="src/main/resources" />
+                  <option name="configFileName" value="mapperXml.ftl" />
+                  <option name="configName" value="mapperXml" />
+                  <option name="encoding" value="${domain.encoding}" />
+                  <option name="fileName" value="${domain.fileName}Mapper" />
+                  <option name="fileNameWithSuffix" value="${domain.fileName}Mapper.xml" />
+                  <option name="modulePath" value="$PROJECT_DIR$/java/" />
+                  <option name="packageName" value="mapper" />
+                </ModuleInfoGo>
+              </list>
+            </option>
+            <option name="needToStringHashcodeEquals" value="true" />
+            <option name="needsComment" value="true" />
+            <option name="needsModel" value="true" />
+            <option name="relativePackage" value="pojo" />
+            <option name="superClass" value="" />
+            <option name="tableUIInfoList">
+              <list>
+                <TableUIInfo>
+                  <option name="className" value="User" />
+                  <option name="tableName" value="user" />
+                </TableUIInfo>
+              </list>
+            </option>
+            <option name="templatesName" value="mybatis-plus3" />
+            <option name="useLombokPlugin" value="true" />
+          </GenerateConfig>
+        </option>
+        <option name="moduleName" value="java" />
+        <option name="projectPath" value="$PROJECT_DIR$" />
+        <option name="templateName" value="mybatis-plus3" />
+      </TemplateContext>
+    </option>
+  </component>
+</project>

+ 29 - 7
java.iml

@@ -26,7 +26,10 @@
     <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.16" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: redis.clients:jedis:3.3.0" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.8.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
@@ -36,13 +39,37 @@
     <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
     <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
     <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.3.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.3.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.3.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.3.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.52.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.52.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.52.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.52.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.52.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.52.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.10.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.74" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-codec:commons-codec:1.14" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.3.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.9.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.3.1" level="project" />
     <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.13" level="project" />
     <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.1.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-test-autoconfigure:2.3.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.1" level="project" />
@@ -53,9 +80,6 @@
     <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.28" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.4.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.4.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.2" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.2" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.2" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.2" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.2" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.2" level="project" />
@@ -66,7 +90,6 @@
     <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.9.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.9.RELEASE" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.3.4.RELEASE" level="project" />
@@ -80,7 +103,6 @@
     <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />

+ 27 - 6
java/pom.xml

@@ -22,18 +22,39 @@
             <version>5.8.16</version>
         </dependency>
 
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.74</version>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.8.1</version>
+        </dependency>
+
 
         <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
             <version>2.3.1</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.mybatis.spring.boot</groupId>-->
-<!--            <artifactId>mybatis-spring-boot-starter-test</artifactId>-->
-<!--            <version>2.3.1</version>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter-test</artifactId>
+            <version>2.3.1</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>

+ 19 - 0
java/src/main/java/boot/common/interceptor/AuthCheck.java

@@ -0,0 +1,19 @@
+
+package boot.common.interceptor;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @ClassName 自定义权限注解
+ * @Author zhonghui
+ * @Date 2020/4/30
+ **/
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AuthCheck {
+    int value() default 4;
+}

+ 140 - 0
java/src/main/java/boot/common/interceptor/PermissionInterceptor.java

@@ -0,0 +1,140 @@
+
+package boot.common.interceptor;
+
+
+
+import boot.common.respond.ApiCode;
+import boot.common.respond.UnAuthenticatedException;
+import boot.common.utils.JwtToken;
+import boot.common.utils.RedisUtils;
+import com.auth0.jwt.interfaces.Claim;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 权限拦截器
+ * @author zhonghui
+ * @date 2020-04-30
+ */
+public class PermissionInterceptor extends HandlerInterceptorAdapter {
+
+//    @Autowired
+//    private UserService userService;
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    public PermissionInterceptor() {
+        super();
+    }
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        Optional<AuthCheck> authCheck = this.getAuthCheck(handler);
+        //如果没有在方法(接口方法上)上注释 @AuthCheck 就会直接放行,不进行权限检查
+        if (!authCheck.isPresent()) {
+            return true;
+        }
+
+        //获取请求头中的 Token,没有就抛异常 “401, "非法访问"
+        String bearerToken = request.getHeader("Authorization");
+        if (StringUtils.isEmpty(bearerToken)) {
+            throw new UnAuthenticatedException(ApiCode.UNAUTHORIZED);
+        }
+
+        if (!bearerToken.startsWith("Bearer")) {
+            throw new UnAuthenticatedException(ApiCode.UNAUTHORIZED);
+        }
+        //根据Token以空格来进行分离 Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInVOYW1lIjoiMTM0MTExMTExMTEiLCJzY29wZSI6OCwiZXhwIjoxNzg5MjY5MDI2LCJpYXQiOjE3MDI4NjkwMjZ9.brwajljjhr4LYi9kh9lDKvtQsbfrFaDU30lYx5Min9Y
+        String[] tokens = bearerToken.split(" ");
+        if (!(tokens.length == 2)) {
+            throw new UnAuthenticatedException(ApiCode.UNAUTHORIZED);
+        }
+        //分离后的数组第一个是 Bearer,第二个是该用户的 Token
+        String token = tokens[1];
+
+        //用于验证并提取JWT中的声明(Claims)
+        Optional<Map<String, Claim>> optionalMap = JwtToken.getClaims(token);
+        //获取每一个值 如果为空直接抛异常
+        Map<String, Claim> map = optionalMap
+                .orElseThrow(() -> new UnAuthenticatedException(ApiCode.UNAUTHORIZED));
+
+        String uName = map.get("uName").asString();
+
+        //检测用户是否被踢出
+        if (redisUtils.get(ShopConstants.YSHOP_APP_LOGIN_USER + uName + ":" + token) == null) {
+            throw new UnAuthenticatedException(ApiCode.UNAUTHORIZED);
+        }
+        //
+        boolean valid = this.hasPermission(authCheck.get(), map);
+        if(valid){
+            this.setToThreadLocal(map);
+        }
+        return valid;
+    }
+
+    /**
+     * 如果权限验证通过的情况下 将相关信息存储在线程本地
+     * @param map
+     */
+    private void setToThreadLocal(Map<String,Claim> map) {
+        Integer uid = map.get("uid").asInt();
+        Integer scope = map.get("scope").asInt();
+        ShopUser user = userService.getById(uid);
+        if(user == null) {
+            throw new UnAuthenticatedException(ApiCode.NOT_PERMISSION);
+        }
+        LocalUser.set(user, scope);
+//        System.out.println(LocalUser.getUser());
+    }
+
+    /**
+     * 验证传入的权限级别是否与 "scope" 的值匹配
+     * @param authCheck
+     * @param map
+     * @return
+     */
+    private boolean hasPermission(AuthCheck authCheck, Map<String, Claim> map) {
+        //获取注解上的 value 值
+        Integer level = authCheck.value();
+        Integer scope = map.get("scope").asInt();
+        if (level > scope) {
+            throw new UnAuthenticatedException(ApiCode.NOT_PERMISSION);
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        super.postHandle(request, response, handler, modelAndView);
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        LocalUser.clear();
+        super.afterCompletion(request, response, handler, ex);
+    }
+
+    private Optional<AuthCheck> getAuthCheck(Object handler) {
+        //先检查它的类型,以确保安全地访问其属性或方法。
+        if (handler instanceof HandlerMethod) {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;
+            // 获取方法上的注解信息 是否添加了 @AuthCheck 注解
+            AuthCheck authCheck = handlerMethod.getMethod().getAnnotation(AuthCheck.class);
+            if (authCheck == null) {
+                return Optional.empty();
+            }
+            return Optional.of(authCheck);
+        }
+        return Optional.empty();
+    }
+
+}

+ 55 - 0
java/src/main/java/boot/common/respond/ApiCode.java

@@ -0,0 +1,55 @@
+package boot.common.respond;
+
+public enum ApiCode {
+    SUCCESS(200, "操作成功"),
+    UNAUTHORIZED(401, "非法访问"),
+    NOT_PERMISSION(403, "没有权限"),
+    NOT_FOUND(404, "你请求的资源不存在"),
+    FAIL(500, "操作失败"),
+    LOGIN_EXCEPTION(4000, "登录失败"),
+    SYSTEM_EXCEPTION(5000, "系统异常"),
+    PARAMETER_EXCEPTION(5001, "请求参数校验异常"),
+    PARAMETER_PARSE_EXCEPTION(5002, "请求参数解析异常"),
+    HTTP_MEDIA_TYPE_EXCEPTION(5003, "HTTP内容类型异常"),
+    YSHOP_SYSTEM_EXCEPTION(5100, "系统处理异常"),
+    BUSINESS_EXCEPTION(5101, "业务处理异常"),
+    DAO_EXCEPTION(5102, "数据库处理异常"),
+    VERIFICATION_CODE_EXCEPTION(5103, "验证码校验异常"),
+    AUTHENTICATION_EXCEPTION(5104, "登录授权异常"),
+    UNAUTHENTICATED_EXCEPTION(5105, "没有访问权限"),
+    UNAUTHORIZED_EXCEPTION(5106, "没有访问权限"),
+    JWTDECODE_EXCEPTION(5107, "Token解析异常"),
+    HTTP_REQUEST_METHOD_NOT_SUPPORTED_EXCEPTION(5108, "METHOD NOT SUPPORTED"),
+    BAD_LIMIT_EXCEPTION(5109, "访问次数受限制");
+
+    private final int code;
+    private final String message;
+
+    private ApiCode(final int code, final String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public static ApiCode getApiCode(int code) {
+        ApiCode[] ecs = values();
+        ApiCode[] var2 = ecs;
+        int var3 = ecs.length;
+
+        for(int var4 = 0; var4 < var3; ++var4) {
+            ApiCode ec = var2[var4];
+            if (ec.getCode() == code) {
+                return ec;
+            }
+        }
+
+        return SUCCESS;
+    }
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+}

+ 231 - 0
java/src/main/java/boot/common/respond/ApiResult.java

@@ -0,0 +1,231 @@
+package boot.common.respond;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@EqualsAndHashCode
+public class ApiResult<T> implements Serializable {
+    private static final long serialVersionUID = 8004487252556526569L;
+//    @ApiModelProperty("响应码")
+    private int status;
+//    @ApiModelProperty("是否成功:成功true,失败false")
+    private boolean success;
+//    @ApiModelProperty("响应消息")
+    private String msg;
+//    @ApiModelProperty("响应数据")
+    private T data;
+//    @ApiModelProperty("响应时间")
+    @JSONField(
+            format = "yyyy-MM-dd HH:mm:ss"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss",
+            timezone = "GMT+8"
+    )
+    private Date time;
+
+    public ApiResult() {
+        this.time = new Date();
+    }
+
+    public static ApiResult<Boolean> result(boolean flag) {
+        return flag ? ok() : fail();
+    }
+
+    public static ApiResult<Boolean> result(ApiCode apiCode) {
+        return result(apiCode, (Boolean) null);
+    }
+
+    public static <T> ApiResult<T> result(ApiCode apiCode, T data) {
+        return result(apiCode, (String)null, data);
+    }
+
+    public static <T> ApiResult<T> result(ApiCode apiCode, String message, T data) {
+        boolean success = false;
+        if (apiCode.getCode() == ApiCode.SUCCESS.getCode()) {
+            success = true;
+        }
+
+        if (StringUtils.isBlank(message)) {
+            message = apiCode.getMessage();
+        }
+
+        return (ApiResult<T>) ApiResult.builder().status(apiCode.getCode()).msg(message).data(data).success(success).time(new Date()).build();
+    }
+
+    public static ApiResult<Boolean> ok() {
+        return ok((Boolean)null);
+    }
+
+    public static <T> ApiResult<T> ok(T data) {
+        return result(ApiCode.SUCCESS, data);
+    }
+
+    public static <T> ApiResult<T> ok(T data, String message) {
+        return result(ApiCode.SUCCESS, message, data);
+    }
+
+    public static ApiResult<Map<String, Object>> okMap(String key, Object value) {
+        Map<String, Object> map = new HashMap(1);
+        map.put(key, value);
+        return ok(map);
+    }
+
+    public static ApiResult<Boolean> fail(ApiCode apiCode) {
+        return result(apiCode, (Boolean) null);
+    }
+
+    public static ApiResult<String> fail(String message) {
+        return result(ApiCode.FAIL, message, (String) null);
+    }
+
+    public static <T> ApiResult<T> fail(ApiCode apiCode, T data) {
+        if (ApiCode.SUCCESS == apiCode) {
+            throw new RuntimeException("失败结果状态码不能为" + ApiCode.SUCCESS.getCode());
+        } else {
+            return result(apiCode, data);
+        }
+    }
+
+    public static ApiResult<String> fail(Integer errorCode, String message) {
+        return new ApiResult().setSuccess(false).setStatus(errorCode).setMsg(message);
+    }
+
+    public static ApiResult<Map<String, Object>> fail(String key, Object value) {
+        Map<String, Object> map = new HashMap(1);
+        map.put(key, value);
+        return result(ApiCode.FAIL, map);
+    }
+
+    public static ApiResult<Boolean> fail() {
+        return fail(ApiCode.FAIL);
+    }
+
+    public static <T> ApiResultBuilder<T> builder() {
+        return new ApiResultBuilder<>();
+    }
+
+    public int getStatus() {
+        return this.status;
+    }
+
+    public boolean isSuccess() {
+        return this.success;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    public T getData() {
+        return this.data;
+    }
+
+    public Date getTime() {
+        return this.time;
+    }
+
+    public ApiResult<T> setStatus(final int status) {
+        this.status = status;
+        return this;
+    }
+
+    public ApiResult<T> setSuccess(final boolean success) {
+        this.success = success;
+        return this;
+    }
+
+    public ApiResult<T> setMsg(final String msg) {
+        this.msg = msg;
+        return this;
+    }
+
+    public ApiResult<T> setData(final T data) {
+        this.data = data;
+        return this;
+    }
+
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss",
+            timezone = "GMT+8"
+    )
+    public ApiResult<T> setTime(final Date time) {
+        this.time = time;
+        return this;
+    }
+
+
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof ApiResult;
+    }
+
+
+    public String toString() {
+        return "ApiResult(status=" + this.getStatus() + ", success=" + this.isSuccess() + ", msg=" + this.getMsg() + ", data=" + this.getData() + ", time=" + this.getTime() + ")";
+    }
+
+    public ApiResult(final int status, final boolean success, final String msg, final T data, final Date time) {
+        this.status = status;
+        this.success = success;
+        this.msg = msg;
+        this.data = data;
+        this.time = time;
+    }
+
+    public static class ApiResultBuilder<T> {
+        private int status;
+        private boolean success;
+        private String msg;
+        private T data;
+        private Date time;
+
+        ApiResultBuilder() {
+        }
+
+        public ApiResultBuilder<T> status(final int status) {
+            this.status = status;
+            return this;
+        }
+
+        public ApiResultBuilder<T> success(final boolean success) {
+            this.success = success;
+            return this;
+        }
+
+        public ApiResultBuilder<T> msg(final String msg) {
+            this.msg = msg;
+            return this;
+        }
+
+        public ApiResultBuilder<T> data(final T data) {
+            this.data = data;
+            return this;
+        }
+
+        @JsonFormat(
+                pattern = "yyyy-MM-dd HH:mm:ss",
+                timezone = "GMT+8"
+        )
+        public ApiResultBuilder<T> time(final Date time) {
+            this.time = time;
+            return this;
+        }
+
+        public ApiResult<T> build() {
+            return new ApiResult(this.status, this.success, this.msg, this.data, this.time);
+        }
+
+        public String toString() {
+            return "ApiResult.ApiResultBuilder(status=" + this.status + ", success=" + this.success + ", msg=" + this.msg + ", data=" + this.data + ", time=" + this.time + ")";
+        }
+    }
+}

+ 27 - 0
java/src/main/java/boot/common/respond/EException.java

@@ -0,0 +1,27 @@
+package boot.common.respond;
+
+public class EException extends RuntimeException {
+    private static final long serialVersionUID = -2470461654663264392L;
+    private Integer errorCode;
+    private String message;
+
+    public EException() {
+    }
+
+    public EException(String message) {
+        super(message);
+        this.message = message;
+    }
+
+    public EException(Integer errorCode, String message) {
+        super(message);
+        this.errorCode = errorCode;
+        this.message = message;
+    }
+
+    public EException(ApiCode apiCode) {
+        super(apiCode.getMessage());
+        this.errorCode = apiCode.getCode();
+        this.message = apiCode.getMessage();
+    }
+}

+ 15 - 0
java/src/main/java/boot/common/respond/UnAuthenticatedException.java

@@ -0,0 +1,15 @@
+package boot.common.respond;
+
+public class UnAuthenticatedException extends EException {
+    public UnAuthenticatedException(String message) {
+        super(message);
+    }
+
+    public UnAuthenticatedException(Integer errorCode, String message) {
+        super(errorCode, message);
+    }
+
+    public UnAuthenticatedException(ApiCode apiCode) {
+        super(apiCode);
+    }
+}

+ 95 - 0
java/src/main/java/boot/common/utils/JwtToken.java

@@ -0,0 +1,95 @@
+package boot.common.utils;
+
+import cn.hutool.core.date.DateUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+@Component
+public class JwtToken {
+
+    private static String jwtKey;
+    private static Integer expiredTimeIn;
+    private static Integer defaultScope = 8;
+
+    @Value("${eshop.security.jwt-key}")
+    public void setJwtKey(String jwtKey) {
+        JwtToken.jwtKey = jwtKey;
+    }
+
+    @Value("${eshop.security.token-expired-in}")
+    public void setExpiredTimeIn(Integer expiredTimeIn) {
+        JwtToken.expiredTimeIn = expiredTimeIn;
+    }
+
+    public static Optional<Map<String, Claim>> getClaims(String token) {
+        //存储解码后的JWT
+        DecodedJWT decodedJWT;
+        //创建一个算法对象algorithm,使用HMAC 256加密算法和JwtToken.jwtKey作为密钥
+        Algorithm algorithm = Algorithm.HMAC256(JwtToken.jwtKey);
+        //JWT.require(algorithm)指定了需要使用的算法(在本例中是HMAC 256)。这告诉JWTVerifier对象应该使用哪种算法来验证JWT。
+        //.build()方法构建并返回一个JWTVerifier对象,该对象准备好用于验证JWT。
+        JWTVerifier jwtVerifier = JWT.require(algorithm).build();
+        try {
+            //使用jwtVerifier验证输入的token,并将解码后的JWT存储在decodedJWT变量中。
+            decodedJWT = jwtVerifier.verify(token);
+        } catch (JWTVerificationException e) {
+            return Optional.empty();
+        }
+        return Optional.of(decodedJWT.getClaims());
+    }
+
+    public static Boolean verifyToken(String token) {
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(JwtToken.jwtKey);
+            JWTVerifier verifier = JWT.require(algorithm).build();
+            verifier.verify(token);
+        } catch (JWTVerificationException e) {
+            return false;
+        }
+        return true;
+    }
+
+    public static String getExpireTime(String token) {
+        return DateUtil.formatDateTime(JWT.decode(token).getExpiresAt());
+    }
+
+
+    public static String makeToken(Long uid, String uName, Integer scope) {
+        return JwtToken.getToken(uid, uName, scope);
+    }
+
+    public static String makeToken(Long uid, String uName) {
+        return JwtToken.getToken(uid, uName, JwtToken.defaultScope);
+    }
+
+    private static String getToken(Long uid, String uName, Integer scope) {
+        Algorithm algorithm = Algorithm.HMAC256(JwtToken.jwtKey);
+        Map<String, Date> map = JwtToken.calculateExpiredIssues();
+
+        return JWT.create()
+                .withClaim("uid", uid)
+                .withClaim("scope", scope)
+                .withClaim("uName", uName)
+                .withExpiresAt(map.get("expiredTime"))
+                .withIssuedAt(map.get("now"))
+                .sign(algorithm);
+    }
+
+    private static Map<String, Date> calculateExpiredIssues() {
+        Map<String, Date> map = new HashMap<>();
+        Calendar calendar = Calendar.getInstance();
+        Date now = calendar.getTime();
+        calendar.add(Calendar.SECOND, JwtToken.expiredTimeIn);
+        map.put("now", now);
+        map.put("expiredTime", calendar.getTime());
+        return map;
+    }
+}

+ 406 - 0
java/src/main/java/boot/common/utils/RedisUtils.java

@@ -0,0 +1,406 @@
+package boot.common.utils;
+
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.Cursor;
+import org.springframework.data.redis.core.RedisConnectionUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ScanOptions;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+@Component
+public class RedisUtils {
+    private RedisTemplate<Object, Object> redisTemplate;
+    @Value("${jwt.online-key}")
+    private String onlineKey;
+
+    public RedisUtils(RedisTemplate<Object, Object> redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0L) {
+                this.redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+
+            return true;
+        } catch (Exception var5) {
+            var5.printStackTrace();
+            return false;
+        }
+    }
+
+    public long getExpire(Object key) {
+        return this.redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    public List<String> scan(String pattern) {
+        ScanOptions options = ScanOptions.scanOptions().match(pattern).build();
+        RedisConnectionFactory factory = this.redisTemplate.getConnectionFactory();
+        RedisConnection rc = ((RedisConnectionFactory)Objects.requireNonNull(factory)).getConnection();
+        Cursor<byte[]> cursor = rc.scan(options);
+        List<String> result = new ArrayList();
+
+        while(cursor.hasNext()) {
+            result.add(new String((byte[])cursor.next()));
+        }
+
+        try {
+            RedisConnectionUtils.releaseConnection(rc, factory);
+        } catch (Exception var8) {
+            var8.printStackTrace();
+        }
+
+        return result;
+    }
+
+    public List<String> findKeysForPage(String patternKey, int page, int size) {
+        ScanOptions options = ScanOptions.scanOptions().match(patternKey).build();
+        RedisConnectionFactory factory = this.redisTemplate.getConnectionFactory();
+        RedisConnection rc = ((RedisConnectionFactory)Objects.requireNonNull(factory)).getConnection();
+        Cursor<byte[]> cursor = rc.scan(options);
+        List<String> result = new ArrayList(size);
+        int tmpIndex = 0;
+        int fromIndex = page * size;
+        int toIndex = page * size + size;
+
+        while(cursor.hasNext()) {
+            if (tmpIndex >= fromIndex && tmpIndex < toIndex) {
+                result.add(new String((byte[])cursor.next()));
+                ++tmpIndex;
+            } else {
+                if (tmpIndex >= toIndex) {
+                    break;
+                }
+
+                ++tmpIndex;
+                cursor.next();
+            }
+        }
+
+        try {
+            RedisConnectionUtils.releaseConnection(rc, factory);
+        } catch (Exception var13) {
+            var13.printStackTrace();
+        }
+
+        return result;
+    }
+
+    public boolean hasKey(String key) {
+        try {
+            return this.redisTemplate.hasKey(key);
+        } catch (Exception var3) {
+            var3.printStackTrace();
+            return false;
+        }
+    }
+
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                this.redisTemplate.delete(key[0]);
+            } else {
+                this.redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+
+    }
+
+    public Object get(String key) {
+        return key == null ? null : this.redisTemplate.opsForValue().get(key);
+    }
+
+    public String getY(String key) {
+        return key != null && this.redisTemplate.hasKey(key) ? this.redisTemplate.opsForValue().get(key).toString() : "";
+    }
+
+    public List<Object> multiGet(List<String> keys) {
+        Object obj = this.redisTemplate.opsForValue().multiGet(Collections.singleton(keys));
+        return null;
+    }
+
+    public boolean set(String key, Object value) {
+        try {
+            this.redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0L) {
+                this.redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                this.set(key, value);
+            }
+
+            return true;
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean set(String key, Object value, long time, TimeUnit timeUnit) {
+        try {
+            if (time > 0L) {
+                this.redisTemplate.opsForValue().set(key, value, time, timeUnit);
+            } else {
+                this.set(key, value);
+            }
+
+            return true;
+        } catch (Exception var7) {
+            var7.printStackTrace();
+            return false;
+        }
+    }
+
+    public Object hget(String key, String item) {
+        return this.redisTemplate.opsForHash().get(key, item);
+    }
+
+    public Map<Object, Object> hmget(String key) {
+        return this.redisTemplate.opsForHash().entries(key);
+    }
+
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            this.redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            this.redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0L) {
+                this.expire(key, time);
+            }
+
+            return true;
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean hset(String key, String item, Object value) {
+        try {
+            this.redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception var5) {
+            var5.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            this.redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0L) {
+                this.expire(key, time);
+            }
+
+            return true;
+        } catch (Exception var7) {
+            var7.printStackTrace();
+            return false;
+        }
+    }
+
+    public void hdel(String key, Object... item) {
+        this.redisTemplate.opsForHash().delete(key, item);
+    }
+
+    public boolean hHasKey(String key, String item) {
+        return this.redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    public double hincr(String key, String item, double by) {
+        return this.redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    public double hdecr(String key, String item, double by) {
+        return this.redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    public Set<Object> sGet(String key) {
+        try {
+            return this.redisTemplate.opsForSet().members(key);
+        } catch (Exception var3) {
+            var3.printStackTrace();
+            return null;
+        }
+    }
+
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return this.redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return false;
+        }
+    }
+
+    public long sSet(String key, Object... values) {
+        try {
+            return this.redisTemplate.opsForSet().add(key, values);
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return 0L;
+        }
+    }
+
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = this.redisTemplate.opsForSet().add(key, values);
+            if (time > 0L) {
+                this.expire(key, time);
+            }
+
+            return count;
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return 0L;
+        }
+    }
+
+    public long sGetSetSize(String key) {
+        try {
+            return this.redisTemplate.opsForSet().size(key);
+        } catch (Exception var3) {
+            var3.printStackTrace();
+            return 0L;
+        }
+    }
+
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = this.redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return 0L;
+        }
+    }
+
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return this.redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception var7) {
+            var7.printStackTrace();
+            return null;
+        }
+    }
+
+    public long lGetListSize(String key) {
+        try {
+            return this.redisTemplate.opsForList().size(key);
+        } catch (Exception var3) {
+            var3.printStackTrace();
+            return 0L;
+        }
+    }
+
+    public Object lGetIndex(String key, long index) {
+        try {
+            return this.redisTemplate.opsForList().index(key, index);
+        } catch (Exception var5) {
+            var5.printStackTrace();
+            return null;
+        }
+    }
+
+    public boolean lSet(String key, Object value) {
+        try {
+            this.redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            this.redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0L) {
+                this.expire(key, time);
+            }
+
+            return true;
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            this.redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            this.redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0L) {
+                this.expire(key, time);
+            }
+
+            return true;
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return false;
+        }
+    }
+
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            this.redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return false;
+        }
+    }
+
+    public long lRemove(String key, long count, Object value) {
+        try {
+            return this.redisTemplate.opsForList().remove(key, count, value);
+        } catch (Exception var6) {
+            var6.printStackTrace();
+            return 0L;
+        }
+    }
+}
+

+ 18 - 0
java/src/main/java/boot/modules/user/mapper/UserMapper.java

@@ -0,0 +1,18 @@
+package boot.modules.user.mapper;
+
+import boot.modules.user.pojo.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Lin
+* @description 针对表【user(用户表)】的数据库操作Mapper
+* @createDate 2024-05-29 23:44:49
+* @Entity user.pojo.User
+*/
+public interface UserMapper extends BaseMapper<User> {
+
+}
+
+
+
+

+ 214 - 0
java/src/main/java/boot/modules/user/pojo/User.java

@@ -0,0 +1,214 @@
+package boot.modules.user.pojo;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 用户表
+ * @TableName user
+ */
+@Data
+public class User implements Serializable {
+    /**
+     * 用户id
+     */
+    private Long uid;
+
+    /**
+     * 用户账户(跟accout一样)
+     */
+    private String username;
+
+    /**
+     * 用户密码(跟pwd)
+     */
+    private String password;
+
+    /**
+     * 真实姓名
+     */
+    private String realName;
+
+    /**
+     * 生日
+     */
+    private Integer birthday;
+
+    /**
+     * 身份证号码
+     */
+    private String cardId;
+
+    /**
+     * 用户备注
+     */
+    private String mark;
+
+    /**
+     * 用户分组id
+     */
+    private Integer groupId;
+
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+
+    /**
+     * 用户头像
+     */
+    private String avatar;
+
+    /**
+     * 手机号码
+     */
+    private String phone;
+
+    /**
+     * 添加ip
+     */
+    private String addIp;
+
+    /**
+     * 添加时间
+     */
+    private Date createTime;
+
+    /**
+     * 最后一次登录时间
+     */
+    private Date updateTime;
+
+    /**
+     * 最后一次登录ip
+     */
+    private String lastIp;
+
+    /**
+     * 1为正常,0为禁止
+     */
+    private Integer status;
+
+    /**
+     * 等级
+     */
+    private Integer level;
+
+    /**
+     * 下级人数
+     */
+    private Integer spreadCount;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 用户登陆类型,h5,wechat,routine
+     */
+    private String loginType;
+
+    /**
+     * 
+     */
+    private Integer isDel;
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        User other = (User) that;
+        return (this.getUid() == null ? other.getUid() == null : this.getUid().equals(other.getUid()))
+            && (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))
+            && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()))
+            && (this.getRealName() == null ? other.getRealName() == null : this.getRealName().equals(other.getRealName()))
+            && (this.getBirthday() == null ? other.getBirthday() == null : this.getBirthday().equals(other.getBirthday()))
+            && (this.getCardId() == null ? other.getCardId() == null : this.getCardId().equals(other.getCardId()))
+            && (this.getMark() == null ? other.getMark() == null : this.getMark().equals(other.getMark()))
+            && (this.getGroupId() == null ? other.getGroupId() == null : this.getGroupId().equals(other.getGroupId()))
+            && (this.getNickname() == null ? other.getNickname() == null : this.getNickname().equals(other.getNickname()))
+            && (this.getAvatar() == null ? other.getAvatar() == null : this.getAvatar().equals(other.getAvatar()))
+            && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
+            && (this.getAddIp() == null ? other.getAddIp() == null : this.getAddIp().equals(other.getAddIp()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
+            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))
+            && (this.getLastIp() == null ? other.getLastIp() == null : this.getLastIp().equals(other.getLastIp()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getLevel() == null ? other.getLevel() == null : this.getLevel().equals(other.getLevel()))
+            && (this.getSpreadCount() == null ? other.getSpreadCount() == null : this.getSpreadCount().equals(other.getSpreadCount()))
+            && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress()))
+            && (this.getLoginType() == null ? other.getLoginType() == null : this.getLoginType().equals(other.getLoginType()))
+            && (this.getIsDel() == null ? other.getIsDel() == null : this.getIsDel().equals(other.getIsDel()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getUid() == null) ? 0 : getUid().hashCode());
+        result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());
+        result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());
+        result = prime * result + ((getRealName() == null) ? 0 : getRealName().hashCode());
+        result = prime * result + ((getBirthday() == null) ? 0 : getBirthday().hashCode());
+        result = prime * result + ((getCardId() == null) ? 0 : getCardId().hashCode());
+        result = prime * result + ((getMark() == null) ? 0 : getMark().hashCode());
+        result = prime * result + ((getGroupId() == null) ? 0 : getGroupId().hashCode());
+        result = prime * result + ((getNickname() == null) ? 0 : getNickname().hashCode());
+        result = prime * result + ((getAvatar() == null) ? 0 : getAvatar().hashCode());
+        result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
+        result = prime * result + ((getAddIp() == null) ? 0 : getAddIp().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
+        result = prime * result + ((getLastIp() == null) ? 0 : getLastIp().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getLevel() == null) ? 0 : getLevel().hashCode());
+        result = prime * result + ((getSpreadCount() == null) ? 0 : getSpreadCount().hashCode());
+        result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode());
+        result = prime * result + ((getLoginType() == null) ? 0 : getLoginType().hashCode());
+        result = prime * result + ((getIsDel() == null) ? 0 : getIsDel().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", uid=").append(uid);
+        sb.append(", username=").append(username);
+        sb.append(", password=").append(password);
+        sb.append(", realName=").append(realName);
+        sb.append(", birthday=").append(birthday);
+        sb.append(", cardId=").append(cardId);
+        sb.append(", mark=").append(mark);
+        sb.append(", groupId=").append(groupId);
+        sb.append(", nickname=").append(nickname);
+        sb.append(", avatar=").append(avatar);
+        sb.append(", phone=").append(phone);
+        sb.append(", addIp=").append(addIp);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", lastIp=").append(lastIp);
+        sb.append(", status=").append(status);
+        sb.append(", level=").append(level);
+        sb.append(", spreadCount=").append(spreadCount);
+        sb.append(", address=").append(address);
+        sb.append(", loginType=").append(loginType);
+        sb.append(", isDel=").append(isDel);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 13 - 0
java/src/main/java/boot/modules/user/service/UserService.java

@@ -0,0 +1,13 @@
+package boot.modules.user.service;
+
+import boot.modules.user.pojo.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Lin
+* @description 针对表【user(用户表)】的数据库操作Service
+* @createDate 2024-05-29 23:44:49
+*/
+public interface UserService extends IService<User> {
+
+}

+ 22 - 0
java/src/main/java/boot/modules/user/service/impl/UserServiceImpl.java

@@ -0,0 +1,22 @@
+package boot.modules.user.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import boot.modules.user.pojo.User;
+import boot.modules.user.service.UserService;
+import boot.modules.user.mapper.UserMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Lin
+* @description 针对表【user(用户表)】的数据库操作Service实现
+* @createDate 2024-05-29 23:44:49
+*/
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User>
+    implements UserService{
+
+}
+
+
+
+

+ 1 - 1
java/src/main/resources/application.yaml

@@ -2,7 +2,7 @@ server:
   port: 8888
 spring:
   datasource:
-    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8
+    url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8
     driver-class-name: com.mysql.cj.jdbc.Driver
     username: root
     password: 13316814026

+ 40 - 0
java/src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="user.mapper.UserMapper">
+
+    <resultMap id="BaseResultMap" type="user.pojo.User">
+            <id property="uid" column="uid" jdbcType="BIGINT"/>
+            <result property="username" column="username" jdbcType="VARCHAR"/>
+            <result property="password" column="password" jdbcType="VARCHAR"/>
+            <result property="realName" column="real_name" jdbcType="VARCHAR"/>
+            <result property="birthday" column="birthday" jdbcType="INTEGER"/>
+            <result property="cardId" column="card_id" jdbcType="VARCHAR"/>
+            <result property="mark" column="mark" jdbcType="VARCHAR"/>
+            <result property="groupId" column="group_id" jdbcType="INTEGER"/>
+            <result property="nickname" column="nickname" jdbcType="VARCHAR"/>
+            <result property="avatar" column="avatar" jdbcType="VARCHAR"/>
+            <result property="phone" column="phone" jdbcType="CHAR"/>
+            <result property="addIp" column="add_ip" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="lastIp" column="last_ip" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="level" column="level" jdbcType="TINYINT"/>
+            <result property="spreadCount" column="spread_count" jdbcType="INTEGER"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="loginType" column="login_type" jdbcType="VARCHAR"/>
+            <result property="isDel" column="is_del" jdbcType="TINYINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        uid,username,password,
+        real_name,birthday,card_id,
+        mark,group_id,nickname,
+        avatar,phone,add_ip,
+        create_time,update_time,last_ip,
+        status,level,spread_count,
+        address,login_type,is_del
+    </sql>
+</mapper>