yb пре 3 недеља
родитељ
комит
fb4cc25f3e
100 измењених фајлова са 31 додато и 7234 уклоњено
  1. 3 0
      .gitmodules
  2. 27 27
      .obsidian/workspace.json
  3. 1 0
      yshop/yshop-drink
  4. 0 53
      yshop/yshop-drink/.gitignore
  5. 0 156
      yshop/yshop-drink/CLAUDE.md
  6. 0 3
      yshop/yshop-drink/README.md
  7. 0 4
      yshop/yshop-drink/lombok.config
  8. 0 153
      yshop/yshop-drink/pom.xml
  9. 0 49
      yshop/yshop-drink/script/docker/Docker-HOWTO.md
  10. 0 84
      yshop/yshop-drink/script/docker/docker-compose.yml
  11. 0 25
      yshop/yshop-drink/script/docker/docker.env
  12. 0 160
      yshop/yshop-drink/script/shell/deploy.sh
  13. 0 25
      yshop/yshop-drink/sql/updateV3.1.7-V3.2.0.sql
  14. 0 3
      yshop/yshop-drink/sql/updateV3.2.0-V3.2.1.sql
  15. 0 16
      yshop/yshop-drink/sql/upgradeV3.2.2.sql
  16. 0 8
      yshop/yshop-drink/sql/upgradeV3.2.3.sql
  17. 0 98
      yshop/yshop-drink/sql/yixiang-drink.sql
  18. 0 2
      yshop/yshop-drink/sql/修复同城快递.sql
  19. 0 4
      yshop/yshop-drink/sql/修复更新门店结算.sql
  20. 0 2
      yshop/yshop-drink/sql/数据库导入说明.txt
  21. 0 680
      yshop/yshop-drink/yshop-dependencies/pom.xml
  22. 0 46
      yshop/yshop-drink/yshop-framework/pom.xml
  23. 0 149
      yshop/yshop-drink/yshop-framework/yshop-common/pom.xml
  24. 0 208
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java
  25. 0 57
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/SystemConfigConstants.java
  26. 0 15
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/core/IntArrayValuable.java
  27. 0 22
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/core/KeyValue.java
  28. 0 46
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/CommonStatusEnum.java
  29. 0 46
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DateIntervalEnum.java
  30. 0 21
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DocumentEnum.java
  31. 0 75
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java
  32. 0 21
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderTypeEnum.java
  33. 0 27
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/PayIdEnum.java
  34. 0 80
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/ShopCommonEnum.java
  35. 0 40
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/TerminalEnum.java
  36. 0 39
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/UserTypeEnum.java
  37. 0 34
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/WebFilterOrderEnum.java
  38. 0 32
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/ErrorCode.java
  39. 0 60
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/ServerException.java
  40. 0 60
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/ServiceException.java
  41. 0 41
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/enums/GlobalErrorCodeConstants.java
  42. 0 46
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/enums/ServiceErrorCodeRange.java
  43. 0 77
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/util/ServiceExceptionUtil.java
  44. 0 45
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/params/QueryParam.java
  45. 0 112
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/CommonResult.java
  46. 0 36
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageParam.java
  47. 0 41
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageResult.java
  48. 0 19
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/SortablePageParam.java
  49. 0 37
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/SortingField.java
  50. 0 28
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/serializer/BigDecimalSerializer.java
  51. 0 27
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/serializer/DoubleSerializer.java
  52. 0 49
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/cache/CacheUtils.java
  53. 0 58
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/ArrayUtils.java
  54. 0 322
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/CollectionUtils.java
  55. 0 68
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/MapUtils.java
  56. 0 19
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/SetUtils.java
  57. 0 164
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java
  58. 0 309
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java
  59. 0 126
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java
  60. 0 84
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/FileUtils.java
  61. 0 28
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java
  62. 0 202
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/json/JsonUtils.java
  63. 0 30
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/monitor/TracerUtils.java
  64. 0 131
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/number/MoneyUtils.java
  65. 0 64
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/number/NumberUtils.java
  66. 0 62
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/BeanUtils.java
  67. 0 63
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/ObjectUtils.java
  68. 0 67
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java
  69. 0 127
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/servlet/ServletUtils.java
  70. 0 89
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/spring/SpringExpressionUtils.java
  71. 0 24
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/spring/SpringUtils.java
  72. 0 96
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/string/StrUtils.java
  73. 0 55
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/validation/ValidationUtils.java
  74. 0 47
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/yshop/LocationUtils.java
  75. 0 35
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/InEnum.java
  76. 0 42
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/InEnumCollectionValidator.java
  77. 0 44
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/InEnumValidator.java
  78. 0 28
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/Mobile.java
  79. 0 25
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/MobileValidator.java
  80. 0 28
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/Telephone.java
  81. 0 25
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/TelephoneValidator.java
  82. 0 4
      yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/package-info.java
  83. 0 64
      yshop/yshop-drink/yshop-framework/yshop-common/src/test/java/co/yixiang/yshop/framework/common/util/collection/CollectionUtilsTest.java
  84. 0 52
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/pom.xml
  85. 0 44
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/config/YshopDataPermissionAutoConfiguration.java
  86. 0 34
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/config/YshopDeptDataPermissionAutoConfiguration.java
  87. 0 35
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/annotation/DataPermission.java
  88. 0 36
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java
  89. 0 72
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java
  90. 0 72
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionContextHolder.java
  91. 0 641
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java
  92. 0 36
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/DataPermissionRule.java
  93. 0 28
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/DataPermissionRuleFactory.java
  94. 0 62
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java
  95. 0 205
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java
  96. 0 20
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java
  97. 0 6
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/dept/package-info.java
  98. 0 63
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/util/DataPermissionUtils.java
  99. 0 2
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  100. 0 108
      yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/test/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java

+ 3 - 0
.gitmodules

@@ -0,0 +1,3 @@
+[submodule "yshop/yshop-drink"]
+	path = yshop/yshop-drink
+	url = https://github.com/FanLide/yshop-drink.git

+ 27 - 27
.obsidian/workspace.json

@@ -185,6 +185,33 @@
   },
   "active": "18265060efc4f04b",
   "lastOpenFiles": [
+    "yshop/yshop-drink/yshop-server/target/classes/logback-spring.xml",
+    "yshop/yshop-drink/yshop-server/target/classes/application.yaml",
+    "yshop/yshop-drink/yshop-server/target/classes/application-local.yaml",
+    "yshop/yshop-drink/yshop-server/target/classes/application-dev.yaml",
+    "yshop/yshop-drink/yshop-server/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
+    "yshop/yshop-drink/yshop-server/target/classes/META-INF/spring",
+    "yshop/yshop-drink/yshop-server/target/classes/META-INF",
+    "yshop/yshop-drink/yshop-server/target/test-classes/co/yixiang/yshop/ProjectReactor.class",
+    "yshop/yshop-drink/yshop-server/target/test-classes/co/yixiang/yshop",
+    "yshop/yshop-drink/yshop-server/target/test-classes/co/yixiang",
+    "yshop/yshop-drink/yshop-server/target/test-classes/co",
+    "yshop/yshop-drink/yshop-module-infra/yshop-module-infra-biz/target/classes/file/erweima.jpg",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg9.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg5.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg8.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg7.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg6.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg4.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg3.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg10.png",
+    "yshop/yshop-drink/yshop-module-system/yshop-module-system-biz/target/classes/images/pic-click/bg2.png",
+    "yshop/yshop-drink/CLAUDE.md",
+    "yshop/yshop-drink/script/docker/Docker-HOWTO.md",
+    "yshop/yshop-drink/README.md",
+    "yshop/yshop-drink_bak/script/docker/Docker-HOWTO.md",
+    "yshop/yshop-drink_bak/README.md",
+    "yshop/yshop-drink_bak/CLAUDE.md",
     "askyi/prototype-h5/CLAUDE.md",
     "askyi/askyi-app/CLAUDE.md",
     "askyi/askyilife/CLAUDE.md",
@@ -198,47 +225,20 @@
     "tg-live-game/tg-live-game-web/CLAUDE.md",
     "tg-live-game/tg-live-game-hono/CLAUDE.md",
     "tg-live-game/architecture.canvas",
-    "yshop/yshop-drink-vue/CLAUDE.md.tmp.63721.1767679619494",
     "tg-live-game/workflow.md",
     "tg-live-game/_project.md",
     "tg-live-game/architecture-v1.canvas",
     "tg-live-game/CLAUDE.md",
     "tg-live-game/discuss-2024-12-31.md",
     "tg-live-game/rtsp-cloudflare-stream.canvas",
-    "templates/module.canvas.template",
-    "templates/subsystem.canvas.template",
-    "templates/architecture.canvas.template",
-    "templates/module.claude.md.template",
-    "templates/subproject.claude.md.template",
-    "templates/project.claude.md.template",
     "README.md",
     "CLAUDE.md",
     "yshop/architecture.canvas",
-    "yshop/yshop-drink/README.md",
-    "yshop/yshop-drink/CLAUDE.md",
-    "templates",
     "yshop/backend-modules.canvas",
     "yshop/CLAUDE.md",
     "yshop/database.canvas",
     "architecture.canvas",
     "yshop/yshop-drink-uniapp/CLAUDE.md",
-    "AGENTS.md",
-    "yshop/yshop-drink-vue/CLAUDE.md",
-    "yshop/yshop-drink-vue/src/views/infra/demo/demo03/inner/components/Demo03GradeList.vue",
-    "yshop/yshop-drink-vue/src/views/infra/demo/demo03/normal/components/Demo03GradeForm.vue",
-    "yshop/yshop-drink-vue/public/UEditor22/third-party/video-js/font/vjs.svg",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/wordpaste.png",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/word.gif",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/videologo.gif",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/upload.png",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/unhighlighted.gif",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/toolbar_bg.png",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/tangram-colorpicker.png",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/table-cell-align.png",
-    "yshop/yshop-drink-vue/public/UEditor22/themes/default/images/sparator_v.png",
-    "yshop/yshop-drink-vue/README.md",
-    "yshop/yshop-drink/script/docker/Docker-HOWTO.md",
-    "yshop/yshop-drink-uniapp/uni_modules/uv-waterfall/readme.md",
     "pwtk-admin-web/architecture-v1.canvas",
     "askyi/askyi-h5/pages.canvas"
   ]

+ 1 - 0
yshop/yshop-drink

@@ -0,0 +1 @@
+Subproject commit 1173f3c3b98af49577d99eeab9a7b2cb183015c9

+ 0 - 53
yshop/yshop-drink/.gitignore

@@ -1,53 +0,0 @@
-######################################################################
-# Build Tools
-
-.gradle
-/build/
-!gradle/wrapper/gradle-wrapper.jar
-
-target/
-!.mvn/wrapper/maven-wrapper.jar
-
-.flattened-pom.xml
-
-######################################################################
-# IDE
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-nbproject/private/
-build/*
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
-
-######################################################################
-# Others
-*.log
-*.xml.versionsBackup
-*.swp
-
-!*/build/*.java
-!*/build/*.html
-!*/build/*.xml
-
-### JRebel ###
-rebel.xml
-
-application-my.yaml
-
-

+ 0 - 156
yshop/yshop-drink/CLAUDE.md

@@ -1,156 +0,0 @@
-# YShop Drink 后端 - Claude Code 配置
-
-> 2级子项目配置 | 继承自 yshop (1级)
-
-## 项目信息
-
-| 属性 | 值 |
-|------|-----|
-| 项目名称 | yshop-drink |
-| 所属项目 | yshop |
-| 项目类型 | backend (后端 API) |
-| 版本 | 3.2.3 |
-| Java 版本 | 17 |
-| 框架 | Spring Boot 3.2.2 |
-
-## 技术栈
-
-| 技术 | 版本 | 用途 |
-|------|------|------|
-| Spring Boot | 3.2.2 | 核心框架 |
-| Spring Security | - | 安全认证 |
-| OAuth2 + JWT | - | Token 认证 |
-| MyBatis Plus | - | ORM 框架 |
-| MySQL | 8.x | 数据库 |
-| Redis | - | 缓存/Session |
-| MapStruct | 1.5.5 | 对象映射 |
-| Lombok | 1.18.30 | 代码简化 |
-
-## 项目结构
-
-```
-yshop-drink/
-├── pom.xml                     # 父 POM
-├── yshop-dependencies/         # BOM 依赖管理
-├── yshop-framework/            # 核心框架
-│   ├── yshop-common/           # 通用工具类
-│   ├── yshop-spring-boot-starter-biz-*/  # 业务 Starter
-│   ├── yshop-spring-boot-starter-mybatis/
-│   ├── yshop-spring-boot-starter-redis/
-│   ├── yshop-spring-boot-starter-security/
-│   └── yshop-spring-boot-starter-web/
-├── yshop-server/               # 启动入口
-├── yshop-module-system/        # 系统管理模块
-├── yshop-module-infra/         # 基础设施模块
-├── yshop-module-mall/          # 商城核心模块
-├── yshop-module-member/        # 会员模块
-├── yshop-module-pay/           # 支付模块
-├── yshop-module-mp/            # 微信公众号模块
-├── yshop-module-marketing/     # 营销模块
-├── yshop-module-score/         # 积分模块
-├── yshop-module-message/       # 消息模块
-├── yshop-module-express/       # 物流模块
-├── yshop-module-merchant/      # 商户模块
-└── sql/                        # 数据库脚本
-```
-
-## 模块说明
-
-### 核心业务模块
-
-| 模块 | 路径 | 功能 |
-|------|------|------|
-| mall | `yshop-module-mall` | 商品、订单、门店、购物车、收银 |
-| member | `yshop-module-member` | 会员、地址、账单 |
-| pay | `yshop-module-pay` | 微信支付、余额、充值 |
-| marketing | `yshop-module-marketing` | 优惠券、满减 |
-| score | `yshop-module-score` | 积分商城 |
-
-### 支撑模块
-
-| 模块 | 路径 | 功能 |
-|------|------|------|
-| system | `yshop-module-system` | 用户、角色、菜单、字典 |
-| infra | `yshop-module-infra` | 文件、配置、任务、日志 |
-| message | `yshop-module-message` | 通知、打印 |
-| mp | `yshop-module-mp` | 公众号 |
-| express | `yshop-module-express` | 物流配送 |
-| merchant | `yshop-module-merchant` | 商户管理 |
-
-## 开发命令
-
-```bash
-# 安装依赖
-mvn clean install -DskipTests
-
-# 启动开发服务
-mvn spring-boot:run -pl yshop-server
-
-# 打包
-mvn package -DskipTests
-
-# 单独编译某模块
-mvn compile -pl yshop-module-mall
-
-# 运行测试
-mvn test
-```
-
-## 配置文件
-
-```
-yshop-server/src/main/resources/
-├── application.yaml           # 主配置
-├── application-dev.yaml       # 开发环境
-├── application-prod.yaml      # 生产环境
-└── logback-spring.xml         # 日志配置
-```
-
-## API 文档
-
-启动后访问 Swagger UI:
-- 开发环境: `http://localhost:8080/doc.html`
-
-## 数据库
-
-### 初始化
-```bash
-# 新用户导入完整脚本
-mysql -u root -p < sql/yixiang-drink.sql
-
-# 升级脚本
-mysql -u root -p < sql/updateV3.x.x.sql
-```
-
-### 核心表
-- `yshop_store_product` - 商品
-- `yshop_store_order` - 订单
-- `yshop_store_shop` - 门店
-- `yshop_user` - 会员
-- `yshop_coupon` - 优惠券
-
-## 模块开发规范
-
-每个模块结构:
-```
-yshop-module-xxx/
-├── yshop-module-xxx-api/      # API 定义 (DTO/VO)
-└── yshop-module-xxx-biz/      # 业务实现
-    └── src/main/java/co/yixiang/yshop/module/xxx/
-        ├── controller/
-        │   ├── admin/         # 管理端接口
-        │   └── app/           # 用户端接口
-        ├── service/           # 服务层
-        ├── dal/               # 数据访问层
-        │   ├── dataobject/    # DO 实体
-        │   └── mysql/         # Mapper
-        └── convert/           # 对象转换 (MapStruct)
-```
-
-## 核心文档
-
-| 文档 | 位置 | 内容 |
-|------|------|------|
-| 后端模块 | `../backend-modules.canvas` | 模块关系图 |
-| 数据库设计 | `../database.canvas` | 核心表结构 |
-| API 文档 | Swagger UI | 接口文档 |

+ 0 - 3
yshop/yshop-drink/README.md

@@ -1,3 +0,0 @@
-意向订餐系统,类似肯德基点餐小程序模式,支持多门店模式,基础技术Java,uniapp(支持H5、微信小程序)
-采用当前流行技术组合的前后端分离点餐系统: SpringBoot3+jdk17、Spring Security OAuth2、MybatisPlus、SpringSecurity、jwt、redis、Vue3的前后端分离的系统,
-包含店铺管理、积分兑换、云小票打印、图片素材库、订单管理、多规格sku、积分、优惠券、充值、多门店、微信公众号等功能,更适合企业或个人二次开发.

+ 0 - 4
yshop/yshop-drink/lombok.config

@@ -1,4 +0,0 @@
-config.stopBubbling = true
-lombok.tostring.callsuper=CALL
-lombok.equalsandhashcode.callsuper=CALL
-lombok.accessors.chain=true

+ 0 - 153
yshop/yshop-drink/pom.xml

@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>co.yixiang.boot</groupId>
-    <artifactId>yshop</artifactId>
-    <version>${revision}</version>
-    <packaging>pom</packaging>
-    <modules>
-        <module>yshop-dependencies</module>
-        <module>yshop-framework</module>
-        <!-- Server 主项目 -->
-        <module>yshop-server</module>
-        <!-- 各种 module 拓展 -->
-        <module>yshop-module-system</module>
-        <module>yshop-module-infra</module>
-        <module>yshop-module-pay</module>
-        <module>yshop-module-mp</module>
-        <module>yshop-module-mall</module>
-        <module>yshop-module-message</module>
-        <module>yshop-module-score</module>
-        <module>yshop-module-express</module>
-        <module>yshop-module-marketing</module>
-        <module>yshop-module-member</module>
-        <module>yshop-module-merchant</module>
-    </modules>
-
-    <name>${project.artifactId}</name>
-    <description>yshop项目基础脚手架</description>
-    <url>https://gitee.com/guchengwuyue/yshop-drink</url>
-
-    <properties>
-        <revision>3.2.3</revision>
-        <!-- Maven 相关 -->
-        <java.version>17</java.version>
-        <maven.compiler.source>${java.version}</maven.compiler.source>
-        <maven.compiler.target>${java.version}</maven.compiler.target>
-        <maven-surefire-plugin.version>3.2.2</maven-surefire-plugin.version>
-        <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
-        <flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
-        <!-- 看看咋放到 bom 里 -->
-        <lombok.version>1.18.30</lombok.version>
-        <spring.boot.version>3.2.2</spring.boot.version>
-        <mapstruct.version>1.5.5.Final</mapstruct.version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-dependencies</artifactId>
-                <version>${revision}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <!-- maven-surefire-plugin 插件,用于运行单元测试。 -->
-                <!-- 注意,需要使用 3.0.X+,因为要支持 Junit 5 版本 -->
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>${maven-surefire-plugin.version}</version>
-                </plugin>
-                <!-- maven-compiler-plugin 插件,解决 spring-boot-configuration-processor + Lombok + MapStruct 组合 -->
-                <!-- https://stackoverflow.com/questions/33483697/re-run-spring-boot-configuration-annotation-processor-to-update-generated-metada -->
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>${maven-compiler-plugin.version}</version>
-                    <configuration>
-                        <annotationProcessorPaths>
-                            <path>
-                                <groupId>org.springframework.boot</groupId>
-                                <artifactId>spring-boot-configuration-processor</artifactId>
-                                <version>${spring.boot.version}</version>
-                            </path>
-                            <path>
-                                <groupId>org.projectlombok</groupId>
-                                <artifactId>lombok</artifactId>
-                                <version>${lombok.version}</version>
-                            </path>
-                            <path>
-                                <groupId>org.mapstruct</groupId>
-                                <artifactId>mapstruct-processor</artifactId>
-                                <version>${mapstruct.version}</version>
-                            </path>
-                        </annotationProcessorPaths>
-                        <!-- 编译参数写在 arg 内,解决 Spring Boot 3.2 的 Parameter Name Discovery 问题 -->
-                        <debug>false</debug>
-                        <compilerArgs>
-                            <arg>-parameters</arg>
-                        </compilerArgs>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>flatten-maven-plugin</artifactId>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-
-        <plugins>
-            <!-- 统一 revision 版本 -->
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>flatten-maven-plugin</artifactId>
-                <version>${flatten-maven-plugin.version}</version>
-                <configuration>
-                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
-                    <updatePomFile>true</updatePomFile>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>flatten</goal>
-                        </goals>
-                        <id>flatten</id>
-                        <phase>process-resources</phase>
-                    </execution>
-                    <execution>
-                        <goals>
-                            <goal>clean</goal>
-                        </goals>
-                        <id>flatten.clean</id>
-                        <phase>clean</phase>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <!-- 使用 huawei / aliyun 的 Maven 源,提升下载速度 -->
-    <repositories>
-        <repository>
-            <id>huaweicloud</id>
-            <name>huawei</name>
-            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
-        </repository>
-        <repository>
-            <id>aliyunmaven</id>
-            <name>aliyun</name>
-            <url>https://maven.aliyun.com/repository/public</url>
-        </repository>
-    </repositories>
-
-</project>

+ 0 - 49
yshop/yshop-drink/script/docker/Docker-HOWTO.md

@@ -1,49 +0,0 @@
-# Docker Build & Up
-
-目标: 快速部署体验系统,帮助了解系统之间的依赖关系。
-依赖:docker compose v2,删除`name: yshop-system`,降低`version`版本为`3.3`以下,支持`docker-compose`。
-
-## 功能文件列表
-
-```text
-.
-├── Docker-HOWTO.md                 
-├── docker-compose.yml              
-├── docker.env                      <-- 提供docker-compose环境变量配置
-├── yshop-server
-│   └── Dockerfile
-└── yshop-ui-admin
-    ├── .dockerignore
-    ├── Dockerfile
-    └── nginx.conf                  <-- 提供基础配置,gzip压缩、api转发
-```
-
-## 构建 jar 包
-
-```shell
-# 创建maven缓存volume
-docker volume create --name yshop-maven-repo
-
-docker run -it --rm --name yshop-maven \
-    -v yshop-maven-repo:/root/.m2 \
-    -v $PWD:/usr/src/mymaven \
-    -w /usr/src/mymaven \
-    maven mvn clean install package '-Dmaven.test.skip=true'
-```
-
-## 构建启动服务
-
-```shell
-docker compose --env-file docker.env up -d
-```
-
-首次运行会自动构建容器。可以通过`docker compose build [service]`来手动构建所有或某个docker镜像
-
-`--env-file docker.env`为可选参数,只是展示了通过`.env`文件配置容器启动的环境变量,`docker-compose.yml`本身已经提供足够的默认参数来正常运行系统。
-
-## 服务器的宿主机端口映射
-
-- admin ui: http://localhost:8080
-- api server: http://localhost:48080
-- mysql: root/123456, port: 3306
-- redis: port: 6379

+ 0 - 84
yshop/yshop-drink/script/docker/docker-compose.yml

@@ -1,84 +0,0 @@
-version: "3.4"
-
-name: yshop-system
-
-services:
-  mysql:
-    container_name: yshop-mysql
-    image: mysql:8
-    restart: unless-stopped
-    tty: true
-    ports:
-      - "3306:3306"
-    environment:
-      MYSQL_DATABASE: ${MYSQL_DATABASE:-yixiang-drink}
-      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456}
-    volumes:
-      - mysql:/var/lib/mysql/
-      - ./sql/mysql/yixiang-drink.sql:/docker-entrypoint-initdb.d/yixiang-drink.sql:ro
-
-  redis:
-    container_name: yshop-redis
-    image: redis:6-alpine
-    restart: unless-stopped
-    ports:
-      - "6379:6379"
-    volumes:
-      - redis:/data
-
-  server:
-    container_name: yshop-server
-    build:
-      context: ./yshop-server/
-    image: yshop-server
-    restart: unless-stopped
-    ports:
-      - "48080:48080"
-    environment:
-      # https://github.com/polovyivan/docker-pass-configs-to-container
-      SPRING_PROFILES_ACTIVE: local
-      JAVA_OPTS:
-        ${JAVA_OPTS:-
-          -Xms512m
-          -Xmx512m
-          -Djava.security.egd=file:/dev/./urandom
-        }
-      ARGS:
-        --spring.datasource.dynamic.datasource.master.url=${MASTER_DATASOURCE_URL:-jdbc:mysql://yshop-mysql:3306/yixiang-drink?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true}
-        --spring.datasource.dynamic.datasource.master.username=${MASTER_DATASOURCE_USERNAME:-root}
-        --spring.datasource.dynamic.datasource.master.password=${MASTER_DATASOURCE_PASSWORD:-123456}
-        --spring.datasource.dynamic.datasource.slave.url=${SLAVE_DATASOURCE_URL:-jdbc:mysql://yshop-mysql:3306/yixiang-drink?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true}
-        --spring.datasource.dynamic.datasource.slave.username=${SLAVE_DATASOURCE_USERNAME:-root}
-        --spring.datasource.dynamic.datasource.slave.password=${SLAVE_DATASOURCE_PASSWORD:-123456}
-        --spring.data.redis.host=${REDIS_HOST:-yshop-redis}
-    depends_on:
-      - mysql
-      - redis
-
-  admin:
-    container_name: yshop-admin
-    build:
-      context: ./yshop-ui-admin
-      args:
-        NODE_ENV:
-          ENV=${NODE_ENV:-production}
-          PUBLIC_PATH=${PUBLIC_PATH:-/}
-          VUE_APP_TITLE=${VUE_APP_TITLE:-意象商城管理系统}
-          VUE_APP_BASE_API=${VUE_APP_BASE_API:-/prod-api}
-          VUE_APP_APP_NAME=${VUE_APP_APP_NAME:-/}
-          VUE_APP_TENANT_ENABLE=${VUE_APP_TENANT_ENABLE:-true}
-          VUE_APP_CAPTCHA_ENABLE=${VUE_APP_CAPTCHA_ENABLE:-true}
-          VUE_APP_DOC_ENABLE=${VUE_APP_DOC_ENABLE:-true}
-          VUE_APP_BAIDU_CODE=${VUE_APP_BAIDU_CODE:-fadc1bd5db1a1d6f581df60a1807f8ab}
-    image: yshop-admin
-    restart: unless-stopped
-    ports:
-      - "8080:80"
-    depends_on:
-      - server
-
-volumes:
-  mysql:
-    driver: local
-  redis:
-    driver: local

+ 0 - 25
yshop/yshop-drink/script/docker/docker.env

@@ -1,25 +0,0 @@
-## mysql
-MYSQL_DATABASE=yixiang-drink
-MYSQL_ROOT_PASSWORD=123456
-
-## server
-JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom
-
-MASTER_DATASOURCE_URL=jdbc:mysql://yshop-mysql:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
-MASTER_DATASOURCE_USERNAME=root
-MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD}
-SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL}
-SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME}
-SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD}
-REDIS_HOST=yshop-redis
-
-## admin
-NODE_ENV=production
-PUBLIC_PATH=/
-VUE_APP_TITLE=意象商城管理系统
-VUE_APP_BASE_API=/prod-api
-VUE_APP_APP_NAME=/
-VUE_APP_TENANT_ENABLE=true
-VUE_APP_CAPTCHA_ENABLE=true
-VUE_APP_DOC_ENABLE=true
-VUE_APP_BAIDU_CODE=fadc1bd5db1a1d6f581df60a1807f8ab

+ 0 - 160
yshop/yshop-drink/script/shell/deploy.sh

@@ -1,160 +0,0 @@
-#!/bin/bash
-set -e
-
-DATE=$(date +%Y%m%d%H%M)
-# 基础路径
-BASE_PATH=/work/projects/yshop-server
-# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
-SOURCE_PATH=$BASE_PATH/build
-# 服务名称。同时约定部署服务的 jar 包名字也为它。
-SERVER_NAME=yshop-server
-# 环境
-PROFILES_ACTIVE=development
-# 健康检查 URL
-HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/
-
-# heapError 存放路径
-HEAP_ERROR_PATH=$BASE_PATH/heapError
-# JVM 参数
-JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"
-
-# SkyWalking Agent 配置
-#export SW_AGENT_NAME=$SERVER_NAME
-#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800
-#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84
-#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**"
-#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-
-# 备份
-function backup() {
-    # 如果不存在,则无需备份
-    if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
-        echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"
-    # 如果存在,则备份到 backup 目录下,使用时间作为后缀
-    else
-        echo "[backup] 开始备份 $SERVER_NAME ..."
-        cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
-        echo "[backup] 备份 $SERVER_NAME 完成"
-    fi
-}
-
-# 最新构建代码 移动到项目环境
-function transfer() {
-    echo "[transfer] 开始转移 $SERVER_NAME.jar"
-
-    # 删除原 jar 包
-    if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
-        echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"
-    else
-        echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"
-        rm $BASE_PATH/$SERVER_NAME.jar
-    fi
-
-    # 复制新 jar 包
-    echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."
-    cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH
-
-    echo "[transfer] 转移 $SERVER_NAME.jar 完成"
-}
-
-# 停止:优雅关闭之前已经启动的服务
-function stop() {
-    echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"
-    PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
-    # 如果 Java 服务启动中,则进行关闭
-    if [ -n "$PID" ]; then
-        # 正常关闭
-        echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"
-        kill -15 $PID
-        # 等待最大 120 秒,直到关闭完成。
-        for ((i = 0; i < 120; i++))
-            do
-                sleep 1
-                PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
-                if [ -n "$PID" ]; then
-                    echo -e ".\c"
-                else
-                    echo "[stop] 停止 $BASE_PATH/$SERVER_NAME 成功"
-                    break
-                fi
-		    done
-
-        # 如果正常关闭失败,那么进行强制 kill -9 进行关闭
-        if [ -n "$PID" ]; then
-            echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"
-            kill -9 $PID
-        fi
-    # 如果 Java 服务未启动,则无需关闭
-    else
-        echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"
-    fi
-}
-
-# 启动:启动后端项目
-function start() {
-    # 开启启动前,打印启动参数
-    echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"
-    echo "[start] JAVA_OPS: $JAVA_OPS"
-    echo "[start] JAVA_AGENT: $JAVA_AGENT"
-    echo "[start] PROFILES: $PROFILES_ACTIVE"
-
-    # 开始启动
-    BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE &
-    echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
-}
-
-# 健康检查:自动判断后端项目是否正常启动
-function healthCheck() {
-    # 如果配置健康检查,则进行健康检查
-    if [ -n "$HEALTH_CHECK_URL" ]; then
-        # 健康检查最大 120 秒,直到健康检查通过
-        echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";
-        for ((i = 0; i < 120; i++))
-            do
-                # 请求健康检查地址,只获取状态码。
-                result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`
-                # 如果状态码为 200,则说明健康检查通过
-                if [ "$result" == "200" ]; then
-                    echo "[healthCheck] 健康检查通过";
-                    break
-                # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试
-                else
-                    echo -e ".\c"
-                    sleep 1
-                fi
-            done
-
-        # 健康检查未通过,则异常退出 shell 脚本,不继续部署。
-        if [ ! "$result" == "200" ]; then
-            echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";
-            tail -n 10 nohup.out
-            exit 1;
-        # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。
-        else
-            tail -n 10 nohup.out
-        fi
-    # 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。
-    else
-        echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒";
-        sleep 120
-        echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功";
-        tail -n 50 nohup.out
-    fi
-}
-
-# 部署
-function deploy() {
-    cd $BASE_PATH
-    # 备份原 jar
-    backup
-    # 停止 Java 服务
-    stop
-    # 部署新 jar
-    transfer
-    # 启动 Java 服务
-    start
-    # 健康检查
-    healthCheck
-}
-
-deploy

+ 0 - 25
yshop/yshop-drink/sql/updateV3.1.7-V3.2.0.sql

@@ -1,25 +0,0 @@
-ALTER TABLE `yshop_store_shop` 
-ADD COLUMN `delivery_type` tinyint(1) NULL DEFAULT 1 COMMENT '1-自配送 2-第三方' AFTER `lat`,
-ADD COLUMN `province` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货人所在省' AFTER `images`,
-ADD COLUMN `city` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货人所在市' AFTER `province`,
-ADD COLUMN `district` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货人所在区' AFTER `city`,
-ADD COLUMN `weight` varchar(50) NULL COMMENT '物品总重量' AFTER `district`;
-
-
-
-ALTER TABLE `yshop_express` 
-ADD COLUMN `type` tinyint(1) NULL DEFAULT 0 COMMENT '0-普通 1-同城' AFTER `sort`,
-ADD COLUMN `is_main` tinyint(1) NULL DEFAULT 0 COMMENT '0-否 1-是' AFTER `type`;
-
-ALTER TABLE `yshop_store_order` 
-ADD COLUMN `same_city_task_id` varchar(50) NULL DEFAULT '' COMMENT '同城配送任务ID' AFTER `order_id`,
-ADD COLUMN `same_city_order_id` varchar(100) NULL DEFAULT '' COMMENT '同城配送订单ID' AFTER `same_city_task_id`,
-ADD COLUMN `same_city_delivery_distance` varchar(50) NULL DEFAULT '' COMMENT '同城配送距离' AFTER `same_city_order_id`,
-ADD COLUMN `same_city_delivery_time` varchar(50) NULL DEFAULT '' COMMENT '同城预计配送时间' AFTER `same_city_delivery_distance`,
-ADD COLUMN `same_city_delivery_status` int(5) NULL COMMENT '同城配送订单状态' AFTER `same_city_delivery_time`,
-ADD COLUMN `same_city_delivery_status_des` varchar(50) NULL COMMENT '同城配送订单状态描述' AFTER `same_city_delivery_status`,
-ADD COLUMN `same_city_delivery_courier_name` varchar(50) NULL COMMENT '同城配送订单骑手名称' AFTER `same_city_delivery_status_des`,
-ADD COLUMN `same_city_delivery_courier_mobile` varchar(50) NULL COMMENT '同城配送订单骑手电话' AFTER `same_city_delivery_courier_name`,
-ADD COLUMN `same_city_delivery_expect_finish_time` varchar(50) NULL COMMENT '同城配送订单送达时间' AFTER `same_city_delivery_courier_mobile`;
-
-

+ 0 - 3
yshop/yshop-drink/sql/updateV3.2.0-V3.2.1.sql

@@ -1,3 +0,0 @@
-ALTER TABLE `yshop_shop_desk`
-ADD COLUMN `book_status` tinyint(0) NULL DEFAULT 0 COMMENT '预约状态0-未预约 1-已预约' AFTER `last_order_status`,
-ADD COLUMN `book_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间' AFTER `book_status`

+ 0 - 16
yshop/yshop-drink/sql/upgradeV3.2.2.sql

@@ -1,16 +0,0 @@
-ALTER TABLE `merchant_details`
-    MODIFY COLUMN `key_cert` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'key证书,附加证书使用,如SSL证书,或者银联根级证书方面' AFTER `key_public`,
-    ADD COLUMN `wechat_pay_public_key` varchar(100) NULL COMMENT '微信支付公钥文件路径' AFTER `sub_mch_id`,
-    ADD COLUMN `wechat_pay_public_key_id` varchar(100) NULL COMMENT '微信支付公钥ID' AFTER `wechat_pay_public_key`,
-    ADD COLUMN `private_key` varchar(200) NULL COMMENT '商户API证书私钥文件路径' AFTER `wechat_pay_public_key_id`,
-    ADD COLUMN `key_public_id` varchar(100) NULL DEFAULT '' COMMENT '公钥ID' AFTER `key_private`,
-    ADD COLUMN `certificate_serial_no` varchar(200) NULL COMMENT '商户API证书序列号' AFTER `private_key`;
-
-ALTER TABLE `yshop_store_withdrawal`
-    ADD COLUMN `out_bill_no` varchar(32) NULL DEFAULT '' COMMENT '提现编号唯一' AFTER `month`,
-ADD COLUMN `remark` varchar(32) NULL DEFAULT '' COMMENT '备注' AFTER `out_bill_no`,
-ADD COLUMN `package_info` varchar(255) NULL COMMENT '跳转领取页面的package信息' AFTER `remark`,
-ADD COLUMN `state` varchar(50) NULL COMMENT 'WAIT_USER_CONFIRM1-待收款用户确认SUCCESS-成功' AFTER `remark`;
-
-
-

+ 0 - 8
yshop/yshop-drink/sql/upgradeV3.2.3.sql

@@ -1,8 +0,0 @@
-ALTER TABLE `yshop_store_shop`
-    ADD COLUMN `is_auto_print` tinyint(1) NULL DEFAULT 0 COMMENT '是否自动打印小票0-否1-是' AFTER `admin_id`;
-
-UPDATE `system_menu` SET `name` = '统计', `permission` = '', `type` = 1, `sort` = 62, `parent_id` = 0, `path` = '/statistics', `icon` = 'ep:management', `component` = '', `component_name` = '', `status` = 0, `visible` = b'1', `keep_alive` = b'1', `always_show` = b'1', `creator` = '1', `create_time` = '2024-07-04 14:37:48', `updater` = '1', `update_time` = '2025-12-05 10:51:41', `deleted` = b'0' WHERE `id` = 2378;
-
-INSERT INTO `system_menu`(`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2396, '销售概况', '', 2, 0, 2378, 'sales', 'ep:set-up', 'mall/statistics/sales', 'Sales', 0, b'1', b'1', b'1', '1', '2025-12-05 10:50:33', '1', '2025-12-05 10:52:55', b'0');
-INSERT INTO `system_menu`(`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2397, '订单概况', '', 2, 1, 2378, 'ordersta', 'ep:collection-tag', 'mall/statistics/orders', 'Ordersta', 0, b'1', b'1', b'1', '1', '2025-12-05 10:54:41', '1', '2025-12-05 10:54:41', b'0');
-INSERT INTO `system_menu`(`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2398, '商品概况', '', 2, 2, 2378, 'productsta', 'ep:shopping-cart-full', 'mall/statistics/product', 'Productsta', 0, b'1', b'1', b'1', '1', '2025-12-05 10:55:48', '1', '2025-12-05 10:55:48', b'0');

Разлика између датотеке није приказан због своје велике величине
+ 0 - 98
yshop/yshop-drink/sql/yixiang-drink.sql


+ 0 - 2
yshop/yshop-drink/sql/修复同城快递.sql

@@ -1,2 +0,0 @@
-ALTER TABLE `yshop_store_order`
-ADD COLUMN `address_id` bigint(0) NULL DEFAULT 0 COMMENT '用户地址ID' AFTER `user_phone`

+ 0 - 4
yshop/yshop-drink/sql/修复更新门店结算.sql

@@ -1,4 +0,0 @@
-ALTER TABLE `yshop_store_revenue`
-ADD COLUMN `order_id` varchar(50) NULL DEFAULT '' COMMENT '来源订单ID' AFTER `id`;
-ALTER TABLE `yshop_store_revenue`
-ADD COLUMN `order_type` varchar(20) NULL DEFAULT 'order' COMMENT '订单类型 order-普通订单 withdrawal提现订单' AFTER `id`

+ 0 - 2
yshop/yshop-drink/sql/数据库导入说明.txt

@@ -1,2 +0,0 @@
-1、新用户 可以直接导入yixiang-drink.sql全量sql即可
-2、老用户可以根据说明导入升级sql与修复sql

+ 0 - 680
yshop/yshop-drink/yshop-dependencies/pom.xml

@@ -1,680 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>co.yixiang.boot</groupId>
-    <artifactId>yshop-dependencies</artifactId>
-    <version>${revision}</version>
-    <packaging>pom</packaging>
-
-    <name>${project.artifactId}</name>
-    <description>基础 bom 文件,管理整个项目的依赖版本</description>
-    <url>https://gitee.com/guchengwuyue/yshop-drink</url>
-
-    <properties>
-        <revision>3.2.3</revision>
-        <flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
-        <!-- 统一依赖管理 -->
-        <spring.boot.version>3.2.2</spring.boot.version>
-        <!-- Web 相关 -->
-        <springdoc.version>2.2.0</springdoc.version>
-        <knife4j.version>4.3.0</knife4j.version>
-        <!-- DB 相关 -->
-        <druid.version>1.2.21</druid.version>
-        <mybatis-plus.version>3.5.5</mybatis-plus.version>
-        <mybatis-plus-generator.version>3.5.5</mybatis-plus-generator.version>
-        <dynamic-datasource.version>4.3.0</dynamic-datasource.version>
-        <mybatis-plus-join.version>1.4.10</mybatis-plus-join.version>
-        <easy-trans.version>2.2.11</easy-trans.version>
-        <redisson.version>3.26.0</redisson.version>
-        <dm8.jdbc.version>8.1.3.62</dm8.jdbc.version>
-        <!-- 消息队列 -->
-        <rocketmq-spring.version>2.3.0</rocketmq-spring.version>
-        <!-- 服务保障相关 -->
-        <lock4j.version>2.2.7</lock4j.version>
-        <!-- 监控相关 -->
-        <skywalking.version>9.0.0</skywalking.version>
-        <spring-boot-admin.version>3.2.1</spring-boot-admin.version>
-        <opentracing.version>0.33.0</opentracing.version>
-        <!-- Test 测试相关 -->
-        <podam.version>8.0.1.RELEASE</podam.version>
-        <jedis-mock.version>1.0.13</jedis-mock.version>
-        <mockito-inline.version>5.2.0</mockito-inline.version>
-        <!-- Bpm 工作流相关 -->
-        <flowable.version>7.0.1</flowable.version>
-        <!-- 工具类相关 -->
-        <captcha-plus.version>2.0.3</captcha-plus.version>
-        <jsoup.version>1.17.2</jsoup.version>
-        <lombok.version>1.18.30</lombok.version>
-        <mapstruct.version>1.5.5.Final</mapstruct.version>
-        <hutool-5.version>5.8.25</hutool-5.version>
-        <hutool-6.version>6.0.0-M10</hutool-6.version>
-        <easyexcel.verion>3.3.3</easyexcel.verion>
-        <velocity.version>2.3</velocity.version>
-        <screw.version>1.0.5</screw.version>
-        <fastjson.version>1.2.83</fastjson.version>
-        <guava.version>33.0.0-jre</guava.version>
-        <guice.version>5.1.0</guice.version>
-        <transmittable-thread-local.version>2.14.5</transmittable-thread-local.version>
-        <commons-net.version>3.10.0</commons-net.version>
-        <jsch.version>0.1.55</jsch.version>
-        <tika-core.version>2.9.1</tika-core.version>
-        <ip2region.version>2.7.0</ip2region.version>
-        <bizlog-sdk.version>3.0.6</bizlog-sdk.version>
-        <!-- 三方云服务相关 -->
-        <okio.version>3.5.0</okio.version>
-        <okhttp3.version>4.11.0</okhttp3.version>
-        <commons-io.version>2.15.1</commons-io.version>
-        <minio.version>8.5.7</minio.version>
-        <aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version>
-        <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>
-        <tencentcloud-sdk-java.version>3.1.880</tencentcloud-sdk-java.version>
-        <justauth.version>2.0.5</justauth.version>
-        <jimureport.version>1.6.6-beta2</jimureport.version>
-        <xercesImpl.version>2.12.2</xercesImpl.version>
-        <weixin-java.version>4.6.0</weixin-java.version>
-        <pay.boot.version>1.0.5</pay.boot.version>
-        <pay.version>2.14.9</pay.version>
-        <zxing.version>3.3.3</zxing.version>
-    </properties>
-
-    <dependencyManagement>
-        <dependencies>
-            <!-- 统一依赖管理 -->
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-dependencies</artifactId>
-                <version>${spring.boot.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-
-            <!-- 业务组件 -->
-            <dependency>
-                <groupId>io.github.mouzt</groupId>
-                <artifactId>bizlog-sdk</artifactId>
-                <version>${bizlog-sdk.version}</version>
-                <exclusions>
-                    <exclusion> <!-- 排除掉springboot依赖使用项目的 -->
-                        <groupId>org.springframework.boot</groupId>
-                        <artifactId>spring-boot-starter</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-biz-tenant</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-biz-data-permission</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-biz-ip</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <!-- Spring 核心 -->
-            <dependency>
-                <!-- 用于生成自定义的 Spring @ConfigurationProperties 配置类的说明文件 -->
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-configuration-processor</artifactId>
-                <version>${spring.boot.version}</version>
-            </dependency>
-
-            <!-- Web 相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-web</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-security</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-websocket</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.github.xiaoymin</groupId>
-                <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
-                <version>${knife4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springdoc</groupId>
-                <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
-                <version>${springdoc.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springdoc</groupId>
-                <artifactId>springdoc-openapi-ui</artifactId>
-                <version>${springdoc.version}</version>
-            </dependency>
-
-            <!-- DB 相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-mybatis</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>druid-spring-boot-3-starter</artifactId>
-                <version>${druid.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
-                <version>${mybatis-plus.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>mybatis-plus-generator</artifactId> <!-- 代码生成器,使用它解析表结构 -->
-                <version>${mybatis-plus-generator.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <!-- 多数据源 -->
-                <version>${dynamic-datasource.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.github.yulichang</groupId>
-                <artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 -->
-                <version>${mybatis-plus-join.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.fhs-opensource</groupId> <!-- VO 数据翻译 -->
-                <artifactId>easy-trans-spring-boot-starter</artifactId>
-                <version>${easy-trans.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-context</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework.cloud</groupId>
-                        <artifactId>spring-cloud-commons</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.fhs-opensource</groupId>
-                <artifactId>easy-trans-mybatis-plus-extend</artifactId>
-                <version>${easy-trans.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fhs-opensource</groupId>
-                <artifactId>easy-trans-anno</artifactId>
-                <version>${easy-trans.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-redis</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.redisson</groupId>
-                <artifactId>redisson-spring-boot-starter</artifactId>
-                <version>${redisson.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework.boot</groupId>
-                        <artifactId>spring-boot-starter-actuator</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.dameng</groupId>
-                <artifactId>DmJdbcDriver18</artifactId>
-                <version>${dm8.jdbc.version}</version>
-            </dependency>
-
-            <!-- Job 定时任务相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-job</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <!-- 消息队列相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-mq</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.rocketmq</groupId>
-                <artifactId>rocketmq-spring-boot-starter</artifactId>
-                <version>${rocketmq-spring.version}</version>
-            </dependency>
-
-            <!-- 服务保障相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-protection</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
-                <version>${lock4j.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <artifactId>redisson-spring-boot-starter</artifactId>
-                        <groupId>org.redisson</groupId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <!-- 监控相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-monitor</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.skywalking</groupId>
-                <artifactId>apm-toolkit-trace</artifactId>
-                <version>${skywalking.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.skywalking</groupId>
-                <artifactId>apm-toolkit-logback-1.x</artifactId>
-                <version>${skywalking.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.skywalking</groupId>
-                <artifactId>apm-toolkit-opentracing</artifactId>
-                <version>${skywalking.version}</version>
-                <!--                <exclusions>-->
-                <!--                    <exclusion>-->
-                <!--                        <artifactId>opentracing-api</artifactId>-->
-                <!--                        <groupId>io.opentracing</groupId>-->
-                <!--                    </exclusion>-->
-                <!--                    <exclusion>-->
-                <!--                        <artifactId>opentracing-util</artifactId>-->
-                <!--                        <groupId>io.opentracing</groupId>-->
-                <!--                    </exclusion>-->
-                <!--                </exclusions>-->
-            </dependency>
-            <dependency>
-                <groupId>io.opentracing</groupId>
-                <artifactId>opentracing-api</artifactId>
-                <version>${opentracing.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.opentracing</groupId>
-                <artifactId>opentracing-util</artifactId>
-                <version>${opentracing.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.opentracing</groupId>
-                <artifactId>opentracing-noop</artifactId>
-                <version>${opentracing.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>de.codecentric</groupId>
-                <artifactId>spring-boot-admin-starter-server</artifactId> <!-- 实现 Spring Boot Admin Server 服务端 -->
-                <version>${spring-boot-admin.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>de.codecentric</groupId>
-                        <artifactId>spring-boot-admin-server-cloud</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>de.codecentric</groupId>
-                <artifactId>spring-boot-admin-starter-client</artifactId> <!-- 实现 Spring Boot Admin Server 服务端 -->
-                <version>${spring-boot-admin.version}</version>
-            </dependency>
-
-            <!-- Test 测试相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-test</artifactId>
-                <version>${revision}</version>
-                <scope>test</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>org.mockito</groupId>
-                <artifactId>mockito-inline</artifactId>
-                <version>${mockito-inline.version}</version> <!-- 支持 Mockito 的 final 类与 static 方法的 mock -->
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-starter-test</artifactId>
-                <version>${spring.boot.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <artifactId>asm</artifactId>
-                        <groupId>org.ow2.asm</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.mockito</groupId>
-                        <artifactId>mockito-core</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.github.fppt</groupId> <!-- 单元测试,我们采用内嵌的 Redis 数据库 -->
-                <artifactId>jedis-mock</artifactId>
-                <version>${jedis-mock.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>uk.co.jemos.podam</groupId> <!-- 单元测试,随机生成 POJO 类 -->
-                <artifactId>podam</artifactId>
-                <version>${podam.version}</version>
-            </dependency>
-
-            <!-- 工作流相关 -->
-            <dependency>
-                <groupId>org.flowable</groupId>
-                <artifactId>flowable-spring-boot-starter-process</artifactId>
-                <version>${flowable.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.flowable</groupId>
-                <artifactId>flowable-spring-boot-starter-actuator</artifactId>
-                <version>${flowable.version}</version>
-            </dependency>
-            <!-- 工作流相关结束 -->
-
-            <!-- 工具类相关 -->
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-common</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>co.yixiang.boot</groupId>
-                <artifactId>yshop-spring-boot-starter-excel</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.projectlombok</groupId>
-                <artifactId>lombok</artifactId>
-                <version>${lombok.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.mapstruct</groupId>
-                <artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
-                <version>${mapstruct.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.mapstruct</groupId>
-                <artifactId>mapstruct-jdk8</artifactId>
-                <version>${mapstruct.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.mapstruct</groupId>
-                <artifactId>mapstruct-processor</artifactId>
-                <version>${mapstruct.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>cn.hutool</groupId>
-                <artifactId>hutool-all</artifactId>
-                <version>${hutool-5.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.dromara.hutool</groupId>
-                <artifactId>hutool-extra</artifactId>
-                <version>${hutool-6.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>easyexcel</artifactId>
-                <version>${easyexcel.verion}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>${commons-io.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tika</groupId>
-                <artifactId>tika-core</artifactId> <!-- 文件类型的识别 -->
-                <version>${tika-core.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.velocity</groupId>
-                <artifactId>velocity-engine-core</artifactId>
-                <version>${velocity.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>fastjson</artifactId>
-                <version>${fastjson.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>${guava.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.google.inject</groupId>
-                <artifactId>guice</artifactId>
-                <version>${guice.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>transmittable-thread-local</artifactId> <!-- 解决 ThreadLocal 父子线程的传值问题 -->
-                <version>${transmittable-thread-local.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-net</groupId>
-                <artifactId>commons-net</artifactId> <!-- 解决 ftp 连接 -->
-                <version>${commons-net.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.jcraft</groupId>
-                <artifactId>jsch</artifactId> <!-- 解决 sftp 连接 -->
-                <version>${jsch.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.xingyuv</groupId>
-                <artifactId>spring-boot-starter-captcha-plus</artifactId>
-                <version>${captcha-plus.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.lionsoul</groupId>
-                <artifactId>ip2region</artifactId>
-                <version>${ip2region.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jsoup</groupId>
-                <artifactId>jsoup</artifactId>
-                <version>${jsoup.version}</version>
-            </dependency>
-
-            <!-- 三方云服务相关 -->
-            <dependency>
-                <groupId>com.squareup.okio</groupId>
-                <artifactId>okio</artifactId>
-                <version>${okio.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.squareup.okhttp3</groupId>
-                <artifactId>okhttp</artifactId>
-                <version>${okhttp3.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.minio</groupId>
-                <artifactId>minio</artifactId>
-                <version>${minio.version}</version>
-            </dependency>
-
-            <!-- SMS SDK begin -->
-            <dependency>
-                <groupId>com.aliyun</groupId>
-                <artifactId>aliyun-java-sdk-core</artifactId>
-                <version>${aliyun-java-sdk-core.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <artifactId>opentracing-api</artifactId>
-                        <groupId>io.opentracing</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>opentracing-util</artifactId>
-                        <groupId>io.opentracing</groupId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.aliyun</groupId>
-                <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
-                <version>${aliyun-java-sdk-dysmsapi.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.tencentcloudapi</groupId>
-                <artifactId>tencentcloud-sdk-java-sms</artifactId>
-                <version>${tencentcloud-sdk-java.version}</version>
-            </dependency>
-            <!-- SMS SDK end -->
-
-            <dependency>
-                <groupId>com.xingyuv</groupId>
-                <artifactId>spring-boot-starter-justauth</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) -->
-                <version>${justauth.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>cn.hutool</groupId>
-                        <artifactId>hutool-core</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.github.binarywang</groupId>
-                <artifactId>weixin-java-pay</artifactId>
-                <version>${weixin-java.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.github.binarywang</groupId>
-                <artifactId>wx-java-mp-spring-boot-starter</artifactId>
-                <version>${weixin-java.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.github.binarywang</groupId>
-                <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
-                <version>${weixin-java.version}</version>
-            </dependency>
-
-            <!-- 积木报表-->
-            <dependency>
-                <groupId>org.jeecgframework.jimureport</groupId>
-                <artifactId>jimureport-spring-boot3-starter</artifactId>
-                <version>${jimureport.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>com.alibaba</groupId>
-                        <artifactId>druid</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>xerces</groupId>
-                <artifactId>xercesImpl</artifactId>
-                <version>${xercesImpl.version}</version>
-            </dependency>
-            <!-- pay -->
-            <dependency>
-                <groupId>com.egzosn</groupId>
-                <artifactId>pay-spring-boot-starter</artifactId>
-                <version>${pay.boot.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.egzosn</groupId>
-                <artifactId>pay-java-ali</artifactId>
-                <version>${pay.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.egzosn</groupId>
-                <artifactId>pay-java-wx</artifactId>
-                <version>${pay.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.egzosn</groupId>
-                <artifactId>pay-java-web-support</artifactId>
-                <version>${pay.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.zxing</groupId>
-                <artifactId>core</artifactId>
-                <version>${zxing.version}</version>
-            </dependency>
-
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <plugins>
-            <!-- 统一 revision 版本 -->
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>flatten-maven-plugin</artifactId>
-                <version>${flatten-maven-plugin.version}</version>
-                <configuration>
-                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
-                    <updatePomFile>true</updatePomFile>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>flatten</goal>
-                        </goals>
-                        <id>flatten</id>
-                        <phase>process-resources</phase>
-                    </execution>
-                    <execution>
-                        <goals>
-                            <goal>clean</goal>
-                        </goals>
-                        <id>flatten.clean</id>
-                        <phase>clean</phase>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>

+ 0 - 46
yshop/yshop-drink/yshop-framework/pom.xml

@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>yshop</artifactId>
-        <groupId>co.yixiang.boot</groupId>
-        <version>${revision}</version>
-    </parent>
-    <packaging>pom</packaging>
-    <modules>
-        <module>yshop-common</module>
-        <module>yshop-spring-boot-starter-mybatis</module>
-        <module>yshop-spring-boot-starter-redis</module>
-        <module>yshop-spring-boot-starter-web</module>
-        <module>yshop-spring-boot-starter-security</module>
-        <module>yshop-spring-boot-starter-websocket</module>
-
-        <module>yshop-spring-boot-starter-monitor</module>
-        <module>yshop-spring-boot-starter-protection</module>
-        <module>yshop-spring-boot-starter-job</module>
-        <module>yshop-spring-boot-starter-mq</module>
-
-        <module>yshop-spring-boot-starter-excel</module>
-        <module>yshop-spring-boot-starter-test</module>
-
-        <module>yshop-spring-boot-starter-biz-tenant</module>
-        <module>yshop-spring-boot-starter-biz-data-permission</module>
-        <module>yshop-spring-boot-starter-biz-ip</module>
-    </modules>
-
-    <artifactId>yshop-framework</artifactId>
-    <description>
-        该包是技术组件,每个子包,代表一个组件。每个组件包括两部分:
-            1. core 包:是该组件的核心封装
-            2. config 包:是该组件基于 Spring 的配置
-
-        技术组件,也分成两类:
-            1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展
-            2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。
-        如果是业务组件,Maven 名字会包含 biz
-    </description>
-    <url>https://gitee.com/guchengwuyue/yshop-drink</url>
-
-</project>

+ 0 - 149
yshop/yshop-drink/yshop-framework/yshop-common/pom.xml

@@ -1,149 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>co.yixiang.boot</groupId>
-        <artifactId>yshop-framework</artifactId>
-        <version>${revision}</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>yshop-common</artifactId>
-    <packaging>jar</packaging>
-
-    <name>${project.artifactId}</name>
-    <description>定义基础 pojo 类、枚举、工具类等等</description>
-    <url>https://gitee.com/guchengwuyue/yshop-drink</url>
-
-    <dependencies>
-        <!-- Spring 核心 -->
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-expression</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-aop</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
-        <dependency>
-            <!-- 用于生成自定义的 Spring @ConfigurationProperties 配置类的说明文件 -->
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <!-- Web 相关 -->
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-web</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
-        <dependency>
-            <groupId>jakarta.servlet</groupId>
-            <artifactId>jakarta.servlet-api</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
-        <dependency>
-            <groupId>org.springdoc</groupId>
-            <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,主要是 PageParam 使用到 -->
-        </dependency>
-
-        <!-- 监控相关 -->
-        <dependency>
-            <groupId>org.apache.skywalking</groupId>
-            <artifactId>apm-toolkit-trace</artifactId>
-        </dependency>
-
-        <!-- 工具类相关 -->
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mapstruct</groupId>
-            <artifactId>mapstruct</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.mapstruct</groupId>
-            <artifactId>mapstruct-jdk8</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
-        </dependency>
-        <dependency>
-            <groupId>org.mapstruct</groupId>
-            <artifactId>mapstruct-processor</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-core</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-jsr310</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
-        <dependency>
-            <groupId>jakarta.validation</groupId>
-            <artifactId>jakarta.validation-api</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,主要是 PageParam 使用到 -->
-        </dependency>
-
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>transmittable-thread-local</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fhs-opensource</groupId> <!-- VO 数据翻译 -->
-            <artifactId>easy-trans-anno</artifactId> <!-- 默认引入的原因,方便 xxx-module-api 包使用 -->
-        </dependency>
-
-        <!-- Test 测试相关 -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>

+ 0 - 208
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java

@@ -1,208 +0,0 @@
-/**
- * Copyright (C) 2018-2022
- * All rights reserved, Designed By www.yixiang.co
-
- */
-package co.yixiang.yshop.framework.common.constant;
-
-/**
- * 商城统一常量
- * @author hupeng
- * @since 2020-02-27
- */
-public interface ShopConstants {
-
-	/**
-	 * 订单自动取消时间(分钟)
-	 */
-	long ORDER_OUTTIME_UNPAY = 30;
-	/**
-	 * 订单自动收货时间(分钟)
-	 */
-	long ORDER_OUTTIME_UNCONFIRM = 60;
-
-	/**
-	 * 2小时
-	 */
-	long ORDER_TWO_HOUR = 2;
-	/**
-	 * redis订单未付款key
-	 */
-	String REDIS_ORDER_OUTTIME_UNPAY_QUEUE = "order-unpay-cancel-queue";
-
-	/**
-	 * 扫码自动确认key
-	 */
-	String REDIS_ORDER_DESK_CONFIRM = "order:desk:confirm";
-
-	/**
-	 * 预约自动确认key
-	 */
-	String REDIS_ORDER_DUE_CONFIRM = "order:due:confirm";
-
-	/**
-	 * redis订单收货key
-	 */
-	String REDIS_ORDER_OUTTIME_UNCONFIRM = "order:unconfirm:";
-
-	/**
-	 * redis拼团key
-	 */
-	String REDIS_PINK_CANCEL_KEY = "pink:cancel:";
-
-	/**
-	 * 微信支付service
-	 */
-	String YSHOP_WEIXIN_PAY_SERVICE = "yshop_weixin_pay_service";
-
-	/**
-	 * 微信支付小程序service
-	 */
-	String YSHOP_WEIXIN_MINI_PAY_SERVICE = "yshop_weixin_mini_pay_service";
-
-	/**
-	 * 微信支付app service
-	 */
-	String YSHOP_WEIXIN_APP_PAY_SERVICE = "yshop_weixin_app_pay_service";
-
-	/**
-	 * 微信公众号service
-	 */
-	String YSHOP_WEIXIN_MP_SERVICE = "yshop_weixin_mp_service";
-	/**
-	 * 微信小程序service
-	 */
-	String YSHOP_WEIXIN_MA_SERVICE = "yshop_weixin_ma_service";
-
-	/**
-	 * 商城默认密码
-	 */
-	String YSHOP_DEFAULT_PWD = "123456";
-
-	/**
-	 * 商城默认注册图片
-	 */
-	String YSHOP_DEFAULT_AVATAR = "https://image.dayouqiantu.cn/5e79f6cfd33b6.png";
-
-	/**
-	 * 腾讯地图地址解析
-	 */
-	String QQ_MAP_URL = "https://apis.map.qq.com/ws/geocoder/v1/";
-
-	/**
-	 * redis首页键
-	 */
-	String YSHOP_REDIS_INDEX_KEY = "yshop:index_data";
-
-	/**
-	 * 配置列表缓存
-	 */
-	String YSHOP_REDIS_CONFIG_DATAS = "yshop:config_datas";
-
-	/**
-	 * 充值方案
-	 */
-	String YSHOP_RECHARGE_PRICE_WAYS = "yshop_recharge_price_ways";
-	/**
-	 * 首页banner
-	 */
-	String YSHOP_HOME_BANNER = "yshop_home_banner";
-	/**
-	 * 首页菜单
-	 */
-	String YSHOP_HOME_MENUS = "yshop_home_menus";
-	/**
-	 * 首页滚动新闻
-	 */
-	String YSHOP_HOME_ROLL_NEWS = "yshop_home_roll_news";
-	/**
-	 * 热门搜索
-	 */
-	String YSHOP_HOT_SEARCH = "yshop_hot_search";
-	/**
-	 * 个人中心菜单
-	 */
-	String YSHOP_MY_MENUES = "yshop_my_menus";
-	/**
-	 * 秒杀时间段
-	 */
-	String YSHOP_SECKILL_TIME = "yshop_seckill_time";
-	/**
-	 * 签到天数
-	 */
-	String YSHOP_SIGN_DAY_NUM = "yshop_sign_day_num";
-
-	/**
-	 * 打印机配置
-	 */
-	String YSHOP_ORDER_PRINT_COUNT = "order_print_count";
-	/**
-	 * 飞蛾用户信息
-	 */
-	String YSHOP_FEI_E_USER = "fei_e_user";
-	/**
-	 * 飞蛾用户密钥
-	 */
-	String YSHOP_FEI_E_UKEY= "fei_e_ukey";
-
-	/**
-	 * 打印机配置
-	 */
-	String YSHOP_ORDER_PRINT_COUNT_DETAIL = "order_print_count_detail";
-
-	/**
-	 * 短信验证码长度
-	 */
-	int YSHOP_SMS_SIZE = 6;
-
-	/**
-	 * 短信缓存时间
-	 */
-	long YSHOP_SMS_REDIS_TIME = 600L;
-
-	//零标识
-	String YSHOP_ZERO =  "0";
-
-	//业务标识标识
-	String YSHOP_ONE =  "1";
-
-	//目前完成任务数量是3
-	int TASK_FINISH_COUNT = 3;
-
-	int YSHOP_ONE_NUM = 1;
-
-	String YSHOP_ORDER_CACHE_KEY = "yshop:order";
-
-	String YSHOP_ORDER_SALE_STATUS_KEY = "yshop:order:sale:status";
-
-	long YSHOP_ORDER_CACHE_TIME = 3600L;
-
-	String WECHAT_MENUS =  "wechat_menus";
-
-	String YSHOP_EXPRESS_SERVICE = "yshop_express_service";
-
-	String YSHOP_REDIS_SYS_CITY_KEY = "yshop:city_list";
-
-	String YSHOP_REDIS_CITY_KEY = "yshop:city";
-
-	String YSHOP_APP_LOGIN_USER = "app-online-token:";
-
-	String YSHOP_WECHAT_PUSH_REMARK = "yshop为您服务!";
-
-	String DEFAULT_UNI_H5_URL = "https://h5.yixiang.co";
-
-	String YSHOP_MINI_SESSION_KET = "yshop:session_key:";
-
-	/**公众号二维码*/
-	String WECHAT_FOLLOW_IMG="wechat_follow_img";
-	/**后台api地址*/
-	String ADMIN_API_URL="admin_api_url";
-
-	//快递查询接口Logistic
-	String KDNIAO_LOGISTIC_QUERY="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
-
-	//跳转到扫码页面
-	String PAGE_GOOD_HOME = "pages/components/pages/scan/scan";
-
-	String DAY_COUNT_KEY = "day_count_key:";
-}

+ 0 - 57
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/SystemConfigConstants.java

@@ -1,57 +0,0 @@
-package co.yixiang.yshop.framework.common.constant;
-
-public class SystemConfigConstants {
-    //地址配置
-    public final static String API="api";
-    public final static String API_URL="api_url";
-    public final static String SITE_URL="site_url";
-    public final static String UNI_SITE_URL="uni_site_url";
-    public final static String TENGXUN_MAP_KEY="tengxun_map_key";
-    public final static String FILE_STORE_MODE="file_store_mode";
-    //业务相关配置
-    public final static String IMAGEARR="imageArr";
-    public final static String INTERGRAL_FULL="integral_full";
-    public final static String INTERGRAL_MAX="integral_max";
-    public final static String INTERGRAL_RATIO="integral_ratio";
-    public final static String ORDER_CANCEL_JOB_TIME="order_cancel_job_time";
-    public final static String STORE_BROKERAGE_OPEN="store_brokerage_open";
-    public final static String STORE_BROKERAGE_RATIO="store_brokerage_ratio";
-    public final static String STORE_BROKERAGE_STATU="store_brokerage_statu";
-    public final static String STORE_BROKERAGE_TWO="store_brokerage_two";
-    public final static String STORE_FREE_POSTAGE="store_free_postage";
-    public final static String STORE_POSTAGE="store_postage";
-    public final static String STORE_SEFL_MENTION="store_self_mention";
-    public final static String STORE_USER_MIN_RECHARGE="store_user_min_recharge";
-    public final static String USER_EXTRACT_MIN_PRICE="user_extract_min_price";
-    public final static String YSHOP_SHOW_RECHARGE = "yshop_show_recharge";
-    //微信相关配置
-    public final static String WECHAT_APPID="wechat_appid";
-    public final static String WECHAT_APPSECRET="wechat_appsecret";
-    public final static String WECHAT_AVATAR="wechat_avatar";
-    public final static String WECHAT_ENCODE="wechat_encode";
-    public final static String WECHAT_ENCODINGAESKEY="wechat_encodingaeskey";
-    public final static String WECHAT_ID="wechat_id";
-    public final static String WECHAT_NAME="wechat_name";
-    public final static String WECHAT_QRCODE="wechat_qrcode";
-    public final static String WECHAT_SHARE_IMG="wechat_share_img";
-    public final static String WECHAT_SHARE_SYNOPSIS="wechat_share_synopsis";
-    public final static String WECHAT_SHARE_TITLE="wechat_share_title";
-    public final static String WECHAT_SOURCEID="wechat_sourceid";
-    public final static String WECHAT_TOKEN="wechat_token";
-    public final static String WECHAT_MA_TOKEN="wechat_ma_token";
-    public final static String WECHAT_MA_ENCODINGAESKEY="wechat_ma_encodingaeskey";
-    public final static String WECHAT_TYPE="wechat_type";
-    public final static String WXAPP_APPID="wxapp_appId";
-    public final static String WXAPP_SECRET="wxapp_secret";
-    public final static String WXPAY_APPID="wxpay_appId";
-    public final static String WXPAY_KEYPATH="wxpay_keyPath";
-    public final static String WXPAY_MCHID="wxpay_mchId";
-    public final static String WXPAY_MCHKEY="wxpay_mchKey";
-    public final static String WX_NATIVE_APP_APPID="wx_native_app_appId";
-    public final static String EXP_APPID = "exp_appId";
-
-
-    //播放状态变化事件,detail = {code}
-    public static final String BINDSTATECHANGE = "bindstatechange";
-
-}

+ 0 - 15
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/core/IntArrayValuable.java

@@ -1,15 +0,0 @@
-package co.yixiang.yshop.framework.common.core;
-
-/**
- * 可生成 Int 数组的接口
- *
- * @author yshop
- */
-public interface IntArrayValuable {
-
-    /**
-     * @return int 数组
-     */
-    int[] array();
-
-}

+ 0 - 22
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/core/KeyValue.java

@@ -1,22 +0,0 @@
-package co.yixiang.yshop.framework.common.core;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * Key Value 的键值对
- *
- * @author yshop
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class KeyValue<K, V> implements Serializable {
-
-    private K key;
-    private V value;
-
-}

+ 0 - 46
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/CommonStatusEnum.java

@@ -1,46 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-import cn.hutool.core.util.ObjUtil;
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 通用状态枚举
- *
- * @author yshop
- */
-@Getter
-@AllArgsConstructor
-public enum CommonStatusEnum implements IntArrayValuable {
-
-    ENABLE(0, "开启"),
-    DISABLE(1, "关闭");
-
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray();
-
-    /**
-     * 状态值
-     */
-    private final Integer status;
-    /**
-     * 状态名
-     */
-    private final String name;
-
-    @Override
-    public int[] array() {
-        return ARRAYS;
-    }
-
-    public static boolean isEnable(Integer status) {
-        return ObjUtil.equal(ENABLE.status, status);
-    }
-
-    public static boolean isDisable(Integer status) {
-        return ObjUtil.equal(DISABLE.status, status);
-    }
-
-}

+ 0 - 46
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DateIntervalEnum.java

@@ -1,46 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-import cn.hutool.core.util.ArrayUtil;
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 时间间隔的枚举
- *
- * @author dhb52
- */
-@Getter
-@AllArgsConstructor
-public enum DateIntervalEnum implements IntArrayValuable {
-
-    DAY(1, "天"),
-    WEEK(2, "周"),
-    MONTH(3, "月"),
-    QUARTER(4, "季度"),
-    YEAR(5, "年")
-    ;
-
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DateIntervalEnum::getInterval).toArray();
-
-    /**
-     * 类型
-     */
-    private final Integer interval;
-    /**
-     * 名称
-     */
-    private final String name;
-
-    @Override
-    public int[] array() {
-        return ARRAYS;
-    }
-
-    public static DateIntervalEnum valueOf(Integer interval) {
-        return ArrayUtil.firstMatch(item -> item.getInterval().equals(interval), DateIntervalEnum.values());
-    }
-
-}

+ 0 - 21
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/DocumentEnum.java

@@ -1,21 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 文档地址
- *
- * @author yshop
- */
-@Getter
-@AllArgsConstructor
-public enum DocumentEnum {
-
-    REDIS_INSTALL("https://gitee.com/zhijiantianya/yixiang-drink/issues/I4VCSJ", "Redis 安装文档"),
-    TENANT("https://www.yixiang.co", "SaaS 多租户文档");
-
-    private final String url;
-    private final String memo;
-
-}

+ 0 - 75
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java

@@ -1,75 +0,0 @@
-/**
- * Copyright (C) 2018-2022
- * All rights reserved, Designed By www.yixiang.co
-
- */
-package co.yixiang.yshop.framework.common.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.stream.Stream;
-
-/**
- * @author hupeng
- * 订单相关枚举
- */
-@Getter
-@AllArgsConstructor
-public enum OrderInfoEnum {
-
-	STATUS_NE1(-1,"申请退款"),
-	STATUS_NE2(-2,"退款成功"),
-	STATUS_0(0,"默认"),
-	STATUS_1(1,"待收货"),
-	STATUS_2(2,"已收货"),
-	STATUS_3(3,"已完成"),
-
-	PAY_STATUS_0(0,"未支付"),
-	PAY_STATUS_1(1,"已支付"),
-
-	REFUND_STATUS_0(0,"正常"),
-	REFUND_STATUS_1(1,"退款中"),
-	REFUND_STATUS_2(2,"已退款"),
-
-	BARGAIN_STATUS_1(1,"参与中"),
-	BARGAIN_STATUS_2(2,"参与失败"),
-	BARGAIN_STATUS_3(3,"参与成功"),
-
-	PINK_STATUS_1(1,"进行中"),
-	PINK_STATUS_2(2,"已完成"),
-	PINK_STATUS_3(3,"未完成"),
-
-	PINK_REFUND_STATUS_0(0,"拼团正常"),
-	PINK_REFUND_STATUS_1(1,"拼团已退款"),
-
-	CANCEL_STATUS_0(0,"正常"),
-	CANCEL_STATUS_1(1,"已取消"),
-
-	CONFIRM_STATUS_0(0,"正常"),
-	CONFIRM_STATUS_1(1,"确认"),
-
-	PAY_CHANNEL_0(0,"公众号/H5支付渠道"),
-	PAY_CHANNEL_1(1,"小程序支付渠道"),
-
-	DESK_ORDER_STATUS_CONFIRM(0,"确认完成"),
-	DESK_ORDER_STATUS_ING(1,"就餐中"),
-
-
-	SHIPPIING_TYPE_1(1,"快递"),
-	SHIPPIING_TYPE_2(2,"门店自提");
-
-
-
-	private Integer value;
-	private String desc;
-
-	public static OrderInfoEnum toType(int value) {
-		return Stream.of(OrderInfoEnum.values())
-				.filter(p -> p.value == value)
-				.findAny()
-				.orElse(null);
-	}
-
-
-}

+ 0 - 21
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderTypeEnum.java

@@ -1,21 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author hupeng
- * 类型枚举
- */
-@Getter
-@AllArgsConstructor
-public enum OrderTypeEnum {
-    COMMON_ORDER("order","普通订单"),
-    WITH_ORDER("withdrawal","提现订单"),
-    TYPE_WORK("work","工作台"),
-    TYPE_COMMON("common","普通");
-
-    private String value;
-    private String desc;
-}

+ 0 - 27
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/PayIdEnum.java

@@ -1,27 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author hupeng
- * 支付ID枚举
- */
-@Getter
-@AllArgsConstructor
-public enum PayIdEnum {
-    WX_H5("wx_h5","微信支付H5"),
-    WX_MINIAPP("wx_miniapp","微信支付小程序"),
-    WX_WECHAT("wx_wechat","微信支付公众号"),
-    WX_PC("wx_pc","微信支付pc"),
-    WX_APP("wx_app","微信支付app"),
-    ALI_H5("ali_h5","支付宝H5"),
-    ALI_MINIAPP("ali_miniapp","支付宝小程序"),
-    ALI_WECHAT("ali_wechat","支付宝公众号"),
-    ALI_PC("ali_pc","支付宝pc"),
-    ALI_APP("ali_app","支付宝app");
-
-    private String value;
-    private String desc;
-}

+ 0 - 80
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/ShopCommonEnum.java

@@ -1,80 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author hupeng
- * 商城常用枚举
- */
-@Getter
-@AllArgsConstructor
-public enum ShopCommonEnum {
-
-    STORE_MODE_1(1,"本地存储"),
-    STORE_MODE_2(2,"云存储"),
-
-    ENABLE_1(1,"开启"),
-    ENABLE_2(2,"关闭"),
-
-    EXTRACT_MINUS_1(-1,"提现未通过"),
-    EXTRACT_0(0,"提现审核中"),
-    EXTRACT_1(1,"提现已完成"),
-
-    IS_FINISH_0(0,"未完成"),
-    IS_FINISH_1(1,"已完成"),
-
-    IS_FOREVER_0(0,"不是永久"),
-    IS_FOREVER_1(1,"永久"),
-
-    AGREE_1(1,"同意"),
-    AGREE_2(2,"拒绝"),
-
-    IS_PERMANENT_0(0,"限制"),
-    IS_PERMANENT_1(1,"不限制"),
-
-    IS_STATUS_0(0,"否"),
-    IS_STATUS_1(1,"是"),
-
-
-    IS_PROMOTER_0(0,"默认"),
-    IS_PROMOTER_1(1,"是客服"),
-
-    IS_NEW_0(0,"默认"),
-    IS_NEW_1(1,"新品"),
-
-    IS_SUB_0(0,"不单独分佣"),
-    IS_SUB_1(1,"单独分佣"),
-
-
-    GRADE_0(0,"一级推荐人"),
-    GRADE_1(1,"二级推荐人"),
-
-    REPLY_0(0,"未回复"),
-    REPLY_1(1,"已回复"),
-
-    ADD_1(1,"增加"),
-    ADD_2(2,"减少"),
-
-    DELETE_0(0,"未删除"),
-    DELETE_1(1,"已删除"),
-
-    SHOW_0(0,"不显示"),
-    SHOW_1(1,"显示"),
-
-    NO(0, "否"),
-    YES(1, "是"),
-
-    DELIVERY_1(1, "商家自己配送"),
-    DELIVERY_2(2, "第三方配送"),
-
-
-    DEFAULT_0(0,"不是默认"),
-    DEFAULT_1(1,"默认");
-
-
-
-
-    private Integer value;
-    private String desc;
-}

+ 0 - 40
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/TerminalEnum.java

@@ -1,40 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Arrays;
-
-/**
- * 终端的枚举
- *
- * @author yshop
- */
-@RequiredArgsConstructor
-@Getter
-public enum TerminalEnum implements IntArrayValuable {
-
-    UNKNOWN(0, "未知"), // 目的:在无法解析到 terminal 时,使用它
-    WECHAT_MINI_PROGRAM(10, "微信小程序"),
-    WECHAT_WAP(11, "微信公众号"),
-    H5(20, "H5 网页"),
-    APP(31, "手机 App"),
-    ;
-
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TerminalEnum::getTerminal).toArray();
-
-    /**
-     * 终端
-     */
-    private final Integer terminal;
-    /**
-     * 终端名
-     */
-    private final String name;
-
-    @Override
-    public int[] array() {
-        return ARRAYS;
-    }
-}

+ 0 - 39
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/UserTypeEnum.java

@@ -1,39 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-import cn.hutool.core.util.ArrayUtil;
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 全局用户类型枚举
- */
-@AllArgsConstructor
-@Getter
-public enum UserTypeEnum implements IntArrayValuable {
-
-    MEMBER(1, "会员"), // 面向 c 端,普通用户
-    ADMIN(2, "管理员"); // 面向 b 端,管理后台
-
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(UserTypeEnum::getValue).toArray();
-
-    /**
-     * 类型
-     */
-    private final Integer value;
-    /**
-     * 类型名
-     */
-    private final String name;
-
-    public static UserTypeEnum valueOf(Integer value) {
-        return ArrayUtil.firstMatch(userType -> userType.getValue().equals(value), UserTypeEnum.values());
-    }
-
-    @Override
-    public int[] array() {
-        return ARRAYS;
-    }
-}

+ 0 - 34
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/WebFilterOrderEnum.java

@@ -1,34 +0,0 @@
-package co.yixiang.yshop.framework.common.enums;
-
-/**
- * Web 过滤器顺序的枚举类,保证过滤器按照符合我们的预期
- *
- *  考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 enums 包下
- *
- * @author yshop
- */
-public interface WebFilterOrderEnum {
-
-    int CORS_FILTER = Integer.MIN_VALUE;
-
-    int TRACE_FILTER = CORS_FILTER + 1;
-
-    int REQUEST_BODY_CACHE_FILTER = Integer.MIN_VALUE + 500;
-
-    // OrderedRequestContextFilter 默认为 -105,用于国际化上下文等等
-
-    int TENANT_CONTEXT_FILTER = - 104; // 需要保证在 ApiAccessLogFilter 前面
-
-    int API_ACCESS_LOG_FILTER = -103; // 需要保证在 RequestBodyCacheFilter 后面
-
-    int XSS_FILTER = -102;  // 需要保证在 RequestBodyCacheFilter 后面
-
-    // Spring Security Filter 默认为 -100,可见 org.springframework.boot.autoconfigure.security.SecurityProperties 配置属性类
-
-    int TENANT_SECURITY_FILTER = -99; // 需要保证在 Spring Security 过滤器后面
-
-    int FLOWABLE_FILTER = -98; // 需要保证在 Spring Security 过滤后面
-
-    int DEMO_FILTER = Integer.MAX_VALUE;
-
-}

+ 0 - 32
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/ErrorCode.java

@@ -1,32 +0,0 @@
-package co.yixiang.yshop.framework.common.exception;
-
-import co.yixiang.yshop.framework.common.exception.enums.GlobalErrorCodeConstants;
-import co.yixiang.yshop.framework.common.exception.enums.ServiceErrorCodeRange;
-import lombok.Data;
-
-/**
- * 错误码对象
- *
- * 全局错误码,占用 [0, 999], 参见 {@link GlobalErrorCodeConstants}
- * 业务异常错误码,占用 [1 000 000 000, +∞),参见 {@link ServiceErrorCodeRange}
- *
- * TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备
- */
-@Data
-public class ErrorCode {
-
-    /**
-     * 错误码
-     */
-    private final Integer code;
-    /**
-     * 错误提示
-     */
-    private final String msg;
-
-    public ErrorCode(Integer code, String message) {
-        this.code = code;
-        this.msg = message;
-    }
-
-}

+ 0 - 60
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/ServerException.java

@@ -1,60 +0,0 @@
-package co.yixiang.yshop.framework.common.exception;
-
-import co.yixiang.yshop.framework.common.exception.enums.GlobalErrorCodeConstants;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 服务器异常 Exception
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public final class ServerException extends RuntimeException {
-
-    /**
-     * 全局错误码
-     *
-     * @see GlobalErrorCodeConstants
-     */
-    private Integer code;
-    /**
-     * 错误提示
-     */
-    private String message;
-
-    /**
-     * 空构造方法,避免反序列化问题
-     */
-    public ServerException() {
-    }
-
-    public ServerException(ErrorCode errorCode) {
-        this.code = errorCode.getCode();
-        this.message = errorCode.getMsg();
-    }
-
-    public ServerException(Integer code, String message) {
-        this.code = code;
-        this.message = message;
-    }
-
-    public Integer getCode() {
-        return code;
-    }
-
-    public ServerException setCode(Integer code) {
-        this.code = code;
-        return this;
-    }
-
-    @Override
-    public String getMessage() {
-        return message;
-    }
-
-    public ServerException setMessage(String message) {
-        this.message = message;
-        return this;
-    }
-
-}

+ 0 - 60
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/ServiceException.java

@@ -1,60 +0,0 @@
-package co.yixiang.yshop.framework.common.exception;
-
-import co.yixiang.yshop.framework.common.exception.enums.ServiceErrorCodeRange;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 业务逻辑异常 Exception
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public final class ServiceException extends RuntimeException {
-
-    /**
-     * 业务错误码
-     *
-     * @see ServiceErrorCodeRange
-     */
-    private Integer code;
-    /**
-     * 错误提示
-     */
-    private String message;
-
-    /**
-     * 空构造方法,避免反序列化问题
-     */
-    public ServiceException() {
-    }
-
-    public ServiceException(ErrorCode errorCode) {
-        this.code = errorCode.getCode();
-        this.message = errorCode.getMsg();
-    }
-
-    public ServiceException(Integer code, String message) {
-        this.code = code;
-        this.message = message;
-    }
-
-    public Integer getCode() {
-        return code;
-    }
-
-    public ServiceException setCode(Integer code) {
-        this.code = code;
-        return this;
-    }
-
-    @Override
-    public String getMessage() {
-        return message;
-    }
-
-    public ServiceException setMessage(String message) {
-        this.message = message;
-        return this;
-    }
-
-}

+ 0 - 41
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/enums/GlobalErrorCodeConstants.java

@@ -1,41 +0,0 @@
-package co.yixiang.yshop.framework.common.exception.enums;
-
-import co.yixiang.yshop.framework.common.exception.ErrorCode;
-
-/**
- * 全局错误码枚举
- * 0-999 系统异常编码保留
- *
- * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
- * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的
- * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。
- *
- * @author yshop
- */
-public interface GlobalErrorCodeConstants {
-
-    ErrorCode SUCCESS = new ErrorCode(0, "成功");
-
-    // ========== 客户端错误段 ==========
-
-    ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
-    ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录");
-    ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
-    ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
-    ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
-    ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许
-    ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试");
-
-    // ========== 服务端错误段 ==========
-
-    ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
-    ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启");
-    ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项");
-
-    // ========== 自定义错误段 ==========
-    ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求
-    ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作");
-
-    ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");
-
-}

+ 0 - 46
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/enums/ServiceErrorCodeRange.java

@@ -1,46 +0,0 @@
-package co.yixiang.yshop.framework.common.exception.enums;
-
-/**
- * 业务异常的错误码区间,解决:解决各模块错误码定义,避免重复,在此只声明不做实际使用
- *
- * 一共 10 位,分成四段
- *
- * 第一段,1 位,类型
- *      1 - 业务级别异常
- *      x - 预留
- * 第二段,3 位,系统类型
- *      001 - 用户系统
- *      002 - 商品系统
- *      003 - 订单系统
- *      004 - 支付系统
- *      005 - 优惠劵系统
- *      ... - ...
- * 第三段,3 位,模块
- *      不限制规则。
- *      一般建议,每个系统里面,可能有多个模块,可以再去做分段。以用户系统为例子:
- *          001 - OAuth2 模块
- *          002 - User 模块
- *          003 - MobileCode 模块
- * 第四段,3 位,错误码
- *       不限制规则。
- *       一般建议,每个模块自增。
- *
- * @author yshop
- */
-public class ServiceErrorCodeRange {
-
-    // 模块 infra 错误码区间 [1-001-000-000 ~ 1-002-000-000)
-    // 模块 system 错误码区间 [1-002-000-000 ~ 1-003-000-000)
-    // 模块 report 错误码区间 [1-003-000-000 ~ 1-004-000-000)
-    // 模块 member 错误码区间 [1-004-000-000 ~ 1-005-000-000)
-    // 模块 mp 错误码区间 [1-006-000-000 ~ 1-007-000-000)
-    // 模块 pay 错误码区间 [1-007-000-000 ~ 1-008-000-000)
-    // 模块 bpm 错误码区间 [1-009-000-000 ~ 1-010-000-000)
-
-    // 模块 product 错误码区间 [1-008-000-000 ~ 1-009-000-000)
-    // 模块 trade 错误码区间 [1-011-000-000 ~ 1-012-000-000)
-    // 模块 promotion 错误码区间 [1-013-000-000 ~ 1-014-000-000)
-
-    // 模块 crm 错误码区间 [1-020-000-000 ~ 1-021-000-000)
-
-}

+ 0 - 77
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/exception/util/ServiceExceptionUtil.java

@@ -1,77 +0,0 @@
-package co.yixiang.yshop.framework.common.exception.util;
-
-import co.yixiang.yshop.framework.common.exception.ErrorCode;
-import co.yixiang.yshop.framework.common.exception.ServiceException;
-import co.yixiang.yshop.framework.common.exception.enums.GlobalErrorCodeConstants;
-import com.google.common.annotations.VisibleForTesting;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * {@link ServiceException} 工具类
- *
- * 目的在于,格式化异常信息提示。
- * 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化
- *
- */
-@Slf4j
-public class ServiceExceptionUtil {
-
-    // ========== 和 ServiceException 的集成 ==========
-
-    public static ServiceException exception(ErrorCode errorCode) {
-        return exception0(errorCode.getCode(), errorCode.getMsg());
-    }
-
-    public static ServiceException exception(ErrorCode errorCode, Object... params) {
-        return exception0(errorCode.getCode(), errorCode.getMsg(), params);
-    }
-
-    public static ServiceException exception0(Integer code, String messagePattern, Object... params) {
-        String message = doFormat(code, messagePattern, params);
-        return new ServiceException(code, message);
-    }
-
-    public static ServiceException invalidParamException(String messagePattern, Object... params) {
-        return exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), messagePattern, params);
-    }
-
-    // ========== 格式化方法 ==========
-
-    /**
-     * 将错误编号对应的消息使用 params 进行格式化。
-     *
-     * @param code           错误编号
-     * @param messagePattern 消息模版
-     * @param params         参数
-     * @return 格式化后的提示
-     */
-    @VisibleForTesting
-    public static String doFormat(int code, String messagePattern, Object... params) {
-        StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);
-        int i = 0;
-        int j;
-        int l;
-        for (l = 0; l < params.length; l++) {
-            j = messagePattern.indexOf("{}", i);
-            if (j == -1) {
-                log.error("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
-                if (i == 0) {
-                    return messagePattern;
-                } else {
-                    sbuf.append(messagePattern.substring(i));
-                    return sbuf.toString();
-                }
-            } else {
-                sbuf.append(messagePattern, i, j);
-                sbuf.append(params[l]);
-                i = j + 2;
-            }
-        }
-        if (messagePattern.indexOf("{}", i) != -1) {
-            log.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
-        }
-        sbuf.append(messagePattern.substring(i));
-        return sbuf.toString();
-    }
-
-}

+ 0 - 45
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/params/QueryParam.java

@@ -1,45 +0,0 @@
-/**
- * Copyright (C) 2018-2022
- * All rights reserved, Designed By www.yixiang.co
-
- */
-package co.yixiang.yshop.framework.common.params;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.io.Serializable;
-
-
-@Data
-@Schema(description = "用户 APP - 查询参数对象")
-public abstract class QueryParam implements Serializable{
-    private static final long serialVersionUID = -3263921252635611410L;
-
-    @Schema(description = "页码,默认为1", required = true)
-	private Integer page =1;
-
-    @Schema(description = "页大小,默认为10", required = true)
-	private Integer limit = 10;
-
-    @Schema(description = "搜索字符串", required = true)
-    private String keyword;
-
-//    @Schema(description = "当前第几页", required = true)
-//    public void setCurrent(Integer current) {
-//	    if (current == null || current <= 0){
-//	        this.page = 1;
-//        }else{
-//            this.page = current;
-//        }
-//    }
-//
-//    public void setSize(Integer size) {
-//	    if (size == null || size <= 0){
-//	        this.limit = 10;
-//        }else{
-//            this.limit = size;
-//        }
-//    }
-
-}

+ 0 - 112
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/CommonResult.java

@@ -1,112 +0,0 @@
-package co.yixiang.yshop.framework.common.pojo;
-
-import co.yixiang.yshop.framework.common.exception.ErrorCode;
-import co.yixiang.yshop.framework.common.exception.ServiceException;
-import co.yixiang.yshop.framework.common.exception.enums.GlobalErrorCodeConstants;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import lombok.Data;
-import org.springframework.util.Assert;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-/**
- * 通用返回
- *
- * @param <T> 数据泛型
- */
-@Data
-public class CommonResult<T> implements Serializable {
-
-    /**
-     * 错误码
-     *
-     * @see ErrorCode#getCode()
-     */
-    private Integer code;
-    /**
-     * 返回数据
-     */
-    private T data;
-    /**
-     * 错误提示,用户可阅读
-     *
-     * @see ErrorCode#getMsg() ()
-     */
-    private String msg;
-
-    /**
-     * 将传入的 result 对象,转换成另外一个泛型结果的对象
-     *
-     * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。
-     *
-     * @param result 传入的 result 对象
-     * @param <T>    返回的泛型
-     * @return 新的 CommonResult 对象
-     */
-    public static <T> CommonResult<T> error(CommonResult<?> result) {
-        return error(result.getCode(), result.getMsg());
-    }
-
-    public static <T> CommonResult<T> error(Integer code, String message) {
-        Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!");
-        CommonResult<T> result = new CommonResult<>();
-        result.code = code;
-        result.msg = message;
-        return result;
-    }
-
-    public static <T> CommonResult<T> error(ErrorCode errorCode) {
-        return error(errorCode.getCode(), errorCode.getMsg());
-    }
-
-    public static <T> CommonResult<T> success(T data) {
-        CommonResult<T> result = new CommonResult<>();
-        result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
-        result.data = data;
-        result.msg = "";
-        return result;
-    }
-
-    public static boolean isSuccess(Integer code) {
-        return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode());
-    }
-
-    @JsonIgnore // 避免 jackson 序列化
-    public boolean isSuccess() {
-        return isSuccess(code);
-    }
-
-    @JsonIgnore // 避免 jackson 序列化
-    public boolean isError() {
-        return !isSuccess();
-    }
-
-    // ========= 和 Exception 异常体系集成 =========
-
-    /**
-     * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常
-     */
-    public void checkError() throws ServiceException {
-        if (isSuccess()) {
-            return;
-        }
-        // 业务异常
-        throw new ServiceException(code, msg);
-    }
-
-    /**
-     * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常
-     * 如果没有,则返回 {@link #data} 数据
-     */
-    @JsonIgnore // 避免 jackson 序列化
-    public T getCheckedData() {
-        checkError();
-        return data;
-    }
-
-    public static <T> CommonResult<T> error(ServiceException serviceException) {
-        return error(serviceException.getCode(), serviceException.getMessage());
-    }
-
-}

+ 0 - 36
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageParam.java

@@ -1,36 +0,0 @@
-package co.yixiang.yshop.framework.common.pojo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import jakarta.validation.constraints.Min;
-import jakarta.validation.constraints.Max;
-import jakarta.validation.constraints.NotNull;
-import java.io.Serializable;
-
-@Schema(description="分页参数")
-@Data
-public class PageParam implements Serializable {
-
-    private static final Integer PAGE_NO = 1;
-    private static final Integer PAGE_SIZE = 10;
-
-    /**
-     * 每页条数 - 不分页
-     *
-     * 例如说,导出接口,可以设置 {@link #pageSize} 为 -1 不分页,查询所有数据。
-     */
-    public static final Integer PAGE_SIZE_NONE = -1;
-
-    @Schema(description = "页码,从 1 开始", requiredMode = Schema.RequiredMode.REQUIRED,example = "1")
-    @NotNull(message = "页码不能为空")
-    @Min(value = 1, message = "页码最小值为 1")
-    private Integer pageNo = PAGE_NO;
-
-    @Schema(description = "每页条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @NotNull(message = "每页条数不能为空")
-    @Min(value = 1, message = "每页条数最小值为 1")
-    @Max(value = 100, message = "每页条数最大值为 100")
-    private Integer pageSize = PAGE_SIZE;
-
-}

+ 0 - 41
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/PageResult.java

@@ -1,41 +0,0 @@
-package co.yixiang.yshop.framework.common.pojo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-@Schema(description = "分页结果")
-@Data
-public final class PageResult<T> implements Serializable {
-
-    @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED)
-    private List<T> list;
-
-    @Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED)
-    private Long total;
-
-    public PageResult() {
-    }
-
-    public PageResult(List<T> list, Long total) {
-        this.list = list;
-        this.total = total;
-    }
-
-    public PageResult(Long total) {
-        this.list = new ArrayList<>();
-        this.total = total;
-    }
-
-    public static <T> PageResult<T> empty() {
-        return new PageResult<>(0L);
-    }
-
-    public static <T> PageResult<T> empty(Long total) {
-        return new PageResult<>(total);
-    }
-
-}

+ 0 - 19
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/SortablePageParam.java

@@ -1,19 +0,0 @@
-package co.yixiang.yshop.framework.common.pojo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.util.List;
-
-@Schema(description = "可排序的分页参数")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SortablePageParam extends PageParam {
-
-    @Schema(description = "排序字段")
-    private List<SortingField> sortingFields;
-
-}

+ 0 - 37
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/pojo/SortingField.java

@@ -1,37 +0,0 @@
-package co.yixiang.yshop.framework.common.pojo;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * 排序字段 DTO
- *
- * 类名加了 ing 的原因是,避免和 ES SortField 重名。
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class SortingField implements Serializable {
-
-    /**
-     * 顺序 - 升序
-     */
-    public static final String ORDER_ASC = "asc";
-    /**
-     * 顺序 - 降序
-     */
-    public static final String ORDER_DESC = "desc";
-
-    /**
-     * 字段
-     */
-    private String field;
-    /**
-     * 顺序
-     */
-    private String order;
-
-}

+ 0 - 28
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/serializer/BigDecimalSerializer.java

@@ -1,28 +0,0 @@
-package co.yixiang.yshop.framework.common.serializer;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-
-/**
- * @author :LionCity
- * @date :Created in 2020-05-30 14:12
- * @description:
- * @modified By:
- * @version:
- */
-public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
-    @Override
-    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
-        if (value != null && !"".equals(value)) {
-            DecimalFormat df2 =new DecimalFormat("0.00");
-            gen.writeString(df2.format(value));
-        } else {
-            gen.writeString(value + "");
-        }
-    }
-}

+ 0 - 27
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/serializer/DoubleSerializer.java

@@ -1,27 +0,0 @@
-package co.yixiang.yshop.framework.common.serializer;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-import java.text.DecimalFormat;
-
-/**
- * @author :LionCity
- * @date :Created in 2020-05-30 14:12
- * @description:
- * @modified By:
- * @version:
- */
-public class DoubleSerializer extends JsonSerializer<Double> {
-    @Override
-    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
-        if (value != null && !"".equals(value)) {
-            DecimalFormat df2 =new DecimalFormat("0.00");
-            gen.writeString(df2.format(value));
-        } else {
-            gen.writeString(value + "");
-        }
-    }
-}

+ 0 - 49
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/cache/CacheUtils.java

@@ -1,49 +0,0 @@
-package co.yixiang.yshop.framework.common.util.cache;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-
-import java.time.Duration;
-import java.util.concurrent.Executors;
-
-/**
- * Cache 工具类
- *
- * @author yshop
- */
-public class CacheUtils {
-
-    /**
-     * 构建异步刷新的 LoadingCache 对象
-     *
-     * 注意:如果你的缓存和 ThreadLocal 有关系,要么自己处理 ThreadLocal 的传递,要么使用 {@link #buildCache(Duration, CacheLoader)} 方法
-     *
-     * 或者简单理解:
-     * 1、和“人”相关的,使用 {@link #buildCache(Duration, CacheLoader)} 方法
-     * 2、和“全局”、“系统”相关的,使用当前缓存方法
-     *
-     * @param duration 过期时间
-     * @param loader  CacheLoader 对象
-     * @return LoadingCache 对象
-     */
-    public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
-        return CacheBuilder.newBuilder()
-                // 只阻塞当前数据加载线程,其他线程返回旧值
-                .refreshAfterWrite(duration)
-                // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
-                .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置
-    }
-
-    /**
-     * 构建同步刷新的 LoadingCache 对象
-     *
-     * @param duration 过期时间
-     * @param loader  CacheLoader 对象
-     * @return LoadingCache 对象
-     */
-    public static <K, V> LoadingCache<K, V> buildCache(Duration duration, CacheLoader<K, V> loader) {
-        return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader);
-    }
-
-}

+ 0 - 58
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/ArrayUtils.java

@@ -1,58 +0,0 @@
-package co.yixiang.yshop.framework.common.util.collection;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.collection.IterUtil;
-import cn.hutool.core.util.ArrayUtil;
-
-import java.util.Collection;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-import static co.yixiang.yshop.framework.common.util.collection.CollectionUtils.convertList;
-
-/**
- * Array 工具类
- *
- * @author yshop
- */
-public class ArrayUtils {
-
-    /**
-     * 将 object 和 newElements 合并成一个数组
-     *
-     * @param object 对象
-     * @param newElements 数组
-     * @param <T> 泛型
-     * @return 结果数组
-     */
-    @SafeVarargs
-    public static <T> Consumer<T>[] append(Consumer<T> object, Consumer<T>... newElements) {
-        if (object == null) {
-            return newElements;
-        }
-        Consumer<T>[] result = ArrayUtil.newArray(Consumer.class, 1 + newElements.length);
-        result[0] = object;
-        System.arraycopy(newElements, 0, result, 1, newElements.length);
-        return result;
-    }
-
-    public static <T, V> V[] toArray(Collection<T> from, Function<T, V> mapper) {
-        return toArray(convertList(from, mapper));
-    }
-
-    @SuppressWarnings("unchecked")
-    public static <T> T[] toArray(Collection<T> from) {
-        if (CollectionUtil.isEmpty(from)) {
-            return (T[]) (new Object[0]);
-        }
-        return ArrayUtil.toArray(from, (Class<T>) IterUtil.getElementType(from.iterator()));
-    }
-
-    public static <T> T get(T[] array, int index) {
-        if (null == array || index >= array.length) {
-            return null;
-        }
-        return array[index];
-    }
-
-}

+ 0 - 322
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/CollectionUtils.java

@@ -1,322 +0,0 @@
-package co.yixiang.yshop.framework.common.util.collection;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.ArrayUtil;
-import com.google.common.collect.ImmutableMap;
-
-import java.util.*;
-import java.util.function.*;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static java.util.Arrays.asList;
-
-/**
- * Collection 工具类
- *
- * @author yshop
- */
-public class CollectionUtils {
-
-    public static boolean containsAny(Object source, Object... targets) {
-        return asList(targets).contains(source);
-    }
-
-    public static boolean isAnyEmpty(Collection<?>... collections) {
-        return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty);
-    }
-
-    public static <T> boolean anyMatch(Collection<T> from, Predicate<T> predicate) {
-        return from.stream().anyMatch(predicate);
-    }
-
-    public static <T> List<T> filterList(Collection<T> from, Predicate<T> predicate) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return from.stream().filter(predicate).collect(Collectors.toList());
-    }
-
-    public static <T, R> List<T> distinct(Collection<T> from, Function<T, R> keyMapper) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return distinct(from, keyMapper, (t1, t2) -> t1);
-    }
-
-    public static <T, R> List<T> distinct(Collection<T> from, Function<T, R> keyMapper, BinaryOperator<T> cover) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return new ArrayList<>(convertMap(from, keyMapper, Function.identity(), cover).values());
-    }
-
-    public static <T, U> List<U> convertList(T[] from, Function<T, U> func) {
-        if (ArrayUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return convertList(Arrays.asList(from), func);
-    }
-
-    public static <T, U> List<U> convertList(Collection<T> from, Function<T, U> func) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList());
-    }
-
-    public static <T, U> List<U> convertList(Collection<T> from, Function<T, U> func, Predicate<T> filter) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList());
-    }
-
-    public static <T, U> List<U> convertListByFlatMap(Collection<T> from,
-                                                      Function<T, ? extends Stream<? extends U>> func) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return from.stream().filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList());
-    }
-
-    public static <T, U, R> List<R> convertListByFlatMap(Collection<T> from,
-                                                         Function<? super T, ? extends U> mapper,
-                                                         Function<U, ? extends Stream<? extends R>> func) {
-        if (CollUtil.isEmpty(from)) {
-            return new ArrayList<>();
-        }
-        return from.stream().map(mapper).filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList());
-    }
-
-    public static <K, V> List<V> mergeValuesFromMap(Map<K, List<V>> map) {
-        return map.values()
-                .stream()
-                .flatMap(List::stream)
-                .collect(Collectors.toList());
-    }
-
-    public static <T> Set<T> convertSet(Collection<T> from) {
-        return convertSet(from, v -> v);
-    }
-
-    public static <T, U> Set<U> convertSet(Collection<T> from, Function<T, U> func) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashSet<>();
-        }
-        return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet());
-    }
-
-    public static <T, U> Set<U> convertSet(Collection<T> from, Function<T, U> func, Predicate<T> filter) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashSet<>();
-        }
-        return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toSet());
-    }
-
-    public static <T, K> Map<K, T> convertMapByFilter(Collection<T> from, Predicate<T> filter, Function<T, K> keyFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return from.stream().filter(filter).collect(Collectors.toMap(keyFunc, v -> v));
-    }
-
-    public static <T, U> Set<U> convertSetByFlatMap(Collection<T> from,
-                                                    Function<T, ? extends Stream<? extends U>> func) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashSet<>();
-        }
-        return from.stream().filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet());
-    }
-
-    public static <T, U, R> Set<R> convertSetByFlatMap(Collection<T> from,
-                                                       Function<? super T, ? extends U> mapper,
-                                                       Function<U, ? extends Stream<? extends R>> func) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashSet<>();
-        }
-        return from.stream().map(mapper).filter(Objects::nonNull).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet());
-    }
-
-    public static <T, K> Map<K, T> convertMap(Collection<T> from, Function<T, K> keyFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return convertMap(from, keyFunc, Function.identity());
-    }
-
-    public static <T, K> Map<K, T> convertMap(Collection<T> from, Function<T, K> keyFunc, Supplier<? extends Map<K, T>> supplier) {
-        if (CollUtil.isEmpty(from)) {
-            return supplier.get();
-        }
-        return convertMap(from, keyFunc, Function.identity(), supplier);
-    }
-
-    public static <T, K, V> Map<K, V> convertMap(Collection<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1);
-    }
-
-    public static <T, K, V> Map<K, V> convertMap(Collection<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc, BinaryOperator<V> mergeFunction) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return convertMap(from, keyFunc, valueFunc, mergeFunction, HashMap::new);
-    }
-
-    public static <T, K, V> Map<K, V> convertMap(Collection<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc, Supplier<? extends Map<K, V>> supplier) {
-        if (CollUtil.isEmpty(from)) {
-            return supplier.get();
-        }
-        return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1, supplier);
-    }
-
-    public static <T, K, V> Map<K, V> convertMap(Collection<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc, BinaryOperator<V> mergeFunction, Supplier<? extends Map<K, V>> supplier) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return from.stream().collect(Collectors.toMap(keyFunc, valueFunc, mergeFunction, supplier));
-    }
-
-    public static <T, K> Map<K, List<T>> convertMultiMap(Collection<T> from, Function<T, K> keyFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(t -> t, Collectors.toList())));
-    }
-
-    public static <T, K, V> Map<K, List<V>> convertMultiMap(Collection<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return from.stream()
-                .collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toList())));
-    }
-
-    // 暂时没想好名字,先以 2 结尾噶
-    public static <T, K, V> Map<K, Set<V>> convertMultiMap2(Collection<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return new HashMap<>();
-        }
-        return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet())));
-    }
-
-    public static <T, K> Map<K, T> convertImmutableMap(Collection<T> from, Function<T, K> keyFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return Collections.emptyMap();
-        }
-        ImmutableMap.Builder<K, T> builder = ImmutableMap.builder();
-        from.forEach(item -> builder.put(keyFunc.apply(item), item));
-        return builder.build();
-    }
-
-    /**
-     * 对比老、新两个列表,找出新增、修改、删除的数据
-     *
-     * @param oldList  老列表
-     * @param newList  新列表
-     * @param sameFunc 对比函数,返回 true 表示相同,返回 false 表示不同
-     *                 注意,same 是通过每个元素的“标识”,判断它们是不是同一个数据
-     * @return [新增列表、修改列表、删除列表]
-     */
-    public static <T> List<List<T>> diffList(Collection<T> oldList, Collection<T> newList,
-                                             BiFunction<T, T, Boolean> sameFunc) {
-        List<T> createList = new LinkedList<>(newList); // 默认都认为是新增的,后续会进行移除
-        List<T> updateList = new ArrayList<>();
-        List<T> deleteList = new ArrayList<>();
-
-        // 通过以 oldList 为主遍历,找出 updateList 和 deleteList
-        for (T oldObj : oldList) {
-            // 1. 寻找是否有匹配的
-            T foundObj = null;
-            for (Iterator<T> iterator = createList.iterator(); iterator.hasNext(); ) {
-                T newObj = iterator.next();
-                // 1.1 不匹配,则直接跳过
-                if (!sameFunc.apply(oldObj, newObj)) {
-                    continue;
-                }
-                // 1.2 匹配,则移除,并结束寻找
-                iterator.remove();
-                foundObj = newObj;
-                break;
-            }
-            // 2. 匹配添加到 updateList;不匹配则添加到 deleteList 中
-            if (foundObj != null) {
-                updateList.add(foundObj);
-            } else {
-                deleteList.add(oldObj);
-            }
-        }
-        return asList(createList, updateList, deleteList);
-    }
-
-    public static boolean containsAny(Collection<?> source, Collection<?> candidates) {
-        return org.springframework.util.CollectionUtils.containsAny(source, candidates);
-    }
-
-    public static <T> T getFirst(List<T> from) {
-        return !CollectionUtil.isEmpty(from) ? from.get(0) : null;
-    }
-
-    public static <T> T findFirst(Collection<T> from, Predicate<T> predicate) {
-        return findFirst(from, predicate, Function.identity());
-    }
-
-    public static <T, U> U findFirst(Collection<T> from, Predicate<T> predicate, Function<T, U> func) {
-        if (CollUtil.isEmpty(from)) {
-            return null;
-        }
-        return from.stream().filter(predicate).findFirst().map(func).orElse(null);
-    }
-
-    public static <T, V extends Comparable<? super V>> V getMaxValue(Collection<T> from, Function<T, V> valueFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return null;
-        }
-        assert !from.isEmpty(); // 断言,避免告警
-        T t = from.stream().max(Comparator.comparing(valueFunc)).get();
-        return valueFunc.apply(t);
-    }
-
-    public static <T, V extends Comparable<? super V>> V getMinValue(List<T> from, Function<T, V> valueFunc) {
-        if (CollUtil.isEmpty(from)) {
-            return null;
-        }
-        assert from.size() > 0; // 断言,避免告警
-        T t = from.stream().min(Comparator.comparing(valueFunc)).get();
-        return valueFunc.apply(t);
-    }
-
-    public static <T, V extends Comparable<? super V>> V getSumValue(List<T> from, Function<T, V> valueFunc,
-                                                                     BinaryOperator<V> accumulator) {
-        return getSumValue(from, valueFunc, accumulator, null);
-    }
-
-    public static <T, V extends Comparable<? super V>> V getSumValue(Collection<T> from, Function<T, V> valueFunc,
-                                                                     BinaryOperator<V> accumulator, V defaultValue) {
-        if (CollUtil.isEmpty(from)) {
-            return defaultValue;
-        }
-        assert !from.isEmpty(); // 断言,避免告警
-        return from.stream().map(valueFunc).filter(Objects::nonNull).reduce(accumulator).orElse(defaultValue);
-    }
-
-    public static <T> void addIfNotNull(Collection<T> coll, T item) {
-        if (item == null) {
-            return;
-        }
-        coll.add(item);
-    }
-
-    public static <T> Collection<T> singleton(T obj) {
-        return obj == null ? Collections.emptyList() : Collections.singleton(obj);
-    }
-
-    public static <T> List<T> newArrayList(List<List<T>> list) {
-        return list.stream().flatMap(Collection::stream).collect(Collectors.toList());
-    }
-
-}

+ 0 - 68
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/MapUtils.java

@@ -1,68 +0,0 @@
-package co.yixiang.yshop.framework.common.util.collection;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.ObjUtil;
-import co.yixiang.yshop.framework.common.core.KeyValue;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Consumer;
-
-/**
- * Map 工具类
- *
- * @author yshop
- */
-public class MapUtils {
-
-    /**
-     * 从哈希表表中,获得 keys 对应的所有 value 数组
-     *
-     * @param multimap 哈希表
-     * @param keys keys
-     * @return value 数组
-     */
-    public static <K, V> List<V> getList(Multimap<K, V> multimap, Collection<K> keys) {
-        List<V> result = new ArrayList<>();
-        keys.forEach(k -> {
-            Collection<V> values = multimap.get(k);
-            if (CollectionUtil.isEmpty(values)) {
-                return;
-            }
-            result.addAll(values);
-        });
-        return result;
-    }
-
-    /**
-     * 从哈希表查找到 key 对应的 value,然后进一步处理
-     * key 为 null 时, 不处理
-     * 注意,如果查找到的 value 为 null 时,不进行处理
-     *
-     * @param map 哈希表
-     * @param key key
-     * @param consumer 进一步处理的逻辑
-     */
-    public static <K, V> void findAndThen(Map<K, V> map, K key, Consumer<V> consumer) {
-        if (ObjUtil.isNull(key) || CollUtil.isEmpty(map)) {
-            return;
-        }
-        V value = map.get(key);
-        if (value == null) {
-            return;
-        }
-        consumer.accept(value);
-    }
-
-    public static <K, V> Map<K, V> convertMap(List<KeyValue<K, V>> keyValues) {
-        Map<K, V> map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size());
-        keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
-        return map;
-    }
-
-}

+ 0 - 19
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/collection/SetUtils.java

@@ -1,19 +0,0 @@
-package co.yixiang.yshop.framework.common.util.collection;
-
-import cn.hutool.core.collection.CollUtil;
-
-import java.util.Set;
-
-/**
- * Set 工具类
- *
- * @author yshop
- */
-public class SetUtils {
-
-    @SafeVarargs
-    public static <T> Set<T> asSet(T... objs) {
-        return CollUtil.newHashSet(objs);
-    }
-
-}

+ 0 - 164
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java

@@ -1,164 +0,0 @@
-package co.yixiang.yshop.framework.common.util.date;
-
-import cn.hutool.core.date.LocalDateTimeUtil;
-
-import java.time.*;
-import java.time.temporal.ChronoUnit;
-import java.util.Calendar;
-import java.util.Date;
-
-/**
- * 时间工具类
- *
- * @author yshop
- */
-public class DateUtils {
-
-    /**
-     * 时区 - 默认
-     */
-    public static final String TIME_ZONE_DEFAULT = "GMT+8";
-
-    /**
-     * 秒转换成毫秒
-     */
-    public static final long SECOND_MILLIS = 1000;
-
-    public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd";
-
-    public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
-
-    /**
-     * 将 LocalDateTime 转换成 Date
-     *
-     * @param date LocalDateTime
-     * @return LocalDateTime
-     */
-    public static Date of(LocalDateTime date) {
-        if (date == null) {
-            return null;
-        }
-        // 将此日期时间与时区相结合以创建 ZonedDateTime
-        ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault());
-        // 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳
-        Instant instant = zonedDateTime.toInstant();
-        // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
-        return Date.from(instant);
-    }
-
-    /**
-     * 将 Date 转换成 LocalDateTime
-     *
-     * @param date Date
-     * @return LocalDateTime
-     */
-    public static LocalDateTime of(Date date) {
-        if (date == null) {
-            return null;
-        }
-        // 转为时间戳
-        Instant instant = date.toInstant();
-        // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
-        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
-    }
-
-    public static Date addTime(Duration duration) {
-        return new Date(System.currentTimeMillis() + duration.toMillis());
-    }
-
-    public static boolean isExpired(LocalDateTime time) {
-        LocalDateTime now = LocalDateTime.now();
-        return now.isAfter(time);
-    }
-
-    /**
-     * 创建指定时间
-     *
-     * @param year  年
-     * @param mouth 月
-     * @param day   日
-     * @return 指定时间
-     */
-    public static Date buildTime(int year, int mouth, int day) {
-        return buildTime(year, mouth, day, 0, 0, 0);
-    }
-
-    /**
-     * 创建指定时间
-     *
-     * @param year   年
-     * @param mouth  月
-     * @param day    日
-     * @param hour   小时
-     * @param minute 分钟
-     * @param second 秒
-     * @return 指定时间
-     */
-    public static Date buildTime(int year, int mouth, int day,
-                                 int hour, int minute, int second) {
-        Calendar calendar = Calendar.getInstance();
-        calendar.set(Calendar.YEAR, year);
-        calendar.set(Calendar.MONTH, mouth - 1);
-        calendar.set(Calendar.DAY_OF_MONTH, day);
-        calendar.set(Calendar.HOUR_OF_DAY, hour);
-        calendar.set(Calendar.MINUTE, minute);
-        calendar.set(Calendar.SECOND, second);
-        calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒
-        return calendar.getTime();
-    }
-
-    public static Date max(Date a, Date b) {
-        if (a == null) {
-            return b;
-        }
-        if (b == null) {
-            return a;
-        }
-        return a.compareTo(b) > 0 ? a : b;
-    }
-
-    public static LocalDateTime max(LocalDateTime a, LocalDateTime b) {
-        if (a == null) {
-            return b;
-        }
-        if (b == null) {
-            return a;
-        }
-        return a.isAfter(b) ? a : b;
-    }
-
-    /**
-     * 是否今天
-     *
-     * @param date 日期
-     * @return 是否
-     */
-    public static boolean isToday(LocalDateTime date) {
-        return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now());
-    }
-
-    /**
-     * 是否昨天
-     *
-     * @param date 日期
-     * @return 是否
-     */
-    public static boolean isYesterday(LocalDateTime date) {
-        return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now().minusDays(1));
-    }
-
-    /**
-     * 获取距离目标时间还要多少秒
-     */
-    public static Integer getRemainSecondsOneDay1(Date currentDate) {
-        LocalDateTime midnight = LocalDateTime.ofInstant(currentDate.toInstant(),
-                        ZoneId.systemDefault()).plusDays(1).withHour(0).withMinute(0)
-                .withSecond(0).withNano(0);
-        LocalDateTime currentDateTime = LocalDateTime.ofInstant(currentDate.toInstant(),
-                ZoneId.systemDefault());
-        long seconds = ChronoUnit.SECONDS.between(currentDateTime, midnight);
-        return (int) seconds;
-    }
-
-
-}

+ 0 - 309
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java

@@ -1,309 +0,0 @@
-package co.yixiang.yshop.framework.common.util.date;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.StrUtil;
-import co.yixiang.yshop.framework.common.enums.DateIntervalEnum;
-
-import java.time.*;
-import java.time.format.DateTimeParseException;
-import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalAdjusters;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 时间工具类,用于 {@link java.time.LocalDateTime}
- *
- * @author yshop
- */
-public class LocalDateTimeUtils {
-
-    /**
-     * 空的 LocalDateTime 对象,主要用于 DB 唯一索引的默认值
-     */
-    public static LocalDateTime EMPTY = buildTime(1970, 1, 1);
-
-    /**
-     * 解析时间
-     *
-     * 相比 {@link LocalDateTimeUtil#parse(CharSequence)} 方法来说,会尽量去解析,直到成功
-     *
-     * @param time 时间
-     * @return 时间字符串
-     */
-    public static LocalDateTime parse(String time) {
-        try {
-            return LocalDateTimeUtil.parse(time, DatePattern.NORM_DATE_PATTERN);
-        } catch (DateTimeParseException e) {
-            return LocalDateTimeUtil.parse(time);
-        }
-    }
-
-    public static LocalDateTime addTime(Duration duration) {
-        return LocalDateTime.now().plus(duration);
-    }
-
-    public static LocalDateTime minusTime(Duration duration) {
-        return LocalDateTime.now().minus(duration);
-    }
-
-    public static boolean beforeNow(LocalDateTime date) {
-        return date.isBefore(LocalDateTime.now());
-    }
-
-    public static boolean afterNow(LocalDateTime date) {
-        return date.isAfter(LocalDateTime.now());
-    }
-
-    /**
-     * 创建指定时间
-     *
-     * @param year  年
-     * @param mouth 月
-     * @param day   日
-     * @return 指定时间
-     */
-    public static LocalDateTime buildTime(int year, int mouth, int day) {
-        return LocalDateTime.of(year, mouth, day, 0, 0, 0);
-    }
-
-    public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1,
-                                                   int year2, int mouth2, int day2) {
-        return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)};
-    }
-
-    /**
-     * 判指定断时间,是否在该时间范围内
-     *
-     * @param startTime 开始时间
-     * @param endTime 结束时间
-     * @param time 指定时间
-     * @return 是否
-     */
-    public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime, String time) {
-        if (startTime == null || endTime == null || time == null) {
-            return false;
-        }
-        return LocalDateTimeUtil.isIn(parse(time), startTime, endTime);
-    }
-
-    /**
-     * 判断当前时间是否在该时间范围内
-     *
-     * @param startTime 开始时间
-     * @param endTime   结束时间
-     * @return 是否
-     */
-    public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime) {
-        if (startTime == null || endTime == null) {
-            return false;
-        }
-        return LocalDateTimeUtil.isIn(LocalDateTime.now(), startTime, endTime);
-    }
-
-    /**
-     * 判断当前时间是否在该时间范围内
-     *
-     * @param startTime 开始时间
-     * @param endTime   结束时间
-     * @return 是否
-     */
-    public static boolean isBetween(String startTime, String endTime) {
-        if (startTime == null || endTime == null) {
-            return false;
-        }
-        LocalDate nowDate = LocalDate.now();
-        return LocalDateTimeUtil.isIn(LocalDateTime.now(),
-                LocalDateTime.of(nowDate, LocalTime.parse(startTime)),
-                LocalDateTime.of(nowDate, LocalTime.parse(endTime)));
-    }
-
-    /**
-     * 判断时间段是否重叠
-     *
-     * @param startTime1 开始 time1
-     * @param endTime1   结束 time1
-     * @param startTime2 开始 time2
-     * @param endTime2   结束 time2
-     * @return 重叠:true 不重叠:false
-     */
-    public static boolean isOverlap(LocalTime startTime1, LocalTime endTime1, LocalTime startTime2, LocalTime endTime2) {
-        LocalDate nowDate = LocalDate.now();
-        return LocalDateTimeUtil.isOverlap(LocalDateTime.of(nowDate, startTime1), LocalDateTime.of(nowDate, endTime1),
-                LocalDateTime.of(nowDate, startTime2), LocalDateTime.of(nowDate, endTime2));
-    }
-
-    /**
-     * 获取指定日期所在的月份的开始时间
-     * 例如:2023-09-30 00:00:00,000
-     *
-     * @param date 日期
-     * @return 月份的开始时间
-     */
-    public static LocalDateTime beginOfMonth(LocalDateTime date) {
-        return date.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
-    }
-
-    /**
-     * 获取指定日期所在的月份的最后时间
-     * 例如:2023-09-30 23:59:59,999
-     *
-     * @param date 日期
-     * @return 月份的结束时间
-     */
-    public static LocalDateTime endOfMonth(LocalDateTime date) {
-        return date.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
-    }
-
-    /**
-     * 获得指定日期所在季度
-     *
-     * @param date 日期
-     * @return 所在季度
-     */
-    public static int getQuarterOfYear(LocalDateTime date) {
-        return (date.getMonthValue() - 1) / 3 + 1;
-    }
-
-    /**
-     * 获取指定日期到现在过了几天,如果指定日期在当前日期之后,获取结果为负
-     *
-     * @param dateTime 日期
-     * @return 相差天数
-     */
-    public static Long between(LocalDateTime dateTime) {
-        return LocalDateTimeUtil.between(dateTime, LocalDateTime.now(), ChronoUnit.DAYS);
-    }
-
-    /**
-     * 获取今天的开始时间
-     *
-     * @return 今天
-     */
-    public static LocalDateTime getToday() {
-        return LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
-    }
-
-    /**
-     * 获取昨天的开始时间
-     *
-     * @return 昨天
-     */
-    public static LocalDateTime getYesterday() {
-        return LocalDateTimeUtil.beginOfDay(LocalDateTime.now().minusDays(1));
-    }
-
-    /**
-     * 获取本月的开始时间
-     *
-     * @return 本月
-     */
-    public static LocalDateTime getMonth() {
-        return beginOfMonth(LocalDateTime.now());
-    }
-
-    /**
-     * 获取本年的开始时间
-     *
-     * @return 本年
-     */
-    public static LocalDateTime getYear() {
-        return LocalDateTime.now().with(TemporalAdjusters.firstDayOfYear()).with(LocalTime.MIN);
-    }
-
-    public static List<LocalDateTime[]> getDateRangeList(LocalDateTime startTime,
-                                                         LocalDateTime endTime,
-                                                         Integer interval) {
-        // 1.1 找到枚举
-        DateIntervalEnum intervalEnum = DateIntervalEnum.valueOf(interval);
-        Assert.notNull(intervalEnum, "interval({}} 找不到对应的枚举", interval);
-        // 1.2 将时间对齐
-        startTime = LocalDateTimeUtil.beginOfDay(startTime);
-        endTime = LocalDateTimeUtil.endOfDay(endTime);
-
-        // 2. 循环,生成时间范围
-        List<LocalDateTime[]> timeRanges = new ArrayList<>();
-        switch (intervalEnum) {
-            case DAY:
-                while (startTime.isBefore(endTime)) {
-                    timeRanges.add(new LocalDateTime[]{startTime, startTime.plusDays(1).minusNanos(1)});
-                    startTime = startTime.plusDays(1);
-                }
-                break;
-            case WEEK:
-                while (startTime.isBefore(endTime)) {
-                    LocalDateTime endOfWeek = startTime.with(DayOfWeek.SUNDAY).plusDays(1).minusNanos(1);
-                    timeRanges.add(new LocalDateTime[]{startTime, endOfWeek});
-                    startTime = endOfWeek.plusNanos(1);
-                }
-                break;
-            case MONTH:
-                while (startTime.isBefore(endTime)) {
-                    LocalDateTime endOfMonth = startTime.with(TemporalAdjusters.lastDayOfMonth()).plusDays(1).minusNanos(1);
-                    timeRanges.add(new LocalDateTime[]{startTime, endOfMonth});
-                    startTime = endOfMonth.plusNanos(1);
-                }
-                break;
-            case QUARTER:
-                while (startTime.isBefore(endTime)) {
-                    int quarterOfYear = getQuarterOfYear(startTime);
-                    LocalDateTime quarterEnd = quarterOfYear == 4
-                            ? startTime.with(TemporalAdjusters.lastDayOfYear()).plusDays(1).minusNanos(1)
-                            : startTime.withMonth(quarterOfYear * 3 + 1).withDayOfMonth(1).minusNanos(1);
-                    timeRanges.add(new LocalDateTime[]{startTime, quarterEnd});
-                    startTime = quarterEnd.plusNanos(1);
-                }
-                break;
-            case YEAR:
-                while (startTime.isBefore(endTime)) {
-                    LocalDateTime endOfYear = startTime.with(TemporalAdjusters.lastDayOfYear()).plusDays(1).minusNanos(1);
-                    timeRanges.add(new LocalDateTime[]{startTime, endOfYear});
-                    startTime = endOfYear.plusNanos(1);
-                }
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid interval: " + interval);
-        }
-        // 3. 兜底,最后一个时间,需要保持在 endTime 之前
-        LocalDateTime[] lastTimeRange = CollUtil.getLast(timeRanges);
-        if (lastTimeRange != null) {
-            lastTimeRange[1] = endTime;
-        }
-        return timeRanges;
-    }
-
-    /**
-     * 格式化时间范围
-     *
-     * @param startTime 开始时间
-     * @param endTime   结束时间
-     * @param interval  时间间隔
-     * @return 时间范围
-     */
-    public static String formatDateRange(LocalDateTime startTime, LocalDateTime endTime, Integer interval) {
-        // 1. 找到枚举
-        DateIntervalEnum intervalEnum = DateIntervalEnum.valueOf(interval);
-        Assert.notNull(intervalEnum, "interval({}} 找不到对应的枚举", interval);
-
-        // 2. 循环,生成时间范围
-        switch (intervalEnum) {
-            case DAY:
-                return LocalDateTimeUtil.format(startTime, DatePattern.NORM_DATE_PATTERN);
-            case WEEK:
-                return LocalDateTimeUtil.format(startTime, DatePattern.NORM_DATE_PATTERN)
-                        + StrUtil.format("(第 {} 周)", LocalDateTimeUtil.weekOfYear(startTime));
-            case MONTH:
-                return LocalDateTimeUtil.format(startTime, DatePattern.NORM_MONTH_PATTERN);
-            case QUARTER:
-                return StrUtil.format("{}-Q{}", startTime.getYear(), getQuarterOfYear(startTime));
-            case YEAR:
-                return LocalDateTimeUtil.format(startTime, DatePattern.NORM_YEAR_PATTERN);
-            default:
-                throw new IllegalArgumentException("Invalid interval: " + interval);
-        }
-    }
-
-}

+ 0 - 126
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java

@@ -1,126 +0,0 @@
-package co.yixiang.yshop.framework.common.util.http;
-
-import cn.hutool.core.codec.Base64;
-import cn.hutool.core.map.TableMap;
-import cn.hutool.core.net.url.UrlBuilder;
-import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.core.util.StrUtil;
-import org.springframework.util.StringUtils;
-import org.springframework.web.util.UriComponents;
-import org.springframework.web.util.UriComponentsBuilder;
-
-import jakarta.servlet.http.HttpServletRequest;
-import java.net.URI;
-import java.nio.charset.Charset;
-import java.util.Map;
-
-/**
- * HTTP 工具类
- *
- * @author yshop
- */
-public class HttpUtils {
-
-    @SuppressWarnings("unchecked")
-    public static String replaceUrlQuery(String url, String key, String value) {
-        UrlBuilder builder = UrlBuilder.of(url, Charset.defaultCharset());
-        // 先移除
-        TableMap<CharSequence, CharSequence> query = (TableMap<CharSequence, CharSequence>)
-                ReflectUtil.getFieldValue(builder.getQuery(), "query");
-        query.remove(key);
-        // 后添加
-        builder.addQuery(key, value);
-        return builder.build();
-    }
-
-    private String append(String base, Map<String, ?> query, boolean fragment) {
-        return append(base, query, null, fragment);
-    }
-
-    /**
-     * 拼接 URL
-     *
-     * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 append 方法
-     *
-     * @param base 基础 URL
-     * @param query 查询参数
-     * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射
-     * @param fragment URL 的 fragment,即拼接到 # 中
-     * @return 拼接后的 URL
-     */
-    public static String append(String base, Map<String, ?> query, Map<String, String> keys, boolean fragment) {
-        UriComponentsBuilder template = UriComponentsBuilder.newInstance();
-        UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(base);
-        URI redirectUri;
-        try {
-            // assume it's encoded to start with (if it came in over the wire)
-            redirectUri = builder.build(true).toUri();
-        } catch (Exception e) {
-            // ... but allow client registrations to contain hard-coded non-encoded values
-            redirectUri = builder.build().toUri();
-            builder = UriComponentsBuilder.fromUri(redirectUri);
-        }
-        template.scheme(redirectUri.getScheme()).port(redirectUri.getPort()).host(redirectUri.getHost())
-                .userInfo(redirectUri.getUserInfo()).path(redirectUri.getPath());
-
-        if (fragment) {
-            StringBuilder values = new StringBuilder();
-            if (redirectUri.getFragment() != null) {
-                String append = redirectUri.getFragment();
-                values.append(append);
-            }
-            for (String key : query.keySet()) {
-                if (values.length() > 0) {
-                    values.append("&");
-                }
-                String name = key;
-                if (keys != null && keys.containsKey(key)) {
-                    name = keys.get(key);
-                }
-                values.append(name).append("={").append(key).append("}");
-            }
-            if (values.length() > 0) {
-                template.fragment(values.toString());
-            }
-            UriComponents encoded = template.build().expand(query).encode();
-            builder.fragment(encoded.getFragment());
-        } else {
-            for (String key : query.keySet()) {
-                String name = key;
-                if (keys != null && keys.containsKey(key)) {
-                    name = keys.get(key);
-                }
-                template.queryParam(name, "{" + key + "}");
-            }
-            template.fragment(redirectUri.getFragment());
-            UriComponents encoded = template.build().expand(query).encode();
-            builder.query(encoded.getQuery());
-        }
-        return builder.build().toUriString();
-    }
-
-    public static String[] obtainBasicAuthorization(HttpServletRequest request) {
-        String clientId;
-        String clientSecret;
-        // 先从 Header 中获取
-        String authorization = request.getHeader("Authorization");
-        authorization = StrUtil.subAfter(authorization, "Basic ", true);
-        if (StringUtils.hasText(authorization)) {
-            authorization = Base64.decodeStr(authorization);
-            clientId = StrUtil.subBefore(authorization, ":", false);
-            clientSecret = StrUtil.subAfter(authorization, ":", false);
-        // 再从 Param 中获取
-        } else {
-            clientId = request.getParameter("client_id");
-            clientSecret = request.getParameter("client_secret");
-        }
-
-        // 如果两者非空,则返回
-        if (StrUtil.isNotEmpty(clientId) && StrUtil.isNotEmpty(clientSecret)) {
-            return new String[]{clientId, clientSecret};
-        }
-        return null;
-    }
-
-
-}

+ 0 - 84
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/FileUtils.java

@@ -1,84 +0,0 @@
-package co.yixiang.yshop.framework.common.util.io;
-
-import cn.hutool.core.io.FileTypeUtil;
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.io.file.FileNameUtil;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.crypto.digest.DigestUtil;
-import lombok.SneakyThrows;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-
-/**
- * 文件工具类
- *
- * @author yshop
- */
-public class FileUtils {
-
-    /**
-     * 创建临时文件
-     * 该文件会在 JVM 退出时,进行删除
-     *
-     * @param data 文件内容
-     * @return 文件
-     */
-    @SneakyThrows
-    public static File createTempFile(String data) {
-        File file = createTempFile();
-        // 写入内容
-        FileUtil.writeUtf8String(data, file);
-        return file;
-    }
-
-    /**
-     * 创建临时文件
-     * 该文件会在 JVM 退出时,进行删除
-     *
-     * @param data 文件内容
-     * @return 文件
-     */
-    @SneakyThrows
-    public static File createTempFile(byte[] data) {
-        File file = createTempFile();
-        // 写入内容
-        FileUtil.writeBytes(data, file);
-        return file;
-    }
-
-    /**
-     * 创建临时文件,无内容
-     * 该文件会在 JVM 退出时,进行删除
-     *
-     * @return 文件
-     */
-    @SneakyThrows
-    public static File createTempFile() {
-        // 创建文件,通过 UUID 保证唯一
-        File file = File.createTempFile(IdUtil.simpleUUID(), null);
-        // 标记 JVM 退出时,自动删除
-        file.deleteOnExit();
-        return file;
-    }
-
-    /**
-     * 生成文件路径
-     *
-     * @param content      文件内容
-     * @param originalName 原始文件名
-     * @return path,唯一不可重复
-     */
-    public static String generatePath(byte[] content, String originalName) {
-        String sha256Hex = DigestUtil.sha256Hex(content);
-        // 情况一:如果存在 name,则优先使用 name 的后缀
-        if (StrUtil.isNotBlank(originalName)) {
-            String extName = FileNameUtil.extName(originalName);
-            return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName;
-        }
-        // 情况二:基于 content 计算
-        return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content));
-    }
-
-}

+ 0 - 28
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java

@@ -1,28 +0,0 @@
-package co.yixiang.yshop.framework.common.util.io;
-
-import cn.hutool.core.io.IORuntimeException;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.StrUtil;
-
-import java.io.InputStream;
-
-/**
- * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法
- *
- * @author yshop
- */
-public class IoUtils {
-
-    /**
-     * 从流中读取 UTF8 编码的内容
-     *
-     * @param in 输入流
-     * @param isClose 是否关闭
-     * @return 内容
-     * @throws IORuntimeException IO 异常
-     */
-    public static String readUtf8(InputStream in, boolean isClose) throws IORuntimeException {
-        return StrUtil.utf8Str(IoUtil.read(in, isClose));
-    }
-
-}

+ 0 - 202
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/json/JsonUtils.java

@@ -1,202 +0,0 @@
-package co.yixiang.yshop.framework.common.util.json;
-
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * JSON 工具类
- *
- * @author yshop
- */
-@Slf4j
-public class JsonUtils {
-
-    private static ObjectMapper objectMapper = new ObjectMapper();
-
-    static {
-        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
-        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 值
-        objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化
-    }
-
-    /**
-     * 初始化 objectMapper 属性
-     * <p>
-     * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean
-     *
-     * @param objectMapper ObjectMapper 对象
-     */
-    public static void init(ObjectMapper objectMapper) {
-        JsonUtils.objectMapper = objectMapper;
-    }
-
-    @SneakyThrows
-    public static String toJsonString(Object object) {
-        return objectMapper.writeValueAsString(object);
-    }
-
-    @SneakyThrows
-    public static byte[] toJsonByte(Object object) {
-        return objectMapper.writeValueAsBytes(object);
-    }
-
-    @SneakyThrows
-    public static String toJsonPrettyString(Object object) {
-        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
-    }
-
-    public static <T> T parseObject(String text, Class<T> clazz) {
-        if (StrUtil.isEmpty(text)) {
-            return null;
-        }
-        try {
-            return objectMapper.readValue(text, clazz);
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static <T> T parseObject(String text, String path, Class<T> clazz) {
-        if (StrUtil.isEmpty(text)) {
-            return null;
-        }
-        try {
-            JsonNode treeNode = objectMapper.readTree(text);
-            JsonNode pathNode = treeNode.path(path);
-            return objectMapper.readValue(pathNode.toString(), clazz);
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static <T> T parseObject(String text, Type type) {
-        if (StrUtil.isEmpty(text)) {
-            return null;
-        }
-        try {
-            return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type));
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * 将字符串解析成指定类型的对象
-     * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下,
-     * 如果 text 没有 class 属性,则会报错。此时,使用这个方法,可以解决。
-     *
-     * @param text 字符串
-     * @param clazz 类型
-     * @return 对象
-     */
-    public static <T> T parseObject2(String text, Class<T> clazz) {
-        if (StrUtil.isEmpty(text)) {
-            return null;
-        }
-        return JSONUtil.toBean(text, clazz);
-    }
-
-    public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
-        if (ArrayUtil.isEmpty(bytes)) {
-            return null;
-        }
-        try {
-            return objectMapper.readValue(bytes, clazz);
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", bytes, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static <T> T parseObject(String text, TypeReference<T> typeReference) {
-        try {
-            return objectMapper.readValue(text, typeReference);
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * 解析 JSON 字符串成指定类型的对象,如果解析失败,则返回 null
-     *
-     * @param text 字符串
-     * @param typeReference 类型引用
-     * @return 指定类型的对象
-     */
-    public static <T> T parseObjectQuietly(String text, TypeReference<T> typeReference) {
-        try {
-            return objectMapper.readValue(text, typeReference);
-        } catch (IOException e) {
-            return null;
-        }
-    }
-
-    public static <T> List<T> parseArray(String text, Class<T> clazz) {
-        if (StrUtil.isEmpty(text)) {
-            return new ArrayList<>();
-        }
-        try {
-            return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static <T> List<T> parseArray(String text, String path, Class<T> clazz) {
-        if (StrUtil.isEmpty(text)) {
-            return null;
-        }
-        try {
-            JsonNode treeNode = objectMapper.readTree(text);
-            JsonNode pathNode = treeNode.path(path);
-            return objectMapper.readValue(pathNode.toString(), objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static JsonNode parseTree(String text) {
-        try {
-            return objectMapper.readTree(text);
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static JsonNode parseTree(byte[] text) {
-        try {
-            return objectMapper.readTree(text);
-        } catch (IOException e) {
-            log.error("json parse err,json:{}", text, e);
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static boolean isJson(String text) {
-        return JSONUtil.isTypeJSON(text);
-    }
-
-}

+ 0 - 30
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/monitor/TracerUtils.java

@@ -1,30 +0,0 @@
-package co.yixiang.yshop.framework.common.util.monitor;
-
-import org.apache.skywalking.apm.toolkit.trace.TraceContext;
-
-/**
- * 链路追踪工具类
- *
- * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 util 包下
- *
- * @author yshop
- */
-public class TracerUtils {
-
-    /**
-     * 私有化构造方法
-     */
-    private TracerUtils() {
-    }
-
-    /**
-     * 获得链路追踪编号,直接返回 SkyWalking 的 TraceId。
-     * 如果不存在的话为空字符串!!!
-     *
-     * @return 链路追踪编号
-     */
-    public static String getTraceId() {
-        return TraceContext.traceId();
-    }
-
-}

+ 0 - 131
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/number/MoneyUtils.java

@@ -1,131 +0,0 @@
-package co.yixiang.yshop.framework.common.util.number;
-
-import cn.hutool.core.math.Money;
-import cn.hutool.core.util.NumberUtil;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
-/**
- * 金额工具类
- *
- * @author yshop
- */
-public class MoneyUtils {
-
-    /**
-     * 金额的小数位数
-     */
-    private static final int PRICE_SCALE = 2;
-
-    /**
-     * 百分比对应的 BigDecimal 对象
-     */
-    public static final BigDecimal PERCENT_100 = BigDecimal.valueOf(100);
-
-    /**
-     * 计算百分比金额,四舍五入
-     *
-     * @param price 金额
-     * @param rate  百分比,例如说 56.77% 则传入 56.77
-     * @return 百分比金额
-     */
-    public static Integer calculateRatePrice(Integer price, Double rate) {
-        return calculateRatePrice(price, rate, 0, RoundingMode.HALF_UP).intValue();
-    }
-
-    /**
-     * 计算百分比金额,向下传入
-     *
-     * @param price 金额
-     * @param rate  百分比,例如说 56.77% 则传入 56.77
-     * @return 百分比金额
-     */
-    public static Integer calculateRatePriceFloor(Integer price, Double rate) {
-        return calculateRatePrice(price, rate, 0, RoundingMode.FLOOR).intValue();
-    }
-
-    /**
-     * 计算百分比金额
-     *
-     * @param price   金额(单位分)
-     * @param count   数量
-     * @param percent 折扣(单位分),列如 60.2%,则传入 6020
-     * @return 商品总价
-     */
-    public static Integer calculator(Integer price, Integer count, Integer percent) {
-        price = price * count;
-        if (percent == null) {
-            return price;
-        }
-        return MoneyUtils.calculateRatePriceFloor(price, (double) (percent / 100));
-    }
-
-    /**
-     * 计算百分比金额
-     *
-     * @param price        金额
-     * @param rate         百分比,例如说 56.77% 则传入 56.77
-     * @param scale        保留小数位数
-     * @param roundingMode 舍入模式
-     */
-    public static BigDecimal calculateRatePrice(Number price, Number rate, int scale, RoundingMode roundingMode) {
-        return NumberUtil.toBigDecimal(price).multiply(NumberUtil.toBigDecimal(rate)) // 乘以
-                .divide(BigDecimal.valueOf(100), scale, roundingMode); // 除以 100
-    }
-
-    /**
-     * 分转元
-     *
-     * @param fen 分
-     * @return 元
-     */
-    public static BigDecimal fenToYuan(int fen) {
-        return new Money(0, fen).getAmount();
-    }
-
-    /**
-     * 分转元(字符串)
-     *
-     * 例如说 fen 为 1 时,则结果为 0.01
-     *
-     * @param fen 分
-     * @return 元
-     */
-    public static String fenToYuanStr(int fen) {
-        return new Money(0, fen).toString();
-    }
-
-    /**
-     * 金额相乘,默认进行四舍五入
-     *
-     * 位数:{@link #PRICE_SCALE}
-     *
-     * @param price 金额
-     * @param count 数量
-     * @return 金额相乘结果
-     */
-    public static BigDecimal priceMultiply(BigDecimal price, BigDecimal count) {
-        if (price == null || count == null) {
-            return null;
-        }
-        return price.multiply(count).setScale(PRICE_SCALE, RoundingMode.HALF_UP);
-    }
-
-    /**
-     * 金额相乘(百分比),默认进行四舍五入
-     *
-     * 位数:{@link #PRICE_SCALE}
-     *
-     * @param price  金额
-     * @param percent 百分比
-     * @return 金额相乘结果
-     */
-    public static BigDecimal priceMultiplyPercent(BigDecimal price, BigDecimal percent) {
-        if (price == null || percent == null) {
-            return null;
-        }
-        return price.multiply(percent).divide(PERCENT_100, PRICE_SCALE, RoundingMode.HALF_UP);
-    }
-
-}

+ 0 - 64
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/number/NumberUtils.java

@@ -1,64 +0,0 @@
-package co.yixiang.yshop.framework.common.util.number;
-
-import cn.hutool.core.util.NumberUtil;
-import cn.hutool.core.util.StrUtil;
-
-import java.math.BigDecimal;
-
-/**
- * 数字的工具类,补全 {@link cn.hutool.core.util.NumberUtil} 的功能
- *
- * @author yshop
- */
-public class NumberUtils {
-
-    public static Long parseLong(String str) {
-        return StrUtil.isNotEmpty(str) ? Long.valueOf(str) : null;
-    }
-
-    public static Integer parseInt(String str) {
-        return StrUtil.isNotEmpty(str) ? Integer.valueOf(str) : null;
-    }
-
-    /**
-     * 通过经纬度获取地球上两点之间的距离
-     *
-     * 参考 <<a href="https://gitee.com/dromara/hutool/blob/1caabb586b1f95aec66a21d039c5695df5e0f4c1/hutool-core/src/main/java/cn/hutool/core/util/DistanceUtil.java">DistanceUtil</a>> 实现,目前它已经被 hutool 删除
-     *
-     * @param lat1 经度1
-     * @param lng1 纬度1
-     * @param lat2 经度2
-     * @param lng2 纬度2
-     * @return 距离,单位:千米
-     */
-    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
-        double radLat1 = lat1 * Math.PI / 180.0;
-        double radLat2 = lat2 * Math.PI / 180.0;
-        double a = radLat1 - radLat2;
-        double b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
-        double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
-                + Math.cos(radLat1) * Math.cos(radLat2)
-                * Math.pow(Math.sin(b / 2), 2)));
-        distance = distance * 6378.137;
-        distance = Math.round(distance * 10000d) / 10000d;
-        return distance;
-    }
-
-    /**
-     * 提供精确的乘法运算
-     *
-     * 和 hutool {@link NumberUtil#mul(BigDecimal...)} 的差别是,如果存在 null,则返回 null
-     *
-     * @param values 多个被乘值
-     * @return 积
-     */
-    public static BigDecimal mul(BigDecimal... values) {
-        for (BigDecimal value : values) {
-            if (value == null) {
-                return null;
-            }
-        }
-        return NumberUtil.mul(values);
-    }
-
-}

+ 0 - 62
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/BeanUtils.java

@@ -1,62 +0,0 @@
-package co.yixiang.yshop.framework.common.util.object;
-
-import cn.hutool.core.bean.BeanUtil;
-import co.yixiang.yshop.framework.common.pojo.PageResult;
-import co.yixiang.yshop.framework.common.util.collection.CollectionUtils;
-
-import java.util.List;
-import java.util.function.Consumer;
-
-/**
- * Bean 工具类
- *
- * 1. 默认使用 {@link cn.hutool.core.bean.BeanUtil} 作为实现类,虽然不同 bean 工具的性能有差别,但是对绝大多数同学的项目,不用在意这点性能
- * 2. 针对复杂的对象转换,可以搜参考 AuthConvert 实现,通过 mapstruct + default 配合实现
- *
- * @author yshop
- */
-public class BeanUtils {
-
-    public static <T> T toBean(Object source, Class<T> targetClass) {
-        return BeanUtil.toBean(source, targetClass);
-    }
-
-    public static <T> T toBean(Object source, Class<T> targetClass, Consumer<T> peek) {
-        T target = toBean(source, targetClass);
-        if (target != null) {
-            peek.accept(target);
-        }
-        return target;
-    }
-
-    public static <S, T> List<T> toBean(List<S> source, Class<T> targetType) {
-        if (source == null) {
-            return null;
-        }
-        return CollectionUtils.convertList(source, s -> toBean(s, targetType));
-    }
-
-    public static <S, T> List<T> toBean(List<S> source, Class<T> targetType, Consumer<T> peek) {
-        List<T> list = toBean(source, targetType);
-        if (list != null) {
-            list.forEach(peek);
-        }
-        return list;
-    }
-
-    public static <S, T> PageResult<T> toBean(PageResult<S> source, Class<T> targetType) {
-        return toBean(source, targetType, null);
-    }
-
-    public static <S, T> PageResult<T> toBean(PageResult<S> source, Class<T> targetType, Consumer<T> peek) {
-        if (source == null) {
-            return null;
-        }
-        List<T> list = toBean(source.getList(), targetType);
-        if (peek != null) {
-            list.forEach(peek);
-        }
-        return new PageResult<>(list, source.getTotal());
-    }
-
-}

+ 0 - 63
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/ObjectUtils.java

@@ -1,63 +0,0 @@
-package co.yixiang.yshop.framework.common.util.object;
-
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ReflectUtil;
-
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.function.Consumer;
-
-/**
- * Object 工具类
- *
- * @author yshop
- */
-public class ObjectUtils {
-
-    /**
-     * 复制对象,并忽略 Id 编号
-     *
-     * @param object 被复制对象
-     * @param consumer 消费者,可以二次编辑被复制对象
-     * @return 复制后的对象
-     */
-    public static <T> T cloneIgnoreId(T object, Consumer<T> consumer) {
-        T result = ObjectUtil.clone(object);
-        // 忽略 id 编号
-        Field field = ReflectUtil.getField(object.getClass(), "id");
-        if (field != null) {
-            ReflectUtil.setFieldValue(result, field, null);
-        }
-        // 二次编辑
-        if (result != null) {
-            consumer.accept(result);
-        }
-        return result;
-    }
-
-    public static <T extends Comparable<T>> T max(T obj1, T obj2) {
-        if (obj1 == null) {
-            return obj2;
-        }
-        if (obj2 == null) {
-            return obj1;
-        }
-        return obj1.compareTo(obj2) > 0 ? obj1 : obj2;
-    }
-
-    @SafeVarargs
-    public static <T> T defaultIfNull(T... array) {
-        for (T item : array) {
-            if (item != null) {
-                return item;
-            }
-        }
-        return null;
-    }
-
-    @SafeVarargs
-    public static <T> boolean equalsAny(T obj, T... array) {
-        return Arrays.asList(array).contains(obj);
-    }
-
-}

+ 0 - 67
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java

@@ -1,67 +0,0 @@
-package co.yixiang.yshop.framework.common.util.object;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.func.Func1;
-import cn.hutool.core.lang.func.LambdaUtil;
-import cn.hutool.core.util.ArrayUtil;
-import co.yixiang.yshop.framework.common.pojo.PageParam;
-import co.yixiang.yshop.framework.common.pojo.SortablePageParam;
-import co.yixiang.yshop.framework.common.pojo.SortingField;
-import org.springframework.util.Assert;
-
-import static java.util.Collections.singletonList;
-
-/**
- * {@link co.yixiang.yshop.framework.common.pojo.PageParam} 工具类
- *
- * @author yshop
- */
-public class PageUtils {
-
-    private static final Object[] ORDER_TYPES = new String[]{SortingField.ORDER_ASC, SortingField.ORDER_DESC};
-
-    public static int getStart(PageParam pageParam) {
-        return (pageParam.getPageNo() - 1) * pageParam.getPageSize();
-    }
-
-    /**
-     * 构建排序字段(默认倒序)
-     *
-     * @param func 排序字段的 Lambda 表达式
-     * @param <T>  排序字段所属的类型
-     * @return 排序字段
-     */
-    public static <T> SortingField buildSortingField(Func1<T, ?> func) {
-        return buildSortingField(func, SortingField.ORDER_DESC);
-    }
-
-    /**
-     * 构建排序字段
-     *
-     * @param func  排序字段的 Lambda 表达式
-     * @param order 排序类型 {@link SortingField#ORDER_ASC} {@link SortingField#ORDER_DESC}
-     * @param <T>   排序字段所属的类型
-     * @return 排序字段
-     */
-    public static <T> SortingField buildSortingField(Func1<T, ?> func, String order) {
-        Assert.isTrue(ArrayUtil.contains(ORDER_TYPES, order), String.format("字段的排序类型只能是 %s/%s", ORDER_TYPES));
-
-        String fieldName = LambdaUtil.getFieldName(func);
-        return new SortingField(fieldName, order);
-    }
-
-    /**
-     * 构建默认的排序字段
-     * 如果排序字段为空,则设置排序字段;否则忽略
-     *
-     * @param sortablePageParam 排序分页查询参数
-     * @param func              排序字段的 Lambda 表达式
-     * @param <T>               排序字段所属的类型
-     */
-    public static <T> void buildDefaultSortingField(SortablePageParam sortablePageParam, Func1<T, ?> func) {
-        if (sortablePageParam != null && CollUtil.isEmpty(sortablePageParam.getSortingFields())) {
-            sortablePageParam.setSortingFields(singletonList(buildSortingField(func)));
-        }
-    }
-
-}

+ 0 - 127
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/servlet/ServletUtils.java

@@ -1,127 +0,0 @@
-package co.yixiang.yshop.framework.common.util.servlet;
-
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.extra.servlet.JakartaServletUtil;
-import co.yixiang.yshop.framework.common.util.json.JsonUtils;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.http.MediaType;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import java.io.IOException;
-import java.net.URLEncoder;
-import java.util.Map;
-
-/**
- * 客户端工具类
- *
- * @author yshop
- */
-public class ServletUtils {
-
-    /**
-     * 返回 JSON 字符串
-     *
-     * @param response 响应
-     * @param object   对象,会序列化成 JSON 字符串
-     */
-    @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码
-    public static void writeJSON(HttpServletResponse response, Object object) {
-        String content = JsonUtils.toJsonString(object);
-        JakartaServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE);
-    }
-
-    /**
-     * @param request 请求
-     * @return ua
-     */
-    public static String getUserAgent(HttpServletRequest request) {
-        String ua = request.getHeader("User-Agent");
-        return ua != null ? ua : "";
-    }
-
-    /**
-     * 获得请求
-     *
-     * @return HttpServletRequest
-     */
-    public static HttpServletRequest getRequest() {
-        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
-        if (!(requestAttributes instanceof ServletRequestAttributes)) {
-            return null;
-        }
-        return ((ServletRequestAttributes) requestAttributes).getRequest();
-    }
-
-    public static String getUserAgent() {
-        HttpServletRequest request = getRequest();
-        if (request == null) {
-            return null;
-        }
-        return getUserAgent(request);
-    }
-
-    public static String getClientIP() {
-        HttpServletRequest request = getRequest();
-        if (request == null) {
-            return null;
-        }
-        return JakartaServletUtil.getClientIP(request);
-    }
-
-    public static boolean isJsonRequest(ServletRequest request) {
-        return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE);
-    }
-
-    public static String getBody(HttpServletRequest request) {
-        // 只有在 json 请求在读取,因为只有 CacheRequestBodyFilter 才会进行缓存,支持重复读取
-        if (isJsonRequest(request)) {
-            return JakartaServletUtil.getBody(request);
-        }
-        return null;
-    }
-
-    public static byte[] getBodyBytes(HttpServletRequest request) {
-        // 只有在 json 请求在读取,因为只有 CacheRequestBodyFilter 才会进行缓存,支持重复读取
-        if (isJsonRequest(request)) {
-            return JakartaServletUtil.getBodyBytes(request);
-        }
-        return null;
-    }
-
-    public static String getClientIP(HttpServletRequest request) {
-        return JakartaServletUtil.getClientIP(request);
-    }
-
-    public static Map<String, String> getParamMap(HttpServletRequest request) {
-        return JakartaServletUtil.getParamMap(request);
-    }
-
-    public static String getRequstHost(HttpServletRequest request){
-        String port =  ":" + request.getServerPort();
-        if(request.getServerPort() == 80 || request.getServerPort() == 443){
-            port = "";
-        }
-        return request.getScheme()+"://" + request.getServerName() + port;
-    }
-
-    /**
-     * 返回附件
-     *
-     * @param response 响应
-     * @param filename 文件名
-     * @param content 附件内容
-     */
-    public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException {
-        // 设置 header 和 contentType
-        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
-        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
-        // 输出附件
-        IoUtil.write(response.getOutputStream(), false, content);
-    }
-
-}

+ 0 - 89
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/spring/SpringExpressionUtils.java

@@ -1,89 +0,0 @@
-package co.yixiang.yshop.framework.common.util.spring;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.ArrayUtil;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.springframework.core.DefaultParameterNameDiscoverer;
-import org.springframework.core.ParameterNameDiscoverer;
-import org.springframework.expression.EvaluationContext;
-import org.springframework.expression.ExpressionParser;
-import org.springframework.expression.spel.standard.SpelExpressionParser;
-import org.springframework.expression.spel.support.StandardEvaluationContext;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Spring EL 表达式的工具类
- *
- * @author mashu
- */
-public class SpringExpressionUtils {
-
-    /**
-     * Spring EL 表达式解析器
-     */
-    private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
-    /**
-     * 参数名发现器
-     */
-    private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer();
-
-    private SpringExpressionUtils() {
-    }
-
-    /**
-     * 从切面中,单个解析 EL 表达式的结果
-     *
-     * @param joinPoint        切面点
-     * @param expressionString EL 表达式数组
-     * @return 执行界面
-     */
-    public static Object parseExpression(JoinPoint joinPoint, String expressionString) {
-        Map<String, Object> result = parseExpressions(joinPoint, Collections.singletonList(expressionString));
-        return result.get(expressionString);
-    }
-
-    /**
-     * 从切面中,批量解析 EL 表达式的结果
-     *
-     * @param joinPoint         切面点
-     * @param expressionStrings EL 表达式数组
-     * @return 结果,key 为表达式,value 为对应值
-     */
-    public static Map<String, Object> parseExpressions(JoinPoint joinPoint, List<String> expressionStrings) {
-        // 如果为空,则不进行解析
-        if (CollUtil.isEmpty(expressionStrings)) {
-            return MapUtil.newHashMap();
-        }
-
-        // 第一步,构建解析的上下文 EvaluationContext
-        // 通过 joinPoint 获取被注解方法
-        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
-        Method method = methodSignature.getMethod();
-        // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组
-        String[] paramNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method);
-        // Spring 的表达式上下文对象
-        EvaluationContext context = new StandardEvaluationContext();
-        // 给上下文赋值
-        if (ArrayUtil.isNotEmpty(paramNames)) {
-            Object[] args = joinPoint.getArgs();
-            for (int i = 0; i < paramNames.length; i++) {
-                context.setVariable(paramNames[i], args[i]);
-            }
-        }
-
-        // 第二步,逐个参数解析
-        Map<String, Object> result = MapUtil.newHashMap(expressionStrings.size(), true);
-        expressionStrings.forEach(key -> {
-            Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context);
-            result.put(key, value);
-        });
-        return result;
-    }
-
-}

+ 0 - 24
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/spring/SpringUtils.java

@@ -1,24 +0,0 @@
-package co.yixiang.yshop.framework.common.util.spring;
-
-import cn.hutool.extra.spring.SpringUtil;
-
-import java.util.Objects;
-
-/**
- * Spring 工具类
- *
- * @author yshop
- */
-public class SpringUtils extends SpringUtil {
-
-    /**
-     * 是否为生产环境
-     *
-     * @return 是否生产环境
-     */
-    public static boolean isProd() {
-        String activeProfile = getActiveProfile();
-        return Objects.equals("prod", activeProfile);
-    }
-
-}

+ 0 - 96
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/string/StrUtils.java

@@ -1,96 +0,0 @@
-package co.yixiang.yshop.framework.common.util.string;
-
-import cn.hutool.core.text.StrPool;
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.StrUtil;
-import org.springframework.util.CollectionUtils;
-
-import java.text.Collator;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * 字符串工具类
- *
- * @author yshop
- */
-public class StrUtils {
-
-    public static String maxLength(CharSequence str, int maxLength) {
-        return StrUtil.maxLength(str, maxLength - 3); // -3 的原因,是该方法会补充 ... 恰好
-    }
-
-    /**
-     * 给定字符串是否以任何一个字符串开始
-     * 给定字符串和数组为空都返回 false
-     *
-     * @param str      给定字符串
-     * @param prefixes 需要检测的开始字符串
-     * @since 3.0.6
-     */
-    public static boolean startWithAny(String str, Collection<String> prefixes) {
-        if (StrUtil.isEmpty(str) || ArrayUtil.isEmpty(prefixes)) {
-            return false;
-        }
-
-        for (CharSequence suffix : prefixes) {
-            if (StrUtil.startWith(str, suffix, false)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static List<Long> splitToLong(String value, CharSequence separator) {
-        long[] longs = StrUtil.splitToLong(value, separator);
-        return Arrays.stream(longs).boxed().collect(Collectors.toList());
-    }
-
-    public static Set<Long> splitToLongSet(String value) {
-        return splitToLongSet(value, StrPool.COMMA);
-    }
-
-    public static Set<Long> splitToLongSet(String value, CharSequence separator) {
-        long[] longs = StrUtil.splitToLong(value, separator);
-        return Arrays.stream(longs).boxed().collect(Collectors.toSet());
-    }
-
-    public static List<Integer> splitToInteger(String value, CharSequence separator) {
-        int[] integers = StrUtil.splitToInt(value, separator);
-        return Arrays.stream(integers).boxed().collect(Collectors.toList());
-    }
-
-    /**
-     * 移除字符串中,包含指定字符串的行
-     *
-     * @param content 字符串
-     * @param sequence 包含的字符串
-     * @return 移除后的字符串
-     */
-    public static String removeLineContains(String content, String sequence) {
-        if (StrUtil.isEmpty(content) || StrUtil.isEmpty(sequence)) {
-            return content;
-        }
-        return Arrays.stream(content.split("\n"))
-                .filter(line -> !line.contains(sequence))
-                .collect(Collectors.joining("\n"));
-    }
-
-    /**
-     * 数字排在最前,英文字母其次,汉字则按照拼音进行排序
-     */
-    public static List<String> compareTo(List<String> stringList) {
-        if (CollectionUtils.isEmpty(stringList)) {
-            return Collections.emptyList();
-        }
-        Comparator<String> comparator = (text, texts) -> {
-            Collator collator = Collator.getInstance(java.util.Locale.CHINESE);
-            return collator.getCollationKey(text).compareTo(
-                    collator.getCollationKey(texts));
-        };
-        Collections.sort(stringList, comparator);
-        return stringList;
-
-    }
-
-}

+ 0 - 55
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/validation/ValidationUtils.java

@@ -1,55 +0,0 @@
-package co.yixiang.yshop.framework.common.util.validation;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.Assert;
-import org.springframework.util.StringUtils;
-
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.ConstraintViolationException;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * 校验工具类
- *
- * @author yshop
- */
-public class ValidationUtils {
-
-    private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$");
-
-    private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
-
-    private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
-
-    public static boolean isMobile(String mobile) {
-        return StringUtils.hasText(mobile)
-                && PATTERN_MOBILE.matcher(mobile).matches();
-    }
-
-    public static boolean isURL(String url) {
-        return StringUtils.hasText(url)
-                && PATTERN_URL.matcher(url).matches();
-    }
-
-    public static boolean isXmlNCName(String str) {
-        return StringUtils.hasText(str)
-                && PATTERN_XML_NCNAME.matcher(str).matches();
-    }
-
-    public static void validate(Object object, Class<?>... groups) {
-        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
-        Assert.notNull(validator);
-        validate(validator, object, groups);
-    }
-
-    public static void validate(Validator validator, Object object, Class<?>... groups) {
-        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
-        if (CollUtil.isNotEmpty(constraintViolations)) {
-            throw new ConstraintViolationException(constraintViolations);
-        }
-    }
-
-}

+ 0 - 47
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/yshop/LocationUtils.java

@@ -1,47 +0,0 @@
-package co.yixiang.yshop.framework.common.util.yshop;
-
-import cn.hutool.core.util.NumberUtil;
-
-
-/**
- * 定位工具
- * @author hupeng
- */
-public class LocationUtils {
-
-    private static double EARTH_RADIUS = 6378.137;
-
-    private static double rad(double d) {
-        return d * Math.PI / 180.0;
-    }
-
-
-
-    /**
-     * 通过经纬度获取距离(单位:千米)
-     *
-     * @param lat1
-     * @param lng1
-     * @param lat2
-     * @param lng2
-     * @return
-     */
-    public static double getDistance(double lat1, double lng1, double lat2,
-                                     double lng2) {
-        double radLat1 = rad(lat1);
-        double radLat2 = rad(lat2);
-        double a = radLat1 - radLat2;
-        double b = rad(lng1) - rad(lng2);
-        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
-                + Math.cos(radLat1) * Math.cos(radLat2)
-                * Math.pow(Math.sin(b / 2), 2)));
-        s = s * EARTH_RADIUS;
-        s = Math.round(s * 10000d) / 10000d;
-        //s = s*1000;
-        return NumberUtil.round(s, 2).doubleValue();
-        //return s;
-    }
-
-
-
-}

+ 0 - 35
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/InEnum.java

@@ -1,35 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
-import java.lang.annotation.*;
-
-@Target({
-        ElementType.METHOD,
-        ElementType.FIELD,
-        ElementType.ANNOTATION_TYPE,
-        ElementType.CONSTRUCTOR,
-        ElementType.PARAMETER,
-        ElementType.TYPE_USE
-})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Constraint(
-        validatedBy = {InEnumValidator.class, InEnumCollectionValidator.class}
-)
-public @interface InEnum {
-
-    /**
-     * @return 实现 EnumValuable 接口的
-     */
-    Class<? extends IntArrayValuable> value();
-
-    String message() default "必须在指定范围 {value}";
-
-    Class<?>[] groups() default {};
-
-    Class<? extends Payload>[] payload() default {};
-
-}

+ 0 - 42
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/InEnumCollectionValidator.java

@@ -1,42 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import cn.hutool.core.collection.CollUtil;
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class InEnumCollectionValidator implements ConstraintValidator<InEnum, Collection<Integer>> {
-
-    private List<Integer> values;
-
-    @Override
-    public void initialize(InEnum annotation) {
-        IntArrayValuable[] values = annotation.value().getEnumConstants();
-        if (values.length == 0) {
-            this.values = Collections.emptyList();
-        } else {
-            this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList());
-        }
-    }
-
-    @Override
-    public boolean isValid(Collection<Integer> list, ConstraintValidatorContext context) {
-        // 校验通过
-        if (CollUtil.containsAll(values, list)) {
-            return true;
-        }
-        // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值)
-        context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
-        context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()
-                .replaceAll("\\{value}", CollUtil.join(list, ","))).addConstraintViolation(); // 重新添加错误提示语句
-        return false;
-    }
-
-}
-

+ 0 - 44
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/InEnumValidator.java

@@ -1,44 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import co.yixiang.yshop.framework.common.core.IntArrayValuable;
-
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class InEnumValidator implements ConstraintValidator<InEnum, Integer> {
-
-    private List<Integer> values;
-
-    @Override
-    public void initialize(InEnum annotation) {
-        IntArrayValuable[] values = annotation.value().getEnumConstants();
-        if (values.length == 0) {
-            this.values = Collections.emptyList();
-        } else {
-            this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList());
-        }
-    }
-
-    @Override
-    public boolean isValid(Integer value, ConstraintValidatorContext context) {
-        // 为空时,默认不校验,即认为通过
-        if (value == null) {
-            return true;
-        }
-        // 校验通过
-        if (values.contains(value)) {
-            return true;
-        }
-        // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值)
-        context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
-        context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()
-                .replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误提示语句
-        return false;
-    }
-
-}
-

+ 0 - 28
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/Mobile.java

@@ -1,28 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
-import java.lang.annotation.*;
-
-@Target({
-        ElementType.METHOD,
-        ElementType.FIELD,
-        ElementType.ANNOTATION_TYPE,
-        ElementType.CONSTRUCTOR,
-        ElementType.PARAMETER,
-        ElementType.TYPE_USE
-})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Constraint(
-        validatedBy = MobileValidator.class
-)
-public @interface Mobile {
-
-    String message() default "手机号格式不正确";
-
-    Class<?>[] groups() default {};
-
-    Class<? extends Payload>[] payload() default {};
-
-}

+ 0 - 25
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/MobileValidator.java

@@ -1,25 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import cn.hutool.core.util.StrUtil;
-import co.yixiang.yshop.framework.common.util.validation.ValidationUtils;
-
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
-
-public class MobileValidator implements ConstraintValidator<Mobile, String> {
-
-    @Override
-    public void initialize(Mobile annotation) {
-    }
-
-    @Override
-    public boolean isValid(String value, ConstraintValidatorContext context) {
-        // 如果手机号为空,默认不校验,即校验通过
-        if (StrUtil.isEmpty(value)) {
-            return true;
-        }
-        // 校验手机
-        return ValidationUtils.isMobile(value);
-    }
-
-}

+ 0 - 28
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/Telephone.java

@@ -1,28 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
-import java.lang.annotation.*;
-
-@Target({
-        ElementType.METHOD,
-        ElementType.FIELD,
-        ElementType.ANNOTATION_TYPE,
-        ElementType.CONSTRUCTOR,
-        ElementType.PARAMETER,
-        ElementType.TYPE_USE
-})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Constraint(
-        validatedBy = TelephoneValidator.class
-)
-public @interface Telephone {
-
-    String message() default "电话格式不正确";
-
-    Class<?>[] groups() default {};
-
-    Class<? extends Payload>[] payload() default {};
-
-}

+ 0 - 25
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/TelephoneValidator.java

@@ -1,25 +0,0 @@
-package co.yixiang.yshop.framework.common.validation;
-
-import cn.hutool.core.text.CharSequenceUtil;
-import cn.hutool.core.util.PhoneUtil;
-
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
-
-public class TelephoneValidator implements ConstraintValidator<Telephone, String> {
-
-    @Override
-    public void initialize(Telephone annotation) {
-    }
-
-    @Override
-    public boolean isValid(String value, ConstraintValidatorContext context) {
-        // 如果手机号为空,默认不校验,即校验通过
-        if (CharSequenceUtil.isEmpty(value)) {
-            return true;
-        }
-        // 校验手机
-        return PhoneUtil.isTel(value) || PhoneUtil.isPhone(value);
-    }
-
-}

+ 0 - 4
yshop/yshop-drink/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/validation/package-info.java

@@ -1,4 +0,0 @@
-/**
- * 使用 Hibernate Validator 实现参数校验
- */
-package co.yixiang.yshop.framework.common.validation;

+ 0 - 64
yshop/yshop-drink/yshop-framework/yshop-common/src/test/java/co/yixiang/yshop/framework/common/util/collection/CollectionUtilsTest.java

@@ -1,64 +0,0 @@
-package co.yixiang.yshop.framework.common.util.collection;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.junit.jupiter.api.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.function.BiFunction;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * {@link CollectionUtils} 的单元测试
- */
-public class CollectionUtilsTest {
-
-    @Data
-    @AllArgsConstructor
-    private static class Dog {
-
-        private Integer id;
-        private String name;
-        private String code;
-
-    }
-
-    @Test
-    public void testDiffList() {
-        // 准备参数
-        Collection<Dog> oldList = Arrays.asList(
-                new Dog(1, "花花", "hh"),
-                new Dog(2, "旺财", "wc")
-        );
-        Collection<Dog> newList = Arrays.asList(
-                new Dog(null, "花花2", "hh"),
-                new Dog(null, "小白", "xb")
-        );
-        BiFunction<Dog, Dog, Boolean> sameFunc = (oldObj, newObj) -> {
-            boolean same = oldObj.getCode().equals(newObj.getCode());
-            // 如果相等的情况下,需要设置下 id,后续好更新
-            if (same) {
-                newObj.setId(oldObj.getId());
-            }
-            return same;
-        };
-
-        // 调用
-        List<List<Dog>> result = CollectionUtils.diffList(oldList, newList, sameFunc);
-        // 断言
-        assertEquals(result.size(), 3);
-        // 断言 create
-        assertEquals(result.get(0).size(), 1);
-        assertEquals(result.get(0).get(0), new Dog(null, "小白", "xb"));
-        // 断言 update
-        assertEquals(result.get(1).size(), 1);
-        assertEquals(result.get(1).get(0), new Dog(1, "花花2", "hh"));
-        // 断言 delete
-        assertEquals(result.get(2).size(), 1);
-        assertEquals(result.get(2).get(0), new Dog(2, "旺财", "wc"));
-    }
-
-}

+ 0 - 52
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/pom.xml

@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>yshop-framework</artifactId>
-        <groupId>co.yixiang.boot</groupId>
-        <version>${revision}</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>yshop-spring-boot-starter-biz-data-permission</artifactId>
-    <packaging>jar</packaging>
-
-    <name>${project.artifactId}</name>
-    <description>数据权限</description>
-    <url>https://gitee.com/guchengwuyue/yshop-drink</url>
-
-    <dependencies>
-        <dependency>
-            <groupId>co.yixiang.boot</groupId>
-            <artifactId>yshop-common</artifactId>
-        </dependency>
-
-        <!-- Web 相关 -->
-        <dependency>
-            <groupId>co.yixiang.boot</groupId>
-            <artifactId>yshop-spring-boot-starter-security</artifactId>
-            <optional>true</optional> <!-- 可选,如果使用 DeptDataPermissionRule 必须提供 -->
-        </dependency>
-
-        <!-- DB 相关 -->
-        <dependency>
-            <groupId>co.yixiang.boot</groupId>
-            <artifactId>yshop-spring-boot-starter-mybatis</artifactId>
-        </dependency>
-
-        <!-- 业务组件 -->
-        <dependency>
-            <groupId>co.yixiang.boot</groupId>
-            <artifactId>yshop-module-system-api</artifactId> <!-- 需要使用它,进行数据权限的获取 -->
-            <version>${revision}</version>
-        </dependency>
-
-        <!-- Test 测试相关 -->
-        <dependency>
-            <groupId>co.yixiang.boot</groupId>
-            <artifactId>yshop-spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>

+ 0 - 44
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/config/YshopDataPermissionAutoConfiguration.java

@@ -1,44 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.config;
-
-import co.yixiang.yshop.framework.datapermission.core.aop.DataPermissionAnnotationAdvisor;
-import co.yixiang.yshop.framework.datapermission.core.db.DataPermissionDatabaseInterceptor;
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRule;
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRuleFactory;
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRuleFactoryImpl;
-import co.yixiang.yshop.framework.mybatis.core.util.MyBatisUtils;
-import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.context.annotation.Bean;
-
-import java.util.List;
-
-/**
- * 数据权限的自动配置类
- *
- * @author yshop
- */
-@AutoConfiguration
-public class YshopDataPermissionAutoConfiguration {
-
-    @Bean
-    public DataPermissionRuleFactory dataPermissionRuleFactory(List<DataPermissionRule> rules) {
-        return new DataPermissionRuleFactoryImpl(rules);
-    }
-
-    @Bean
-    public DataPermissionDatabaseInterceptor dataPermissionDatabaseInterceptor(MybatisPlusInterceptor interceptor,
-                                                                               DataPermissionRuleFactory ruleFactory) {
-        // 创建 DataPermissionDatabaseInterceptor 拦截器
-        DataPermissionDatabaseInterceptor inner = new DataPermissionDatabaseInterceptor(ruleFactory);
-        // 添加到 interceptor 中
-        // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定
-        MyBatisUtils.addInterceptor(interceptor, inner, 0);
-        return inner;
-    }
-
-    @Bean
-    public DataPermissionAnnotationAdvisor dataPermissionAnnotationAdvisor() {
-        return new DataPermissionAnnotationAdvisor();
-    }
-
-}

+ 0 - 34
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/config/YshopDeptDataPermissionAutoConfiguration.java

@@ -1,34 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.config;
-
-import co.yixiang.yshop.framework.datapermission.core.rule.dept.DeptDataPermissionRule;
-import co.yixiang.yshop.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer;
-import co.yixiang.yshop.framework.security.core.LoginUser;
-import co.yixiang.yshop.module.system.api.permission.PermissionApi;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.context.annotation.Bean;
-
-import java.util.List;
-
-/**
- * 基于部门的数据权限 AutoConfiguration
- *
- * @author yshop
- */
-@AutoConfiguration
-@ConditionalOnClass(LoginUser.class)
-@ConditionalOnBean(value = {PermissionApi.class, DeptDataPermissionRuleCustomizer.class})
-public class YshopDeptDataPermissionAutoConfiguration {
-
-    @Bean
-    public DeptDataPermissionRule deptDataPermissionRule(PermissionApi permissionApi,
-                                                         List<DeptDataPermissionRuleCustomizer> customizers) {
-        // 创建 DeptDataPermissionRule 对象
-        DeptDataPermissionRule rule = new DeptDataPermissionRule(permissionApi);
-        // 补全表配置
-        customizers.forEach(customizer -> customizer.customize(rule));
-        return rule;
-    }
-
-}

+ 0 - 35
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/annotation/DataPermission.java

@@ -1,35 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.annotation;
-
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRule;
-
-import java.lang.annotation.*;
-
-/**
- * 数据权限注解
- * 可声明在类或者方法上,标识使用的数据权限规则
- *
- * @author yshop
- */
-@Target({ElementType.TYPE, ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface DataPermission {
-
-    /**
-     * 当前类或方法是否开启数据权限
-     * 即使不添加 @DataPermission 注解,默认是开启状态
-     * 可通过设置 enable 为 false 禁用
-     */
-    boolean enable() default true;
-
-    /**
-     * 生效的数据权限规则数组,优先级高于 {@link #excludeRules()}
-     */
-    Class<? extends DataPermissionRule>[] includeRules() default {};
-
-    /**
-     * 排除的数据权限规则数组,优先级最低
-     */
-    Class<? extends DataPermissionRule>[] excludeRules() default {};
-
-}

+ 0 - 36
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java

@@ -1,36 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.aop;
-
-import co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import org.aopalliance.aop.Advice;
-import org.springframework.aop.Pointcut;
-import org.springframework.aop.support.AbstractPointcutAdvisor;
-import org.springframework.aop.support.ComposablePointcut;
-import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
-
-/**
- * {@link co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission} 注解的 Advisor 实现类
- *
- * @author yshop
- */
-@Getter
-@EqualsAndHashCode(callSuper = true)
-public class DataPermissionAnnotationAdvisor extends AbstractPointcutAdvisor {
-
-    private final Advice advice;
-
-    private final Pointcut pointcut;
-
-    public DataPermissionAnnotationAdvisor() {
-        this.advice = new DataPermissionAnnotationInterceptor();
-        this.pointcut = this.buildPointcut();
-    }
-
-    protected Pointcut buildPointcut() {
-        Pointcut classPointcut = new AnnotationMatchingPointcut(DataPermission.class, true);
-        Pointcut methodPointcut = new AnnotationMatchingPointcut(null, DataPermission.class, true);
-        return new ComposablePointcut(classPointcut).union(methodPointcut);
-    }
-
-}

+ 0 - 72
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java

@@ -1,72 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.aop;
-
-import co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission;
-import lombok.Getter;
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-import org.springframework.core.MethodClassKey;
-import org.springframework.core.annotation.AnnotationUtils;
-
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * {@link DataPermission} 注解的拦截器
- * 1. 在执行方法前,将 @DataPermission 注解入栈
- * 2. 在执行方法后,将 @DataPermission 注解出栈
- *
- * @author yshop
- */
-@DataPermission // 该注解,用于 {@link DATA_PERMISSION_NULL} 的空对象
-public class DataPermissionAnnotationInterceptor implements MethodInterceptor {
-
-    /**
-     * DataPermission 空对象,用于方法无 {@link DataPermission} 注解时,使用 DATA_PERMISSION_NULL 进行占位
-     */
-    static final DataPermission DATA_PERMISSION_NULL = DataPermissionAnnotationInterceptor.class.getAnnotation(DataPermission.class);
-
-    @Getter
-    private final Map<MethodClassKey, DataPermission> dataPermissionCache = new ConcurrentHashMap<>();
-
-    @Override
-    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
-        // 入栈
-        DataPermission dataPermission = this.findAnnotation(methodInvocation);
-        if (dataPermission != null) {
-            DataPermissionContextHolder.add(dataPermission);
-        }
-        try {
-            // 执行逻辑
-            return methodInvocation.proceed();
-        } finally {
-            // 出栈
-            if (dataPermission != null) {
-                DataPermissionContextHolder.remove();
-            }
-        }
-    }
-
-    private DataPermission findAnnotation(MethodInvocation methodInvocation) {
-        // 1. 从缓存中获取
-        Method method = methodInvocation.getMethod();
-        Object targetObject = methodInvocation.getThis();
-        Class<?> clazz = targetObject != null ? targetObject.getClass() : method.getDeclaringClass();
-        MethodClassKey methodClassKey = new MethodClassKey(method, clazz);
-        DataPermission dataPermission = dataPermissionCache.get(methodClassKey);
-        if (dataPermission != null) {
-            return dataPermission != DATA_PERMISSION_NULL ? dataPermission : null;
-        }
-
-        // 2.1 从方法中获取
-        dataPermission = AnnotationUtils.findAnnotation(method, DataPermission.class);
-        // 2.2 从类上获取
-        if (dataPermission == null) {
-            dataPermission = AnnotationUtils.findAnnotation(clazz, DataPermission.class);
-        }
-        // 2.3 添加到缓存中
-        dataPermissionCache.put(methodClassKey, dataPermission != null ? dataPermission : DATA_PERMISSION_NULL);
-        return dataPermission;
-    }
-
-}

+ 0 - 72
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionContextHolder.java

@@ -1,72 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.aop;
-
-import co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission;
-import com.alibaba.ttl.TransmittableThreadLocal;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * {@link DataPermission} 注解的 Context 上下文
- *
- * @author yshop
- */
-public class DataPermissionContextHolder {
-
-    /**
-     * 使用 List 的原因,可能存在方法的嵌套调用
-     */
-    private static final ThreadLocal<LinkedList<DataPermission>> DATA_PERMISSIONS =
-            TransmittableThreadLocal.withInitial(LinkedList::new);
-
-    /**
-     * 获得当前的 DataPermission 注解
-     *
-     * @return DataPermission 注解
-     */
-    public static DataPermission get() {
-        return DATA_PERMISSIONS.get().peekLast();
-    }
-
-    /**
-     * 入栈 DataPermission 注解
-     *
-     * @param dataPermission DataPermission 注解
-     */
-    public static void add(DataPermission dataPermission) {
-        DATA_PERMISSIONS.get().addLast(dataPermission);
-    }
-
-    /**
-     * 出栈 DataPermission 注解
-     *
-     * @return DataPermission 注解
-     */
-    public static DataPermission remove() {
-        DataPermission dataPermission = DATA_PERMISSIONS.get().removeLast();
-        // 无元素时,清空 ThreadLocal
-        if (DATA_PERMISSIONS.get().isEmpty()) {
-            DATA_PERMISSIONS.remove();
-        }
-        return dataPermission;
-    }
-
-    /**
-     * 获得所有 DataPermission
-     *
-     * @return DataPermission 队列
-     */
-    public static List<DataPermission> getAll() {
-        return DATA_PERMISSIONS.get();
-    }
-
-    /**
-     * 清空上下文
-     *
-     * 目前仅仅用于单测
-     */
-    public static void clear() {
-        DATA_PERMISSIONS.remove();
-    }
-
-}

+ 0 - 641
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java

@@ -1,641 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.db;
-
-import cn.hutool.core.collection.CollUtil;
-import co.yixiang.yshop.framework.common.util.collection.SetUtils;
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRule;
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRuleFactory;
-import co.yixiang.yshop.framework.mybatis.core.util.MyBatisUtils;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
-import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
-import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import net.sf.jsqlparser.expression.*;
-import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
-import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
-import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.expression.operators.relational.InExpression;
-import net.sf.jsqlparser.schema.Table;
-import net.sf.jsqlparser.statement.delete.Delete;
-import net.sf.jsqlparser.statement.select.*;
-import net.sf.jsqlparser.statement.update.Update;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.mapping.BoundSql;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.session.ResultHandler;
-import org.apache.ibatis.session.RowBounds;
-
-import java.sql.Connection;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 数据权限拦截器,通过 {@link DataPermissionRule} 数据权限规则,重写 SQL 的方式来实现
- * 主要的 SQL 重写方法,可见 {@link #builderExpression(Expression, List)} 方法
- *
- * 整体的代码实现上,参考 {@link com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor} 实现。
- * 所以每次 MyBatis Plus 升级时,需要 Review 下其具体的实现是否有变更!
- *
- * @author yshop
- */
-@RequiredArgsConstructor
-public class DataPermissionDatabaseInterceptor extends JsqlParserSupport implements InnerInterceptor {
-
-    private final DataPermissionRuleFactory ruleFactory;
-
-    @Getter
-    private final MappedStatementCache mappedStatementCache = new MappedStatementCache();
-
-    @Override // SELECT 场景
-    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
-        // 获得 Mapper 对应的数据权限的规则
-        List<DataPermissionRule> rules = ruleFactory.getDataPermissionRule(ms.getId());
-        if (mappedStatementCache.noRewritable(ms, rules)) { // 如果无需重写,则跳过
-            return;
-        }
-
-        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
-        try {
-            // 初始化上下文
-            ContextHolder.init(rules);
-            // 处理 SQL
-            mpBs.sql(parserSingle(mpBs.sql(), null));
-        } finally {
-            // 添加是否需要重写的缓存
-            addMappedStatementCache(ms);
-            // 清空上下文
-            ContextHolder.clear();
-        }
-    }
-
-    @Override // 只处理 UPDATE / DELETE 场景,不处理 INSERT 场景(因为 INSERT 不需要数据权限)
-    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
-        PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
-        MappedStatement ms = mpSh.mappedStatement();
-        SqlCommandType sct = ms.getSqlCommandType();
-        if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
-            // 获得 Mapper 对应的数据权限的规则
-            List<DataPermissionRule> rules = ruleFactory.getDataPermissionRule(ms.getId());
-            if (mappedStatementCache.noRewritable(ms, rules)) { // 如果无需重写,则跳过
-                return;
-            }
-
-            PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
-            try {
-                // 初始化上下文
-                ContextHolder.init(rules);
-                // 处理 SQL
-                mpBs.sql(parserMulti(mpBs.sql(), null));
-            } finally {
-                // 添加是否需要重写的缓存
-                addMappedStatementCache(ms);
-                // 清空上下文
-                ContextHolder.clear();
-            }
-        }
-    }
-
-    @Override
-    protected void processSelect(Select select, int index, String sql, Object obj) {
-        processSelectBody(select.getSelectBody());
-        List<WithItem> withItemsList = select.getWithItemsList();
-        if (!CollectionUtils.isEmpty(withItemsList)) {
-            withItemsList.forEach(this::processSelectBody);
-        }
-    }
-
-    /**
-     * update 语句处理
-     */
-    @Override
-    protected void processUpdate(Update update, int index, String sql, Object obj) {
-        final Table table = update.getTable();
-        update.setWhere(this.builderExpression(update.getWhere(), table));
-    }
-
-    /**
-     * delete 语句处理
-     */
-    @Override
-    protected void processDelete(Delete delete, int index, String sql, Object obj) {
-        delete.setWhere(this.builderExpression(delete.getWhere(), delete.getTable()));
-    }
-
-    // ========== 和 TenantLineInnerInterceptor 一致的逻辑 ==========
-
-    protected void processSelectBody(SelectBody selectBody) {
-        if (selectBody == null) {
-            return;
-        }
-        if (selectBody instanceof PlainSelect) {
-            processPlainSelect((PlainSelect) selectBody);
-        } else if (selectBody instanceof WithItem) {
-            WithItem withItem = (WithItem) selectBody;
-            processSelectBody(withItem.getSubSelect().getSelectBody());
-        } else {
-            SetOperationList operationList = (SetOperationList) selectBody;
-            List<SelectBody> selectBodyList = operationList.getSelects();
-            if (CollectionUtils.isNotEmpty(selectBodyList)) {
-                selectBodyList.forEach(this::processSelectBody);
-            }
-        }
-    }
-
-    /**
-     * 处理 PlainSelect
-     */
-    protected void processPlainSelect(PlainSelect plainSelect) {
-        //#3087 github
-        List<SelectItem> selectItems = plainSelect.getSelectItems();
-        if (CollectionUtils.isNotEmpty(selectItems)) {
-            selectItems.forEach(this::processSelectItem);
-        }
-
-        // 处理 where 中的子查询
-        Expression where = plainSelect.getWhere();
-        processWhereSubSelect(where);
-
-        // 处理 fromItem
-        FromItem fromItem = plainSelect.getFromItem();
-        List<Table> list = processFromItem(fromItem);
-        List<Table> mainTables = new ArrayList<>(list);
-
-        // 处理 join
-        List<Join> joins = plainSelect.getJoins();
-        if (CollectionUtils.isNotEmpty(joins)) {
-            mainTables = processJoins(mainTables, joins);
-        }
-
-        // 当有 mainTable 时,进行 where 条件追加
-        if (CollectionUtils.isNotEmpty(mainTables)) {
-            plainSelect.setWhere(builderExpression(where, mainTables));
-        }
-    }
-
-    private List<Table> processFromItem(FromItem fromItem) {
-        // 处理括号括起来的表达式
-        while (fromItem instanceof ParenthesisFromItem) {
-            fromItem = ((ParenthesisFromItem) fromItem).getFromItem();
-        }
-
-        List<Table> mainTables = new ArrayList<>();
-        // 无 join 时的处理逻辑
-        if (fromItem instanceof Table) {
-            Table fromTable = (Table) fromItem;
-            mainTables.add(fromTable);
-        } else if (fromItem instanceof SubJoin) {
-            // SubJoin 类型则还需要添加上 where 条件
-            List<Table> tables = processSubJoin((SubJoin) fromItem);
-            mainTables.addAll(tables);
-        } else {
-            // 处理下 fromItem
-            processOtherFromItem(fromItem);
-        }
-        return mainTables;
-    }
-
-    /**
-     * 处理where条件内的子查询
-     * <p>
-     * 支持如下:
-     * 1. in
-     * 2. =
-     * 3. >
-     * 4. <
-     * 5. >=
-     * 6. <=
-     * 7. <>
-     * 8. EXISTS
-     * 9. NOT EXISTS
-     * <p>
-     * 前提条件:
-     * 1. 子查询必须放在小括号中
-     * 2. 子查询一般放在比较操作符的右边
-     *
-     * @param where where 条件
-     */
-    protected void processWhereSubSelect(Expression where) {
-        if (where == null) {
-            return;
-        }
-        if (where instanceof FromItem) {
-            processOtherFromItem((FromItem) where);
-            return;
-        }
-        if (where.toString().indexOf("SELECT") > 0) {
-            // 有子查询
-            if (where instanceof BinaryExpression) {
-                // 比较符号 , and , or , 等等
-                BinaryExpression expression = (BinaryExpression) where;
-                processWhereSubSelect(expression.getLeftExpression());
-                processWhereSubSelect(expression.getRightExpression());
-            } else if (where instanceof InExpression) {
-                // in
-                InExpression expression = (InExpression) where;
-                Expression inExpression = expression.getRightExpression();
-                if (inExpression instanceof SubSelect) {
-                    processSelectBody(((SubSelect) inExpression).getSelectBody());
-                }
-            } else if (where instanceof ExistsExpression) {
-                // exists
-                ExistsExpression expression = (ExistsExpression) where;
-                processWhereSubSelect(expression.getRightExpression());
-            } else if (where instanceof NotExpression) {
-                // not exists
-                NotExpression expression = (NotExpression) where;
-                processWhereSubSelect(expression.getExpression());
-            } else if (where instanceof Parenthesis) {
-                Parenthesis expression = (Parenthesis) where;
-                processWhereSubSelect(expression.getExpression());
-            }
-        }
-    }
-
-    protected void processSelectItem(SelectItem selectItem) {
-        if (selectItem instanceof SelectExpressionItem) {
-            SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
-            if (selectExpressionItem.getExpression() instanceof SubSelect) {
-                processSelectBody(((SubSelect) selectExpressionItem.getExpression()).getSelectBody());
-            } else if (selectExpressionItem.getExpression() instanceof Function) {
-                processFunction((Function) selectExpressionItem.getExpression());
-            }
-        }
-    }
-
-    /**
-     * 处理函数
-     * <p>支持: 1. select fun(args..) 2. select fun1(fun2(args..),args..)<p>
-     * <p> fixed gitee pulls/141</p>
-     *
-     * @param function
-     */
-    protected void processFunction(Function function) {
-        ExpressionList parameters = function.getParameters();
-        if (parameters != null) {
-            parameters.getExpressions().forEach(expression -> {
-                if (expression instanceof SubSelect) {
-                    processSelectBody(((SubSelect) expression).getSelectBody());
-                } else if (expression instanceof Function) {
-                    processFunction((Function) expression);
-                }
-            });
-        }
-    }
-
-    /**
-     * 处理子查询等
-     */
-    protected void processOtherFromItem(FromItem fromItem) {
-        // 去除括号
-        while (fromItem instanceof ParenthesisFromItem) {
-            fromItem = ((ParenthesisFromItem) fromItem).getFromItem();
-        }
-
-        if (fromItem instanceof SubSelect) {
-            SubSelect subSelect = (SubSelect) fromItem;
-            if (subSelect.getSelectBody() != null) {
-                processSelectBody(subSelect.getSelectBody());
-            }
-        } else if (fromItem instanceof ValuesList) {
-            logger.debug("Perform a subQuery, if you do not give us feedback");
-        } else if (fromItem instanceof LateralSubSelect) {
-            LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
-            if (lateralSubSelect.getSubSelect() != null) {
-                SubSelect subSelect = lateralSubSelect.getSubSelect();
-                if (subSelect.getSelectBody() != null) {
-                    processSelectBody(subSelect.getSelectBody());
-                }
-            }
-        }
-    }
-
-    /**
-     * 处理 sub join
-     *
-     * @param subJoin subJoin
-     * @return Table subJoin 中的主表
-     */
-    private List<Table> processSubJoin(SubJoin subJoin) {
-        List<Table> mainTables = new ArrayList<>();
-        if (subJoin.getJoinList() != null) {
-            List<Table> list = processFromItem(subJoin.getLeft());
-            mainTables.addAll(list);
-            mainTables = processJoins(mainTables, subJoin.getJoinList());
-        }
-        return mainTables;
-    }
-
-    /**
-     * 处理 joins
-     *
-     * @param mainTables 可以为 null
-     * @param joins      join 集合
-     * @return List<Table> 右连接查询的 Table 列表
-     */
-    private List<Table> processJoins(List<Table> mainTables, List<Join> joins) {
-        // join 表达式中最终的主表
-        Table mainTable = null;
-        // 当前 join 的左表
-        Table leftTable = null;
-
-        if (mainTables == null) {
-            mainTables = new ArrayList<>();
-        } else if (mainTables.size() == 1) {
-            mainTable = mainTables.get(0);
-            leftTable = mainTable;
-        }
-
-        //对于 on 表达式写在最后的 join,需要记录下前面多个 on 的表名
-        Deque<List<Table>> onTableDeque = new LinkedList<>();
-        for (Join join : joins) {
-            // 处理 on 表达式
-            FromItem joinItem = join.getRightItem();
-
-            // 获取当前 join 的表,subJoint 可以看作是一张表
-            List<Table> joinTables = null;
-            if (joinItem instanceof Table) {
-                joinTables = new ArrayList<>();
-                joinTables.add((Table) joinItem);
-            } else if (joinItem instanceof SubJoin) {
-                joinTables = processSubJoin((SubJoin) joinItem);
-            }
-
-            if (joinTables != null) {
-
-                // 如果是隐式内连接
-                if (join.isSimple()) {
-                    mainTables.addAll(joinTables);
-                    continue;
-                }
-
-                // 当前表是否忽略
-                Table joinTable = joinTables.get(0);
-
-                List<Table> onTables = null;
-                // 如果不要忽略,且是右连接,则记录下当前表
-                if (join.isRight()) {
-                    mainTable = joinTable;
-                    if (leftTable != null) {
-                        onTables = Collections.singletonList(leftTable);
-                    }
-                } else if (join.isLeft()) {
-                    onTables = Collections.singletonList(joinTable);
-                } else if (join.isInner()) {
-                    if (mainTable == null) {
-                        onTables = Collections.singletonList(joinTable);
-                    } else {
-                        onTables = Arrays.asList(mainTable, joinTable);
-                    }
-                    mainTable = null;
-                }
-
-                mainTables = new ArrayList<>();
-                if (mainTable != null) {
-                    mainTables.add(mainTable);
-                }
-
-                // 获取 join 尾缀的 on 表达式列表
-                Collection<Expression> originOnExpressions = join.getOnExpressions();
-                // 正常 join on 表达式只有一个,立刻处理
-                if (originOnExpressions.size() == 1 && onTables != null) {
-                    List<Expression> onExpressions = new LinkedList<>();
-                    onExpressions.add(builderExpression(originOnExpressions.iterator().next(), onTables));
-                    join.setOnExpressions(onExpressions);
-                    leftTable = joinTable;
-                    continue;
-                }
-                // 表名压栈,忽略的表压入 null,以便后续不处理
-                onTableDeque.push(onTables);
-                // 尾缀多个 on 表达式的时候统一处理
-                if (originOnExpressions.size() > 1) {
-                    Collection<Expression> onExpressions = new LinkedList<>();
-                    for (Expression originOnExpression : originOnExpressions) {
-                        List<Table> currentTableList = onTableDeque.poll();
-                        if (CollectionUtils.isEmpty(currentTableList)) {
-                            onExpressions.add(originOnExpression);
-                        } else {
-                            onExpressions.add(builderExpression(originOnExpression, currentTableList));
-                        }
-                    }
-                    join.setOnExpressions(onExpressions);
-                }
-                leftTable = joinTable;
-            } else {
-                processOtherFromItem(joinItem);
-                leftTable = null;
-            }
-        }
-
-        return mainTables;
-    }
-
-    // ========== 和 TenantLineInnerInterceptor 存在差异的逻辑:关键,实现权限条件的拼接 ==========
-
-    /**
-     * 处理条件
-     *
-     * @param currentExpression 当前 where 条件
-     * @param table             单个表
-     */
-    protected Expression builderExpression(Expression currentExpression, Table table) {
-        return this.builderExpression(currentExpression, Collections.singletonList(table));
-    }
-
-    /**
-     * 处理条件
-     *
-     * @param currentExpression 当前 where 条件
-     * @param tables 多个表
-     */
-    protected Expression builderExpression(Expression currentExpression, List<Table> tables) {
-        // 没有表需要处理直接返回
-        if (CollectionUtils.isEmpty(tables)) {
-            return currentExpression;
-        }
-
-        // 第一步,获得 Table 对应的数据权限条件
-        Expression dataPermissionExpression = null;
-        for (Table table : tables) {
-            // 构建每个表的权限 Expression 条件
-            Expression expression = buildDataPermissionExpression(table);
-            if (expression == null) {
-                continue;
-            }
-            // 合并到 dataPermissionExpression 中
-            dataPermissionExpression = dataPermissionExpression == null ? expression
-                    : new AndExpression(dataPermissionExpression, expression);
-        }
-
-        // 第二步,合并多个 Expression 条件
-        if (dataPermissionExpression == null) {
-            return currentExpression;
-        }
-        if (currentExpression == null) {
-            return dataPermissionExpression;
-        }
-        // ① 如果表达式为 Or,则需要 (currentExpression) AND dataPermissionExpression
-        if (currentExpression instanceof OrExpression) {
-            return new AndExpression(new Parenthesis(currentExpression), dataPermissionExpression);
-        }
-        // ② 如果表达式为 And,则直接返回 where AND dataPermissionExpression
-        return new AndExpression(currentExpression, dataPermissionExpression);
-    }
-
-    /**
-     * 构建指定表的数据权限的 Expression 过滤条件
-     *
-     * @param table 表
-     * @return Expression 过滤条件
-     */
-    private Expression buildDataPermissionExpression(Table table) {
-        // 生成条件
-        Expression allExpression = null;
-        for (DataPermissionRule rule : ContextHolder.getRules()) {
-            // 判断表名是否匹配
-            String tableName = MyBatisUtils.getTableName(table);
-            if (!rule.getTableNames().contains(tableName)) {
-                continue;
-            }
-            // 如果有匹配的规则,说明可重写。
-            // 为什么不是有 allExpression 非空才重写呢?在生成 column = value 过滤条件时,会因为 value 不存在,导致未重写。
-            // 这样导致第一次无 value,被标记成无需重写;但是第二次有 value,此时会需要重写。
-            ContextHolder.setRewrite(true);
-
-            // 单条规则的条件
-            Expression oneExpress = rule.getExpression(tableName, table.getAlias());
-            if (oneExpress == null){
-                continue;
-            }
-            // 拼接到 allExpression 中
-            allExpression = allExpression == null ? oneExpress
-                    : new AndExpression(allExpression, oneExpress);
-        }
-
-        return allExpression;
-    }
-
-    /**
-     * 判断 SQL 是否重写。如果没有重写,则添加到 {@link MappedStatementCache} 中
-     *
-     * @param ms MappedStatement
-     */
-    private void addMappedStatementCache(MappedStatement ms) {
-        if (ContextHolder.getRewrite()) {
-            return;
-        }
-        // 无重写,进行添加
-        mappedStatementCache.addNoRewritable(ms, ContextHolder.getRules());
-    }
-
-    /**
-     * SQL 解析上下文,方便透传 {@link DataPermissionRule} 规则
-     *
-     * @author yshop
-     */
-    static final class ContextHolder {
-
-        /**
-         * 该 {@link MappedStatement} 对应的规则
-         */
-        private static final ThreadLocal<List<DataPermissionRule>> RULES = ThreadLocal.withInitial(Collections::emptyList);
-        /**
-         * SQL 是否进行重写
-         */
-        private static final ThreadLocal<Boolean> REWRITE = ThreadLocal.withInitial(() -> Boolean.FALSE);
-
-        public static void init(List<DataPermissionRule> rules) {
-            RULES.set(rules);
-            REWRITE.set(false);
-        }
-
-        public static void clear() {
-            RULES.remove();
-            REWRITE.remove();
-        }
-
-        public static boolean getRewrite() {
-            return REWRITE.get();
-        }
-
-        public static void setRewrite(boolean rewrite) {
-            REWRITE.set(rewrite);
-        }
-
-        public static List<DataPermissionRule> getRules() {
-            return RULES.get();
-        }
-
-    }
-
-    /**
-     * {@link MappedStatement} 缓存
-     * 目前主要用于,记录 {@link DataPermissionRule} 是否对指定 {@link MappedStatement} 无效
-     * 如果无效,则可以避免 SQL 的解析,加快速度
-     *
-     * @author yshop
-     */
-    static final class MappedStatementCache {
-
-        /**
-         * 指定数据权限规则,对指定 MappedStatement 无需重写(不生效)的缓存
-         *
-         * value:{@link MappedStatement#getId()} 编号
-         */
-        @Getter
-        private final Map<Class<? extends DataPermissionRule>, Set<String>> noRewritableMappedStatements = new ConcurrentHashMap<>();
-
-        /**
-         * 判断是否无需重写
-         * ps:虽然有点中文式英语,但是容易读懂即可
-         *
-         * @param ms MappedStatement
-         * @param rules 数据权限规则数组
-         * @return 是否无需重写
-         */
-        public boolean noRewritable(MappedStatement ms, List<DataPermissionRule> rules) {
-            // 如果规则为空,说明无需重写
-            if (CollUtil.isEmpty(rules)) {
-                return true;
-            }
-            // 任一规则不在 noRewritableMap 中,则说明可能需要重写
-            for (DataPermissionRule rule : rules) {
-                Set<String> mappedStatementIds = noRewritableMappedStatements.get(rule.getClass());
-                if (!CollUtil.contains(mappedStatementIds, ms.getId())) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        /**
-         * 添加无需重写的 MappedStatement
-         *
-         * @param ms MappedStatement
-         * @param rules 数据权限规则数组
-         */
-        public void addNoRewritable(MappedStatement ms, List<DataPermissionRule> rules) {
-            for (DataPermissionRule rule : rules) {
-                Set<String> mappedStatementIds = noRewritableMappedStatements.get(rule.getClass());
-                if (CollUtil.isNotEmpty(mappedStatementIds)) {
-                    mappedStatementIds.add(ms.getId());
-                } else {
-                    noRewritableMappedStatements.put(rule.getClass(), SetUtils.asSet(ms.getId()));
-                }
-            }
-        }
-
-        /**
-         * 清空缓存
-         * 目前主要提供给单元测试
-         */
-        public void clear() {
-            noRewritableMappedStatements.clear();
-        }
-
-    }
-
-}

+ 0 - 36
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/DataPermissionRule.java

@@ -1,36 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.rule;
-
-import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
-import net.sf.jsqlparser.expression.Alias;
-import net.sf.jsqlparser.expression.Expression;
-
-import java.util.Set;
-
-/**
- * 数据权限规则接口
- * 通过实现接口,自定义数据规则。例如说,
- *
- * @author yshop
- */
-public interface DataPermissionRule {
-
-    /**
-     * 返回需要生效的表名数组
-     * 为什么需要该方法?Data Permission 数组基于 SQL 重写,通过 Where 返回只有权限的数据
-     *
-     * 如果需要基于实体名获得表名,可调用 {@link TableInfoHelper#getTableInfo(Class)} 获得
-     *
-     * @return 表名数组
-     */
-    Set<String> getTableNames();
-
-    /**
-     * 根据表名和别名,生成对应的 WHERE / OR 过滤条件
-     *
-     * @param tableName 表名
-     * @param tableAlias 别名,可能为空
-     * @return 过滤条件 Expression 表达式
-     */
-    Expression getExpression(String tableName, Alias tableAlias);
-
-}

+ 0 - 28
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/DataPermissionRuleFactory.java

@@ -1,28 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.rule;
-
-import java.util.List;
-
-/**
- * {@link DataPermissionRule} 工厂接口
- * 作为 {@link DataPermissionRule} 的容器,提供管理能力
- *
- * @author yshop
- */
-public interface DataPermissionRuleFactory {
-
-    /**
-     * 获得所有数据权限规则数组
-     *
-     * @return 数据权限规则数组
-     */
-    List<DataPermissionRule> getDataPermissionRules();
-
-    /**
-     * 获得指定 Mapper 的数据权限规则数组
-     *
-     * @param mappedStatementId 指定 Mapper 的编号
-     * @return 数据权限规则数组
-     */
-    List<DataPermissionRule> getDataPermissionRule(String mappedStatementId);
-
-}

+ 0 - 62
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java

@@ -1,62 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.rule;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ArrayUtil;
-import co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission;
-import co.yixiang.yshop.framework.datapermission.core.aop.DataPermissionContextHolder;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 默认的 DataPermissionRuleFactoryImpl 实现类
- * 支持通过 {@link DataPermissionContextHolder} 过滤数据权限
- *
- * @author yshop
- */
-@RequiredArgsConstructor
-public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory {
-
-    /**
-     * 数据权限规则数组
-     */
-    private final List<DataPermissionRule> rules;
-
-    @Override
-    public List<DataPermissionRule> getDataPermissionRules() {
-        return rules;
-    }
-
-    @Override // mappedStatementId 参数,暂时没有用。以后,可以基于 mappedStatementId + DataPermission 进行缓存
-    public List<DataPermissionRule> getDataPermissionRule(String mappedStatementId) {
-        // 1. 无数据权限
-        if (CollUtil.isEmpty(rules)) {
-            return Collections.emptyList();
-        }
-        // 2. 未配置,则默认开启
-        DataPermission dataPermission = DataPermissionContextHolder.get();
-        if (dataPermission == null) {
-            return rules;
-        }
-        // 3. 已配置,但禁用
-        if (!dataPermission.enable()) {
-            return Collections.emptyList();
-        }
-
-        // 4. 已配置,只选择部分规则
-        if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) {
-            return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass()))
-                    .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询
-        }
-        // 5. 已配置,只排除部分规则
-        if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) {
-            return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass()))
-                    .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询
-        }
-        // 6. 已配置,全部规则
-        return rules;
-    }
-
-}

+ 0 - 205
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java

@@ -1,205 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.rule.dept;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import co.yixiang.yshop.framework.common.enums.UserTypeEnum;
-import co.yixiang.yshop.framework.common.util.collection.CollectionUtils;
-import co.yixiang.yshop.framework.common.util.json.JsonUtils;
-import co.yixiang.yshop.framework.datapermission.core.rule.DataPermissionRule;
-import co.yixiang.yshop.framework.mybatis.core.dataobject.BaseDO;
-import co.yixiang.yshop.framework.mybatis.core.util.MyBatisUtils;
-import co.yixiang.yshop.framework.security.core.LoginUser;
-import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils;
-import co.yixiang.yshop.module.system.api.permission.PermissionApi;
-import co.yixiang.yshop.module.system.api.permission.dto.DeptDataPermissionRespDTO;
-import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import net.sf.jsqlparser.expression.*;
-import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
-import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.expression.operators.relational.InExpression;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * 基于部门的 {@link DataPermissionRule} 数据权限规则实现
- *
- * 注意,使用 DeptDataPermissionRule 时,需要保证表中有 dept_id 部门编号的字段,可自定义。
- *
- * 实际业务场景下,会存在一个经典的问题?当用户修改部门时,冗余的 dept_id 是否需要修改?
- * 1. 一般情况下,dept_id 不进行修改,则会导致用户看不到之前的数据。【yshop-server 采用该方案】
- * 2. 部分情况下,希望该用户还是能看到之前的数据,则有两种方式解决:【需要你改造该 DeptDataPermissionRule 的实现代码】
- *  1)编写洗数据的脚本,将 dept_id 修改成新部门的编号;【建议】
- *      最终过滤条件是 WHERE dept_id = ?
- *  2)洗数据的话,可能涉及的数据量较大,也可以采用 user_id 进行过滤的方式,此时需要获取到 dept_id 对应的所有 user_id 用户编号;
- *      最终过滤条件是 WHERE user_id IN (?, ?, ? ...)
- *  3)想要保证原 dept_id 和 user_id 都可以看的到,此时使用 dept_id 和 user_id 一起过滤;
- *      最终过滤条件是 WHERE dept_id = ? OR user_id IN (?, ?, ? ...)
- *
- * @author yshop
- */
-@AllArgsConstructor
-@Slf4j
-public class DeptDataPermissionRule implements DataPermissionRule {
-
-    /**
-     * LoginUser 的 Context 缓存 Key
-     */
-    protected static final String CONTEXT_KEY = DeptDataPermissionRule.class.getSimpleName();
-
-    private static final String DEPT_COLUMN_NAME = "dept_id";
-    private static final String USER_COLUMN_NAME = "user_id";
-
-    static final Expression EXPRESSION_NULL = new NullValue();
-
-    private final PermissionApi permissionApi;
-
-    /**
-     * 基于部门的表字段配置
-     * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。
-     *
-     * key:表名
-     * value:字段名
-     */
-    private final Map<String, String> deptColumns = new HashMap<>();
-    /**
-     * 基于用户的表字段配置
-     * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。
-     *
-     * key:表名
-     * value:字段名
-     */
-    private final Map<String, String> userColumns = new HashMap<>();
-    /**
-     * 所有表名,是 {@link #deptColumns} 和 {@link #userColumns} 的合集
-     */
-    private final Set<String> TABLE_NAMES = new HashSet<>();
-
-    @Override
-    public Set<String> getTableNames() {
-        return TABLE_NAMES;
-    }
-
-    @Override
-    public Expression getExpression(String tableName, Alias tableAlias) {
-        // 只有有登陆用户的情况下,才进行数据权限的处理
-        LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
-        if (loginUser == null) {
-            return null;
-        }
-        // 只有管理员类型的用户,才进行数据权限的处理
-        if (ObjectUtil.notEqual(loginUser.getUserType(), UserTypeEnum.ADMIN.getValue())) {
-            return null;
-        }
-
-        // 获得数据权限
-        DeptDataPermissionRespDTO deptDataPermission = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class);
-        // 从上下文中拿不到,则调用逻辑进行获取
-        if (deptDataPermission == null) {
-            deptDataPermission = permissionApi.getDeptDataPermission(loginUser.getId());
-            if (deptDataPermission == null) {
-                log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser));
-                throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限",
-                        loginUser.getId(), tableName, tableAlias.getName()));
-            }
-            // 添加到上下文中,避免重复计算
-            loginUser.setContext(CONTEXT_KEY, deptDataPermission);
-        }
-
-        // 情况一,如果是 ALL 可查看全部,则无需拼接条件
-        if (deptDataPermission.getAll()) {
-            return null;
-        }
-
-        // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限
-        if (CollUtil.isEmpty(deptDataPermission.getDeptIds())
-            && Boolean.FALSE.equals(deptDataPermission.getSelf())) {
-            return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空
-        }
-
-        // 情况三,拼接 Dept 和 User 的条件,最后组合
-        Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds());
-        Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId());
-        if (deptExpression == null && userExpression == null) {
-            // TODO 芋艿:获得不到条件的时候,暂时不抛出异常,而是不返回数据
-            log.warn("[getExpression][LoginUser({}) Table({}/{}) DeptDataPermission({}) 构建的条件为空]",
-                    JsonUtils.toJsonString(loginUser), tableName, tableAlias, JsonUtils.toJsonString(deptDataPermission));
-//            throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 构建的条件为空",
-//                    loginUser.getId(), tableName, tableAlias.getName()));
-            return EXPRESSION_NULL;
-        }
-        if (deptExpression == null) {
-            return userExpression;
-        }
-        if (userExpression == null) {
-            return deptExpression;
-        }
-        // 目前,如果有指定部门 + 可查看自己,采用 OR 条件。即,WHERE (dept_id IN ? OR user_id = ?)
-        return new Parenthesis(new OrExpression(deptExpression, userExpression));
-    }
-
-    private Expression buildDeptExpression(String tableName, Alias tableAlias, Set<Long> deptIds) {
-        // 如果不存在配置,则无需作为条件
-        String columnName = deptColumns.get(tableName);
-        if (StrUtil.isEmpty(columnName)) {
-            return null;
-        }
-        // 如果为空,则无条件
-        if (CollUtil.isEmpty(deptIds)) {
-            return null;
-        }
-        // 拼接条件
-        return new InExpression(MyBatisUtils.buildColumn(tableName, tableAlias, columnName),
-                new ExpressionList(CollectionUtils.convertList(deptIds, LongValue::new)));
-    }
-
-    private Expression buildUserExpression(String tableName, Alias tableAlias, Boolean self, Long userId) {
-        // 如果不查看自己,则无需作为条件
-        if (Boolean.FALSE.equals(self)) {
-            return null;
-        }
-        String columnName = userColumns.get(tableName);
-        if (StrUtil.isEmpty(columnName)) {
-            return null;
-        }
-        // 拼接条件
-        return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), new LongValue(userId));
-    }
-
-    // ==================== 添加配置 ====================
-
-    public void addDeptColumn(Class<? extends BaseDO> entityClass) {
-        addDeptColumn(entityClass, DEPT_COLUMN_NAME);
-    }
-
-    public void addDeptColumn(Class<? extends BaseDO> entityClass, String columnName) {
-        String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName();
-       addDeptColumn(tableName, columnName);
-    }
-
-    public void addDeptColumn(String tableName, String columnName) {
-        deptColumns.put(tableName, columnName);
-        TABLE_NAMES.add(tableName);
-    }
-
-    public void addUserColumn(Class<? extends BaseDO> entityClass) {
-        addUserColumn(entityClass, USER_COLUMN_NAME);
-    }
-
-    public void addUserColumn(Class<? extends BaseDO> entityClass, String columnName) {
-        String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName();
-        addUserColumn(tableName, columnName);
-    }
-
-    public void addUserColumn(String tableName, String columnName) {
-        userColumns.put(tableName, columnName);
-        TABLE_NAMES.add(tableName);
-    }
-
-}

+ 0 - 20
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java

@@ -1,20 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.rule.dept;
-
-/**
- * {@link DeptDataPermissionRule} 的自定义配置接口
- *
- * @author yshop
- */
-@FunctionalInterface
-public interface DeptDataPermissionRuleCustomizer {
-
-    /**
-     * 自定义该权限规则
-     * 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则
-     * 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则
-     *
-     * @param rule 权限规则
-     */
-    void customize(DeptDataPermissionRule rule);
-
-}

+ 0 - 6
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/rule/dept/package-info.java

@@ -1,6 +0,0 @@
-/**
- * 基于部门的数据权限规则
- *
- * @author yshop
- */
-package co.yixiang.yshop.framework.datapermission.core.rule.dept;

+ 0 - 63
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/util/DataPermissionUtils.java

@@ -1,63 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.util;
-
-import co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission;
-import co.yixiang.yshop.framework.datapermission.core.aop.DataPermissionContextHolder;
-import lombok.SneakyThrows;
-
-import java.util.concurrent.Callable;
-
-/**
- * 数据权限 Util
- *
- * @author yshop
- */
-public class DataPermissionUtils {
-
-    private static DataPermission DATA_PERMISSION_DISABLE;
-
-    @DataPermission(enable = false)
-    @SneakyThrows
-    private static DataPermission getDisableDataPermissionDisable() {
-        if (DATA_PERMISSION_DISABLE == null) {
-            DATA_PERMISSION_DISABLE = DataPermissionUtils.class
-                    .getDeclaredMethod("getDisableDataPermissionDisable")
-                    .getAnnotation(DataPermission.class);
-        }
-        return DATA_PERMISSION_DISABLE;
-    }
-
-    /**
-     * 忽略数据权限,执行对应的逻辑
-     *
-     * @param runnable 逻辑
-     */
-    public static void executeIgnore(Runnable runnable) {
-        DataPermission dataPermission = getDisableDataPermissionDisable();
-        DataPermissionContextHolder.add(dataPermission);
-        try {
-            // 执行 runnable
-            runnable.run();
-        } finally {
-            DataPermissionContextHolder.remove();
-        }
-    }
-
-    /**
-     * 忽略数据权限,执行对应的逻辑
-     *
-     * @param callable 逻辑
-     * @return 执行结果
-     */
-    @SneakyThrows
-    public static <T> T executeIgnore(Callable<T> callable) {
-        DataPermission dataPermission = getDisableDataPermissionDisable();
-        DataPermissionContextHolder.add(dataPermission);
-        try {
-            // 执行 callable
-            return callable.call();
-        } finally {
-            DataPermissionContextHolder.remove();
-        }
-    }
-
-}

+ 0 - 2
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1,2 +0,0 @@
-co.yixiang.yshop.framework.datapermission.config.YshopDataPermissionAutoConfiguration
-co.yixiang.yshop.framework.datapermission.config.YshopDeptDataPermissionAutoConfiguration

+ 0 - 108
yshop/yshop-drink/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/test/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java

@@ -1,108 +0,0 @@
-package co.yixiang.yshop.framework.datapermission.core.aop;
-
-import cn.hutool.core.collection.CollUtil;
-import co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission;
-import co.yixiang.yshop.framework.test.core.ut.BaseMockitoUnitTest;
-import org.aopalliance.intercept.MethodInvocation;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-
-import java.lang.reflect.Method;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link DataPermissionAnnotationInterceptor} 的单元测试
- *
- * @author yshop
- */
-public class DataPermissionAnnotationInterceptorTest extends BaseMockitoUnitTest {
-
-    @InjectMocks
-    private DataPermissionAnnotationInterceptor interceptor;
-
-    @Mock
-    private MethodInvocation methodInvocation;
-
-    @BeforeEach
-    public void setUp() {
-        interceptor.getDataPermissionCache().clear();
-    }
-
-    @Test // 无 @DataPermission 注解
-    public void testInvoke_none() throws Throwable {
-        // 参数
-        mockMethodInvocation(TestNone.class);
-
-        // 调用
-        Object result = interceptor.invoke(methodInvocation);
-        // 断言
-        assertEquals("none", result);
-        assertEquals(1, interceptor.getDataPermissionCache().size());
-        assertTrue(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
-    }
-
-    @Test // 在 Method 上有 @DataPermission 注解
-    public void testInvoke_method() throws Throwable {
-        // 参数
-        mockMethodInvocation(TestMethod.class);
-
-        // 调用
-        Object result = interceptor.invoke(methodInvocation);
-        // 断言
-        assertEquals("method", result);
-        assertEquals(1, interceptor.getDataPermissionCache().size());
-        assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
-    }
-
-    @Test // 在 Class 上有 @DataPermission 注解
-    public void testInvoke_class() throws Throwable {
-        // 参数
-        mockMethodInvocation(TestClass.class);
-
-        // 调用
-        Object result = interceptor.invoke(methodInvocation);
-        // 断言
-        assertEquals("class", result);
-        assertEquals(1, interceptor.getDataPermissionCache().size());
-        assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
-    }
-
-    private void mockMethodInvocation(Class<?> clazz) throws Throwable {
-        Object targetObject = clazz.newInstance();
-        Method method = targetObject.getClass().getMethod("echo");
-        when(methodInvocation.getThis()).thenReturn(targetObject);
-        when(methodInvocation.getMethod()).thenReturn(method);
-        when(methodInvocation.proceed()).then(invocationOnMock -> method.invoke(targetObject));
-    }
-
-    static class TestMethod {
-
-        @DataPermission(enable = false)
-        public String echo() {
-            return "method";
-        }
-
-    }
-
-    @DataPermission(enable = false)
-    static class TestClass {
-
-        public String echo() {
-            return "class";
-        }
-
-    }
-
-    static class TestNone {
-
-        public String echo() {
-            return "none";
-        }
-
-    }
-
-}

Неке датотеке нису приказане због велике количине промена