@umacloud/knowledge 1.0.1

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 (418) hide show
  1. package/00-governance/governance-capabilities.md +557 -0
  2. package/00-governance/knowledge-map.md +39 -0
  3. package/00-governance/maintenance-policy.md +76 -0
  4. package/00-governance/review-checklist.md +81 -0
  5. package/README.md +13 -0
  6. package/ai/01-standards/agent-development-complete.md +691 -0
  7. package/ai/01-standards/llm-application-complete.md +488 -0
  8. package/ai/01-standards/mlops-complete.md +798 -0
  9. package/ai/01-standards/prompt-engineering-complete.md +646 -0
  10. package/ai/01-standards/rag-architecture-complete.md +649 -0
  11. package/ai/02-playbooks/llm-evaluation-playbook.md +847 -0
  12. package/ai/03-checklists/ai-project-checklist.md +215 -0
  13. package/ai/04-antipatterns/ai-antipatterns.md +661 -0
  14. package/ai/05-cases/case-rag-production.md +147 -0
  15. package/ai/06-glossary/ai-glossary.md +162 -0
  16. package/ai/agent-evaluation-benchmark.md +53 -0
  17. package/ai/ai-agent-memory-context-management.md +41 -0
  18. package/ai/ai-cost-capacity-optimization-playbook.md +42 -0
  19. package/ai/ai-data-security-and-compliance-playbook.md +37 -0
  20. package/ai/ai-domain-index-and-checklist.md +40 -0
  21. package/ai/ai-governance-maturity-model.md +50 -0
  22. package/ai/ai-model-selection-and-routing-strategy.md +47 -0
  23. package/ai/ai-observability-and-oncall-runbook.md +52 -0
  24. package/ai/ai-rag-engineering-playbook.md +42 -0
  25. package/ai/ai-red-team-and-safety-evaluation.md +42 -0
  26. package/ai/ai-release-readiness-and-rollback-gate.md +42 -0
  27. package/ai/llm-agent-engineering-deep-dive.md +57 -0
  28. package/ai/prompt-and-tool-guardrails.md +52 -0
  29. package/api/01-standards/enterprise-api-standards.md +198 -0
  30. package/api/01-standards/rest-api-design-guide.md +63 -0
  31. package/api/02-playbooks/api-pagination-playbook.md +93 -0
  32. package/api/02-playbooks/graphql-production-playbook.md +176 -0
  33. package/api/03-checklists/api-review-checklist.md +55 -0
  34. package/api/04-antipatterns/api-antipatterns.md +112 -0
  35. package/architecture/01-standards/api-gateway-patterns.md +496 -0
  36. package/architecture/01-standards/cloud-native-patterns.md +644 -0
  37. package/architecture/01-standards/distributed-systems-patterns.md +591 -0
  38. package/architecture/01-standards/event-driven-architecture.md +595 -0
  39. package/architecture/01-standards/microservices-patterns-complete.md +968 -0
  40. package/architecture/01-standards/microservices-patterns.md +495 -0
  41. package/architecture/01-standards/system-design-interview.md +664 -0
  42. package/architecture/02-playbooks/microservices-patterns-playbook.md +137 -0
  43. package/architecture/02-playbooks/migration-playbook.md +780 -0
  44. package/architecture/02-playbooks/system-design-playbook.md +779 -0
  45. package/architecture/03-checklists/architecture-decision-checklist.md +297 -0
  46. package/architecture/04-antipatterns/architecture-antipatterns.md +417 -0
  47. package/architecture/05-cases/case-netflix-microservices.md +413 -0
  48. package/architecture/06-glossary/architecture-glossary.md +164 -0
  49. package/architecture/adr-template-and-examples.md +38 -0
  50. package/architecture/api-gateway-deep-dive.md +1291 -0
  51. package/architecture/configuration-management.md +1162 -0
  52. package/architecture/distributed-transactions.md +1220 -0
  53. package/architecture/microservices-complete.md +735 -0
  54. package/architecture/resilience-and-disaster-patterns.md +37 -0
  55. package/architecture/service-governance.md +1198 -0
  56. package/architecture/system-architecture-deep-dive.md +37 -0
  57. package/backend/01-standards/analytics-and-growth.md +65 -0
  58. package/backend/01-standards/api-and-error-conventions.md +120 -0
  59. package/backend/01-standards/application-layering-and-packaging.md +160 -0
  60. package/backend/01-standards/auth-implementation.md +104 -0
  61. package/backend/01-standards/backend-framework-idioms.md +74 -0
  62. package/backend/01-standards/background-jobs-and-async.md +66 -0
  63. package/backend/01-standards/caching-strategies-complete.md +390 -0
  64. package/backend/01-standards/config-and-observability.md +77 -0
  65. package/backend/01-standards/data-modeling-and-persistence.md +94 -0
  66. package/backend/01-standards/django-complete.md +1765 -0
  67. package/backend/01-standards/email-and-notifications.md +64 -0
  68. package/backend/01-standards/fastapi-complete.md +925 -0
  69. package/backend/01-standards/file-upload-and-storage.md +66 -0
  70. package/backend/01-standards/graphql-api-complete.md +416 -0
  71. package/backend/01-standards/llm-application-standard.md +78 -0
  72. package/backend/01-standards/message-queue-patterns.md +379 -0
  73. package/backend/01-standards/microservices-and-distributed.md +78 -0
  74. package/backend/01-standards/nestjs-complete.md +2167 -0
  75. package/backend/01-standards/payment-integration.md +80 -0
  76. package/backend/01-standards/rate-limiting-complete.md +451 -0
  77. package/backend/01-standards/realtime-and-websocket.md +65 -0
  78. package/backend/01-standards/search-and-filtering.md +64 -0
  79. package/backend/01-standards/spring-boot-complete.md +445 -0
  80. package/backend/02-playbooks/api-design-playbook.md +718 -0
  81. package/backend/02-playbooks/email-send-playbook.md +130 -0
  82. package/backend/02-playbooks/file-upload-s3-playbook.md +153 -0
  83. package/backend/02-playbooks/typescript-enterprise-playbook.md +133 -0
  84. package/backend/02-playbooks/websocket-realtime-playbook.md +154 -0
  85. package/backend/03-checklists/api-launch-checklist.md +189 -0
  86. package/backend/04-antipatterns/backend-antipatterns.md +1051 -0
  87. package/blockchain/01-standards/blockchain-basics.md +557 -0
  88. package/blockchain/01-standards/smart-contract-development.md +1315 -0
  89. package/cicd/01-standards/deployment-and-delivery-standard.md +96 -0
  90. package/cicd/01-standards/github-actions-complete.md +473 -0
  91. package/cicd/01-standards/release-and-store-submission.md +75 -0
  92. package/cicd/02-playbooks/cicd-pipeline-playbook.md +144 -0
  93. package/cicd/02-playbooks/release-management-playbook.md +605 -0
  94. package/cicd/03-checklists/pipeline-security-checklist.md +168 -0
  95. package/cicd/04-antipatterns/cicd-antipatterns.md +589 -0
  96. package/cicd/05-cases/case-deployment-automation.md +221 -0
  97. package/cicd/05-cases/case-gitops-transformation.md +212 -0
  98. package/cicd/06-glossary/cicd-glossary.md +114 -0
  99. package/cicd/cicd-blueprint-deep-dive.md +38 -0
  100. package/cicd/release-readiness-gate.md +37 -0
  101. package/cloud-native/01-standards/container-security.md +741 -0
  102. package/cloud-native/01-standards/kubernetes-complete.md +812 -0
  103. package/cloud-native/02-playbooks/api-gateway-playbook.md +155 -0
  104. package/cloud-native/02-playbooks/gitops-with-argocd.md +760 -0
  105. package/cloud-native/02-playbooks/k8s-troubleshooting-playbook.md +1942 -0
  106. package/cloud-native/02-playbooks/message-queue-playbook.md +129 -0
  107. package/cloud-native/02-playbooks/multicloud-governance.md +726 -0
  108. package/cloud-native/02-playbooks/serverless-patterns.md +788 -0
  109. package/cloud-native/02-playbooks/service-mesh-playbook.md +612 -0
  110. package/cloud-native/02-playbooks/terraform-iac-playbook.md +143 -0
  111. package/cloud-native/03-checklists/container-security-checklist.md +431 -0
  112. package/cloud-native/03-checklists/k8s-production-readiness-checklist.md +460 -0
  113. package/cloud-native/04-antipatterns/container-antipatterns.md +660 -0
  114. package/cloud-native/04-antipatterns/k8s-antipatterns.md +743 -0
  115. package/cloud-native/05-cases/case-k8s-migration.md +478 -0
  116. package/cloud-native/05-cases/case-k8s-scaling.md +642 -0
  117. package/cloud-native/05-cases/case-k8s-security-incident.md +397 -0
  118. package/cloud-native/06-glossary/cloud-native-glossary.md +337 -0
  119. package/cross-platform/01-standards/cross-platform-frameworks.md +83 -0
  120. package/cross-platform/01-standards/platform-selection-and-architecture.md +77 -0
  121. package/data/01-standards/elasticsearch-complete.md +2098 -0
  122. package/data/01-standards/postgresql-complete.md +1613 -0
  123. package/data/01-standards/redis-complete.md +1527 -0
  124. package/data/02-playbooks/database-optimization-playbook.md +403 -0
  125. package/data/02-playbooks/elasticsearch-production-playbook.md +132 -0
  126. package/data/03-checklists/database-launch-checklist.md +187 -0
  127. package/data/04-antipatterns/database-antipatterns.md +873 -0
  128. package/data/05-cases/case-database-migration.md +310 -0
  129. package/data/06-glossary/database-glossary.md +440 -0
  130. package/data/data-governance-and-modeling-deep-dive.md +39 -0
  131. package/data-engineering/01-standards/airflow-complete.md +523 -0
  132. package/data-engineering/01-standards/kafka-complete.md +1521 -0
  133. package/data-engineering/02-playbooks/spark-etl-playbook.md +496 -0
  134. package/data-engineering/03-checklists/pipeline-launch-checklist.md +194 -0
  135. package/data-engineering/04-antipatterns/data-pipeline-antipatterns.md +684 -0
  136. package/data-engineering/05-cases/case-real-time-pipeline.md +355 -0
  137. package/data-engineering/06-glossary/data-engineering-glossary.md +429 -0
  138. package/database/01-standards/database-schema-standards.md +147 -0
  139. package/database/02-playbooks/postgresql-optimization-quick.md +52 -0
  140. package/database/02-playbooks/postgresql-performance-optimization.md +58 -0
  141. package/database/02-playbooks/postgresql-production-playbook.md +146 -0
  142. package/database/02-playbooks/redis-caching-playbook.md +117 -0
  143. package/database/03-checklists/database-review-checklist.md +50 -0
  144. package/database/04-antipatterns/database-antipatterns.md +112 -0
  145. package/design/01-standards/ui-design-system-complete.md +423 -0
  146. package/design/02-playbooks/design-handoff-playbook.md +254 -0
  147. package/design/02-playbooks/design-review-playbook.md +388 -0
  148. package/design/03-checklists/design-review-checklist.md +246 -0
  149. package/design/04-antipatterns/design-antipatterns.md +378 -0
  150. package/design/05-cases/case-design-system-adoption.md +328 -0
  151. package/design/06-glossary/design-glossary.md +329 -0
  152. package/design/ui-full-lifecycle-cross-platform-playbook.md +571 -0
  153. package/design/ux-system-deep-dive.md +38 -0
  154. package/design-systems/00-craft-rules.md +71 -0
  155. package/design-systems/aesthetic-families.md +43 -0
  156. package/design-systems/anti-ai-slop.md +162 -0
  157. package/design-systems/bold-geometric.md +120 -0
  158. package/design-systems/brutalist-bold.md +103 -0
  159. package/design-systems/editorial-clean.md +109 -0
  160. package/design-systems/glass-aurora.md +108 -0
  161. package/design-systems/modern-minimal.md +145 -0
  162. package/design-systems/premium-luxury.md +106 -0
  163. package/design-systems/product-type-design-map.md +48 -0
  164. package/design-systems/soft-warm.md +123 -0
  165. package/design-systems/tech-utility.md +113 -0
  166. package/desktop/01-standards/desktop-app-standard.md +72 -0
  167. package/desktop/01-standards/desktop-design.md +71 -0
  168. package/development/00-governance/document-template.md +41 -0
  169. package/development/01-standards/api-versioning-strategies.md +432 -0
  170. package/development/01-standards/authentication-patterns-complete.md +479 -0
  171. package/development/01-standards/css-architecture-complete.md +550 -0
  172. package/development/01-standards/database-migration-strategies.md +484 -0
  173. package/development/01-standards/elasticsearch-complete.md +347 -0
  174. package/development/01-standards/git-complete.md +371 -0
  175. package/development/01-standards/golang-complete.md +1565 -0
  176. package/development/01-standards/graphql-complete.md +298 -0
  177. package/development/01-standards/javascript-bundlers-complete.md +469 -0
  178. package/development/01-standards/javascript-typescript-complete.md +528 -0
  179. package/development/01-standards/jest-complete.md +275 -0
  180. package/development/01-standards/linux-complete.md +234 -0
  181. package/development/01-standards/logging-observability-complete.md +526 -0
  182. package/development/01-standards/microservices-communication.md +502 -0
  183. package/development/01-standards/mongodb-complete.md +406 -0
  184. package/development/01-standards/oauth2-complete.md +285 -0
  185. package/development/01-standards/performance-optimization-complete.md +289 -0
  186. package/development/01-standards/playwright-complete.md +247 -0
  187. package/development/01-standards/postgresql-complete.md +456 -0
  188. package/development/01-standards/pytest-complete.md +340 -0
  189. package/development/01-standards/python-async-programming.md +902 -0
  190. package/development/01-standards/python-complete.md +956 -0
  191. package/development/01-standards/python-decorators-complete.md +799 -0
  192. package/development/01-standards/python-design-patterns.md +2854 -0
  193. package/development/01-standards/python-packaging-distribution.md +420 -0
  194. package/development/01-standards/python-testing-strategies.md +607 -0
  195. package/development/01-standards/python-web-frameworks-comparison.md +471 -0
  196. package/development/01-standards/redis-complete.md +317 -0
  197. package/development/01-standards/rest-api-complete.md +316 -0
  198. package/development/01-standards/rust-complete.md +578 -0
  199. package/development/01-standards/typescript-advanced-types.md +1513 -0
  200. package/development/01-standards/web-security-complete.md +292 -0
  201. package/development/02-playbooks/api-design-playbook.md +810 -0
  202. package/development/02-playbooks/database-migration-playbook.md +580 -0
  203. package/development/02-playbooks/debugging-playbook.md +692 -0
  204. package/development/02-playbooks/feature-delivery-playbook.md +430 -0
  205. package/development/02-playbooks/incident-hotfix-playbook.md +387 -0
  206. package/development/02-playbooks/performance-optimization-playbook.md +531 -0
  207. package/development/02-playbooks/performance-tuning-playbook.md +652 -0
  208. package/development/02-playbooks/refactor-playbook.md +403 -0
  209. package/development/02-playbooks/release-playbook.md +469 -0
  210. package/development/03-checklists/architecture-review-checklist.md +168 -0
  211. package/development/03-checklists/data-migration-checklist.md +157 -0
  212. package/development/03-checklists/oncall-handover-checklist.md +173 -0
  213. package/development/03-checklists/pr-checklist.md +158 -0
  214. package/development/03-checklists/production-readiness-checklist.md +190 -0
  215. package/development/03-checklists/release-readiness-checklist.md +154 -0
  216. package/development/03-checklists/security-review-checklist.md +182 -0
  217. package/development/04-antipatterns/api-antipatterns.md +657 -0
  218. package/development/04-antipatterns/architecture-antipatterns.md +686 -0
  219. package/development/04-antipatterns/backend-antipatterns.md +648 -0
  220. package/development/04-antipatterns/cicd-antipatterns.md +540 -0
  221. package/development/04-antipatterns/code-smell-antipatterns.md +571 -0
  222. package/development/04-antipatterns/data-antipatterns.md +658 -0
  223. package/development/04-antipatterns/database-antipatterns.md +578 -0
  224. package/development/04-antipatterns/frontend-antipatterns.md +635 -0
  225. package/development/04-antipatterns/reliability-antipatterns.md +700 -0
  226. package/development/04-antipatterns/security-antipatterns.md +747 -0
  227. package/development/05-cases/case-api-version-migration.md +428 -0
  228. package/development/05-cases/case-authorization-hardening.md +383 -0
  229. package/development/05-cases/case-bluegreen-rollback.md +466 -0
  230. package/development/05-cases/case-cache-snowball-protection.md +485 -0
  231. package/development/05-cases/case-ci-cd-pipeline.md +544 -0
  232. package/development/05-cases/case-database-scaling.md +500 -0
  233. package/development/05-cases/case-db-hotspot-optimization.md +487 -0
  234. package/development/05-cases/case-incident-mttr-reduction.md +563 -0
  235. package/development/05-cases/case-microservice-migration.md +375 -0
  236. package/development/05-cases/case-performance-optimization.md +406 -0
  237. package/development/05-cases/case-security-incident-response.md +345 -0
  238. package/development/06-glossary/full-stack-glossary.md +166 -0
  239. package/development/09-maturity/quarterly-audit-template.md +35 -0
  240. package/development/11-ui-excellence/ui-aesthetic-system.md +41 -0
  241. package/development/11-ui-excellence/ui-engineering-excellence.md +435 -0
  242. package/development/12-scenarios/development-scenarios-guide.md +565 -0
  243. package/development/13-implementation-assets/implementation-toolkit.md +282 -0
  244. package/development/13-implementation-assets/knowledge-gates-execution.md +43 -0
  245. package/development/14-full-lifecycle/software-lifecycle-gates.md +511 -0
  246. package/development/15-lifecycle-templates/project-templates-collection.md +791 -0
  247. package/development/api-contract-and-versioning-guide.md +36 -0
  248. package/development/api-governance-complete.md +43 -0
  249. package/development/backend-engineering-complete.md +43 -0
  250. package/development/code-review-quality-complete.md +43 -0
  251. package/development/concurrency-reliability-complete.md +43 -0
  252. package/development/database-engineering-complete.md +43 -0
  253. package/development/engineering-effectiveness-complete.md +43 -0
  254. package/development/engineering-standards-deep-dive.md +38 -0
  255. package/development/frontend-engineering-complete.md +43 -0
  256. package/development/performance-capacity-complete.md +43 -0
  257. package/development/refactor-migration-complete.md +42 -0
  258. package/development/refactoring-and-techdebt-playbook.md +37 -0
  259. package/development/security-in-development-complete.md +43 -0
  260. package/devops/01-standards/cicd-pipeline-complete.md +262 -0
  261. package/devops/01-standards/docker-complete.md +1490 -0
  262. package/devops/01-standards/github-actions-complete.md +337 -0
  263. package/devops/01-standards/kubernetes-complete.md +638 -0
  264. package/devops/01-standards/terraform-complete.md +2117 -0
  265. package/devops/02-playbooks/docker-compose-playbook.md +233 -0
  266. package/devops/02-playbooks/docker-k8s-production-playbook.md +186 -0
  267. package/devops/02-playbooks/docker-production-playbook.md +952 -0
  268. package/edge-iot/01-standards/edge-iot-complete.md +473 -0
  269. package/experts/architect/api-design.md +178 -0
  270. package/experts/architect/methodology.md +124 -0
  271. package/experts/architect/security.md +75 -0
  272. package/experts/backend-lead/methodology.md +216 -0
  273. package/experts/devops/methodology.md +160 -0
  274. package/experts/frontend-lead/methodology.md +178 -0
  275. package/experts/product-manager/industry/ecommerce.md +43 -0
  276. package/experts/product-manager/industry/saas.md +40 -0
  277. package/experts/product-manager/methodology.md +97 -0
  278. package/experts/qa-lead/methodology.md +123 -0
  279. package/experts/qa-lead/test-strategy.md +128 -0
  280. package/experts/uiux-designer/methodology.md +125 -0
  281. package/frontend/01-standards/accessibility-complete.md +532 -0
  282. package/frontend/01-standards/accessibility-standard.md +74 -0
  283. package/frontend/01-standards/admin-dashboard-and-crud.md +72 -0
  284. package/frontend/01-standards/design-tokens-complete.md +444 -0
  285. package/frontend/01-standards/forms-and-validation.md +77 -0
  286. package/frontend/01-standards/frontend-architecture-and-layering.md +119 -0
  287. package/frontend/01-standards/i18n-and-localization.md +65 -0
  288. package/frontend/01-standards/nextjs-complete.md +451 -0
  289. package/frontend/01-standards/react-complete.md +713 -0
  290. package/frontend/01-standards/react-hooks-complete-guide.md +1100 -0
  291. package/frontend/01-standards/react-hooks-complete.md +1171 -0
  292. package/frontend/01-standards/seo-and-web-vitals.md +77 -0
  293. package/frontend/01-standards/state-management-complete.md +444 -0
  294. package/frontend/01-standards/vue-complete.md +499 -0
  295. package/frontend/01-standards/vue3-complete.md +2002 -0
  296. package/frontend/01-standards/web-framework-best-practices.md +64 -0
  297. package/frontend/01-standards/web-performance-complete.md +495 -0
  298. package/frontend/02-playbooks/accessibility-a11y-playbook.md +161 -0
  299. package/frontend/02-playbooks/frontend-performance-playbook.md +707 -0
  300. package/frontend/02-playbooks/i18n-internationalization-playbook.md +120 -0
  301. package/frontend/02-playbooks/performance-optimization-playbook.md +163 -0
  302. package/frontend/02-playbooks/react-nextjs-production-playbook.md +167 -0
  303. package/frontend/02-playbooks/react-state-management-playbook.md +173 -0
  304. package/frontend/03-checklists/component-quality-checklist.md +166 -0
  305. package/frontend/03-checklists/frontend-launch-checklist.md +299 -0
  306. package/frontend/04-antipatterns/frontend-antipatterns.md +886 -0
  307. package/frontend/05-cases/case-performance-optimization.md +274 -0
  308. package/harmony/01-standards/harmonyos-arkts-standard.md +75 -0
  309. package/harmony/01-standards/harmonyos-design.md +65 -0
  310. package/high-quality-engineering-playbook.md +54 -0
  311. package/incident/01-standards/incident-response-complete.md +303 -0
  312. package/incident/02-playbooks/chaos-engineering-playbook.md +883 -0
  313. package/incident/02-playbooks/postmortem-playbook.md +398 -0
  314. package/incident/03-checklists/incident-readiness-checklist.md +181 -0
  315. package/incident/04-antipatterns/incident-antipatterns.md +490 -0
  316. package/incident/05-cases/case-cascade-failure.md +176 -0
  317. package/incident/06-glossary/incident-glossary.md +114 -0
  318. package/incident/postmortem-and-response-deep-dive.md +39 -0
  319. package/industries/ecommerce/ecommerce-complete.md +631 -0
  320. package/industries/education/education-complete.md +555 -0
  321. package/industries/fintech/fintech-complete.md +501 -0
  322. package/industries/gaming/gaming-complete.md +587 -0
  323. package/industries/healthcare/healthcare-complete.md +452 -0
  324. package/low-code/01-standards/low-code-complete.md +944 -0
  325. package/miniprogram/01-standards/ai-common-mistakes.md +61 -0
  326. package/miniprogram/01-standards/miniprogram-custom-navbar-capsule.md +77 -0
  327. package/miniprogram/01-standards/miniprogram-design.md +61 -0
  328. package/miniprogram/01-standards/miniprogram-standard.md +81 -0
  329. package/mobile/01-standards/android-material-design.md +70 -0
  330. package/mobile/01-standards/flutter-complete.md +384 -0
  331. package/mobile/01-standards/ios-design-hig.md +78 -0
  332. package/mobile/01-standards/mobile-app-standard.md +85 -0
  333. package/mobile/01-standards/react-native-complete.md +352 -0
  334. package/mobile/02-playbooks/mobile-cross-platform-playbook.md +175 -0
  335. package/mobile/02-playbooks/mobile-performance.md +473 -0
  336. package/mobile/03-checklists/mobile-release-checklist.md +234 -0
  337. package/mobile/04-antipatterns/mobile-antipatterns.md +798 -0
  338. package/mobile/05-cases/case-app-performance.md +500 -0
  339. package/mobile/05-cases/case-app-startup-optimization.md +218 -0
  340. package/mobile/06-glossary/mobile-glossary.md +484 -0
  341. package/observability/01-standards/observability-standards.md +103 -0
  342. package/observability/02-playbooks/prometheus-grafana-playbook.md +135 -0
  343. package/observability/02-playbooks/structured-logging-playbook.md +73 -0
  344. package/observability/03-checklists/observability-checklist.md +54 -0
  345. package/observability/04-antipatterns/observability-antipatterns.md +106 -0
  346. package/operations/01-standards/prometheus-monitoring-complete.md +1578 -0
  347. package/operations/02-playbooks/capacity-planning-playbook.md +620 -0
  348. package/operations/03-checklists/production-launch-checklist.md +365 -0
  349. package/operations/04-antipatterns/operations-antipatterns.md +664 -0
  350. package/operations/05-cases/case-sre-practices.md +581 -0
  351. package/operations/06-glossary/operations-glossary.md +120 -0
  352. package/operations/aiops-anomaly-detection.md +758 -0
  353. package/operations/capacity-planning.md +1061 -0
  354. package/operations/chaos-engineering.md +659 -0
  355. package/operations/incident-command-system.md +38 -0
  356. package/operations/observability-complete.md +442 -0
  357. package/operations/slo-sli-playbook.md +517 -0
  358. package/operations/sre-operations-deep-dive.md +39 -0
  359. package/package.json +8 -0
  360. package/performance/01-standards/performance-and-scalability.md +80 -0
  361. package/performance/01-standards/performance-standards.md +156 -0
  362. package/performance/02-playbooks/query-optimization-playbook.md +103 -0
  363. package/performance/03-checklists/performance-checklist.md +56 -0
  364. package/performance/04-antipatterns/performance-antipatterns.md +146 -0
  365. package/product/01-standards/product-management-complete.md +285 -0
  366. package/product/02-playbooks/feature-launch-playbook.md +207 -0
  367. package/product/02-playbooks/user-research-playbook.md +532 -0
  368. package/product/03-checklists/feature-launch-checklist.md +275 -0
  369. package/product/04-antipatterns/product-antipatterns.md +355 -0
  370. package/product/05-cases/case-mvp-to-scale.md +384 -0
  371. package/product/06-glossary/product-glossary.md +462 -0
  372. package/product/feature-prioritization-framework.md +40 -0
  373. package/product/kpi-and-metric-tree.md +37 -0
  374. package/product/product-discovery-and-prd-deep-dive.md +41 -0
  375. package/quantum/01-standards/quantum-complete.md +1186 -0
  376. package/security/01-standards/api-security-complete.md +511 -0
  377. package/security/01-standards/container-runtime-security.md +574 -0
  378. package/security/01-standards/data-protection-gdpr.md +543 -0
  379. package/security/01-standards/owasp-top10-complete.md +1890 -0
  380. package/security/01-standards/secure-coding-baseline.md +90 -0
  381. package/security/01-standards/supply-chain-security.md +441 -0
  382. package/security/01-standards/web-security-checklist.md +108 -0
  383. package/security/01-standards/zero-trust-architecture.md +521 -0
  384. package/security/02-playbooks/auth-sso-playbook.md +166 -0
  385. package/security/02-playbooks/incident-response-security-playbook.md +588 -0
  386. package/security/02-playbooks/owasp-api-security-playbook.md +129 -0
  387. package/security/02-playbooks/payment-integration-playbook.md +119 -0
  388. package/security/02-playbooks/penetration-testing-playbook.md +517 -0
  389. package/security/03-checklists/security-audit-checklist.md +356 -0
  390. package/security/04-antipatterns/security-coding-antipatterns.md +580 -0
  391. package/security/05-cases/case-log4shell-incident.md +537 -0
  392. package/security/05-cases/case-major-breaches.md +468 -0
  393. package/security/06-glossary/security-glossary.md +212 -0
  394. package/security/compliance-automation.md +993 -0
  395. package/security/container-security.md +680 -0
  396. package/security/devsecops-complete.md +426 -0
  397. package/security/sast-dast-sca.md +775 -0
  398. package/security/secrets-management.md +594 -0
  399. package/security/security-architecture-deep-dive.md +37 -0
  400. package/security/threat-modeling-stride-playbook.md +40 -0
  401. package/seed-templates/auth-system.md +59 -0
  402. package/seed-templates/blog-content.md +94 -0
  403. package/seed-templates/dashboard.md +89 -0
  404. package/seed-templates/docs-site.md +73 -0
  405. package/seed-templates/e-commerce.md +50 -0
  406. package/seed-templates/saas-landing.md +92 -0
  407. package/seed-templates/settings-page.md +51 -0
  408. package/testing/01-standards/test-strategy-and-layering.md +83 -0
  409. package/testing/01-standards/testing-strategy-complete.md +422 -0
  410. package/testing/01-standards/unit-testing-best-practices.md +118 -0
  411. package/testing/02-playbooks/e2e-testing-playbook.md +988 -0
  412. package/testing/02-playbooks/testing-strategy-playbook.md +126 -0
  413. package/testing/03-checklists/test-strategy-checklist.md +208 -0
  414. package/testing/04-antipatterns/testing-antipatterns.md +718 -0
  415. package/testing/05-cases/case-testing-transformation.md +300 -0
  416. package/testing/06-glossary/testing-glossary.md +110 -0
  417. package/testing/risk-based-test-matrix.md +36 -0
  418. package/testing/testing-strategy-deep-dive.md +37 -0
@@ -0,0 +1,1051 @@
1
+ ---
2
+ id: backend-antipatterns
3
+ title: 后端反模式手册
4
+ domain: backend
5
+ category: 04-antipatterns
6
+ difficulty: intermediate
7
+ tags: [antipatterns, backend, controller, 同步阻塞, 无超时设置, 无连接池, 无重试策略, 无限分页]
8
+ quality_score: 70
9
+ last_updated: 2026-06-15
10
+ ---
11
+ # 后端反模式手册
12
+
13
+ > 覆盖 Python 和 Node.js 后端开发中最常见的 10 类反模式。
14
+ > 每项包含:问题描述、问题代码(Python + Node.js)、修复代码、检测方法。
15
+
16
+ ---
17
+
18
+ ## 1. N+1 查询
19
+
20
+ **问题**:获取列表后,逐条查询关联数据,导致数据库请求数与数据量成线性关系。100 条数据产生 101 次查询。
21
+
22
+ ### 问题代码 - Python
23
+
24
+ ```python
25
+ # Django ORM - N+1
26
+ def get_orders(request):
27
+ orders = Order.objects.all()[:100] # 1 次查询
28
+ result = []
29
+ for order in orders:
30
+ # 每次循环产生 1 次查询 → 共 100 次
31
+ customer = order.customer # SELECT * FROM customer WHERE id = ?
32
+ items = order.items.all() # SELECT * FROM order_item WHERE order_id = ?
33
+ result.append({
34
+ "id": order.id,
35
+ "customer_name": customer.name,
36
+ "item_count": len(items),
37
+ })
38
+ return JsonResponse({"data": result}) # 总计 201 次查询
39
+ ```
40
+
41
+ ### 问题代码 - Node.js
42
+
43
+ ```ts
44
+ // Prisma - N+1
45
+ app.get('/orders', async (req, res) => {
46
+ const orders = await prisma.order.findMany({ take: 100 });
47
+
48
+ const result = [];
49
+ for (const order of orders) {
50
+ // 每次循环 2 次查询
51
+ const customer = await prisma.customer.findUnique({ where: { id: order.customerId } });
52
+ const items = await prisma.orderItem.findMany({ where: { orderId: order.id } });
53
+ result.push({
54
+ id: order.id,
55
+ customerName: customer?.name,
56
+ itemCount: items.length,
57
+ });
58
+ }
59
+
60
+ res.json({ data: result }); // 201 次查询
61
+ });
62
+ ```
63
+
64
+ ### 修复代码 - Python
65
+
66
+ ```python
67
+ # Django - select_related + prefetch_related
68
+ def get_orders(request):
69
+ orders = (
70
+ Order.objects
71
+ .select_related("customer") # JOIN 一次性加载
72
+ .prefetch_related("items") # 第二次查询批量加载
73
+ .all()[:100]
74
+ )
75
+ # 总计 2 次查询(无论数据量多少)
76
+ result = [
77
+ {
78
+ "id": order.id,
79
+ "customer_name": order.customer.name,
80
+ "item_count": order.items.count(),
81
+ }
82
+ for order in orders
83
+ ]
84
+ return JsonResponse({"data": result})
85
+
86
+ # SQLAlchemy - joinedload
87
+ from sqlalchemy.orm import joinedload
88
+
89
+ orders = (
90
+ session.query(Order)
91
+ .options(joinedload(Order.customer), joinedload(Order.items))
92
+ .limit(100)
93
+ .all()
94
+ )
95
+ ```
96
+
97
+ ### 修复代码 - Node.js
98
+
99
+ ```ts
100
+ // Prisma - include 一次性加载
101
+ app.get('/orders', async (req, res) => {
102
+ const orders = await prisma.order.findMany({
103
+ take: 100,
104
+ include: {
105
+ customer: { select: { name: true } },
106
+ items: true,
107
+ },
108
+ });
109
+ // 总计 1 次查询(Prisma 自动 JOIN 或批量查询)
110
+ res.json({
111
+ data: orders.map(o => ({
112
+ id: o.id,
113
+ customerName: o.customer.name,
114
+ itemCount: o.items.length,
115
+ })),
116
+ });
117
+ });
118
+ ```
119
+
120
+ **检测方法**:Django Debug Toolbar 的 SQL 面板;Prisma 日志 `prisma.$on('query')`;查询数 > 列表条数即为 N+1。
121
+
122
+ ---
123
+
124
+ ## 2. 无连接池
125
+
126
+ **问题**:每次请求新建数据库连接,高并发时连接数爆炸,耗尽数据库资源或产生大量 TIME_WAIT。
127
+
128
+ ### 问题代码 - Python
129
+
130
+ ```python
131
+ import psycopg2
132
+
133
+ def get_user(user_id: str):
134
+ # 每次调用创建新连接 → 高并发时连接数爆炸
135
+ conn = psycopg2.connect(
136
+ host="localhost", port=5432,
137
+ dbname="mydb", user="admin", password="secret"
138
+ )
139
+ try:
140
+ cursor = conn.cursor()
141
+ cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
142
+ return cursor.fetchone()
143
+ finally:
144
+ conn.close() # 连接直接关闭,无法复用
145
+ ```
146
+
147
+ ### 问题代码 - Node.js
148
+
149
+ ```ts
150
+ import { Client } from 'pg';
151
+
152
+ async function getUser(userId: string) {
153
+ // 每次请求新建 Client → 无连接复用
154
+ const client = new Client({
155
+ host: 'localhost', port: 5432,
156
+ database: 'mydb', user: 'admin', password: 'secret',
157
+ });
158
+ await client.connect();
159
+ try {
160
+ const result = await client.query('SELECT * FROM users WHERE id = $1', [userId]);
161
+ return result.rows[0];
162
+ } finally {
163
+ await client.end();
164
+ }
165
+ }
166
+ ```
167
+
168
+ ### 修复代码 - Python
169
+
170
+ ```python
171
+ # psycopg2 连接池
172
+ from psycopg2 import pool
173
+
174
+ # 应用启动时创建连接池(全局单例)
175
+ db_pool = pool.ThreadedConnectionPool(
176
+ minconn=5,
177
+ maxconn=20,
178
+ host="localhost", port=5432,
179
+ dbname="mydb", user="admin", password="secret",
180
+ )
181
+
182
+ def get_user(user_id: str):
183
+ conn = db_pool.getconn()
184
+ try:
185
+ cursor = conn.cursor()
186
+ cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
187
+ return cursor.fetchone()
188
+ finally:
189
+ db_pool.putconn(conn) # 归还连接池,而非关闭
190
+
191
+ # 异步方案:asyncpg(自带连接池)
192
+ import asyncpg
193
+
194
+ pool = await asyncpg.create_pool(
195
+ "postgresql://admin:secret@localhost:5432/mydb",
196
+ min_size=5, max_size=20,
197
+ command_timeout=10,
198
+ )
199
+
200
+ async def get_user(user_id: str):
201
+ async with pool.acquire() as conn:
202
+ return await conn.fetchrow("SELECT * FROM users WHERE id = $1", user_id)
203
+ ```
204
+
205
+ ### 修复代码 - Node.js
206
+
207
+ ```ts
208
+ import { Pool } from 'pg';
209
+
210
+ // 全局连接池
211
+ const pool = new Pool({
212
+ host: 'localhost', port: 5432,
213
+ database: 'mydb', user: 'admin', password: 'secret',
214
+ max: 20, // 最大连接数
215
+ idleTimeoutMillis: 30000,
216
+ connectionTimeoutMillis: 5000,
217
+ });
218
+
219
+ async function getUser(userId: string) {
220
+ const client = await pool.connect();
221
+ try {
222
+ const result = await client.query('SELECT * FROM users WHERE id = $1', [userId]);
223
+ return result.rows[0];
224
+ } finally {
225
+ client.release(); // 归还连接池
226
+ }
227
+ }
228
+ ```
229
+
230
+ **检测方法**:监控数据库活跃连接数(`pg_stat_activity`);连接数随 QPS 线性增长即无连接池。
231
+
232
+ ---
233
+
234
+ ## 3. 同步阻塞 I/O
235
+
236
+ **问题**:在异步/事件驱动框架中执行同步阻塞操作(文件读写、CPU 密集计算),阻塞事件循环,导致整个服务无法处理其他请求。
237
+
238
+ ### 问题代码 - Python
239
+
240
+ ```python
241
+ # FastAPI 中使用同步阻塞调用
242
+ import requests
243
+ import time
244
+
245
+ @app.get("/api/data")
246
+ async def get_data():
247
+ # requests 是同步库,会阻塞事件循环
248
+ response = requests.get("https://slow-api.example.com/data", timeout=30)
249
+
250
+ # 同步文件读写
251
+ with open("large_file.csv", "r") as f:
252
+ data = f.read() # 阻塞
253
+
254
+ # CPU 密集计算直接在事件循环中执行
255
+ result = heavy_computation(data)
256
+
257
+ return {"data": result}
258
+ ```
259
+
260
+ ### 问题代码 - Node.js
261
+
262
+ ```ts
263
+ import fs from 'fs';
264
+ import crypto from 'crypto';
265
+
266
+ app.get('/api/data', (req, res) => {
267
+ // 同步文件读取 → 阻塞事件循环
268
+ const data = fs.readFileSync('large_file.csv', 'utf-8');
269
+
270
+ // CPU 密集操作直接在主线程
271
+ const hash = crypto.pbkdf2Sync(data, 'salt', 100000, 64, 'sha512');
272
+
273
+ res.json({ hash: hash.toString('hex') });
274
+ });
275
+ ```
276
+
277
+ ### 修复代码 - Python
278
+
279
+ ```python
280
+ import httpx
281
+ import aiofiles
282
+ from concurrent.futures import ProcessPoolExecutor
283
+ import asyncio
284
+
285
+ executor = ProcessPoolExecutor(max_workers=4)
286
+
287
+ @app.get("/api/data")
288
+ async def get_data():
289
+ # 使用异步 HTTP 客户端
290
+ async with httpx.AsyncClient() as client:
291
+ response = await client.get("https://slow-api.example.com/data", timeout=30)
292
+
293
+ # 异步文件读写
294
+ async with aiofiles.open("large_file.csv", "r") as f:
295
+ data = await f.read()
296
+
297
+ # CPU 密集任务放到进程池
298
+ loop = asyncio.get_event_loop()
299
+ result = await loop.run_in_executor(executor, heavy_computation, data)
300
+
301
+ return {"data": result}
302
+ ```
303
+
304
+ ### 修复代码 - Node.js
305
+
306
+ ```ts
307
+ import fs from 'fs/promises';
308
+ import { Worker } from 'worker_threads';
309
+
310
+ app.get('/api/data', async (req, res) => {
311
+ // 异步文件读取
312
+ const data = await fs.readFile('large_file.csv', 'utf-8');
313
+
314
+ // CPU 密集操作放到 Worker Thread
315
+ const hash = await runInWorker(data);
316
+
317
+ res.json({ hash });
318
+ });
319
+
320
+ function runInWorker(data: string): Promise<string> {
321
+ return new Promise((resolve, reject) => {
322
+ const worker = new Worker('./hash-worker.js', { workerData: data });
323
+ worker.on('message', resolve);
324
+ worker.on('error', reject);
325
+ });
326
+ }
327
+
328
+ // hash-worker.js
329
+ import { workerData, parentPort } from 'worker_threads';
330
+ import crypto from 'crypto';
331
+
332
+ const hash = crypto.pbkdf2Sync(workerData, 'salt', 100000, 64, 'sha512');
333
+ parentPort.postMessage(hash.toString('hex'));
334
+ ```
335
+
336
+ **检测方法**:Python 使用 `asyncio.get_event_loop().slow_callback_duration`;Node.js 使用 `--prof` 或 `clinic doctor`。
337
+
338
+ ---
339
+
340
+ ## 4. 无超时设置
341
+
342
+ **问题**:HTTP 请求、数据库查询、外部服务调用没有超时,下游故障时请求永久挂起,耗尽线程/连接池。
343
+
344
+ ### 问题代码 - Python
345
+
346
+ ```python
347
+ import requests
348
+
349
+ def call_payment_service(order_id: str):
350
+ # 无超时 → 如果支付服务挂了,请求永久等待
351
+ response = requests.post(
352
+ "https://payment.example.com/charge",
353
+ json={"order_id": order_id},
354
+ )
355
+ return response.json()
356
+
357
+ # 数据库查询无超时
358
+ def get_report():
359
+ # 复杂查询可能执行数分钟,期间连接被占用
360
+ return db.execute("SELECT ... FROM huge_table WHERE ...")
361
+ ```
362
+
363
+ ### 问题代码 - Node.js
364
+
365
+ ```ts
366
+ // 无超时的 fetch
367
+ async function callPaymentService(orderId: string) {
368
+ const res = await fetch('https://payment.example.com/charge', {
369
+ method: 'POST',
370
+ body: JSON.stringify({ orderId }),
371
+ // 无 signal、无 timeout → 永久等待
372
+ });
373
+ return res.json();
374
+ }
375
+ ```
376
+
377
+ ### 修复代码 - Python
378
+
379
+ ```python
380
+ import httpx
381
+
382
+ # HTTP 请求超时
383
+ async def call_payment_service(order_id: str):
384
+ async with httpx.AsyncClient(
385
+ timeout=httpx.Timeout(
386
+ connect=5.0, # 连接超时 5s
387
+ read=10.0, # 读取超时 10s
388
+ write=5.0, # 写入超时 5s
389
+ pool=5.0, # 连接池等待超时 5s
390
+ )
391
+ ) as client:
392
+ try:
393
+ response = await client.post(
394
+ "https://payment.example.com/charge",
395
+ json={"order_id": order_id},
396
+ )
397
+ return response.json()
398
+ except httpx.TimeoutException:
399
+ raise ServiceUnavailable("支付服务超时")
400
+
401
+ # 数据库查询超时
402
+ import asyncio
403
+
404
+ async def get_report():
405
+ try:
406
+ return await asyncio.wait_for(
407
+ db.execute("SELECT ... FROM huge_table WHERE ..."),
408
+ timeout=30.0, # 30 秒超时
409
+ )
410
+ except asyncio.TimeoutError:
411
+ raise ServiceUnavailable("报表查询超时")
412
+
413
+ # PostgreSQL 语句级超时
414
+ await conn.execute("SET statement_timeout = '30s'")
415
+ ```
416
+
417
+ ### 修复代码 - Node.js
418
+
419
+ ```ts
420
+ // fetch 超时
421
+ async function callPaymentService(orderId: string) {
422
+ const controller = new AbortController();
423
+ const timeoutId = setTimeout(() => controller.abort(), 10_000); // 10s 超时
424
+
425
+ try {
426
+ const res = await fetch('https://payment.example.com/charge', {
427
+ method: 'POST',
428
+ body: JSON.stringify({ orderId }),
429
+ headers: { 'Content-Type': 'application/json' },
430
+ signal: controller.signal,
431
+ });
432
+ return await res.json();
433
+ } catch (err) {
434
+ if (err instanceof DOMException && err.name === 'AbortError') {
435
+ throw new ServiceUnavailable('支付服务超时');
436
+ }
437
+ throw err;
438
+ } finally {
439
+ clearTimeout(timeoutId);
440
+ }
441
+ }
442
+
443
+ // Prisma 查询超时
444
+ const result = await prisma.$queryRaw`
445
+ SET statement_timeout = '30s';
446
+ SELECT ... FROM huge_table WHERE ...;
447
+ `;
448
+ ```
449
+
450
+ **检测方法**:搜索代码中所有 HTTP 客户端调用和数据库查询,确认 timeout 参数存在。
451
+
452
+ ---
453
+
454
+ ## 5. 无重试策略
455
+
456
+ **问题**:网络抖动或临时故障时请求直接失败,不做重试。或者无脑重试无退避,加剧下游压力(重试风暴)。
457
+
458
+ ### 问题代码 - Python
459
+
460
+ ```python
461
+ # 无重试 → 偶发网络错误直接失败
462
+ def send_notification(user_id: str, message: str):
463
+ response = requests.post(
464
+ "https://notification.example.com/send",
465
+ json={"user_id": user_id, "message": message},
466
+ timeout=5,
467
+ )
468
+ response.raise_for_status()
469
+
470
+ # 无脑重试 → 重试风暴
471
+ def send_with_bad_retry(user_id: str, message: str):
472
+ for _ in range(10):
473
+ try:
474
+ response = requests.post(url, json=data, timeout=5)
475
+ response.raise_for_status()
476
+ return response.json()
477
+ except Exception:
478
+ pass # 立即重试,无间隔,无退避
479
+ ```
480
+
481
+ ### 修复代码 - Python
482
+
483
+ ```python
484
+ import tenacity
485
+ import random
486
+
487
+ @tenacity.retry(
488
+ stop=tenacity.stop_after_attempt(3), # 最多 3 次
489
+ wait=tenacity.wait_exponential(multiplier=1, max=10) # 指数退避:1s, 2s, 4s...
490
+ + tenacity.wait_random(0, 1), # 加抖动
491
+ retry=tenacity.retry_if_exception_type(
492
+ (httpx.TimeoutException, httpx.HTTPStatusError)
493
+ ),
494
+ before_sleep=tenacity.before_sleep_log(logger, logging.WARNING),
495
+ )
496
+ async def send_notification(user_id: str, message: str):
497
+ async with httpx.AsyncClient(timeout=5) as client:
498
+ response = await client.post(
499
+ "https://notification.example.com/send",
500
+ json={"user_id": user_id, "message": message},
501
+ )
502
+ # 仅对 5xx 重试,4xx 不重试
503
+ if response.status_code >= 500:
504
+ response.raise_for_status()
505
+ return response.json()
506
+ ```
507
+
508
+ ### 修复代码 - Node.js
509
+
510
+ ```ts
511
+ // 指数退避重试
512
+ async function withRetry<T>(
513
+ fn: () => Promise<T>,
514
+ options: { maxAttempts?: number; baseDelay?: number; maxDelay?: number } = {},
515
+ ): Promise<T> {
516
+ const { maxAttempts = 3, baseDelay = 1000, maxDelay = 10000 } = options;
517
+
518
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
519
+ try {
520
+ return await fn();
521
+ } catch (err) {
522
+ if (attempt === maxAttempts) throw err;
523
+
524
+ // 仅对可重试错误重试
525
+ if (err instanceof HttpError && err.status < 500) throw err;
526
+
527
+ const delay = Math.min(
528
+ baseDelay * Math.pow(2, attempt - 1) + Math.random() * 1000,
529
+ maxDelay,
530
+ );
531
+ console.warn(`Attempt ${attempt} failed, retrying in ${delay}ms...`);
532
+ await new Promise(r => setTimeout(r, delay));
533
+ }
534
+ }
535
+ throw new Error('Unreachable');
536
+ }
537
+
538
+ // 使用
539
+ const result = await withRetry(() => callPaymentService(orderId), { maxAttempts: 3 });
540
+ ```
541
+
542
+ **检测方法**:搜索所有外部 HTTP 调用,确认有重试 + 指数退避 + 抖动。
543
+
544
+ ---
545
+
546
+ ## 6. 非幂等操作
547
+
548
+ **问题**:POST/PUT 操作不幂等,网络重试或用户重复提交导致重复创建订单、重复扣款等严重业务问题。
549
+
550
+ ### 问题代码 - Python
551
+
552
+ ```python
553
+ @app.post("/api/v1/orders")
554
+ async def create_order(order: OrderCreate):
555
+ # 无幂等性保护 → 网络重试时重复创建订单
556
+ new_order = Order(
557
+ customer_id=order.customer_id,
558
+ items=order.items,
559
+ total=calculate_total(order.items),
560
+ )
561
+ db.add(new_order)
562
+ db.commit()
563
+ return {"id": new_order.id}
564
+ ```
565
+
566
+ ### 修复代码 - Python
567
+
568
+ ```python
569
+ @app.post("/api/v1/orders")
570
+ async def create_order(
571
+ order: OrderCreate,
572
+ idempotency_key: str = Header(..., alias="Idempotency-Key"),
573
+ ):
574
+ # 检查幂等键是否已处理
575
+ cache_key = f"idempotency:{idempotency_key}"
576
+ cached = await redis.get(cache_key)
577
+ if cached:
578
+ return json.loads(cached) # 返回缓存结果
579
+
580
+ # 使用数据库唯一约束作为最终防线
581
+ try:
582
+ new_order = Order(
583
+ idempotency_key=idempotency_key,
584
+ customer_id=order.customer_id,
585
+ items=order.items,
586
+ total=calculate_total(order.items),
587
+ )
588
+ db.add(new_order)
589
+ db.commit()
590
+ except IntegrityError:
591
+ # 幂等键冲突 → 返回已有订单
592
+ existing = db.query(Order).filter_by(idempotency_key=idempotency_key).first()
593
+ return {"id": existing.id}
594
+
595
+ result = {"id": new_order.id}
596
+ # 缓存结果 24 小时
597
+ await redis.setex(cache_key, 86400, json.dumps(result))
598
+ return result
599
+ ```
600
+
601
+ ### 修复代码 - Node.js
602
+
603
+ ```ts
604
+ app.post('/api/v1/orders', async (req, res) => {
605
+ const idempotencyKey = req.headers['idempotency-key'] as string;
606
+ if (!idempotencyKey) {
607
+ return res.status(400).json({ error: { code: 'MISSING_IDEMPOTENCY_KEY' } });
608
+ }
609
+
610
+ // 检查 Redis 缓存
611
+ const cached = await redis.get(`idempotency:${idempotencyKey}`);
612
+ if (cached) {
613
+ return res.status(200).json(JSON.parse(cached));
614
+ }
615
+
616
+ // 使用数据库事务 + 唯一约束
617
+ try {
618
+ const order = await prisma.order.create({
619
+ data: {
620
+ idempotencyKey,
621
+ customerId: req.body.customerId,
622
+ items: { create: req.body.items },
623
+ total: calculateTotal(req.body.items),
624
+ },
625
+ });
626
+
627
+ const result = { id: order.id };
628
+ await redis.setex(`idempotency:${idempotencyKey}`, 86400, JSON.stringify(result));
629
+ res.status(201).json(result);
630
+ } catch (err) {
631
+ if (err.code === 'P2002') { // Prisma unique constraint violation
632
+ const existing = await prisma.order.findUnique({ where: { idempotencyKey } });
633
+ res.status(200).json({ id: existing!.id });
634
+ } else {
635
+ throw err;
636
+ }
637
+ }
638
+ });
639
+ ```
640
+
641
+ **检测方法**:所有创建/支付类 POST 接口必须要求 `Idempotency-Key` 头。
642
+
643
+ ---
644
+
645
+ ## 7. 无限分页
646
+
647
+ **问题**:分页接口无 `per_page` 上限或默认值过大,客户端可以请求 `per_page=999999`,一次性拉取全表数据,击穿数据库和内存。
648
+
649
+ ### 问题代码 - Python
650
+
651
+ ```python
652
+ @app.get("/api/v1/products")
653
+ async def list_products(
654
+ page: int = 1,
655
+ per_page: int = 10, # 无上限校验
656
+ ):
657
+ # 攻击者请求 ?per_page=1000000 → OOM
658
+ offset = (page - 1) * per_page
659
+ products = await db.execute(
660
+ f"SELECT * FROM products LIMIT {per_page} OFFSET {offset}"
661
+ )
662
+ return {"data": products}
663
+ ```
664
+
665
+ ### 修复代码 - Python
666
+
667
+ ```python
668
+ from fastapi import Query
669
+
670
+ MAX_PAGE_SIZE = 100
671
+ DEFAULT_PAGE_SIZE = 20
672
+
673
+ @app.get("/api/v1/products")
674
+ async def list_products(
675
+ page: int = Query(1, ge=1, le=10000), # 页码上限
676
+ per_page: int = Query(DEFAULT_PAGE_SIZE, ge=1, le=MAX_PAGE_SIZE), # 强制上限
677
+ ):
678
+ offset = (page - 1) * per_page
679
+ products = await db.execute(
680
+ "SELECT * FROM products ORDER BY id LIMIT $1 OFFSET $2",
681
+ per_page, offset,
682
+ )
683
+
684
+ # 深度分页保护:offset 过大时建议使用 cursor
685
+ if offset > 10000:
686
+ return JSONResponse(
687
+ status_code=400,
688
+ content={"error": {"code": "DEEP_PAGINATION", "message": "请使用 cursor 分页"}},
689
+ )
690
+
691
+ return {"data": products}
692
+ ```
693
+
694
+ ### 修复代码 - Node.js
695
+
696
+ ```ts
697
+ const MAX_PAGE_SIZE = 100;
698
+ const DEFAULT_PAGE_SIZE = 20;
699
+
700
+ app.get('/api/v1/products', async (req, res) => {
701
+ const page = Math.max(1, Math.min(10000, parseInt(req.query.page as string) || 1));
702
+ const perPage = Math.max(1, Math.min(MAX_PAGE_SIZE, parseInt(req.query.per_page as string) || DEFAULT_PAGE_SIZE));
703
+ const skip = (page - 1) * perPage;
704
+
705
+ if (skip > 10000) {
706
+ return res.status(400).json({
707
+ error: { code: 'DEEP_PAGINATION', message: '请使用 cursor 分页' },
708
+ });
709
+ }
710
+
711
+ const products = await prisma.product.findMany({
712
+ skip,
713
+ take: perPage,
714
+ orderBy: { id: 'asc' },
715
+ });
716
+
717
+ res.json({ data: products });
718
+ });
719
+ ```
720
+
721
+ **检测方法**:对所有分页接口发送 `per_page=999999`,确认返回 400 或被截断到上限值。
722
+
723
+ ---
724
+
725
+ ## 8. Fat Controller
726
+
727
+ **问题**:Controller/Handler 中堆满业务逻辑、数据库操作、外部调用、数据转换,违反单一职责原则,无法测试和复用。
728
+
729
+ ### 问题代码 - Python
730
+
731
+ ```python
732
+ @app.post("/api/v1/orders")
733
+ async def create_order(request: Request):
734
+ body = await request.json()
735
+
736
+ # 参数校验(应在 schema 层)
737
+ if not body.get("customer_id"):
738
+ raise HTTPException(400, "customer_id required")
739
+ if not body.get("items") or len(body["items"]) == 0:
740
+ raise HTTPException(400, "items required")
741
+
742
+ # 业务逻辑(应在 service 层)
743
+ customer = await db.execute("SELECT * FROM customers WHERE id = $1", body["customer_id"])
744
+ if not customer:
745
+ raise HTTPException(404, "customer not found")
746
+
747
+ total = 0
748
+ for item in body["items"]:
749
+ product = await db.execute("SELECT * FROM products WHERE id = $1", item["product_id"])
750
+ if product["stock"] < item["quantity"]:
751
+ raise HTTPException(400, f"库存不足: {product['name']}")
752
+ total += product["price"] * item["quantity"]
753
+
754
+ # 数据库操作(应在 repository 层)
755
+ order_id = await db.execute(
756
+ "INSERT INTO orders (customer_id, total, status) VALUES ($1, $2, 'pending') RETURNING id",
757
+ body["customer_id"], total,
758
+ )
759
+ for item in body["items"]:
760
+ await db.execute(
761
+ "INSERT INTO order_items (order_id, product_id, quantity) VALUES ($1, $2, $3)",
762
+ order_id, item["product_id"], item["quantity"],
763
+ )
764
+ await db.execute(
765
+ "UPDATE products SET stock = stock - $1 WHERE id = $2",
766
+ item["quantity"], item["product_id"],
767
+ )
768
+
769
+ # 发送通知(应在事件/消息层)
770
+ await send_email(customer["email"], f"订单 {order_id} 已创建")
771
+ await send_sms(customer["phone"], f"订单 {order_id} 已创建")
772
+
773
+ return {"id": order_id, "total": total}
774
+ ```
775
+
776
+ ### 修复代码 - Python
777
+
778
+ ```python
779
+ # schema 层:参数校验
780
+ class OrderItemCreate(BaseModel):
781
+ product_id: str
782
+ quantity: int = Field(ge=1)
783
+
784
+ class OrderCreate(BaseModel):
785
+ customer_id: str
786
+ items: list[OrderItemCreate] = Field(min_length=1)
787
+
788
+ # service 层:业务逻辑
789
+ class OrderService:
790
+ def __init__(self, order_repo: OrderRepository, product_repo: ProductRepository,
791
+ customer_repo: CustomerRepository, notifier: Notifier):
792
+ self.order_repo = order_repo
793
+ self.product_repo = product_repo
794
+ self.customer_repo = customer_repo
795
+ self.notifier = notifier
796
+
797
+ async def create_order(self, data: OrderCreate) -> Order:
798
+ customer = await self.customer_repo.get_or_raise(data.customer_id)
799
+ await self._validate_stock(data.items)
800
+
801
+ total = await self._calculate_total(data.items)
802
+ order = await self.order_repo.create(
803
+ customer_id=data.customer_id, items=data.items, total=total,
804
+ )
805
+ await self._deduct_stock(data.items)
806
+
807
+ # 异步发送通知(不阻塞响应)
808
+ asyncio.create_task(self.notifier.order_created(customer, order))
809
+ return order
810
+
811
+ # controller 层:仅处理 HTTP 关注点
812
+ @app.post("/api/v1/orders", status_code=201)
813
+ async def create_order(
814
+ data: OrderCreate,
815
+ service: OrderService = Depends(get_order_service),
816
+ ):
817
+ order = await service.create_order(data)
818
+ return {"id": order.id, "total": order.total}
819
+ ```
820
+
821
+ **检测方法**:Controller 函数超过 30 行即需拆分;Controller 中不应出现直接 SQL 查询。
822
+
823
+ ---
824
+
825
+ ## 9. 无输入验证
826
+
827
+ **问题**:信任客户端输入,不做类型、范围、格式校验,导致 SQL 注入、XSS、数据损坏等安全和数据完整性问题。
828
+
829
+ ### 问题代码 - Python
830
+
831
+ ```python
832
+ @app.get("/api/v1/users")
833
+ async def search_users(request: Request):
834
+ name = request.query_params.get("name", "")
835
+ # SQL 注入:name = "'; DROP TABLE users; --"
836
+ users = await db.execute(f"SELECT * FROM users WHERE name LIKE '%{name}%'")
837
+
838
+ role = request.query_params.get("role")
839
+ # 无枚举校验:role 可以是任意值
840
+ if role:
841
+ users = [u for u in users if u["role"] == role]
842
+
843
+ return {"data": users}
844
+
845
+ @app.post("/api/v1/users")
846
+ async def create_user(request: Request):
847
+ body = await request.json()
848
+ # 无任何校验直接入库
849
+ await db.execute(
850
+ "INSERT INTO users (name, email, age) VALUES ($1, $2, $3)",
851
+ body.get("name"), body.get("email"), body.get("age"),
852
+ )
853
+ ```
854
+
855
+ ### 修复代码 - Python
856
+
857
+ ```python
858
+ from pydantic import BaseModel, Field, EmailStr, field_validator
859
+ from typing import Literal
860
+ import re
861
+
862
+ class UserCreate(BaseModel):
863
+ name: str = Field(min_length=1, max_length=100)
864
+ email: EmailStr
865
+ age: int = Field(ge=0, le=150)
866
+ role: Literal["user", "admin", "moderator"] = "user"
867
+
868
+ @field_validator("name")
869
+ @classmethod
870
+ def validate_name(cls, v: str) -> str:
871
+ if re.search(r"[<>\"';]", v):
872
+ raise ValueError("名称包含非法字符")
873
+ return v.strip()
874
+
875
+ @app.get("/api/v1/users")
876
+ async def search_users(
877
+ name: str = Query("", max_length=100),
878
+ role: Literal["user", "admin", "moderator"] | None = None,
879
+ ):
880
+ # 参数化查询,防止 SQL 注入
881
+ query = "SELECT * FROM users WHERE name ILIKE $1"
882
+ params = [f"%{name}%"]
883
+ if role:
884
+ query += " AND role = $2"
885
+ params.append(role)
886
+ users = await db.execute(query, *params)
887
+ return {"data": users}
888
+
889
+ @app.post("/api/v1/users", status_code=201)
890
+ async def create_user(data: UserCreate):
891
+ # Pydantic 自动校验类型、范围、格式
892
+ await db.execute(
893
+ "INSERT INTO users (name, email, age, role) VALUES ($1, $2, $3, $4)",
894
+ data.name, data.email, data.age, data.role,
895
+ )
896
+ ```
897
+
898
+ ### 修复代码 - Node.js
899
+
900
+ ```ts
901
+ import { z } from 'zod';
902
+
903
+ const UserCreateSchema = z.object({
904
+ name: z.string().min(1).max(100).regex(/^[^<>"';]*$/),
905
+ email: z.string().email(),
906
+ age: z.number().int().min(0).max(150),
907
+ role: z.enum(['user', 'admin', 'moderator']).default('user'),
908
+ });
909
+
910
+ app.post('/api/v1/users', async (req, res) => {
911
+ const result = UserCreateSchema.safeParse(req.body);
912
+ if (!result.success) {
913
+ return res.status(400).json({
914
+ error: {
915
+ code: 'VALIDATION_ERROR',
916
+ details: result.error.issues.map(i => ({
917
+ field: i.path.join('.'),
918
+ message: i.message,
919
+ })),
920
+ },
921
+ });
922
+ }
923
+
924
+ // 参数化查询
925
+ await prisma.user.create({ data: result.data });
926
+ res.status(201).json({ status: 'created' });
927
+ });
928
+ ```
929
+
930
+ **检测方法**:搜索字符串拼接 SQL(`f"SELECT`、`"SELECT ... " +`);所有 POST/PUT/PATCH 必须有 schema 校验。
931
+
932
+ ---
933
+
934
+ ## 10. 硬编码配置
935
+
936
+ **问题**:数据库地址、API 密钥、端口号等写死在代码中,无法在不同环境(开发/测试/生产)间切换,且密钥可能泄漏到版本库。
937
+
938
+ ### 问题代码 - Python
939
+
940
+ ```python
941
+ import psycopg2
942
+
943
+ # 数据库密码直接写在代码中 → 提交到 Git 后泄漏
944
+ conn = psycopg2.connect(
945
+ host="192.168.1.100",
946
+ port=5432,
947
+ dbname="prod_db",
948
+ user="admin",
949
+ password="super_secret_password_123",
950
+ )
951
+
952
+ # API Key 硬编码
953
+ STRIPE_API_KEY = "sk_live_abc123def456"
954
+
955
+ # 服务地址硬编码
956
+ NOTIFICATION_URL = "https://notification.prod.example.com"
957
+ ```
958
+
959
+ ### 修复代码 - Python
960
+
961
+ ```python
962
+ from pydantic_settings import BaseSettings
963
+
964
+ class Settings(BaseSettings):
965
+ # 从环境变量读取,支持 .env 文件
966
+ database_url: str
967
+ redis_url: str = "redis://localhost:6379"
968
+ stripe_api_key: str
969
+ notification_url: str
970
+ debug: bool = False
971
+ log_level: str = "INFO"
972
+
973
+ # 校验必填项
974
+ model_config = {
975
+ "env_file": ".env",
976
+ "env_file_encoding": "utf-8",
977
+ }
978
+
979
+ settings = Settings()
980
+
981
+ # 使用
982
+ conn = await asyncpg.connect(settings.database_url)
983
+ ```
984
+
985
+ ### 修复代码 - Node.js
986
+
987
+ ```ts
988
+ // config.ts
989
+ import { z } from 'zod';
990
+ import dotenv from 'dotenv';
991
+
992
+ dotenv.config();
993
+
994
+ const ConfigSchema = z.object({
995
+ DATABASE_URL: z.string().url(),
996
+ REDIS_URL: z.string().url().default('redis://localhost:6379'),
997
+ STRIPE_API_KEY: z.string().startsWith('sk_'),
998
+ NOTIFICATION_URL: z.string().url(),
999
+ NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),
1000
+ PORT: z.coerce.number().default(3000),
1001
+ });
1002
+
1003
+ // 应用启动时校验,缺失直接报错退出
1004
+ export const config = ConfigSchema.parse(process.env);
1005
+ ```
1006
+
1007
+ ```bash
1008
+ # .env(不提交到 Git)
1009
+ DATABASE_URL=postgresql://admin:secret@localhost:5432/mydb
1010
+ STRIPE_API_KEY=sk_test_xxx
1011
+ NOTIFICATION_URL=https://notification.dev.example.com
1012
+
1013
+ # .env.example(提交到 Git,仅含占位符)
1014
+ DATABASE_URL=postgresql://user:password@localhost:5432/dbname
1015
+ STRIPE_API_KEY=sk_test_xxx
1016
+ NOTIFICATION_URL=https://notification.example.com
1017
+ ```
1018
+
1019
+ ```gitignore
1020
+ # .gitignore
1021
+ .env
1022
+ .env.local
1023
+ .env.production
1024
+ ```
1025
+
1026
+ **检测方法**:
1027
+
1028
+ ```bash
1029
+ # 搜索硬编码密钥
1030
+ grep -rn "password\s*=" --include="*.py" --include="*.ts" src/
1031
+ grep -rn "sk_live_\|sk_test_\|api_key\s*=" src/
1032
+
1033
+ # 使用 gitleaks 扫描
1034
+ gitleaks detect --source=. --verbose
1035
+ ```
1036
+
1037
+ ---
1038
+
1039
+ ## Agent Checklist
1040
+
1041
+ - [ ] 所有列表查询已检查 N+1 问题(使用 JOIN/include/prefetch)
1042
+ - [ ] 数据库连接使用连接池,连接数有上限
1043
+ - [ ] 异步框架中无同步阻塞调用(requests → httpx、readFileSync → readFile)
1044
+ - [ ] 所有 HTTP 调用和数据库查询有超时设置
1045
+ - [ ] 外部调用有重试策略(指数退避 + 抖动 + 仅对 5xx 重试)
1046
+ - [ ] 创建/支付类接口支持幂等键(Idempotency-Key)
1047
+ - [ ] 分页接口有 per_page 上限和深度分页保护
1048
+ - [ ] Controller 不超过 30 行,业务逻辑在 Service 层
1049
+ - [ ] 所有输入有 schema 校验,SQL 使用参数化查询
1050
+ - [ ] 无硬编码配置/密钥,敏感值通过环境变量注入
1051
+ - [ ] .env 文件已加入 .gitignore,.env.example 仅含占位符