From 8923e878da9eb43e5454a0f308a86cb9059101bb Mon Sep 17 00:00:00 2001 From: liyuxin <1579178744@qq.com> Date: Mon, 22 Jul 2024 16:24:30 +0700 Subject: [PATCH] week1 --- .gitignore | 38 +++ .idea/.gitignore | 8 + .idea/encodings.xml | 7 + .idea/misc.xml | 14 + .idea/vcs.xml | 6 + pom.xml | 17 + 代码/h6_weekend01/.gitignore | 38 +++ 代码/h6_weekend01/.idea/.gitignore | 8 + 代码/h6_weekend01/.idea/encodings.xml | 22 ++ 代码/h6_weekend01/.idea/misc.xml | 20 ++ 代码/h6_weekend01/.idea/uiDesigner.xml | 124 +++++++ 代码/h6_weekend01/.idea/vcs.xml | 6 + 代码/h6_weekend01/bwie-auth/.gitignore | 38 +++ 代码/h6_weekend01/bwie-auth/pom.xml | 50 +++ .../java/com/bwie/auth/AuthApplication.java | 17 + .../com/bwie/auth/config/RabbitAdminConfig.java | 53 +++ .../bwie/auth/controller/AuthController.java | 41 +++ .../com/bwie/auth/feign/UserFeignService.java | 14 + .../feign/fusing/UserFeignServiceFsing.java | 19 ++ .../java/com/bwie/auth/service/AuthService.java | 14 + .../bwie/auth/service/impl/AuthServiceImpl.java | 82 +++++ .../main/java/com/bwie/auth/utils/DLXQueue.java | 77 +++++ .../java/com/bwie/auth/utils/DelayedQueue.java | 79 +++++ .../main/java/com/bwie/auth/utils/TtlQueue.java | 66 ++++ .../bwie-auth/src/main/resources/bootstrap.yml | 112 +++++++ 代码/h6_weekend01/bwie-common/.gitignore | 38 +++ 代码/h6_weekend01/bwie-common/pom.xml | 108 ++++++ .../com/bwie/common/constants/Constants.java | 18 + .../com/bwie/common/constants/JwtConstants.java | 29 ++ .../bwie/common/constants/QueueConstants.java | 15 + .../common/constants/RabbitMQOneConstants.java | 18 + .../common/constants/RabbitMQTwoConstants.java | 18 + .../bwie/common/constants/TokenConstants.java | 24 ++ .../java/com/bwie/common/domain/Bicycle.java | 17 + .../java/com/bwie/common/domain/Records.java | 28 ++ .../java/com/bwie/common/domain/Status.java | 10 + .../main/java/com/bwie/common/domain/Type.java | 11 + .../main/java/com/bwie/common/domain/User.java | 11 + .../common/domain/request/LoginRequest.java | 11 + .../common/domain/response/LoginResponse.java | 18 + .../common/handler/GlobalExceptionHandler.java | 39 +++ .../java/com/bwie/common/result/PageResult.java | 34 ++ .../java/com/bwie/common/result/Result.java | 76 +++++ .../java/com/bwie/common/utils/IpUtils.java | 312 ++++++++++++++++++ .../java/com/bwie/common/utils/JwtUtils.java | 109 ++++++ .../java/com/bwie/common/utils/StringUtils.java | 68 ++++ .../java/com/bwie/common/utils/TelSmsUtils.java | 88 +++++ 代码/h6_weekend01/bwie-gateway/.gitignore | 38 +++ 代码/h6_weekend01/bwie-gateway/pom.xml | 44 +++ .../com/bwie/gateway/GatewayApplication.java | 11 + .../bwie/gateway/config/IgnoreWhiteConfig.java | 29 ++ .../com/bwie/gateway/filters/AuthFilter.java | 60 ++++ .../com/bwie/gateway/utils/GatewayUtils.java | 95 ++++++ .../src/main/resources/bootstrap.yml | 29 ++ 代码/h6_weekend01/bwie-module/.gitignore | 38 +++ .../bwie-module/bwie-bicycle/.gitignore | 38 +++ .../bwie-module/bwie-bicycle/pom.xml | 69 ++++ .../com/bwie/xxxxxx/BicycleApplication.java | 11 + .../xxxxxx/controller/BicycleController.java | 96 ++++++ .../com/bwie/xxxxxx/mapper/BicycleMapper.java | 23 ++ .../com/bwie/xxxxxx/service/BicycleService.java | 23 ++ .../xxxxxx/service/impl/BicycleServiceImpl.java | 51 +++ .../src/main/resources/bootstrap.yml | 41 +++ .../src/main/resources/mapper/XXXmapper.xml | 48 +++ .../bwie-module/bwie-user/.gitignore | 38 +++ .../h6_weekend01/bwie-module/bwie-user/pom.xml | 62 ++++ .../java/com/bwie/user/UserApplication.java | 11 + .../bwie/user/controller/UserController.java | 22 ++ .../java/com/bwie/user/mapper/UserMapper.java | 9 + .../java/com/bwie/user/service/UserService.java | 7 + .../bwie/user/service/impl/UserServiceImpl.java | 19 ++ .../bwie-user/src/main/resources/bootstrap.yml | 29 ++ .../src/main/resources/mapper/UserMapper.xml | 10 + 代码/h6_weekend01/bwie-module/pom.xml | 87 +++++ 代码/h6_weekend01/pom.xml | 68 ++++ 代码/src/App.vue | 11 + 代码/src/api/bicycle.js | 52 +++ 代码/src/api/table.js | 9 + 代码/src/api/user.js | 24 ++ 代码/src/assets/404_images/404.png | Bin 0 -> 98071 bytes 代码/src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes 代码/src/components/Breadcrumb/index.vue | 78 +++++ 代码/src/components/Hamburger/index.vue | 44 +++ 代码/src/components/SvgIcon/index.vue | 62 ++++ 代码/src/icons/index.js | 9 + 代码/src/icons/svg/dashboard.svg | 1 + 代码/src/icons/svg/example.svg | 1 + 代码/src/icons/svg/eye-open.svg | 1 + 代码/src/icons/svg/eye.svg | 1 + 代码/src/icons/svg/form.svg | 1 + 代码/src/icons/svg/link.svg | 1 + 代码/src/icons/svg/nested.svg | 1 + 代码/src/icons/svg/password.svg | 1 + 代码/src/icons/svg/table.svg | 1 + 代码/src/icons/svg/tree.svg | 1 + 代码/src/icons/svg/user.svg | 1 + 代码/src/icons/svgo.yml | 22 ++ 代码/src/layout/components/AppMain.vue | 40 +++ 代码/src/layout/components/Navbar.vue | 139 ++++++++ .../src/layout/components/Sidebar/FixiOSBug.js | 26 ++ 代码/src/layout/components/Sidebar/Item.vue | 41 +++ 代码/src/layout/components/Sidebar/Link.vue | 43 +++ 代码/src/layout/components/Sidebar/Logo.vue | 82 +++++ .../layout/components/Sidebar/SidebarItem.vue | 95 ++++++ 代码/src/layout/components/Sidebar/index.vue | 56 ++++ 代码/src/layout/components/index.js | 3 + 代码/src/layout/index.vue | 93 ++++++ 代码/src/layout/mixin/ResizeHandler.js | 45 +++ 代码/src/main.js | 43 +++ 代码/src/permission.js | 64 ++++ 代码/src/router/index.js | 195 +++++++++++ 代码/src/settings.js | 16 + 代码/src/store/getters.js | 8 + 代码/src/store/index.js | 19 ++ 代码/src/store/modules/app.js | 48 +++ 代码/src/store/modules/settings.js | 32 ++ 代码/src/store/modules/user.js | 97 ++++++ 代码/src/styles/element-ui.scss | 49 +++ 代码/src/styles/index.scss | 65 ++++ 代码/src/styles/mixin.scss | 28 ++ 代码/src/styles/sidebar.scss | 226 +++++++++++++ 代码/src/styles/transition.scss | 48 +++ 代码/src/styles/variables.scss | 25 ++ 代码/src/utils/auth.js | 15 + 代码/src/utils/get-page-title.js | 10 + 代码/src/utils/index.js | 117 +++++++ 代码/src/utils/request.js | 85 +++++ 代码/src/utils/validate.js | 20 ++ 代码/src/views/404.vue | 228 +++++++++++++ 代码/src/views/bicycle/index.vue | 294 +++++++++++++++++ 代码/src/views/dashboard/index.vue | 30 ++ 代码/src/views/form/index.vue | 85 +++++ 代码/src/views/login/index.vue | 237 +++++++++++++ 代码/src/views/nested/menu1/index.vue | 7 + 代码/src/views/nested/menu1/menu1-1/index.vue | 7 + 代码/src/views/nested/menu1/menu1-2/index.vue | 7 + .../nested/menu1/menu1-2/menu1-2-1/index.vue | 5 + .../nested/menu1/menu1-2/menu1-2-2/index.vue | 5 + 代码/src/views/nested/menu1/menu1-3/index.vue | 5 + 代码/src/views/nested/menu2/index.vue | 5 + 代码/src/views/table/index.vue | 79 +++++ 代码/src/views/tree/index.vue | 78 +++++ 理论/img.png | Bin 0 -> 119862 bytes 143 files changed, 6443 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 代码/h6_weekend01/.gitignore create mode 100644 代码/h6_weekend01/.idea/.gitignore create mode 100644 代码/h6_weekend01/.idea/encodings.xml create mode 100644 代码/h6_weekend01/.idea/misc.xml create mode 100644 代码/h6_weekend01/.idea/uiDesigner.xml create mode 100644 代码/h6_weekend01/.idea/vcs.xml create mode 100644 代码/h6_weekend01/bwie-auth/.gitignore create mode 100644 代码/h6_weekend01/bwie-auth/pom.xml create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/AuthApplication.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/config/RabbitAdminConfig.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/controller/AuthController.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/UserFeignService.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/fusing/UserFeignServiceFsing.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/AuthService.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/impl/AuthServiceImpl.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DLXQueue.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DelayedQueue.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/TtlQueue.java create mode 100644 代码/h6_weekend01/bwie-auth/src/main/resources/bootstrap.yml create mode 100644 代码/h6_weekend01/bwie-common/.gitignore create mode 100644 代码/h6_weekend01/bwie-common/pom.xml create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/Constants.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/QueueConstants.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQOneConstants.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQTwoConstants.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Bicycle.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Records.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Status.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Type.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/User.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/response/LoginResponse.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/handler/GlobalExceptionHandler.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/PageResult.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/Result.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/IpUtils.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java create mode 100644 代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java create mode 100644 代码/h6_weekend01/bwie-gateway/.gitignore create mode 100644 代码/h6_weekend01/bwie-gateway/pom.xml create mode 100644 代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/GatewayApplication.java create mode 100644 代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java create mode 100644 代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java create mode 100644 代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java create mode 100644 代码/h6_weekend01/bwie-gateway/src/main/resources/bootstrap.yml create mode 100644 代码/h6_weekend01/bwie-module/.gitignore create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/.gitignore create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/pom.xml create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/BicycleApplication.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/controller/BicycleController.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/mapper/BicycleMapper.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/BicycleService.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/impl/BicycleServiceImpl.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/bootstrap.yml create mode 100644 代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/mapper/XXXmapper.xml create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/.gitignore create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/pom.xml create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/UserApplication.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/controller/UserController.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/mapper/UserMapper.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/UserService.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/impl/UserServiceImpl.java create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/bootstrap.yml create mode 100644 代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/mapper/UserMapper.xml create mode 100644 代码/h6_weekend01/bwie-module/pom.xml create mode 100644 代码/h6_weekend01/pom.xml create mode 100644 代码/src/App.vue create mode 100644 代码/src/api/bicycle.js create mode 100644 代码/src/api/table.js create mode 100644 代码/src/api/user.js create mode 100644 代码/src/assets/404_images/404.png create mode 100644 代码/src/assets/404_images/404_cloud.png create mode 100644 代码/src/components/Breadcrumb/index.vue create mode 100644 代码/src/components/Hamburger/index.vue create mode 100644 代码/src/components/SvgIcon/index.vue create mode 100644 代码/src/icons/index.js create mode 100644 代码/src/icons/svg/dashboard.svg create mode 100644 代码/src/icons/svg/example.svg create mode 100644 代码/src/icons/svg/eye-open.svg create mode 100644 代码/src/icons/svg/eye.svg create mode 100644 代码/src/icons/svg/form.svg create mode 100644 代码/src/icons/svg/link.svg create mode 100644 代码/src/icons/svg/nested.svg create mode 100644 代码/src/icons/svg/password.svg create mode 100644 代码/src/icons/svg/table.svg create mode 100644 代码/src/icons/svg/tree.svg create mode 100644 代码/src/icons/svg/user.svg create mode 100644 代码/src/icons/svgo.yml create mode 100644 代码/src/layout/components/AppMain.vue create mode 100644 代码/src/layout/components/Navbar.vue create mode 100644 代码/src/layout/components/Sidebar/FixiOSBug.js create mode 100644 代码/src/layout/components/Sidebar/Item.vue create mode 100644 代码/src/layout/components/Sidebar/Link.vue create mode 100644 代码/src/layout/components/Sidebar/Logo.vue create mode 100644 代码/src/layout/components/Sidebar/SidebarItem.vue create mode 100644 代码/src/layout/components/Sidebar/index.vue create mode 100644 代码/src/layout/components/index.js create mode 100644 代码/src/layout/index.vue create mode 100644 代码/src/layout/mixin/ResizeHandler.js create mode 100644 代码/src/main.js create mode 100644 代码/src/permission.js create mode 100644 代码/src/router/index.js create mode 100644 代码/src/settings.js create mode 100644 代码/src/store/getters.js create mode 100644 代码/src/store/index.js create mode 100644 代码/src/store/modules/app.js create mode 100644 代码/src/store/modules/settings.js create mode 100644 代码/src/store/modules/user.js create mode 100644 代码/src/styles/element-ui.scss create mode 100644 代码/src/styles/index.scss create mode 100644 代码/src/styles/mixin.scss create mode 100644 代码/src/styles/sidebar.scss create mode 100644 代码/src/styles/transition.scss create mode 100644 代码/src/styles/variables.scss create mode 100644 代码/src/utils/auth.js create mode 100644 代码/src/utils/get-page-title.js create mode 100644 代码/src/utils/index.js create mode 100644 代码/src/utils/request.js create mode 100644 代码/src/utils/validate.js create mode 100644 代码/src/views/404.vue create mode 100644 代码/src/views/bicycle/index.vue create mode 100644 代码/src/views/dashboard/index.vue create mode 100644 代码/src/views/form/index.vue create mode 100644 代码/src/views/login/index.vue create mode 100644 代码/src/views/nested/menu1/index.vue create mode 100644 代码/src/views/nested/menu1/menu1-1/index.vue create mode 100644 代码/src/views/nested/menu1/menu1-2/index.vue create mode 100644 代码/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue create mode 100644 代码/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue create mode 100644 代码/src/views/nested/menu1/menu1-3/index.vue create mode 100644 代码/src/views/nested/menu2/index.vue create mode 100644 代码/src/views/table/index.vue create mode 100644 代码/src/views/tree/index.vue create mode 100644 理论/img.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..132404b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b941b3f --- /dev/null +++ b/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + com.bwie + H6_test_week01 + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + diff --git a/代码/h6_weekend01/.gitignore b/代码/h6_weekend01/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/.idea/.gitignore b/代码/h6_weekend01/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/代码/h6_weekend01/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/代码/h6_weekend01/.idea/encodings.xml b/代码/h6_weekend01/.idea/encodings.xml new file mode 100644 index 0000000..52e1fd1 --- /dev/null +++ b/代码/h6_weekend01/.idea/encodings.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/代码/h6_weekend01/.idea/misc.xml b/代码/h6_weekend01/.idea/misc.xml new file mode 100644 index 0000000..4ac46a1 --- /dev/null +++ b/代码/h6_weekend01/.idea/misc.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/代码/h6_weekend01/.idea/uiDesigner.xml b/代码/h6_weekend01/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/代码/h6_weekend01/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/代码/h6_weekend01/.idea/vcs.xml b/代码/h6_weekend01/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/代码/h6_weekend01/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-auth/.gitignore b/代码/h6_weekend01/bwie-auth/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-auth/pom.xml b/代码/h6_weekend01/bwie-auth/pom.xml new file mode 100644 index 0000000..d71b866 --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.bwie + h6_weekend01 + 1.0-SNAPSHOT + + + bwie-auth + + + 8 + 8 + UTF-8 + + + + + + com.bwie + bwie-common + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + + org.springframework.kafka + spring-kafka + + + + diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/AuthApplication.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/AuthApplication.java new file mode 100644 index 0000000..be8ad98 --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/AuthApplication.java @@ -0,0 +1,17 @@ +package com.bwie.auth; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableFeignClients +public class AuthApplication { + + public static void main(String[] args) { + SpringApplication.run(AuthApplication.class); + } + + +} + diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/config/RabbitAdminConfig.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/config/RabbitAdminConfig.java new file mode 100644 index 0000000..d2abf6c --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/config/RabbitAdminConfig.java @@ -0,0 +1,53 @@ +package com.bwie.auth.config; + +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * RabbitAdmin是RabbitMQ的一个Java客户端库,它提供了管理RabbitMQ资源的功能。它是通过与RabbitMQ服务器进行交互来执行管理操作的。 + */ +@Configuration +public class RabbitAdminConfig { + + @Value("${spring.rabbitmq.host}") + private String host; + @Value("${spring.rabbitmq.username}") + private String username; + @Value("${spring.rabbitmq.password}") + private String password; + @Value("${spring.rabbitmq.virtualhost}") + private String virtualhost; + + /** + * 构建 RabbitMQ的连接工厂 + * @return + */ + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); + connectionFactory.setAddresses(host); + connectionFactory.setUsername(username); + connectionFactory.setPassword(password); + connectionFactory.setVirtualHost(virtualhost); + // 配置发送确认回调时,次配置必须配置,否则即使在RabbitTemplate配置了ConfirmCallback也不会生效 + connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); + connectionFactory.setPublisherReturns(true); + return connectionFactory; + } + + /** + * 自己初始化 RabbitAdmin + * @param connectionFactory + * @return + */ + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) { + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + rabbitAdmin.setAutoStartup(true); + return rabbitAdmin; + } +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/controller/AuthController.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/controller/AuthController.java new file mode 100644 index 0000000..146495a --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/controller/AuthController.java @@ -0,0 +1,41 @@ +package com.bwie.auth.controller; + +import com.bwie.auth.service.AuthService; +import com.bwie.common.domain.User; +import com.bwie.common.domain.request.LoginRequest; +import com.bwie.common.result.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class AuthController { + + @Autowired + private AuthService authService; + + /** + * 登录 + * @param loginRequest + * @return + */ + @PostMapping("/login") + public Result login(@RequestBody LoginRequest loginRequest){ + return authService.login(loginRequest); + } + + + /** + * 获取 + * @return + */ + @GetMapping("/userInfo") + public Result userInfo(){ + + User user = authService.userInfo(); + return Result.success(user); + } + +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/UserFeignService.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/UserFeignService.java new file mode 100644 index 0000000..bb9daad --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/UserFeignService.java @@ -0,0 +1,14 @@ +package com.bwie.auth.feign; + +import com.bwie.common.domain.User; +import com.bwie.common.result.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(name = "bwie-user") +public interface UserFeignService { + + @GetMapping("/findByUserName/{userNmae}") + public Result findByUserName(@PathVariable String userNmae); +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/fusing/UserFeignServiceFsing.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/fusing/UserFeignServiceFsing.java new file mode 100644 index 0000000..e203d0c --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/feign/fusing/UserFeignServiceFsing.java @@ -0,0 +1,19 @@ +package com.bwie.auth.feign.fusing; + +import com.bwie.auth.feign.UserFeignService; +import com.bwie.common.domain.User; +import com.bwie.common.result.Result; +import org.springframework.cloud.openfeign.FallbackFactory; + +public class UserFeignServiceFsing implements FallbackFactory { + + @Override + public Object create(Throwable cause) { + return new UserFeignService() { + @Override + public Result findByUserName(String userPhone) { + return Result.error("断链"); + } + }; + } +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/AuthService.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/AuthService.java new file mode 100644 index 0000000..12930cc --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/AuthService.java @@ -0,0 +1,14 @@ +package com.bwie.auth.service; + +import com.bwie.common.domain.User; +import com.bwie.common.domain.request.LoginRequest; +import com.bwie.common.result.Result; + +public interface AuthService { + + + Result login(LoginRequest loginRequest); + + User userInfo(); + +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/impl/AuthServiceImpl.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/impl/AuthServiceImpl.java new file mode 100644 index 0000000..ae5f29f --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/service/impl/AuthServiceImpl.java @@ -0,0 +1,82 @@ +package com.bwie.auth.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.bwie.auth.feign.UserFeignService; +import com.bwie.auth.service.AuthService; +import com.bwie.common.constants.JwtConstants; +import com.bwie.common.constants.TokenConstants; +import com.bwie.common.domain.User; +import com.bwie.common.domain.request.LoginRequest; +import com.bwie.common.domain.response.LoginResponse; +import com.bwie.common.result.Result; +import com.bwie.common.utils.JwtUtils; +import com.bwie.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@Service +public class AuthServiceImpl implements AuthService { + + @Autowired + private UserFeignService userFeignService; + + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private HttpServletRequest request; + + + @Override + public Result login(LoginRequest loginRequest) { + + String userName = loginRequest.getUserName(); + String userPwd = loginRequest.getUserPwd(); + if (StringUtils.isAnyBlank(userName,userPwd)){ + return Result.error("用户名或密码不能为空"); + } + + Result byName = userFeignService.findByUserName(userName); + User data = byName.getData(); + if (data==null){ + return Result.error("用户名不能为空"); + } + + if (!ObjectUtil.equal(data.getUserPwd(),userPwd)){ + return Result.error("密码不能为空"); + } + + HashMap map = new HashMap<>(); + String userKey = UUID.randomUUID().toString().replace("-", ""); + map.put(JwtConstants.USER_KEY,userKey); + String token = JwtUtils.createToken(map); + redisTemplate.opsForValue().set(TokenConstants.LOGIN_TOKEN_KEY+userKey,JSONObject.toJSONString(data),30,TimeUnit.MINUTES); + + LoginResponse userResponse = new LoginResponse(); + userResponse.setToken(token); + userResponse.setExpritime("30MIN"); + return Result.success(userResponse,"登录成功"); + + } + + + @Override + public User userInfo() { + + String token = request.getHeader("token"); + String userKey = JwtUtils.getUserKey(token); + String s = redisTemplate.opsForValue().get(TokenConstants.LOGIN_TOKEN_KEY + userKey); + User user = JSONObject.parseObject(s, User.class); + return user; + } + + + +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DLXQueue.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DLXQueue.java new file mode 100644 index 0000000..d76e2c2 --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DLXQueue.java @@ -0,0 +1,77 @@ +package com.bwie.auth.utils; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Component +public class DLXQueue { + // routingKey + private static final String DEAD_ROUTING_KEY = "dead.routingkey"; + private static final String ROUTING_KEY = "routingkey"; + private static final String DEAD_EXCHANGE = "dead.exchange"; + private static final String EXCHANGE = "common.exchange"; + @Autowired + RabbitTemplate rabbitTemplate; + @Resource + RabbitAdmin rabbitAdmin; + + /** + * 发送死信队列,过期后进入死信交换机,进入死信队列 + * + * @param queueName 队列名称 + * @param deadQueueName 死信队列名称 + * @param params 消息内容 + * @param expiration 过期时间 毫秒 + */ + public void sendDLXQueue(String queueName, String deadQueueName, Object params, Integer expiration) { + /** + * ----------------------------------先创建一个ttl队列和死信队列-------------------------------------------- + */ + Map map = new HashMap<>(); + // 队列设置存活时间,单位ms, 必须是整形数据。 + map.put("x-message-ttl", expiration); + // 设置死信交换机 + map.put("x-dead-letter-exchange", DEAD_EXCHANGE); + // 设置死信交换器路由 + map.put("x-dead-letter-routing-key", DEAD_ROUTING_KEY); + /*参数1:队列名称 参数2:持久化 参数3:是否排他 参数4:自动删除队列 参数5:队列参数*/ + Queue queue = new Queue(queueName, true, false, false, map); + rabbitAdmin.declareQueue(queue); + /** + * ---------------------------------创建交换机--------------------------------------------- + */ + DirectExchange directExchange = new DirectExchange(EXCHANGE, true, false); + rabbitAdmin.declareExchange(directExchange); + /** + * ---------------------------------队列绑定交换机--------------------------------------------- + */ + Binding binding = BindingBuilder.bind(queue).to(directExchange).with(ROUTING_KEY); + rabbitAdmin.declareBinding(binding); + /** + * ---------------------------------在创建一个死信交换机和队列,接收死信队列--------------------------------------------- + */ + DirectExchange deadExchange = new DirectExchange(DEAD_EXCHANGE, true, false); + rabbitAdmin.declareExchange(deadExchange); + + Queue deadQueue = new Queue(deadQueueName, true, false, false); + rabbitAdmin.declareQueue(deadQueue); + /** + * ---------------------------------队列绑定死信交换机--------------------------------------------- + */ + // 将队列和交换机绑定 + Binding deadbinding = BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTING_KEY); + rabbitAdmin.declareBinding(deadbinding); + // 发送消息 + rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, params); + } +} diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DelayedQueue.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DelayedQueue.java new file mode 100644 index 0000000..0df9f49 --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/DelayedQueue.java @@ -0,0 +1,79 @@ +package com.bwie.auth.utils; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.CustomExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 发送延迟队列的工具类 + */ +@Component +public class DelayedQueue { + + // routingKey + private static final String DELAYED_ROUTING_KEY = "delayed.routingkey"; + + // 延迟队列交换机 + private static final String DELAYED_EXCHANGE = "delayed.exchange"; + + @Autowired + RabbitTemplate rabbitTemplate; + + @Resource + RabbitAdmin rabbitAdmin; + + /** + * 发送延迟队列 + * + * @param queueName 队列名称 + * @param params 消息内容 + * @param expiration 延迟时间 毫秒 + */ + public void sendDelayedQueue(String queueName, Object params, Integer expiration) { + // 先创建一个队列 + Queue queue = new Queue(queueName); + rabbitAdmin.declareQueue(queue); + + // 创建延迟队列交换机 + CustomExchange customExchange = createCustomExchange(); + rabbitAdmin.declareExchange(customExchange); + + // 将队列和交换机绑定 + Binding binding = BindingBuilder.bind(queue).to(customExchange).with(DELAYED_ROUTING_KEY).noargs(); + rabbitAdmin.declareBinding(binding); + + // 发送延迟消息 + rabbitTemplate.convertAndSend(DELAYED_EXCHANGE, DELAYED_ROUTING_KEY, params, msg -> { + // 发送消息的时候 延迟时长 + msg.getMessageProperties().setMessageId(UUID.randomUUID().toString().replaceAll("-", "")); + msg.getMessageProperties().setDelay(expiration); + return msg; + }); + } + + private CustomExchange createCustomExchange() { + Map arguments = new HashMap<>(); + /** + * 参数说明: + * 1.交换机的名称 + * 2.交换机的类型 + * 3.是否需要持久化 + * 4.是否自动删除 + * 5.其它参数 + */ + arguments.put("x-delayed-type", "direct"); + return new CustomExchange(DELAYED_EXCHANGE, "x-delayed-message", true, false, arguments); + } + +} + diff --git a/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/TtlQueue.java b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/TtlQueue.java new file mode 100644 index 0000000..51db22d --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/java/com/bwie/auth/utils/TtlQueue.java @@ -0,0 +1,66 @@ +package com.bwie.auth.utils; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * 发送TTL队列 设置 消息的存活时间 如果超过了存活时间 + * 该条消息还没有被消费 则自动从队列中消息 ,如果配置了死信队列则消息会进入死信队列 + */ +@Component +public class TtlQueue { + // routingKey + private static final String TTL_KEY = "ttl.routingkey"; + private static final String TTL_EXCHANGE = "ttl.exchange"; + + @Autowired + RabbitTemplate rabbitTemplate; + + @Resource + RabbitAdmin rabbitAdmin; + + /** + * 发送TTL队列 + * + * @param queueName 队列名称 + * @param params 消息内容 + * @param expiration 过期时间 毫秒 + */ + public void sendTtlQueue(String queueName, Object params, Integer expiration) { + /** + * ----------------------------------先创建一个ttl队列-------------------------------------------- + */ + Map map = new HashMap<>(); + // 队列设置存活时间,单位ms,必须是整形数据。 + map.put("x-message-ttl", expiration); + /*参数1:队列名称 参数2:持久化 参数3:是否排他 参数4:自动删除队列 参数5:队列参数*/ + Queue queue = new Queue(queueName, true, false, false, map); + rabbitAdmin.declareQueue(queue); + + /** + * ---------------------------------创建交换机--------------------------------------------- + */ + DirectExchange directExchange = new DirectExchange(TTL_EXCHANGE, true, false); + rabbitAdmin.declareExchange(directExchange); + /** + * ---------------------------------队列绑定交换机--------------------------------------------- + */ + // 将队列和交换机绑定 + Binding binding = BindingBuilder.bind(queue).to(directExchange).with(TTL_KEY); + rabbitAdmin.declareBinding(binding); + + // 发送消息 + rabbitTemplate.convertAndSend(TTL_EXCHANGE, TTL_KEY, params); + } +} + diff --git a/代码/h6_weekend01/bwie-auth/src/main/resources/bootstrap.yml b/代码/h6_weekend01/bwie-auth/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..e7a8a31 --- /dev/null +++ b/代码/h6_weekend01/bwie-auth/src/main/resources/bootstrap.yml @@ -0,0 +1,112 @@ +# Tomcat +server: + port: 9001 +# Spring +spring: + main: + allow-circular-references: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + application: + # 应用名称 + name: bwie-auth + kafka: + producer: + # Kafka服务器 + bootstrap-servers: 111.229.181.183:9092 + # 开启事务,必须在开启了事务的方法中发送,否则报错 + transaction-id-prefix: kafkaTx- + # 发生错误后,消息重发的次数,开启事务必须设置大于0。 + retries: 3 + # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。 + # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。 + # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。 + # 开启事务时,必须设置为all + acks: all + # 当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。 + batch-size: 16384 + # 生产者内存缓冲区的大小。 + buffer-memory: 1024000 + # 键的序列化方式 + key-serializer: org.springframework.kafka.support.serializer.JsonSerializer + # 值的序列化方式(建议使用Json,这种序列化方式可以无需额外配置传输实体类) + value-serializer: org.springframework.kafka.support.serializer.JsonSerializer + + consumer: + # Kafka服务器 + bootstrap-servers: 111.229.181.183:9092 + group-id: firstGroup + # 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D + #auto-commit-interval: 2s + # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理: + # earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费分区的记录 + # latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据(在消费者启动之后生成的记录) + # none:当各分区都存在已提交的offset时,从提交的offset开始消费;只要有一个分区不存在已提交的offset,则抛出异常 + auto-offset-reset: latest + # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量 + enable-auto-commit: false + # 键的反序列化方式 + #key-deserializer: org.apache.kafka.common.serialization.StringDeserializer + key-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer + # 值的反序列化方式(建议使用Json,这种序列化方式可以无需额外配置传输实体类) + value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer + # 配置消费者的 Json 反序列化的可信赖包,反序列化实体类需要 + properties: + spring: + json: + trusted: + packages: "*" + # 这个参数定义了poll方法最多可以拉取多少条消息,默认值为500。如果在拉取消息的时候新消息不足500条,那有多少返回多少;如果超过500条,每次只返回500。 + # 这个默认值在有些场景下太大,有些场景很难保证能够在5min内处理完500条消息, + # 如果消费者无法在5分钟内处理完500条消息的话就会触发reBalance, + # 然后这批消息会被分配到另一个消费者中,还是会处理不完,这样这批消息就永远也处理不完。 + # 要避免出现上述问题,提前评估好处理一条消息最长需要多少时间,然后覆盖默认的max.poll.records参数 + # 注:需要开启BatchListener批量监听才会生效,如果不开启BatchListener则不会出现reBalance情况 + max-poll-records: 3 + properties: + # 两次poll之间的最大间隔,默认值为5分钟。如果超过这个间隔会触发reBalance + max: + poll: + interval: + ms: 600000 + # 当broker多久没有收到consumer的心跳请求后就触发reBalance,默认值是10s + session: + timeout: + ms: 10000 + listener: + # 在侦听器容器中运行的线程数,一般设置为 机器数*分区数 + concurrency: 4 + # 自动提交关闭,需要设置手动消息确认 + ack-mode: manual_immediate + # 消费监听接口监听的主题不存在时,默认会报错,所以设置为false忽略错误 + missing-topics-fatal: false + # 两次poll之间的最大间隔,默认值为5分钟。如果超过这个间隔会触发reBalance + poll-timeout: 600000 + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 111.229.181.183:8848 + config: + # 配置中心地址 + server-addr: 111.229.181.183:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + rabbitmq: + username: root + password: zzh123 + virtualHost: / + port: 5672 + host: 111.229.181.183 + listener: + simple: + prefetch: 1 # 每次只能获取一条,处理完成才能获取下一条 + publisher-confirm-type: correlated #确认消息已发送到交换机(Exchange) + publisher-returns: true #确认消息已发送到队列(Queue) diff --git a/代码/h6_weekend01/bwie-common/.gitignore b/代码/h6_weekend01/bwie-common/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-common/pom.xml b/代码/h6_weekend01/bwie-common/pom.xml new file mode 100644 index 0000000..d88a43a --- /dev/null +++ b/代码/h6_weekend01/bwie-common/pom.xml @@ -0,0 +1,108 @@ + + + 4.0.0 + + com.bwie + h6_weekend01 + 1.0-SNAPSHOT + + + bwie-common + + + 8 + 8 + UTF-8 + + + + + + + + javax.servlet + javax.servlet-api + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + com.alibaba + fastjson + 1.2.80 + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.apache.commons + commons-lang3 + + + + org.projectlombok + lombok + + + + cn.hutool + hutool-all + 5.8.3 + + + + com.aliyun + dysmsapi20170525 + 2.0.1 + + + + org.springframework.boot + spring-boot-starter-amqp + + + + diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/Constants.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/Constants.java new file mode 100644 index 0000000..2fdc9fe --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/Constants.java @@ -0,0 +1,18 @@ +package com.bwie.common.constants; + +/** + * @description: 系统常量 + * @author DongZl + */ +public class Constants { + /** + * 成功标记 + */ + public static final Integer SUCCESS = 200; + public static final String SUCCESS_MSG = "操作成功"; + /** + * 失败标记 + */ + public static final Integer ERROR = 500; + public static final String ERROR_MSG = "操作异常"; +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java new file mode 100644 index 0000000..03692c1 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java @@ -0,0 +1,29 @@ +package com.bwie.common.constants; + +/** + * @author DongZl + * @description: Jwt常量 + */ +public class JwtConstants { + + /** + * 用户ID字段 + */ + public static final String DETAILS_USER_ID = "user_id"; + + /** + * 用户名字段 + */ + public static final String DETAILS_USERNAME = "username"; + + /** + * 用户标识 + */ + public static final String USER_KEY = "user_key"; + + /** + * 令牌秘钥 + */ + public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; + +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/QueueConstants.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/QueueConstants.java new file mode 100644 index 0000000..2c4c3c2 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/QueueConstants.java @@ -0,0 +1,15 @@ +package com.bwie.common.constants; + +/** + * @Project boot-month + * @Author 张子豪 + * @Date 2023/9/6 10:06-+ + * @Description + */ +public class QueueConstants { + + public static final String SEND_CODE_QUEUE = "send_code_queue"; + public static final String SEND_CODE_PREVENT_REPEAT_ID = "send_code_prevent_repeat_id:"; + public static final String BLOG_UPDATE_QUEUE = "blog_update_queue"; + public static final String BLOG_UPDATE_PREVENT_REPEAT_ID = "blog_update_prevent_repeat_id:"; +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQOneConstants.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQOneConstants.java new file mode 100644 index 0000000..a05740c --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQOneConstants.java @@ -0,0 +1,18 @@ +package com.bwie.common.constants; + +/** + * Clazz:2103A + * Name :FYSN + * Desc :世界上只有一种英雄主义。那就是认清生活的真相后,仍然热爱生活。--罗曼·罗兰 + * Date :2023-08-20 20:37:02 + */ + +public class RabbitMQOneConstants { + + //发送短消息队列名称 + public static final String SEND_SHORT_MESSAGE_QUEUE_NAME = "send_short_message"; + + //查看的日志队列名称 + public static final String QUERY_LOG_QUEUE_NAME = "query_log_message"; + +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQTwoConstants.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQTwoConstants.java new file mode 100644 index 0000000..95361f1 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQTwoConstants.java @@ -0,0 +1,18 @@ +package com.bwie.common.constants; + +/** + * Clazz:2103A + * Name :FYSN + * Desc :世界上只有一种英雄主义。那就是认清生活的真相后,仍然热爱生活。--罗曼·罗兰 + * Date :2023-08-20 20:37:02 + */ + +public class RabbitMQTwoConstants { + + //发送消息队列名称 + public static final String SEND_SMS_QUEUE = "send_sms_queue"; + + //添加消息队列名称日志 + public static final String ADD_MESSAGE_QUEUE_NAME_LOG = "add_message_log"; + +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java new file mode 100644 index 0000000..1871fb7 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java @@ -0,0 +1,24 @@ +package com.bwie.common.constants; + +/** + * @author DongZl + * @description: 令牌常量 + */ +public class TokenConstants { + /** + * 缓存有效期,默认720(分钟) + */ + public final static long EXPIRATION = 720; + /** + * 缓存刷新时间,默认120(分钟) + */ + public final static long REFRESH_TIME = 120; + /** + * 权限缓存前缀 + */ + public final static String LOGIN_TOKEN_KEY = "login_tokens:"; + /** + * token标识 + */ + public static final String TOKEN = "token"; +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Bicycle.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Bicycle.java new file mode 100644 index 0000000..ad8084c --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Bicycle.java @@ -0,0 +1,17 @@ +package com.bwie.common.domain; + +import lombok.Data; + +@Data +public class Bicycle { + + private Integer bicycleId; + private String bicycleNumber; + private Integer typeId; + private Integer statusId; + + private String typeName; + private String statusName; + + +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Records.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Records.java new file mode 100644 index 0000000..58ff306 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Records.java @@ -0,0 +1,28 @@ +package com.bwie.common.domain; + + +import lombok.Data; + +@Data +public class Records { + + + private Integer recordsId; + private String bicycleNumber; + private Integer typeId; + private String userName; + private String recordsStart; + private String recordsLong; + private String recordsKm; + private String recordsPrice; + private String recordsStatus; + + + private String typeName; + private String statusName; + + + + + +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Status.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Status.java new file mode 100644 index 0000000..9d29ffd --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Status.java @@ -0,0 +1,10 @@ +package com.bwie.common.domain; + +import lombok.Data; + +@Data +public class Status { + + private Integer statusId; + private String statusName; +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Type.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Type.java new file mode 100644 index 0000000..5f52f4f --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/Type.java @@ -0,0 +1,11 @@ +package com.bwie.common.domain; + +import lombok.Data; + +@Data +public class Type { + + private Integer typeId; + private String typeName; + +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/User.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/User.java new file mode 100644 index 0000000..1fd7300 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/User.java @@ -0,0 +1,11 @@ +package com.bwie.common.domain; + +import lombok.Data; + +@Data +public class User { + + private Integer userId; + private String userName; + private String userPwd; +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java new file mode 100644 index 0000000..c3c76a1 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java @@ -0,0 +1,11 @@ +package com.bwie.common.domain.request; + +import lombok.Data; + +@Data +public class LoginRequest { + + private String userName; + + private String userPwd; +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/response/LoginResponse.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/response/LoginResponse.java new file mode 100644 index 0000000..a50e193 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/domain/response/LoginResponse.java @@ -0,0 +1,18 @@ +package com.bwie.common.domain.response; + +import com.bwie.common.result.Result; +import lombok.Data; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@Data +public class LoginResponse { + + private String token; + private String expritime; +} + + + + diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/handler/GlobalExceptionHandler.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..0f6668c --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/handler/GlobalExceptionHandler.java @@ -0,0 +1,39 @@ +package com.bwie.common.handler; + +import com.bwie.common.result.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; + +/** + * 全局异常处理器 + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public Result handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return Result.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public Result handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return Result.error(e.getMessage()); + } +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/PageResult.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/PageResult.java new file mode 100644 index 0000000..85ecdda --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/PageResult.java @@ -0,0 +1,34 @@ +package com.bwie.common.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author DongZl + * @description: 列表返回结果集 + */ +@Data +public class PageResult implements Serializable { + /** + * 总条数 + */ + private long total; + /** + * 结果集合 + */ + private List list; + public PageResult() { + } + public PageResult(long total, List list) { + this.total = total; + this.list = list; + } + public static PageResult toPageResult(long total, List list){ + return new PageResult(total , list); + } + public static Result> toResult(long total, List list){ + return Result.success(PageResult.toPageResult(total,list)); + } +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/Result.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/Result.java new file mode 100644 index 0000000..30b1e73 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/result/Result.java @@ -0,0 +1,76 @@ +package com.bwie.common.result; + +import com.bwie.common.constants.Constants; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author DongZl + * @description: 响应信息主体 + */ +@Data +public class Result implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 成功 + */ + public static final int SUCCESS = Constants.SUCCESS; + /** + * 失败 + */ + public static final int FAIL = Constants.ERROR; + /** + * 返回状态码 + */ + private int code; + /** + * 响应信息 + */ + private String msg; + /** + * 响应数据 + */ + private T data; + + public static Result success() { + return restResult(null, SUCCESS, Constants.SUCCESS_MSG); + } + + public static Result success(T data) { + return restResult(data, SUCCESS, Constants.SUCCESS_MSG); + } + + public static Result success(T data, String msg) { + return restResult(data, SUCCESS, msg); + } + + public static Result error() { + return restResult(null, FAIL, Constants.ERROR_MSG); + } + + public static Result error(String msg) { + return restResult(null, FAIL, msg); + } + + public static Result error(T data) { + return restResult(data, FAIL, Constants.ERROR_MSG); + } + + public static Result error(T data, String msg) { + return restResult(data, FAIL, msg); + } + + public static Result error(int code, String msg) { + return restResult(null, code, msg); + } + + private static Result restResult(T data, int code, String msg) { + Result apiResult = new Result<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/IpUtils.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/IpUtils.java new file mode 100644 index 0000000..20c1405 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/IpUtils.java @@ -0,0 +1,312 @@ +package com.bwie.common.utils; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 获取IP方法 + * + * @author ruoyi + */ +public class IpUtils { + public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; + // 匹配 ip + public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; + public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; + // 匹配网段 + public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; + + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + if (request == null) { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] addr) { + if (StringUtils.isNull(addr) || addr.length < 2) { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) { + return true; + } + case SECTION_5: + switch (b1) { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) { + if (text.length() == 0) { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try { + long l; + int i; + switch (elements.length) { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } catch (NumberFormatException e) { + return null; + } + return bytes; + } + + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + } + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) { + // 多级反向代理检测 + if (ip != null && ip.indexOf(",") > 0) { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) { + if (false == isUnknown(subIp)) { + ip = subIp; + break; + } + } + } + return StringUtils.substring(ip, 0, 255); + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + + /** + * 是否为IP + */ + public static boolean isIP(String ip) { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); + } + + /** + * 是否为IP,或 *为间隔的通配符地址 + */ + public static boolean isIpWildCard(String ip) { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); + } + + /** + * 检测参数是否在ip通配符里 + */ + public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) { + String[] s1 = ipWildCard.split("\\."); + String[] s2 = ip.split("\\."); + boolean isMatchedSeg = true; + for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) { + if (!s1[i].equals(s2[i])) { + isMatchedSeg = false; + break; + } + } + return isMatchedSeg; + } + + /** + * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 + */ + public static boolean isIPSegment(String ipSeg) { + return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); + } + + /** + * 判断ip是否在指定网段中 + */ + public static boolean ipIsInNetNoCheck(String iparea, String ip) { + int idx = iparea.indexOf('-'); + String[] sips = iparea.substring(0, idx).split("\\."); + String[] sipe = iparea.substring(idx + 1).split("\\."); + String[] sipt = ip.split("\\."); + long ips = 0L, ipe = 0L, ipt = 0L; + for (int i = 0; i < 4; ++i) { + ips = ips << 8 | Integer.parseInt(sips[i]); + ipe = ipe << 8 | Integer.parseInt(sipe[i]); + ipt = ipt << 8 | Integer.parseInt(sipt[i]); + } + if (ips > ipe) { + long t = ips; + ips = ipe; + ipe = t; + } + return ips <= ipt && ipt <= ipe; + } + + /** + * 校验ip是否符合过滤串规则 + * + * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` + * @param ip 校验IP地址 + * @return boolean 结果 + */ + public static boolean isMatchedIp(String filter, String ip) { + if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) { + return false; + } + String[] ips = filter.split(";"); + for (String iStr : ips) { + if (isIP(iStr) && iStr.equals(ip)) { + return true; + } else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) { + return true; + } else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) { + return true; + } + } + return false; + } +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java new file mode 100644 index 0000000..f560aa9 --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java @@ -0,0 +1,109 @@ +package com.bwie.common.utils; + +import com.bwie.common.constants.JwtConstants; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Map; + +/** + * @description: Jwt工具类 + * @author DongZl + */ +public class JwtUtils { + + /** + * 秘钥 + */ + public static String secret = JwtConstants.SECRET; + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + public static String createToken(Map claims){ + String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + public static Claims parseToken(String token){ + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + /** + * 根据令牌获取用户标识 + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserKey(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户标识 + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserKey(Claims claims){ + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户ID + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserId(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据身份信息获取用户ID + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserId(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据令牌获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUserName(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取用户名 + * + * @param claims 身份信息 + * @return 用户名 + */ + public static String getUserName(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取键值 + * + * @param claims 身份信息 + * @param key 键 + * @return 值 + */ + public static String getValue(Claims claims, String key){ + Object obj = claims.get(key); + return obj == null ? "" : obj.toString(); + } +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java new file mode 100644 index 0000000..93c47fd --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java @@ -0,0 +1,68 @@ +package com.bwie.common.utils; + +import org.springframework.util.AntPathMatcher; + +import java.util.Collection; +import java.util.List; + +/** + * @author DongZl + * @description: 字符串处理工具类 + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } +} diff --git a/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java new file mode 100644 index 0000000..7accf0e --- /dev/null +++ b/代码/h6_weekend01/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java @@ -0,0 +1,88 @@ +package com.bwie.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teaopenapi.models.Config; +import lombok.extern.log4j.Log4j2; + +import java.util.Map; + +/** + * 短信工具类 + */ +@Log4j2 +public class TelSmsUtils { + + /** + * 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 + */ + private static String accessKeyId = "LTAI5tQWdAodc1EJ1doShoW4"; + private static String accessKeySecret = "9MbfDBJ3Efqc6iN5yPFX0zq3ZErsII"; + private static String templateCode = "SMS0001"; + + /** + * 短信访问域名 + */ + private static String endpoint = "dysmsapi.aliyuncs.com"; + /** + * 短信签名 + */ + private static String signName = "登录验证"; + + /** + * 实例化短信对象 + */ + private static Client client; + + static { + log.info("初始化短信服务开始"); + long startTime = System.currentTimeMillis(); + try { + client = initClient(); + log.info("初始化短信成功:{}",signName); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("初始化短信服务结束:耗时:{}MS",(System.currentTimeMillis()-startTime)); + } + /** + * 初始化短信对象 + * @return + * @throws Exception + */ + private static Client initClient() throws Exception{ + Config config = new Config() + // 您的AccessKey ID + .setAccessKeyId(accessKeyId) + // 您的AccessKey Secret + .setAccessKeySecret(accessKeySecret); + // 访问的域名 + config.endpoint = endpoint; + return new Client(config); + } + + /** + * 发送单条短信 + * @param tel + * @param templateCode SMS_153991546 + * @param sendDataMap + */ + public static String sendSms(String tel, String templateCode,Map sendDataMap){ + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setPhoneNumbers(tel) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(JSONObject.toJSONString(sendDataMap)); + SendSmsResponse sendSmsResponse = null; + try { + log.info("发送短信验证码:消息内容是:【{}】", JSONObject.toJSONString(sendDataMap)); + sendSmsResponse = client.sendSms(sendSmsRequest); + } catch (Exception e) { + log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", tel, sendDataMap, e); + } + return JSONObject.toJSONString(sendSmsResponse.getBody()); + } + +} diff --git a/代码/h6_weekend01/bwie-gateway/.gitignore b/代码/h6_weekend01/bwie-gateway/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-gateway/pom.xml b/代码/h6_weekend01/bwie-gateway/pom.xml new file mode 100644 index 0000000..1131dd7 --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.bwie + h6_weekend01 + 1.0-SNAPSHOT + + + bwie-gateway + + + 8 + 8 + UTF-8 + + + + + + com.bwie + bwie-common + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + com.alibaba.csp + sentinel-spring-cloud-gateway-adapter + + + + diff --git a/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/GatewayApplication.java b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/GatewayApplication.java new file mode 100644 index 0000000..3619137 --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/GatewayApplication.java @@ -0,0 +1,11 @@ +package com.bwie.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GatewayApplication { + public static void main(String[] args) { + SpringApplication.run(GatewayApplication.class); + } +} diff --git a/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java new file mode 100644 index 0000000..eea0d7c --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/config/IgnoreWhiteConfig.java @@ -0,0 +1,29 @@ +package com.bwie.gateway.config; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.extern.log4j.Log4j2; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + + +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "ignore") +@Data +@Log4j2 +public class IgnoreWhiteConfig { + /** + * 放行白名单配置,网关不校验此处的白名单 + */ + private List whites = new ArrayList<>(); + + public void setWhites(List whites) { + log.info("加载网关路径白名单:{}", JSONObject.toJSONString(whites)); + this.whites = whites; + } +} diff --git a/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java new file mode 100644 index 0000000..3335b2c --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/filters/AuthFilter.java @@ -0,0 +1,60 @@ +package com.bwie.gateway.filters; + +import com.bwie.common.constants.TokenConstants; +import com.bwie.common.utils.JwtUtils; +import com.bwie.common.utils.StringUtils; +import com.bwie.gateway.config.IgnoreWhiteConfig; +import com.bwie.gateway.utils.GatewayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.data.redis.core.StringRedisTemplate; +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.util.List; +import java.util.concurrent.TimeUnit; + + +@Component +public class AuthFilter implements GlobalFilter, Ordered { + @Autowired + private IgnoreWhiteConfig ignoreWhiteConfig; + @Autowired + private StringRedisTemplate redisTemplate; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + List whites = ignoreWhiteConfig.getWhites(); + ServerHttpRequest request = exchange.getRequest(); + String path = request.getURI().getPath(); + if (StringUtils.matches(path,whites)){ + return chain.filter(exchange); + } + String token = request.getHeaders().getFirst(TokenConstants.TOKEN); + if (StringUtils.isBlank(token)){ + return GatewayUtils.errorResponse(exchange,"无权访问"); + } + try{ + JwtUtils.parseToken(token); + }catch (Exception e){ + return GatewayUtils.errorResponse(exchange,"token不合法"); + } + String userKey = JwtUtils.getUserKey(token); + if (!redisTemplate.hasKey(TokenConstants.LOGIN_TOKEN_KEY+userKey)){ + return GatewayUtils.errorResponse(exchange,"token过期"); + }else { + //续期Token到15分钟 + redisTemplate.expire(TokenConstants.LOGIN_TOKEN_KEY+userKey,20, TimeUnit.MINUTES); + } + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java new file mode 100644 index 0000000..cf24c5e --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/src/main/java/com/bwie/gateway/utils/GatewayUtils.java @@ -0,0 +1,95 @@ +package com.bwie.gateway.utils; + +import com.alibaba.fastjson.JSONObject; +import com.bwie.common.result.Result; +import com.bwie.common.utils.StringUtils; +import lombok.extern.log4j.Log4j2; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + + +@Log4j2 +public class GatewayUtils { + /** + * 添加请求头参数 + * @param mutate 修改对象 + * @param key 键 + * @param value 值 + */ + public static void addHeader(ServerHttpRequest.Builder mutate, String key, Object value) { + if (StringUtils.isEmpty(key)){ + log.warn("添加请求头参数键不可以为空"); + return; + } + if (value == null) { + log.warn("添加请求头参数:[{}]值为空",key); + return; + } + String valueStr = value.toString(); + mutate.header(key, valueStr); + log.info("添加请求头参数成功 - 键:[{}] , 值:[{}]", key , value); + } + + /** + * 删除请求头参数 + * @param mutate 修改对象 + * @param key 键 + */ + public static void removeHeader(ServerHttpRequest.Builder mutate, String key) { + if (StringUtils.isEmpty(key)){ + log.warn("删除请求头参数键不可以为空"); + return; + } + mutate.headers(httpHeaders -> httpHeaders.remove(key)).build(); + log.info("删除请求头参数 - 键:[{}]",key); + } + + /** + * 错误结果响应 + * @param exchange 响应上下文 + * @param msg 响应消息 + * @return + */ + public static Mono errorResponse(ServerWebExchange exchange, String msg, HttpStatus httpStatus) { + ServerHttpResponse response = exchange.getResponse(); + //设置HTTP响应头状态 + response.setStatusCode(httpStatus); + //设置HTTP响应头文本格式 + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json"); + //定义响应内容 + Result result = Result.error(msg); + String resultJson = JSONObject.toJSONString(result); + log.error("[鉴权异常处理]请求路径:[{}],异常信息:[{}],响应结果:[{}]", exchange.getRequest().getPath(), msg, resultJson); + DataBuffer dataBuffer = response.bufferFactory().wrap(resultJson.getBytes()); + //进行响应 + return response.writeWith(Mono.just(dataBuffer)); + } + + /** + * 错误结果响应 + * @param exchange 响应上下文 + * @param msg 响应消息 + * @return + */ + public static Mono errorResponse(ServerWebExchange exchange, String msg) { + ServerHttpResponse response = exchange.getResponse(); + //设置HTTP响应头状态 + response.setStatusCode(HttpStatus.OK); + //设置HTTP响应头文本格式 + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json"); + //定义响应内容 + Result result = Result.error(msg); + String resultJson = JSONObject.toJSONString(result); + log.error("[鉴权异常处理]请求路径:[{}],异常信息:[{}],响应结果:[{}]", exchange.getRequest().getPath(), msg, resultJson); + DataBuffer dataBuffer = response.bufferFactory().wrap(resultJson.getBytes()); + //进行响应 + return response.writeWith(Mono.just(dataBuffer)); + } + + +} diff --git a/代码/h6_weekend01/bwie-gateway/src/main/resources/bootstrap.yml b/代码/h6_weekend01/bwie-gateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..e9fc59d --- /dev/null +++ b/代码/h6_weekend01/bwie-gateway/src/main/resources/bootstrap.yml @@ -0,0 +1,29 @@ +# Tomcat +server: + port: 18080 +# Spring +spring: + application: + # 应用名称 + name: bwie-gateway + profiles: + # 环境配置 + active: dev + main: + # 允许使用循环引用 + allow-circular-references: true + # 允许定义相同的bean对象 去覆盖原有的 + allow-bean-definition-overriding: true + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 111.229.181.183:8848 + config: + # 配置中心地址 + server-addr: 111.229.181.183:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/代码/h6_weekend01/bwie-module/.gitignore b/代码/h6_weekend01/bwie-module/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/.gitignore b/代码/h6_weekend01/bwie-module/bwie-bicycle/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/pom.xml b/代码/h6_weekend01/bwie-module/bwie-bicycle/pom.xml new file mode 100644 index 0000000..2fa7b42 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + com.bwie + bwie-module + 1.0-SNAPSHOT + + + bwie-bicycle + + + 8 + 8 + UTF-8 + + + + + + + com.bwie + bwie-common + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + mysql + mysql-connector-java + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.github.tobato + fastdfs-client + 1.26.5 + + + + + diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/BicycleApplication.java b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/BicycleApplication.java new file mode 100644 index 0000000..69a4e53 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/BicycleApplication.java @@ -0,0 +1,11 @@ +package com.bwie.xxxxxx; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BicycleApplication { + public static void main(String[] args) { + SpringApplication.run(BicycleApplication.class); + } +} diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/controller/BicycleController.java b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/controller/BicycleController.java new file mode 100644 index 0000000..c49dfb0 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/controller/BicycleController.java @@ -0,0 +1,96 @@ +package com.bwie.xxxxxx.controller; + +import com.bwie.common.domain.Bicycle; +import com.bwie.common.domain.Records; +import com.bwie.common.domain.Status; +import com.bwie.common.domain.Type; +import com.bwie.common.result.Result; +import com.bwie.xxxxxx.service.BicycleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class BicycleController { + + + @Autowired + private BicycleService bicycleService; + + + /** + * 自行车列表查询 + * + * @param bicycle + * @return + */ + @PostMapping("/findBicycleList") + public Result findBicycleList(@RequestBody Bicycle bicycle) { + List findbicyclelist = bicycleService.findBicycleList(bicycle); + return Result.success(findbicyclelist); + } + + + /** + * 自行车类型下拉框 + * + * @return + */ + @PostMapping("/findType") + public Result findType() { + List findtype = bicycleService.findType(); + return Result.success(findtype); + } + + + /** + * 自行车状态下拉框 + * + * @return + */ + @PostMapping("/findStatus") + public Result findStatus() { + List findstatus = bicycleService.findStatus(); + return Result.success(findstatus); + } + + + /** + * 一插入条数据 + * @param bicycle + * @return + */ + @PostMapping("/insertBicycle") + public Result insertBicycle(@RequestBody Bicycle bicycle){ + Integer integer = bicycleService.insertBicycle(bicycle); + return Result.success(integer); + } + + + /** + * 用车;列表 + * @return + */ + @PostMapping("/findRecordsList") + public Result findRecordsList(){ + List findRecordsList = bicycleService.findRecordsList(); + return Result.success(findRecordsList); + } + + + /** + * 修改状态 + * @param records + * @return + */ + @PostMapping("/updaterecordsStatus") + public Result updateContractState(@RequestBody Records records){ + Integer integer = bicycleService.updaterecordsStatus(records); + return Result.success(integer); + } + + +} diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/mapper/BicycleMapper.java b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/mapper/BicycleMapper.java new file mode 100644 index 0000000..af30b4e --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/mapper/BicycleMapper.java @@ -0,0 +1,23 @@ +package com.bwie.xxxxxx.mapper; + +import com.bwie.common.domain.Bicycle; +import com.bwie.common.domain.Records; +import com.bwie.common.domain.Status; +import com.bwie.common.domain.Type; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface BicycleMapper { + List findBicycleList(Bicycle bicycle); + + List findType(); + + List findStatus(); + Integer insertBicycle(Bicycle bicycle); + + List findRecordsList(); + + Integer updaterecordsStatus(Records records); +} diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/BicycleService.java b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/BicycleService.java new file mode 100644 index 0000000..2deb6ab --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/BicycleService.java @@ -0,0 +1,23 @@ +package com.bwie.xxxxxx.service; + +import com.bwie.common.domain.Bicycle; +import com.bwie.common.domain.Records; +import com.bwie.common.domain.Status; +import com.bwie.common.domain.Type; + +import java.util.List; + +public interface BicycleService { + List findBicycleList(Bicycle bicycle); + + List findType(); + + List findStatus(); + + + Integer insertBicycle(Bicycle bicycle); + + List findRecordsList(); + + Integer updaterecordsStatus(Records records); +} diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/impl/BicycleServiceImpl.java b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/impl/BicycleServiceImpl.java new file mode 100644 index 0000000..8e65198 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/java/com/bwie/xxxxxx/service/impl/BicycleServiceImpl.java @@ -0,0 +1,51 @@ +package com.bwie.xxxxxx.service.impl; + +import com.bwie.common.domain.Bicycle; +import com.bwie.common.domain.Records; +import com.bwie.common.domain.Status; +import com.bwie.common.domain.Type; +import com.bwie.xxxxxx.mapper.BicycleMapper; +import com.bwie.xxxxxx.service.BicycleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BicycleServiceImpl implements BicycleService { + + @Autowired + private BicycleMapper bicycleMapper; + + @Override + public List findBicycleList(Bicycle bicycle) { + return bicycleMapper.findBicycleList(bicycle); + } + + @Override + public List findType() { + return bicycleMapper.findType(); + } + + @Override + public List findStatus() { + return bicycleMapper.findStatus(); + } + + @Override + public Integer insertBicycle(Bicycle bicycle) { + return bicycleMapper.insertBicycle(bicycle); + } + + @Override + public List findRecordsList() { + return bicycleMapper.findRecordsList(); + } + + @Override + public Integer updaterecordsStatus(Records records) { + return bicycleMapper.updaterecordsStatus(records); + } + + +} diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/bootstrap.yml b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..d53d5b9 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/bootstrap.yml @@ -0,0 +1,41 @@ +# Tomcat +server: + port: 9004 +# Spring +spring: + main: + allow-circular-references: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + application: + # 应用名称 + name: bwie-bicycle + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 111.229.181.183:8848 + config: + # 配置中心地址 + server-addr: 111.229.181.183:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +fdfs: + so-timeout: 1500 # socket 连接时长 + connect-timeout: 600 # 连接 tracker 服务器超时时长 + # 这两个是你服务器的 IP 地址,注意 23000 端口也要打开,阿里云服务器记得配置安全组。tracker 要和 stroage 服务进行交流 + tracker-list: 111.229.181.183:22122 + web-server-url: 111.229.181.183:8888 + pool: + jmx-enabled: false + # 生成缩略图 + thumb-image: + height: 500 + width: 500 diff --git a/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/mapper/XXXmapper.xml b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/mapper/XXXmapper.xml new file mode 100644 index 0000000..5cd71e5 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-bicycle/src/main/resources/mapper/XXXmapper.xml @@ -0,0 +1,48 @@ + + + + + + + +INSERT INTO `h6_week01`.`bicycle` + (`bicycle_id`, `bicycle_number`, `type_id`, `status_id`) +VALUES + (0, #{bicycleNumber}, #{typeId}, #{statusId}); + + + +UPDATE `h6_week01`.`records` SET `records_status` = #{recordsStatus} WHERE `records_id` = #{recordsId}; + + + + + + + + + + + diff --git a/代码/h6_weekend01/bwie-module/bwie-user/.gitignore b/代码/h6_weekend01/bwie-module/bwie-user/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/代码/h6_weekend01/bwie-module/bwie-user/pom.xml b/代码/h6_weekend01/bwie-module/bwie-user/pom.xml new file mode 100644 index 0000000..ddd6d5f --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + com.bwie + bwie-module + 1.0-SNAPSHOT + + + bwie-user + + + 8 + 8 + UTF-8 + + + + + + com.bwie + bwie-common + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + mysql + mysql-connector-java + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/UserApplication.java b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/UserApplication.java new file mode 100644 index 0000000..1bf0686 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/UserApplication.java @@ -0,0 +1,11 @@ +package com.bwie.user; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UserApplication { + public static void main(String[] args) { + SpringApplication.run(UserApplication.class); + } +} diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/controller/UserController.java b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/controller/UserController.java new file mode 100644 index 0000000..baf0f55 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/controller/UserController.java @@ -0,0 +1,22 @@ +package com.bwie.user.controller; + +import com.bwie.common.domain.User; +import com.bwie.common.result.Result; +import com.bwie.user.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UserController { + + @Autowired + private UserService userService; + + @GetMapping("/findByUserName/{userNmae}") + public Result findByUserName(@PathVariable String userNmae){ + User user = userService.findByUserName(userNmae); + return Result.success(user); + } +} diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/mapper/UserMapper.java b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/mapper/UserMapper.java new file mode 100644 index 0000000..dc121bd --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package com.bwie.user.mapper; + +import com.bwie.common.domain.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper { + User findByUserName(String userNmae); +} diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/UserService.java b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/UserService.java new file mode 100644 index 0000000..dc794bc --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/UserService.java @@ -0,0 +1,7 @@ +package com.bwie.user.service; + +import com.bwie.common.domain.User; + +public interface UserService { + User findByUserName(String userNmae); +} diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/impl/UserServiceImpl.java b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..3472f1f --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/java/com/bwie/user/service/impl/UserServiceImpl.java @@ -0,0 +1,19 @@ +package com.bwie.user.service.impl; + +import com.bwie.common.domain.User; +import com.bwie.user.mapper.UserMapper; +import com.bwie.user.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private UserMapper userMapper; + + @Override + public User findByUserName(String userNmae) { + return userMapper.findByUserName(userNmae); + } +} diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/bootstrap.yml b/代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..8caa169 --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/bootstrap.yml @@ -0,0 +1,29 @@ +# Tomcat +server: + port: 9002 +# Spring +spring: + main: + allow-circular-references: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + application: + # 应用名称 + name: bwie-user + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 111.229.181.183:8848 + config: + # 配置中心地址 + server-addr: 111.229.181.183:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/mapper/UserMapper.xml b/代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..860d2cf --- /dev/null +++ b/代码/h6_weekend01/bwie-module/bwie-user/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/代码/h6_weekend01/bwie-module/pom.xml b/代码/h6_weekend01/bwie-module/pom.xml new file mode 100644 index 0000000..0c7054e --- /dev/null +++ b/代码/h6_weekend01/bwie-module/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + com.bwie + h6_weekend01 + 1.0-SNAPSHOT + + + bwie-module + pom + + bwie-user + bwie-bicycle + + + + 8 + 8 + UTF-8 + + + + + + com.bwie + bwie-common + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + mysql + mysql-connector-java + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + org.springframework.boot + spring-boot-starter-amqp + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + + + + org.springframework + spring-web + 5.3.14 + + + org.springframework.boot + spring-boot-starter-test + test + + + com.github.tobato + fastdfs-client + 1.26.5 + + + + diff --git a/代码/h6_weekend01/pom.xml b/代码/h6_weekend01/pom.xml new file mode 100644 index 0000000..aa57e09 --- /dev/null +++ b/代码/h6_weekend01/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.bwie + h6_weekend01 + 1.0-SNAPSHOT + pom + + bwie-auth + bwie-common + bwie-gateway + bwie-module + + + + 8 + 8 + UTF-8 + + + + + + spring-boot-starter-parent + org.springframework.boot + 2.6.2 + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + 2021.0.0 + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + 2021.1 + pom + import + + + + com.alibaba.nacos + nacos-client + 2.0.4 + + + + + com.bwie + bwie-common + 1.0-SNAPSHOT + + + + + + diff --git a/代码/src/App.vue b/代码/src/App.vue new file mode 100644 index 0000000..ec9032c --- /dev/null +++ b/代码/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/代码/src/api/bicycle.js b/代码/src/api/bicycle.js new file mode 100644 index 0000000..3a3f281 --- /dev/null +++ b/代码/src/api/bicycle.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +export function findBicycleList(data) { + return request({ + url: '/bicycle/findBicycleList', + method: 'post', + data + }) +} + +export function findType() { + return request({ + url: '/bicycle/findType', + method: 'post', + }) +} + + +export function findStatus() { + return request({ + url: '/bicycle/findStatus', + method: 'post', + }) +} + + +export function insertBicycle(data) { + return request({ + url: '/bicycle/insertBicycle', + method: 'post', + data + }) +} + + +export function findRecordsList() { + return request({ + url: '/bicycle/findRecordsList', + method: 'post', + + }) +} + + + +export function updaterecordsStatus(data) { + return request({ + url: '/bicycle/updaterecordsStatus', + method: 'post', + data + }) +} diff --git a/代码/src/api/table.js b/代码/src/api/table.js new file mode 100644 index 0000000..2752f52 --- /dev/null +++ b/代码/src/api/table.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/table/list', + method: 'get', + params + }) +} diff --git a/代码/src/api/user.js b/代码/src/api/user.js new file mode 100644 index 0000000..95515c4 --- /dev/null +++ b/代码/src/api/user.js @@ -0,0 +1,24 @@ +import request from '@/utils/request' + +export function login(data) { + return request({ + url: '/auth/login', + method: 'post', + data + }) +} + +export function getInfo(token) { + return request({ + url: '/auth/userInfo', + method: 'get', + params: { token } + }) +} + +export function logout() { + return request({ + url: '/auth/logout', + method: 'post' + }) +} diff --git a/代码/src/assets/404_images/404.png b/代码/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 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 literal 0 HcmV?d00001 diff --git a/代码/src/assets/404_images/404_cloud.png b/代码/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/代码/src/components/Breadcrumb/index.vue b/代码/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..29f9a04 --- /dev/null +++ b/代码/src/components/Breadcrumb/index.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/代码/src/components/Hamburger/index.vue b/代码/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/代码/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/代码/src/components/SvgIcon/index.vue b/代码/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..b07ded2 --- /dev/null +++ b/代码/src/components/SvgIcon/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/代码/src/icons/index.js b/代码/src/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/代码/src/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/代码/src/icons/svg/dashboard.svg b/代码/src/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/代码/src/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/example.svg b/代码/src/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/代码/src/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/eye-open.svg b/代码/src/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/代码/src/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/eye.svg b/代码/src/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/代码/src/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/form.svg b/代码/src/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/代码/src/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/link.svg b/代码/src/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/代码/src/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/nested.svg b/代码/src/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/代码/src/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/password.svg b/代码/src/icons/svg/password.svg new file mode 100644 index 0000000..e291d85 --- /dev/null +++ b/代码/src/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/table.svg b/代码/src/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/代码/src/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/tree.svg b/代码/src/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/代码/src/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svg/user.svg b/代码/src/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/代码/src/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/代码/src/icons/svgo.yml b/代码/src/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/代码/src/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/代码/src/layout/components/AppMain.vue b/代码/src/layout/components/AppMain.vue new file mode 100644 index 0000000..f6a3286 --- /dev/null +++ b/代码/src/layout/components/AppMain.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/代码/src/layout/components/Navbar.vue b/代码/src/layout/components/Navbar.vue new file mode 100644 index 0000000..0ca5cf6 --- /dev/null +++ b/代码/src/layout/components/Navbar.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/代码/src/layout/components/Sidebar/FixiOSBug.js b/代码/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 0000000..bc14856 --- /dev/null +++ b/代码/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,26 @@ +export default { + computed: { + device() { + return this.$store.state.app.device + } + }, + mounted() { + // In order to fix the click on menu on the ios device will trigger the mouseleave bug + // https://github.com/PanJiaChen/vue-element-admin/issues/1135 + this.fixBugIniOS() + }, + methods: { + fixBugIniOS() { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { + if (this.device === 'mobile') { + return + } + handleMouseleave(e) + } + } + } + } +} diff --git a/代码/src/layout/components/Sidebar/Item.vue b/代码/src/layout/components/Sidebar/Item.vue new file mode 100644 index 0000000..aa1f5da --- /dev/null +++ b/代码/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,41 @@ + + + diff --git a/代码/src/layout/components/Sidebar/Link.vue b/代码/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..530b3d5 --- /dev/null +++ b/代码/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,43 @@ + + + diff --git a/代码/src/layout/components/Sidebar/Logo.vue b/代码/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..040fab6 --- /dev/null +++ b/代码/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/代码/src/layout/components/Sidebar/SidebarItem.vue b/代码/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..a418c3d --- /dev/null +++ b/代码/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,95 @@ + + + diff --git a/代码/src/layout/components/Sidebar/index.vue b/代码/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..da39034 --- /dev/null +++ b/代码/src/layout/components/Sidebar/index.vue @@ -0,0 +1,56 @@ + + + diff --git a/代码/src/layout/components/index.js b/代码/src/layout/components/index.js new file mode 100644 index 0000000..97ee3cd --- /dev/null +++ b/代码/src/layout/components/index.js @@ -0,0 +1,3 @@ +export { default as Navbar } from './Navbar' +export { default as Sidebar } from './Sidebar' +export { default as AppMain } from './AppMain' diff --git a/代码/src/layout/index.vue b/代码/src/layout/index.vue new file mode 100644 index 0000000..db22a7b --- /dev/null +++ b/代码/src/layout/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/代码/src/layout/mixin/ResizeHandler.js b/代码/src/layout/mixin/ResizeHandler.js new file mode 100644 index 0000000..e8d0df8 --- /dev/null +++ b/代码/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +import store from '@/store' + +const { body } = document +const WIDTH = 992 // refer to Bootstrap's responsive design + +export default { + watch: { + $route(route) { + if (this.device === 'mobile' && this.sidebar.opened) { + store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } + }, + beforeMount() { + window.addEventListener('resize', this.$_resizeHandler) + }, + beforeDestroy() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + mounted() { + const isMobile = this.$_isMobile() + if (isMobile) { + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { + const rect = body.getBoundingClientRect() + return rect.width - 1 < WIDTH + }, + $_resizeHandler() { + if (!document.hidden) { + const isMobile = this.$_isMobile() + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') + + if (isMobile) { + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + } + } + } +} diff --git a/代码/src/main.js b/代码/src/main.js new file mode 100644 index 0000000..01cba2f --- /dev/null +++ b/代码/src/main.js @@ -0,0 +1,43 @@ +import Vue from 'vue' + +import 'normalize.css/normalize.css' // A modern alternative to CSS resets + +import ElementUI from 'element-ui' +import 'element-ui/lib/theme-chalk/index.css' +import locale from 'element-ui/lib/locale/lang/en' // lang i18n + +import '@/styles/index.scss' // global css + +import App from './App' +import store from './store' +import router from './router' + +import '@/icons' // icon +import '@/permission' // permission control + +/** + * If you don't want to use mock-server + * you want to use MockJs for mock api + * you can execute: mockXHR() + * + * Currently MockJs will be used in the production environment, + * please remove it before going online ! ! ! + */ +if (process.env.NODE_ENV === 'production') { + const { mockXHR } = require('../mock') + mockXHR() +} + +// set ElementUI lang to EN +Vue.use(ElementUI, { locale }) +// 如果想要中文版 element-ui,按如下方式声明 +// Vue.use(ElementUI) + +Vue.config.productionTip = false + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/代码/src/permission.js b/代码/src/permission.js new file mode 100644 index 0000000..fa1ea19 --- /dev/null +++ b/代码/src/permission.js @@ -0,0 +1,64 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' // progress bar +import 'nprogress/nprogress.css' // progress bar style +import { getToken } from '@/utils/auth' // get token from cookie +import getPageTitle from '@/utils/get-page-title' + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +const whiteList = ['/login'] // no redirect whitelist + +router.beforeEach(async(to, from, next) => { + // start progress bar + NProgress.start() + + // set page title + document.title = getPageTitle(to.meta.title) + + // determine whether the user has logged in + const hasToken = getToken() + + if (hasToken) { + if (to.path === '/login') { + // if is logged in, redirect to the home page + next({ path: '/' }) + NProgress.done() + } else { + const hasGetUserInfo = store.getters.name + if (hasGetUserInfo) { + next() + } else { + try { + // get user info + await store.dispatch('user/getInfo') + + next() + } catch (error) { + // remove token and go to login page to re-login + await store.dispatch('user/resetToken') + Message.error(error || 'Has Error') + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } + } + } else { + /* has no token*/ + + if (whiteList.indexOf(to.path) !== -1) { + // in the free login whitelist, go directly + next() + } else { + // other pages that do not have permission to access are redirected to the login page. + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } +}) + +router.afterEach(() => { + // finish progress bar + NProgress.done() +}) diff --git a/代码/src/router/index.js b/代码/src/router/index.js new file mode 100644 index 0000000..3f01724 --- /dev/null +++ b/代码/src/router/index.js @@ -0,0 +1,195 @@ +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/** + * Note: sub-menu only appear when route children.length >= 1 + * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html + * + * hidden: true if set true, item will not show in the sidebar(default is false) + * alwaysShow: true if set true, will always show the root menu + * if not set alwaysShow, when item has more than one children route, + * it will becomes nested mode, otherwise not show the root menu + * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb + * name:'router-name' the name is used by (must set!!!) + * meta : { + roles: ['admin','editor'] control the page roles (you can set multiple roles) + title: 'title' the name show in sidebar and breadcrumb (recommend set) + icon: 'svg-name'/'el-icon-x' the icon show in the sidebar + breadcrumb: false if set false, the item will hidden in breadcrumb(default is true) + activeMenu: '/example/list' if set path, the sidebar will highlight the path you set + } + */ + +/** + * constantRoutes + * a base page that does not have permission requirements + * all roles can be accessed + */ +export const constantRoutes = [ + { + path: '/login', + component: () => import('@/views/login/index'), + hidden: true + }, + + { + path: '/404', + component: () => import('@/views/404'), + hidden: true + }, + + { + path: '/', + component: Layout, + redirect: '/dashboard', + children: [{ + path: 'dashboard', + name: 'Dashboard', + component: () => import('@/views/dashboard/index'), + meta: { title: 'Dashboard', icon: 'dashboard' } + }] + }, + + { + path: '/example', + component: Layout, + redirect: '/example/table', + name: 'Example', + meta: { title: 'Example', icon: 'el-icon-s-help' }, + children: [ + { + path: 'table', + name: 'Table', + component: () => import('@/views/table/index'), + meta: { title: 'Table', icon: 'table' } + }, + { + path: 'tree', + name: 'Tree', + component: () => import('@/views/tree/index'), + meta: { title: 'Tree', icon: 'tree' } + } + ] + }, + + { + path: '/form', + component: Layout, + children: [ + { + path: 'index', + name: 'Form', + component: () => import('@/views/form/index'), + meta: { title: 'Form', icon: 'form' } + } + ] + }, + + { + path: '/bicycle', + component: Layout, + children: [ + { + path: 'index', + name: 'Form', + component: () => import('@/views/bicycle/index'), + meta: { title: '自行车列表', icon: 'form' } + } + ] + }, + + { + path: '/nested', + component: Layout, + redirect: '/nested/menu1', + name: 'Nested', + meta: { + title: 'Nested', + icon: 'nested' + }, + children: [ + { + path: 'menu1', + component: () => import('@/views/nested/menu1/index'), // Parent router-view + name: 'Menu1', + meta: { title: 'Menu1' }, + children: [ + { + path: 'menu1-1', + component: () => import('@/views/nested/menu1/menu1-1'), + name: 'Menu1-1', + meta: { title: 'Menu1-1' } + }, + { + path: 'menu1-2', + component: () => import('@/views/nested/menu1/menu1-2'), + name: 'Menu1-2', + meta: { title: 'Menu1-2' }, + children: [ + { + path: 'menu1-2-1', + component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'), + name: 'Menu1-2-1', + meta: { title: 'Menu1-2-1' } + }, + { + path: 'menu1-2-2', + component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'), + name: 'Menu1-2-2', + meta: { title: 'Menu1-2-2' } + } + ] + }, + { + path: 'menu1-3', + component: () => import('@/views/nested/menu1/menu1-3'), + name: 'Menu1-3', + meta: { title: 'Menu1-3' } + } + ] + }, + { + path: 'menu2', + component: () => import('@/views/nested/menu2/index'), + name: 'Menu2', + meta: { title: 'menu2' } + } + ] + }, + + { + path: 'external-link', + component: Layout, + children: [ + { + path: 'https://panjiachen.github.io/vue-element-admin-site/#/', + meta: { title: 'External Link', icon: 'link' } + } + ] + }, + + + // 404 page must be placed at the end !!! + { path: '*', redirect: '/404', hidden: true } +] + +const createRouter = () => new Router({ + // mode: 'history', // require service support + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) + +const router = createRouter() + +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 +export function resetRouter() { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + +export default router diff --git a/代码/src/settings.js b/代码/src/settings.js new file mode 100644 index 0000000..ae3c494 --- /dev/null +++ b/代码/src/settings.js @@ -0,0 +1,16 @@ +module.exports = { + + title: 'Vue Admin Template', + + /** + * @type {boolean} true | false + * @description Whether fix the header + */ + fixedHeader: false, + + /** + * @type {boolean} true | false + * @description Whether show the logo in sidebar + */ + sidebarLogo: false +} diff --git a/代码/src/store/getters.js b/代码/src/store/getters.js new file mode 100644 index 0000000..5ab7b4c --- /dev/null +++ b/代码/src/store/getters.js @@ -0,0 +1,8 @@ +const getters = { + sidebar: state => state.app.sidebar, + device: state => state.app.device, + token: state => state.user.token, + avatar: state => state.user.avatar, + name: state => state.user.name +} +export default getters diff --git a/代码/src/store/index.js b/代码/src/store/index.js new file mode 100644 index 0000000..6be466a --- /dev/null +++ b/代码/src/store/index.js @@ -0,0 +1,19 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import getters from './getters' +import app from './modules/app' +import settings from './modules/settings' +import user from './modules/user' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + settings, + user + }, + getters +}) + +export default store diff --git a/代码/src/store/modules/app.js b/代码/src/store/modules/app.js new file mode 100644 index 0000000..7ea7e33 --- /dev/null +++ b/代码/src/store/modules/app.js @@ -0,0 +1,48 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false + }, + device: 'desktop' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/代码/src/store/modules/settings.js b/代码/src/store/modules/settings.js new file mode 100644 index 0000000..b3f33f8 --- /dev/null +++ b/代码/src/store/modules/settings.js @@ -0,0 +1,32 @@ +import defaultSettings from '@/settings' + +const { showSettings, fixedHeader, sidebarLogo } = defaultSettings + +const state = { + showSettings: showSettings, + fixedHeader: fixedHeader, + sidebarLogo: sidebarLogo +} + +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + // eslint-disable-next-line no-prototype-builtins + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/代码/src/store/modules/user.js b/代码/src/store/modules/user.js new file mode 100644 index 0000000..5e0a341 --- /dev/null +++ b/代码/src/store/modules/user.js @@ -0,0 +1,97 @@ +import { login, logout, getInfo } from '@/api/user' +import { getToken, setToken, removeToken } from '@/utils/auth' +import { resetRouter } from '@/router' + +const getDefaultState = () => { + return { + token: getToken(), + name: '', + avatar: '' + } +} + +const state = getDefaultState() + +const mutations = { + RESET_STATE: (state) => { + Object.assign(state, getDefaultState()) + }, + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + } +} + +const actions = { + // user login + login({ commit }, userInfo) { + const { userName, userPwd } = userInfo + return new Promise((resolve, reject) => { + login({ userName: userName.trim(), userPwd: userPwd }).then(response => { + const { data } = response + commit('SET_TOKEN', data.token) + setToken(data.token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // get user info + getInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo(state.token).then(response => { + const { data } = response + + if (!data) { + return reject('Verification failed, please Login again.') + } + + const { name, avatar } = data + + commit('SET_NAME', name) + commit('SET_AVATAR', avatar) + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + removeToken() // must remove token first + resetRouter() + commit('RESET_STATE') + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({ commit }) { + return new Promise(resolve => { + removeToken() // must remove token first + commit('RESET_STATE') + resolve() + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/代码/src/styles/element-ui.scss b/代码/src/styles/element-ui.scss new file mode 100644 index 0000000..0062411 --- /dev/null +++ b/代码/src/styles/element-ui.scss @@ -0,0 +1,49 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} diff --git a/代码/src/styles/index.scss b/代码/src/styles/index.scss new file mode 100644 index 0000000..3b4da51 --- /dev/null +++ b/代码/src/styles/index.scss @@ -0,0 +1,65 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +// main-container global css +.app-container { + padding: 20px; +} diff --git a/代码/src/styles/mixin.scss b/代码/src/styles/mixin.scss new file mode 100644 index 0000000..36b74bb --- /dev/null +++ b/代码/src/styles/mixin.scss @@ -0,0 +1,28 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} diff --git a/代码/src/styles/sidebar.scss b/代码/src/styles/sidebar.scss new file mode 100644 index 0000000..94760cc --- /dev/null +++ b/代码/src/styles/sidebar.scss @@ -0,0 +1,226 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active>.el-submenu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/代码/src/styles/transition.scss b/代码/src/styles/transition.scss new file mode 100644 index 0000000..4cb27cc --- /dev/null +++ b/代码/src/styles/transition.scss @@ -0,0 +1,48 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/代码/src/styles/variables.scss b/代码/src/styles/variables.scss new file mode 100644 index 0000000..be55772 --- /dev/null +++ b/代码/src/styles/variables.scss @@ -0,0 +1,25 @@ +// sidebar +$menuText:#bfcbd9; +$menuActiveText:#409EFF; +$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#304156; +$menuHover:#263445; + +$subMenuBg:#1f2d3d; +$subMenuHover:#001528; + +$sideBarWidth: 210px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/代码/src/utils/auth.js b/代码/src/utils/auth.js new file mode 100644 index 0000000..059af18 --- /dev/null +++ b/代码/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'vue_admin_template_token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} diff --git a/代码/src/utils/get-page-title.js b/代码/src/utils/get-page-title.js new file mode 100644 index 0000000..a6de99d --- /dev/null +++ b/代码/src/utils/get-page-title.js @@ -0,0 +1,10 @@ +import defaultSettings from '@/settings' + +const title = defaultSettings.title || 'Vue Admin Template' + +export default function getPageTitle(pageTitle) { + if (pageTitle) { + return `${pageTitle} - ${title}` + } + return `${title}` +} diff --git a/代码/src/utils/index.js b/代码/src/utils/index.js new file mode 100644 index 0000000..4830c04 --- /dev/null +++ b/代码/src/utils/index.js @@ -0,0 +1,117 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string | null} + */ +export function parseTime(time, cFormat) { + if (arguments.length === 0 || !time) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string')) { + if ((/^[0-9]+$/.test(time))) { + // support "1548221490638" + time = parseInt(time) + } else { + // support safari + // https://stackoverflow.com/questions/4310953/invalid-date-in-safari + time = time.replace(new RegExp(/-/gm), '/') + } + } + + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { + const value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + return value.toString().padStart(2, '0') + }) + return time_str +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} diff --git a/代码/src/utils/request.js b/代码/src/utils/request.js new file mode 100644 index 0000000..d368dc0 --- /dev/null +++ b/代码/src/utils/request.js @@ -0,0 +1,85 @@ +import axios from 'axios' +import { MessageBox, Message } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' + +// create an axios instance +const service = axios.create({ + baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url + // withCredentials: true, // send cookies when cross-domain requests + timeout: 50000 // request timeout +}) + +// request interceptor +service.interceptors.request.use( + config => { + // do something before request is sent + + if (store.getters.token) { + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation + config.headers['token'] = getToken() + } + return config + }, + error => { + // do something with request error + console.log(error) // for debug + return Promise.reject(error) + } +) + +// response interceptor +service.interceptors.response.use( + /** + * If you want to get http information such as headers or status + * Please return response => response + */ + + /** + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code + */ + response => { + const res = response.data + + // if the custom code is not 20000, it is judged as an error. + if (res.code !== 200) { + Message({ + msg: res.msg || 'Error', + type: 'error', + duration: 5 * 1000 + }) + + // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; + if (res.code === 50008 || res.code === 50012 || res.code === 50014) { + // to re-login + MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', { + confirmButtonText: 'Re-Login', + cancelButtonText: 'Cancel', + type: 'warning' + }).then(() => { + store.dispatch('user/resetToken').then(() => { + location.reload() + }) + }) + } + return Promise.reject(new Error(res.msg || 'Error')) + } else { + return res + } + }, + error => { + console.log('err' + error) // for debug + Message({ + msg: error.msg, + type: 'error', + duration: 5 * 1000 + }) + return Promise.reject(error) + } +) + +export default service diff --git a/代码/src/utils/validate.js b/代码/src/utils/validate.js new file mode 100644 index 0000000..8d962ad --- /dev/null +++ b/代码/src/utils/validate.js @@ -0,0 +1,20 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} diff --git a/代码/src/views/404.vue b/代码/src/views/404.vue new file mode 100644 index 0000000..785f55b --- /dev/null +++ b/代码/src/views/404.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/代码/src/views/bicycle/index.vue b/代码/src/views/bicycle/index.vue new file mode 100644 index 0000000..ac77db6 --- /dev/null +++ b/代码/src/views/bicycle/index.vue @@ -0,0 +1,294 @@ + + + + diff --git a/代码/src/views/dashboard/index.vue b/代码/src/views/dashboard/index.vue new file mode 100644 index 0000000..33e5ab6 --- /dev/null +++ b/代码/src/views/dashboard/index.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/代码/src/views/form/index.vue b/代码/src/views/form/index.vue new file mode 100644 index 0000000..08f75dc --- /dev/null +++ b/代码/src/views/form/index.vue @@ -0,0 +1,85 @@ + + + + + + diff --git a/代码/src/views/login/index.vue b/代码/src/views/login/index.vue new file mode 100644 index 0000000..a4e149b --- /dev/null +++ b/代码/src/views/login/index.vue @@ -0,0 +1,237 @@ + + + + + + + diff --git a/代码/src/views/nested/menu1/index.vue b/代码/src/views/nested/menu1/index.vue new file mode 100644 index 0000000..30cb670 --- /dev/null +++ b/代码/src/views/nested/menu1/index.vue @@ -0,0 +1,7 @@ + diff --git a/代码/src/views/nested/menu1/menu1-1/index.vue b/代码/src/views/nested/menu1/menu1-1/index.vue new file mode 100644 index 0000000..27e173a --- /dev/null +++ b/代码/src/views/nested/menu1/menu1-1/index.vue @@ -0,0 +1,7 @@ + diff --git a/代码/src/views/nested/menu1/menu1-2/index.vue b/代码/src/views/nested/menu1/menu1-2/index.vue new file mode 100644 index 0000000..0c86276 --- /dev/null +++ b/代码/src/views/nested/menu1/menu1-2/index.vue @@ -0,0 +1,7 @@ + diff --git a/代码/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue b/代码/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue new file mode 100644 index 0000000..f87d88f --- /dev/null +++ b/代码/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue @@ -0,0 +1,5 @@ + diff --git a/代码/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue b/代码/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue new file mode 100644 index 0000000..d88789f --- /dev/null +++ b/代码/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue @@ -0,0 +1,5 @@ + diff --git a/代码/src/views/nested/menu1/menu1-3/index.vue b/代码/src/views/nested/menu1/menu1-3/index.vue new file mode 100644 index 0000000..f7cd073 --- /dev/null +++ b/代码/src/views/nested/menu1/menu1-3/index.vue @@ -0,0 +1,5 @@ + diff --git a/代码/src/views/nested/menu2/index.vue b/代码/src/views/nested/menu2/index.vue new file mode 100644 index 0000000..19dd48f --- /dev/null +++ b/代码/src/views/nested/menu2/index.vue @@ -0,0 +1,5 @@ + diff --git a/代码/src/views/table/index.vue b/代码/src/views/table/index.vue new file mode 100644 index 0000000..a1ed847 --- /dev/null +++ b/代码/src/views/table/index.vue @@ -0,0 +1,79 @@ + + + diff --git a/代码/src/views/tree/index.vue b/代码/src/views/tree/index.vue new file mode 100644 index 0000000..89c6b01 --- /dev/null +++ b/代码/src/views/tree/index.vue @@ -0,0 +1,78 @@ + + + + diff --git a/理论/img.png b/理论/img.png new file mode 100644 index 0000000000000000000000000000000000000000..a59117645524b5bd7c3061f743f2cda05ee0c452 GIT binary patch literal 119862 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 literal 0 HcmV?d00001