springbootAI 2.2.3__tar.gz → 2.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. {springbootai-2.2.3 → springbootai-2.2.5}/CHANGELOG.md +31 -2
  2. {springbootai-2.2.3/springbootAI.egg-info → springbootai-2.2.5}/PKG-INFO +17 -4
  3. {springbootai-2.2.3 → springbootai-2.2.5}/README.md +16 -3
  4. {springbootai-2.2.3 → springbootai-2.2.5}/pyproject.toml +1 -1
  5. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/__init__.py +2 -0
  6. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/ddl_auto.py +7 -7
  7. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/annotations/__init__.py +2 -1
  8. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/annotations/annotations.py +61 -0
  9. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/mapper/mapper.py +67 -0
  10. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/version.py +1 -1
  11. springbootai-2.2.5/spring/web/actuator.py +786 -0
  12. {springbootai-2.2.3 → springbootai-2.2.5/springbootAI.egg-info}/PKG-INFO +17 -4
  13. {springbootai-2.2.3 → springbootai-2.2.5}/springbootAI.egg-info/SOURCES.txt +2 -0
  14. springbootai-2.2.5/tests/test_actuator_prometheus_admin.py +115 -0
  15. springbootai-2.2.5/tests/test_select_page.py +93 -0
  16. springbootai-2.2.3/spring/web/actuator.py +0 -418
  17. {springbootai-2.2.3 → springbootai-2.2.5}/LICENSE +0 -0
  18. {springbootai-2.2.3 → springbootai-2.2.5}/MANIFEST.in +0 -0
  19. {springbootai-2.2.3 → springbootai-2.2.5}/SECURITY.md +0 -0
  20. {springbootai-2.2.3 → springbootai-2.2.5}/requirements-ai.txt +0 -0
  21. {springbootai-2.2.3 → springbootai-2.2.5}/requirements-langgraph.txt +0 -0
  22. {springbootai-2.2.3 → springbootai-2.2.5}/requirements-mcp.txt +0 -0
  23. {springbootai-2.2.3 → springbootai-2.2.5}/requirements.txt +0 -0
  24. {springbootai-2.2.3 → springbootai-2.2.5}/setup.cfg +0 -0
  25. {springbootai-2.2.3 → springbootai-2.2.5}/setup.py +0 -0
  26. {springbootai-2.2.3 → springbootai-2.2.5}/spring/__init__.py +0 -0
  27. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/__init__.py +0 -0
  28. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/advisors.py +0 -0
  29. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/annotations.py +0 -0
  30. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/autoconfig.py +0 -0
  31. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/core.py +0 -0
  32. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/etl.py +0 -0
  33. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/memory.py +0 -0
  34. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/observability.py +0 -0
  35. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/providers.py +0 -0
  36. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/resilience.py +0 -0
  37. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/tools.py +0 -0
  38. {springbootai-2.2.3 → springbootai-2.2.5}/spring/ai/vectorstore.py +0 -0
  39. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/__init__.py +0 -0
  40. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/cache.py +0 -0
  41. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/cloud.py +0 -0
  42. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/conditional.py +0 -0
  43. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/core.py +0 -0
  44. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/langchain.py +0 -0
  45. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/langgraph.py +0 -0
  46. {springbootai-2.2.3 → springbootai-2.2.5}/spring/annotations/messaging.py +0 -0
  47. {springbootai-2.2.3 → springbootai-2.2.5}/spring/aop/__init__.py +0 -0
  48. {springbootai-2.2.3 → springbootai-2.2.5}/spring/aop/aspect.py +0 -0
  49. {springbootai-2.2.3 → springbootai-2.2.5}/spring/aop/cloud_aop.py +0 -0
  50. {springbootai-2.2.3 → springbootai-2.2.5}/spring/aop/comprehensive_aop.py +0 -0
  51. {springbootai-2.2.3 → springbootai-2.2.5}/spring/aop/method_interceptor.py +0 -0
  52. {springbootai-2.2.3 → springbootai-2.2.5}/spring/aop/proxy_factory.py +0 -0
  53. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/__init__.py +0 -0
  54. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/discovery.py +0 -0
  55. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/feign.py +0 -0
  56. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/gateway.py +0 -0
  57. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/load_balancer.py +0 -0
  58. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/seata.py +0 -0
  59. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/seata_bridge.py +0 -0
  60. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/sentinel.py +0 -0
  61. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/tracer.py +0 -0
  62. {springbootai-2.2.3 → springbootai-2.2.5}/spring/cloud/transaction_store.py +0 -0
  63. {springbootai-2.2.3 → springbootai-2.2.5}/spring/config/__init__.py +0 -0
  64. {springbootai-2.2.3 → springbootai-2.2.5}/spring/config/binding.py +0 -0
  65. {springbootai-2.2.3 → springbootai-2.2.5}/spring/config/config_loader.py +0 -0
  66. {springbootai-2.2.3 → springbootai-2.2.5}/spring/context/__init__.py +0 -0
  67. {springbootai-2.2.3 → springbootai-2.2.5}/spring/context/application_context.py +0 -0
  68. {springbootai-2.2.3 → springbootai-2.2.5}/spring/context/bean_definition.py +0 -0
  69. {springbootai-2.2.3 → springbootai-2.2.5}/spring/context/bean_factory.py +0 -0
  70. {springbootai-2.2.3 → springbootai-2.2.5}/spring/context/registry.py +0 -0
  71. {springbootai-2.2.3 → springbootai-2.2.5}/spring/context/scanner.py +0 -0
  72. {springbootai-2.2.3 → springbootai-2.2.5}/spring/core/__init__.py +0 -0
  73. {springbootai-2.2.3 → springbootai-2.2.5}/spring/core/graceful_shutdown.py +0 -0
  74. {springbootai-2.2.3 → springbootai-2.2.5}/spring/core/typing_utils.py +0 -0
  75. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/__init__.py +0 -0
  76. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/annotations.py +0 -0
  77. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/converters.py +0 -0
  78. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/easy_csv.py +0 -0
  79. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/exceptions.py +0 -0
  80. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/reader.py +0 -0
  81. {springbootai-2.2.3 → springbootai-2.2.5}/spring/csv/writer.py +0 -0
  82. {springbootai-2.2.3 → springbootai-2.2.5}/spring/data/__init__.py +0 -0
  83. {springbootai-2.2.3 → springbootai-2.2.5}/spring/data/page.py +0 -0
  84. {springbootai-2.2.3 → springbootai-2.2.5}/spring/data/repository.py +0 -0
  85. {springbootai-2.2.3 → springbootai-2.2.5}/spring/data/specification.py +0 -0
  86. {springbootai-2.2.3 → springbootai-2.2.5}/spring/datasource/__init__.py +0 -0
  87. {springbootai-2.2.3 → springbootai-2.2.5}/spring/datasource/annotations.py +0 -0
  88. {springbootai-2.2.3 → springbootai-2.2.5}/spring/datasource/context.py +0 -0
  89. {springbootai-2.2.3 → springbootai-2.2.5}/spring/datasource/dynamic.py +0 -0
  90. {springbootai-2.2.3 → springbootai-2.2.5}/spring/event/__init__.py +0 -0
  91. {springbootai-2.2.3 → springbootai-2.2.5}/spring/event/publisher.py +0 -0
  92. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/__init__.py +0 -0
  93. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/annotations.py +0 -0
  94. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/converters.py +0 -0
  95. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/easy_excel.py +0 -0
  96. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/exceptions.py +0 -0
  97. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/reader.py +0 -0
  98. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/style.py +0 -0
  99. {springbootai-2.2.3 → springbootai-2.2.5}/spring/excel/writer.py +0 -0
  100. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/__init__.py +0 -0
  101. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/accessor.py +0 -0
  102. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/auto_config.py +0 -0
  103. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/holder.py +0 -0
  104. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/locale.py +0 -0
  105. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/locale_resolver.py +0 -0
  106. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/message_source.py +0 -0
  107. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/middleware.py +0 -0
  108. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/properties.py +0 -0
  109. {springbootai-2.2.3 → springbootai-2.2.5}/spring/i18n/sources.py +0 -0
  110. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/__init__.py +0 -0
  111. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/adapters.py +0 -0
  112. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/agents/__init__.py +0 -0
  113. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/agents/services.py +0 -0
  114. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/annotations.py +0 -0
  115. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/autoconfig.py +0 -0
  116. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/callbacks/__init__.py +0 -0
  117. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/callbacks/handlers.py +0 -0
  118. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/chains/__init__.py +0 -0
  119. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/chains/services.py +0 -0
  120. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/core.py +0 -0
  121. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/indexes/__init__.py +0 -0
  122. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/indexes/index.py +0 -0
  123. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/loaders/__init__.py +0 -0
  124. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/loaders/loaders.py +0 -0
  125. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/memory/__init__.py +0 -0
  126. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/memory/memory.py +0 -0
  127. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/parsers/__init__.py +0 -0
  128. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/parsers/parsers.py +0 -0
  129. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/partners.py +0 -0
  130. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/prompts/__init__.py +0 -0
  131. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/prompts/templates.py +0 -0
  132. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/retrievers/__init__.py +0 -0
  133. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/retrievers/retrievers.py +0 -0
  134. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/tools/__init__.py +0 -0
  135. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/tools/tools.py +0 -0
  136. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/utilities/__init__.py +0 -0
  137. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/utilities/utils.py +0 -0
  138. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/vectorstores/__init__.py +0 -0
  139. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langchain/vectorstores/stores.py +0 -0
  140. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/__init__.py +0 -0
  141. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/annotation_runtime.py +0 -0
  142. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/annotations.py +0 -0
  143. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/autoconfig.py +0 -0
  144. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/checkpoint.py +0 -0
  145. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/config.py +0 -0
  146. {springbootai-2.2.3 → springbootai-2.2.5}/spring/langgraph/runtime.py +0 -0
  147. {springbootai-2.2.3 → springbootai-2.2.5}/spring/logging/__init__.py +0 -0
  148. {springbootai-2.2.3 → springbootai-2.2.5}/spring/logging/loguru_logger.py +0 -0
  149. {springbootai-2.2.3 → springbootai-2.2.5}/spring/main.py +0 -0
  150. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/__init__.py +0 -0
  151. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/annotation_runtime.py +0 -0
  152. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/annotations.py +0 -0
  153. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/autoconfig.py +0 -0
  154. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/client.py +0 -0
  155. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/config.py +0 -0
  156. {springbootai-2.2.3 → springbootai-2.2.5}/spring/mcp/server.py +0 -0
  157. {springbootai-2.2.3 → springbootai-2.2.5}/spring/messaging/__init__.py +0 -0
  158. {springbootai-2.2.3 → springbootai-2.2.5}/spring/messaging/rabbitmq.py +0 -0
  159. {springbootai-2.2.3 → springbootai-2.2.5}/spring/monitoring/__init__.py +0 -0
  160. {springbootai-2.2.3 → springbootai-2.2.5}/spring/monitoring/prometheus.py +0 -0
  161. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/database.py +0 -0
  162. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/migration.py +0 -0
  163. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/mybatis_integration.py +0 -0
  164. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/__init__.py +0 -0
  165. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/cache/__init__.py +0 -0
  166. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/cache/cache.py +0 -0
  167. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
  168. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
  169. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
  170. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/configuration.py +0 -0
  171. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/core/__init__.py +0 -0
  172. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/core/sql_session.py +0 -0
  173. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
  174. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/dialect/__init__.py +0 -0
  175. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/dialect/dialect.py +0 -0
  176. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
  177. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
  178. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
  179. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
  180. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/mapper/__init__.py +0 -0
  181. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/metrics/__init__.py +0 -0
  182. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/metrics/metrics.py +0 -0
  183. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/pool/__init__.py +0 -0
  184. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
  185. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/security/__init__.py +0 -0
  186. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/security/access_control.py +0 -0
  187. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/security/password_encoder.py +0 -0
  188. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
  189. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
  190. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/transaction/__init__.py +0 -0
  191. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/transaction/transaction.py +0 -0
  192. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
  193. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
  194. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
  195. {springbootai-2.2.3 → springbootai-2.2.5}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
  196. {springbootai-2.2.3 → springbootai-2.2.5}/spring/retry/__init__.py +0 -0
  197. {springbootai-2.2.3 → springbootai-2.2.5}/spring/retry/recovery.py +0 -0
  198. {springbootai-2.2.3 → springbootai-2.2.5}/spring/retry/retry_annotations.py +0 -0
  199. {springbootai-2.2.3 → springbootai-2.2.5}/spring/retry/retry_decorator.py +0 -0
  200. {springbootai-2.2.3 → springbootai-2.2.5}/spring/scheduling/__init__.py +0 -0
  201. {springbootai-2.2.3 → springbootai-2.2.5}/spring/scheduling/scheduler.py +0 -0
  202. {springbootai-2.2.3 → springbootai-2.2.5}/spring/security/__init__.py +0 -0
  203. {springbootai-2.2.3 → springbootai-2.2.5}/spring/security/jwt_utils.py +0 -0
  204. {springbootai-2.2.3 → springbootai-2.2.5}/spring/security/replay_protection.py +0 -0
  205. {springbootai-2.2.3 → springbootai-2.2.5}/spring/security/secret_manager.py +0 -0
  206. {springbootai-2.2.3 → springbootai-2.2.5}/spring/security/security_aop.py +0 -0
  207. {springbootai-2.2.3 → springbootai-2.2.5}/spring/security/security_context.py +0 -0
  208. {springbootai-2.2.3 → springbootai-2.2.5}/spring/test/__init__.py +0 -0
  209. {springbootai-2.2.3 → springbootai-2.2.5}/spring/test/slicing.py +0 -0
  210. {springbootai-2.2.3 → springbootai-2.2.5}/spring/tracing/__init__.py +0 -0
  211. {springbootai-2.2.3 → springbootai-2.2.5}/spring/tracing/skywalking.py +0 -0
  212. {springbootai-2.2.3 → springbootai-2.2.5}/spring/tx/__init__.py +0 -0
  213. {springbootai-2.2.3 → springbootai-2.2.5}/spring/tx/events.py +0 -0
  214. {springbootai-2.2.3 → springbootai-2.2.5}/spring/tx/synchronization.py +0 -0
  215. {springbootai-2.2.3 → springbootai-2.2.5}/spring/utils/__init__.py +0 -0
  216. {springbootai-2.2.3 → springbootai-2.2.5}/spring/utils/banner.py +0 -0
  217. {springbootai-2.2.3 → springbootai-2.2.5}/spring/utils/bean_utils.py +0 -0
  218. {springbootai-2.2.3 → springbootai-2.2.5}/spring/utils/logger.py +0 -0
  219. {springbootai-2.2.3 → springbootai-2.2.5}/spring/utils/redis_client.py +0 -0
  220. {springbootai-2.2.3 → springbootai-2.2.5}/spring/validation/__init__.py +0 -0
  221. {springbootai-2.2.3 → springbootai-2.2.5}/spring/validation/aop.py +0 -0
  222. {springbootai-2.2.3 → springbootai-2.2.5}/spring/validation/constraints.py +0 -0
  223. {springbootai-2.2.3 → springbootai-2.2.5}/spring/validation/exceptions.py +0 -0
  224. {springbootai-2.2.3 → springbootai-2.2.5}/spring/validation/validator.py +0 -0
  225. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/__init__.py +0 -0
  226. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/exception_handler.py +0 -0
  227. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/health.py +0 -0
  228. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/interceptor.py +0 -0
  229. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/result.py +0 -0
  230. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/swagger.py +0 -0
  231. {springbootai-2.2.3 → springbootai-2.2.5}/spring/web/web_context.py +0 -0
  232. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/__init__.py +0 -0
  233. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/annotations.py +0 -0
  234. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/broker.py +0 -0
  235. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/exceptions.py +0 -0
  236. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/handler.py +0 -0
  237. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/router.py +0 -0
  238. {springbootai-2.2.3 → springbootai-2.2.5}/spring/websocket/session.py +0 -0
  239. {springbootai-2.2.3 → springbootai-2.2.5}/springbootAI.egg-info/dependency_links.txt +0 -0
  240. {springbootai-2.2.3 → springbootai-2.2.5}/springbootAI.egg-info/entry_points.txt +0 -0
  241. {springbootai-2.2.3 → springbootai-2.2.5}/springbootAI.egg-info/requires.txt +0 -0
  242. {springbootai-2.2.3 → springbootai-2.2.5}/springbootAI.egg-info/top_level.txt +0 -0
  243. {springbootai-2.2.3 → springbootai-2.2.5}/sql/seata_undo_log.sql +0 -0
  244. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_actuator.py +0 -0
  245. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_ai_comprehensive.py +0 -0
  246. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_ai_declarative_annotations.py +0 -0
  247. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_ai_module.py +0 -0
  248. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_annotation_combinations.py +0 -0
  249. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_annotations_contract.py +0 -0
  250. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_aop_annotations_full.py +0 -0
  251. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_audit_time.py +0 -0
  252. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_bean_utils.py +0 -0
  253. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_cache_annotations.py +0 -0
  254. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_cloud_embedded_full.py +0 -0
  255. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_component_init_error.py +0 -0
  256. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_conditional_annotations.py +0 -0
  257. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_config_binding.py +0 -0
  258. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_config_fixes_185.py +0 -0
  259. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_connection_resilience.py +0 -0
  260. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_core_annotations_full.py +0 -0
  261. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_csv_module.py +0 -0
  262. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_data_repository.py +0 -0
  263. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_datasource_routing.py +0 -0
  264. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_ddl_auto.py +0 -0
  265. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
  266. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_di_config_event_full.py +0 -0
  267. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_excel_module.py +0 -0
  268. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_i18n_module.py +0 -0
  269. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_jpa_version_transient.py +0 -0
  270. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_langchain_comprehensive.py +0 -0
  271. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_langchain_ext.py +0 -0
  272. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_langchain_module.py +0 -0
  273. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_langgraph_comprehensive.py +0 -0
  274. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_langgraph_module.py +0 -0
  275. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_logging_config.py +0 -0
  276. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_mcp_module.py +0 -0
  277. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_new_features.py +0 -0
  278. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_orm_pymybatis_full.py +0 -0
  279. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_production_readiness.py +0 -0
  280. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_pymybatis_contract.py +0 -0
  281. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_seata_bridge.py +0 -0
  282. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_seata_durable_store.py +0 -0
  283. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_security.py +0 -0
  284. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_security_full.py +0 -0
  285. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_security_hardening.py +0 -0
  286. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_swagger_module.py +0 -0
  287. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_test_slicing.py +0 -0
  288. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_transactional_events.py +0 -0
  289. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_validation_module.py +0 -0
  290. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_web_annotations_full.py +0 -0
  291. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_web_root_mapping.py +0 -0
  292. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_web_static_files.py +0 -0
  293. {springbootai-2.2.3 → springbootai-2.2.5}/tests/test_websocket_module.py +0 -0
@@ -1,12 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.2.5] - 2026-08-14
4
+
5
+ ### 新增
6
+
7
+ - **Spring Boot Admin 风格可视化面板**:访问 `/actuator/admin` 即可在浏览器查看整合后的 HTML 仪表盘,包含健康状态、系统信息、内存 & CPU、线程概览、日志级别管理(点击切换)、Prometheus 指标(原始数据 + 摘要表格)、Bean 列表七大区块。每 30 秒自动刷新,无需独立部署 Admin Server。
8
+ - **Prometheus 指标暴露端点** `/actuator/prometheus`:以 Prometheus 文本格式(`text/plain; version=0.0.4`)暴露应用指标,供 Prometheus Server 抓取。支持多 worker 部署(`PROMETHEUS_MULTIPROC_DIR`),未安装 `prometheus_client` 时返回 503。
9
+ - **进程系统指标端点** `/actuator/sysmetrics`:通过 `psutil` 采集进程级 RSS、虚拟内存、CPU 使用率、线程数、文件描述符数。
10
+ - **ORM 分页查询注解 `@SelectPage`**:自动提取 `page_num`/`page_size` 参数并返回 `{total, page_num, page_size, data}` 结构,支持 `pageNum`/`page`/`pageSize`/`size` 等参数名变体,可自定义 COUNT 语句。
11
+
12
+ ### 文档
13
+
14
+ - `doc/ACTUATOR_MODULE.md` 新增第四章(Spring Boot Admin 可视化面板)、第五章(Prometheus + Grafana 工业级监控,含三步接入流程与多 worker 注意事项)、第六章(自定义业务指标)。
15
+ - `doc/ORM_MODULE.md` 第五章新增"方法 1:@SelectPage 注解(推荐)"小节。
16
+ - `README.md` 4.8 健康检查表新增 `/actuator/admin`、`/actuator/prometheus`、`/actuator/sysmetrics` 三个端点。
17
+ - `doc/EIGHT_MODULES.md` Actuator 模块说明补充"Spring Boot Admin 可视化 + Prometheus 指标"。
18
+
19
+ ### 测试
20
+
21
+ - 新增 `tests/test_actuator_prometheus_admin.py`(9 项测试全部通过):覆盖 Prometheus 端点格式、Admin 面板 HTML、sysmetrics 端点、端点目录。
22
+ - 新增 `tests/test_select_page.py`:覆盖 `@SelectPage` 分页注解。
23
+
24
+ ## [2.2.4] - 2026-08-13
25
+
26
+ ### 完善
27
+
28
+ - 自动推断逻辑调整:无赋值的字段仅创建 `Column()` 记录类型,不设默认值;只有显式赋值才作为 `default`。
29
+ - `_parse_entity` 跳过以 `_` 开头的私有字段,不生成 DDL 列。
30
+ - 新增 `example_all/models/EntityModels.py` 实体示例和 `test_06_entity_jpa_style` 测试(4 项全通过)。
31
+
3
32
  ## [2.2.3] - 2026-08-13
4
33
 
5
34
  ### 新增
6
35
 
7
36
  - ORM 实体字段自动推断:类型注解无需显式 `= Column(...)` 赋值,对齐 Java JPA 字段自动映射。
8
- - `name: str` → 自动创建 `Column(default=None)`
9
- - `name: str = ""` → 自动创建 `Column(default="")`
37
+ - `name: str` → 自动创建 `Column()`(无默认值,仅记录类型)
38
+ - `name: str = ""` → 自动创建 `Column(default="")`(赋值即为默认值)
10
39
  - `name: int = 0` → 自动创建 `Column(default=0)`
11
40
  - 已有 `Column()`/`Id()`/`CreateTime()` 等描述符的字段保留不覆盖
12
41
  - 以 `_` 开头的私有字段自动跳过
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 2.2.3
3
+ Version: 2.2.5
4
4
  Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
@@ -252,13 +252,21 @@ curl http://127.0.0.1:8080/api/hello/Alice
252
252
  | 📦 LangGraph | [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md) | `pip install springbootAI[langgraph]` | 状态图 / 条件路由 / 人工中断 / 注解式工作流 |
253
253
  | 📦 MCP | [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md) | `pip install springbootAI[mcp]` | MCP Client / Server / Tool / Resource / Prompt / 注解调用 |
254
254
  | ✅ 内嵌 PyMyBatis ORM | [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
255
+ | ✅ JPA 实体与仓库 | [JPA_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/JPA_MODULE.md) | 随核心包 | `@Entity` + `@Table` / 字段自动推断 / `@CreateTime` / Repository / DataJpaTest |
255
256
  | ✅ Cloud 微服务 | [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
256
257
  | 📦 Excel 读写 | [EXCEL_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
257
258
  | 📦 CSV 读写 | [CSV_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CSV_MODULE.md) | `pip install springbootAI[csv]` | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
258
259
  | ✅ Swagger 文档 | [SWAGGER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
259
- | ✅ 八大模块 | [EIGHT_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EIGHT_MODULES.md) | 随核心包 | 分页 / Actuator / 多数据源 / i18n / WebSocket 等 |
260
260
  | ✅ 安全 | [SECURITY.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SECURITY.md) | 随核心包 | JWT 生成校验 / 密码加密 / SQL 注入防护 / 访问控制 |
261
261
  | ✅ BeanUtils | [BEAN_UTILS.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEAN_UTILS.md) | 随核心包 | `copy_properties` / `clone` 属性复制工具 |
262
+ | ✅ ① Repository | [REPOSITORY_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/REPOSITORY_MODULE.md) | 随核心包 | 不用手写SQL的分页查询 |
263
+ | ✅ ② Actuator | [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) | 随核心包 | 系统健康检查面板 |
264
+ | ✅ ③ 多数据源 | [DATASOURCE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/DATASOURCE_MODULE.md) | 随核心包 | 读写分离 |
265
+ | ✅ ④ 事务事件 | [TX_EVENT_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TX_EVENT_MODULE.md) | 随核心包 | 操作完成后自动发通知 |
266
+ | ✅ ⑤ 配置绑定 | [CONFIG_BINDING_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CONFIG_BINDING_MODULE.md) | 随核心包 | 把YAML配置自动变成Python对象 |
267
+ | ✅ ⑥ 测试切片 | [TEST_SLICE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_SLICE_MODULE.md) | 随核心包 | 只测试你关心的部分 |
268
+ | ✅ ⑦ i18n | [I18N_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/I18N_MODULE.md) | 随核心包 | 中英文自动切换 |
269
+ | ✅ ⑧ WebSocket | [WEBSOCKET_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEBSOCKET_MODULE.md) | 随核心包 | 像微信一样实时通信 |
262
270
  | — AI 与 LangChain 测试 | [AI_LANGCHAIN_TEST_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | AI 与 LangChain 测试说明 |
263
271
  | — 测试报告 | [TEST_REPORT.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_REPORT.md) | — | 全量测试用例与覆盖范围 |
264
272
 
@@ -474,7 +482,7 @@ python -c "from spring.orm.pymybatis import __version__; print(__version__)"
474
482
 
475
483
  ### 3.5 最小应用
476
484
 
477
- 仓库中的 `example`、`example1`、`example5` 只用于源码参考和回归验证,不会打包进 `springbootAI`。安装后请按下面结构创建自己的应用包。**每个被扫描目录都必须包含 `__init__.py`,并从项目根目录启动。**
485
+ 仓库中的 `example_all`、`example_langchain`、`example_langgraph`、`example_mcp`、`test_cloud_app` 只用于源码参考和回归验证,不会打包进 `springbootAI`。安装后请按下面结构创建自己的应用包。**每个被扫描目录都必须包含 `__init__.py`,并从项目根目录启动。**
478
486
 
479
487
  创建包结构:
480
488
 
@@ -681,9 +689,14 @@ Profile 用于 Bean 过滤和生产安全校验。多环境配置可使用以下
681
689
  | `/actuator/health/liveness` | 进程存活检查(用于 K8s livenessProbe) |
682
690
  | `/actuator/health/readiness` | 服务就绪检查(用于 K8s readinessProbe) |
683
691
  | `/actuator/info` | 应用名称、当前 Profile、框架和 Python 版本 |
692
+ | `/actuator/admin` | **Spring Boot Admin 风格可视化面板**(浏览器打开即用,每 30 秒自动刷新) |
693
+ | `/actuator/prometheus` | **Prometheus 文本格式指标**(供 Prometheus Server 抓取) |
694
+ | `/actuator/sysmetrics` | **进程级系统指标**(RSS/CPU/线程/FD,供 Admin 面板 JS 调用) |
684
695
 
685
696
  `database.enabled: false` 时数据库状态为 `DISABLED`,不会创建 `test.db`。
686
697
 
698
+ > 详见 [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) 第四章(Spring Boot Admin 面板)与第五章(Prometheus + Grafana 工业级监控)。
699
+
687
700
  > **⚠️ 新手常见错误**:
688
701
  > - ❌ 错误:"我改了 YAML,重新请求接口怎么没生效?"
689
702
  > - ✅ 正解:修改 YAML 后需要**重启应用**(`Ctrl+C` 停掉再重新运行)。YAML 配置是启动时一次性读取的。
@@ -1647,7 +1660,7 @@ curl http://localhost:8080/actuator/health
1647
1660
 
1648
1661
  ## 15. 项目结构
1649
1662
 
1650
- `example`、`example1`、`example5`、`example_langchain` 是仓库级示例,不属于 `springbootAI` 安装包。实际项目应创建自己的应用包。
1663
+ `example_all`、`example_langchain`、`example_langgraph`、`example_mcp`、`test_cloud_app` 是仓库级示例,不属于 `springbootAI` 安装包。实际项目应创建自己的应用包。
1651
1664
 
1652
1665
  推荐目录结构:
1653
1666
 
@@ -118,13 +118,21 @@ curl http://127.0.0.1:8080/api/hello/Alice
118
118
  | 📦 LangGraph | [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md) | `pip install springbootAI[langgraph]` | 状态图 / 条件路由 / 人工中断 / 注解式工作流 |
119
119
  | 📦 MCP | [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md) | `pip install springbootAI[mcp]` | MCP Client / Server / Tool / Resource / Prompt / 注解调用 |
120
120
  | ✅ 内嵌 PyMyBatis ORM | [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
121
+ | ✅ JPA 实体与仓库 | [JPA_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/JPA_MODULE.md) | 随核心包 | `@Entity` + `@Table` / 字段自动推断 / `@CreateTime` / Repository / DataJpaTest |
121
122
  | ✅ Cloud 微服务 | [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
122
123
  | 📦 Excel 读写 | [EXCEL_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
123
124
  | 📦 CSV 读写 | [CSV_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CSV_MODULE.md) | `pip install springbootAI[csv]` | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
124
125
  | ✅ Swagger 文档 | [SWAGGER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
125
- | ✅ 八大模块 | [EIGHT_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EIGHT_MODULES.md) | 随核心包 | 分页 / Actuator / 多数据源 / i18n / WebSocket 等 |
126
126
  | ✅ 安全 | [SECURITY.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SECURITY.md) | 随核心包 | JWT 生成校验 / 密码加密 / SQL 注入防护 / 访问控制 |
127
127
  | ✅ BeanUtils | [BEAN_UTILS.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEAN_UTILS.md) | 随核心包 | `copy_properties` / `clone` 属性复制工具 |
128
+ | ✅ ① Repository | [REPOSITORY_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/REPOSITORY_MODULE.md) | 随核心包 | 不用手写SQL的分页查询 |
129
+ | ✅ ② Actuator | [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) | 随核心包 | 系统健康检查面板 |
130
+ | ✅ ③ 多数据源 | [DATASOURCE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/DATASOURCE_MODULE.md) | 随核心包 | 读写分离 |
131
+ | ✅ ④ 事务事件 | [TX_EVENT_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TX_EVENT_MODULE.md) | 随核心包 | 操作完成后自动发通知 |
132
+ | ✅ ⑤ 配置绑定 | [CONFIG_BINDING_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CONFIG_BINDING_MODULE.md) | 随核心包 | 把YAML配置自动变成Python对象 |
133
+ | ✅ ⑥ 测试切片 | [TEST_SLICE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_SLICE_MODULE.md) | 随核心包 | 只测试你关心的部分 |
134
+ | ✅ ⑦ i18n | [I18N_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/I18N_MODULE.md) | 随核心包 | 中英文自动切换 |
135
+ | ✅ ⑧ WebSocket | [WEBSOCKET_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEBSOCKET_MODULE.md) | 随核心包 | 像微信一样实时通信 |
128
136
  | — AI 与 LangChain 测试 | [AI_LANGCHAIN_TEST_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | AI 与 LangChain 测试说明 |
129
137
  | — 测试报告 | [TEST_REPORT.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_REPORT.md) | — | 全量测试用例与覆盖范围 |
130
138
 
@@ -340,7 +348,7 @@ python -c "from spring.orm.pymybatis import __version__; print(__version__)"
340
348
 
341
349
  ### 3.5 最小应用
342
350
 
343
- 仓库中的 `example`、`example1`、`example5` 只用于源码参考和回归验证,不会打包进 `springbootAI`。安装后请按下面结构创建自己的应用包。**每个被扫描目录都必须包含 `__init__.py`,并从项目根目录启动。**
351
+ 仓库中的 `example_all`、`example_langchain`、`example_langgraph`、`example_mcp`、`test_cloud_app` 只用于源码参考和回归验证,不会打包进 `springbootAI`。安装后请按下面结构创建自己的应用包。**每个被扫描目录都必须包含 `__init__.py`,并从项目根目录启动。**
344
352
 
345
353
  创建包结构:
346
354
 
@@ -547,9 +555,14 @@ Profile 用于 Bean 过滤和生产安全校验。多环境配置可使用以下
547
555
  | `/actuator/health/liveness` | 进程存活检查(用于 K8s livenessProbe) |
548
556
  | `/actuator/health/readiness` | 服务就绪检查(用于 K8s readinessProbe) |
549
557
  | `/actuator/info` | 应用名称、当前 Profile、框架和 Python 版本 |
558
+ | `/actuator/admin` | **Spring Boot Admin 风格可视化面板**(浏览器打开即用,每 30 秒自动刷新) |
559
+ | `/actuator/prometheus` | **Prometheus 文本格式指标**(供 Prometheus Server 抓取) |
560
+ | `/actuator/sysmetrics` | **进程级系统指标**(RSS/CPU/线程/FD,供 Admin 面板 JS 调用) |
550
561
 
551
562
  `database.enabled: false` 时数据库状态为 `DISABLED`,不会创建 `test.db`。
552
563
 
564
+ > 详见 [ACTUATOR_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ACTUATOR_MODULE.md) 第四章(Spring Boot Admin 面板)与第五章(Prometheus + Grafana 工业级监控)。
565
+
553
566
  > **⚠️ 新手常见错误**:
554
567
  > - ❌ 错误:"我改了 YAML,重新请求接口怎么没生效?"
555
568
  > - ✅ 正解:修改 YAML 后需要**重启应用**(`Ctrl+C` 停掉再重新运行)。YAML 配置是启动时一次性读取的。
@@ -1513,7 +1526,7 @@ curl http://localhost:8080/actuator/health
1513
1526
 
1514
1527
  ## 15. 项目结构
1515
1528
 
1516
- `example`、`example1`、`example5`、`example_langchain` 是仓库级示例,不属于 `springbootAI` 安装包。实际项目应创建自己的应用包。
1529
+ `example_all`、`example_langchain`、`example_langgraph`、`example_mcp`、`test_cloud_app` 是仓库级示例,不属于 `springbootAI` 安装包。实际项目应创建自己的应用包。
1517
1530
 
1518
1531
  推荐目录结构:
1519
1532
 
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
12
12
  [project]
13
13
  # 发行名 springbootAI(PyPI 包名,pip install springbootAI);导入包名仍为 spring
14
14
  name = "springbootAI"
15
- version = "2.2.3"
15
+ version = "2.2.5"
16
16
  description = "Spring-style Python framework with Web, ORM, Cloud and AI integrations"
17
17
  readme = "README.md"
18
18
  license = "MIT"
@@ -46,6 +46,7 @@ from spring.orm.mybatis_integration import (
46
46
  # 导入注解
47
47
  from spring.orm.pymybatis.annotations import (
48
48
  Select,
49
+ SelectPage,
49
50
  Insert,
50
51
  Update,
51
52
  Delete,
@@ -187,6 +188,7 @@ __all__ = [
187
188
  'init_mybatis',
188
189
  # 注解
189
190
  'Select',
191
+ 'SelectPage',
190
192
  'Insert',
191
193
  'Update',
192
194
  'Delete',
@@ -1091,8 +1091,8 @@ def _auto_infer_columns(cls):
1091
1091
  无需显式 ``= Column(...)`` 赋值。
1092
1092
 
1093
1093
  推断规则:
1094
- - ``name: str`` → ``Column(default=None)``
1095
- - ``name: str = ""`` → ``Column(default="")``
1094
+ - ``name: str`` → ``Column()``(无默认值,仅记录类型)
1095
+ - ``name: str = ""`` → ``Column(default="")``(赋值即为默认值)
1096
1096
  - ``name: int = 0`` → ``Column(default=0)``
1097
1097
  - ``name: str = Column(...)`` → 保留原 Column,不覆盖
1098
1098
  - ``name: int = Id()`` → 保留原 Id,不覆盖
@@ -1130,14 +1130,14 @@ def _auto_infer_columns(cls):
1130
1130
  if isinstance(existing, Transient):
1131
1131
  continue
1132
1132
 
1133
- # 推断默认值:非 None 的类属性值作为 Column default
1134
- default_val = None
1133
+ # 只有显式赋值才给默认值;无赋值则仅创建 Column() 记录类型
1135
1134
  if existing is not None and not callable(existing) \
1136
1135
  and not isinstance(existing, (classmethod, staticmethod)):
1137
- default_val = existing
1136
+ col = Column(default=existing)
1137
+ else:
1138
+ col = Column()
1138
1139
 
1139
- # 创建 Column 描述符并挂到类上
1140
- setattr(cls, attr_name, Column(default=default_val))
1140
+ setattr(cls, attr_name, col)
1141
1141
 
1142
1142
 
1143
1143
  def _auto_generate_init(cls):
@@ -16,6 +16,7 @@ from .annotations import (
16
16
  Result,
17
17
  ResultMap,
18
18
  Select,
19
+ SelectPage,
19
20
  SelectProvider,
20
21
  Transactional,
21
22
  Update,
@@ -23,7 +24,7 @@ from .annotations import (
23
24
  )
24
25
 
25
26
  __all__ = [
26
- 'Select', 'Insert', 'Update', 'Delete',
27
+ 'Select', 'SelectPage', 'Insert', 'Update', 'Delete',
27
28
  'SelectProvider', 'InsertProvider', 'UpdateProvider', 'DeleteProvider',
28
29
  'ResultMap', 'Result',
29
30
  'Options', 'Param', 'CacheNamespace', 'DataSource', 'Transactional',
@@ -55,6 +55,67 @@ def Select(value: str, result_map: Optional[str] = None,
55
55
  return decorator
56
56
 
57
57
 
58
+ class SelectPageAnnotation:
59
+ """
60
+ 分页查询注解数据对象
61
+
62
+ 用于标注Mapper方法,自动执行分页查询(COUNT + LIMIT/OFFSET)。
63
+ 方法参数中名为 ``page_num`` 和 ``page_size`` 的参数会自动提取为分页参数,
64
+ 其余参数作为SQL绑定参数。
65
+ """
66
+
67
+ def __init__(self, value: str, count_sql: Optional[str] = None,
68
+ result_map: Optional[str] = None,
69
+ result_type: Optional[str] = None,
70
+ fetch_size: Optional[int] = None,
71
+ timeout: Optional[int] = None):
72
+ self.value = value
73
+ self.count_sql = count_sql
74
+ self.result_map = result_map
75
+ self.result_type = result_type
76
+ self.fetch_size = fetch_size
77
+ self.timeout = timeout
78
+
79
+
80
+ def SelectPage(value: str, count_sql: Optional[str] = None,
81
+ result_map: Optional[str] = None,
82
+ result_type: Optional[str] = None,
83
+ fetch_size: Optional[int] = None,
84
+ timeout: Optional[int] = None) -> Callable:
85
+ """
86
+ 分页查询注解装饰器
87
+
88
+ 用于标注Mapper接口方法,自动执行分页查询。
89
+ 框架会从方法参数中提取 ``page_num`` 和 ``page_size``(按参数名匹配),
90
+ 其余参数作为SQL绑定参数。
91
+
92
+ Args:
93
+ value: 查询SQL语句(不含LIMIT/OFFSET,框架自动追加)
94
+ count_sql: 自定义COUNT语句,为空时框架自动包裹生成
95
+ result_map: 结果映射ID
96
+ result_type: 结果类型
97
+ fetch_size: 抓取大小
98
+ timeout: 超时时间(秒)
99
+
100
+ Returns:
101
+ 装饰器函数
102
+
103
+ 用法::
104
+
105
+ @SelectPage("SELECT id, name FROM users WHERE age > #{age}")
106
+ def find_page(self, age: int, page_num: int, page_size: int):
107
+ pass
108
+
109
+ # 返回: {"total": 100, "page_num": 1, "page_size": 10, "data": [...]}
110
+ """
111
+ def decorator(func: Callable) -> Callable:
112
+ annotation = SelectPageAnnotation(value, count_sql, result_map,
113
+ result_type, fetch_size, timeout)
114
+ setattr(func, 'select_page', annotation)
115
+ return func
116
+ return decorator
117
+
118
+
58
119
  class InsertAnnotation:
59
120
  """
60
121
  INSERT插入注解数据对象
@@ -89,6 +89,7 @@ class MapperProxy:
89
89
 
90
90
  # 获取方法注解(通过装饰器附加的属性)
91
91
  select_annotation = getattr(wrapped_method, 'select', None)
92
+ select_page_annotation = getattr(wrapped_method, 'select_page', None)
92
93
  insert_annotation = getattr(wrapped_method, 'insert', None)
93
94
  update_annotation = getattr(wrapped_method, 'update', None)
94
95
  delete_annotation = getattr(wrapped_method, 'delete', None)
@@ -110,6 +111,29 @@ class MapperProxy:
110
111
  if options and options.flush_cache:
111
112
  self.sql_session.sql_cache.clear()
112
113
 
114
+ # ── 分页查询 @SelectPage ──
115
+ if select_page_annotation:
116
+ page_num, page_size, sql_params = self._extract_pagination_params(
117
+ method, params
118
+ )
119
+ result = self.sql_session.select_pagination(
120
+ select_page_annotation.value,
121
+ sql_params,
122
+ page_num=page_num,
123
+ page_size=page_size,
124
+ )
125
+ # 如果指定了 result_type,对 data 逐行转换
126
+ result_type = (
127
+ select_page_annotation.result_type
128
+ or self._result_type_from_return_annotation(method)
129
+ )
130
+ if result_type and result.get('data'):
131
+ result['data'] = [
132
+ self._apply_result_type(row, result_type)
133
+ for row in result['data']
134
+ ]
135
+ return result
136
+
113
137
  if select_annotation or select_provider:
114
138
  provider_options = select_provider.options if select_provider else {}
115
139
  select_sql = (
@@ -360,6 +384,49 @@ class MapperProxy:
360
384
  or method_name == 'find_one'
361
385
  )
362
386
 
387
+ @staticmethod
388
+ def _extract_pagination_params(method, params: Dict[str, Any]):
389
+ """
390
+ 从方法参数中提取分页参数 page_num / page_size。
391
+
392
+ 按参数名匹配(支持 Param 别名),提取后从 SQL 参数字典中移除,
393
+ 避免它们被当作 SQL 绑定参数。
394
+
395
+ Returns:
396
+ (page_num, page_size, sql_params)
397
+ """
398
+ page_num = 1
399
+ page_size = 10
400
+ sql_params = {}
401
+
402
+ try:
403
+ sig = inspect.signature(method)
404
+ except (ValueError, TypeError):
405
+ sig = None
406
+
407
+ # 构建 参数名 → Param别名 映射
408
+ param_names: Dict[str, str] = {}
409
+ if sig is not None:
410
+ for pname, p in sig.parameters.items():
411
+ if pname == 'self':
412
+ continue
413
+ alias = MapperProxy._parameter_alias(p.annotation, pname)
414
+ param_names[pname] = alias
415
+
416
+ for key, value in params.items():
417
+ if key == 'self':
418
+ continue
419
+ # 检查原始参数名和别名是否为分页参数
420
+ matched_name = param_names.get(key, key)
421
+ if matched_name in ('page_num', 'pageNum', 'page'):
422
+ page_num = int(value) if value is not None else 1
423
+ elif matched_name in ('page_size', 'pageSize', 'size'):
424
+ page_size = int(value) if value is not None else 10
425
+ else:
426
+ sql_params[key] = value
427
+
428
+ return page_num, page_size, sql_params
429
+
363
430
  @staticmethod
364
431
  def _is_collection_type(annotation: Any) -> bool:
365
432
  return get_origin(annotation) in {list, tuple, set, dict} or annotation in {
@@ -2,7 +2,7 @@
2
2
  PyMyBatis版本信息
3
3
  """
4
4
 
5
- __version__ = '2.2.3'
5
+ __version__ = '2.2.5'
6
6
  __author__ = 'PyMyBatis Team'
7
7
  __email__ = 'dev@pymybatis.org'
8
8
  __license__ = 'MIT'