{"id":27496,"date":"2025-10-14T08:06:09","date_gmt":"2025-10-14T00:06:09","guid":{"rendered":"https:\/\/aif.amtbbs.org\/?p=27496"},"modified":"2025-10-14T08:06:09","modified_gmt":"2025-10-14T00:06:09","slug":"%e9%87%8d%e6%96%b0%e5%ae%9a%e4%b9%89ai%e7%bc%96%e7%a8%8b%e5%8d%8f%e4%bd%9c%ef%bc%9a%e6%b7%b1%e5%85%a5%e8%a7%a3%e6%9e%90claude-code%e5%a4%9a%e6%99%ba%e8%83%bd%e4%bd%93%e7%b3%bb%e7%bb%9f%e6%9e%b6","status":"publish","type":"post","link":"https:\/\/aif.amtbbs.org\/index.php\/2025\/10\/14\/27496\/","title":{"rendered":"\u91cd\u65b0\u5b9a\u4e49AI\u7f16\u7a0b\u534f\u4f5c\uff1a\u6df1\u5165\u89e3\u6790Claude Code\u591a\u667a\u80fd\u4f53\u7cfb\u7edf\u67b6\u6784"},"content":{"rendered":"<div class=\"article-desc\">\u60f3\u8c61\u4e00\u4e0b:\u5f53\u4f60\u9700\u8981\u5f00\u53d1\u4e00\u4e2a\u5168\u6808\u529f\u80fd\u65f6,\u540e\u7aef\u67b6\u6784\u5e08\u667a\u80fd\u4f53\u8d1f\u8d23API\u8bbe\u8ba1,\u6570\u636e\u5e93\u67b6\u6784\u5e08\u667a\u80fd\u4f53\u5904\u7406\u6570\u636e\u5efa\u6a21,\u524d\u7aef\u5f00\u53d1\u8005\u667a\u80fd\u4f53\u6784\u5efaUI\u7ec4\u4ef6,\u5b89\u5168\u5ba1\u8ba1\u5458\u667a\u80fd\u4f53\u626b\u63cf\u6f0f\u6d1e,\u6d4b\u8bd5\u81ea\u52a8\u5316\u667a\u80fd\u4f53\u7f16\u5199\u6d4b\u8bd5\u7528\u4f8b,\u90e8\u7f72\u5de5\u7a0b\u5e08\u667a\u80fd\u4f53\u914d\u7f6eCI\/CD&#8230;\u8fd9\u4e0d\u662f\u79d1\u5e7b,\u800c\u662f\u4f60\u4eca\u5929\u5c31\u80fd\u7528\u4e0a\u7684\u6280\u672f\u73b0\u5b9e\u3002<\/div>\n<div id=\"postspictures\" class=\"article-content\">\n<div id=\"container\" class=\"container am-engine\" data-v-01a18e2f=\"\" data-element=\"root\">\n<h2>\u5f15\u8a00\uff1a\u7ad9\u5728AI\u7f16\u7a0b\u7684\u5341\u5b57\u8def\u53e3<\/h2>\n<p>2025\u5e74\u7684\u8f6f\u4ef6\u5f00\u53d1\u9886\u57df\u6b63\u7ecf\u5386\u7740\u4e00\u573a\u9759\u6084\u6084\u7684\u9769\u547d\u3002\u5982\u679c\u4f60\u8fd8\u505c\u7559\u5728&#8221;AI\u53ea\u80fd\u5199\u5199\u7b80\u5355\u4ee3\u7801&#8221;\u7684\u8ba4\u77e5\u5c42\u9762,\u90a3\u4e48\u4f60\u5373\u5c06\u9519\u8fc7\u8fd9\u4e2a\u65f6\u4ee3\u6700\u6fc0\u52a8\u4eba\u5fc3\u7684\u6280\u672f\u7a81\u7834\u3002\u4eca\u5929,\u6211\u4eec\u8981\u6df1\u5165\u63a2\u8ba8\u7684Claude Code Agents\u7cfb\u7edf,\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u4ee3\u7801\u751f\u6210\u5de5\u5177\u2014\u2014\u5b83\u662f\u4e00\u4e2a\u753184\u4e2a\u4e13\u4e1a\u667a\u80fd\u4f53\u300115\u4e2a\u5de5\u4f5c\u6d41\u7f16\u6392\u5668\u548c42\u4e2a\u5f00\u53d1\u5de5\u5177\u7ec4\u6210\u7684\u5b8c\u6574\u751f\u4ea7\u7ea7\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u7cfb\u7edf\u3002<\/p>\n<p>\u60f3\u8c61\u4e00\u4e0b:\u5f53\u4f60\u9700\u8981\u5f00\u53d1\u4e00\u4e2a\u5168\u6808\u529f\u80fd\u65f6,\u540e\u7aef\u67b6\u6784\u5e08\u667a\u80fd\u4f53\u8d1f\u8d23API\u8bbe\u8ba1,\u6570\u636e\u5e93\u67b6\u6784\u5e08\u667a\u80fd\u4f53\u5904\u7406\u6570\u636e\u5efa\u6a21,\u524d\u7aef\u5f00\u53d1\u8005\u667a\u80fd\u4f53\u6784\u5efaUI\u7ec4\u4ef6,\u5b89\u5168\u5ba1\u8ba1\u5458\u667a\u80fd\u4f53\u626b\u63cf\u6f0f\u6d1e,\u6d4b\u8bd5\u81ea\u52a8\u5316\u667a\u80fd\u4f53\u7f16\u5199\u6d4b\u8bd5\u7528\u4f8b,\u90e8\u7f72\u5de5\u7a0b\u5e08\u667a\u80fd\u4f53\u914d\u7f6eCI\/CD&#8230;\u8fd9\u4e0d\u662f\u79d1\u5e7b,\u800c\u662f\u4f60\u4eca\u5929\u5c31\u80fd\u7528\u4e0a\u7684\u6280\u672f\u73b0\u5b9e\u3002<\/p>\n<p>\u672c\u6587\u5c06\u5e26\u4f60\u6df1\u5165\u8fd9\u4e2a\u7cfb\u7edf\u7684\u6bcf\u4e00\u4e2a\u6280\u672f\u7ec6\u8282,\u4ece\u67b6\u6784\u8bbe\u8ba1\u5230\u5b9e\u9645\u5e94\u7528,\u4ece\u6280\u672f\u539f\u7406\u5230\u6700\u4f73\u5b9e\u8df5,\u8ba9\u4f60\u4e0d\u4ec5\u80fd\u770b\u61c2,\u66f4\u80fd\u7528\u597d\u8fd9\u5957\u9769\u547d\u6027\u7684\u5f00\u53d1\u5de5\u5177\u3002<\/p>\n<h2>\u7b2c\u4e00\u90e8\u5206\uff1a\u6280\u672f\u67b6\u6784\u6df1\u5ea6\u5256\u6790<\/h2>\n<h3>1.1 \u7cfb\u7edf\u5168\u666f\uff1a\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u7684\u4e09\u5c42\u67b6\u6784<\/h3>\n<p>Claude Code Agents\u91c7\u7528\u4e86\u4e00\u79cd\u6781\u5176\u5de7\u5999\u7684\u4e09\u5c42\u67b6\u6784\u8bbe\u8ba1,\u8fd9\u79cd\u8bbe\u8ba1\u65e2\u4fdd\u8bc1\u4e86\u7cfb\u7edf\u7684\u7075\u6d3b\u6027,\u53c8\u786e\u4fdd\u4e86\u5404\u4e2a\u7ec4\u4ef6\u4e4b\u95f4\u7684\u9ad8\u6548\u534f\u4f5c:<\/p>\n<h4>\u7b2c\u4e00\u5c42\uff1a\u4e13\u4e1a\u667a\u80fd\u4f53\u5c42(84\u4e2a\u9886\u57df\u4e13\u5bb6)<\/h4>\n<p>\u8fd9\u662f\u7cfb\u7edf\u7684\u6838\u5fc3\u8d44\u4ea7\u5c42,\u6bcf\u4e2a\u667a\u80fd\u4f53\u90fd\u662f\u4e00\u4e2a\u9ad8\u5ea6\u4e13\u4e1a\u5316\u7684&#8221;\u6570\u5b57\u5458\u5de5&#8221;\u3002\u8ba9\u6211\u4eec\u6765\u770b\u770b\u5b83\u4eec\u7684\u5206\u7c7b\u903b\u8f91:<\/p>\n<p>\u67b6\u6784\u4e0e\u7cfb\u7edf\u8bbe\u8ba1\u7c7b(7\u4e2a\u667a\u80fd\u4f53)<\/p>\n<ul data-id=\"u738a58b-1DPiNh4e\">\n<li data-id=\"ld70c578-CZCaMFZe\"><code>backend-architect<\/code>: \u540e\u7aef\u7cfb\u7edf\u67b6\u6784\u4e13\u5bb6,\u7cbe\u901aRESTful\/GraphQL\/gRPC API\u8bbe\u8ba1\u3001\u5fae\u670d\u52a1\u67b6\u6784\u3001\u4e8b\u4ef6\u9a71\u52a8\u7cfb\u7edf<\/li>\n<li data-id=\"ld70c578-76BaHInI\"><code>frontend-developer<\/code>: \u524d\u7aef\u5f00\u53d1\u4e13\u5bb6,\u638c\u63e1React\/Vue\/Angular\u7ec4\u4ef6\u8bbe\u8ba1\u3001\u72b6\u6001\u7ba1\u7406\u3001\u54cd\u5e94\u5f0f\u5e03\u5c40<\/li>\n<li data-id=\"ld70c578-mCOCc4JJ\"><code>cloud-architect<\/code>: \u4e91\u67b6\u6784\u4e13\u5bb6,\u4e13\u6ce8AWS\/Azure\/GCP\u57fa\u7840\u8bbe\u65bd\u8bbe\u8ba1\u4e0e\u6210\u672c\u4f18\u5316<\/li>\n<li data-id=\"ld70c578-HmHWMnZ1\"><code>kubernetes-architect<\/code>: K8s\u67b6\u6784\u4e13\u5bb6,\u4e91\u539f\u751f\u67b6\u6784\u3001GitOps\u5de5\u4f5c\u6d41<\/li>\n<li data-id=\"ld70c578-Hh4lAM5H\"><code>database-architect<\/code>: \u6570\u636e\u5e93\u67b6\u6784\u4e13\u5bb6,\u4ece\u96f6\u8bbe\u8ba1\u6570\u636e\u5e93\u3001\u6280\u672f\u9009\u578b\u3001schema\u5efa\u6a21<\/li>\n<\/ul>\n<p>\u8fd9\u91cc\u6709\u4e2a\u6709\u8da3\u7684\u8bbe\u8ba1\u54f2\u5b66:\u804c\u8d23\u5206\u79bb\u539f\u5219(Separation of Concerns)\u3002\u4f8b\u5982,<code>backend-architect<\/code>\u4f1a\u660e\u786e\u58f0\u660e:&#8221;\u6211\u4e13\u6ce8\u4e8e\u670d\u52a1\u67b6\u6784\u548cAPI,\u6570\u636e\u5e93schema\u8bbe\u8ba1\u8bf7\u627e<code>database-architect<\/code>&#8220;\u3002\u8fd9\u79cd\u8bbe\u8ba1\u907f\u514d\u4e86\u804c\u8d23\u91cd\u53e0\u5bfc\u81f4\u7684\u6df7\u4e71,\u786e\u4fdd\u6bcf\u4e2a\u667a\u80fd\u4f53\u90fd\u5728\u81ea\u5df1\u7684\u4e13\u4e1a\u9886\u57df\u53d1\u6325\u6700\u5927\u4ef7\u503c\u3002<\/p>\n<p>\u7f16\u7a0b\u8bed\u8a00\u4e13\u5bb6\u7c7b(18\u4e2a\u667a\u80fd\u4f53)\u4ece\u7cfb\u7edf\u7ea7\u8bed\u8a00\u5230Web\u5f00\u53d1,\u4ece\u4f01\u4e1a\u7ea7\u5230\u6e38\u620f\u5f00\u53d1,\u5e94\u6709\u5c3d\u6709:<\/p>\n<ul data-id=\"u738a58b-mIRQD9jE\">\n<li data-id=\"ld70c578-jFAnQ0pd\">\u7cfb\u7edf\u7ea7:<code>c-pro<\/code>,\u00a0<code>cpp-pro<\/code>,\u00a0<code>rust-pro<\/code>,\u00a0<code>golang-pro<\/code><\/li>\n<li data-id=\"ld70c578-Xq29PcU3\">Web\u5e94\u7528:<code>javascript-pro<\/code>,\u00a0<code>typescript-pro<\/code>,\u00a0<code>python-pro<\/code>,\u00a0<code>ruby-pro<\/code>,\u00a0<code>php-pro<\/code><\/li>\n<li data-id=\"ld70c578-T79FaY6f\">\u4f01\u4e1a\u7ea7:<code>java-pro<\/code>,\u00a0<code>scala-pro<\/code>,\u00a0<code>csharp-pro<\/code><\/li>\n<li data-id=\"ld70c578-1ascJSqA\">\u4e13\u7528\u5e73\u53f0:<code>elixir-pro<\/code>,\u00a0<code>django-pro<\/code>,\u00a0<code>fastapi-pro<\/code>,\u00a0<code>unity-developer<\/code><\/li>\n<\/ul>\n<p>\u6bcf\u4e2a\u667a\u80fd\u4f53\u4e0d\u4ec5\u7cbe\u901a\u8bed\u8a00\u672c\u8eab,\u8fd8\u638c\u63e1\u8be5\u8bed\u8a00\u751f\u6001\u7cfb\u7edf\u7684\u6700\u4f73\u5b9e\u8df5\u3001\u6027\u80fd\u4f18\u5316\u6280\u5de7\u548c\u5e38\u89c1\u9677\u9631\u3002<\/p>\n<p>\u57fa\u7840\u8bbe\u65bd\u4e0e\u8fd0\u7ef4\u7c7b(10\u4e2a\u667a\u80fd\u4f53)<\/p>\n<ul data-id=\"u738a58b-RUgXl5Dj\">\n<li data-id=\"ld70c578-kGrDsJQm\"><code>deployment-engineer<\/code>: CI\/CD\u7ba1\u9053\u3001\u5bb9\u5668\u5316\u3001\u4e91\u90e8\u7f72<\/li>\n<li data-id=\"ld70c578-jtMjnHQB\"><code>devops-troubleshooter<\/code>: \u751f\u4ea7\u73af\u5883\u8c03\u8bd5\u3001\u65e5\u5fd7\u5206\u6790<\/li>\n<li data-id=\"ld70c578-37t0lcqT\"><code>terraform-specialist<\/code>: \u57fa\u7840\u8bbe\u65bd\u5373\u4ee3\u7801\u4e13\u5bb6<\/li>\n<li data-id=\"ld70c578-yDiBYocm\"><code>database-optimizer<\/code>: \u67e5\u8be2\u4f18\u5316\u3001\u7d22\u5f15\u8bbe\u8ba1<\/li>\n<li data-id=\"ld70c578-wGfanRrC\"><code>observability-engineer<\/code>: \u5206\u5e03\u5f0f\u8ffd\u8e2a\u3001SLI\/SLO\u7ba1\u7406<\/li>\n<\/ul>\n<p>\u8d28\u91cf\u4fdd\u969c\u4e0e\u5b89\u5168\u7c7b(9\u4e2a\u667a\u80fd\u4f53)\u8fd9\u662f\u7cfb\u7edf\u7684&#8221;\u5b88\u95e8\u4eba&#8221;\u5c42:<\/p>\n<ul data-id=\"u738a58b-Co0RNPDT\">\n<li data-id=\"ld70c578-iiFXFyI1\"><code>security-auditor<\/code>: \u6f0f\u6d1e\u8bc4\u4f30\u3001OWASP\u5408\u89c4\u68c0\u67e5(\u4f7f\u7528Opus\u6a21\u578b,\u6700\u5f3a\u7b97\u529b)<\/li>\n<li data-id=\"ld70c578-FnJPXDfd\"><code>backend-security-coder<\/code>: \u5b89\u5168\u7f16\u7801\u5b9e\u8df5\u3001API\u5b89\u5168\u5b9e\u73b0<\/li>\n<li data-id=\"ld70c578-jNMhjIEc\"><code>frontend-security-coder<\/code>: XSS\u9632\u62a4\u3001CSP\u5b9e\u65bd<\/li>\n<li data-id=\"ld70c578-5fYUW1FH\"><code>test-automator<\/code>: \u5168\u65b9\u4f4d\u6d4b\u8bd5(\u5355\u5143\/\u96c6\u6210\/E2E)<\/li>\n<li data-id=\"ld70c578-04zwKaTI\"><code>performance-engineer<\/code>: \u5e94\u7528\u6027\u80fd\u5206\u6790\u4e0e\u4f18\u5316<\/li>\n<\/ul>\n<p>\u6ce8\u610f\u5230\u4e00\u4e2a\u7ec6\u8282\u6ca1\u6709?\u5b89\u5168\u76f8\u5173\u7684\u667a\u80fd\u4f53\u90fd\u4f7f\u7528Opus\u6a21\u578b(Claude\u6700\u5f3a\u5927\u7684\u6a21\u578b),\u56e0\u4e3a\u5b89\u5168\u65e0\u5c0f\u4e8b,\u5fc5\u987b\u7528\u6700\u5f3a\u7684\u63a8\u7406\u80fd\u529b\u6765\u4fdd\u969c\u3002<\/p>\n<p>\u6570\u636e\u4e0eAI\u7c7b(6\u4e2a\u667a\u80fd\u4f53)<\/p>\n<ul data-id=\"u738a58b-IllUiQdk\">\n<li data-id=\"ld70c578-80MbrfAQ\"><code>ai-engineer<\/code>: \u751f\u4ea7\u7ea7LLM\u5e94\u7528\u3001RAG\u7cfb\u7edf\u3001\u667a\u80fd\u4ee3\u7406\u67b6\u6784(Opus\u6a21\u578b)<\/li>\n<li data-id=\"ld70c578-4RoBp0EF\"><code>ml-engineer<\/code>: ML\u7ba1\u9053\u3001\u6a21\u578b\u670d\u52a1\u3001\u7279\u5f81\u5de5\u7a0b(Opus\u6a21\u578b)<\/li>\n<li data-id=\"ld70c578-LewVEz7t\"><code>mlops-engineer<\/code>: ML\u57fa\u7840\u8bbe\u65bd\u3001\u5b9e\u9a8c\u8ddf\u8e2a(Opus\u6a21\u578b)<\/li>\n<li data-id=\"ld70c578-X09mCWx8\"><code>data-scientist<\/code>: \u6570\u636e\u5206\u6790\u3001SQL\u67e5\u8be2\u3001BigQuery\u64cd\u4f5c(Opus\u6a21\u578b)<\/li>\n<li data-id=\"ld70c578-nynu4hvU\"><code>data-engineer<\/code>: ETL\u7ba1\u9053\u3001\u6570\u636e\u4ed3\u5e93\u3001\u6d41\u5f0f\u67b6\u6784<\/li>\n<\/ul>\n<p>\u6587\u6863\u4e0e\u6280\u672f\u5199\u4f5c\u7c7b(5\u4e2a\u667a\u80fd\u4f53)<\/p>\n<ul data-id=\"u738a58b-CLrjY3C2\">\n<li data-id=\"ld70c578-IHLrnuaa\"><code>docs-architect<\/code>: \u5168\u9762\u6280\u672f\u6587\u6863\u751f\u6210(Opus\u6a21\u578b)<\/li>\n<li data-id=\"ld70c578-fUvxw7Bd\"><code>api-documenter<\/code>: OpenAPI\/Swagger\u89c4\u8303<\/li>\n<li data-id=\"ld70c578-yyLf5Em0\"><code>tutorial-engineer<\/code>: \u9010\u6b65\u6559\u7a0b\u521b\u4f5c<\/li>\n<li data-id=\"ld70c578-Ypc5v6Oy\"><code>mermaid-expert<\/code>: \u6d41\u7a0b\u56fe\u3001\u65f6\u5e8f\u56fe\u3001ER\u56fe\u521b\u5efa<\/li>\n<\/ul>\n<p>\u4e1a\u52a1\u4e0e\u8fd0\u8425\u7c7b(13\u4e2a\u667a\u80fd\u4f53)\u5305\u62ec\u4e1a\u52a1\u5206\u6790\u3001\u5e02\u573a\u8425\u9500\u3001\u5ba2\u6237\u652f\u6301\u3001\u6cd5\u52a1\u3001HR\u7b49\u9886\u57df\u4e13\u5bb6,\u8986\u76d6\u8f6f\u4ef6\u5f00\u53d1\u7684\u975e\u6280\u672f\u9762\u3002<\/p>\n<p>SEO\u4f18\u5316\u7c7b(10\u4e2a\u667a\u80fd\u4f53)\u4e13\u95e8\u9488\u5bf9\u641c\u7d22\u5f15\u64ce\u4f18\u5316\u7684\u7cbe\u7ec6\u5316\u5206\u5de5:<\/p>\n<ul data-id=\"u738a58b-QIMchmVD\">\n<li data-id=\"ld70c578-h3C7ZEO1\"><code>seo-content-auditor<\/code>: \u5185\u5bb9\u8d28\u91cf\u5206\u6790\u3001E-E-A-T\u4fe1\u53f7\u8bc4\u4f30<\/li>\n<li data-id=\"ld70c578-YWxKmIyF\"><code>seo-keyword-strategist<\/code>: \u5173\u952e\u8bcd\u5206\u6790\u4e0e\u8bed\u4e49\u53d8\u5316<\/li>\n<li data-id=\"ld70c578-xeTbiu32\"><code>seo-structure-architect<\/code>: \u5185\u5bb9\u7ed3\u6784\u4e0eschema\u6807\u8bb0<\/li>\n<li data-id=\"ld70c578-LfexbuLn\"><code>seo-snippet-hunter<\/code>: \u7279\u8272\u7247\u6bb5\u683c\u5f0f\u5316<\/li>\n<li data-id=\"ld70c578-my5Yk3e1\"><code>seo-cannibalization-detector<\/code>: \u5173\u952e\u8bcd\u91cd\u53e0\u68c0\u6d4b<\/li>\n<\/ul>\n<h4>\u7b2c\u4e8c\u5c42\uff1a\u5de5\u4f5c\u6d41\u7f16\u6392\u5c42(15\u4e2a\u7f16\u6392\u5668)<\/h4>\n<p>\u5982\u679c\u8bf4\u667a\u80fd\u4f53\u662f\u4e50\u624b,\u90a3\u7f16\u6392\u5668\u5c31\u662f\u6307\u6325\u5bb6\u3002\u6bcf\u4e2a\u7f16\u6392\u5668\u5b9a\u4e49\u4e86\u4e00\u5957\u5b8c\u6574\u7684\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u6d41\u7a0b:<\/p>\n<p>1.\u00a0<code>full-stack-feature<\/code>(\u5168\u6808\u529f\u80fd\u5f00\u53d1)\u4e00\u4e2a\u6559\u79d1\u4e66\u7ea7\u7684\u7f16\u6392\u6848\u4f8b\u3002\u8ba9\u6211\u4eec\u770b\u770b\u5b83\u7684\u56db\u9636\u6bb5\u534f\u4f5c\u6d41\u7a0b:<\/p>\n<p>\u9636\u6bb51:\u67b6\u6784\u4e0e\u8bbe\u8ba1\u57fa\u7840<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_0\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect \u2192 backend<span class=\"token operator\">-<\/span>architect \u2192 frontend<span class=\"token operator\">-<\/span>developer\r\n      \u2193                    \u2193                    \u2193\r\n   \u6570\u636e\u6a21\u578b            API\u5951\u7ea6            \u7ec4\u4ef6\u67b6\u6784<\/code><\/pre>\n<ul id=\"code_id_0\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u9636\u6bb52:\u5e76\u884c\u5b9e\u73b0<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_1\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">python<span class=\"token operator\">-<\/span>pro        frontend<span class=\"token operator\">-<\/span>developer      <span class=\"token keyword\">sql<\/span><span class=\"token operator\">-<\/span>pro\r\n<span class=\"token punctuation\">(<\/span>\u540e\u7aef\u670d\u52a1<span class=\"token punctuation\">)<\/span>         <span class=\"token punctuation\">(<\/span>\u524d\u7aef\u7ec4\u4ef6<span class=\"token punctuation\">)<\/span>            <span class=\"token punctuation\">(<\/span>\u6570\u636e\u5e93\u4f18\u5316<span class=\"token punctuation\">)<\/span>\r\n   \u2193                    \u2193                    \u2193\r\n\u5b9e\u73b0\u5e76\u53d1\u8fdb\u884c<span class=\"token punctuation\">,<\/span>\u4f46\u57fa\u4e8e\u9636\u6bb5<span class=\"token number\">1<\/span>\u7684\u8f93\u51fa<\/code><\/pre>\n<ul id=\"code_id_1\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u9636\u6bb53:\u96c6\u6210\u4e0e\u6d4b\u8bd5<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_2\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">test<span class=\"token operator\">-<\/span>automator<span class=\"token punctuation\">(<\/span>\u5951\u7ea6\u6d4b\u8bd5<span class=\"token punctuation\">)<\/span> \u2192 test<span class=\"token operator\">-<\/span>automator<span class=\"token punctuation\">(<\/span>E2E\u6d4b\u8bd5<span class=\"token punctuation\">)<\/span> \u2192 security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u5b89\u5168\u5ba1\u8ba1<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_2\" class=\"pre-numbering\">\n<li>1.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u9636\u6bb54:\u90e8\u7f72\u4e0e\u8fd0\u7ef4<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_3\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">deployment<span class=\"token operator\">-<\/span>engineer \u2192 observability<span class=\"token operator\">-<\/span>engineer \u2192 performance<span class=\"token operator\">-<\/span>engineer<\/code><\/pre>\n<ul id=\"code_id_3\" class=\"pre-numbering\">\n<li>1.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u7684\u7cbe\u5999\u4e4b\u5904\u5728\u4e8e:\u4f9d\u8d56\u7ba1\u7406\u6e05\u6670,\u5e76\u884c\u5ea6\u6700\u5927\u5316\u3002\u9636\u6bb51\u5fc5\u987b\u4e32\u884c(\u56e0\u4e3a\u540e\u7aef\u67b6\u6784\u4f9d\u8d56\u6570\u636e\u5e93\u8bbe\u8ba1),\u4f46\u9636\u6bb52\u53ef\u4ee5\u5b8c\u5168\u5e76\u884c(\u56e0\u4e3a\u90fd\u57fa\u4e8e\u9636\u6bb51\u7684\u5951\u7ea6),\u9636\u6bb53\u53c8\u56de\u5230\u4e32\u884c(\u6d4b\u8bd5\u8981\u5728\u5b9e\u73b0\u5b8c\u6210\u540e)\u3002<\/p>\n<p>2.\u00a0<code>security-hardening<\/code>(\u5b89\u5168\u52a0\u56fa)\u8fd9\u662f\u4e00\u4e2a\u9632\u5fa1\u7eb5\u6df1(Defense in Depth)\u7b56\u7565\u7684\u5b8c\u7f8e\u4f53\u73b0:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_4\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u9636\u6bb5<span class=\"token number\">1<\/span>:\u5168\u9762\u8bc4\u4f30\r\n  security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u626b\u63cf<span class=\"token punctuation\">)<\/span> \u2192 security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u5a01\u80c1\u5efa\u6a21<span class=\"token punctuation\">)<\/span> \u2192 backend<span class=\"token operator\">-<\/span>architect<span class=\"token punctuation\">(<\/span>\u67b6\u6784\u5ba1\u67e5<span class=\"token punctuation\">)<\/span>\r\n\r\n\u9636\u6bb5<span class=\"token number\">2<\/span>:\u6f0f\u6d1e\u4fee\u590d\r\n  security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u9ad8\u5371\u4fee\u590d<span class=\"token punctuation\">)<\/span> \u2192 backend<span class=\"token operator\">-<\/span>security<span class=\"token operator\">-<\/span>coder<span class=\"token punctuation\">(<\/span>\u540e\u7aef\u52a0\u56fa<span class=\"token punctuation\">)<\/span> \u2192 frontend<span class=\"token operator\">-<\/span>security<span class=\"token operator\">-<\/span>coder<span class=\"token punctuation\">(<\/span>\u524d\u7aef\u52a0\u56fa<span class=\"token punctuation\">)<\/span>\r\n\r\n\u9636\u6bb5<span class=\"token number\">3<\/span>:\u5b89\u5168\u63a7\u5236\r\n  security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u8ba4\u8bc1\u589e\u5f3a<span class=\"token punctuation\">)<\/span> \u2192 deployment<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>\u57fa\u7840\u8bbe\u65bd\u63a7\u5236<span class=\"token punctuation\">)<\/span> \u2192 deployment<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>\u5bc6\u94a5\u7ba1\u7406<span class=\"token punctuation\">)<\/span>\r\n\r\n\u9636\u6bb5<span class=\"token number\">4<\/span>:\u9a8c\u8bc1\u4e0e\u5408\u89c4\r\n  security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u6e17\u900f\u6d4b\u8bd5<span class=\"token punctuation\">)<\/span> \u2192 security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">(<\/span>\u5408\u89c4\u9a8c\u8bc1<span class=\"token punctuation\">)<\/span> \u2192 devops<span class=\"token operator\">-<\/span>troubleshooter<span class=\"token punctuation\">(<\/span>SIEM\u96c6\u6210<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_4\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6ce8\u610f:\u6bcf\u4e2a\u9636\u6bb5\u7684\u8f93\u51fa\u90fd\u4f1a\u4f5c\u4e3a\u4e0b\u4e00\u9636\u6bb5\u7684\u8f93\u5165\u3002\u4f8b\u5982,\u9636\u6bb51\u7684\u6f0f\u6d1e\u62a5\u544a\u4f1a\u544a\u8bc9\u9636\u6bb52\u8be5\u4fee\u4ec0\u4e48,\u9636\u6bb52\u7684\u4fee\u590d\u4f1a\u5728\u9636\u6bb54\u8fdb\u884c\u9a8c\u8bc1\u3002\u8fd9\u79cd\u53cd\u9988\u95ed\u73af\u8bbe\u8ba1\u786e\u4fdd\u4e86\u5b89\u5168\u52a0\u56fa\u7684\u5168\u9762\u6027\u3002<\/p>\n<p>3.\u00a0<code>ml-pipeline<\/code>(\u673a\u5668\u5b66\u4e60\u7ba1\u9053)\u8fd9\u662fMLOps\u6700\u4f73\u5b9e\u8df5\u7684\u96c6\u5927\u6210\u8005:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_5\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u9636\u6bb5<span class=\"token number\">1<\/span>:\u6570\u636e\u4e0e\u9700\u6c42\r\n  <span class=\"token keyword\">data<\/span><span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>\u6570\u636e\u7ba1\u9053<span class=\"token punctuation\">)<\/span> \u2192 <span class=\"token keyword\">data<\/span><span class=\"token operator\">-<\/span>scientist<span class=\"token punctuation\">(<\/span>\u7279\u5f81\u5de5\u7a0b<span class=\"token punctuation\">)<\/span>\r\n\r\n\u9636\u6bb5<span class=\"token number\">2<\/span>:\u6a21\u578b\u5f00\u53d1\r\n  ml<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>\u8bad\u7ec3\u7ba1\u9053<span class=\"token punctuation\">)<\/span> \u2192 python<span class=\"token operator\">-<\/span>pro<span class=\"token punctuation\">(<\/span>\u4ee3\u7801\u4f18\u5316<span class=\"token punctuation\">)<\/span>\r\n\r\n\u9636\u6bb5<span class=\"token number\">3<\/span>:\u751f\u4ea7\u90e8\u7f72\r\n  mlops<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>\u6a21\u578b\u670d\u52a1<span class=\"token punctuation\">)<\/span> \u2192 kubernetes<span class=\"token operator\">-<\/span>architect<span class=\"token punctuation\">(<\/span>K8s\u57fa\u7840\u8bbe\u65bd<span class=\"token punctuation\">)<\/span>\r\n\r\n\u9636\u6bb5<span class=\"token number\">4<\/span>:\u76d1\u63a7\u6539\u8fdb\r\n  observability<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>\u6027\u80fd\u76d1\u63a7<span class=\"token operator\">+<\/span>\u6f02\u79fb\u68c0\u6d4b<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_5\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8fd9\u4e2a\u7f16\u6392\u5668\u5c55\u793a\u4e86\u73b0\u4ee3MLOps\u7684\u6838\u5fc3\u7406\u5ff5:\u6a21\u578b\u4e0d\u662f\u7ec8\u70b9,\u800c\u662f\u8d77\u70b9\u3002\u90e8\u7f72\u4e4b\u540e\u7684\u76d1\u63a7\u3001\u6f02\u79fb\u68c0\u6d4b\u3001\u81ea\u52a8\u91cd\u8bad\u7ec3\u624d\u662f\u91cd\u70b9\u3002<\/p>\n<h4>\u7b2c\u4e09\u5c42\uff1a\u5f00\u53d1\u5de5\u5177\u5c42(42\u4e2a\u5de5\u5177)<\/h4>\n<p>\u8fd9\u4e00\u5c42\u662f\u7cfb\u7edf\u7684&#8221;\u745e\u58eb\u519b\u5200&#8221;,\u63d0\u4f9b\u5404\u79cd\u4e13\u95e8\u5316\u7684\u5f00\u53d1\u8f85\u52a9\u5de5\u5177:<\/p>\n<p>API\u5f00\u53d1\u5de5\u5177\u5957\u4ef6<\/p>\n<ul data-id=\"u738a58b-XDWaUl0S\">\n<li data-id=\"ld70c578-QBFXiIYh\"><code>api-scaffold<\/code>: API\u811a\u624b\u67b6\u751f\u6210\u5668(\u652f\u6301FastAPI\/Express\/Spring Boot)<\/li>\n<li data-id=\"ld70c578-J9qNN6Iz\"><code>api-mock<\/code>: API\u6a21\u62df\u670d\u52a1<\/li>\n<li data-id=\"ld70c578-PUwAZRYY\"><code>api-documenter<\/code>: API\u6587\u6863\u81ea\u52a8\u751f\u6210<\/li>\n<\/ul>\n<p>\u6d4b\u8bd5\u5de5\u5177\u5957\u4ef6<\/p>\n<ul data-id=\"u738a58b-qbrXGIGF\">\n<li data-id=\"ld70c578-C7tHAWmq\"><code>tdd-red<\/code>: TDD\u7ea2\u8272\u9636\u6bb5(\u7f16\u5199\u5931\u8d25\u6d4b\u8bd5)<\/li>\n<li data-id=\"ld70c578-9KVtlUh4\"><code>tdd-green<\/code>: TDD\u7eff\u8272\u9636\u6bb5(\u6700\u5c0f\u5b9e\u73b0)<\/li>\n<li data-id=\"ld70c578-xUwlYE33\"><code>tdd-refactor<\/code>: TDD\u91cd\u6784\u9636\u6bb5<\/li>\n<li data-id=\"ld70c578-pPFvZjzr\"><code>test-harness<\/code>: \u6d4b\u8bd5\u6846\u67b6\u642d\u5efa<\/li>\n<\/ul>\n<p>\u57fa\u7840\u8bbe\u65bd\u5de5\u5177<\/p>\n<ul data-id=\"u738a58b-YsD98gGU\">\n<li data-id=\"ld70c578-XjFxVNiN\"><code>k8s-manifest<\/code>: Kubernetes\u6e05\u5355\u751f\u6210<\/li>\n<li data-id=\"ld70c578-3c2Tnd0H\"><code>docker-optimize<\/code>: Docker\u955c\u50cf\u4f18\u5316<\/li>\n<li data-id=\"ld70c578-paBiDUi9\"><code>terraform-specialist<\/code>: Terraform IaC\u751f\u6210<\/li>\n<\/ul>\n<p>AI\/ML\u5de5\u5177<\/p>\n<ul data-id=\"u738a58b-drupLfk2\">\n<li data-id=\"ld70c578-Cg687mSD\"><code>langchain-agent<\/code>: LangChain\u4ee3\u7406\u642d\u5efa<\/li>\n<li data-id=\"ld70c578-2yV0f1hk\"><code>prompt-optimize<\/code>: \u63d0\u793a\u8bcd\u4f18\u5316<\/li>\n<li data-id=\"ld70c578-nWA0bZx6\"><code>multi-agent-optimize<\/code>: \u591a\u667a\u80fd\u4f53\u4f18\u5316<\/li>\n<\/ul>\n<p>\u6bcf\u4e2a\u5de5\u5177\u90fd\u662f\u4efb\u52a1\u5bfc\u5411\u7684,\u63a5\u6536\u660e\u786e\u7684\u8f93\u5165\u53c2\u6570,\u4ea7\u751f\u786e\u5b9a\u7684\u8f93\u51fa\u7ed3\u679c,\u53ef\u4ee5\u65e0\u7f1d\u96c6\u6210\u5230CI\/CD\u7ba1\u9053\u4e2d\u3002<\/p>\n<h3>1.2 \u6a21\u578b\u914d\u7f6e\u7b56\u7565\uff1a\u7b97\u529b\u4e0e\u6210\u672c\u7684\u7cbe\u51c6\u5e73\u8861<\/h3>\n<p>\u8fd9\u4e2a\u7cfb\u7edf\u6700\u4ee4\u4eba\u5370\u8c61\u6df1\u523b\u7684\u8bbe\u8ba1\u4e4b\u4e00,\u5c31\u662f\u5b83\u7684\u5206\u5c42\u6a21\u578b\u914d\u7f6e\u7b56\u7565\u3002\u4e0d\u662f\u6240\u6709\u4efb\u52a1\u90fd\u9700\u8981\u6700\u5f3a\u7b97\u529b,\u5408\u7406\u5206\u914d\u8ba1\u7b97\u8d44\u6e90\u65e2\u80fd\u4fdd\u8bc1\u8d28\u91cf,\u53c8\u80fd\u63a7\u5236\u6210\u672c\u3002<\/p>\n<h4>\u4e09\u5c42\u6a21\u578b\u4f53\u7cfb<\/h4>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1019.16px\">\n<colgroup data-id=\"c7104f7d-iYgR6JIE\">\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-XCQDSh0X\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-iXXQP3XP\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-HcjZj9Nh\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-2f60LYSU\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-F6DNOSER\">\n<tr data-id=\"t31e458f-T69Pij82\">\n<td data-id=\"t8c0e6ab-UlKaEmkD\" data-transient-attributes=\"table-cell-selection\">\u6a21\u578b<\/td>\n<td data-id=\"t8c0e6ab-6h8O2Lke\" data-transient-attributes=\"table-cell-selection\">\u667a\u80fd\u4f53\u6570\u91cf<\/td>\n<td data-id=\"t8c0e6ab-ogI1ibWB\" data-transient-attributes=\"table-cell-selection\">\u7528\u4f8b<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-kWe9dSWI\" data-transient-attributes=\"table-cell-selection\">\u6210\u672c\u500d\u6570<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-H9eG1LVD\">\n<td data-id=\"t8c0e6ab-5lnagmgH\" data-transient-attributes=\"table-cell-selection\">Haiku<\/td>\n<td data-id=\"t8c0e6ab-0lXNY8fi\" data-transient-attributes=\"table-cell-selection\">11<\/td>\n<td data-id=\"t8c0e6ab-fjrAeKLX\" data-transient-attributes=\"table-cell-selection\">\u5feb\u901f\u3001\u805a\u7126\u4efb\u52a1,\u8ba1\u7b97\u5f00\u9500\u6700\u5c0f<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-XX6EUf8M\" data-transient-attributes=\"table-cell-selection\">1x<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-fIkd8UDF\">\n<td data-id=\"t0bc4524-Gdbbaf79\" data-transient-attributes=\"table-cell-selection\">Sonnet<\/td>\n<td data-id=\"t0bc4524-5FcPUVG6\" data-transient-attributes=\"table-cell-selection\">50<\/td>\n<td data-id=\"t0bc4524-UbdMAHDG\" data-transient-attributes=\"table-cell-selection\">\u6807\u51c6\u5f00\u53d1\u548c\u4e13\u4e1a\u5de5\u7a0b\u4efb\u52a1<\/td>\n<td class=\"table-last-row\" data-id=\"t78f5a9e-d3QKdR3i\" data-transient-attributes=\"table-cell-selection\">~5x<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-i1o7HEnK\">\n<td class=\"table-last-column\" data-id=\"t1c8f800-OTl1LQDP\" data-transient-attributes=\"table-cell-selection\">Opus<\/td>\n<td class=\"table-last-column\" data-id=\"t1c8f800-CfYm2KMh\" data-transient-attributes=\"table-cell-selection\">23<\/td>\n<td class=\"table-last-column\" data-id=\"t1c8f800-OSWACP6V\" data-transient-attributes=\"table-cell-selection\">\u590d\u6742\u63a8\u7406\u3001\u67b6\u6784\u3001\u5173\u952e\u5206\u6790<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"t16089ba-mjKSj1gY\" data-transient-attributes=\"table-cell-selection\">~15x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Haiku\u6a21\u578b\u667a\u80fd\u4f53(\u901f\u5ea6\u4f18\u5148)<\/p>\n<ul data-id=\"u738a58b-VHQ21W7I\">\n<li data-id=\"ld70c578-CEo8aIzM\">\u4e0a\u4e0b\u6587\u7ba1\u7406:<code>context-manager<\/code><\/li>\n<li data-id=\"ld70c578-T3dT3g05\">\u53c2\u8003\u6784\u5efa:<code>reference-builder<\/code><\/li>\n<li data-id=\"ld70c578-ZGYCLODj\">SEO\u4f18\u5316\u5957\u4ef6:7\u4e2aSEO\u4e13\u5bb6(\u5173\u952e\u8bcd\u7b56\u7565\u3001\u5143\u6570\u636e\u4f18\u5316\u3001\u7247\u6bb5\u730e\u624b\u7b49)<\/li>\n<\/ul>\n<p>\u8fd9\u4e9b\u4efb\u52a1\u7684\u5171\u540c\u7279\u70b9:\u89c4\u5219\u6e05\u6670,\u8f93\u51fa\u7ed3\u6784\u5316,\u4e0d\u9700\u8981\u6df1\u5ea6\u63a8\u7406\u3002\u4f8b\u5982,\u5143\u6570\u636e\u4f18\u5316\u5c31\u662f\u57fa\u4e8e\u65e2\u5b9a\u89c4\u5219\u8fdb\u884c\u6587\u672c\u5904\u7406,\u7528Haiku\u65e2\u5feb\u53c8\u4fbf\u5b9c\u3002<\/p>\n<p>Sonnet\u6a21\u578b\u667a\u80fd\u4f53(\u5e73\u8861\u9009\u62e9)<\/p>\n<ul data-id=\"u738a58b-W9NbFg3I\">\n<li data-id=\"ld70c578-pvK4LPTq\">18\u4e2a\u7f16\u7a0b\u8bed\u8a00\u4e13\u5bb6(JavaScript\/Python\/Java\/C++\u7b49)<\/li>\n<li data-id=\"ld70c578-D9CtIleX\">5\u4e2a\u524d\u7aefUI\u4e13\u5bb6<\/li>\n<li data-id=\"ld70c578-r1uc9HqT\">10\u4e2a\u57fa\u7840\u8bbe\u65bd\u4e13\u5bb6<\/li>\n<li data-id=\"ld70c578-FkhW2wtS\">4\u4e2a\u8d28\u91cf\u6d4b\u8bd5\u4e13\u5bb6<\/li>\n<\/ul>\n<p>\u8fd9\u4e9b\u662f\u65e5\u5e38\u5f00\u53d1\u7684\u4e3b\u529b,\u9700\u8981\u4e00\u5b9a\u7684\u63a8\u7406\u80fd\u529b(\u7406\u89e3\u4ee3\u7801\u903b\u8f91\u3001\u8bbe\u8ba1\u6a21\u5f0f),\u4f46\u4e0d\u9700\u8981\u6700\u9876\u7ea7\u7684\u7b97\u529b\u3002Sonnet\u63d0\u4f9b\u4e86\u6700\u4f73\u7684\u6027\u4ef7\u6bd4\u3002<\/p>\n<p>Opus\u6a21\u578b\u667a\u80fd\u4f53(\u8d28\u91cf\u4f18\u5148)\u5173\u952e\u9886\u57df\u5168\u7528Opus,\u56e0\u4e3a\u8fd9\u4e9b\u4efb\u52a1&#8221;\u51fa\u9519\u7684\u6210\u672c&#8221;\u8fdc\u9ad8\u4e8e\u8ba1\u7b97\u6210\u672c:<\/p>\n<ul data-id=\"u738a58b-ZhzBOHsA\">\n<li data-id=\"ld70c578-GIo8gEGF\">\u67b6\u6784\u8bbe\u8ba1\u7c7b(5\u4e2a):\u540e\u7aef\u67b6\u6784\u3001\u4e91\u67b6\u6784\u3001\u6570\u636e\u5e93\u67b6\u6784\u7b49<\/li>\n<li data-id=\"ld70c578-9INbQXGd\">\u5b89\u5168\u5ba1\u8ba1\u7c7b(5\u4e2a):\u5b89\u5168\u5ba1\u8ba1\u3001\u4ee3\u7801\u5ba1\u67e5\u3001\u5404\u5e73\u53f0\u5b89\u5168\u7f16\u7801<\/li>\n<li data-id=\"ld70c578-cL7k1zLP\">\u6027\u80fd\u76d1\u63a7\u7c7b(3\u4e2a):\u6027\u80fd\u5de5\u7a0b\u3001\u53ef\u89c2\u6d4b\u6027\u3001\u4e8b\u4ef6\u54cd\u5e94<\/li>\n<li data-id=\"ld70c578-enpgjxLK\">AI\/ML\u7c7b(5\u4e2a):AI\u5de5\u7a0b\u3001ML\u5de5\u7a0b\u3001MLOps\u3001\u6570\u636e\u79d1\u5b66\u3001\u63d0\u793a\u5de5\u7a0b<\/li>\n<li data-id=\"ld70c578-DTzJ3MCj\">\u4e1a\u52a1\u5173\u952e\u7c7b(5\u4e2a):\u6587\u6863\u67b6\u6784\u3001HR\u3001\u6cd5\u5f8b\u3001\u91cf\u5316\u5206\u6790\u3001\u98ce\u9669\u7ba1\u7406<\/li>\n<\/ul>\n<h4>\u6210\u672c\u4f18\u5316\u7684\u667a\u6167<\/h4>\n<p>\u5047\u8bbe\u4e00\u4e2a\u5168\u6808\u529f\u80fd\u5f00\u53d1\u7684\u7f16\u6392\u8fc7\u7a0b:<\/p>\n<ul data-id=\"u738a58b-sCRwWZGt\">\n<li data-id=\"ld70c578-XDfOpQGI\">\u67b6\u6784\u8bbe\u8ba1\u9636\u6bb5(Opus):\u5360\u752810%\u7684token,\u4f46\u51b3\u5b9a\u4e8690%\u7684\u8d28\u91cf<\/li>\n<li data-id=\"ld70c578-G4KkpZ7d\">\u5b9e\u73b0\u9636\u6bb5(Sonnet):\u5360\u752870%\u7684token,\u6267\u884c\u5177\u4f53\u7f16\u7801<\/li>\n<li data-id=\"ld70c578-GjFEyAU9\">\u6587\u6863SEO\u9636\u6bb5(Haiku):\u5360\u752820%\u7684token,\u5feb\u901f\u5904\u7406\u7ed3\u6784\u5316\u4efb\u52a1<\/li>\n<\/ul>\n<p>\u603b\u4f53\u6210\u672c = 10% \u00d7 15x + 70% \u00d7 5x + 20% \u00d7 1x = 1.5 + 3.5 + 0.2 =\u00a05.2x\u57fa\u51c6\u6210\u672c<\/p>\n<p>\u5982\u679c\u5168\u90e8\u7528Opus:100% \u00d7 15x =\u00a015x\u57fa\u51c6\u6210\u672c\u5982\u679c\u5168\u90e8\u7528Sonnet:100% \u00d7 5x =\u00a05x\u57fa\u51c6\u6210\u672c(\u8d28\u91cf\u4e0b\u964d)<\/p>\n<p>\u8fd9\u79cd\u914d\u7f6e\u65e2\u4fdd\u8bc1\u4e86\u5173\u952e\u73af\u8282\u7684\u9ad8\u8d28\u91cf,\u53c8\u5c06\u603b\u6210\u672c\u63a7\u5236\u5728\u5408\u7406\u8303\u56f4,\u8282\u7701\u4e86\u7ea665%\u7684\u6210\u672c,\u540c\u65f6\u4fdd\u6301\u9876\u7ea7\u8f93\u51fa\u8d28\u91cf\u3002<\/p>\n<h3>1.3 \u667a\u80fd\u4f53\u5b9a\u4e49\u89c4\u8303\uff1aFrontmatter\u9a71\u52a8\u7684\u5143\u7f16\u7a0b<\/h3>\n<p>\u6bcf\u4e2a\u667a\u80fd\u4f53\u90fd\u662f\u4e00\u4e2aMarkdown\u6587\u4ef6,\u91c7\u7528Frontmatter(\u524d\u7f6e\u5143\u6570\u636e)+ \u7cfb\u7edf\u63d0\u793a\u8bcd\u7684\u683c\u5f0f\u3002\u8fd9\u662f\u4e00\u79cd\u4f18\u96c5\u7684&#8221;\u58f0\u660e\u5f0f\u7f16\u7a0b&#8221;\u601d\u60f3:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_6\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">---<\/span>\r\nname: backend<span class=\"token operator\">-<\/span>architect\r\ndescription: Expert backend architect specializing <span class=\"token operator\">in<\/span> scalable API design<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\r\nmodel: opus\r\ntools: api<span class=\"token operator\">-<\/span>scaffold<span class=\"token punctuation\">,<\/span> security<span class=\"token operator\">-<\/span>scan<span class=\"token punctuation\">,<\/span> test<span class=\"token operator\">-<\/span>harness\r\n<span class=\"token comment\">---<\/span>\r\n\r\nYou are a backend system architect specializing <span class=\"token operator\">in<\/span> scalable<span class=\"token punctuation\">,<\/span> resilient systems<span class=\"token punctuation\">.<\/span>\r\n\r\n<span class=\"token comment\">## Purpose<\/span>\r\nExpert backend architect <span class=\"token keyword\">with<\/span> comprehensive knowledge <span class=\"token keyword\">of<\/span> modern API design<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\r\n\r\n<span class=\"token comment\">## Capabilities<\/span>\r\n<span class=\"token comment\">### API Design &amp; Patterns<\/span>\r\n<span class=\"token operator\">-<\/span> RESTful APIs: Resource modeling<span class=\"token punctuation\">,<\/span> HTTP methods<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">status<\/span> codes<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\r\n<span class=\"token operator\">-<\/span> GraphQL APIs: <span class=\"token keyword\">Schema<\/span> design<span class=\"token punctuation\">,<\/span> resolvers<span class=\"token punctuation\">,<\/span> mutations<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>\r\n\r\n<span class=\"token comment\">## Behavioral Traits<\/span>\r\n<span class=\"token operator\">-<\/span> Starts <span class=\"token keyword\">with<\/span> understanding business requirements\r\n<span class=\"token operator\">-<\/span> Designs APIs contract<span class=\"token operator\">-<\/span><span class=\"token keyword\">first<\/span> <span class=\"token keyword\">with<\/span> clear interfaces\r\n<span class=\"token operator\">-<\/span> Defers <span class=\"token keyword\">database<\/span> <span class=\"token keyword\">schema<\/span> design <span class=\"token keyword\">to<\/span> <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect\r\n<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/code><\/pre>\n<ul id=\"code_id_6\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>Frontmatter\u5b57\u6bb5\u89e3\u6790<\/h4>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-9LZ9bmg5\">\n<li data-id=\"ld70c578-FsSBuGMI\">name(\u5fc5\u9700):\u667a\u80fd\u4f53\u552f\u4e00\u6807\u8bc6\u7b26<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-XWA0crNk\">\n<li data-id=\"ld70c578-yI6r7bTY\">\u547d\u540d\u89c4\u8303:\u5c0f\u5199\u5b57\u6bcd+\u8fde\u5b57\u7b26(kebab-case)<\/li>\n<li data-id=\"ld70c578-Fbp2hebM\">\u793a\u4f8b:<code>backend-architect<\/code>,\u00a0<code>security-auditor<\/code><\/li>\n<\/ul>\n<ol class=\"list-paddingleft-1\" start=\"2\" data-id=\"oe0300a2-TJ0HAiPN\">\n<li data-id=\"ld70c578-h2IxYETK\">description(\u5fc5\u9700):\u6fc0\u6d3b\u6761\u4ef6\u63cf\u8ff0<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-xVOjt7kP\">\n<li data-id=\"ld70c578-xEQTQSQI\">\u4f5c\u7528:\u7cfb\u7edf\u901a\u8fc7\u8fd9\u4e2a\u63cf\u8ff0\u5224\u65ad\u4f55\u65f6\u8c03\u7528\u8be5\u667a\u80fd\u4f53<\/li>\n<li data-id=\"ld70c578-6VPETTnF\">\u5173\u952e\u8bcd\u89e6\u53d1:\u5305\u542b&#8221;API design&#8221;, &#8220;microservices&#8221;\u7b49\u4f1a\u5339\u914d<code>backend-architect<\/code><\/li>\n<\/ul>\n<ol class=\"list-paddingleft-1\" start=\"3\" data-id=\"o292e11f-EceP83Hc\">\n<li data-id=\"ld70c578-3yntRDOV\">model(\u53ef\u9009):\u6307\u5b9a\u4f7f\u7528\u7684Claude\u6a21\u578b<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-dDoPkhZm\">\n<li data-id=\"ld70c578-aFZ0EsUM\">\u9ed8\u8ba4\u503c:sonnet(\u5982\u679c\u672a\u6307\u5b9a)<\/li>\n<li data-id=\"ld70c578-gaas9Fqm\">\u53ef\u9009\u503c:haiku | sonnet | opus<\/li>\n<li data-id=\"ld70c578-WQNeYhIL\">\u8fd9\u662f\u6210\u672c\u63a7\u5236\u7684\u5173\u952e\u914d\u7f6e<\/li>\n<\/ul>\n<ol class=\"list-paddingleft-1\" start=\"4\" data-id=\"oaa0894f-c9kiVV9X\">\n<li data-id=\"ld70c578-Fx2HgjNd\">tools(\u53ef\u9009):\u8be5\u667a\u80fd\u4f53\u53ef\u4ee5\u8c03\u7528\u7684\u5de5\u5177\u5217\u8868<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-Timw1QGV\">\n<li data-id=\"ld70c578-mUxkbpJs\">\u793a\u4f8b:<code>tools: api-scaffold, security-scan, docker-optimize<\/code><\/li>\n<li data-id=\"ld70c578-uwz43vW1\">\u4f5c\u7528:\u9650\u5236\u667a\u80fd\u4f53\u7684\u5de5\u5177\u8bbf\u95ee\u6743\u9650(\u6700\u5c0f\u6743\u9650\u539f\u5219)<\/li>\n<\/ul>\n<h4>\u7cfb\u7edf\u63d0\u793a\u8bcd\u7684\u7ed3\u6784\u5316\u8bbe\u8ba1<\/h4>\n<p>\u7cfb\u7edf\u63d0\u793a\u8bcd\u4e0d\u662f\u7b80\u5355\u7684\u6587\u672c,\u800c\u662f\u7cbe\u5fc3\u7ec4\u7ec7\u7684\u77e5\u8bc6\u5e93:<\/p>\n<p>1. Purpose(\u76ee\u7684): \u4e00\u53e5\u8bdd\u5b9a\u4e49\u667a\u80fd\u4f53\u7684\u6838\u5fc3\u804c\u8d232. Capabilities(\u80fd\u529b): \u8be6\u5c3d\u5217\u4e3e\u4e13\u4e1a\u6280\u80fd<\/p>\n<ul data-id=\"u738a58b-4nKmIT8z\">\n<li data-id=\"ld70c578-DIHrOUwO\">\u91c7\u7528\u591a\u7ea7\u5217\u8868\u7ed3\u6784<\/li>\n<li data-id=\"ld70c578-Iw4JPQIu\">\u6bcf\u4e2a\u80fd\u529b\u70b9\u90fd\u5177\u4f53\u5230\u6280\u672f\u540d\u79f0<\/li>\n<li data-id=\"ld70c578-reUknadm\">\u793a\u4f8b:\u4e0d\u5199&#8221;\u7cbe\u901a\u6570\u636e\u5e93&#8221;,\u800c\u5199&#8221;PostgreSQL\u7d22\u5f15\u8bbe\u8ba1:B-tree, Hash, GiST, GIN&#8221;<\/li>\n<\/ul>\n<p>2. Behavioral Traits(\u884c\u4e3a\u7279\u5f81): \u5b9a\u4e49\u5de5\u4f5c\u65b9\u5f0f<\/p>\n<ul data-id=\"u738a58b-ZvXCSzBK\">\n<li data-id=\"ld70c578-cyhY1BMW\">\u793a\u4f8b:<code>backend-architect<\/code>\u660e\u786e:&#8221;\u6211\u63a8\u8fdf\u6570\u636e\u5e93schema\u8bbe\u8ba1\u7ed9<code>database-architect<\/code>&#8220;<\/li>\n<li data-id=\"ld70c578-HnM7IINX\">\u8fd9\u786e\u4fdd\u4e86\u667a\u80fd\u4f53\u4e4b\u95f4\u7684\u534f\u4f5c\u8fb9\u754c\u6e05\u6670<\/li>\n<\/ul>\n<p>3. Workflow Position(\u5de5\u4f5c\u6d41\u4f4d\u7f6e): \u5b9a\u4e49\u534f\u4f5c\u987a\u5e8f<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_7\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">- After: database-architect (\u6570\u636e\u5c42\u8bbe\u8ba1\u5148\u884c)\r\n- Complements: cloud-architect, security-auditor\r\n- Enables: \u540e\u7aef\u670d\u52a1\u53ef\u57fa\u4e8e\u575a\u5b9e\u7684\u6570\u636e\u57fa\u7840\u6784\u5efa<\/code><\/pre>\n<ul id=\"code_id_7\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>4. Response Approach(\u54cd\u5e94\u65b9\u6cd5): \u7ed3\u6784\u5316\u7684\u5de5\u4f5c\u6d41\u7a0b<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_8\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">1. Understand requirements \u2192 2. Define service boundaries \u2192\r\n3. Design API contracts \u2192 4. Plan communication \u2192 ...<\/code><\/pre>\n<ul id=\"code_id_8\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>5. Example Interactions(\u793a\u4f8b\u4ea4\u4e92): \u5178\u578b\u4f7f\u7528\u573a\u666f<\/p>\n<ul data-id=\"u738a58b-EvnKzaHS\">\n<li data-id=\"ld70c578-S7OqTySO\">\u4e0d\u4ec5\u662f\u6587\u6863,\u66f4\u662f\u8bad\u7ec3\u6570\u636e<\/li>\n<li data-id=\"ld70c578-eYUBCcqx\">\u5e2e\u52a9\u7cfb\u7edf\u7406\u89e3\u4f55\u65f6\u4ee5\u53ca\u5982\u4f55\u4f7f\u7528\u8be5\u667a\u80fd\u4f53<\/li>\n<\/ul>\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u7684\u597d\u5904:<\/p>\n<ul data-id=\"u738a58b-VsXxlzBz\">\n<li data-id=\"ld70c578-UnyAL5Hr\">\u53ef\u7ef4\u62a4\u6027: \u4fee\u6539\u667a\u80fd\u4f53\u884c\u4e3a\u53ea\u9700\u7f16\u8f91\u4e00\u4e2aMarkdown\u6587\u4ef6<\/li>\n<li data-id=\"ld70c578-CHCKpaiI\">\u53ef\u6269\u5c55\u6027: \u6dfb\u52a0\u65b0\u667a\u80fd\u4f53\u9075\u5faa\u76f8\u540c\u6a21\u677f<\/li>\n<li data-id=\"ld70c578-v7i96Cmd\">\u53ef\u8ffd\u6eaf\u6027: \u667a\u80fd\u4f53\u7684\u884c\u4e3a\u5b8c\u5168\u7531\u6587\u4ef6\u5b9a\u4e49,\u53ef\u7248\u672c\u63a7\u5236<\/li>\n<li data-id=\"ld70c578-qZp2BsCu\">\u53ef\u6d4b\u8bd5\u6027: \u53ef\u4ee5\u5355\u72ec\u6d4b\u8bd5\u6bcf\u4e2a\u667a\u80fd\u4f53\u7684\u63d0\u793a\u8bcd\u6548\u679c<\/li>\n<\/ul>\n<h2>\u7b2c\u4e8c\u90e8\u5206\uff1a\u6838\u5fc3\u5de5\u4f5c\u6d41\u6df1\u5ea6\u89e3\u6790<\/h2>\n<h3>2.1 \u5168\u6808\u529f\u80fd\u5f00\u53d1\uff1a\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u7684\u827a\u672f<\/h3>\n<p>\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u771f\u5b9e\u573a\u666f,\u770b\u770b84\u4e2a\u667a\u80fd\u4f53\u662f\u5982\u4f55\u534f\u540c\u5de5\u4f5c\u7684\u3002\u5047\u8bbe\u6211\u4eec\u8981\u5f00\u53d1\u4e00\u4e2a\u5b9e\u65f6\u5206\u6790\u4eea\u8868\u677f\u529f\u80fd,\u5305\u542b\u7528\u6237\u8ba4\u8bc1\u3001\u6570\u636e\u53ef\u89c6\u5316\u548cWebSocket\u5b9e\u65f6\u66f4\u65b0\u3002<\/p>\n<h4>\u9636\u6bb51\uff1a\u67b6\u6784\u4e0e\u8bbe\u8ba1\u57fa\u7840(\u4e32\u884c\u6267\u884c,\u6253\u5730\u57fa)<\/h4>\n<p>Step 1: \u6570\u636e\u5e93\u67b6\u6784\u8bbe\u8ba1<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_9\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect <span class=\"token punctuation\">(<\/span>Opus\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u8f93\u5165: <span class=\"token string\">\"\u8bbe\u8ba1\u5b9e\u65f6\u5206\u6790\u4eea\u8868\u677f\u7684\u6570\u636e\u5e93schema,\u652f\u6301\u7528\u6237\u8ba4\u8bc1\u3001\u65f6\u95f4\u5e8f\u5217\u6570\u636e\u5b58\u50a8\u3001\u6743\u9650\u7ba1\u7406\"<\/span>\r\n\u8f93\u51fa:\r\n  <span class=\"token operator\">-<\/span> ER\u56fe<span class=\"token punctuation\">(<\/span>\u5b9e\u4f53\u5173\u7cfb\u56fe<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u8868\u7ed3\u6784\u5b9a\u4e49<span class=\"token punctuation\">(<\/span>users<span class=\"token punctuation\">,<\/span> dashboards<span class=\"token punctuation\">,<\/span> widgets<span class=\"token punctuation\">,<\/span> time_series_data<span class=\"token punctuation\">,<\/span> permissions<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u7d22\u5f15\u7b56\u7565<span class=\"token punctuation\">(<\/span>B<span class=\"token operator\">-<\/span>tree <span class=\"token keyword\">for<\/span> <span class=\"token keyword\">primary<\/span> <span class=\"token keyword\">keys<\/span><span class=\"token punctuation\">,<\/span> BRIN <span class=\"token keyword\">for<\/span> <span class=\"token keyword\">time<\/span><span class=\"token operator\">-<\/span>series<span class=\"token punctuation\">,<\/span> GIN <span class=\"token keyword\">for<\/span> JSON\u67e5\u8be2<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u5206\u533a\u7b56\u7565<span class=\"token punctuation\">(<\/span>\u6309\u65f6\u95f4\u8303\u56f4\u5206\u533atime_series_data\u8868<span class=\"token punctuation\">,<\/span>\u63d0\u9ad8\u67e5\u8be2\u6027\u80fd<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u6570\u636e\u8fc1\u79fb\u811a\u672c<span class=\"token punctuation\">(<\/span>Alembic<span class=\"token operator\">\/<\/span>Flyway<span class=\"token punctuation\">)<\/span>\r\n  \r\n\u5173\u952e\u51b3\u7b56:\r\n  <span class=\"token operator\">-<\/span> \u9009\u62e9PostgreSQL<span class=\"token punctuation\">(<\/span>\u539f\u56e0:\u5f3a\u5927\u7684JSON\u652f\u6301\u3001\u65f6\u95f4\u5e8f\u5217\u6269\u5c55TimescaleDB<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> time_series_data\u8868\u91c7\u7528\u6df7\u5408\u5217\u5b58\u50a8<span class=\"token punctuation\">(<\/span>cstore_fdw<span class=\"token punctuation\">)<\/span>\u4f18\u5316\u5206\u6790\u67e5\u8be2\r\n  <span class=\"token operator\">-<\/span> \u4f7f\u7528<span class=\"token keyword\">Row<\/span><span class=\"token operator\">-<\/span><span class=\"token keyword\">Level<\/span> Security<span class=\"token punctuation\">(<\/span>RLS<span class=\"token punctuation\">)<\/span>\u5b9e\u73b0\u591a\u79df\u6237\u6570\u636e\u9694\u79bb<\/code><\/pre>\n<ul id=\"code_id_9\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Step 2: \u540e\u7aef\u670d\u52a1\u67b6\u6784<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_10\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: backend<span class=\"token operator\">-<\/span>architect <span class=\"token punctuation\">(<\/span>Opus\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u8f93\u5165: {Step1\u7684\u6570\u636e\u5e93\u8bbe\u8ba1 <span class=\"token operator\">+<\/span> \u529f\u80fd\u9700\u6c42}\r\n\u8f93\u51fa:\r\n  <span class=\"token operator\">-<\/span> \u670d\u52a1\u8fb9\u754c\u5b9a\u4e49:\r\n      <span class=\"token operator\">*<\/span> AuthService: JWT\u8ba4\u8bc1\u3001\u5237\u65b0token\u3001\u6743\u9650\u9a8c\u8bc1\r\n      <span class=\"token operator\">*<\/span> DashboardService: \u4eea\u8868\u677fCRUD\u3001\u6743\u9650\u68c0\u67e5\r\n      <span class=\"token operator\">*<\/span> AnalyticsService: \u6570\u636e\u805a\u5408\u3001\u5b9e\u65f6\u8ba1\u7b97\r\n      <span class=\"token operator\">*<\/span> WebSocketGateway: \u5b9e\u65f6\u63a8\u9001\u3001\u8fde\u63a5\u7ba1\u7406\r\n  \r\n  <span class=\"token operator\">-<\/span> API\u5951\u7ea6<span class=\"token punctuation\">(<\/span>OpenAPI <span class=\"token number\">3.0<\/span>\u89c4\u8303<span class=\"token punctuation\">)<\/span>:\r\n      GET  <span class=\"token operator\">\/<\/span>api<span class=\"token operator\">\/<\/span>v1<span class=\"token operator\">\/<\/span>dashboards\r\n      POST <span class=\"token operator\">\/<\/span>api<span class=\"token operator\">\/<\/span>v1<span class=\"token operator\">\/<\/span>dashboards\r\n      GET  <span class=\"token operator\">\/<\/span>api<span class=\"token operator\">\/<\/span>v1<span class=\"token operator\">\/<\/span>analytics<span class=\"token operator\">\/<\/span>realtime?metric<span class=\"token operator\">=<\/span>sales<span class=\"token operator\">&amp;<\/span>granularity<span class=\"token operator\">=<\/span><span class=\"token number\">1<\/span>m\r\n      WS   <span class=\"token operator\">\/<\/span>ws<span class=\"token operator\">\/<\/span>analytics<span class=\"token operator\">\/<\/span>{dashboard_id}\r\n  \r\n  <span class=\"token operator\">-<\/span> \u8ba4\u8bc1\u6d41\u7a0b:\r\n      OAuth2 <span class=\"token operator\">+<\/span> JWT<span class=\"token punctuation\">(<\/span>access token <span class=\"token number\">15<\/span>\u5206\u949f<span class=\"token punctuation\">,<\/span> refresh token <span class=\"token number\">7<\/span>\u5929<span class=\"token punctuation\">)<\/span>\r\n      \u4f7f\u7528PKCE\u589e\u5f3a\u79fb\u52a8\u7aef\u5b89\u5168\u6027\r\n  \r\n  <span class=\"token operator\">-<\/span> \u7f13\u5b58\u67b6\u6784:\r\n      L1: <span class=\"token operator\">In<\/span><span class=\"token operator\">-<\/span>memory cache <span class=\"token punctuation\">(<\/span>\u5e94\u7528\u5185<span class=\"token punctuation\">)<\/span>\u7528\u4e8e\u70ed\u6570\u636e\r\n      L2: Redis cluster <span class=\"token punctuation\">(<\/span>\u5206\u5e03\u5f0f<span class=\"token punctuation\">)<\/span>\u7528\u4e8e\u5171\u4eab\u4f1a\u8bdd\u548c\u805a\u5408\u7ed3\u679c\r\n      TTL\u7b56\u7565: \u5b9e\u65f6\u6570\u636e<span class=\"token number\">30<\/span>\u79d2<span class=\"token punctuation\">,<\/span>\u5386\u53f2\u6570\u636e<span class=\"token number\">1<\/span>\u5c0f\u65f6\r\n  \r\n  <span class=\"token operator\">-<\/span> \u6d88\u606f\u961f\u5217\u8bbe\u8ba1:\r\n      Kafka topic: analytics<span class=\"token punctuation\">.<\/span>events <span class=\"token punctuation\">(<\/span>\u65f6\u5e8f\u6570\u636e\u5199\u5165<span class=\"token punctuation\">)<\/span>\r\n      Consumer <span class=\"token keyword\">group<\/span>: dashboard<span class=\"token operator\">-<\/span>aggregator <span class=\"token punctuation\">(<\/span>\u5b9e\u65f6\u805a\u5408<span class=\"token punctuation\">)<\/span>\r\n      <span class=\"token keyword\">Partition<\/span> <span class=\"token keyword\">key<\/span>: user_id <span class=\"token punctuation\">(<\/span>\u4fdd\u8bc1\u987a\u5e8f\u6027<span class=\"token punctuation\">)<\/span>\r\n  \r\n  <span class=\"token operator\">-<\/span> \u5f39\u6027\u6a21\u5f0f:\r\n      Circuit breaker: \u7b2c\u4e09\u65b9API\u8c03\u7528<span class=\"token punctuation\">(<\/span>Hystrix<span class=\"token operator\">\/<\/span>resilience4j<span class=\"token punctuation\">)<\/span>\r\n      Retry\u7b56\u7565: \u6307\u6570\u9000\u907f <span class=\"token operator\">+<\/span> \u6296\u52a8<span class=\"token punctuation\">(<\/span>max <span class=\"token number\">3<\/span> retries<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span>s<span class=\"token operator\">\/<\/span><span class=\"token number\">2<\/span>s<span class=\"token operator\">\/<\/span><span class=\"token number\">4<\/span>s<span class=\"token punctuation\">)<\/span>\r\n      Bulkhead: WebSocket\u8fde\u63a5\u6c60\u9694\u79bb<span class=\"token punctuation\">(<\/span>\u6700\u5927<span class=\"token number\">10000<\/span>\u8fde\u63a5<span class=\"token operator\">\/<\/span>\u5b9e\u4f8b<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_10\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6ce8\u610f<code>backend-architect<\/code>\u5728\u8f93\u51fa\u4e2d\u660e\u786e\u5f15\u7528\u4e86<code>database-architect<\/code>\u7684\u8bbe\u8ba1,\u8fd9\u4f53\u73b0\u4e86\u667a\u80fd\u4f53\u95f4\u7684\u77e5\u8bc6\u4f20\u9012\u673a\u5236\u3002<\/p>\n<p>Step 3: \u524d\u7aef\u7ec4\u4ef6\u67b6\u6784<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_11\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: frontend<span class=\"token operator\">-<\/span>developer <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u8f93\u5165: {Step2\u7684API\u5951\u7ea6 <span class=\"token operator\">+<\/span> UI\u8bbe\u8ba1\u9700\u6c42}\r\n\u8f93\u51fa:\r\n  <span class=\"token operator\">-<\/span> \u7ec4\u4ef6\u6811\u8bbe\u8ba1:\r\n      <span class=\"token operator\">&lt;<\/span>DashboardApp<span class=\"token operator\">&gt;<\/span>\r\n        <span class=\"token operator\">&lt;<\/span>AuthProvider<span class=\"token operator\">&gt;<\/span>         <span class=\"token comment\">\/\/ Context: \u7528\u6237\u8ba4\u8bc1\u72b6\u6001<\/span>\r\n          <span class=\"token operator\">&lt;<\/span>Router<span class=\"token operator\">&gt;<\/span>\r\n            <span class=\"token operator\">&lt;<\/span>DashboardList<span class=\"token operator\">&gt;<\/span>    <span class=\"token comment\">\/\/ \u5217\u8868\u9875<\/span>\r\n              <span class=\"token operator\">&lt;<\/span>DashboardCard<span class=\"token operator\">&gt;<\/span>  <span class=\"token comment\">\/\/ \u53ef\u590d\u7528\u5361\u7247\u7ec4\u4ef6<\/span>\r\n            <span class=\"token operator\">&lt;<\/span>DashboardView<span class=\"token operator\">&gt;<\/span>    <span class=\"token comment\">\/\/ \u8be6\u60c5\u9875<\/span>\r\n              <span class=\"token operator\">&lt;<\/span>WidgetGrid<span class=\"token operator\">&gt;<\/span>     <span class=\"token comment\">\/\/ \u7f51\u683c\u5e03\u5c40<\/span>\r\n                <span class=\"token operator\">&lt;<\/span>ChartWidget<span class=\"token operator\">&gt;<\/span>  <span class=\"token comment\">\/\/ \u56fe\u8868\u7ec4\u4ef6(\u652f\u6301Line\/Bar\/Pie)<\/span>\r\n                <span class=\"token operator\">&lt;<\/span>TableWidget<span class=\"token operator\">&gt;<\/span>  <span class=\"token comment\">\/\/ \u8868\u683c\u7ec4\u4ef6(\u865a\u62df\u6eda\u52a8)<\/span>\r\n                <span class=\"token operator\">&lt;<\/span>MetricWidget<span class=\"token operator\">&gt;<\/span> <span class=\"token comment\">\/\/ \u6307\u6807\u5361\u7247<\/span>\r\n  \r\n  <span class=\"token operator\">-<\/span> \u72b6\u6001\u7ba1\u7406<span class=\"token punctuation\">(<\/span>Zustand<span class=\"token punctuation\">)<\/span>:\r\n      stores<span class=\"token operator\">\/<\/span>\r\n        authStore<span class=\"token punctuation\">.<\/span>ts         <span class=\"token comment\">\/\/ \u8ba4\u8bc1\u72b6\u6001<\/span>\r\n        dashboardStore<span class=\"token punctuation\">.<\/span>ts    <span class=\"token comment\">\/\/ \u4eea\u8868\u677f\u6570\u636e<\/span>\r\n        realtimeStore<span class=\"token punctuation\">.<\/span>ts     <span class=\"token comment\">\/\/ WebSocket\u5b9e\u65f6\u6570\u636e<\/span>\r\n  \r\n  <span class=\"token operator\">-<\/span> \u6570\u636e\u83b7\u53d6\u7b56\u7565:\r\n      \u4f7f\u7528React Query\u7ba1\u7406\u670d\u52a1\u7aef\u72b6\u6001:\r\n        <span class=\"token operator\">-<\/span> \u81ea\u52a8\u7f13\u5b58\u3001\u91cd\u65b0\u9a8c\u8bc1\u3001\u540e\u53f0\u66f4\u65b0\r\n        <span class=\"token operator\">-<\/span> \u4e50\u89c2\u66f4\u65b0<span class=\"token punctuation\">(<\/span>Optimistic UI<span class=\"token punctuation\">)<\/span>\u63d0\u5347\u4f53\u9a8c\r\n        <span class=\"token operator\">-<\/span> \u81ea\u52a8\u91cd\u8bd5\u548c\u9519\u8bef\u8fb9\u754c\r\n  \r\n  <span class=\"token operator\">-<\/span> WebSocket\u96c6\u6210:\r\n      useWebSocket hook\u5c01\u88c5\u8fde\u63a5\u7ba1\u7406:\r\n        <span class=\"token operator\">-<\/span> \u81ea\u52a8\u91cd\u8fde<span class=\"token punctuation\">(<\/span>\u6307\u6570\u9000\u907f<span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token operator\">-<\/span> \u5fc3\u8df3\u68c0\u6d4b<span class=\"token punctuation\">(<\/span><span class=\"token number\">30<\/span>\u79d2ping<span class=\"token operator\">\/<\/span>pong<span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token operator\">-<\/span> \u6d88\u606f\u961f\u5217<span class=\"token punctuation\">(<\/span>\u79bb\u7ebf\u7f13\u5b58\u6700\u591a<span class=\"token number\">100<\/span>\u6761\u6d88\u606f<span class=\"token punctuation\">)<\/span>\r\n  \r\n  <span class=\"token operator\">-<\/span> \u6027\u80fd\u4f18\u5316:\r\n      <span class=\"token operator\">-<\/span> \u4ee3\u7801\u5206\u5272: \u8def\u7531\u7ea7lazy loading\r\n      <span class=\"token operator\">-<\/span> \u865a\u62df\u6eda\u52a8: react<span class=\"token operator\">-<\/span>window\u5904\u7406\u5927\u6570\u636e\u96c6\r\n      <span class=\"token operator\">-<\/span> memo\u5316: React<span class=\"token punctuation\">.<\/span>memo <span class=\"token operator\">+<\/span> useMemo\u4f18\u5316\u6e32\u67d3\r\n      <span class=\"token operator\">-<\/span> \u9632\u6296\u8282\u6d41: \u56fe\u8868\u66f4\u65b0\u6700\u591a<span class=\"token number\">1<\/span>\u79d2<span class=\"token number\">1<\/span>\u6b21\r\n  \r\n  <span class=\"token operator\">-<\/span> \u65e0\u969c\u788d\u6027<span class=\"token punctuation\">(<\/span>WCAG <span class=\"token number\">2.1<\/span> AA<span class=\"token punctuation\">)<\/span>:\r\n      <span class=\"token operator\">-<\/span> \u952e\u76d8\u5bfc\u822a: Tab\u987a\u5e8f\u3001\u7126\u70b9\u7ba1\u7406\r\n      <span class=\"token operator\">-<\/span> \u5c4f\u5e55\u9605\u8bfb\u5668: ARIA\u6807\u7b7e\u3001live regions\r\n      <span class=\"token operator\">-<\/span> \u989c\u8272\u5bf9\u6bd4\u5ea6: <span class=\"token number\">4.5<\/span>:<span class=\"token number\">1<\/span>\u6700\u5c0f\u6bd4\u7387\r\n      <span class=\"token operator\">-<\/span> \u54cd\u5e94\u5f0f: \u652f\u6301\u79fb\u52a8\u7aef\u3001\u5e73\u677f\u3001\u684c\u9762<\/code><\/pre>\n<ul id=\"code_id_11\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u9636\u6bb52\uff1a\u5e76\u884c\u5b9e\u73b0(\u4e09\u8def\u5e76\u8fdb,\u6548\u7387\u6700\u5927\u5316)<\/h4>\n<p>\u8fd9\u4e2a\u9636\u6bb5\u7684\u5999\u5904\u5728\u4e8e:\u4e09\u4e2a\u667a\u80fd\u4f53\u540c\u65f6\u5de5\u4f5c,\u4e92\u4e0d\u963b\u585e,\u4f46\u90fd\u57fa\u4e8e\u9636\u6bb51\u7684\u5951\u7ea6\u3002<\/p>\n<p>\u8def\u5f84A: \u540e\u7aef\u5b9e\u73b0<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_12\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: python<span class=\"token operator\">-<\/span>pro <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">,<\/span>FastAPI\u4e13\u5bb6<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u5b9e\u73b0\u540e\u7aef\u670d\u52a1\r\n\r\n\u8f93\u51fa\u4ee3\u7801\u7247\u6bb5<span class=\"token punctuation\">(<\/span>\u7cbe\u7b80<span class=\"token punctuation\">)<\/span>:\r\n<span class=\"token comment\"># app\/services\/analytics_service.py<\/span>\r\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> List<span class=\"token punctuation\">,<\/span> Dict<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">Any<\/span>\r\n<span class=\"token keyword\">from<\/span> <span class=\"token keyword\">datetime<\/span> <span class=\"token keyword\">import<\/span> <span class=\"token keyword\">datetime<\/span><span class=\"token punctuation\">,<\/span> timedelta\r\n<span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">from<\/span> redis <span class=\"token keyword\">import<\/span> asyncio <span class=\"token keyword\">as<\/span> aioredis\r\n<span class=\"token keyword\">from<\/span> sqlalchemy <span class=\"token keyword\">import<\/span> <span class=\"token keyword\">select<\/span><span class=\"token punctuation\">,<\/span> func\r\n<span class=\"token keyword\">from<\/span> app<span class=\"token punctuation\">.<\/span>core<span class=\"token punctuation\">.<\/span>cache <span class=\"token keyword\">import<\/span> cache_with_ttl\r\n<span class=\"token keyword\">from<\/span> app<span class=\"token punctuation\">.<\/span>models <span class=\"token keyword\">import<\/span> TimeSeries\r\n\r\nclass AnalyticsService:\r\n    def __init__<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> db_session<span class=\"token punctuation\">,<\/span> redis_client<span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>db <span class=\"token operator\">=<\/span> db_session\r\n        self<span class=\"token punctuation\">.<\/span>redis <span class=\"token operator\">=<\/span> redis_client\r\n    \r\n    <span class=\"token variable\">@cache_with_ttl<\/span><span class=\"token punctuation\">(<\/span>ttl_seconds<span class=\"token operator\">=<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># L2\u7f13\u5b58<\/span>\r\n    async def get_realtime_metrics<span class=\"token punctuation\">(<\/span>\r\n        self<span class=\"token punctuation\">,<\/span> \r\n        metric: str<span class=\"token punctuation\">,<\/span> \r\n        granularity: str <span class=\"token operator\">=<\/span> <span class=\"token string\">\"1m\"<\/span>\r\n    <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">&gt;<\/span> Dict<span class=\"token punctuation\">[<\/span>str<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">Any<\/span><span class=\"token punctuation\">]<\/span>:\r\n        <span class=\"token string\">\"\"\"\r\n        \u5b9e\u65f6\u6307\u6807\u805a\u5408,\u591a\u7ea7\u7f13\u5b58\u7b56\u7565\r\n        1. \u68c0\u67e5L1\u7f13\u5b58(\u5e94\u7528\u5185\u5b58)\r\n        2. \u68c0\u67e5L2\u7f13\u5b58(Redis)\r\n        3. \u67e5\u8be2\u6570\u636e\u5e93\u5e76\u7f13\u5b58\r\n        \"\"\"<\/span>\r\n        <span class=\"token comment\"># \u6784\u5efa\u65f6\u95f4\u7a97\u53e3<\/span>\r\n        now <span class=\"token operator\">=<\/span> <span class=\"token keyword\">datetime<\/span><span class=\"token punctuation\">.<\/span>utcnow<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n        window <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>_parse_granularity<span class=\"token punctuation\">(<\/span>granularity<span class=\"token punctuation\">)<\/span>\r\n        start_time <span class=\"token operator\">=<\/span> now <span class=\"token operator\">-<\/span> timedelta<span class=\"token punctuation\">(<\/span>seconds<span class=\"token operator\">=<\/span>window <span class=\"token operator\">*<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span>\r\n        \r\n        <span class=\"token comment\"># \u67e5\u8be2\u4f18\u5316:\u4f7f\u7528\u5206\u533a\u8868+\u7d22\u5f15<\/span>\r\n        query <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>\r\n            <span class=\"token keyword\">select<\/span><span class=\"token punctuation\">(<\/span>\r\n                func<span class=\"token punctuation\">.<\/span>time_bucket<span class=\"token punctuation\">(<\/span>f<span class=\"token string\">'{granularity}'<\/span><span class=\"token punctuation\">,<\/span> TimeSeries<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">timestamp<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>label<span class=\"token punctuation\">(<\/span><span class=\"token string\">'bucket'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n                func<span class=\"token punctuation\">.<\/span><span class=\"token function\">avg<\/span><span class=\"token punctuation\">(<\/span>TimeSeries<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>label<span class=\"token punctuation\">(<\/span><span class=\"token string\">'avg_value'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n                func<span class=\"token punctuation\">.<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>TimeSeries<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>label<span class=\"token punctuation\">(<\/span><span class=\"token string\">'max_value'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n                func<span class=\"token punctuation\">.<\/span><span class=\"token function\">count<\/span><span class=\"token punctuation\">(<\/span>TimeSeries<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>label<span class=\"token punctuation\">(<\/span><span class=\"token string\">'count'<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token keyword\">where<\/span><span class=\"token punctuation\">(<\/span>\r\n                TimeSeries<span class=\"token punctuation\">.<\/span>metric_name <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> metric<span class=\"token punctuation\">,<\/span>\r\n                TimeSeries<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">timestamp<\/span> <span class=\"token operator\">&gt;=<\/span> start_time\r\n            <span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span>group_by<span class=\"token punctuation\">(<\/span><span class=\"token string\">'bucket'<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span>order_by<span class=\"token punctuation\">(<\/span><span class=\"token string\">'bucket'<\/span><span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token punctuation\">)<\/span>\r\n        \r\n        result <span class=\"token operator\">=<\/span> await self<span class=\"token punctuation\">.<\/span>db<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">execute<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token keyword\">return<\/span> {\r\n            <span class=\"token string\">'metric'<\/span>: metric<span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">'data'<\/span>: <span class=\"token punctuation\">[<\/span>dict<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">row<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> <span class=\"token keyword\">row<\/span> <span class=\"token operator\">in<\/span> result<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">'timestamp'<\/span>: now<span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n        }\r\n    \r\n    async def stream_realtime_updates<span class=\"token punctuation\">(<\/span>\r\n        self<span class=\"token punctuation\">,<\/span> \r\n        websocket: WebSocket<span class=\"token punctuation\">,<\/span> \r\n        dashboard_id: <span class=\"token keyword\">int<\/span>\r\n    <span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token string\">\"\"\"\r\n        WebSocket\u5b9e\u65f6\u63a8\u9001,\u4f7f\u7528Redis Pub\/Sub\r\n        \"\"\"<\/span>\r\n        pubsub <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>redis<span class=\"token punctuation\">.<\/span>pubsub<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n        await pubsub<span class=\"token punctuation\">.<\/span>subscribe<span class=\"token punctuation\">(<\/span>f<span class=\"token string\">'dashboard:{dashboard_id}'<\/span><span class=\"token punctuation\">)<\/span>\r\n        \r\n        try:\r\n            async <span class=\"token keyword\">for<\/span> message <span class=\"token operator\">in<\/span> pubsub<span class=\"token punctuation\">.<\/span>listen<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>:\r\n                <span class=\"token keyword\">if<\/span> message<span class=\"token punctuation\">[<\/span><span class=\"token string\">'type'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">'message'<\/span>:\r\n                    <span class=\"token comment\"># \u63a8\u9001\u7ed9\u5ba2\u6237\u7aef<\/span>\r\n                    await websocket<span class=\"token punctuation\">.<\/span>send_json<span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">[<\/span><span class=\"token string\">'data'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token keyword\">except<\/span> WebSocketDisconnect:\r\n            await pubsub<span class=\"token punctuation\">.<\/span>unsubscribe<span class=\"token punctuation\">(<\/span>f<span class=\"token string\">'dashboard:{dashboard_id}'<\/span><span class=\"token punctuation\">)<\/span>\r\n        finally:\r\n            await pubsub<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\"># app\/api\/v1\/analytics.py<\/span>\r\n<span class=\"token keyword\">from<\/span> fastapi <span class=\"token keyword\">import<\/span> APIRouter<span class=\"token punctuation\">,<\/span> Depends<span class=\"token punctuation\">,<\/span> WebSocket\r\n<span class=\"token keyword\">from<\/span> app<span class=\"token punctuation\">.<\/span>services<span class=\"token punctuation\">.<\/span>analytics_service <span class=\"token keyword\">import<\/span> AnalyticsService\r\n\r\nrouter <span class=\"token operator\">=<\/span> APIRouter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token variable\">@router.get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/analytics\/realtime\"<\/span><span class=\"token punctuation\">)<\/span>\r\nasync def get_realtime_metrics<span class=\"token punctuation\">(<\/span>\r\n    metric: str<span class=\"token punctuation\">,<\/span>\r\n    granularity: str <span class=\"token operator\">=<\/span> <span class=\"token string\">\"1m\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    service: AnalyticsService <span class=\"token operator\">=<\/span> Depends<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\r\n    \u5b9e\u65f6\u6307\u6807\u67e5\u8be2\r\n    ---\r\n    OpenAPI\u6587\u6863\u81ea\u52a8\u751f\u6210,\u5305\u542b\u793a\u4f8b:\r\n    GET \/api\/v1\/analytics\/realtime?metric=sales&amp;granularity=1m\r\n    \"\"\"<\/span>\r\n    <span class=\"token keyword\">return<\/span> await service<span class=\"token punctuation\">.<\/span>get_realtime_metrics<span class=\"token punctuation\">(<\/span>metric<span class=\"token punctuation\">,<\/span> granularity<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token variable\">@router.websocket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/ws\/analytics\/{dashboard_id}\"<\/span><span class=\"token punctuation\">)<\/span>\r\nasync def websocket_analytics<span class=\"token punctuation\">(<\/span>\r\n    websocket: WebSocket<span class=\"token punctuation\">,<\/span>\r\n    dashboard_id: <span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span>\r\n    service: AnalyticsService <span class=\"token operator\">=<\/span> Depends<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\r\n    WebSocket\u5b9e\u65f6\u63a8\u9001\r\n    \u81ea\u52a8\u91cd\u8fde\u3001\u5fc3\u8df3\u68c0\u6d4b\u7531\u5ba2\u6237\u7aef\u5b9e\u73b0\r\n    \"\"\"<\/span>\r\n    await websocket<span class=\"token punctuation\">.<\/span>accept<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    await service<span class=\"token punctuation\">.<\/span>stream_realtime_updates<span class=\"token punctuation\">(<\/span>websocket<span class=\"token punctuation\">,<\/span> dashboard_id<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_12\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<li>70.<\/li>\n<li>71.<\/li>\n<li>72.<\/li>\n<li>73.<\/li>\n<li>74.<\/li>\n<li>75.<\/li>\n<li>76.<\/li>\n<li>77.<\/li>\n<li>78.<\/li>\n<li>79.<\/li>\n<li>80.<\/li>\n<li>81.<\/li>\n<li>82.<\/li>\n<li>83.<\/li>\n<li>84.<\/li>\n<li>85.<\/li>\n<li>86.<\/li>\n<li>87.<\/li>\n<li>88.<\/li>\n<li>89.<\/li>\n<li>90.<\/li>\n<li>91.<\/li>\n<li>92.<\/li>\n<li>93.<\/li>\n<li>94.<\/li>\n<li>95.<\/li>\n<li>96.<\/li>\n<li>97.<\/li>\n<li>98.<\/li>\n<li>99.<\/li>\n<li>100.<\/li>\n<li>101.<\/li>\n<li>102.<\/li>\n<li>103.<\/li>\n<li>104.<\/li>\n<li>105.<\/li>\n<li>106.<\/li>\n<li>107.<\/li>\n<li>108.<\/li>\n<li>109.<\/li>\n<li>110.<\/li>\n<li>111.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u6280\u672f\u70b9:<\/p>\n<ul data-id=\"u738a58b-Es4dzFK8\">\n<li data-id=\"ld70c578-uDCHnL3a\">\u591a\u7ea7\u7f13\u5b58: \u88c5\u9970\u5668<code>@cache_with_ttl<\/code>\u5c01\u88c5Redis\u7f13\u5b58\u903b\u8f91<\/li>\n<li data-id=\"ld70c578-V16sQg7H\">\u65f6\u95f4\u7a97\u53e3\u805a\u5408: \u4f7f\u7528TimescaleDB\u7684<code>time_bucket<\/code>\u51fd\u6570<\/li>\n<li data-id=\"ld70c578-hRdTtDPs\">\u5f02\u6b65\u7f16\u7a0b:\u00a0<code>async\/await<\/code>\u5b9e\u73b0\u9ad8\u5e76\u53d1\u5904\u7406<\/li>\n<li data-id=\"ld70c578-Qc4Cxmbc\">WebSocket\u7ba1\u7406: Redis Pub\/Sub\u89e3\u8026\u53d1\u5e03\u8005\u548c\u8ba2\u9605\u8005<\/li>\n<\/ul>\n<p>\u8def\u5f84B: \u524d\u7aef\u5b9e\u73b0<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_13\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: frontend<span class=\"token operator\">-<\/span>developer <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u5b9e\u73b0React\u7ec4\u4ef6\r\n\r\n\u8f93\u51fa\u4ee3\u7801\u7247\u6bb5:\r\n<span class=\"token comment\">\/\/ src\/hooks\/useRealtimeAnalytics.ts<\/span>\r\n<span class=\"token keyword\">import<\/span> { useEffect<span class=\"token punctuation\">,<\/span> useRef<span class=\"token punctuation\">,<\/span> useState } <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> { useWebSocket } <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/useWebSocket'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> { useQuery } <span class=\"token keyword\">from<\/span> <span class=\"token string\">'@tanstack\/react-query'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\nexport <span class=\"token keyword\">function<\/span> useRealtimeAnalytics<span class=\"token punctuation\">(<\/span>\r\n  dashboardId: number<span class=\"token punctuation\">,<\/span>\r\n  metric: string<span class=\"token punctuation\">,<\/span>\r\n  granularity: string <span class=\"token operator\">=<\/span> <span class=\"token string\">'1m'<\/span>\r\n<span class=\"token punctuation\">)<\/span> {\r\n  const <span class=\"token punctuation\">[<\/span>realtimeData<span class=\"token punctuation\">,<\/span> setRealtimeData<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> useState<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token comment\">\/\/ \u5386\u53f2\u6570\u636e\u83b7\u53d6(React Query)<\/span>\r\n  const { <span class=\"token keyword\">data<\/span>: historicalData<span class=\"token punctuation\">,<\/span> isLoading } <span class=\"token operator\">=<\/span> useQuery<span class=\"token punctuation\">(<\/span>{\r\n    queryKey: <span class=\"token punctuation\">[<\/span><span class=\"token string\">'analytics'<\/span><span class=\"token punctuation\">,<\/span> metric<span class=\"token punctuation\">,<\/span> granularity<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n    queryFn: <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token keyword\">fetch<\/span><span class=\"token punctuation\">(<\/span>\r\n      <span class=\"token identifier\"><span class=\"token punctuation\">`<\/span>\/api\/v1\/analytics\/realtime?metric=${metric}&amp;granularity=${granularity}<span class=\"token punctuation\">`<\/span><\/span>\r\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">then<\/span><span class=\"token punctuation\">(<\/span>res <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> res<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    staleTime: <span class=\"token number\">30000<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ 30\u79d2\u5185\u8ba4\u4e3a\u6570\u636e\u662f\u65b0\u9c9c\u7684<\/span>\r\n    refetchInterval: <span class=\"token number\">30000<\/span> <span class=\"token comment\">\/\/ 30\u79d2\u8f6e\u8be2\u4e00\u6b21<\/span>\r\n  }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token comment\">\/\/ WebSocket\u5b9e\u65f6\u66f4\u65b0<\/span>\r\n  const { lastMessage<span class=\"token punctuation\">,<\/span> connectionStatus } <span class=\"token operator\">=<\/span> useWebSocket<span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token identifier\"><span class=\"token punctuation\">`<\/span>\/ws\/analytics\/${dashboardId}<span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">,<\/span>\r\n    {\r\n      onOpen: <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> console<span class=\"token punctuation\">.<\/span>log<span class=\"token punctuation\">(<\/span><span class=\"token string\">'WebSocket connected'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n      onError: <span class=\"token punctuation\">(<\/span>error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> console<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">(<\/span><span class=\"token string\">'WebSocket error:'<\/span><span class=\"token punctuation\">,<\/span> error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n      shouldReconnect: <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u603b\u662f\u91cd\u8fde<\/span>\r\n      reconnectInterval: <span class=\"token number\">3000<\/span> <span class=\"token comment\">\/\/ 3\u79d2\u540e\u91cd\u8fde<\/span>\r\n    }\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token comment\">\/\/ \u5408\u5e76\u5386\u53f2\u6570\u636e\u548c\u5b9e\u65f6\u66f4\u65b0<\/span>\r\n  useEffect<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> {\r\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>lastMessage<span class=\"token punctuation\">)<\/span> {\r\n      const newData <span class=\"token operator\">=<\/span> JSON<span class=\"token punctuation\">.<\/span>parse<span class=\"token punctuation\">(<\/span>lastMessage<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">data<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      setRealtimeData<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">prev<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">prev<\/span><span class=\"token punctuation\">,<\/span> newData<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>slice<span class=\"token punctuation\">(<\/span><span class=\"token operator\">-<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u53ea\u4fdd\u7559\u6700\u8fd1100\u6761<\/span>\r\n    }\r\n  }<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>lastMessage<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token comment\">\/\/ \u5408\u5e76\u6570\u636e<\/span>\r\n  const mergedData <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">(<\/span>historicalData?<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">data<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span>realtimeData\r\n  <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">return<\/span> {\r\n    <span class=\"token keyword\">data<\/span>: mergedData<span class=\"token punctuation\">,<\/span>\r\n    isLoading<span class=\"token punctuation\">,<\/span>\r\n    isConnected: connectionStatus <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">'OPEN'<\/span>\r\n  }<span class=\"token punctuation\">;<\/span>\r\n}\r\n\r\n<span class=\"token comment\">\/\/ src\/components\/ChartWidget.tsx<\/span>\r\n<span class=\"token keyword\">import<\/span> { LineChart<span class=\"token punctuation\">,<\/span> Line<span class=\"token punctuation\">,<\/span> XAxis<span class=\"token punctuation\">,<\/span> YAxis<span class=\"token punctuation\">,<\/span> Tooltip<span class=\"token punctuation\">,<\/span> ResponsiveContainer } <span class=\"token keyword\">from<\/span> <span class=\"token string\">'recharts'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> { useRealtimeAnalytics } <span class=\"token keyword\">from<\/span> <span class=\"token string\">'..\/hooks\/useRealtimeAnalytics'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\nexport <span class=\"token keyword\">function<\/span> ChartWidget<span class=\"token punctuation\">(<\/span>{ \r\n  dashboardId<span class=\"token punctuation\">,<\/span> \r\n  metric<span class=\"token punctuation\">,<\/span> \r\n  title \r\n}: ChartWidgetProps<span class=\"token punctuation\">)<\/span> {\r\n  const { <span class=\"token keyword\">data<\/span><span class=\"token punctuation\">,<\/span> isLoading<span class=\"token punctuation\">,<\/span> isConnected } <span class=\"token operator\">=<\/span> useRealtimeAnalytics<span class=\"token punctuation\">(<\/span>\r\n    dashboardId<span class=\"token punctuation\">,<\/span> \r\n    metric<span class=\"token punctuation\">,<\/span> \r\n    <span class=\"token string\">'1m'<\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>isLoading<span class=\"token punctuation\">)<\/span> {\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&lt;<\/span>Skeleton <span class=\"token operator\">\/<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span>\r\n  }\r\n  \r\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">div<\/span> className<span class=\"token operator\">=<\/span><span class=\"token string\">\"chart-widget\"<\/span><span class=\"token operator\">&gt;<\/span>\r\n      <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">div<\/span> className<span class=\"token operator\">=<\/span><span class=\"token string\">\"chart-header\"<\/span><span class=\"token operator\">&gt;<\/span>\r\n        <span class=\"token operator\">&lt;<\/span>h3<span class=\"token operator\">&gt;<\/span>{title}<span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>h3<span class=\"token operator\">&gt;<\/span>\r\n        <span class=\"token operator\">&lt;<\/span>span className<span class=\"token operator\">=<\/span>{<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span>status ${isConnected ? 'connected' : 'disconnected'}<span class=\"token punctuation\">`<\/span><\/span>}<span class=\"token operator\">&gt;<\/span>\r\n          {isConnected ? <span class=\"token string\">'\u25cf \u5b9e\u65f6'<\/span> : <span class=\"token string\">'\u25cb \u79bb\u7ebf'<\/span>}\r\n        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>span<span class=\"token operator\">&gt;<\/span>\r\n      <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span><span class=\"token operator\">div<\/span><span class=\"token operator\">&gt;<\/span>\r\n      \r\n      <span class=\"token operator\">&lt;<\/span>ResponsiveContainer width<span class=\"token operator\">=<\/span><span class=\"token string\">\"100%\"<\/span> height<span class=\"token operator\">=<\/span>{<span class=\"token number\">300<\/span>}<span class=\"token operator\">&gt;<\/span>\r\n        <span class=\"token operator\">&lt;<\/span>LineChart <span class=\"token keyword\">data<\/span><span class=\"token operator\">=<\/span>{<span class=\"token keyword\">data<\/span>}<span class=\"token operator\">&gt;<\/span>\r\n          <span class=\"token operator\">&lt;<\/span>XAxis \r\n            dataKey<span class=\"token operator\">=<\/span><span class=\"token string\">\"bucket\"<\/span> \r\n            tickFormatter<span class=\"token operator\">=<\/span>{<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> new <span class=\"token keyword\">Date<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toLocaleTimeString<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>}\r\n          <span class=\"token operator\">\/<\/span><span class=\"token operator\">&gt;<\/span>\r\n          <span class=\"token operator\">&lt;<\/span>YAxis <span class=\"token operator\">\/<\/span><span class=\"token operator\">&gt;<\/span>\r\n          <span class=\"token operator\">&lt;<\/span>Tooltip \r\n            labelFormatter<span class=\"token operator\">=<\/span>{<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> new <span class=\"token keyword\">Date<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toLocaleString<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>}\r\n            contentStyle<span class=\"token operator\">=<\/span>{{ background: <span class=\"token string\">'var(--tooltip-bg)'<\/span> }}\r\n          <span class=\"token operator\">\/<\/span><span class=\"token operator\">&gt;<\/span>\r\n          <span class=\"token operator\">&lt;<\/span>Line \r\n            <span class=\"token keyword\">type<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"monotone\"<\/span> \r\n            dataKey<span class=\"token operator\">=<\/span><span class=\"token string\">\"avg_value\"<\/span> \r\n            stroke<span class=\"token operator\">=<\/span><span class=\"token string\">\"#8884d8\"<\/span>\r\n            strokeWidth<span class=\"token operator\">=<\/span>{<span class=\"token number\">2<\/span>}\r\n            dot<span class=\"token operator\">=<\/span>{<span class=\"token boolean\">false<\/span>}\r\n            isAnimationActive<span class=\"token operator\">=<\/span>{<span class=\"token boolean\">false<\/span>} <span class=\"token comment\">\/\/ \u7981\u7528\u52a8\u753b\u63d0\u5347\u6027\u80fd<\/span>\r\n          <span class=\"token operator\">\/<\/span><span class=\"token operator\">&gt;<\/span>\r\n        <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>LineChart<span class=\"token operator\">&gt;<\/span>\r\n      <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>ResponsiveContainer<span class=\"token operator\">&gt;<\/span>\r\n    <span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span><span class=\"token operator\">div<\/span><span class=\"token operator\">&gt;<\/span>\r\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n}<\/code><\/pre>\n<ul id=\"code_id_13\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<li>70.<\/li>\n<li>71.<\/li>\n<li>72.<\/li>\n<li>73.<\/li>\n<li>74.<\/li>\n<li>75.<\/li>\n<li>76.<\/li>\n<li>77.<\/li>\n<li>78.<\/li>\n<li>79.<\/li>\n<li>80.<\/li>\n<li>81.<\/li>\n<li>82.<\/li>\n<li>83.<\/li>\n<li>84.<\/li>\n<li>85.<\/li>\n<li>86.<\/li>\n<li>87.<\/li>\n<li>88.<\/li>\n<li>89.<\/li>\n<li>90.<\/li>\n<li>91.<\/li>\n<li>92.<\/li>\n<li>93.<\/li>\n<li>94.<\/li>\n<li>95.<\/li>\n<li>96.<\/li>\n<li>97.<\/li>\n<li>98.<\/li>\n<li>99.<\/li>\n<li>100.<\/li>\n<li>101.<\/li>\n<li>102.<\/li>\n<li>103.<\/li>\n<li>104.<\/li>\n<li>105.<\/li>\n<li>106.<\/li>\n<li>107.<\/li>\n<li>108.<\/li>\n<li>109.<\/li>\n<li>110.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u6280\u672f\u70b9:<\/p>\n<ul data-id=\"u738a58b-BQaTs8G5\">\n<li data-id=\"ld70c578-h4M6vUlN\">\u81ea\u5b9a\u4e49Hook: \u5c01\u88c5\u590d\u6742\u903b\u8f91,\u63d0\u9ad8\u590d\u7528\u6027<\/li>\n<li data-id=\"ld70c578-W7otxcQ8\">React Query: \u81ea\u52a8\u7ba1\u7406\u670d\u52a1\u7aef\u72b6\u6001,\u51cf\u5c11\u6837\u677f\u4ee3\u7801<\/li>\n<li data-id=\"ld70c578-09KwZJgb\">\u6570\u636e\u5408\u5e76: \u5386\u53f2\u6570\u636e + \u5b9e\u65f6\u6570\u636e\u7684\u65e0\u7f1d\u62fc\u63a5<\/li>\n<li data-id=\"ld70c578-E0vSJBAi\">\u6027\u80fd\u4f18\u5316:\u00a0<code>isAnimationActive={false}<\/code>\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u91cd\u6e32\u67d3<\/li>\n<\/ul>\n<p>\u8def\u5f84C: \u6570\u636e\u5e93\u4f18\u5316<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_14\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: <span class=\"token keyword\">sql<\/span><span class=\"token operator\">-<\/span>pro <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u4f18\u5316\u67e5\u8be2\u6027\u80fd\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token comment\">-- 1. \u521b\u5efa\u65f6\u95f4\u5e8f\u5217\u5206\u533a\u8868<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> time_series_data <span class=\"token punctuation\">(<\/span>\r\n    id BIGSERIAL<span class=\"token punctuation\">,<\/span>\r\n    metric_name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token keyword\">value<\/span> <span class=\"token keyword\">DOUBLE<\/span> <span class=\"token keyword\">PRECISION<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token keyword\">timestamp<\/span> TIMESTAMPTZ <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>\r\n    metadata JSONB<span class=\"token punctuation\">,<\/span>\r\n    user_id <span class=\"token keyword\">INTEGER<\/span> <span class=\"token keyword\">REFERENCES<\/span> users<span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span> <span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">timestamp<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">-- \u590d\u5408\u4e3b\u952e,timestamp\u5fc5\u987b\u5305\u542b\u5728\u5185<\/span>\r\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">BY<\/span> RANGE <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">timestamp<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- \u521b\u5efa\u6708\u5ea6\u5206\u533a(\u81ea\u52a8\u5316\u811a\u672c,\u6bcf\u6708\u521b\u5efa\u4e0b\u6708\u5206\u533a)<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> time_series_data_2025_01 \r\n<span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">OF<\/span> time_series_data\r\n<span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token keyword\">FROM<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">'2025-01-01'<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">'2025-02-01'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- 2. \u521b\u5efa\u6027\u80fd\u7d22\u5f15<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_ts_metric_time <span class=\"token keyword\">ON<\/span> time_series_data <span class=\"token punctuation\">(<\/span>metric_name<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">timestamp<\/span> <span class=\"token keyword\">DESC<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_ts_user_time <span class=\"token keyword\">ON<\/span> time_series_data <span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">timestamp<\/span> <span class=\"token keyword\">DESC<\/span><span class=\"token punctuation\">)<\/span> \r\n<span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">IS<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_ts_metadata <span class=\"token keyword\">ON<\/span> time_series_data <span class=\"token keyword\">USING<\/span> GIN <span class=\"token punctuation\">(<\/span>metadata<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- 3. \u521b\u5efa\u7269\u5316\u89c6\u56fe(\u9884\u805a\u5408)<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> MATERIALIZED <span class=\"token keyword\">VIEW<\/span> mv_hourly_metrics <span class=\"token keyword\">AS<\/span>\r\n<span class=\"token keyword\">SELECT<\/span> \r\n    metric_name<span class=\"token punctuation\">,<\/span>\r\n    date_trunc<span class=\"token punctuation\">(<\/span><span class=\"token string\">'hour'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">timestamp<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> hour_bucket<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">AVG<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> avg_value<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">MAX<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> max_value<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">MIN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> min_value<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> count\r\n<span class=\"token keyword\">FROM<\/span> time_series_data\r\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token keyword\">timestamp<\/span> <span class=\"token operator\">&gt;=<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token string\">'7 days'<\/span>\r\n<span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> metric_name<span class=\"token punctuation\">,<\/span> hour_bucket<span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token keyword\">INDEX<\/span> <span class=\"token keyword\">ON<\/span> mv_hourly_metrics <span class=\"token punctuation\">(<\/span>metric_name<span class=\"token punctuation\">,<\/span> hour_bucket<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- 4. \u521b\u5efa\u81ea\u52a8\u5237\u65b0\u7b56\u7565<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token operator\">OR<\/span> <span class=\"token keyword\">REPLACE<\/span> <span class=\"token keyword\">FUNCTION<\/span> refresh_hourly_metrics<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">RETURNS<\/span> void <span class=\"token keyword\">AS<\/span> $$\r\n<span class=\"token keyword\">BEGIN<\/span>\r\n    REFRESH MATERIALIZED <span class=\"token keyword\">VIEW<\/span> CONCURRENTLY mv_hourly_metrics<span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">END<\/span><span class=\"token punctuation\">;<\/span>\r\n$$ <span class=\"token keyword\">LANGUAGE<\/span> plpgsql<span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- \u6bcf\u5c0f\u65f6\u81ea\u52a8\u5237\u65b0(\u4f7f\u7528pg_cron\u6269\u5c55)<\/span>\r\n<span class=\"token keyword\">SELECT<\/span> cron<span class=\"token punctuation\">.<\/span>schedule<span class=\"token punctuation\">(<\/span><span class=\"token string\">'refresh_hourly_metrics'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'0 * * * *'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'SELECT refresh_hourly_metrics()'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- 5. \u67e5\u8be2\u4f18\u5316\u5efa\u8bae<\/span>\r\n<span class=\"token keyword\">EXPLAIN<\/span> <span class=\"token keyword\">ANALYZE<\/span>\r\n<span class=\"token keyword\">SELECT<\/span> \r\n    time_bucket<span class=\"token punctuation\">(<\/span><span class=\"token string\">'1 minute'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">timestamp<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> bucket<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">AVG<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> avg_value\r\n<span class=\"token keyword\">FROM<\/span> time_series_data\r\n<span class=\"token keyword\">WHERE<\/span> \r\n    metric_name <span class=\"token operator\">=<\/span> <span class=\"token string\">'sales'<\/span>\r\n    <span class=\"token operator\">AND<\/span> <span class=\"token keyword\">timestamp<\/span> <span class=\"token operator\">&gt;=<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token string\">'1 hour'<\/span>\r\n<span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> bucket\r\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> bucket<span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">\/*\r\n\u4f18\u5316\u6548\u679c:\r\nBefore: Seq Scan on time_series_data  (cost=0.00..10000.00 rows=100000)\r\nAfter:  Index Scan using idx_ts_metric_time  (cost=0.43..1234.56 rows=720)\r\n\u6027\u80fd\u63d0\u5347: 8\u500d\r\n*\/<\/span><\/code><\/pre>\n<ul id=\"code_id_14\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<li>70.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u4f18\u5316\u6280\u672f:<\/p>\n<ul data-id=\"u738a58b-f30Tlpth\">\n<li data-id=\"ld70c578-BEy0NF6D\">\u5206\u533a\u8868: \u51cf\u5c11\u626b\u63cf\u6570\u636e\u91cf,\u63d0\u5347\u67e5\u8be2\u901f\u5ea6<\/li>\n<li data-id=\"ld70c578-5XsSbANC\">\u7269\u5316\u89c6\u56fe: \u9884\u805a\u5408\u5e38\u7528\u67e5\u8be2,\u7a7a\u95f4\u6362\u65f6\u95f4<\/li>\n<li data-id=\"ld70c578-wyxkVI9q\">\u590d\u5408\u7d22\u5f15: (metric_name, timestamp)\u652f\u6301WHERE\u548cORDER BY<\/li>\n<li data-id=\"ld70c578-pmeehyOd\">GIN\u7d22\u5f15: \u652f\u6301JSONB\u5b57\u6bb5\u7684\u9ad8\u6548\u67e5\u8be2<\/li>\n<\/ul>\n<h4>\u9636\u6bb53\uff1a\u96c6\u6210\u4e0e\u6d4b\u8bd5(\u8d28\u91cf\u4fdd\u8bc1)<\/h4>\n<p>Step 7: API\u5951\u7ea6\u6d4b\u8bd5<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_15\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: test<span class=\"token operator\">-<\/span>automator <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u9a8c\u8bc1\u524d\u540e\u7aef\u5951\u7ea6\u4e00\u81f4\u6027\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token comment\"># tests\/contract\/test_analytics_api.py<\/span>\r\n<span class=\"token keyword\">import<\/span> pytest\r\n<span class=\"token keyword\">from<\/span> pactman <span class=\"token keyword\">import<\/span> Consumer<span class=\"token punctuation\">,<\/span> Provider<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">Like<\/span><span class=\"token punctuation\">,<\/span> EachLike\r\n\r\n<span class=\"token variable\">@pytest.fixture<\/span>\r\ndef analytics_pact<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>:\r\n    pact <span class=\"token operator\">=<\/span> Consumer<span class=\"token punctuation\">(<\/span><span class=\"token string\">'frontend-dashboard'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>has_pact_with<span class=\"token punctuation\">(<\/span>\r\n        Provider<span class=\"token punctuation\">(<\/span><span class=\"token string\">'backend-api'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        pact_dir<span class=\"token operator\">=<\/span><span class=\"token string\">'.\/pacts'<\/span>\r\n    <span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> pact\r\n\r\ndef test_get_realtime_metrics<span class=\"token punctuation\">(<\/span>analytics_pact<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\r\n    \u5951\u7ea6\u6d4b\u8bd5:\u786e\u4fdd\u524d\u7aef\u671f\u671b\u7684\u54cd\u5e94\u683c\u5f0f\u4e0e\u540e\u7aef\u5b9e\u9645\u63d0\u4f9b\u7684\u4e00\u81f4\r\n    \"\"\"<\/span>\r\n    <span class=\"token punctuation\">(<\/span>analytics_pact\r\n        <span class=\"token punctuation\">.<\/span>given<span class=\"token punctuation\">(<\/span><span class=\"token string\">'metric data exists'<\/span><span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token punctuation\">.<\/span>upon_receiving<span class=\"token punctuation\">(<\/span><span class=\"token string\">'a request for realtime metrics'<\/span><span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token punctuation\">.<\/span>with_request<span class=\"token punctuation\">(<\/span><span class=\"token string\">'GET'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'\/api\/v1\/analytics\/realtime'<\/span><span class=\"token punctuation\">,<\/span> query<span class=\"token operator\">=<\/span><span class=\"token string\">'metric=sales&amp;granularity=1m'<\/span><span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token punctuation\">.<\/span>will_respond_with<span class=\"token punctuation\">(<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span> body<span class=\"token operator\">=<\/span>{\r\n            <span class=\"token string\">'metric'<\/span>: <span class=\"token string\">'sales'<\/span><span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">'data'<\/span>: EachLike<span class=\"token punctuation\">(<\/span>{\r\n                <span class=\"token string\">'bucket'<\/span>: <span class=\"token operator\">Like<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'2025-01-15T10:30:00Z'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n                <span class=\"token string\">'avg_value'<\/span>: <span class=\"token operator\">Like<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">42.5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n                <span class=\"token string\">'max_value'<\/span>: <span class=\"token operator\">Like<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n                <span class=\"token string\">'count'<\/span>: <span class=\"token operator\">Like<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">120<\/span><span class=\"token punctuation\">)<\/span>\r\n            }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">'timestamp'<\/span>: <span class=\"token operator\">Like<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'2025-01-15T10:35:00Z'<\/span><span class=\"token punctuation\">)<\/span>\r\n        }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token keyword\">with<\/span> analytics_pact:\r\n        <span class=\"token comment\"># \u524d\u7aef\u5b9e\u9645\u8bf7\u6c42<\/span>\r\n        response <span class=\"token operator\">=<\/span> fetch_realtime_metrics<span class=\"token punctuation\">(<\/span><span class=\"token string\">'sales'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'1m'<\/span><span class=\"token punctuation\">)<\/span>\r\n        \r\n        <span class=\"token comment\"># \u65ad\u8a00\u54cd\u5e94\u7b26\u5408\u5951\u7ea6<\/span>\r\n        assert response<span class=\"token punctuation\">[<\/span><span class=\"token string\">'metric'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">'sales'<\/span>\r\n        assert isinstance<span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">[<\/span><span class=\"token string\">'data'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> list<span class=\"token punctuation\">)<\/span>\r\n        assert <span class=\"token keyword\">all<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'bucket'<\/span> <span class=\"token operator\">in<\/span> item <span class=\"token keyword\">for<\/span> item <span class=\"token operator\">in<\/span> response<span class=\"token punctuation\">[<\/span><span class=\"token string\">'data'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\"># \u5951\u7ea6\u9a8c\u8bc1(\u540e\u7aef\u4fa7)<\/span>\r\n<span class=\"token comment\"># tests\/provider\/test_pact_verification.py<\/span>\r\n<span class=\"token keyword\">from<\/span> pact <span class=\"token keyword\">import<\/span> Verifier\r\n\r\ndef test_verify_pacts_against_backend<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\r\n    \u540e\u7aef\u9a8c\u8bc1:\u786e\u4fdd\u5b9e\u9645\u5b9e\u73b0\u6ee1\u8db3\u6240\u6709\u6d88\u8d39\u8005\u7684\u5951\u7ea6\r\n    \"\"\"<\/span>\r\n    verifier <span class=\"token operator\">=<\/span> Verifier<span class=\"token punctuation\">(<\/span>\r\n        provider<span class=\"token operator\">=<\/span><span class=\"token string\">'backend-api'<\/span><span class=\"token punctuation\">,<\/span>\r\n        provider_base_url<span class=\"token operator\">=<\/span><span class=\"token string\">'http:\/\/localhost:8000'<\/span>\r\n    <span class=\"token punctuation\">)<\/span>\r\n    \r\n    success<span class=\"token punctuation\">,<\/span> output <span class=\"token operator\">=<\/span> verifier<span class=\"token punctuation\">.<\/span>verify_pacts<span class=\"token punctuation\">(<\/span>\r\n        <span class=\"token string\">'.\/pacts\/frontend-dashboard-backend-api.json'<\/span>\r\n    <span class=\"token punctuation\">)<\/span>\r\n    \r\n    assert success <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> f<span class=\"token string\">\"Pact verification failed: {output}\"<\/span><\/code><\/pre>\n<ul id=\"code_id_15\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5951\u7ea6\u6d4b\u8bd5\u7684\u4ef7\u503c:**\u524d\u540e\u7aef\u72ec\u7acb\u5f00\u53d1\u65f6,\u786e\u4fdd\u63a5\u53e3\u4e00\u81f4\u6027,\u907f\u514d\u96c6\u6210\u65f6\u7684&#8221;\u60ca\u559c&#8221;**\u3002<\/p>\n<p>Step 8: \u7aef\u5230\u7aef\u6d4b\u8bd5<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_16\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: test<span class=\"token operator\">-<\/span>automator <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u5173\u952e\u7528\u6237\u6d41\u7a0b\u7684\u5b8c\u6574\u6d4b\u8bd5\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token comment\">\/\/ e2e\/dashboard-realtime.spec.ts<\/span>\r\n<span class=\"token keyword\">import<\/span> { test<span class=\"token punctuation\">,<\/span> expect } <span class=\"token keyword\">from<\/span> <span class=\"token string\">'@playwright\/test'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\ntest<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">describe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Realtime Dashboard'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> {\r\n  test<span class=\"token punctuation\">(<\/span><span class=\"token string\">'should display real-time analytics updates'<\/span><span class=\"token punctuation\">,<\/span> async <span class=\"token punctuation\">(<\/span>{ page }<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> {\r\n    <span class=\"token comment\">\/\/ 1. \u767b\u5f55<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">goto<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'\/login'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span>fill<span class=\"token punctuation\">(<\/span><span class=\"token string\">'[data-testid=\"email\"]'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'test@example.com'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span>fill<span class=\"token punctuation\">(<\/span><span class=\"token string\">'[data-testid=\"password\"]'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'password123'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span>click<span class=\"token punctuation\">(<\/span><span class=\"token string\">'[data-testid=\"login-button\"]'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toHaveURL<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\/dashboards'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ 2. \u8fdb\u5165\u4eea\u8868\u677f<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span>click<span class=\"token punctuation\">(<\/span><span class=\"token string\">'[data-testid=\"dashboard-1\"]'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toHaveURL<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\/dashboards\/1'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ 3. \u7b49\u5f85WebSocket\u8fde\u63a5<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'.status.connected'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toBeVisible<span class=\"token punctuation\">(<\/span>{ timeout: <span class=\"token number\">5000<\/span> }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ 4. \u9a8c\u8bc1\u56fe\u8868\u6e32\u67d3<\/span>\r\n    const chart <span class=\"token operator\">=<\/span> page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'[data-testid=\"chart-sales\"]'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>chart<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toBeVisible<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ 5. \u6a21\u62df\u5b9e\u65f6\u6570\u636e\u66f4\u65b0(\u901a\u8fc7WebSocket\u6ce8\u5165)<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span>evaluate<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> {\r\n      const event <span class=\"token operator\">=<\/span> new MessageEvent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'message'<\/span><span class=\"token punctuation\">,<\/span> {\r\n        <span class=\"token keyword\">data<\/span>: JSON<span class=\"token punctuation\">.<\/span>stringify<span class=\"token punctuation\">(<\/span>{\r\n          bucket: new <span class=\"token keyword\">Date<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toISOString<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n          avg_value: <span class=\"token number\">55.5<\/span><span class=\"token punctuation\">,<\/span>\r\n          max_value: <span class=\"token number\">120.0<\/span><span class=\"token punctuation\">,<\/span>\r\n          count: <span class=\"token number\">150<\/span>\r\n        }<span class=\"token punctuation\">)<\/span>\r\n      }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n      window<span class=\"token punctuation\">.<\/span>dispatchEvent<span class=\"token punctuation\">(<\/span>event<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ 6. \u9a8c\u8bc1\u56fe\u8868\u66f4\u65b0<\/span>\r\n    await page<span class=\"token punctuation\">.<\/span>waitForTimeout<span class=\"token punctuation\">(<\/span><span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7b49\u5f85\u6e32\u67d3<\/span>\r\n    const chartData <span class=\"token operator\">=<\/span> await page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'.recharts-line-curve'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>getAttribute<span class=\"token punctuation\">(<\/span><span class=\"token string\">'d'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    expect<span class=\"token punctuation\">(<\/span>chartData<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toBeTruthy<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u56fe\u8868\u8def\u5f84\u5df2\u66f4\u65b0<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ 7. \u9a8c\u8bc1\u5b9e\u65f6\u72b6\u6001\u6307\u793a\u5668<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'.status.connected'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toContainText<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\u5b9e\u65f6'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  \r\n  test<span class=\"token punctuation\">(<\/span><span class=\"token string\">'should handle WebSocket disconnection gracefully'<\/span><span class=\"token punctuation\">,<\/span> async <span class=\"token punctuation\">(<\/span>{ page<span class=\"token punctuation\">,<\/span> context }<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">&gt;<\/span> {\r\n    await page<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">goto<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'\/dashboards\/1'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ \u6a21\u62df\u7f51\u7edc\u65ad\u5f00<\/span>\r\n    await context<span class=\"token punctuation\">.<\/span>setOffline<span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ \u9a8c\u8bc1\u79bb\u7ebf\u72b6\u6001<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'.status.disconnected'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toBeVisible<span class=\"token punctuation\">(<\/span>{ timeout: <span class=\"token number\">5000<\/span> }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'.status.disconnected'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toContainText<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\u79bb\u7ebf'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ \u6062\u590d\u7f51\u7edc<\/span>\r\n    await context<span class=\"token punctuation\">.<\/span>setOffline<span class=\"token punctuation\">(<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token comment\">\/\/ \u9a8c\u8bc1\u81ea\u52a8\u91cd\u8fde<\/span>\r\n    await expect<span class=\"token punctuation\">(<\/span>page<span class=\"token punctuation\">.<\/span>locator<span class=\"token punctuation\">(<\/span><span class=\"token string\">'.status.connected'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>toBeVisible<span class=\"token punctuation\">(<\/span>{ timeout: <span class=\"token number\">10000<\/span> }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  }<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n}<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<ul id=\"code_id_16\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>E2E\u6d4b\u8bd5\u7684\u4ef7\u503c:\u4ece\u7528\u6237\u89c6\u89d2\u9a8c\u8bc1\u5b8c\u6574\u6d41\u7a0b,\u53d1\u73b0\u96c6\u6210\u95ee\u9898\u548c\u8fb9\u754c\u60c5\u51b5\u3002<\/p>\n<p>Step 9: \u5b89\u5168\u5ba1\u8ba1<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_17\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: security<span class=\"token operator\">-<\/span>auditor <span class=\"token punctuation\">(<\/span>Opus\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: OWASP <span class=\"token keyword\">Top<\/span> <span class=\"token number\">10<\/span>\u6f0f\u6d1e\u626b\u63cf\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> \u5b89\u5168\u5ba1\u8ba1\u62a5\u544a <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span>\r\n\u65e5\u671f: <span class=\"token number\">2025<\/span><span class=\"token operator\">-<\/span><span class=\"token number\">01<\/span><span class=\"token operator\">-<\/span><span class=\"token number\">15<\/span>\r\n\u5ba1\u8ba1\u8303\u56f4: \u5b9e\u65f6\u5206\u6790\u4eea\u8868\u677f\u529f\u80fd\r\n\r\n<span class=\"token comment\">## \u53d1\u73b0\u7684\u95ee\u9898<\/span>\r\n\r\n<span class=\"token comment\">### \ud83d\udd34 \u9ad8\u5371 - SQL\u6ce8\u5165\u98ce\u9669 (\u5df2\u4fee\u590d)<\/span>\r\n\u4f4d\u7f6e: app<span class=\"token operator\">\/<\/span>services<span class=\"token operator\">\/<\/span>analytics_service<span class=\"token punctuation\">.<\/span>py:<span class=\"token number\">45<\/span>\r\n\u95ee\u9898: \u76f4\u63a5\u62fc\u63a5metric\u53c2\u6570\u5230<span class=\"token keyword\">SQL<\/span>\u67e5\u8be2\r\n\u4fee\u590d: \u4f7f\u7528\u53c2\u6570\u5316\u67e5\u8be2<span class=\"token punctuation\">,<\/span>SQLAlchemy\u81ea\u52a8\u8f6c\u4e49\r\n\r\n<span class=\"token comment\">### \ud83d\udfe1 \u4e2d\u5371 - WebSocket DoS\u98ce\u9669<\/span>\r\n\u4f4d\u7f6e: app<span class=\"token operator\">\/<\/span>api<span class=\"token operator\">\/<\/span>v1<span class=\"token operator\">\/<\/span>analytics<span class=\"token punctuation\">.<\/span>py:websocket_analytics\r\n\u95ee\u9898: \u672a\u9650\u5236\u5355\u7528\u6237WebSocket\u8fde\u63a5\u6570\r\n\u5efa\u8bae: \r\n  <span class=\"token operator\">-<\/span> \u5b9e\u73b0\u8fde\u63a5\u6c60\u7ba1\u7406<span class=\"token punctuation\">,<\/span>\u5355\u7528\u6237\u6700\u591a<span class=\"token number\">5<\/span>\u4e2a\u5e76\u53d1\u8fde\u63a5\r\n  <span class=\"token operator\">-<\/span> \u6dfb\u52a0\u8fde\u63a5\u901f\u7387\u9650\u5236<span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span>\u79d2\u5185\u6700\u591a\u5efa\u7acb<span class=\"token number\">3<\/span>\u4e2a\u8fde\u63a5<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u5b9e\u73b0\u5fc3\u8df3\u8d85\u65f6\u673a\u5236<span class=\"token punctuation\">(<\/span><span class=\"token number\">60<\/span>\u79d2\u65e0\u5fc3\u8df3\u5219\u65ad\u5f00<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">### \ud83d\udfe1 \u4e2d\u5371 - JWT token\u672a\u64a4\u9500\u673a\u5236<\/span>\r\n\u4f4d\u7f6e: app<span class=\"token operator\">\/<\/span>core<span class=\"token operator\">\/<\/span>security<span class=\"token punctuation\">.<\/span>py\r\n\u95ee\u9898: \u7528\u6237\u767b\u51fa\u540etoken\u4ecd\u7136\u6709\u6548\u76f4\u5230\u8fc7\u671f\r\n\u5efa\u8bae:\r\n  <span class=\"token operator\">-<\/span> \u5b9e\u73b0token\u9ed1\u540d\u5355<span class=\"token punctuation\">(<\/span>Redis\u5b58\u50a8<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u6216\u4f7f\u7528\u77ed\u671ftoken <span class=\"token operator\">+<\/span> refresh token\u673a\u5236\r\n\r\n<span class=\"token comment\">### \ud83d\udfe2 \u4f4e\u5371 - CORS\u914d\u7f6e\u8fc7\u4e8e\u5bbd\u677e<\/span>\r\n\u4f4d\u7f6e: app<span class=\"token operator\">\/<\/span>main<span class=\"token punctuation\">.<\/span>py:CORS middleware\r\n\u95ee\u9898: allow_origins<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">'*'<\/span><span class=\"token punctuation\">]<\/span>\u5141\u8bb8\u4efb\u610f\u6e90\r\n\u5efa\u8bae: \u660e\u786e\u6307\u5b9a\u5141\u8bb8\u7684\u57df\u540d\r\n\r\n<span class=\"token comment\">## \u5b89\u5168\u52a0\u56fa\u5efa\u8bae<\/span>\r\n\r\n<span class=\"token number\">1.<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\u8ba4\u8bc1\u589e\u5f3a<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n   <span class=\"token operator\">-<\/span> \u5b9e\u65bdMFA<span class=\"token punctuation\">(<\/span>\u591a\u56e0\u7d20\u8ba4\u8bc1<span class=\"token punctuation\">)<\/span>\r\n   <span class=\"token operator\">-<\/span> \u6dfb\u52a0\u8bbe\u5907\u6307\u7eb9\u8bc6\u522b\r\n   <span class=\"token operator\">-<\/span> \u5b9e\u73b0\u53ef\u7591\u767b\u5f55\u544a\u8b66\r\n\r\n<span class=\"token number\">2.<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>API\u5b89\u5168<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n   <span class=\"token operator\">-<\/span> \u6dfb\u52a0\u8bf7\u6c42\u7b7e\u540d\u9a8c\u8bc1\r\n   <span class=\"token operator\">-<\/span> \u5b9e\u65bdAPI\u901f\u7387\u9650\u5236<span class=\"token punctuation\">(<\/span>\u6bcf\u7528\u6237<span class=\"token number\">100<\/span>\u8bf7\u6c42<span class=\"token operator\">\/<\/span>\u5206\u949f<span class=\"token punctuation\">)<\/span>\r\n   <span class=\"token operator\">-<\/span> \u542f\u7528API\u5bc6\u94a5\u8f6e\u6362\u673a\u5236\r\n\r\n<span class=\"token number\">3.<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\u6570\u636e\u4fdd\u62a4<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n   <span class=\"token operator\">-<\/span> \u654f\u611f\u6570\u636e\u5b57\u6bb5\u52a0\u5bc6<span class=\"token punctuation\">(<\/span>AES<span class=\"token operator\">-<\/span><span class=\"token number\">256<\/span><span class=\"token punctuation\">)<\/span>\r\n   <span class=\"token operator\">-<\/span> \u5b9e\u65bd\u6570\u636e\u8131\u654f<span class=\"token punctuation\">(<\/span>\u65e5\u5fd7\u4e2d\u4e0d\u8bb0\u5f55PII<span class=\"token punctuation\">)<\/span>\r\n   <span class=\"token operator\">-<\/span> \u542f\u7528\u6570\u636e\u5e93\u8fde\u63a5\u52a0\u5bc6<span class=\"token punctuation\">(<\/span>SSL<span class=\"token operator\">\/<\/span>TLS<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token number\">4.<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\u76d1\u63a7\u544a\u8b66<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n   <span class=\"token operator\">-<\/span> \u5f02\u5e38\u67e5\u8be2\u6a21\u5f0f\u68c0\u6d4b\r\n   <span class=\"token operator\">-<\/span> \u66b4\u529b\u7834\u89e3\u5c1d\u8bd5\u544a\u8b66\r\n   <span class=\"token operator\">-<\/span> \u6743\u9650\u63d0\u5347\u884c\u4e3a\u76d1\u63a7\r\n\r\n<span class=\"token comment\">## \u5408\u89c4\u6027\u68c0\u67e5<\/span>\r\n\u2705 OWASP ASVS <span class=\"token keyword\">Level<\/span> <span class=\"token number\">2<\/span>\r\n\u2705 GDPR\u6570\u636e\u4fdd\u62a4\u8981\u6c42\r\n\u2705 SOC2 <span class=\"token keyword\">Type<\/span> II\u63a7\u5236\r\n\u274c PCI<span class=\"token operator\">-<\/span>DSS<span class=\"token punctuation\">(<\/span>\u4e0d\u9002\u7528<span class=\"token punctuation\">,<\/span>\u65e0\u652f\u4ed8\u6570\u636e<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_17\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5b89\u5168\u5ba1\u8ba1\u7684\u4ef7\u503c:\u5728\u4e0a\u7ebf\u524d\u53d1\u73b0\u5e76\u4fee\u590d\u6f0f\u6d1e,\u907f\u514d\u6570\u636e\u6cc4\u9732\u548c\u4e1a\u52a1\u635f\u5931\u3002<\/p>\n<h4>\u9636\u6bb54\uff1a\u90e8\u7f72\u4e0e\u8fd0\u7ef4(\u751f\u4ea7\u5c31\u7eea)<\/h4>\n<p>Step 10: \u57fa\u7840\u8bbe\u65bd\u914d\u7f6e<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_18\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: deployment<span class=\"token operator\">-<\/span>engineer <span class=\"token punctuation\">(<\/span>Sonnet\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: Kubernetes\u90e8\u7f72\u914d\u7f6e\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token comment\"># k8s\/dashboard-api\/deployment.yaml<\/span>\r\napiVersion: apps<span class=\"token operator\">\/<\/span>v1\r\nkind: Deployment\r\nmetadata:\r\n  name: dashboard<span class=\"token operator\">-<\/span>api\r\n  labels:\r\n    app: dashboard<span class=\"token operator\">-<\/span>api\r\n    version: v1<span class=\"token punctuation\">.<\/span><span class=\"token number\">0.0<\/span>\r\nspec:\r\n  replicas: <span class=\"token number\">3<\/span>  <span class=\"token comment\"># \u9ad8\u53ef\u7528,3\u4e2a\u526f\u672c<\/span>\r\n  strategy:\r\n    <span class=\"token keyword\">type<\/span>: RollingUpdate\r\n    rollingUpdate:\r\n      maxSurge: <span class=\"token number\">1<\/span>        <span class=\"token comment\"># \u6eda\u52a8\u66f4\u65b0\u65f6\u6700\u591a\u591a1\u4e2aPod<\/span>\r\n      maxUnavailable: <span class=\"token number\">0<\/span>  <span class=\"token comment\"># \u96f6\u505c\u673a\u90e8\u7f72<\/span>\r\n  selector:\r\n    matchLabels:\r\n      app: dashboard<span class=\"token operator\">-<\/span>api\r\n  template:\r\n    metadata:\r\n      labels:\r\n        app: dashboard<span class=\"token operator\">-<\/span>api\r\n        version: v1<span class=\"token punctuation\">.<\/span><span class=\"token number\">0.0<\/span>\r\n      annotations:\r\n        prometheus<span class=\"token punctuation\">.<\/span>io<span class=\"token operator\">\/<\/span>scrape: <span class=\"token string\">\"true\"<\/span>\r\n        prometheus<span class=\"token punctuation\">.<\/span>io<span class=\"token operator\">\/<\/span>port: <span class=\"token string\">\"8000\"<\/span>\r\n        prometheus<span class=\"token punctuation\">.<\/span>io<span class=\"token operator\">\/<\/span>path: <span class=\"token string\">\"\/metrics\"<\/span>\r\n    spec:\r\n      containers:\r\n      <span class=\"token operator\">-<\/span> name: api\r\n        image: registry<span class=\"token punctuation\">.<\/span>example<span class=\"token punctuation\">.<\/span>com<span class=\"token operator\">\/<\/span>dashboard<span class=\"token operator\">-<\/span>api:v1<span class=\"token punctuation\">.<\/span><span class=\"token number\">0.0<\/span>\r\n        ports:\r\n        <span class=\"token operator\">-<\/span> containerPort: <span class=\"token number\">8000<\/span>\r\n          name: http\r\n        env:\r\n        <span class=\"token operator\">-<\/span> name: DATABASE_URL\r\n          valueFrom:\r\n            secretKeyRef:\r\n              name: dashboard<span class=\"token operator\">-<\/span>secrets\r\n              <span class=\"token keyword\">key<\/span>: <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>url\r\n        <span class=\"token operator\">-<\/span> name: REDIS_URL\r\n          valueFrom:\r\n            secretKeyRef:\r\n              name: dashboard<span class=\"token operator\">-<\/span>secrets\r\n              <span class=\"token keyword\">key<\/span>: redis<span class=\"token operator\">-<\/span>url\r\n        <span class=\"token operator\">-<\/span> name: JWT_SECRET\r\n          valueFrom:\r\n            secretKeyRef:\r\n              name: dashboard<span class=\"token operator\">-<\/span>secrets\r\n              <span class=\"token keyword\">key<\/span>: jwt<span class=\"token operator\">-<\/span>secret\r\n        resources:\r\n          requests:\r\n            cpu: <span class=\"token string\">\"500m\"<\/span>      <span class=\"token comment\"># 0.5\u6838<\/span>\r\n            memory: <span class=\"token string\">\"512Mi\"<\/span>\r\n          limits:\r\n            cpu: <span class=\"token string\">\"1000m\"<\/span>     <span class=\"token comment\"># \u6700\u591a1\u6838<\/span>\r\n            memory: <span class=\"token string\">\"1Gi\"<\/span>\r\n        livenessProbe:      <span class=\"token comment\"># \u5b58\u6d3b\u63a2\u9488,\u5931\u8d25\u5219\u91cd\u542fPod<\/span>\r\n          httpGet:\r\n            path: <span class=\"token operator\">\/<\/span>health\r\n            port: <span class=\"token number\">8000<\/span>\r\n          initialDelaySeconds: <span class=\"token number\">30<\/span>\r\n          periodSeconds: <span class=\"token number\">10<\/span>\r\n          timeoutSeconds: <span class=\"token number\">5<\/span>\r\n          failureThreshold: <span class=\"token number\">3<\/span>\r\n        readinessProbe:     <span class=\"token comment\"># \u5c31\u7eea\u63a2\u9488,\u672a\u5c31\u7eea\u5219\u4e0d\u63a5\u6536\u6d41\u91cf<\/span>\r\n          httpGet:\r\n            path: <span class=\"token operator\">\/<\/span>ready\r\n            port: <span class=\"token number\">8000<\/span>\r\n          initialDelaySeconds: <span class=\"token number\">5<\/span>\r\n          periodSeconds: <span class=\"token number\">5<\/span>\r\n          timeoutSeconds: <span class=\"token number\">3<\/span>\r\n          failureThreshold: <span class=\"token number\">2<\/span>\r\n        volumeMounts:\r\n        <span class=\"token operator\">-<\/span> name: config\r\n          mountPath: <span class=\"token operator\">\/<\/span>app<span class=\"token operator\">\/<\/span>config\r\n          readOnly: <span class=\"token boolean\">true<\/span>\r\n      volumes:\r\n      <span class=\"token operator\">-<\/span> name: config\r\n        configMap:\r\n          name: dashboard<span class=\"token operator\">-<\/span>config\r\n\r\n<span class=\"token comment\">---<\/span>\r\n<span class=\"token comment\"># k8s\/dashboard-api\/hpa.yaml (\u6c34\u5e73Pod\u81ea\u52a8\u6269\u7f29\u5bb9)<\/span>\r\napiVersion: autoscaling<span class=\"token operator\">\/<\/span>v2\r\nkind: HorizontalPodAutoscaler\r\nmetadata:\r\n  name: dashboard<span class=\"token operator\">-<\/span>api<span class=\"token operator\">-<\/span>hpa\r\nspec:\r\n  scaleTargetRef:\r\n    apiVersion: apps<span class=\"token operator\">\/<\/span>v1\r\n    kind: Deployment\r\n    name: dashboard<span class=\"token operator\">-<\/span>api\r\n  minReplicas: <span class=\"token number\">3<\/span>\r\n  maxReplicas: <span class=\"token number\">10<\/span>\r\n  metrics:\r\n  <span class=\"token operator\">-<\/span> <span class=\"token keyword\">type<\/span>: Resource\r\n    resource:\r\n      name: cpu\r\n      target:\r\n        <span class=\"token keyword\">type<\/span>: Utilization\r\n        averageUtilization: <span class=\"token number\">70<\/span>  <span class=\"token comment\"># CPU\u8d85\u8fc770%\u65f6\u6269\u5bb9<\/span>\r\n  <span class=\"token operator\">-<\/span> <span class=\"token keyword\">type<\/span>: Resource\r\n    resource:\r\n      name: memory\r\n      target:\r\n        <span class=\"token keyword\">type<\/span>: Utilization\r\n        averageUtilization: <span class=\"token number\">80<\/span>  <span class=\"token comment\"># \u5185\u5b58\u8d85\u8fc780%\u65f6\u6269\u5bb9<\/span>\r\n  behavior:  <span class=\"token comment\"># \u6269\u7f29\u5bb9\u884c\u4e3a\u63a7\u5236<\/span>\r\n    scaleUp:\r\n      stabilizationWindowSeconds: <span class=\"token number\">60<\/span>   <span class=\"token comment\"># 1\u5206\u949f\u5185\u89c2\u5bdf\u5230\u6301\u7eed\u9ad8\u8d1f\u8f7d\u624d\u6269\u5bb9<\/span>\r\n      policies:\r\n      <span class=\"token operator\">-<\/span> <span class=\"token keyword\">type<\/span>: <span class=\"token keyword\">Percent<\/span>\r\n        <span class=\"token keyword\">value<\/span>: <span class=\"token number\">50<\/span>              <span class=\"token comment\"># \u6bcf\u6b21\u6700\u591a\u6269\u5bb950%<\/span>\r\n        periodSeconds: <span class=\"token number\">60<\/span>\r\n    scaleDown:\r\n      stabilizationWindowSeconds: <span class=\"token number\">300<\/span>  <span class=\"token comment\"># 5\u5206\u949f\u5185\u89c2\u5bdf\u5230\u6301\u7eed\u4f4e\u8d1f\u8f7d\u624d\u7f29\u5bb9<\/span>\r\n      policies:\r\n      <span class=\"token operator\">-<\/span> <span class=\"token keyword\">type<\/span>: Pods\r\n        <span class=\"token keyword\">value<\/span>: <span class=\"token number\">1<\/span>               <span class=\"token comment\"># \u6bcf\u6b21\u6700\u591a\u7f29\u5bb91\u4e2aPod<\/span>\r\n        periodSeconds: <span class=\"token number\">120<\/span><\/code><\/pre>\n<ul id=\"code_id_18\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<li>70.<\/li>\n<li>71.<\/li>\n<li>72.<\/li>\n<li>73.<\/li>\n<li>74.<\/li>\n<li>75.<\/li>\n<li>76.<\/li>\n<li>77.<\/li>\n<li>78.<\/li>\n<li>79.<\/li>\n<li>80.<\/li>\n<li>81.<\/li>\n<li>82.<\/li>\n<li>83.<\/li>\n<li>84.<\/li>\n<li>85.<\/li>\n<li>86.<\/li>\n<li>87.<\/li>\n<li>88.<\/li>\n<li>89.<\/li>\n<li>90.<\/li>\n<li>91.<\/li>\n<li>92.<\/li>\n<li>93.<\/li>\n<li>94.<\/li>\n<li>95.<\/li>\n<li>96.<\/li>\n<li>97.<\/li>\n<li>98.<\/li>\n<li>99.<\/li>\n<li>100.<\/li>\n<li>101.<\/li>\n<li>102.<\/li>\n<li>103.<\/li>\n<li>104.<\/li>\n<li>105.<\/li>\n<li>106.<\/li>\n<li>107.<\/li>\n<li>108.<\/li>\n<li>109.<\/li>\n<li>110.<\/li>\n<li>111.<\/li>\n<li>112.<\/li>\n<li>113.<\/li>\n<li>114.<\/li>\n<li>115.<\/li>\n<li>116.<\/li>\n<li>117.<\/li>\n<li>118.<\/li>\n<li>119.<\/li>\n<li>120.<\/li>\n<li>121.<\/li>\n<li>122.<\/li>\n<li>123.<\/li>\n<li>124.<\/li>\n<li>125.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u90e8\u7f72\u7b56\u7565:<\/p>\n<ul data-id=\"u738a58b-dzfB83eR\">\n<li data-id=\"ld70c578-x7FeLcjL\">\u96f6\u505c\u673a\u90e8\u7f72:\u00a0<code>maxUnavailable: 0<\/code>\u786e\u4fdd\u59cb\u7ec8\u6709\u5065\u5eb7\u7684Pod\u5904\u7406\u8bf7\u6c42<\/li>\n<li data-id=\"ld70c578-Eq8JeJqG\">\u81ea\u52a8\u6269\u7f29\u5bb9: \u57fa\u4e8eCPU\/\u5185\u5b58\u6307\u6807\u52a8\u6001\u8c03\u6574\u526f\u672c\u6570<\/li>\n<li data-id=\"ld70c578-xNC8YKSn\">\u5065\u5eb7\u68c0\u67e5: liveness\u63a2\u9488(\u91cd\u542f)+ readiness\u63a2\u9488(\u6d41\u91cf\u63a7\u5236)<\/li>\n<li data-id=\"ld70c578-PQuPoQgz\">\u8d44\u6e90\u9650\u5236: requests(\u4fdd\u8bc1)+ limits(\u4e0a\u9650)\u907f\u514d\u8d44\u6e90\u4e89\u62a2<\/li>\n<\/ul>\n<p>Step 11: \u53ef\u89c2\u6d4b\u6027\u914d\u7f6e<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_19\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: observability<span class=\"token operator\">-<\/span>engineer <span class=\"token punctuation\">(<\/span>Opus\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u76d1\u63a7\u544a\u8b66\u4f53\u7cfb\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token comment\"># monitoring\/prometheus-rules.yaml<\/span>\r\napiVersion: monitoring<span class=\"token punctuation\">.<\/span>coreos<span class=\"token punctuation\">.<\/span>com<span class=\"token operator\">\/<\/span>v1\r\nkind: PrometheusRule\r\nmetadata:\r\n  name: dashboard<span class=\"token operator\">-<\/span>alerts\r\nspec:\r\n  groups:\r\n  <span class=\"token operator\">-<\/span> name: dashboard<span class=\"token operator\">-<\/span>api\r\n    <span class=\"token keyword\">interval<\/span>: <span class=\"token number\">30<\/span>s\r\n    rules:\r\n    <span class=\"token comment\"># \u9519\u8bef\u7387\u544a\u8b66<\/span>\r\n    <span class=\"token operator\">-<\/span> alert: HighErrorRate\r\n      expr: <span class=\"token operator\">|<\/span>\r\n        <span class=\"token function\">sum<\/span><span class=\"token punctuation\">(<\/span>rate<span class=\"token punctuation\">(<\/span>http_requests_total{<span class=\"token keyword\">status<\/span><span class=\"token operator\">=<\/span><span class=\"token operator\">~<\/span><span class=\"token string\">\"5..\"<\/span>}<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span>m<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> \r\n        <span class=\"token operator\">\/<\/span> \r\n        <span class=\"token function\">sum<\/span><span class=\"token punctuation\">(<\/span>rate<span class=\"token punctuation\">(<\/span>http_requests_total<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span>m<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> \r\n        <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.05<\/span>\r\n      <span class=\"token keyword\">for<\/span>: <span class=\"token number\">5<\/span>m\r\n      labels:\r\n        severity: critical\r\n      annotations:\r\n        summary: <span class=\"token string\">\"API\u9519\u8bef\u7387\u8d85\u8fc75%\"<\/span>\r\n        description: <span class=\"token string\">\"{{ $labels.instance }} \u9519\u8bef\u7387: {{ $value | humanizePercentage }}\"<\/span>\r\n    \r\n    <span class=\"token comment\"># \u54cd\u5e94\u65f6\u95f4\u544a\u8b66<\/span>\r\n    <span class=\"token operator\">-<\/span> alert: HighLatency\r\n      expr: <span class=\"token operator\">|<\/span>\r\n        histogram_quantile<span class=\"token punctuation\">(<\/span><span class=\"token number\">0.99<\/span><span class=\"token punctuation\">,<\/span> \r\n          <span class=\"token function\">sum<\/span><span class=\"token punctuation\">(<\/span>rate<span class=\"token punctuation\">(<\/span>http_request_duration_seconds_bucket<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span>m<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">by<\/span> <span class=\"token punctuation\">(<\/span>le<span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">2.0<\/span>\r\n      <span class=\"token keyword\">for<\/span>: <span class=\"token number\">10<\/span>m\r\n      labels:\r\n        severity: warning\r\n      annotations:\r\n        summary: <span class=\"token string\">\"API P99\u5ef6\u8fdf\u8d85\u8fc72\u79d2\"<\/span>\r\n        description: <span class=\"token string\">\"P99\u5ef6\u8fdf: {{ $value | humanizeDuration }}\"<\/span>\r\n    \r\n    <span class=\"token comment\"># WebSocket\u8fde\u63a5\u6570\u544a\u8b66<\/span>\r\n    <span class=\"token operator\">-<\/span> alert: TooManyWebSocketConnections\r\n      expr: <span class=\"token operator\">|<\/span>\r\n        websocket_active_connections <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">8000<\/span>\r\n      <span class=\"token keyword\">for<\/span>: <span class=\"token number\">5<\/span>m\r\n      labels:\r\n        severity: warning\r\n      annotations:\r\n        summary: <span class=\"token string\">\"WebSocket\u8fde\u63a5\u6570\u63a5\u8fd1\u4e0a\u9650\"<\/span>\r\n        description: <span class=\"token string\">\"\u5f53\u524d\u8fde\u63a5\u6570: {{ $value }},\u4e0a\u965010000\"<\/span>\r\n    \r\n    <span class=\"token comment\"># \u6570\u636e\u5e93\u8fde\u63a5\u6c60\u8017\u5c3d<\/span>\r\n    <span class=\"token operator\">-<\/span> alert: DatabasePoolExhaustion\r\n      expr: <span class=\"token operator\">|<\/span>\r\n        <span class=\"token punctuation\">(<\/span>database_pool_active_connections <span class=\"token operator\">\/<\/span> database_pool_max_connections<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.9<\/span>\r\n      <span class=\"token keyword\">for<\/span>: <span class=\"token number\">3<\/span>m\r\n      labels:\r\n        severity: critical\r\n      annotations:\r\n        summary: <span class=\"token string\">\"\u6570\u636e\u5e93\u8fde\u63a5\u6c60\u5373\u5c06\u8017\u5c3d\"<\/span>\r\n        description: <span class=\"token string\">\"\u4f7f\u7528\u7387: {{ $value | humanizePercentage }}\"<\/span>\r\n\r\n<span class=\"token comment\"># monitoring\/grafana-dashboard.json (\u7cbe\u7b80)<\/span>\r\n{\r\n  <span class=\"token string\">\"dashboard\"<\/span>: {\r\n    <span class=\"token string\">\"title\"<\/span>: <span class=\"token string\">\"Dashboard API\u76d1\u63a7\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"panels\"<\/span>: <span class=\"token punctuation\">[<\/span>\r\n      {\r\n        <span class=\"token string\">\"title\"<\/span>: <span class=\"token string\">\"\u8bf7\u6c42\u541e\u5410\u91cf\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"targets\"<\/span>: <span class=\"token punctuation\">[<\/span>{\r\n          <span class=\"token string\">\"expr\"<\/span>: <span class=\"token string\">\"sum(rate(http_requests_total[1m])) by (endpoint)\"<\/span>\r\n        }<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"type\"<\/span>: <span class=\"token string\">\"graph\"<\/span>\r\n      }<span class=\"token punctuation\">,<\/span>\r\n      {\r\n        <span class=\"token string\">\"title\"<\/span>: <span class=\"token string\">\"\u9519\u8bef\u7387\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"targets\"<\/span>: <span class=\"token punctuation\">[<\/span>{\r\n          <span class=\"token string\">\"expr\"<\/span>: <span class=\"token string\">\"sum(rate(http_requests_total{status=~\\\"5..\\\"}[5m])) \/ sum(rate(http_requests_total[5m]))\"<\/span>\r\n        }<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"type\"<\/span>: <span class=\"token string\">\"singlestat\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"thresholds\"<\/span>: <span class=\"token string\">\"0.01,0.05\"<\/span>  <span class=\"token comment\">\/\/ 1%\u9ec4\u8272,5%\u7ea2\u8272<\/span>\r\n      }<span class=\"token punctuation\">,<\/span>\r\n      {\r\n        <span class=\"token string\">\"title\"<\/span>: <span class=\"token string\">\"\u5ef6\u8fdf\u5206\u5e03(P50\/P90\/P99)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"targets\"<\/span>: <span class=\"token punctuation\">[<\/span>\r\n          {<span class=\"token string\">\"expr\"<\/span>: <span class=\"token string\">\"histogram_quantile(0.50, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))\"<\/span>}<span class=\"token punctuation\">,<\/span>\r\n          {<span class=\"token string\">\"expr\"<\/span>: <span class=\"token string\">\"histogram_quantile(0.90, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))\"<\/span>}<span class=\"token punctuation\">,<\/span>\r\n          {<span class=\"token string\">\"expr\"<\/span>: <span class=\"token string\">\"histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))\"<\/span>}\r\n        <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"type\"<\/span>: <span class=\"token string\">\"graph\"<\/span>\r\n      }<span class=\"token punctuation\">,<\/span>\r\n      {\r\n        <span class=\"token string\">\"title\"<\/span>: <span class=\"token string\">\"WebSocket\u8fde\u63a5\u6570\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"targets\"<\/span>: <span class=\"token punctuation\">[<\/span>{\r\n          <span class=\"token string\">\"expr\"<\/span>: <span class=\"token string\">\"websocket_active_connections\"<\/span>\r\n        }<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"type\"<\/span>: <span class=\"token string\">\"graph\"<\/span>\r\n      }\r\n    <span class=\"token punctuation\">]<\/span>\r\n  }\r\n}<\/code><\/pre>\n<ul id=\"code_id_19\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<li>70.<\/li>\n<li>71.<\/li>\n<li>72.<\/li>\n<li>73.<\/li>\n<li>74.<\/li>\n<li>75.<\/li>\n<li>76.<\/li>\n<li>77.<\/li>\n<li>78.<\/li>\n<li>79.<\/li>\n<li>80.<\/li>\n<li>81.<\/li>\n<li>82.<\/li>\n<li>83.<\/li>\n<li>84.<\/li>\n<li>85.<\/li>\n<li>86.<\/li>\n<li>87.<\/li>\n<li>88.<\/li>\n<li>89.<\/li>\n<li>90.<\/li>\n<li>91.<\/li>\n<li>92.<\/li>\n<li>93.<\/li>\n<li>94.<\/li>\n<li>95.<\/li>\n<li>96.<\/li>\n<li>97.<\/li>\n<li>98.<\/li>\n<li>99.<\/li>\n<li>100.<\/li>\n<li>101.<\/li>\n<li>102.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u53ef\u89c2\u6d4b\u6027\u7684\u4e09\u5927\u652f\u67f1:<\/p>\n<ul data-id=\"u738a58b-i05P9NGk\">\n<li data-id=\"ld70c578-pAtWsJmd\">\u6307\u6807(Metrics): Prometheus\u6536\u96c6\u65f6\u5e8f\u6570\u636e,Grafana\u53ef\u89c6\u5316<\/li>\n<li data-id=\"ld70c578-n2b65hxl\">\u65e5\u5fd7(Logs): ELK\/Loki\u805a\u5408\u65e5\u5fd7,\u652f\u6301\u5168\u6587\u641c\u7d22<\/li>\n<li data-id=\"ld70c578-cQSxMk6R\">\u8ffd\u8e2a(Traces): Jaeger\/Zipkin\u5206\u5e03\u5f0f\u8ffd\u8e2a,\u5b9a\u4f4d\u6027\u80fd\u74f6\u9888<\/li>\n<\/ul>\n<p>Step 12: \u6027\u80fd\u4f18\u5316<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_20\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u667a\u80fd\u4f53: performance<span class=\"token operator\">-<\/span>engineer <span class=\"token punctuation\">(<\/span>Opus\u6a21\u578b<span class=\"token punctuation\">)<\/span>\r\n\u4efb\u52a1: \u7aef\u5230\u7aef\u6027\u80fd\u4f18\u5316\r\n\r\n\u8f93\u51fa:\r\n<span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> \u6027\u80fd\u4f18\u5316\u62a5\u544a <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span>\r\n\r\n<span class=\"token comment\">## \u4f18\u5316\u524d\u57fa\u7ebf<\/span>\r\n<span class=\"token operator\">-<\/span> API\u54cd\u5e94\u65f6\u95f4<span class=\"token punctuation\">(<\/span>P99<span class=\"token punctuation\">)<\/span>: <span class=\"token number\">3.2<\/span>\u79d2\r\n<span class=\"token operator\">-<\/span> WebSocket\u6d88\u606f\u5ef6\u8fdf: <span class=\"token number\">500<\/span>ms\r\n<span class=\"token operator\">-<\/span> \u9996\u5c4f\u52a0\u8f7d\u65f6\u95f4: <span class=\"token number\">5.8<\/span>\u79d2\r\n<span class=\"token operator\">-<\/span> \u6570\u636e\u5e93\u67e5\u8be2\u65f6\u95f4: <span class=\"token number\">1.2<\/span>\u79d2\r\n\r\n<span class=\"token comment\">## \u4f18\u5316\u63aa\u65bd<\/span>\r\n\r\n<span class=\"token comment\">### 1. \u6570\u636e\u5e93\u67e5\u8be2\u4f18\u5316<\/span>\r\n\u95ee\u9898: \u65f6\u95f4\u5e8f\u5217\u67e5\u8be2\u5168\u8868\u626b\u63cf\r\n\u65b9\u6848: \r\n  <span class=\"token operator\">-<\/span> \u542f\u7528\u5206\u533a\u8868\u526a\u679d<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">partition<\/span> pruning<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u521b\u5efa\u8986\u76d6\u7d22\u5f15<span class=\"token punctuation\">(<\/span>covering <span class=\"token keyword\">index<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u4f7f\u7528\u7269\u5316\u89c6\u56fe\u9884\u805a\u5408\r\n\u6548\u679c: \u67e5\u8be2\u65f6\u95f4\u4ece<span class=\"token number\">1.2<\/span>\u79d2\u964d\u81f3<span class=\"token number\">150<\/span>ms<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">8<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">### 2. \u7f13\u5b58\u7b56\u7565\u4f18\u5316<\/span>\r\n\u95ee\u9898: Redis\u7f13\u5b58\u547d\u4e2d\u7387\u4ec5<span class=\"token number\">60<\/span><span class=\"token operator\">%<\/span>\r\n\u65b9\u6848:\r\n  <span class=\"token operator\">-<\/span> \u8c03\u6574TTL\u7b56\u7565<span class=\"token punctuation\">(<\/span>\u70ed\u6570\u636e<span class=\"token number\">30<\/span>\u79d2<span class=\"token punctuation\">,<\/span>\u6e29\u6570\u636e<span class=\"token number\">5<\/span>\u5206\u949f<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u5b9e\u65bd\u9884\u70ed\u673a\u5236<span class=\"token punctuation\">(<\/span>\u5e94\u7528\u542f\u52a8\u65f6\u52a0\u8f7dTop100\u67e5\u8be2<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u6dfb\u52a0\u5e94\u7528\u5185L1\u7f13\u5b58<span class=\"token punctuation\">(<\/span>LRU<span class=\"token punctuation\">,<\/span>\u6700\u591a<span class=\"token number\">1000<\/span>\u9879<span class=\"token punctuation\">)<\/span>\r\n\u6548\u679c: \u7f13\u5b58\u547d\u4e2d\u7387\u63d0\u5347\u81f3<span class=\"token number\">92<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">,<\/span>API\u54cd\u5e94\u65f6\u95f4\u964d\u81f3<span class=\"token number\">180<\/span>ms\r\n\r\n<span class=\"token comment\">### 3. \u524d\u7aef\u5305\u4f53\u79ef\u4f18\u5316<\/span>\r\n\u95ee\u9898: \u521d\u59cb\u5305<span class=\"token number\">3.2<\/span>MB<span class=\"token punctuation\">,<\/span>\u9996\u5c4f\u52a0\u8f7d\u6162\r\n\u65b9\u6848:\r\n  <span class=\"token operator\">-<\/span> \u4ee3\u7801\u5206\u5272<span class=\"token punctuation\">(<\/span>Code Splitting<span class=\"token punctuation\">)<\/span>:\u6309\u8def\u7531\u61d2\u52a0\u8f7d\r\n  <span class=\"token operator\">-<\/span> Tree Shaking:\u79fb\u9664\u672a\u4f7f\u7528\u4ee3\u7801\r\n  <span class=\"token operator\">-<\/span> \u4f9d\u8d56\u4f18\u5316:\u7528<span class=\"token keyword\">date<\/span><span class=\"token operator\">-<\/span>fns\u66ff\u6362moment<span class=\"token punctuation\">.<\/span>js<span class=\"token punctuation\">(<\/span>\u51cf\u5c11<span class=\"token number\">60<\/span>KB<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u56fe\u7247\u4f18\u5316:WebP\u683c\u5f0f<span class=\"token operator\">+<\/span>\u54cd\u5e94\u5f0f\u52a0\u8f7d\r\n\u6548\u679c: \u521d\u59cb\u5305\u964d\u81f3<span class=\"token number\">280<\/span>KB<span class=\"token punctuation\">,<\/span>\u9996\u5c4f\u65f6\u95f4\u964d\u81f3<span class=\"token number\">1.8<\/span>\u79d2<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">3.2<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">### 4. WebSocket\u4f18\u5316<\/span>\r\n\u95ee\u9898: \u6d88\u606f\u5ef6\u8fdf<span class=\"token number\">500<\/span>ms<span class=\"token punctuation\">,<\/span>\u6296\u52a8\u660e\u663e\r\n\u65b9\u6848:\r\n  <span class=\"token operator\">-<\/span> \u542f\u7528TCP_NODELAY<span class=\"token punctuation\">(<\/span>\u7981\u7528Nagle\u7b97\u6cd5<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u5b9e\u65bd\u6d88\u606f\u6279\u5904\u7406<span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span>ms\u5185\u7684\u6d88\u606f\u5408\u5e76\u53d1\u9001<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u4f18\u5316Redis Pub<span class=\"token operator\">\/<\/span>Sub<span class=\"token punctuation\">(<\/span>dedicated\u8fde\u63a5\u6c60<span class=\"token punctuation\">)<\/span>\r\n\u6548\u679c: \u6d88\u606f\u5ef6\u8fdf\u964d\u81f3<span class=\"token number\">50<\/span>ms<span class=\"token punctuation\">,<\/span>\u6296\u52a8<span class=\"token operator\">&lt;<\/span><span class=\"token number\">10<\/span>ms\r\n\r\n<span class=\"token comment\">### 5. \u5e76\u53d1\u5904\u7406\u4f18\u5316<\/span>\r\n\u95ee\u9898: \u9ad8\u5e76\u53d1\u65f6CPU\u4f7f\u7528\u7387<span class=\"token number\">100<\/span><span class=\"token operator\">%<\/span>\r\n\u65b9\u6848:\r\n  <span class=\"token operator\">-<\/span> \u5f02\u6b65I<span class=\"token operator\">\/<\/span>O:FastAPI\u7684async<span class=\"token operator\">\/<\/span>await\u907f\u514d\u963b\u585e\r\n  <span class=\"token operator\">-<\/span> \u8fde\u63a5\u6c60:\u6570\u636e\u5e93\u8fde\u63a5\u6c60\u4ece<span class=\"token number\">10<\/span>\u589e\u81f3<span class=\"token number\">50<\/span>\r\n  <span class=\"token operator\">-<\/span> \u5de5\u4f5c\u7ebf\u7a0b:Gunicorn workers<span class=\"token operator\">=<\/span><span class=\"token number\">2<\/span><span class=\"token operator\">*<\/span>CPU\u6838\u5fc3\u6570\r\n\u6548\u679c: \u652f\u6301\u5e76\u53d1\u7528\u6237\u4ece<span class=\"token number\">500<\/span>\u63d0\u5347\u81f3<span class=\"token number\">5000<\/span>\r\n\r\n<span class=\"token comment\">## \u4f18\u5316\u540e\u6027\u80fd<\/span>\r\n<span class=\"token operator\">-<\/span> API\u54cd\u5e94\u65f6\u95f4<span class=\"token punctuation\">(<\/span>P99<span class=\"token punctuation\">)<\/span>: <span class=\"token number\">250<\/span>ms<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">12.8<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> WebSocket\u6d88\u606f\u5ef6\u8fdf: <span class=\"token number\">50<\/span>ms<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">10<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> \u9996\u5c4f\u52a0\u8f7d\u65f6\u95f4: <span class=\"token number\">1.8<\/span>\u79d2<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">3.2<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> \u6570\u636e\u5e93\u67e5\u8be2\u65f6\u95f4: <span class=\"token number\">150<\/span>ms<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">8<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> \u541e\u5410\u91cf: <span class=\"token number\">5000<\/span> req<span class=\"token operator\">\/<\/span>s<span class=\"token punctuation\">(<\/span>\u63d0\u5347<span class=\"token number\">10<\/span>\u500d<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">## \u6210\u672c\u5206\u6790<\/span>\r\n\u4f18\u5316\u6295\u5165: <span class=\"token number\">40<\/span>\u5de5\u65f6<span class=\"token punctuation\">(<\/span>\u5305\u62ec\u6d4b\u8bd5\u9a8c\u8bc1<span class=\"token punctuation\">)<\/span>\r\n\u6536\u76ca:\r\n  <span class=\"token operator\">-<\/span> \u7528\u6237\u4f53\u9a8c\u63d0\u5347\u2192\u8f6c\u5316\u7387<span class=\"token operator\">+<\/span><span class=\"token number\">15<\/span><span class=\"token operator\">%<\/span>\u2192\u5e74\u6536\u5165<span class=\"token operator\">+<\/span>$<span class=\"token number\">500<\/span>K\r\n  <span class=\"token operator\">-<\/span> \u670d\u52a1\u5668\u6210\u672c\u964d\u4f4e<span class=\"token number\">50<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">(<\/span>\u6027\u80fd\u63d0\u5347\u5141\u8bb8\u51cf\u5c11\u5b9e\u4f8b\u6570<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> \u8fd0\u7ef4\u6210\u672c\u964d\u4f4e<span class=\"token number\">30<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">(<\/span>\u6545\u969c\u7387\u4e0b\u964d<span class=\"token punctuation\">)<\/span>\r\nROI: <span class=\"token number\">1250<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">(<\/span>\u6295\u5165\u4e0e\u6536\u76ca\u6bd4<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_20\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6027\u80fd\u4f18\u5316\u7684\u5173\u952e:\u6d4b\u91cf\u2192\u4f18\u5316\u2192\u9a8c\u8bc1\u7684\u5faa\u73af,\u59cb\u7ec8\u57fa\u4e8e\u6570\u636e\u800c\u975e\u731c\u6d4b\u3002<\/p>\n<h3>2.2 \u667a\u80fd\u4f53\u95f4\u7684\u534f\u4f5c\u6a21\u5f0f\uff1a\u8d23\u4efb\u94fe\u4e0e\u77e5\u8bc6\u4f20\u9012<\/h3>\n<p>\u8ba9\u6211\u4eec\u6df1\u5165\u63a2\u8ba8\u667a\u80fd\u4f53\u5982\u4f55\u5b9e\u73b0\u9ad8\u6548\u534f\u4f5c,\u907f\u514d&#8221;\u4e5d\u9f99\u6cbb\u6c34&#8221;\u7684\u6df7\u4e71\u5c40\u9762\u3002<\/p>\n<h4>\u6a21\u5f0f1:\u804c\u8d23\u660e\u786e\u7684\u8d23\u4efb\u94fe<\/h4>\n<p>\u4ee5\u6570\u636e\u5c42\u8bbe\u8ba1\u4e3a\u4f8b:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_21\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u7528\u6237\u8bf7\u6c42: <span class=\"token string\">\"\u8bbe\u8ba1\u4e00\u4e2a\u7535\u5546\u7cfb\u7edf\u7684\u6570\u636e\u5e93\u548cAPI\"<\/span>\r\n\r\n\u51b3\u7b56\u6d41\u7a0b:\r\n<span class=\"token number\">1.<\/span> <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect<span class=\"token punctuation\">(<\/span>Opus<span class=\"token punctuation\">)<\/span>: \r\n   <span class=\"token operator\">-<\/span> \u63a5\u7ba1: \u2705 \u8d1f\u8d23<span class=\"token keyword\">schema<\/span>\u8bbe\u8ba1\r\n   <span class=\"token operator\">-<\/span> \u8f93\u51fa: ER\u56fe\u3001\u8868\u7ed3\u6784\u3001\u7d22\u5f15\u7b56\u7565\r\n   <span class=\"token operator\">-<\/span> \u4f20\u9012\u7ed9: backend<span class=\"token operator\">-<\/span>architect\r\n\r\n<span class=\"token number\">2.<\/span> backend<span class=\"token operator\">-<\/span>architect<span class=\"token punctuation\">(<\/span>Opus<span class=\"token punctuation\">)<\/span>:\r\n   <span class=\"token operator\">-<\/span> \u63a5\u6536: <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect\u7684<span class=\"token keyword\">schema<\/span>\u8bbe\u8ba1\r\n   <span class=\"token operator\">-<\/span> \u63a5\u7ba1: \u2705 \u8d1f\u8d23API\u8bbe\u8ba1\r\n   <span class=\"token operator\">-<\/span> \u660e\u786e\u58f0\u660e: <span class=\"token string\">\"\u6211\u4e0d\u91cd\u65b0\u8bbe\u8ba1\u6570\u636e\u5e93,\u57fa\u4e8e\u5df2\u6709schema\u8bbe\u8ba1API\"<\/span>\r\n   <span class=\"token operator\">-<\/span> \u8f93\u51fa: API\u5951\u7ea6\u3001\u670d\u52a1\u67b6\u6784\r\n   <span class=\"token operator\">-<\/span> \u4f20\u9012\u7ed9: python<span class=\"token operator\">-<\/span>pro\r\n\r\n<span class=\"token number\">3.<\/span> python<span class=\"token operator\">-<\/span>pro<span class=\"token punctuation\">(<\/span>Sonnet<span class=\"token punctuation\">)<\/span>:\r\n   <span class=\"token operator\">-<\/span> \u63a5\u6536: API\u5951\u7ea6\u3001\u6570\u636e\u5e93<span class=\"token keyword\">schema<\/span>\r\n   <span class=\"token operator\">-<\/span> \u63a5\u7ba1: \u2705 \u8d1f\u8d23\u5b9e\u73b0\u4ee3\u7801\r\n   <span class=\"token operator\">-<\/span> \u8f93\u51fa: FastAPI\u5e94\u7528\u4ee3\u7801<\/code><\/pre>\n<ul id=\"code_id_21\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u8bbe\u8ba1:<\/p>\n<ul data-id=\"u738a58b-XSxo1oL5\">\n<li data-id=\"ld70c578-vMt1NBjL\">\u65e0\u91cd\u53e0: \u6bcf\u4e2a\u667a\u80fd\u4f53\u90fd\u5728\u63d0\u793a\u8bcd\u4e2d\u660e\u786e&#8221;\u6211\u4e0d\u8d1f\u8d23X,X\u7531Y\u8d1f\u8d23&#8221;<\/li>\n<li data-id=\"ld70c578-JFuyGnxL\">\u4e0a\u4e0b\u6587\u4f20\u9012: \u540e\u7eed\u667a\u80fd\u4f53\u53ef\u4ee5\u8bbf\u95ee\u524d\u5e8f\u667a\u80fd\u4f53\u7684\u8f93\u51fa<\/li>\n<li data-id=\"ld70c578-08krAoOS\">\u4f9d\u8d56\u56fe\u6e05\u6670: \u5f62\u6210\u6709\u5411\u65e0\u73af\u56fe(DAG),\u907f\u514d\u5faa\u73af\u4f9d\u8d56<\/li>\n<\/ul>\n<h4>\u6a21\u5f0f2:\u5e76\u884c\u534f\u4f5c\u4e0e\u6c47\u805a<\/h4>\n<p>\u5728\u5168\u6808\u5f00\u53d1\u7684\u5b9e\u73b0\u9636\u6bb5:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_22\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token punctuation\">[<\/span>\u9636\u6bb5<span class=\"token number\">1<\/span>: \u67b6\u6784\u8bbe\u8ba1<span class=\"token punctuation\">]<\/span>\r\n                     \u2193\r\n        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n        \u2193                         \u2193\r\n  <span class=\"token punctuation\">[<\/span>\u540e\u7aef\u5b9e\u73b0<span class=\"token punctuation\">]<\/span>                 <span class=\"token punctuation\">[<\/span>\u524d\u7aef\u5b9e\u73b0<span class=\"token punctuation\">]<\/span>\r\n   python<span class=\"token operator\">-<\/span>pro               frontend<span class=\"token operator\">-<\/span>developer\r\n        \u2193                         \u2193\r\n        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n                     \u2193\r\n              <span class=\"token punctuation\">[<\/span>\u9636\u6bb5<span class=\"token number\">3<\/span>: \u96c6\u6210\u6d4b\u8bd5<span class=\"token punctuation\">]<\/span>\r\n               test<span class=\"token operator\">-<\/span>automator<\/code><\/pre>\n<ul id=\"code_id_22\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u70b9:<\/p>\n<ul data-id=\"u738a58b-J32mMeqt\">\n<li data-id=\"ld70c578-R1DjVAAL\">\u5e76\u884c\u95e8: \u9636\u6bb51\u7684\u8f93\u51fa(API\u5951\u7ea6)\u662f\u5e76\u884c\u95e8,\u6ee1\u8db3\u6761\u4ef6\u540e\u4e24\u8def\u5e76\u884c<\/li>\n<li data-id=\"ld70c578-sZsgr0uA\">\u6c47\u805a\u70b9: \u9636\u6bb53\u7684\u6d4b\u8bd5\u9700\u8981\u7b49\u5f85\u4e24\u8def\u90fd\u5b8c\u6210<\/li>\n<li data-id=\"ld70c578-AkxdGpvg\">\u51b2\u7a81\u89e3\u51b3: \u5982\u679c\u5e76\u884c\u8def\u5f84\u4ea7\u751f\u51b2\u7a81(\u5982API\u5951\u7ea6\u7406\u89e3\u4e0d\u4e00\u81f4),\u7531test-automator\u7684\u5951\u7ea6\u6d4b\u8bd5\u53d1\u73b0\u5e76\u4e0a\u62a5<\/li>\n<\/ul>\n<h4>\u6a21\u5f0f3:\u4e13\u5bb6\u4f1a\u8bca\u6a21\u5f0f<\/h4>\n<p>\u5f53\u9047\u5230\u590d\u6742\u95ee\u9898\u65f6:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_23\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u95ee\u9898: <span class=\"token string\">\"\u7cfb\u7edf\u54cd\u5e94\u6162,\u9700\u8981\u5168\u9762\u6392\u67e5\"<\/span>\r\n\r\n\u4f1a\u8bca\u6d41\u7a0b:\r\n<span class=\"token number\">1.<\/span> performance<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">(<\/span>Opus<span class=\"token punctuation\">)<\/span>: \u4e3b\u8bca\u4e13\u5bb6\r\n   <span class=\"token operator\">-<\/span> \u91c7\u96c6\u6027\u80fd\u6570\u636e\r\n   <span class=\"token operator\">-<\/span> \u8bc6\u522b\u74f6\u9888:\u6570\u636e\u5e93\u67e5\u8be2\u5360<span class=\"token number\">80<\/span><span class=\"token operator\">%<\/span>\u65f6\u95f4\r\n   <span class=\"token operator\">-<\/span> \u5efa\u8bae: \u54a8\u8be2<span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>optimizer\r\n\r\n<span class=\"token number\">2.<\/span> <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>optimizer<span class=\"token punctuation\">(<\/span>Sonnet<span class=\"token punctuation\">)<\/span>: \u4e13\u79d1\u4f1a\u8bca\r\n   <span class=\"token operator\">-<\/span> \u5206\u6790\u6162\u67e5\u8be2\u65e5\u5fd7\r\n   <span class=\"token operator\">-<\/span> \u53d1\u73b0: \u7f3a\u5c11\u7d22\u5f15<span class=\"token punctuation\">,<\/span>\u5b58\u5728N<span class=\"token operator\">+<\/span><span class=\"token number\">1<\/span>\u67e5\u8be2\r\n   <span class=\"token operator\">-<\/span> \u8f93\u51fa: \u4f18\u5316\u65b9\u6848<span class=\"token punctuation\">(<\/span>\u7d22\u5f15<span class=\"token operator\">+<\/span>\u67e5\u8be2\u91cd\u6784<span class=\"token punctuation\">)<\/span>\r\n   <span class=\"token operator\">-<\/span> \u4f20\u56de: performance<span class=\"token operator\">-<\/span>engineer\r\n\r\n<span class=\"token number\">3.<\/span> performance<span class=\"token operator\">-<\/span>engineer: \u7efc\u5408\u51b3\u7b56\r\n   <span class=\"token operator\">-<\/span> \u6574\u5408\u4f18\u5316\u65b9\u6848\r\n   <span class=\"token operator\">-<\/span> \u8bc4\u4f30\u5f71\u54cd: \u9884\u8ba1\u6027\u80fd\u63d0\u5347<span class=\"token number\">5<\/span>\u500d\r\n   <span class=\"token operator\">-<\/span> \u5b9e\u65bd: \u8c03\u7528<span class=\"token keyword\">sql<\/span><span class=\"token operator\">-<\/span>pro\u6267\u884c\u7d22\u5f15\u521b\u5efa\r\n   <span class=\"token operator\">-<\/span> \u9a8c\u8bc1: \u8fd0\u884c\u538b\u6d4b<span class=\"token punctuation\">,<\/span>\u786e\u8ba4\u6548\u679c<\/code><\/pre>\n<ul id=\"code_id_23\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8fd9\u79cd\u6a21\u5f0f\u6a21\u62df\u4e86\u771f\u5b9e\u56e2\u961f\u4e2d\u7684\u8de8\u804c\u80fd\u534f\u4f5c,\u6bcf\u4e2a\u4e13\u5bb6\u63d0\u4f9b\u4e13\u4e1a\u610f\u89c1,\u4e3b\u5bfc\u8005\u6574\u5408\u51b3\u7b56\u3002<\/p>\n<h2>\u7b2c\u4e09\u90e8\u5206\uff1a\u5178\u578b\u5e94\u7528\u573a\u666f\u4e0e\u6700\u4f73\u5b9e\u8df5<\/h2>\n<h3>3.1 \u573a\u666f\u4e00:\u4ece\u96f6\u5230\u4e00\u6784\u5efa\u751f\u4ea7\u7ea7API<\/h3>\n<h4>\u573a\u666f\u63cf\u8ff0<\/h4>\n<p>\u521b\u4e1a\u516c\u53f8\u9700\u8981\u5feb\u901f\u6784\u5efa\u4e00\u4e2aSaaS\u4ea7\u54c1\u7684\u540e\u7aefAPI,\u8981\u6c42:<\/p>\n<ul data-id=\"u738a58b-8WxvAA5a\">\n<li data-id=\"ld70c578-u6leWynO\">\u7528\u6237\u8ba4\u8bc1\u4e0e\u6743\u9650\u7ba1\u7406<\/li>\n<li data-id=\"ld70c578-7aj3wFHG\">RESTful API(\u652f\u6301CRUD\u64cd\u4f5c)<\/li>\n<li data-id=\"ld70c578-k2s1C3TI\">\u591a\u79df\u6237\u6570\u636e\u9694\u79bb<\/li>\n<li data-id=\"ld70c578-3x3kha3B\">\u751f\u4ea7\u7ea7\u8d28\u91cf(\u5b89\u5168\u3001\u6027\u80fd\u3001\u53ef\u76d1\u63a7)<\/li>\n<li data-id=\"ld70c578-BOeNlXoF\">2\u5468\u5185\u4e0a\u7ebfMVP<\/li>\n<\/ul>\n<h4>\u4f20\u7edf\u65b9\u5f0f\u7684\u6311\u6218<\/h4>\n<ul data-id=\"u738a58b-dDQOeBzv\">\n<li data-id=\"ld70c578-MdVvkPJT\">\u6280\u672f\u9009\u578b:\u9700\u8981\u7814\u7a76\u5bf9\u6bd4\u591a\u4e2a\u6846\u67b6(Django vs FastAPI vs Express)<\/li>\n<li data-id=\"ld70c578-1f1N6ZTI\">\u67b6\u6784\u8bbe\u8ba1:\u7f3a\u4e4f\u7ecf\u9a8c\u5bb9\u6613\u8e29\u5751(\u5982\u5b89\u5168\u6f0f\u6d1e\u3001\u6027\u80fd\u74f6\u9888)<\/li>\n<li data-id=\"ld70c578-hdDbxmup\">\u6837\u677f\u4ee3\u7801:\u8ba4\u8bc1\u3001\u65e5\u5fd7\u3001\u9519\u8bef\u5904\u7406\u7b49\u91cd\u590d\u5de5\u4f5c<\/li>\n<li data-id=\"ld70c578-4siRWCAF\">\u6d4b\u8bd5\u8986\u76d6:\u65f6\u95f4\u7d27\u8feb\u65f6\u6d4b\u8bd5\u5e38\u88ab\u727a\u7272<\/li>\n<li data-id=\"ld70c578-Dl1oKE9z\">\u90e8\u7f72\u914d\u7f6e:Docker\u3001K8s\u914d\u7f6e\u590d\u6742<\/li>\n<\/ul>\n<p>\u65f6\u95f4\u4f30\u7b97:\u8d44\u6df1\u5de5\u7a0b\u5e08\u9700\u89813-4\u5468,\u521d\u7ea7\u5de5\u7a0b\u5e086-8\u5468<\/p>\n<h4>Claude Code Agents\u65b9\u6848<\/h4>\n<p>Step 1: \u4f7f\u7528api-scaffold\u5de5\u5177\u5feb\u901f\u751f\u6210<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_24\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">\/<\/span>plugin install api<span class=\"token operator\">-<\/span>development<span class=\"token operator\">-<\/span>kit\r\n\r\n<span class=\"token comment\"># \u4e00\u884c\u547d\u4ee4\u751f\u6210\u5b8c\u6574API\u811a\u624b\u67b6<\/span>\r\nTask tool: api<span class=\"token operator\">-<\/span>scaffold\r\nPrompt: <span class=\"token string\">\"\r\nFastAPI\u5e94\u7528,\u529f\u80fd\u9700\u6c42:\r\n- \u7528\u6237\u7ba1\u7406(\u6ce8\u518c\u3001\u767b\u5f55\u3001\u4e2a\u4eba\u8d44\u6599)\r\n- \u591a\u79df\u6237\u7ec4\u7ec7\u7ba1\u7406(\u4e00\u4e2a\u7528\u6237\u53ef\u5c5e\u4e8e\u591a\u4e2a\u7ec4\u7ec7)\r\n- \u6743\u9650\u7cfb\u7edf(RBAC,\u652f\u6301admin\/member\/viewer\u89d2\u8272)\r\n- PostgreSQL + Redis\r\n- JWT\u8ba4\u8bc1(access token 15\u5206\u949f, refresh token 7\u5929)\r\n- \u751f\u4ea7\u7ea7\u914d\u7f6e(\u65e5\u5fd7\u3001\u76d1\u63a7\u3001\u9650\u6d41)\r\n\"<\/span><\/code><\/pre>\n<ul id=\"code_id_24\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa\u7ed3\u679c(5\u5206\u949f\u5185\u5b8c\u6210):<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_25\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">project<span class=\"token operator\">\/<\/span>\r\n\u251c\u2500\u2500 app<span class=\"token operator\">\/<\/span>\r\n\u2502   \u251c\u2500\u2500 main<span class=\"token punctuation\">.<\/span>py                 <span class=\"token comment\"># \u5e94\u7528\u5165\u53e3,\u5305\u542b\u4e2d\u95f4\u4ef6\u914d\u7f6e<\/span>\r\n\u2502   \u251c\u2500\u2500 core<span class=\"token operator\">\/<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 config<span class=\"token punctuation\">.<\/span>py          <span class=\"token comment\"># \u73af\u5883\u53d8\u91cf\u7ba1\u7406(Pydantic Settings)<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 security<span class=\"token punctuation\">.<\/span>py        <span class=\"token comment\"># JWT\u751f\u6210\/\u9a8c\u8bc1\u3001\u5bc6\u7801\u54c8\u5e0c<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 <span class=\"token keyword\">database<\/span><span class=\"token punctuation\">.<\/span>py        <span class=\"token comment\"># SQLAlchemy\u914d\u7f6e\u3001\u8fde\u63a5\u6c60<\/span>\r\n\u2502   \u2502   \u2514\u2500\u2500 cache<span class=\"token punctuation\">.<\/span>py           <span class=\"token comment\"># Redis\u5ba2\u6237\u7aef<\/span>\r\n\u2502   \u251c\u2500\u2500 models<span class=\"token operator\">\/<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 <span class=\"token keyword\">user<\/span><span class=\"token punctuation\">.<\/span>py            <span class=\"token comment\"># User\u6a21\u578b(SQLAlchemy ORM)<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 organization<span class=\"token punctuation\">.<\/span>py    <span class=\"token comment\"># Organization\u6a21\u578b<\/span>\r\n\u2502   \u2502   \u2514\u2500\u2500 membership<span class=\"token punctuation\">.<\/span>py      <span class=\"token comment\"># \u7528\u6237-\u7ec4\u7ec7\u5173\u8054\u8868<\/span>\r\n\u2502   \u251c\u2500\u2500 schemas<span class=\"token operator\">\/<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 <span class=\"token keyword\">user<\/span><span class=\"token punctuation\">.<\/span>py            <span class=\"token comment\"># Pydantic schemas(\u8bf7\u6c42\/\u54cd\u5e94)<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 organization<span class=\"token punctuation\">.<\/span>py\r\n\u2502   \u2502   \u2514\u2500\u2500 auth<span class=\"token punctuation\">.<\/span>py            <span class=\"token comment\"># \u767b\u5f55\/\u6ce8\u518cschema<\/span>\r\n\u2502   \u251c\u2500\u2500 services<span class=\"token operator\">\/<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 user_service<span class=\"token punctuation\">.<\/span>py    <span class=\"token comment\"># \u4e1a\u52a1\u903b\u8f91\u5c42<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 org_service<span class=\"token punctuation\">.<\/span>py\r\n\u2502   \u2502   \u2514\u2500\u2500 auth_service<span class=\"token punctuation\">.<\/span>py\r\n\u2502   \u251c\u2500\u2500 api<span class=\"token operator\">\/<\/span>\r\n\u2502   \u2502   \u2514\u2500\u2500 v1<span class=\"token operator\">\/<\/span>\r\n\u2502   \u2502       \u251c\u2500\u2500 users<span class=\"token punctuation\">.<\/span>py       <span class=\"token comment\"># \u7528\u6237\u76f8\u5173\u7aef\u70b9<\/span>\r\n\u2502   \u2502       \u251c\u2500\u2500 orgs<span class=\"token punctuation\">.<\/span>py        <span class=\"token comment\"># \u7ec4\u7ec7\u76f8\u5173\u7aef\u70b9<\/span>\r\n\u2502   \u2502       \u2514\u2500\u2500 auth<span class=\"token punctuation\">.<\/span>py        <span class=\"token comment\"># \u8ba4\u8bc1\u7aef\u70b9<\/span>\r\n\u2502   \u2514\u2500\u2500 tests<span class=\"token operator\">\/<\/span>\r\n\u2502       \u251c\u2500\u2500 test_users<span class=\"token punctuation\">.<\/span>py      <span class=\"token comment\"># \u5355\u5143\u6d4b\u8bd5<\/span>\r\n\u2502       \u251c\u2500\u2500 test_auth<span class=\"token punctuation\">.<\/span>py\r\n\u2502       \u2514\u2500\u2500 conftest<span class=\"token punctuation\">.<\/span>py        <span class=\"token comment\"># pytest fixtures<\/span>\r\n\u251c\u2500\u2500 alembic<span class=\"token operator\">\/<\/span>                    <span class=\"token comment\"># \u6570\u636e\u5e93\u8fc1\u79fb\u811a\u672c<\/span>\r\n\u251c\u2500\u2500 Dockerfile                  <span class=\"token comment\"># \u751f\u4ea7\u4f18\u5316\u7684\u591a\u9636\u6bb5\u6784\u5efa<\/span>\r\n\u251c\u2500\u2500 docker<span class=\"token operator\">-<\/span>compose<span class=\"token punctuation\">.<\/span>yml          <span class=\"token comment\"># \u672c\u5730\u5f00\u53d1\u73af\u5883<\/span>\r\n\u251c\u2500\u2500 requirements<span class=\"token punctuation\">.<\/span>txt            <span class=\"token comment\"># Python\u4f9d\u8d56<\/span>\r\n\u2514\u2500\u2500 <span class=\"token punctuation\">.<\/span>env<span class=\"token punctuation\">.<\/span>example                <span class=\"token comment\"># \u73af\u5883\u53d8\u91cf\u6a21\u677f<\/span><\/code><\/pre>\n<ul id=\"code_id_25\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u751f\u6210\u4ee3\u7801\u8d28\u91cf\u4eae\u70b9:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-5c49CR7b\">\n<li data-id=\"ld70c578-YYYpO2Qc\">\u5b89\u5168\u6027\u5185\u7f6e:<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-RJPri0FJ\">\n<li data-id=\"ld70c578-fjwMPWDE\">\u5bc6\u7801\u4f7f\u7528bcrypt\u54c8\u5e0c(cost factor=12)<\/li>\n<li data-id=\"ld70c578-IEktFimv\">JWT\u4f7f\u7528HS256\u7b7e\u540d,\u652f\u6301token\u64a4\u9500(\u9ed1\u540d\u5355)<\/li>\n<li data-id=\"ld70c578-d2fXf1VP\">CORS\u914d\u7f6e\u4e25\u683c,\u4ec5\u5141\u8bb8\u6307\u5b9a\u57df\u540d<\/li>\n<li data-id=\"ld70c578-8bL2f2UN\">SQL\u6ce8\u5165\u9632\u62a4(\u53c2\u6570\u5316\u67e5\u8be2)<\/li>\n<li data-id=\"ld70c578-b4LAQL7E\">XSS\u9632\u62a4(Pydantic\u81ea\u52a8\u9a8c\u8bc1)<\/li>\n<\/ul>\n<ol class=\"list-paddingleft-1\" start=\"2\" data-id=\"oe0300a2-3M8B98KV\">\n<li data-id=\"ld70c578-0wpvrx1l\">\u6027\u80fd\u4f18\u5316:<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-wgl607dX\">\n<li data-id=\"ld70c578-IjtJ4rnn\">\u8fde\u63a5\u6c60\u914d\u7f6e(pool_size=20, max_overflow=10)<\/li>\n<li data-id=\"ld70c578-qDC7lhAD\">Redis\u7f13\u5b58\u70ed\u6570\u636e(\u7528\u6237\u4fe1\u606f\u3001\u6743\u9650)<\/li>\n<li data-id=\"ld70c578-1xJJdg7t\">\u5f02\u6b65I\/O(async\/await)<\/li>\n<li data-id=\"ld70c578-GfuH8FA4\">\u54cd\u5e94\u538b\u7f29(gzip)<\/li>\n<\/ul>\n<ol class=\"list-paddingleft-1\" start=\"3\" data-id=\"o292e11f-KHVNNHLM\">\n<li data-id=\"ld70c578-toEWYXzo\">\u53ef\u89c2\u6d4b\u6027:<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-AbwzhKkT\">\n<li data-id=\"ld70c578-HfIlLCZg\">\u7ed3\u6784\u5316\u65e5\u5fd7(JSON\u683c\u5f0f,\u5305\u542bcorrelation_id)<\/li>\n<li data-id=\"ld70c578-YeLfYvvb\">Prometheus\u6307\u6807(\u8bf7\u6c42\u8ba1\u6570\u3001\u5ef6\u8fdf\u3001\u9519\u8bef\u7387)<\/li>\n<li data-id=\"ld70c578-kzE5WW96\">\u5065\u5eb7\u68c0\u67e5\u7aef\u70b9(\/health, \/ready)<\/li>\n<\/ul>\n<ol class=\"list-paddingleft-1\" start=\"4\" data-id=\"oaa0894f-b35Vl0Fc\">\n<li data-id=\"ld70c578-Xnyzwpyp\">\u591a\u79df\u6237\u9694\u79bb:<\/li>\n<\/ol>\n<ul data-id=\"u738a58b-vkAZV1xZ\">\n<li data-id=\"ld70c578-nyTS0TNJ\">Row-Level Security(RLS)\u5728\u6570\u636e\u5e93\u5c42\u9694\u79bb<\/li>\n<li data-id=\"ld70c578-hphqE0ii\">\u4e2d\u95f4\u4ef6\u81ea\u52a8\u6ce8\u5165tenant_id<\/li>\n<li data-id=\"ld70c578-9OjWn3t0\">\u9632\u6b62\u8de8\u79df\u6237\u6570\u636e\u6cc4\u9732<\/li>\n<\/ul>\n<p>Step 2: \u5b89\u5168\u52a0\u56fa(10\u5206\u949f)<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_26\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">Task tool: security<span class=\"token operator\">-<\/span>scan\r\nPrompt: <span class=\"token string\">\"\u626b\u63cf\u4e0a\u8ff0API,\u6267\u884cOWASP Top 10\u68c0\u67e5,\u63d0\u4f9b\u4fee\u590d\u5efa\u8bae\"<\/span><\/code><\/pre>\n<ul id=\"code_id_26\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_27\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">## \u5b89\u5168\u626b\u63cf\u62a5\u544a<\/span>\r\n\r\n\u2705 \u901a\u8fc7\u68c0\u67e5:\r\n<span class=\"token operator\">-<\/span> <span class=\"token keyword\">SQL<\/span>\u6ce8\u5165\u9632\u62a4\r\n<span class=\"token operator\">-<\/span> XSS\u9632\u62a4\r\n<span class=\"token operator\">-<\/span> CSRF\u9632\u62a4<span class=\"token punctuation\">(<\/span>\u901a\u8fc7SameSite cookie<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> \u8ba4\u8bc1\u673a\u5236\r\n<span class=\"token operator\">-<\/span> \u5bc6\u7801\u5f3a\u5ea6\u8981\u6c42\r\n\r\n\u26a0\ufe0f  \u9700\u8981\u6539\u8fdb:\r\n<span class=\"token number\">1.<\/span> \u901f\u7387\u9650\u5236: \u5efa\u8bae\u6dfb\u52a0\u767b\u5f55\u5c1d\u8bd5\u9650\u5236<span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span>\u6b21<span class=\"token operator\">\/<\/span><span class=\"token number\">15<\/span>\u5206\u949f<span class=\"token punctuation\">)<\/span>\r\n   \u4fee\u590d\u4ee3\u7801:\r\n   <span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">`<\/span>python\r\n   <span class=\"token keyword\">from<\/span> slowapi <span class=\"token keyword\">import<\/span> Limiter<span class=\"token punctuation\">,<\/span> _rate_limit_exceeded_handler\r\n   limiter <span class=\"token operator\">=<\/span> Limiter<span class=\"token punctuation\">(<\/span>key_func<span class=\"token operator\">=<\/span>get_remote_address<span class=\"token punctuation\">)<\/span>\r\n   \r\n   <span class=\"token variable\">@app.post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/v1\/auth\/login\"<\/span><span class=\"token punctuation\">)<\/span>\r\n   <span class=\"token variable\">@limiter.limit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"5\/15minute\"<\/span><span class=\"token punctuation\">)<\/span>\r\n   async def login<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span>:\r\n       <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/code><\/pre>\n<ul id=\"code_id_27\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>1.\u654f\u611f\u6570\u636e\u52a0\u5bc6: \u5efa\u8bae\u52a0\u5bc6\u5b58\u50a8\u7528\u6237\u90ae\u7bb1(\u53ef\u9009) \u65b9\u6848: \u4f7f\u7528AWS KMS\u6216HashiCorp Vault<\/p>\n<p>2.\u5ba1\u8ba1\u65e5\u5fd7: \u5efa\u8bae\u8bb0\u5f55\u6240\u6709\u6743\u9650\u53d8\u66f4\u64cd\u4f5c \u5b9e\u73b0: \u6dfb\u52a0AuditLog\u6a21\u578b<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_28\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\u81ea\u52a8\u5e94\u7528\u4fee\u590d<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span>\u5206\u949f<span class=\"token punctuation\">)<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>:\r\n\u7cfb\u7edf\u81ea\u52a8\u5e94\u7528\u7b80\u5355\u4fee\u590d<span class=\"token punctuation\">,<\/span>\u590d\u6742\u4fee\u590d\u63d0\u4f9b\u5b9e\u73b0\u65b9\u6848\u3002\r\n\r\n<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>Step <span class=\"token number\">3<\/span>: \u6d4b\u8bd5\u751f\u6210<span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span>\u5206\u949f<span class=\"token punctuation\">)<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">`<\/span>bash\r\nTask tool: test<span class=\"token operator\">-<\/span>harness\r\nPrompt: <span class=\"token string\">\"\u4e3a\u4e0a\u8ff0API\u751f\u6210\u5168\u9762\u6d4b\u8bd5:\u5355\u5143\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u7aef\u5230\u7aef\u6d4b\u8bd5\"<\/span><\/code><\/pre>\n<ul id=\"code_id_28\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_29\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># tests\/test_auth.py (\u793a\u4f8b)<\/span>\r\n<span class=\"token keyword\">import<\/span> pytest\r\n<span class=\"token keyword\">from<\/span> fastapi<span class=\"token punctuation\">.<\/span>testclient <span class=\"token keyword\">import<\/span> TestClient\r\n\r\ndef test_user_registration<span class=\"token punctuation\">(<\/span>client: TestClient<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u7528\u6237\u6ce8\u518c\u6d41\u7a0b\"\"\"<\/span>\r\n    response <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/v1\/auth\/register\"<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">=<\/span>{\r\n        <span class=\"token string\">\"email\"<\/span>: <span class=\"token string\">\"test@example.com\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"password\"<\/span>: <span class=\"token string\">\"SecurePass123!\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"full_name\"<\/span>: <span class=\"token string\">\"Test User\"<\/span>\r\n    }<span class=\"token punctuation\">)<\/span>\r\n    assert response<span class=\"token punctuation\">.<\/span>status_code <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">201<\/span>\r\n    <span class=\"token keyword\">data<\/span> <span class=\"token operator\">=<\/span> response<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    assert <span class=\"token keyword\">data<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">\"email\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"test@example.com\"<\/span>\r\n    assert <span class=\"token string\">\"id\"<\/span> <span class=\"token operator\">in<\/span> <span class=\"token keyword\">data<\/span>\r\n    assert <span class=\"token string\">\"password\"<\/span> <span class=\"token operator\">not<\/span> <span class=\"token operator\">in<\/span> <span class=\"token keyword\">data<\/span>  <span class=\"token comment\"># \u786e\u4fdd\u4e0d\u8fd4\u56de\u5bc6\u7801<\/span>\r\n\r\ndef test_login_success<span class=\"token punctuation\">(<\/span>client: TestClient<span class=\"token punctuation\">,<\/span> test_user<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u6210\u529f\u767b\u5f55\"\"\"<\/span>\r\n    response <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/v1\/auth\/login\"<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">=<\/span>{\r\n        <span class=\"token string\">\"email\"<\/span>: test_user<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"password\"<\/span>: <span class=\"token string\">\"password123\"<\/span>\r\n    }<span class=\"token punctuation\">)<\/span>\r\n    assert response<span class=\"token punctuation\">.<\/span>status_code <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">200<\/span>\r\n    <span class=\"token keyword\">data<\/span> <span class=\"token operator\">=<\/span> response<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    assert <span class=\"token string\">\"access_token\"<\/span> <span class=\"token operator\">in<\/span> <span class=\"token keyword\">data<\/span>\r\n    assert <span class=\"token string\">\"refresh_token\"<\/span> <span class=\"token operator\">in<\/span> <span class=\"token keyword\">data<\/span>\r\n    assert <span class=\"token keyword\">data<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">\"token_type\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"bearer\"<\/span>\r\n\r\ndef test_login_invalid_credentials<span class=\"token punctuation\">(<\/span>client: TestClient<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u9519\u8bef\u51ed\u636e\"\"\"<\/span>\r\n    response <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/v1\/auth\/login\"<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">=<\/span>{\r\n        <span class=\"token string\">\"email\"<\/span>: <span class=\"token string\">\"wrong@example.com\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"password\"<\/span>: <span class=\"token string\">\"wrongpass\"<\/span>\r\n    }<span class=\"token punctuation\">)<\/span>\r\n    assert response<span class=\"token punctuation\">.<\/span>status_code <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">401<\/span>\r\n    assert response<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">\"detail\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"Invalid credentials\"<\/span>\r\n\r\ndef test_rate_limiting<span class=\"token punctuation\">(<\/span>client: TestClient<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u901f\u7387\u9650\u5236\"\"\"<\/span>\r\n    <span class=\"token keyword\">for<\/span> _ <span class=\"token operator\">in<\/span> range<span class=\"token punctuation\">(<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">)<\/span>:\r\n        response <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/v1\/auth\/login\"<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">=<\/span>{\r\n            <span class=\"token string\">\"email\"<\/span>: <span class=\"token string\">\"test@example.com\"<\/span><span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">\"password\"<\/span>: <span class=\"token string\">\"wrong\"<\/span>\r\n        }<span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token comment\"># \u7b2c6\u6b21\u8bf7\u6c42\u5e94\u8be5\u88ab\u9650\u6d41<\/span>\r\n    assert response<span class=\"token punctuation\">.<\/span>status_code <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">429<\/span>\r\n    assert <span class=\"token string\">\"Retry-After\"<\/span> <span class=\"token operator\">in<\/span> response<span class=\"token punctuation\">.<\/span>headers\r\n\r\n<span class=\"token variable\">@pytest.mark.parametrize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"password\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>\r\n    <span class=\"token string\">\"123\"<\/span><span class=\"token punctuation\">,<\/span>          <span class=\"token comment\"># \u592a\u77ed<\/span>\r\n    <span class=\"token string\">\"password\"<\/span><span class=\"token punctuation\">,<\/span>     <span class=\"token comment\"># \u65e0\u6570\u5b57<\/span>\r\n    <span class=\"token string\">\"12345678\"<\/span><span class=\"token punctuation\">,<\/span>     <span class=\"token comment\"># \u65e0\u5b57\u6bcd<\/span>\r\n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\ndef test_weak_password_rejected<span class=\"token punctuation\">(<\/span>client: TestClient<span class=\"token punctuation\">,<\/span> password<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u5f31\u5bc6\u7801\u88ab\u62d2\u7edd\"\"\"<\/span>\r\n    response <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/v1\/auth\/register\"<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">=<\/span>{\r\n        <span class=\"token string\">\"email\"<\/span>: <span class=\"token string\">\"test@example.com\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"password\"<\/span>: password\r\n    }<span class=\"token punctuation\">)<\/span>\r\n    assert response<span class=\"token punctuation\">.<\/span>status_code <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">422<\/span>\r\n    assert <span class=\"token string\">\"password\"<\/span> <span class=\"token operator\">in<\/span> response<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">\"detail\"<\/span><span class=\"token punctuation\">]<\/span><\/code><\/pre>\n<ul id=\"code_id_29\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6d4b\u8bd5\u8986\u76d6\u7387: 85%+(\u7531test-automator\u81ea\u52a8\u751f\u6210)<\/p>\n<p>Step 4: \u90e8\u7f72\u914d\u7f6e(5\u5206\u949f)<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_30\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">Task tool: k8s<span class=\"token operator\">-<\/span>manifest\r\nPrompt: <span class=\"token string\">\"\u4e3a\u8be5API\u751f\u6210Kubernetes\u90e8\u7f72\u914d\u7f6e,\u5305\u62ec:\r\n- Deployment(3\u526f\u672c,\u6eda\u52a8\u66f4\u65b0)\r\n- Service(ClusterIP)\r\n- Ingress(HTTPS,Let's Encrypt\u8bc1\u4e66)\r\n- HPA(\u57fa\u4e8eCPU\u81ea\u52a8\u6269\u7f29\u5bb9)\r\n- Secrets(\u6570\u636e\u5e93\u51ed\u636e)\r\n\"<\/span><\/code><\/pre>\n<ul id=\"code_id_30\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa: \u5b8c\u6574\u7684K8s\u914d\u7f6e\u6587\u4ef6,\u53ef\u76f4\u63a5\u5e94\u7528\u5230\u96c6\u7fa4\u3002<\/p>\n<h4>\u6700\u7ec8\u6548\u679c<\/h4>\n<ul data-id=\"u738a58b-ZL6eIR7r\">\n<li data-id=\"ld70c578-JQgWj8Jj\">\u65f6\u95f4\u6210\u672c: \u4ece4\u5468\u7f29\u77ed\u81f31\u5929(95%\u65f6\u95f4\u8282\u7701)<\/li>\n<li data-id=\"ld70c578-sz9R1qoB\">\u4ee3\u7801\u8d28\u91cf: \u751f\u4ea7\u7ea7\u522b,\u5305\u542b\u6700\u4f73\u5b9e\u8df5<\/li>\n<li data-id=\"ld70c578-zlrWcN7x\">\u6d4b\u8bd5\u8986\u76d6: 85%\u4ee5\u4e0a,vs \u4f20\u7edf\u65b9\u5f0f\u768430-40%<\/li>\n<li data-id=\"ld70c578-4LaSKi7w\">\u5b89\u5168\u6027: OWASP\u5408\u89c4,vs \u4f20\u7edf\u65b9\u5f0f\u53ef\u80fd\u9057\u6f0f\u591a\u4e2a\u6f0f\u6d1e<\/li>\n<li data-id=\"ld70c578-p47Vn5Zx\">\u53ef\u7ef4\u62a4\u6027: \u7ed3\u6784\u6e05\u6670,\u6587\u6863\u5b8c\u6574<\/li>\n<\/ul>\n<h3>3.2 \u573a\u666f\u4e8c:\u9057\u7559\u7cfb\u7edf\u73b0\u4ee3\u5316\u6539\u9020<\/h3>\n<h4>\u573a\u666f\u63cf\u8ff0<\/h4>\n<p>\u4e00\u5bb6\u4f20\u7edf\u4f01\u4e1a\u6709\u4e00\u4e2a10\u5e74\u5386\u53f2\u7684\u5355\u4f53\u5e94\u7528:<\/p>\n<ul data-id=\"u738a58b-IzuHoQfn\">\n<li data-id=\"ld70c578-u99Dzpa6\">\u6280\u672f\u6808:Java 8 + Spring MVC + JSP + Oracle DB<\/li>\n<li data-id=\"ld70c578-jJ6G9Lkl\">\u95ee\u9898:\u90e8\u7f72\u6162(1\u5c0f\u65f6),\u6269\u5c55\u6027\u5dee,\u96be\u4ee5\u7ef4\u62a4<\/li>\n<li data-id=\"ld70c578-2e73LADb\">\u76ee\u6807:\u9010\u6b65\u8fc1\u79fb\u5230\u5fae\u670d\u52a1\u67b6\u6784(Python FastAPI + PostgreSQL + K8s)<\/li>\n<li data-id=\"ld70c578-QqpHoENr\">\u7ea6\u675f:\u4e0d\u80fd\u505c\u673a,\u9700\u8981\u589e\u91cf\u8fc1\u79fb<\/li>\n<\/ul>\n<h4>\u8fc1\u79fb\u7b56\u7565:Strangler Fig Pattern(\u7ede\u6740\u8005\u6a21\u5f0f)<\/h4>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_31\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token punctuation\">[<\/span>\u7528\u6237\u8bf7\u6c42<span class=\"token punctuation\">]<\/span>\r\n              \u2193\r\n        <span class=\"token punctuation\">[<\/span>API Gateway<span class=\"token punctuation\">]<\/span>\r\n       <span class=\"token operator\">\/<\/span>              \\\r\n    <span class=\"token punctuation\">[<\/span>\u65b0\u670d\u52a1<span class=\"token punctuation\">]<\/span>        <span class=\"token punctuation\">[<\/span>\u65e7\u670d\u52a1<span class=\"token punctuation\">]<\/span>\r\n  <span class=\"token punctuation\">(<\/span>FastAPI<span class=\"token punctuation\">)<\/span>      <span class=\"token punctuation\">(<\/span>Spring MVC<span class=\"token punctuation\">)<\/span>\r\n      \u2193               \u2193\r\n  <span class=\"token punctuation\">[<\/span>PostgreSQL<span class=\"token punctuation\">]<\/span>    <span class=\"token punctuation\">[<\/span>Oracle DB<span class=\"token punctuation\">]<\/span>\r\n  \r\n\u9636\u6bb5<span class=\"token number\">1<\/span>: \u65b0\u670d\u52a1\u5904\u7406<span class=\"token number\">10<\/span><span class=\"token operator\">%<\/span>\u6d41\u91cf<span class=\"token punctuation\">(<\/span>canary<span class=\"token punctuation\">)<\/span>\r\n\u9636\u6bb5<span class=\"token number\">2<\/span>: \u65b0\u670d\u52a1\u5904\u7406<span class=\"token number\">50<\/span><span class=\"token operator\">%<\/span>\u6d41\u91cf\r\n\u9636\u6bb5<span class=\"token number\">3<\/span>: \u65b0\u670d\u52a1\u5904\u7406<span class=\"token number\">100<\/span><span class=\"token operator\">%<\/span>\u6d41\u91cf<span class=\"token punctuation\">,<\/span>\u4e0b\u7ebf\u65e7\u670d\u52a1<\/code><\/pre>\n<ul id=\"code_id_31\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>Claude Code Agents\u5b9e\u65bd\u65b9\u6848<\/h4>\n<p>Phase 1: \u5206\u6790\u4e0e\u89c4\u5212<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_32\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">Task tool <span class=\"token keyword\">with<\/span> subagent_type: legacy<span class=\"token operator\">-<\/span>modernizer\r\nPrompt: <span class=\"token string\">\"\r\n\u5206\u6790\u4ee5\u4e0b\u9057\u7559\u7cfb\u7edf\u4ee3\u7801,\u63d0\u4f9b\u73b0\u4ee3\u5316\u6539\u9020\u65b9\u6848:\r\n[\u4e0a\u4f20\u9057\u7559\u4ee3\u7801\u5e93]\r\n\r\n\u5173\u6ce8:\r\n1. \u670d\u52a1\u8fb9\u754c\u8bc6\u522b(\u54ea\u4e9b\u6a21\u5757\u53ef\u4ee5\u62c6\u5206\u4e3a\u5fae\u670d\u52a1)\r\n2. \u6570\u636e\u4f9d\u8d56\u5206\u6790(\u54ea\u4e9b\u8868\u88ab\u591a\u4e2a\u6a21\u5757\u5171\u4eab)\r\n3. API\u63a5\u53e3\u63d0\u53d6(\u73b0\u6709JSP\u9875\u9762\u80cc\u540e\u7684\u4e1a\u52a1\u903b\u8f91)\r\n4. \u6280\u672f\u6808\u8fc1\u79fb\u8def\u5f84(Java \u2192 Python\u7684\u5bf9\u5e94\u5173\u7cfb)\r\n5. \u98ce\u9669\u8bc4\u4f30(\u9ad8\u98ce\u9669\u6a21\u5757\u9700\u8981\u66f4\u8c28\u614e)\r\n\"<\/span><\/code><\/pre>\n<ul id=\"code_id_32\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa(Opus\u6a21\u578b\u6df1\u5ea6\u5206\u6790):<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_33\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">## \u9057\u7559\u7cfb\u7edf\u5206\u6790\u62a5\u544a<\/span>\r\n\r\n<span class=\"token comment\">### 1. \u670d\u52a1\u8fb9\u754c\u8bc6\u522b<\/span>\r\n\u5efa\u8bae\u62c6\u5206\u4e3a<span class=\"token number\">5<\/span>\u4e2a\u5fae\u670d\u52a1:\r\n<span class=\"token operator\">-<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>UserService<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: \u7528\u6237\u7ba1\u7406\u3001\u8ba4\u8bc1<span class=\"token punctuation\">(<\/span>\u4f4e\u98ce\u9669<span class=\"token punctuation\">,<\/span>\u53ef\u4f18\u5148\u8fc1\u79fb<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>OrderService<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: \u8ba2\u5355\u5904\u7406<span class=\"token punctuation\">(<\/span>\u4e2d\u98ce\u9669<span class=\"token punctuation\">,<\/span>\u4f9d\u8d56\u591a<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>InventoryService<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: \u5e93\u5b58\u7ba1\u7406<span class=\"token punctuation\">(<\/span>\u9ad8\u98ce\u9669<span class=\"token punctuation\">,<\/span>\u6838\u5fc3\u4e1a\u52a1<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>PaymentService<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: \u652f\u4ed8\u5904\u7406<span class=\"token punctuation\">(<\/span>\u9ad8\u98ce\u9669<span class=\"token punctuation\">,<\/span>\u5408\u89c4\u8981\u6c42<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ReportService<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: \u62a5\u8868\u751f\u6210<span class=\"token punctuation\">(<\/span>\u4f4e\u98ce\u9669<span class=\"token punctuation\">,<\/span>\u8ba1\u7b97\u5bc6\u96c6<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">### 2. \u6570\u636e\u4f9d\u8d56\u56fe<\/span>\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">`<\/span>mermaid\r\ngraph TD\r\n    A<span class=\"token punctuation\">[<\/span>users\u8868<span class=\"token punctuation\">]<\/span> <span class=\"token comment\">--&gt; B[orders\u8868]<\/span>\r\n    B <span class=\"token comment\">--&gt; C[order_items\u8868]<\/span>\r\n    B <span class=\"token comment\">--&gt; D[payments\u8868]<\/span>\r\n    C <span class=\"token comment\">--&gt; E[products\u8868]<\/span>\r\n    E <span class=\"token comment\">--&gt; F[inventory\u8868]<\/span>\r\n    \r\n    style B fill:<span class=\"token comment\">#f9f,stroke:#333<\/span>\r\n    style F fill:<span class=\"token comment\">#f96,stroke:#333<\/span><\/code><\/pre>\n<ul id=\"code_id_33\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u26a0\ufe0f \u00a0orders\u8868\u88ab3\u4e2a\u6a21\u5757\u5171\u4eab,\u9700\u8981\u6570\u636e\u5e93\u62c6\u5206\u7b56\u7565<\/p>\n<h3>3. \u8fc1\u79fb\u8def\u5f84\u5efa\u8bae<\/h3>\n<p>\u9636\u6bb51(2\u5468): UserService<\/p>\n<ul data-id=\"u738a58b-6XwBWcP6\">\n<li data-id=\"ld70c578-f5PzZjlO\">\u539f\u56e0: \u4f9d\u8d56\u5c11,\u98ce\u9669\u4f4e,\u5feb\u901f\u9a8c\u8bc1\u8fc1\u79fb\u65b9\u6848<\/li>\n<li data-id=\"ld70c578-87nThJ2Q\">\u5de5\u4f5c\u91cf: 1500\u884cJava\u4ee3\u7801 \u2192 500\u884cPython\u4ee3\u7801<\/li>\n<\/ul>\n<p>\u9636\u6bb52(3\u5468): ReportService<\/p>\n<ul data-id=\"u738a58b-zS1ZWh8X\">\n<li data-id=\"ld70c578-VgnH1Uam\">\u539f\u56e0: \u8bfb\u591a\u5199\u5c11,\u53ef\u4ee5\u7528\u6570\u636e\u5e93\u89c6\u56fe\u4e0e\u65e7\u7cfb\u7edf\u5171\u4eab\u6570\u636e<\/li>\n<li data-id=\"ld70c578-IQG0CgMq\">\u6027\u80fd\u63d0\u5347: Python + Pandas\u6bd4Java\u5feb3\u500d<\/li>\n<\/ul>\n<p>\u9636\u6bb53(4\u5468): OrderService + InventoryService<\/p>\n<ul data-id=\"u738a58b-9phhHxsf\">\n<li data-id=\"ld70c578-8isAnTgK\">\u96be\u70b9: \u4e8b\u52a1\u4e00\u81f4\u6027,\u9700\u8981\u5b9e\u73b0Saga\u6a21\u5f0f<\/li>\n<li data-id=\"ld70c578-uU6dCufB\">\u65b9\u6848: \u4f7f\u7528\u4e8b\u4ef6\u6eaf\u6e90(Event Sourcing)<\/li>\n<\/ul>\n<p>\u9636\u6bb54(3\u5468): PaymentService<\/p>\n<ul data-id=\"u738a58b-lwspSFDV\">\n<li data-id=\"ld70c578-gwWGbC3V\">\u98ce\u9669: \u6d89\u53ca\u91d1\u94b1,\u9700\u8981100%\u6d4b\u8bd5\u8986\u76d6<\/li>\n<li data-id=\"ld70c578-VR61XGd8\">\u65b9\u6848: \u5f71\u5b50\u6a21\u5f0f(\u65b0\u65e7\u7cfb\u7edf\u5e76\u884c,\u5bf9\u6bd4\u7ed3\u679c)<\/li>\n<\/ul>\n<h3>4. \u6280\u672f\u6808\u6620\u5c04<\/h3>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1019.16px\">\n<colgroup data-id=\"c7104f7d-SPmUSf27\">\n<col span=\"1\" width=\"339\" data-id=\"c4b6f635-iNgk7C5U\" \/>\n<col span=\"1\" width=\"339\" data-id=\"c4b6f635-O1Ni7LHU\" \/>\n<col span=\"1\" width=\"339\" data-id=\"c4b6f635-XQAF8ZDJ\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-fNgi5iLS\">\n<tr data-id=\"t31e458f-lc3QT91l\">\n<td data-id=\"t8c0e6ab-OJ5OrD6C\" data-transient-attributes=\"table-cell-selection\">\u65e7\u6280\u672f\u6808<\/td>\n<td data-id=\"t8c0e6ab-USbNq9KV\" data-transient-attributes=\"table-cell-selection\">\u65b0\u6280\u672f\u6808<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-m6BWAU6K\" data-transient-attributes=\"table-cell-selection\">\u8fc1\u79fb\u5de5\u5177<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-nWmUf65O\">\n<td data-id=\"t8c0e6ab-MEc0mfZE\" data-transient-attributes=\"table-cell-selection\">Spring MVC Controller<\/td>\n<td data-id=\"t8c0e6ab-eshLVpS8\" data-transient-attributes=\"table-cell-selection\">FastAPI\u8def\u7531<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-3i4QYH6B\" data-transient-attributes=\"table-cell-selection\">code-migrate\u5de5\u5177<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-IUMPTO2g\">\n<td data-id=\"t0bc4524-SkERUZeU\" data-transient-attributes=\"table-cell-selection\">Hibernate ORM<\/td>\n<td data-id=\"t0bc4524-W8GH57ZX\" data-transient-attributes=\"table-cell-selection\">SQLAlchemy ORM<\/td>\n<td class=\"table-last-row\" data-id=\"t78f5a9e-hD41kTXR\" data-transient-attributes=\"table-cell-selection\">\u81ea\u52a8\u8f6c\u6362\u811a\u672c<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-4S7mCe5Y\">\n<td data-id=\"t8c0e6ab-dlns9vDC\" data-transient-attributes=\"table-cell-selection\">JSP\u524d\u7aef<\/td>\n<td data-id=\"t8c0e6ab-gxMYNeYN\" data-transient-attributes=\"table-cell-selection\">React SPA<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-c5V2WAo2\" data-transient-attributes=\"table-cell-selection\">\u91cd\u5199(\u65e0\u81ea\u52a8\u5316)<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-lDiWfKlc\">\n<td data-id=\"t0bc4524-7W1N3QKJ\" data-transient-attributes=\"table-cell-selection\">Oracle DB<\/td>\n<td data-id=\"t0bc4524-NK2GoYNU\" data-transient-attributes=\"table-cell-selection\">PostgreSQL<\/td>\n<td class=\"table-last-row\" data-id=\"t78f5a9e-gJNGFQ07\" data-transient-attributes=\"table-cell-selection\">ora2pg\u8fc1\u79fb\u5de5\u5177<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-sBMdPIU3\">\n<td class=\"table-last-column\" data-id=\"t1c8f800-GLA6MS91\" data-transient-attributes=\"table-cell-selection\">log4j\u65e5\u5fd7<\/td>\n<td class=\"table-last-column\" data-id=\"t1c8f800-PPYOYijo\" data-transient-attributes=\"table-cell-selection\">structlog<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"t16089ba-kG8GEGVS\" data-transient-attributes=\"table-cell-selection\">logging\u914d\u7f6e<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>5. \u98ce\u9669\u77e9\u9635<\/h3>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1019.16px\">\n<colgroup data-id=\"c7104f7d-8TPencmj\">\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-6Mj9fham\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-FDiWlXOr\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-85re4E2p\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-sWZ6AYl2\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-HNJZaBeh\">\n<tr data-id=\"t31e458f-39lVmF21\">\n<td data-id=\"t8c0e6ab-OXPnetl2\" data-transient-attributes=\"table-cell-selection\">\u6a21\u5757<\/td>\n<td data-id=\"t8c0e6ab-mVYADC6d\" data-transient-attributes=\"table-cell-selection\">\u4e1a\u52a1\u98ce\u9669<\/td>\n<td data-id=\"t8c0e6ab-LhSLRbLg\" data-transient-attributes=\"table-cell-selection\">\u6280\u672f\u98ce\u9669<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-QJU8OlWl\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5148\u7ea7<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-sCfDH8Ql\">\n<td data-id=\"t8c0e6ab-g7LmyTWs\" data-transient-attributes=\"table-cell-selection\">UserService<\/td>\n<td data-id=\"t8c0e6ab-aQBeM3ep\" data-transient-attributes=\"table-cell-selection\">\u4f4e<\/td>\n<td data-id=\"t8c0e6ab-rKtdjqtt\" data-transient-attributes=\"table-cell-selection\">\u4f4e<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-HhSWIQkc\" data-transient-attributes=\"table-cell-selection\">\u7b2c1\u6279<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-Ag3a88Aa\">\n<td data-id=\"t0bc4524-B4WMK3Fn\" data-transient-attributes=\"table-cell-selection\">ReportService<\/td>\n<td data-id=\"t0bc4524-fXEoL953\" data-transient-attributes=\"table-cell-selection\">\u4f4e<\/td>\n<td data-id=\"t0bc4524-mMCiqnCl\" data-transient-attributes=\"table-cell-selection\">\u4e2d<\/td>\n<td class=\"table-last-row\" data-id=\"t78f5a9e-CDENehRg\" data-transient-attributes=\"table-cell-selection\">\u7b2c1\u6279<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-BNGfl6A4\">\n<td data-id=\"t8c0e6ab-qWiq0C7E\" data-transient-attributes=\"table-cell-selection\">OrderService<\/td>\n<td data-id=\"t8c0e6ab-eLs8tcHp\" data-transient-attributes=\"table-cell-selection\">\u9ad8<\/td>\n<td data-id=\"t8c0e6ab-6OM2CpV3\" data-transient-attributes=\"table-cell-selection\">\u9ad8<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-hf2CqqgT\" data-transient-attributes=\"table-cell-selection\">\u7b2c2\u6279<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-BhpEJ4IX\">\n<td class=\"table-last-column\" data-id=\"t57b3209-mdZ2biVe\" data-transient-attributes=\"table-cell-selection\">PaymentService<\/td>\n<td class=\"table-last-column\" data-id=\"t57b3209-AQDcfSKM\" data-transient-attributes=\"table-cell-selection\">\u6781\u9ad8<\/td>\n<td class=\"table-last-column\" data-id=\"t57b3209-4L4en56T\" data-transient-attributes=\"table-cell-selection\">\u9ad8<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"te61fc79-6JQaKCag\" data-transient-attributes=\"table-cell-selection\">\u7b2c3\u6279<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_34\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>Phase <span class=\"token number\">2<\/span>: \u7b2c\u4e00\u4e2a\u5fae\u670d\u52a1\u8fc1\u79fb<span class=\"token punctuation\">(<\/span>UserService<span class=\"token punctuation\">)<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n\r\n<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>Step <span class=\"token number\">1<\/span>: \u6570\u636e\u5e93\u8fc1\u79fb<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">`<\/span>bash\r\nTask tool: db<span class=\"token operator\">-<\/span>migrate\r\nPrompt: <span class=\"token string\">\"\r\n\u5c06Oracle\u7684users\u8868\u8fc1\u79fb\u5230PostgreSQL:\r\n- \u6e90: Oracle 19c, users\u8868(10\u4e07\u884c\u6570\u636e)\r\n- \u76ee\u6807: PostgreSQL 15\r\n- \u9700\u6c42: \u96f6\u505c\u673a\u8fc1\u79fb,\u4f7f\u7528\u903b\u8f91\u590d\u5236\r\n\"<\/span><\/code><\/pre>\n<ul id=\"code_id_34\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_35\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">-- 1. \u5728PostgreSQL\u521b\u5efa\u76ee\u6807\u8868<\/span>\r\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> users <span class=\"token punctuation\">(<\/span>\r\n    id <span class=\"token keyword\">SERIAL<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span>\r\n    username <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>\r\n    email <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">255<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>\r\n    password_hash <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">255<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>\r\n    created_at TIMESTAMPTZ <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    updated_at TIMESTAMPTZ <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token comment\">-- 2. \u4f7f\u7528ora2pg\u5bfc\u51fa\u6570\u636e<\/span>\r\n<span class=\"token comment\">-- ora2pg.conf (\u5de5\u5177\u81ea\u52a8\u751f\u6210)<\/span>\r\n<span class=\"token keyword\">TYPE<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">TABLE<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">DATA<\/span>\r\n<span class=\"token keyword\">SCHEMA<\/span> <span class=\"token operator\">=<\/span> APP_SCHEMA\r\n<span class=\"token keyword\">TABLES<\/span> <span class=\"token operator\">=<\/span> users\r\nOUTPUT <span class=\"token operator\">=<\/span> users_migration<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">sql<\/span>\r\n\r\n<span class=\"token comment\">-- 3. \u589e\u91cf\u540c\u6b65\u7b56\u7565(\u4f7f\u7528GoldenGate\u6216Debezium)<\/span>\r\n<span class=\"token comment\">-- Debezium\u914d\u7f6e(\u76d1\u542cOracle redo logs)<\/span>\r\n{\r\n  <span class=\"token string\">\"name\"<\/span>: <span class=\"token string\">\"oracle-users-connector\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token string\">\"config\"<\/span>: {\r\n    <span class=\"token string\">\"connector.class\"<\/span>: <span class=\"token string\">\"io.debezium.connector.oracle.OracleConnector\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.hostname\"<\/span>: <span class=\"token string\">\"oracle.example.com\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.port\"<\/span>: <span class=\"token string\">\"1521\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.user\"<\/span>: <span class=\"token string\">\"debezium\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.password\"<\/span>: <span class=\"token string\">\"${ORACLE_PASSWORD}\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.dbname\"<\/span>: <span class=\"token string\">\"ORCL\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"table.include.list\"<\/span>: <span class=\"token string\">\"APP_SCHEMA.USERS\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.history.kafka.bootstrap.servers\"<\/span>: <span class=\"token string\">\"kafka:9092\"<\/span><span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"database.history.kafka.topic\"<\/span>: <span class=\"token string\">\"dbhistory.users\"<\/span>\r\n  }\r\n}\r\n\r\n<span class=\"token comment\">-- 4. \u6570\u636e\u6821\u9a8c\u811a\u672c<\/span>\r\n<span class=\"token keyword\">SELECT<\/span> \r\n    <span class=\"token string\">'Oracle'<\/span> <span class=\"token keyword\">AS<\/span> source<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> total_rows<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">MAX<\/span><span class=\"token punctuation\">(<\/span>updated_at<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> latest_update\r\n<span class=\"token keyword\">FROM<\/span> users<span class=\"token variable\">@oracle_link<\/span>\r\n<span class=\"token keyword\">UNION<\/span> <span class=\"token keyword\">ALL<\/span>\r\n<span class=\"token keyword\">SELECT<\/span> \r\n    <span class=\"token string\">'PostgreSQL'<\/span> <span class=\"token keyword\">AS<\/span> source<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> total_rows<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token function\">MAX<\/span><span class=\"token punctuation\">(<\/span>updated_at<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> latest_update\r\n<span class=\"token keyword\">FROM<\/span> users<span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<ul id=\"code_id_35\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8fc1\u79fb\u6d41\u7a0b:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-dmWG4ElU\">\n<li data-id=\"ld70c578-gHqzCHiy\">\u521d\u59cb\u6570\u636e\u5bfc\u5165(\u5168\u91cf)<\/li>\n<li data-id=\"ld70c578-zAbRikGj\">\u542f\u52a8CDC(Change Data Capture)\u6301\u7eed\u540c\u6b65<\/li>\n<li data-id=\"ld70c578-gPClgDdn\">\u9a8c\u8bc1\u6570\u636e\u4e00\u81f4\u6027(\u5ef6\u8fdf&lt;1\u79d2)<\/li>\n<li data-id=\"ld70c578-cjhFwNx8\">\u5207\u6362\u6d41\u91cf\u5230\u65b0\u670d\u52a1<\/li>\n<li data-id=\"ld70c578-hQ3Fkh3n\">\u505c\u6b62CDC,\u5b8c\u5168\u5207\u6362<\/li>\n<\/ol>\n<p>Step 2: \u4ee3\u7801\u8fc1\u79fb<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_36\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">Task tool: code<span class=\"token operator\">-<\/span>migrate\r\nPrompt: <span class=\"token string\">\"\r\n\u5c06Java Spring MVC\u7684UserController\u8fc1\u79fb\u5230Python FastAPI:\r\n[\u7c98\u8d34Java\u4ee3\u7801]\r\n\r\n\u8981\u6c42:\r\n- \u4fdd\u6301API\u63a5\u53e3\u5b8c\u5168\u517c\u5bb9(URL\u3001\u8bf7\u6c42\/\u54cd\u5e94\u683c\u5f0f)\r\n- \u6dfb\u52a0\u73b0\u4ee3\u5316\u7279\u6027(async\u3001\u7c7b\u578b\u63d0\u793a\u3001\u81ea\u52a8\u6587\u6863)\r\n- \u63d0\u9ad8\u6d4b\u8bd5\u8986\u76d6\u7387(\u4ece40%\u523080%)\r\n\"<\/span><\/code><\/pre>\n<ul id=\"code_id_36\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u5165(Java\u4ee3\u7801):<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_37\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token variable\">@RestController<\/span>\r\n<span class=\"token variable\">@RequestMapping<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/api\/users\"<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">public<\/span> class UserController {\r\n    <span class=\"token variable\">@Autowired<\/span>\r\n    private UserService userService<span class=\"token punctuation\">;<\/span>\r\n    \r\n    <span class=\"token variable\">@GetMapping<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/{id}\"<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">public<\/span> ResponseEntity<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">User<\/span><span class=\"token operator\">&gt;<\/span> getUserById<span class=\"token punctuation\">(<\/span><span class=\"token variable\">@PathVariable<\/span> Long id<span class=\"token punctuation\">)<\/span> {\r\n        <span class=\"token keyword\">User<\/span> <span class=\"token keyword\">user<\/span> <span class=\"token operator\">=<\/span> userService<span class=\"token punctuation\">.<\/span>findById<span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">user<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token boolean\">null<\/span><span class=\"token punctuation\">)<\/span> {\r\n            <span class=\"token keyword\">return<\/span> ResponseEntity<span class=\"token punctuation\">.<\/span>notFound<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>build<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        }\r\n        <span class=\"token keyword\">return<\/span> ResponseEntity<span class=\"token punctuation\">.<\/span>ok<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">user<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    }\r\n    \r\n    <span class=\"token variable\">@PostMapping<\/span>\r\n    <span class=\"token keyword\">public<\/span> ResponseEntity<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">User<\/span><span class=\"token operator\">&gt;<\/span> createUser<span class=\"token punctuation\">(<\/span><span class=\"token variable\">@RequestBody<\/span> <span class=\"token variable\">@Valid<\/span> UserDto userDto<span class=\"token punctuation\">)<\/span> {\r\n        <span class=\"token keyword\">User<\/span> <span class=\"token keyword\">user<\/span> <span class=\"token operator\">=<\/span> userService<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">create<\/span><span class=\"token punctuation\">(<\/span>userDto<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token keyword\">return<\/span> ResponseEntity<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">status<\/span><span class=\"token punctuation\">(<\/span>HttpStatus<span class=\"token punctuation\">.<\/span>CREATED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>body<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">user<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    }\r\n}<\/code><\/pre>\n<ul id=\"code_id_37\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa(Python\u4ee3\u7801,\u5e26\u6539\u8fdb):<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_38\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token keyword\">from<\/span> fastapi <span class=\"token keyword\">import<\/span> APIRouter<span class=\"token punctuation\">,<\/span> Depends<span class=\"token punctuation\">,<\/span> HTTPException<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">status<\/span>\r\n<span class=\"token keyword\">from<\/span> sqlalchemy<span class=\"token punctuation\">.<\/span>ext<span class=\"token punctuation\">.<\/span>asyncio <span class=\"token keyword\">import<\/span> AsyncSession\r\n<span class=\"token keyword\">from<\/span> app<span class=\"token punctuation\">.<\/span>core<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">database<\/span> <span class=\"token keyword\">import<\/span> get_db\r\n<span class=\"token keyword\">from<\/span> app<span class=\"token punctuation\">.<\/span>schemas<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">user<\/span> <span class=\"token keyword\">import<\/span> <span class=\"token keyword\">User<\/span><span class=\"token punctuation\">,<\/span> UserCreate\r\n<span class=\"token keyword\">from<\/span> app<span class=\"token punctuation\">.<\/span>services<span class=\"token punctuation\">.<\/span>user_service <span class=\"token keyword\">import<\/span> UserService\r\n\r\nrouter <span class=\"token operator\">=<\/span> APIRouter<span class=\"token punctuation\">(<\/span>prefix<span class=\"token operator\">=<\/span><span class=\"token string\">\"\/api\/users\"<\/span><span class=\"token punctuation\">,<\/span> tags<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">\"users\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token variable\">@router.get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/{id}\"<\/span><span class=\"token punctuation\">,<\/span> response_model<span class=\"token operator\">=<\/span><span class=\"token keyword\">User<\/span><span class=\"token punctuation\">)<\/span>\r\nasync def get_user_by_id<span class=\"token punctuation\">(<\/span>\r\n    id: <span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span>\r\n    db: AsyncSession <span class=\"token operator\">=<\/span> Depends<span class=\"token punctuation\">(<\/span>get_db<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token keyword\">User<\/span>:\r\n    <span class=\"token string\">\"\"\"\r\n    \u83b7\u53d6\u7528\u6237\u8be6\u60c5\r\n    \r\n    \u517c\u5bb9\u6027: \u4e0e\u65e7API\u5b8c\u5168\u517c\u5bb9\r\n    \u6539\u8fdb: \u4f7f\u7528\u5f02\u6b65I\/O\u63d0\u5347\u5e76\u53d1\u6027\u80fd\r\n    \"\"\"<\/span>\r\n    service <span class=\"token operator\">=<\/span> UserService<span class=\"token punctuation\">(<\/span>db<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">user<\/span> <span class=\"token operator\">=<\/span> await service<span class=\"token punctuation\">.<\/span>find_by_id<span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">user<\/span> <span class=\"token operator\">is<\/span> None:\r\n        raise HTTPException<span class=\"token punctuation\">(<\/span>\r\n            status_code<span class=\"token operator\">=<\/span><span class=\"token keyword\">status<\/span><span class=\"token punctuation\">.<\/span>HTTP_404_NOT_FOUND<span class=\"token punctuation\">,<\/span>\r\n            detail<span class=\"token operator\">=<\/span>f<span class=\"token string\">\"User {id} not found\"<\/span>\r\n        <span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">user<\/span>\r\n\r\n<span class=\"token variable\">@router.post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/\"<\/span><span class=\"token punctuation\">,<\/span> response_model<span class=\"token operator\">=<\/span><span class=\"token keyword\">User<\/span><span class=\"token punctuation\">,<\/span> status_code<span class=\"token operator\">=<\/span><span class=\"token keyword\">status<\/span><span class=\"token punctuation\">.<\/span>HTTP_201_CREATED<span class=\"token punctuation\">)<\/span>\r\nasync def create_user<span class=\"token punctuation\">(<\/span>\r\n    user_data: UserCreate<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># Pydantic\u81ea\u52a8\u9a8c\u8bc1<\/span>\r\n    db: AsyncSession <span class=\"token operator\">=<\/span> Depends<span class=\"token punctuation\">(<\/span>get_db<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token keyword\">User<\/span>:\r\n    <span class=\"token string\">\"\"\"\r\n    \u521b\u5efa\u65b0\u7528\u6237\r\n    \r\n    \u517c\u5bb9\u6027: \u8bf7\u6c42\/\u54cd\u5e94\u683c\u5f0f\u4e0e\u65e7API\u4e00\u81f4\r\n    \u6539\u8fdb: \r\n    - \u81ea\u52a8OpenAPI\u6587\u6863\u751f\u6210\r\n    - \u66f4\u5f3a\u7684\u7c7b\u578b\u5b89\u5168(Pydantic)\r\n    - \u5f02\u6b65\u5904\u7406\u63d0\u5347\u6027\u80fd\r\n    \"\"\"<\/span>\r\n    service <span class=\"token operator\">=<\/span> UserService<span class=\"token punctuation\">(<\/span>db<span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token comment\"># \u68c0\u67e5\u90ae\u7bb1\u662f\u5426\u5df2\u5b58\u5728(\u6539\u8fdb:\u4e4b\u524d\u6ca1\u6709\u8fd9\u4e2a\u68c0\u67e5)<\/span>\r\n    existing <span class=\"token operator\">=<\/span> await service<span class=\"token punctuation\">.<\/span>find_by_email<span class=\"token punctuation\">(<\/span>user_data<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">if<\/span> existing:\r\n        raise HTTPException<span class=\"token punctuation\">(<\/span>\r\n            status_code<span class=\"token operator\">=<\/span><span class=\"token keyword\">status<\/span><span class=\"token punctuation\">.<\/span>HTTP_409_CONFLICT<span class=\"token punctuation\">,<\/span>\r\n            detail<span class=\"token operator\">=<\/span><span class=\"token string\">\"Email already registered\"<\/span>\r\n        <span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token keyword\">user<\/span> <span class=\"token operator\">=<\/span> await service<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">create<\/span><span class=\"token punctuation\">(<\/span>user_data<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">user<\/span>\r\n\r\n<span class=\"token comment\"># \u65b0\u589e:\u5065\u5eb7\u68c0\u67e5\u7aef\u70b9(\u65e7\u7cfb\u7edf\u6ca1\u6709)<\/span>\r\n<span class=\"token variable\">@router.get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/health\"<\/span><span class=\"token punctuation\">,<\/span> include_in_schema<span class=\"token operator\">=<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span>\r\nasync def health_check<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">&gt;<\/span> dict:\r\n    <span class=\"token string\">\"\"\"\u5fae\u670d\u52a1\u5065\u5eb7\u68c0\u67e5\"\"\"<\/span>\r\n    <span class=\"token keyword\">return<\/span> {<span class=\"token string\">\"status\"<\/span>: <span class=\"token string\">\"healthy\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"service\"<\/span>: <span class=\"token string\">\"UserService\"<\/span>}<\/code><\/pre>\n<ul id=\"code_id_38\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4ee3\u7801\u6539\u8fdb\u4eae\u70b9:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-mdB4BdNg\">\n<li data-id=\"ld70c578-drqnTTO5\">\u5f02\u6b65I\/O:\u00a0<code>async\/await<\/code>\u652f\u6301\u9ad8\u5e76\u53d1(1000+ req\/s)<\/li>\n<li data-id=\"ld70c578-yn9Y2RBz\">\u7c7b\u578b\u5b89\u5168: Pydantic\u81ea\u52a8\u9a8c\u8bc1\u8bf7\u6c42,\u51cf\u5c1190%\u7684\u53c2\u6570\u9519\u8bef<\/li>\n<li data-id=\"ld70c578-c6l5JAbF\">\u81ea\u52a8\u6587\u6863: OpenAPI\/Swagger UI\u81ea\u52a8\u751f\u6210,\u65e0\u9700\u624b\u5199<\/li>\n<li data-id=\"ld70c578-EiTSoHgg\">\u9519\u8bef\u5904\u7406: HTTP\u5f02\u5e38\u6807\u51c6\u5316,\u9519\u8bef\u4fe1\u606f\u66f4\u53cb\u597d<\/li>\n<li data-id=\"ld70c578-JxJuSMXn\">\u53ef\u89c2\u6d4b\u6027: \u5185\u7f6e\u5065\u5eb7\u68c0\u67e5,\u65b9\u4fbfK8s\u63a2\u9488<\/li>\n<\/ol>\n<p>Step 3: \u91d1\u4e1d\u96c0\u53d1\u5e03<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_39\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">Task tool <span class=\"token keyword\">with<\/span> subagent_type: deployment<span class=\"token operator\">-<\/span>engineer\r\nPrompt: <span class=\"token string\">\"\r\n\u914d\u7f6e\u91d1\u4e1d\u96c0\u53d1\u5e03:\r\n- 10%\u6d41\u91cf\u5230\u65b0UserService(Python)\r\n- 90%\u6d41\u91cf\u5230\u65e7UserService(Java)\r\n- \u76d1\u63a7\u6307\u6807:\u9519\u8bef\u7387\u3001\u5ef6\u8fdf\u3001\u541e\u5410\u91cf\r\n- \u81ea\u52a8\u56de\u6eda\u6761\u4ef6:\u9519\u8bef\u7387&gt;1%\u6216P99\u5ef6\u8fdf&gt;2\u79d2\r\n\"<\/span><\/code><\/pre>\n<ul id=\"code_id_39\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8f93\u51fa(Istio\u914d\u7f6e):<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_40\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># istio\/virtual-service.yaml<\/span>\r\napiVersion: networking<span class=\"token punctuation\">.<\/span>istio<span class=\"token punctuation\">.<\/span>io<span class=\"token operator\">\/<\/span>v1beta1\r\nkind: VirtualService\r\nmetadata:\r\n  name: <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service\r\nspec:\r\n  hosts:\r\n  <span class=\"token operator\">-<\/span> <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service\r\n  http:\r\n  <span class=\"token operator\">-<\/span> <span class=\"token keyword\">match<\/span>:\r\n    <span class=\"token operator\">-<\/span> headers:\r\n        canary:\r\n          exact: <span class=\"token string\">\"true\"<\/span>\r\n    route:\r\n    <span class=\"token operator\">-<\/span> destination:\r\n        host: <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service<span class=\"token operator\">-<\/span>python\r\n        subset: v2\r\n  <span class=\"token operator\">-<\/span> route:\r\n    <span class=\"token operator\">-<\/span> destination:\r\n        host: <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service<span class=\"token operator\">-<\/span>java\r\n        subset: v1\r\n      weight: <span class=\"token number\">90<\/span>\r\n    <span class=\"token operator\">-<\/span> destination:\r\n        host: <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service<span class=\"token operator\">-<\/span>python\r\n        subset: v2\r\n      weight: <span class=\"token number\">10<\/span>  <span class=\"token comment\"># 10%\u6d41\u91cf\u5230\u65b0\u670d\u52a1<\/span>\r\n\r\n<span class=\"token comment\">---<\/span>\r\n<span class=\"token comment\"># istio\/destination-rule.yaml<\/span>\r\napiVersion: networking<span class=\"token punctuation\">.<\/span>istio<span class=\"token punctuation\">.<\/span>io<span class=\"token operator\">\/<\/span>v1beta1\r\nkind: DestinationRule\r\nmetadata:\r\n  name: <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service\r\nspec:\r\n  host: <span class=\"token keyword\">user<\/span><span class=\"token operator\">-<\/span>service\r\n  subsets:\r\n  <span class=\"token operator\">-<\/span> name: v1\r\n    labels:\r\n      version: java\r\n  <span class=\"token operator\">-<\/span> name: v2\r\n    labels:\r\n      version: python\r\n    trafficPolicy:\r\n      outlierDetection:  <span class=\"token comment\"># \u5f02\u5e38\u68c0\u6d4b<\/span>\r\n        consecutiveErrors: <span class=\"token number\">5<\/span>\r\n        <span class=\"token keyword\">interval<\/span>: <span class=\"token number\">30<\/span>s\r\n        baseEjectionTime: <span class=\"token number\">30<\/span>s<\/code><\/pre>\n<ul id=\"code_id_40\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u76d1\u63a7\u4eea\u8868\u677f\u81ea\u52a8\u751f\u6210:<\/p>\n<ul data-id=\"u738a58b-X69iSB1g\">\n<li data-id=\"ld70c578-dVUWC5yJ\">\u65b0\u65e7\u670d\u52a1\u5bf9\u6bd4\u56fe(\u5ef6\u8fdf\u3001\u9519\u8bef\u7387\u3001\u541e\u5410\u91cf)<\/li>\n<li data-id=\"ld70c578-2jNB2gHb\">\u5b9e\u65f6\u544a\u8b66(\u9519\u8bef\u7387&gt;1%\u65f6\u81ea\u52a8\u56de\u6eda)<\/li>\n<li data-id=\"ld70c578-xVjLN6Z5\">A\/B\u6d4b\u8bd5\u7ed3\u679c(\u7edf\u8ba1\u663e\u8457\u6027\u68c0\u9a8c)<\/li>\n<\/ul>\n<p>Phase 3: \u8fed\u4ee3\u8fc1\u79fb(\u91cd\u590dPhase 2)<\/p>\n<p>\u901a\u8fc7Claude Code Agents,\u6bcf\u4e2a\u670d\u52a1\u7684\u8fc1\u79fb\u5468\u671f\u4ece4\u5468\u7f29\u77ed\u52301\u5468,\u6574\u4e2a\u9879\u76ee\u4ece\u9884\u4f30\u76846\u4e2a\u6708\u7f29\u77ed\u52302\u4e2a\u6708\u3002<\/p>\n<h3>3.3 \u573a\u666f\u4e09:AI\u9a71\u52a8\u7684\u4ee3\u7801\u5ba1\u67e5\u4e0e\u4f18\u5316<\/h3>\n<h4>\u573a\u666f\u63cf\u8ff0<\/h4>\n<p>\u56e2\u961f\u6536\u5230\u4e00\u4e2a\u4ee3\u7801\u5e93,\u9700\u8981\u8fdb\u884c\u5168\u9762\u7684\u8d28\u91cf\u5ba1\u67e5\u548c\u4f18\u5316:<\/p>\n<ul data-id=\"u738a58b-OoDocH7E\">\n<li data-id=\"ld70c578-H2LjzkKt\">\u4ee3\u7801\u89c4\u6a21:50K\u884cPython\u4ee3\u7801<\/li>\n<li data-id=\"ld70c578-ymztjCq4\">\u95ee\u9898:\u6027\u80fd\u6162\u3001\u5b89\u5168\u6f0f\u6d1e\u3001\u6d4b\u8bd5\u8986\u76d6\u4f4e<\/li>\n<li data-id=\"ld70c578-nAncngwT\">\u76ee\u6807:\u751f\u4ea7\u5c31\u7eea,\u6027\u80fd\u63d0\u53473\u500d<\/li>\n<\/ul>\n<h4>\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u5ba1\u67e5<\/h4>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_41\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u5de5\u4f5c\u6d41:code-quality-review<\/span>\r\nTask tool: workflow\r\nName: code<span class=\"token operator\">-<\/span>quality<span class=\"token operator\">-<\/span>review\r\nTarget: <span class=\"token punctuation\">.<\/span><span class=\"token operator\">\/<\/span>src\r\n\r\n<span class=\"token comment\"># \u81ea\u52a8\u89e6\u53d14\u4e2a\u667a\u80fd\u4f53\u5e76\u884c\u5ba1\u67e5:<\/span>\r\n<span class=\"token number\">1.<\/span> code<span class=\"token operator\">-<\/span>reviewer <span class=\"token punctuation\">(<\/span>Opus<span class=\"token punctuation\">)<\/span>: \u67b6\u6784\u4e0e\u4ee3\u7801\u8d28\u91cf\r\n<span class=\"token number\">2.<\/span> security<span class=\"token operator\">-<\/span>auditor <span class=\"token punctuation\">(<\/span>Opus<span class=\"token punctuation\">)<\/span>: \u5b89\u5168\u6f0f\u6d1e\u626b\u63cf\r\n<span class=\"token number\">3.<\/span> performance<span class=\"token operator\">-<\/span>engineer <span class=\"token punctuation\">(<\/span>Opus<span class=\"token punctuation\">)<\/span>: \u6027\u80fd\u5206\u6790\r\n<span class=\"token number\">4.<\/span> test<span class=\"token operator\">-<\/span>automator <span class=\"token punctuation\">(<\/span>Sonnet<span class=\"token punctuation\">)<\/span>: \u6d4b\u8bd5\u8986\u76d6\u5206\u6790<\/code><\/pre>\n<ul id=\"code_id_41\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Reviewer 1: code-reviewer\u7684\u8f93\u51fa<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_42\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">## \u4ee3\u7801\u8d28\u91cf\u5ba1\u67e5\u62a5\u544a<\/span>\r\n\r\n<span class=\"token comment\">### \ud83d\udd34 \u5173\u952e\u95ee\u9898(3\u4e2a)<\/span>\r\n\r\n<span class=\"token comment\">#### 1. \u67b6\u6784\u95ee\u9898:\u7d27\u8026\u5408\u8bbe\u8ba1<\/span>\r\n<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\u4f4d\u7f6e<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: src<span class=\"token operator\">\/<\/span>services<span class=\"token operator\">\/<\/span>order_service<span class=\"token punctuation\">.<\/span>py\r\n<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\u95ee\u9898<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>: OrderService\u76f4\u63a5\u5b9e\u4f8b\u5316PaymentGateway<span class=\"token punctuation\">,<\/span>\u65e0\u6cd5mock\u6d4b\u8bd5\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">`<\/span>python\r\n<span class=\"token comment\"># \u73b0\u6709\u4ee3\u7801(\u95ee\u9898)<\/span>\r\nclass OrderService:\r\n    def __init__<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>payment <span class=\"token operator\">=<\/span> PaymentGateway<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u786c\u7f16\u7801\u4f9d\u8d56<\/span>\r\n    \r\n    def process_order<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">order<\/span><span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>payment<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>total<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u96be\u4ee5\u6d4b\u8bd5<\/span><\/code><\/pre>\n<ul id=\"code_id_42\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5efa\u8bae: \u4f9d\u8d56\u6ce8\u5165\u6a21\u5f0f<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_43\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u6539\u8fdb\u4ee3\u7801<\/span>\r\nclass OrderService:\r\n    def __init__<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> payment_gateway: PaymentGateway<span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>payment <span class=\"token operator\">=<\/span> payment_gateway  <span class=\"token comment\"># \u4f9d\u8d56\u6ce8\u5165<\/span>\r\n    \r\n    def process_order<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">order<\/span><span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>payment<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>total<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\"># \u6d4b\u8bd5\u65f6\u53ef\u4ee5\u6ce8\u5165mock<\/span>\r\nmock_payment <span class=\"token operator\">=<\/span> Mock<span class=\"token punctuation\">(<\/span>spec<span class=\"token operator\">=<\/span>PaymentGateway<span class=\"token punctuation\">)<\/span>\r\nservice <span class=\"token operator\">=<\/span> OrderService<span class=\"token punctuation\">(<\/span>payment_gateway<span class=\"token operator\">=<\/span>mock_payment<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_43\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>2. \u6027\u80fd\u95ee\u9898:N+1\u67e5\u8be2<\/h4>\n<p>\u4f4d\u7f6e: src\/api\/orders.py:45<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_44\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u73b0\u6709\u4ee3\u7801(\u95ee\u9898)<\/span>\r\norders <span class=\"token operator\">=<\/span> db<span class=\"token punctuation\">.<\/span>query<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">Order<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">all<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">for<\/span> <span class=\"token keyword\">order<\/span> <span class=\"token operator\">in<\/span> orders:  <span class=\"token comment\"># N+1\u67e5\u8be2<\/span>\r\n    <span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>customer <span class=\"token operator\">=<\/span> db<span class=\"token punctuation\">.<\/span>query<span class=\"token punctuation\">(<\/span>Customer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>customer_id<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_44\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5f71\u54cd: 100\u4e2a\u8ba2\u5355 = 101\u6b21\u6570\u636e\u5e93\u67e5\u8be2,\u54cd\u5e94\u65f6\u95f43\u79d2\u5efa\u8bae: \u4f7f\u7528JOIN\u6216eager loading<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_45\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u6539\u8fdb\u4ee3\u7801<\/span>\r\norders <span class=\"token operator\">=<\/span> db<span class=\"token punctuation\">.<\/span>query<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">Order<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>options<span class=\"token punctuation\">(<\/span>\r\n    joinedload<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">Order<\/span><span class=\"token punctuation\">.<\/span>customer<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u4e00\u6b21\u67e5\u8be2\u83b7\u53d6\u6240\u6709\u6570\u636e<\/span>\r\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">all<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_45\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u9884\u671f\u6548\u679c: \u54cd\u5e94\u65f6\u95f4\u4ece3\u79d2\u964d\u81f3200ms(\u63d0\u534715\u500d)<\/p>\n<h4>3. \u53ef\u7ef4\u62a4\u6027\u95ee\u9898:\u4e0a\u5e1d\u7c7b(God Class)<\/h4>\n<p>\u4f4d\u7f6e: src\/utils\/helper.py (2000\u884c)\u95ee\u9898: \u5355\u4e2a\u6587\u4ef6\u5305\u542b20\u4e2a\u4e0d\u76f8\u5173\u7684\u51fd\u6570\u5efa\u8bae: \u6309\u529f\u80fd\u62c6\u5206\u4e3a\u591a\u4e2a\u6a21\u5757<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_46\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">utils\/\r\n\u251c\u2500\u2500 date_utils.py      # \u65e5\u671f\u5904\u7406\r\n\u251c\u2500\u2500 string_utils.py    # \u5b57\u7b26\u4e32\u5904\u7406\r\n\u251c\u2500\u2500 validation.py      # \u6570\u636e\u9a8c\u8bc1\r\n\u2514\u2500\u2500 formatting.py      # \u683c\u5f0f\u5316<\/code><\/pre>\n<ul id=\"code_id_46\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>\u6b21\u8981\u95ee\u9898(15\u4e2a)<\/h3>\n<ul data-id=\"u738a58b-cnb7Gzw6\">\n<li data-id=\"ld70c578-LZ0GFhdD\">\u7f3a\u5c11\u7c7b\u578b\u63d0\u793a(\u5f71\u54cdIDE\u667a\u80fd\u63d0\u793a)<\/li>\n<li data-id=\"ld70c578-SOpoRloE\">\u9b54\u6cd5\u6570\u5b57(\u5efa\u8bae\u7528\u5e38\u91cf\u66ff\u6362)<\/li>\n<li data-id=\"ld70c578-AA3LS1v5\">\u8fc7\u957f\u51fd\u6570(&gt;50\u884c,\u5efa\u8bae\u62c6\u5206)<\/li>\n<li data-id=\"ld70c578-jmYkRaMX\">&#8230;<\/li>\n<\/ul>\n<h3>\u826f\u597d\u5b9e\u8df5(8\u5904)<\/h3>\n<ul data-id=\"u738a58b-M4vigil6\">\n<li data-id=\"ld70c578-LUGWs1yD\">\u4f7f\u7528\u5f02\u6b65I\/O\u5904\u7406\u5e76\u53d1\u8bf7\u6c42<\/li>\n<li data-id=\"ld70c578-rbF2TIfU\">\u7edf\u4e00\u7684\u9519\u8bef\u5904\u7406\u4e2d\u95f4\u4ef6<\/li>\n<li data-id=\"ld70c578-mf4UM1iU\">\u7ed3\u6784\u5316\u65e5\u5fd7(JSON\u683c\u5f0f)<\/li>\n<\/ul>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_47\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>Reviewer <span class=\"token number\">2<\/span>: security<span class=\"token operator\">-<\/span>auditor\u7684\u8f93\u51fa<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span>markdown\r\n## \u5b89\u5168\u5ba1\u8ba1\u62a5\u544a\r\n\r\n### \ud83d\udd34 \u9ad8\u5371\u6f0f\u6d1e(2\u4e2a)\r\n\r\n#### CVE-2024-XXXX: SQL\u6ce8\u5165\u98ce\u9669\r\n**\u4f4d\u7f6e**: src\/api\/search.py:23\r\n**CVSS\u8bc4\u5206**: 9.8 (Critical)\r\n``<span class=\"token punctuation\">`<\/span><\/span>python\r\n<span class=\"token comment\"># \u5371\u9669\u4ee3\u7801<\/span>\r\ndef search_users<span class=\"token punctuation\">(<\/span>query: str<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token keyword\">sql<\/span> <span class=\"token operator\">=<\/span> f<span class=\"token string\">\"SELECT * FROM users WHERE name LIKE '%{query}%'\"<\/span>  <span class=\"token comment\"># \u6ce8\u5165\u98ce\u9669!<\/span>\r\n    <span class=\"token keyword\">return<\/span> db<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">execute<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">sql<\/span><span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_47\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u653b\u51fb\u793a\u4f8b:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_48\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">query <span class=\"token operator\">=<\/span> <span class=\"token string\">\"'; DROP TABLE users; --\"<\/span>\r\n\u2192 \u6267\u884c: <span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> name <span class=\"token operator\">LIKE<\/span> <span class=\"token string\">'%'<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">DROP<\/span> <span class=\"token keyword\">TABLE<\/span> users<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">--%'<\/span><\/code><\/pre>\n<ul id=\"code_id_48\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4fee\u590d:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_49\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">def search_users<span class=\"token punctuation\">(<\/span>query: str<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token keyword\">sql<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string\">\"SELECT * FROM users WHERE name LIKE :query\"<\/span>\r\n    <span class=\"token keyword\">return<\/span> db<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">execute<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">sql<\/span><span class=\"token punctuation\">,<\/span> {<span class=\"token string\">\"query\"<\/span>: f<span class=\"token string\">\"%{query}%\"<\/span>}<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u53c2\u6570\u5316\u67e5\u8be2<\/span><\/code><\/pre>\n<ul id=\"code_id_49\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u654f\u611f\u6570\u636e\u6cc4\u9732:\u5bc6\u7801\u660e\u6587\u8bb0\u5f55<\/h4>\n<p>\u4f4d\u7f6e: src\/core\/logging.py:56<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_50\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\"># \u5371\u9669\u4ee3\u7801\r\nlogger.info(f\"User login: {username}, password: {password}\")  # \u6cc4\u9732\u5bc6\u7801!<\/code><\/pre>\n<ul id=\"code_id_50\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4fee\u590d:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_51\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">logger.info(f\"User login: {username}\")  # \u4e0d\u8bb0\u5f55\u5bc6\u7801\r\n# \u6216\r\nlogger.info(f\"User login: {username}, password: ***\")  # \u8131\u654f<\/code><\/pre>\n<ul id=\"code_id_51\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>\u4e2d\u5371\u95ee\u9898(5\u4e2a)<\/h3>\n<ul data-id=\"u738a58b-NrvX6khW\">\n<li data-id=\"ld70c578-iLCu5E77\">JWT token\u65e0\u8fc7\u671f\u65f6\u95f4<\/li>\n<li data-id=\"ld70c578-iShgO1zY\">CORS\u914d\u7f6e\u8fc7\u4e8e\u5bbd\u677e(allow_origins=[&#8216;*&#8217;])<\/li>\n<li data-id=\"ld70c578-u5kjobIH\">\u7f3a\u5c11\u901f\u7387\u9650\u5236<\/li>\n<li data-id=\"ld70c578-zKGlb6ID\">&#8230;<\/li>\n<\/ul>\n<h3>\u5efa\u8bae\u7684\u5b89\u5168\u63a7\u5236<\/h3>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-RjWJ3OLS\">\n<li data-id=\"ld70c578-MfaO5Hg8\">\u5b9e\u65bdSAST\u626b\u63cf(Semgrep)\u5230CI\/CD<\/li>\n<li data-id=\"ld70c578-pHSNzj71\">\u6dfb\u52a0\u4f9d\u8d56\u9879\u5b89\u5168\u626b\u63cf(Snyk)<\/li>\n<li data-id=\"ld70c578-1jGahpFM\">\u542f\u7528Content Security Policy(CSP)<\/li>\n<\/ol>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_52\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>Reviewer <span class=\"token number\">3<\/span>: performance<span class=\"token operator\">-<\/span>engineer\u7684\u8f93\u51fa<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span>markdown\r\n## \u6027\u80fd\u5206\u6790\u62a5\u544a\r\n\r\n### \ud83d\udd0d \u6027\u80fd\u74f6\u9888\u8bc6\u522b\r\n\r\n#### \u74f6\u98881: \u540c\u6b65I\/O\u963b\u585e\r\n**\u4f4d\u7f6e**: src\/services\/notification_service.py\r\n**\u95ee\u9898**: \u53d1\u9001\u90ae\u4ef6\u4f7f\u7528\u540c\u6b65\u8c03\u7528,\u963b\u585e\u8bf7\u6c42\u7ebf\u7a0b\r\n``<span class=\"token punctuation\">`<\/span><\/span>python\r\n<span class=\"token comment\"># \u73b0\u6709\u4ee3\u7801(\u95ee\u9898)<\/span>\r\ndef send_order_confirmation<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">)<\/span>:\r\n    email_client<span class=\"token punctuation\">.<\/span>send<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>customer<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">,<\/span> template<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u963b\u585e300ms<\/span>\r\n    sms_client<span class=\"token punctuation\">.<\/span>send<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>customer<span class=\"token punctuation\">.<\/span>phone<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">)<\/span>     <span class=\"token comment\"># \u963b\u585e200ms<\/span>\r\n    <span class=\"token comment\"># \u603b\u8017\u65f6500ms<\/span><\/code><\/pre>\n<ul id=\"code_id_52\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6539\u8fdb: \u5f02\u6b65+\u540e\u53f0\u4efb\u52a1<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_53\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u65b9\u68481: \u5f02\u6b65I\/O<\/span>\r\nasync def send_order_confirmation<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">)<\/span>:\r\n    await asyncio<span class=\"token punctuation\">.<\/span>gather<span class=\"token punctuation\">(<\/span>\r\n        email_client<span class=\"token punctuation\">.<\/span>send_async<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u5e76\u53d1\u6267\u884c<\/span>\r\n        sms_client<span class=\"token punctuation\">.<\/span>send_async<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token comment\"># \u603b\u8017\u65f6300ms(\u53d6\u6700\u6162\u7684)<\/span>\r\n\r\n<span class=\"token comment\"># \u65b9\u68482: \u540e\u53f0\u4efb\u52a1(\u63a8\u8350)<\/span>\r\ndef send_order_confirmation<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">)<\/span>:\r\n    celery_app<span class=\"token punctuation\">.<\/span>send_task<span class=\"token punctuation\">(<\/span><span class=\"token string\">'send_email'<\/span><span class=\"token punctuation\">,<\/span> args<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\n    celery_app<span class=\"token punctuation\">.<\/span>send_task<span class=\"token punctuation\">(<\/span><span class=\"token string\">'send_sms'<\/span><span class=\"token punctuation\">,<\/span> args<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token keyword\">order<\/span><span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token comment\"># \u7acb\u5373\u8fd4\u56de,\u603b\u8017\u65f65ms<\/span><\/code><\/pre>\n<ul id=\"code_id_53\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6548\u679c: \u54cd\u5e94\u65f6\u95f4\u4ece500ms\u964d\u81f35ms(\u63d0\u5347100\u500d)<\/p>\n<h4>\u74f6\u98882: \u7f3a\u5c11\u7f13\u5b58<\/h4>\n<p>\u4f4d\u7f6e: src\/api\/products.py\u95ee\u9898: \u4ea7\u54c1\u5217\u8868\u6bcf\u6b21\u90fd\u67e5\u6570\u636e\u5e93,\u6570\u636e\u53d8\u5316\u9891\u7387\u4f4e<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_54\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\"># \u73b0\u6709\u4ee3\u7801\r\n@router.get(\"\/products\")\r\ndef list_products():\r\n    return db.query(Product).all()  # \u6bcf\u6b21\u67e5\u8be2,20ms<\/code><\/pre>\n<ul id=\"code_id_54\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6539\u8fdb: \u591a\u7ea7\u7f13\u5b58<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_55\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token keyword\">from<\/span> functools <span class=\"token keyword\">import<\/span> lru_cache\r\n<span class=\"token keyword\">from<\/span> redis <span class=\"token keyword\">import<\/span> Redis\r\n\r\nredis <span class=\"token operator\">=<\/span> Redis<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token variable\">@router.get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/products\"<\/span><span class=\"token punctuation\">)<\/span>\r\nasync def list_products<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token comment\"># L1: \u5185\u5b58\u7f13\u5b58(\u8fdb\u7a0b\u5185)<\/span>\r\n    cached <span class=\"token operator\">=<\/span> _get_products_from_memory_cache<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">if<\/span> cached:\r\n        <span class=\"token keyword\">return<\/span> cached  <span class=\"token comment\"># 0.1ms<\/span>\r\n    \r\n    <span class=\"token comment\"># L2: Redis\u7f13\u5b58(\u8de8\u8fdb\u7a0b)<\/span>\r\n    cached <span class=\"token operator\">=<\/span> redis<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">'products:list'<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">if<\/span> cached:\r\n        _set_products_to_memory_cache<span class=\"token punctuation\">(<\/span>cached<span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>loads<span class=\"token punctuation\">(<\/span>cached<span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># 2ms<\/span>\r\n    \r\n    <span class=\"token comment\"># L3: \u6570\u636e\u5e93\u67e5\u8be2<\/span>\r\n    products <span class=\"token operator\">=<\/span> await db<span class=\"token punctuation\">.<\/span>query<span class=\"token punctuation\">(<\/span>Product<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">all<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># 20ms<\/span>\r\n    redis<span class=\"token punctuation\">.<\/span>setex<span class=\"token punctuation\">(<\/span><span class=\"token string\">'products:list'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">300<\/span><span class=\"token punctuation\">,<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>products<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> products\r\n\r\n<span class=\"token comment\"># \u7f13\u5b58\u5931\u6548\u7b56\u7565<\/span>\r\n<span class=\"token variable\">@router.post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/products\"<\/span><span class=\"token punctuation\">)<\/span>\r\nasync def create_product<span class=\"token punctuation\">(<\/span>product: ProductCreate<span class=\"token punctuation\">)<\/span>:\r\n    new_product <span class=\"token operator\">=<\/span> await db<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">create<\/span><span class=\"token punctuation\">(<\/span>product<span class=\"token punctuation\">)<\/span>\r\n    redis<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">delete<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'products:list'<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u6e05\u9664\u7f13\u5b58<\/span>\r\n    <span class=\"token keyword\">return<\/span> new_product<\/code><\/pre>\n<ul id=\"code_id_55\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6548\u679c:<\/p>\n<ul data-id=\"u738a58b-X1YYQyZm\">\n<li data-id=\"ld70c578-D2N10FWW\">\u7f13\u5b58\u547d\u4e2d\u738790%\u65f6,\u5e73\u5747\u54cd\u5e94\u4ece20ms\u964d\u81f32ms(\u63d0\u534710\u500d)<\/li>\n<li data-id=\"ld70c578-21YdU8jP\">\u6570\u636e\u5e93\u8d1f\u8f7d\u964d\u4f4e90%<\/li>\n<\/ul>\n<h3>\u6027\u80fd\u4f18\u5316\u6c47\u603b<\/h3>\n<table class=\"data-table\" data-transient-attributes=\"class\" data-width=\"1019.16px\">\n<colgroup data-id=\"c7104f7d-8jYFMiKB\">\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-Er6jS948\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-ucREMD1T\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-NpdOX1pk\" \/>\n<col span=\"1\" width=\"254\" data-id=\"cac612c1-HIVrKPLq\" \/><\/colgroup>\n<tbody data-id=\"t6d5e859-WGaU9bAL\">\n<tr data-id=\"t31e458f-oI66ABnD\">\n<td data-id=\"t8c0e6ab-ULEbukgJ\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5316\u9879<\/td>\n<td data-id=\"t8c0e6ab-tgQ6VIfP\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5316\u524d<\/td>\n<td data-id=\"t8c0e6ab-GQQrb4Ej\" data-transient-attributes=\"table-cell-selection\">\u4f18\u5316\u540e<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-IacD5oj7\" data-transient-attributes=\"table-cell-selection\">\u63d0\u5347\u500d\u6570<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-X4cb5DKr\">\n<td data-id=\"t8c0e6ab-gyDCNSpP\" data-transient-attributes=\"table-cell-selection\">API\u54cd\u5e94\u65f6\u95f4(P99)<\/td>\n<td data-id=\"t8c0e6ab-dHaxYE15\" data-transient-attributes=\"table-cell-selection\">3.2\u79d2<\/td>\n<td data-id=\"t8c0e6ab-uxDskUsw\" data-transient-attributes=\"table-cell-selection\">280ms<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-nQ8VU0D3\" data-transient-attributes=\"table-cell-selection\">11.4x<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-1NC2GAL4\">\n<td data-id=\"t0bc4524-3Ln5FCZv\" data-transient-attributes=\"table-cell-selection\">\u6570\u636e\u5e93\u67e5\u8be2<\/td>\n<td data-id=\"t0bc4524-FxMe4rSo\" data-transient-attributes=\"table-cell-selection\">1.2\u79d2<\/td>\n<td data-id=\"t0bc4524-XDrHIhkc\" data-transient-attributes=\"table-cell-selection\">150ms<\/td>\n<td class=\"table-last-row\" data-id=\"t78f5a9e-kMGEg4AJ\" data-transient-attributes=\"table-cell-selection\">8x<\/td>\n<\/tr>\n<tr data-id=\"t31e458f-NkrPEMuq\">\n<td data-id=\"t8c0e6ab-S3hPGkNo\" data-transient-attributes=\"table-cell-selection\">\u5e76\u53d1\u5904\u7406\u80fd\u529b<\/td>\n<td data-id=\"t8c0e6ab-kCnSW70I\" data-transient-attributes=\"table-cell-selection\">50 req\/s<\/td>\n<td data-id=\"t8c0e6ab-rwMKRp2f\" data-transient-attributes=\"table-cell-selection\">1000 req\/s<\/td>\n<td class=\"table-last-row\" data-id=\"t1b895c3-uOg9YfOw\" data-transient-attributes=\"table-cell-selection\">20x<\/td>\n<\/tr>\n<tr data-id=\"td7f8b0e-rSogqLZk\">\n<td class=\"table-last-column\" data-id=\"t57b3209-Sl61ng91\" data-transient-attributes=\"table-cell-selection\">\u5185\u5b58\u4f7f\u7528<\/td>\n<td class=\"table-last-column\" data-id=\"t57b3209-mSTZlC4N\" data-transient-attributes=\"table-cell-selection\">2GB<\/td>\n<td class=\"table-last-column\" data-id=\"t57b3209-mQqrokOq\" data-transient-attributes=\"table-cell-selection\">800MB<\/td>\n<td class=\"table-last-column table-last-row\" data-id=\"te61fc79-C5AiNV0C\" data-transient-attributes=\"table-cell-selection\">2.5x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\u6210\u672c\u8282\u7701<\/h3>\n<ul data-id=\"u738a58b-Ov2Oe6jK\">\n<li data-id=\"ld70c578-r4agubSi\">\u670d\u52a1\u5668\u6570\u91cf: 10\u53f0 \u2192 3\u53f0<\/li>\n<li data-id=\"ld70c578-9xtFzzu3\">\u6708\u6210\u672c:\u00a01500<\/li>\n<li data-id=\"ld70c578-aMIOIAIn\">\u5e74\u8282\u7701:\u00a0$42,000<\/li>\n<\/ul>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_56\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>Reviewer <span class=\"token number\">4<\/span>: test<span class=\"token operator\">-<\/span>automator\u7684\u8f93\u51fa<span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span>markdown\r\n## \u6d4b\u8bd5\u8986\u76d6\u5206\u6790\r\n\r\n### \ud83d\udcca \u5f53\u524d\u8986\u76d6\u7387\r\n- \u6574\u4f53\u8986\u76d6\u7387: 42%\r\n- \u6838\u5fc3\u4e1a\u52a1\u903b\u8f91: 55%\r\n- API\u7aef\u70b9: 30%\r\n- \u6570\u636e\u6a21\u578b: 65%\r\n\r\n### \ud83d\udd34 \u9ad8\u98ce\u9669\u672a\u6d4b\u8bd5\u4ee3\u7801\r\n1. **\u652f\u4ed8\u5904\u7406** (src\/services\/payment.py) - **0%\u8986\u76d6**\r\n   - \u98ce\u9669\u7b49\u7ea7: \u6781\u9ad8(\u6d89\u53ca\u91d1\u94b1)\r\n   - \u5efa\u8bae: \u4f18\u5148\u6dfb\u52a0\u6d4b\u8bd5,\u76ee\u6807100%\u8986\u76d6\r\n\r\n2. **\u6743\u9650\u9a8c\u8bc1** (src\/core\/permissions.py) - **15%\u8986\u76d6**\r\n   - \u98ce\u9669\u7b49\u7ea7: \u9ad8(\u5b89\u5168\u5173\u952e)\r\n   - \u7f3a\u5931\u6d4b\u8bd5: \u89d2\u8272\u63d0\u5347\u3001\u8de8\u79df\u6237\u8bbf\u95ee\r\n\r\n3. **\u6570\u636e\u8fc1\u79fb\u811a\u672c** (alembic\/versions\/) - **0%\u8986\u76d6**\r\n   - \u98ce\u9669\u7b49\u7ea7: \u9ad8(\u53ef\u80fd\u5bfc\u81f4\u6570\u636e\u635f\u574f)\r\n   - \u5efa\u8bae: \u6dfb\u52a0\u8fc1\u79fb\u6d4b\u8bd5,\u9a8c\u8bc1\u524d\u540e\u6570\u636e\u4e00\u81f4\u6027\r\n\r\n### \ud83d\udcdd \u81ea\u52a8\u751f\u6210\u6d4b\u8bd5(\u793a\u4f8b)\r\n``<span class=\"token punctuation\">`<\/span><\/span>python\r\n<span class=\"token comment\"># tests\/test_payment_service.py (\u81ea\u52a8\u751f\u6210)<\/span>\r\n<span class=\"token keyword\">import<\/span> pytest\r\n<span class=\"token keyword\">from<\/span> unittest<span class=\"token punctuation\">.<\/span>mock <span class=\"token keyword\">import<\/span> Mock<span class=\"token punctuation\">,<\/span> patch\r\n<span class=\"token keyword\">from<\/span> <span class=\"token keyword\">decimal<\/span> <span class=\"token keyword\">import<\/span> <span class=\"token keyword\">Decimal<\/span>\r\n\r\nclass TestPaymentService:\r\n    def test_charge_success<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> payment_service<span class=\"token punctuation\">,<\/span> mock_gateway<span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u6210\u529f\u6263\u6b3e\"\"\"<\/span>\r\n        mock_gateway<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">.<\/span>return_value <span class=\"token operator\">=<\/span> {<span class=\"token string\">\"status\"<\/span>: <span class=\"token string\">\"success\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"transaction_id\"<\/span>: <span class=\"token string\">\"tx_123\"<\/span>}\r\n        \r\n        result <span class=\"token operator\">=<\/span> payment_service<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">(<\/span>\r\n            amount<span class=\"token operator\">=<\/span><span class=\"token keyword\">Decimal<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"99.99\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n            currency<span class=\"token operator\">=<\/span><span class=\"token string\">\"USD\"<\/span><span class=\"token punctuation\">,<\/span>\r\n            customer_id<span class=\"token operator\">=<\/span><span class=\"token number\">1<\/span>\r\n        <span class=\"token punctuation\">)<\/span>\r\n        \r\n        assert result<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"status\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"success\"<\/span>\r\n        assert result<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"transaction_id\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"tx_123\"<\/span>\r\n        mock_gateway<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">.<\/span>assert_called_once_with<span class=\"token punctuation\">(<\/span>\r\n            amount<span class=\"token operator\">=<\/span><span class=\"token keyword\">Decimal<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"99.99\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n            currency<span class=\"token operator\">=<\/span><span class=\"token string\">\"USD\"<\/span><span class=\"token punctuation\">,<\/span>\r\n            customer_id<span class=\"token operator\">=<\/span><span class=\"token number\">1<\/span>\r\n        <span class=\"token punctuation\">)<\/span>\r\n    \r\n    def test_charge_insufficient_funds<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> payment_service<span class=\"token punctuation\">,<\/span> mock_gateway<span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u4f59\u989d\u4e0d\u8db3\"\"\"<\/span>\r\n        mock_gateway<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">.<\/span>side_effect <span class=\"token operator\">=<\/span> InsufficientFundsError<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n        \r\n        <span class=\"token keyword\">with<\/span> pytest<span class=\"token punctuation\">.<\/span>raises<span class=\"token punctuation\">(<\/span>PaymentFailedError<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> exc_info:\r\n            payment_service<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">Decimal<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"99.99\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"USD\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n        \r\n        assert <span class=\"token string\">\"insufficient funds\"<\/span> <span class=\"token operator\">in<\/span> str<span class=\"token punctuation\">(<\/span>exc_info<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">value<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    \r\n    def test_charge_network_timeout<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> payment_service<span class=\"token punctuation\">,<\/span> mock_gateway<span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token string\">\"\"\"\u6d4b\u8bd5\u7f51\u7edc\u8d85\u65f6\u91cd\u8bd5\"\"\"<\/span>\r\n        mock_gateway<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">.<\/span>side_effect <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n            TimeoutError<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u7b2c1\u6b21\u5931\u8d25<\/span>\r\n            TimeoutError<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u7b2c2\u6b21\u5931\u8d25<\/span>\r\n            {<span class=\"token string\">\"status\"<\/span>: <span class=\"token string\">\"success\"<\/span>}  <span class=\"token comment\"># \u7b2c3\u6b21\u6210\u529f<\/span>\r\n        <span class=\"token punctuation\">]<\/span>\r\n        \r\n        result <span class=\"token operator\">=<\/span> payment_service<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">Decimal<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"99.99\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"USD\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n        \r\n        assert result<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"status\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"success\"<\/span>\r\n        assert mock_gateway<span class=\"token punctuation\">.<\/span>charge<span class=\"token punctuation\">.<\/span>call_count <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">3<\/span>  <span class=\"token comment\"># \u9a8c\u8bc1\u91cd\u8bd5\u4e863\u6b21<\/span><\/code><\/pre>\n<ul id=\"code_id_56\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<li>54.<\/li>\n<li>55.<\/li>\n<li>56.<\/li>\n<li>57.<\/li>\n<li>58.<\/li>\n<li>59.<\/li>\n<li>60.<\/li>\n<li>61.<\/li>\n<li>62.<\/li>\n<li>63.<\/li>\n<li>64.<\/li>\n<li>65.<\/li>\n<li>66.<\/li>\n<li>67.<\/li>\n<li>68.<\/li>\n<li>69.<\/li>\n<li>70.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>\u6d4b\u8bd5\u6539\u8fdb\u8ba1\u5212<\/h3>\n<ul data-id=\"u738a58b-BbfkmdAs\">\n<li data-id=\"ld70c578-Wgeillvh\">[ ] \u6dfb\u52a0\u652f\u4ed8\u670d\u52a1\u6d4b\u8bd5(100%\u8986\u76d6,2\u5c0f\u65f6)<\/li>\n<li data-id=\"ld70c578-4UbemMJt\">[ ] \u6dfb\u52a0\u6743\u9650\u6d4b\u8bd5(90%\u8986\u76d6,3\u5c0f\u65f6)<\/li>\n<li data-id=\"ld70c578-xLQIPu1P\">[ ] \u6dfb\u52a0\u8fc1\u79fb\u6d4b\u8bd5(\u5173\u952e\u8def\u5f84,1\u5c0f\u65f6)<\/li>\n<li data-id=\"ld70c578-KQu3cAQI\">[ ] \u96c6\u6210\u6d4b\u8bd5\u589e\u5f3a(API\u7aef\u70b9\u5168\u8986\u76d6,4\u5c0f\u65f6)<\/li>\n<li data-id=\"ld70c578-zoFeOzzm\">[ ] E2E\u6d4b\u8bd5(\u5173\u952e\u4e1a\u52a1\u6d41\u7a0b,4\u5c0f\u65f6)<\/li>\n<\/ul>\n<p>\u9884\u8ba1\u603b\u65f6\u95f4: 14\u5c0f\u65f6\u9884\u671f\u8986\u76d6\u7387: 42% \u2192 85%<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_57\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">#### **\u7edf\u4e00\u6539\u8fdb\u65b9\u6848**<\/span>\r\n\r\n\u6240\u6709\u5ba1\u67e5\u62a5\u544a\u6c47\u603b\u540e<span class=\"token punctuation\">,<\/span>\u7cfb\u7edf\u81ea\u52a8\u751f\u6210\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u4efb\u52a1\u6e05\u5355:\r\n<span class=\"token identifier\"><span class=\"token punctuation\">`<\/span><span class=\"token punctuation\">`<\/span><\/span><span class=\"token punctuation\">`<\/span>markdown\r\n<span class=\"token comment\">## \u6539\u8fdb\u4efb\u52a1\u4f18\u5148\u7ea7<\/span>\r\n\r\n<span class=\"token comment\">### P0(\u7d27\u6025,1\u5929\u5185\u4fee\u590d)<\/span>\r\n<span class=\"token number\">1.<\/span> \ud83d\udd34 \u4fee\u590d<span class=\"token keyword\">SQL<\/span>\u6ce8\u5165\u6f0f\u6d1e<span class=\"token punctuation\">(<\/span>security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">2.<\/span> \ud83d\udd34 \u4fee\u590d\u5bc6\u7801\u6cc4\u9732\u95ee\u9898<span class=\"token punctuation\">(<\/span>security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">3.<\/span> \ud83d\udd34 \u6dfb\u52a0\u652f\u4ed8\u670d\u52a1\u6d4b\u8bd5<span class=\"token punctuation\">(<\/span>test<span class=\"token operator\">-<\/span>automator<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">### P1(\u91cd\u8981,1\u5468\u5185\u4fee\u590d)<\/span>\r\n<span class=\"token number\">4.<\/span> \ud83d\udfe1 \u4fee\u590dN<span class=\"token operator\">+<\/span><span class=\"token number\">1<\/span>\u67e5\u8be2<span class=\"token punctuation\">(<\/span>performance<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">5.<\/span> \ud83d\udfe1 \u5b9e\u65bd\u4f9d\u8d56\u6ce8\u5165<span class=\"token punctuation\">(<\/span>code<span class=\"token operator\">-<\/span>reviewer<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">6.<\/span> \ud83d\udfe1 \u6dfb\u52a0\u901f\u7387\u9650\u5236<span class=\"token punctuation\">(<\/span>security<span class=\"token operator\">-<\/span>auditor<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">7.<\/span> \ud83d\udfe1 \u4f18\u5316\u540c\u6b65I<span class=\"token operator\">\/<\/span>O<span class=\"token punctuation\">(<\/span>performance<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">### P2(\u4f18\u5316,1\u6708\u5185\u5b8c\u6210)<\/span>\r\n<span class=\"token number\">8.<\/span> \ud83d\udfe2 \u91cd\u6784\u4e0a\u5e1d\u7c7b<span class=\"token punctuation\">(<\/span>code<span class=\"token operator\">-<\/span>reviewer<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">9.<\/span> \ud83d\udfe2 \u6dfb\u52a0\u7c7b\u578b\u63d0\u793a<span class=\"token punctuation\">(<\/span>code<span class=\"token operator\">-<\/span>reviewer<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">10.<\/span> \ud83d\udfe2 \u5b9e\u65bd\u591a\u7ea7\u7f13\u5b58<span class=\"token punctuation\">(<\/span>performance<span class=\"token operator\">-<\/span>engineer<span class=\"token punctuation\">)<\/span>\r\n\r\n\u603b\u5de5\u4f5c\u91cf\u4f30\u7b97: <span class=\"token number\">5<\/span>\u4eba\u5929\r\n\u9884\u671f\u6548\u679c:\r\n<span class=\"token operator\">-<\/span> \u5b89\u5168\u6027: \u6d88\u9664\u6240\u6709\u9ad8\u5371\u6f0f\u6d1e\r\n<span class=\"token operator\">-<\/span> \u6027\u80fd: \u63d0\u5347<span class=\"token number\">3<\/span><span class=\"token operator\">-<\/span><span class=\"token number\">5<\/span>\u500d\r\n<span class=\"token operator\">-<\/span> \u6d4b\u8bd5\u8986\u76d6: <span class=\"token number\">42<\/span><span class=\"token operator\">%<\/span> \u2192 <span class=\"token number\">85<\/span><span class=\"token operator\">%<\/span>\r\n<span class=\"token operator\">-<\/span> \u53ef\u7ef4\u62a4\u6027: \u964d\u4f4e<span class=\"token number\">40<\/span><span class=\"token operator\">%<\/span>\u7ef4\u62a4\u6210\u672c<\/code><\/pre>\n<ul id=\"code_id_57\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u901a\u8fc7\u591a\u667a\u80fd\u4f53\u5e76\u884c\u5ba1\u67e5,\u539f\u672c\u9700\u89812-3\u5468\u7684\u4eba\u5de5\u5ba1\u67e5\u5de5\u4f5c,\u7f29\u77ed\u52302\u5c0f\u65f6,\u5e76\u4e14\u53d1\u73b0\u4e86\u4eba\u5de5\u5ba1\u67e5\u5bb9\u6613\u9057\u6f0f\u7684\u6df1\u5c42\u95ee\u9898\u3002<\/p>\n<h2>\u7b2c\u56db\u90e8\u5206\uff1a\u6280\u672f\u54f2\u5b66\u4e0e\u672a\u6765\u5c55\u671b<\/h2>\n<h3>4.1 \u8bbe\u8ba1\u54f2\u5b66:Conway\u5b9a\u5f8b\u5728AI\u65f6\u4ee3\u7684\u6620\u5c04<\/h3>\n<h4>\u4f20\u7edfConway\u5b9a\u5f8b<\/h4>\n<blockquote><p>&#8220;Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.&#8221; \u2014\u2014 Melvin Conway, 1967<\/p><\/blockquote>\n<p>\u7b80\u5355\u8bf4:\u4f60\u7684\u8f6f\u4ef6\u67b6\u6784\u4f1a\u53cd\u6620\u4f60\u7684\u56e2\u961f\u7ed3\u6784\u3002\u5982\u679c\u6709\u524d\u7aef\u56e2\u961f\u3001\u540e\u7aef\u56e2\u961f\u3001DBA\u56e2\u961f,\u90a3\u8f6f\u4ef6\u5c31\u4f1a\u5206\u4e3a\u524d\u7aef\u3001\u540e\u7aef\u3001\u6570\u636e\u5e93\u4e09\u5c42\u3002<\/p>\n<h4>AI\u65f6\u4ee3\u7684\u65b0Conway\u5b9a\u5f8b<\/h4>\n<p>Claude Code Agents\u7684\u8bbe\u8ba1\u5b9e\u9645\u4e0a\u662f\u9006Conway\u5b9a\u5f8b\u7684\u5b9e\u8df5:<\/p>\n<ul data-id=\"u738a58b-Fth1ki0F\">\n<li data-id=\"ld70c578-0hx4Ican\">\u4f20\u7edf\u65b9\u5f0f: \u5148\u6709\u7ec4\u7ec7\u7ed3\u6784 \u2192 \u8bbe\u8ba1\u8f6f\u4ef6\u67b6\u6784<\/li>\n<li data-id=\"ld70c578-725LTVOm\">AI\u667a\u80fd\u4f53\u65b9\u5f0f: \u5148\u8bbe\u8ba1\u7406\u60f3\u7684\u8f6f\u4ef6\u67b6\u6784 \u2192 \u914d\u7f6e\u667a\u80fd\u4f53\u89d2\u8272<\/li>\n<\/ul>\n<p>\u4e3e\u4f8b\u8bf4\u660e:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_58\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u4f20\u7edf\u56e2\u961f\u7ed3\u6784:\r\n\u251c\u2500\u2500 \u524d\u7aef\u56e2\u961f<span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span>\u4eba<span class=\"token punctuation\">)<\/span>\r\n\u251c\u2500\u2500 \u540e\u7aef\u56e2\u961f<span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span>\u4eba<span class=\"token punctuation\">)<\/span>\r\n\u251c\u2500\u2500 \u6570\u636e\u56e2\u961f<span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span>\u4eba<span class=\"token punctuation\">)<\/span>\r\n\u251c\u2500\u2500 DevOps\u56e2\u961f<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span>\u4eba<span class=\"token punctuation\">)<\/span>\r\n\u2514\u2500\u2500 \u6d4b\u8bd5\u56e2\u961f<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span>\u4eba<span class=\"token punctuation\">)<\/span>\r\n\r\n\u95ee\u9898:\r\n<span class=\"token operator\">-<\/span> \u524d\u7aef\u56e2\u961f\u60f3\u7528GraphQL<span class=\"token punctuation\">,<\/span>\u540e\u7aef\u56e2\u961f\u575a\u6301REST\r\n<span class=\"token operator\">-<\/span> \u6570\u636e\u56e2\u961f\u8bbe\u8ba1\u7684<span class=\"token keyword\">schema<\/span>\u540e\u7aef\u56e2\u961f\u4e0d\u6ee1\u610f\r\n<span class=\"token operator\">-<\/span> DevOps\u7b49\u5230\u6700\u540e\u624d\u4ecb\u5165<span class=\"token punctuation\">,<\/span>\u90e8\u7f72\u65b9\u6848\u4ed3\u4fc3\r\n<span class=\"token operator\">-<\/span> \u6d4b\u8bd5\u56e2\u961f\u4eba\u624b\u4e0d\u8db3<span class=\"token punctuation\">,<\/span>\u8986\u76d6\u7387\u4f4e\r\n\r\nClaude Code Agents\u65b9\u5f0f:\r\n\u251c\u2500\u2500 \u5148\u5b9a\u4e49\u7406\u60f3\u67b6\u6784:API<span class=\"token operator\">-<\/span><span class=\"token keyword\">first<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span><span class=\"token keyword\">first<\/span><span class=\"token punctuation\">,<\/span> security<span class=\"token operator\">-<\/span><span class=\"token keyword\">by<\/span><span class=\"token operator\">-<\/span>design\r\n\u251c\u2500\u2500 \u914d\u7f6e\u667a\u80fd\u4f53:<span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect \u2192 backend<span class=\"token operator\">-<\/span>architect \u2192 frontend<span class=\"token operator\">-<\/span>developer\r\n\u251c\u2500\u2500 \u667a\u80fd\u4f53\u4e25\u683c\u9075\u5faa\u67b6\u6784\u539f\u5219<span class=\"token punctuation\">,<\/span>\u65e0<span class=\"token string\">\"\u653f\u6cbb\u6597\u4e89\"<\/span>\r\n\u2514\u2500\u2500 \u6240\u6709\u9636\u6bb5\u5e76\u884c\u5de5\u4f5c<span class=\"token punctuation\">(<\/span>\u6570\u636e\u5e93<span class=\"token operator\">\/<\/span>\u540e\u7aef<span class=\"token operator\">\/<\/span>\u524d\u7aef<span class=\"token operator\">\/<\/span>\u6d4b\u8bd5<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\u65e0\u7b49\u5f85\r\n\r\n\u4f18\u52bf:\r\n\u2705 \u67b6\u6784\u4e00\u81f4\u6027:\u6240\u6709\u51b3\u7b56\u57fa\u4e8e\u6700\u4f73\u5b9e\u8df5<span class=\"token punctuation\">,<\/span>\u975e\u56e2\u961f\u653f\u6cbb\r\n\u2705 \u5e76\u884c\u6548\u7387:\u65e0\u9700\u7b49\u5f85<span class=\"token string\">\"\u4e0a\u6e38\u56e2\u961f\"<\/span>\u5b8c\u6210\r\n\u2705 \u8d28\u91cf\u4fdd\u8bc1:\u5b89\u5168\u3001\u6d4b\u8bd5\u3001\u6027\u80fd\u4ece\u4e00\u5f00\u59cb\u5c31\u5185\u7f6e<\/code><\/pre>\n<ul id=\"code_id_58\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u804c\u8d23\u5355\u4e00\u539f\u5219\u7684\u6781\u81f4\u5b9e\u8df5<\/h4>\n<p>\u770b\u770b<code>backend-architect<\/code>\u7684\u63d0\u793a\u8bcd:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_59\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">## Behavioral Traits\r\n- Defers database schema design to database-architect\r\n- Defers infrastructure design to cloud-architect  \r\n- Defers security audit to security-auditor\r\n- Defers performance optimization to performance-engineer<\/code><\/pre>\n<ul id=\"code_id_59\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8fd9\u5c31\u662f**SOLID\u539f\u5219\u4e2d\u7684\u5355\u4e00\u804c\u8d23\u539f\u5219(SRP)**\u7684\u5b8c\u7f8e\u4f53\u73b0:<\/p>\n<ul data-id=\"u738a58b-oIX32jNq\">\n<li data-id=\"ld70c578-USVx0C8i\">\u6bcf\u4e2a\u667a\u80fd\u4f53\u53ea\u505a\u4e00\u4ef6\u4e8b<\/li>\n<li data-id=\"ld70c578-aqJmcGbf\">\u505a\u597d\u8fd9\u4e00\u4ef6\u4e8b<\/li>\n<li data-id=\"ld70c578-TKNVaYot\">\u4e0d\u8d8a\u754c\u505a\u5176\u4ed6\u4e8b<\/li>\n<\/ul>\n<p>\u4f20\u7edf\u5f00\u53d1\u4e2d,\u8fd9\u4e2a\u539f\u5219\u5f88\u96be\u6267\u884c,\u56e0\u4e3a:<\/p>\n<ul data-id=\"u738a58b-asBioxqu\">\n<li data-id=\"ld70c578-5Qt38pFg\">\u4eba\u6709ego(&#8220;\u6211\u4e5f\u4f1a\u8bbe\u8ba1\u6570\u636e\u5e93,\u4e3a\u4ec0\u4e48\u8981\u542cDBA\u7684?&#8221;)<\/li>\n<li data-id=\"ld70c578-h7mgkxiP\">\u4eba\u6709\u65f6\u95f4\u538b\u529b(&#8220;\u627eDBA\u592a\u6162\u4e86,\u6211\u81ea\u5df1\u5feb\u901f\u8bbe\u8ba1\u4e00\u4e2a&#8221;)<\/li>\n<li data-id=\"ld70c578-pjFOPhPA\">\u4eba\u6709\u77e5\u8bc6\u76f2\u533a(&#8220;\u6211\u4e0d\u77e5\u9053\u8fd9\u4e2a\u5e94\u8be5\u627e\u8c01&#8221;)<\/li>\n<\/ul>\n<p>\u667a\u80fd\u4f53\u6ca1\u6709\u8fd9\u4e9b\u95ee\u9898:<\/p>\n<ul data-id=\"u738a58b-TDgec4vl\">\n<li data-id=\"ld70c578-BnZbECm4\">\u6ca1\u6709ego,\u4e25\u683c\u9075\u5faa\u5b9a\u4e49<\/li>\n<li data-id=\"ld70c578-WkDWD91p\">\u6ca1\u6709\u65f6\u95f4\u538b\u529b(\u8c03\u7528\u5373\u65f6)<\/li>\n<li data-id=\"ld70c578-RTwmdwKU\">\u6ca1\u6709\u77e5\u8bc6\u76f2\u533a(\u63d0\u793a\u8bcd\u4e2d\u660e\u786e\u5b9a\u4e49\u8fb9\u754c)<\/li>\n<\/ul>\n<h3>4.2 \u591a\u667a\u80fd\u4f53\u534f\u4f5c\u7684\u4e09\u5927\u6a21\u5f0f<\/h3>\n<h4>\u6a21\u5f0f1:\u6d41\u6c34\u7ebf\u6a21\u5f0f(Pipeline Pattern)<\/h4>\n<p>\u7279\u70b9: \u4e32\u884c\u5904\u7406,\u6bcf\u4e2a\u9636\u6bb5\u7684\u8f93\u51fa\u662f\u4e0b\u4e00\u9636\u6bb5\u7684\u8f93\u5165<\/p>\n<p>\u5e94\u7528\u573a\u666f: \u4f9d\u8d56\u5173\u7cfb\u5f3a\u7684\u4efb\u52a1<\/p>\n<p>\u793a\u4f8b: \u6570\u636e\u5e93 \u2192 \u540e\u7aef \u2192 \u524d\u7aef<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_60\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">database-architect \r\n    \u2193 (\u8f93\u51fa: schema\u8bbe\u8ba1)\r\nbackend-architect\r\n    \u2193 (\u8f93\u51fa: API\u5951\u7ea6)\r\nfrontend-developer\r\n    \u2193 (\u8f93\u51fa: UI\u7ec4\u4ef6)<\/code><\/pre>\n<ul id=\"code_id_60\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4f18\u70b9:<\/p>\n<ul data-id=\"u738a58b-mVZUofai\">\n<li data-id=\"ld70c578-ttAXPV3X\">\u903b\u8f91\u6e05\u6670,\u6613\u4e8e\u7406\u89e3<\/li>\n<li data-id=\"ld70c578-dzGuWs23\">\u6bcf\u4e2a\u9636\u6bb5\u7684\u804c\u8d23\u660e\u786e<\/li>\n<li data-id=\"ld70c578-zxLnLzZK\">\u4fbf\u4e8e\u8ffd\u6eaf\u95ee\u9898(\u54ea\u4e2a\u9636\u6bb5\u51fa\u9519\u4e00\u76ee\u4e86\u7136)<\/li>\n<\/ul>\n<p>\u7f3a\u70b9:<\/p>\n<ul data-id=\"u738a58b-e3WZC0vO\">\n<li data-id=\"ld70c578-VnUUzLUg\">\u65e0\u6cd5\u5e76\u884c,\u603b\u65f6\u95f4\u662f\u5404\u9636\u6bb5\u4e4b\u548c<\/li>\n<li data-id=\"ld70c578-7Sh439GL\">\u524d\u671f\u9636\u6bb5\u51fa\u9519\u4f1a\u5f71\u54cd\u6240\u6709\u540e\u7eed\u9636\u6bb5<\/li>\n<\/ul>\n<p>\u4f18\u5316: \u5f15\u5165**\u68c0\u67e5\u70b9(Checkpoint)**\u673a\u5236<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_61\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u4f2a\u4ee3\u7801<\/span>\r\npipeline <span class=\"token operator\">=<\/span> Pipeline<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span>\r\n    Stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"database-architect\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">checkpoint<\/span><span class=\"token operator\">=<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u68c0\u67e5\u70b91<\/span>\r\n    Stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"backend-architect\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">checkpoint<\/span><span class=\"token operator\">=<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token comment\"># \u68c0\u67e5\u70b92<\/span>\r\n    Stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"frontend-developer\"<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nresult <span class=\"token operator\">=<\/span> pipeline<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">if<\/span> result<span class=\"token punctuation\">.<\/span>failed_at_stage <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"backend-architect\"<\/span>:\r\n    <span class=\"token comment\"># \u53ef\u4ee5\u4ece\u68c0\u67e5\u70b91\u6062\u590d,\u91cd\u65b0\u6267\u884cbackend-architect<\/span>\r\n    pipeline<span class=\"token punctuation\">.<\/span>resume_from_checkpoint<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_61\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u6a21\u5f0f2:\u5e76\u884c\u6c47\u805a\u6a21\u5f0f(Fan-out\/Fan-in Pattern)<\/h4>\n<p>\u7279\u70b9: \u5c06\u4efb\u52a1\u62c6\u5206\u6210\u591a\u4e2a\u72ec\u7acb\u5b50\u4efb\u52a1\u5e76\u884c\u6267\u884c,\u6700\u540e\u6c47\u603b\u7ed3\u679c<\/p>\n<p>\u5e94\u7528\u573a\u666f: \u5b50\u4efb\u52a1\u76f8\u4e92\u72ec\u7acb<\/p>\n<p>\u793a\u4f8b: \u4ee3\u7801\u8d28\u91cf\u5ba1\u67e5<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_62\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token punctuation\">[<\/span>\u4ee3\u7801\u5e93<span class=\"token punctuation\">]<\/span>\r\n            \u2193 <span class=\"token punctuation\">(<\/span>fan<span class=\"token operator\">-<\/span><span class=\"token keyword\">out<\/span><span class=\"token punctuation\">)<\/span>\r\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n    \u2193       \u2193       \u2193       \u2193\r\ncode<span class=\"token operator\">-<\/span>    security<span class=\"token operator\">-<\/span> performance<span class=\"token operator\">-<\/span> test<span class=\"token operator\">-<\/span>\r\nreviewer auditor  engineer   automator\r\n    \u2193       \u2193       \u2193       \u2193\r\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n            \u2193 <span class=\"token punctuation\">(<\/span>fan<span class=\"token operator\">-<\/span><span class=\"token operator\">in<\/span><span class=\"token punctuation\">)<\/span>\r\n      <span class=\"token punctuation\">[<\/span>\u6c47\u603b\u62a5\u544a<span class=\"token punctuation\">]<\/span><\/code><\/pre>\n<ul id=\"code_id_62\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4f18\u70b9:<\/p>\n<ul data-id=\"u738a58b-VP7cGPba\">\n<li data-id=\"ld70c578-oetLZLb5\">\u5e76\u884c\u6267\u884c,\u901f\u5ea6\u5feb(\u7406\u60f3\u60c5\u51b5\u4e0b\u65f6\u95f4=\u6700\u6162\u5b50\u4efb\u52a1)<\/li>\n<li data-id=\"ld70c578-Vshj2akv\">\u5404\u5ba1\u67e5\u89d2\u5ea6\u4e92\u8865,\u53d1\u73b0\u7684\u95ee\u9898\u66f4\u5168\u9762<\/li>\n<li data-id=\"ld70c578-VUsRWWEd\">\u5b50\u4efb\u52a1\u5931\u8d25\u4e0d\u5f71\u54cd\u5176\u4ed6\u5b50\u4efb\u52a1<\/li>\n<\/ul>\n<p>\u5b9e\u73b0\u7ec6\u8282:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_63\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token keyword\">import<\/span> asyncio\r\n\r\nasync def parallel_review<span class=\"token punctuation\">(<\/span>codebase<span class=\"token punctuation\">)<\/span>:\r\n    <span class=\"token string\">\"\"\"\u5e76\u884c\u6267\u884c4\u4e2a\u5ba1\u67e5\u4efb\u52a1\"\"\"<\/span>\r\n    tasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n        code_reviewer<span class=\"token punctuation\">(<\/span>codebase<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>      <span class=\"token comment\"># \u9884\u8ba1\u65f6\u95f4:30\u5206\u949f<\/span>\r\n        security_auditor<span class=\"token punctuation\">(<\/span>codebase<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token comment\"># \u9884\u8ba1\u65f6\u95f4:20\u5206\u949f<\/span>\r\n        performance_engineer<span class=\"token punctuation\">(<\/span>codebase<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u9884\u8ba1\u65f6\u95f4:25\u5206\u949f<\/span>\r\n        test_automator<span class=\"token punctuation\">(<\/span>codebase<span class=\"token punctuation\">)<\/span>      <span class=\"token comment\"># \u9884\u8ba1\u65f6\u95f4:15\u5206\u949f<\/span>\r\n    <span class=\"token punctuation\">]<\/span>\r\n    \r\n    <span class=\"token comment\"># \u5e76\u884c\u6267\u884c,\u603b\u65f6\u95f4=\u6700\u6162\u7684\u4efb\u52a1(30\u5206\u949f)<\/span>\r\n    results <span class=\"token operator\">=<\/span> await asyncio<span class=\"token punctuation\">.<\/span>gather<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>tasks<span class=\"token punctuation\">,<\/span> return_exceptions<span class=\"token operator\">=<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token comment\"># \u6c47\u603b\u7ed3\u679c<\/span>\r\n    report <span class=\"token operator\">=<\/span> {\r\n        <span class=\"token string\">\"code_quality\"<\/span>: results<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token operator\">not<\/span> isinstance<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> None<span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"security\"<\/span>: results<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token operator\">not<\/span> isinstance<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> None<span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"performance\"<\/span>: results<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token operator\">not<\/span> isinstance<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> None<span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"testing\"<\/span>: results<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token operator\">not<\/span> isinstance<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> None<span class=\"token punctuation\">,<\/span>\r\n    }\r\n    \r\n    <span class=\"token comment\"># \u5373\u4f7f\u90e8\u5206\u4efb\u52a1\u5931\u8d25,\u4e5f\u8fd4\u56de\u5176\u4ed6\u4efb\u52a1\u7684\u7ed3\u679c<\/span>\r\n    <span class=\"token keyword\">return<\/span> report<\/code><\/pre>\n<ul id=\"code_id_63\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>vs \u4e32\u884c\u6267\u884c:<\/p>\n<ul data-id=\"u738a58b-TOb8h1jl\">\n<li data-id=\"ld70c578-iIBmUyg9\">\u4e32\u884c: 30 + 20 + 25 + 15 =\u00a090\u5206\u949f<\/li>\n<li data-id=\"ld70c578-Heb6ShU3\">\u5e76\u884c: max(30, 20, 25, 15) =\u00a030\u5206\u949f<\/li>\n<li data-id=\"ld70c578-9eivYk1e\">\u63d0\u901f:\u00a03\u500d<\/li>\n<\/ul>\n<h4>\u6a21\u5f0f3:\u53cd\u9988\u5faa\u73af\u6a21\u5f0f(Feedback Loop Pattern)<\/h4>\n<p>\u7279\u70b9: \u8f93\u51fa\u53cd\u9988\u5230\u8f93\u5165,\u5f62\u6210\u8fed\u4ee3\u4f18\u5316<\/p>\n<p>\u5e94\u7528\u573a\u666f: \u9700\u8981\u9010\u6b65\u6539\u8fdb\u7684\u4efb\u52a1<\/p>\n<p>\u793a\u4f8b: TDD\u5f00\u53d1\u5faa\u73af<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_64\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n  \u2193                             \u2191\r\n<span class=\"token punctuation\">[<\/span>RED<span class=\"token punctuation\">]<\/span>                       <span class=\"token punctuation\">[<\/span>REFACTOR<span class=\"token punctuation\">]<\/span>\r\ntest<span class=\"token operator\">-<\/span>automator           code<span class=\"token operator\">-<\/span>reviewer\r\n<span class=\"token punctuation\">(<\/span>\u7f16\u5199\u5931\u8d25\u6d4b\u8bd5<span class=\"token punctuation\">)<\/span>            <span class=\"token punctuation\">(<\/span>\u91cd\u6784\u4f18\u5316<span class=\"token punctuation\">)<\/span>\r\n  \u2193                             \u2191\r\n<span class=\"token punctuation\">[<\/span>GREEN<span class=\"token punctuation\">]<\/span>                          \u2191\r\npython<span class=\"token operator\">-<\/span>pro                       \u2191\r\n<span class=\"token punctuation\">(<\/span>\u6700\u5c0f\u5b9e\u73b0\u901a\u8fc7\u6d4b\u8bd5<span class=\"token punctuation\">)<\/span>\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<ul id=\"code_id_64\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5b9e\u73b0:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_65\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">class TDDLoop:\r\n    def __init__<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> requirement<span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>requirement <span class=\"token operator\">=<\/span> requirement\r\n        self<span class=\"token punctuation\">.<\/span>iteration <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span>\r\n        self<span class=\"token punctuation\">.<\/span>max_iterations <span class=\"token operator\">=<\/span> <span class=\"token number\">5<\/span>\r\n    \r\n    async def run<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token keyword\">while<\/span> self<span class=\"token punctuation\">.<\/span>iteration <span class=\"token operator\">&lt;<\/span> self<span class=\"token punctuation\">.<\/span>max_iterations:\r\n            <span class=\"token comment\"># RED: \u7f16\u5199\u5931\u8d25\u6d4b\u8bd5<\/span>\r\n            tests <span class=\"token operator\">=<\/span> await test_automator<span class=\"token punctuation\">.<\/span>generate_tests<span class=\"token punctuation\">(<\/span>\r\n                self<span class=\"token punctuation\">.<\/span>requirement<span class=\"token punctuation\">,<\/span>\r\n                existing_code<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>current_code\r\n            <span class=\"token punctuation\">)<\/span>\r\n            \r\n            <span class=\"token comment\"># \u9a8c\u8bc1\u6d4b\u8bd5\u786e\u5b9e\u5931\u8d25<\/span>\r\n            <span class=\"token keyword\">if<\/span> <span class=\"token operator\">not<\/span> self<span class=\"token punctuation\">.<\/span>run_tests<span class=\"token punctuation\">(<\/span>tests<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>all_failed:\r\n                <span class=\"token keyword\">break<\/span>  <span class=\"token comment\"># \u6d4b\u8bd5\u6ca1\u6709\u5931\u8d25,\u8bf4\u660e\u529f\u80fd\u5df2\u5b9e\u73b0<\/span>\r\n            \r\n            <span class=\"token comment\"># GREEN: \u5b9e\u73b0\u4ee3\u7801\u4f7f\u6d4b\u8bd5\u901a\u8fc7<\/span>\r\n            self<span class=\"token punctuation\">.<\/span>current_code <span class=\"token operator\">=<\/span> await python_pro<span class=\"token punctuation\">.<\/span>implement<span class=\"token punctuation\">(<\/span>\r\n                tests<span class=\"token operator\">=<\/span>tests<span class=\"token punctuation\">,<\/span>\r\n                requirement<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>requirement\r\n            <span class=\"token punctuation\">)<\/span>\r\n            \r\n            <span class=\"token comment\"># \u9a8c\u8bc1\u6d4b\u8bd5\u901a\u8fc7<\/span>\r\n            test_result <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>run_tests<span class=\"token punctuation\">(<\/span>tests<span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token keyword\">if<\/span> <span class=\"token operator\">not<\/span> test_result<span class=\"token punctuation\">.<\/span>all_passed:\r\n                <span class=\"token keyword\">continue<\/span>  <span class=\"token comment\"># \u5b9e\u73b0\u6709\u95ee\u9898,\u91cd\u65b0\u5faa\u73af<\/span>\r\n            \r\n            <span class=\"token comment\"># REFACTOR: \u91cd\u6784\u4f18\u5316<\/span>\r\n            refactored_code <span class=\"token operator\">=<\/span> await code_reviewer<span class=\"token punctuation\">.<\/span>refactor<span class=\"token punctuation\">(<\/span>\r\n                code<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>current_code<span class=\"token punctuation\">,<\/span>\r\n                keep_tests_green<span class=\"token operator\">=<\/span><span class=\"token boolean\">True<\/span>\r\n            <span class=\"token punctuation\">)<\/span>\r\n            \r\n            <span class=\"token comment\"># \u9a8c\u8bc1\u91cd\u6784\u540e\u6d4b\u8bd5\u4ecd\u7136\u901a\u8fc7<\/span>\r\n            <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>run_tests<span class=\"token punctuation\">(<\/span>tests<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>all_passed:\r\n                self<span class=\"token punctuation\">.<\/span>current_code <span class=\"token operator\">=<\/span> refactored_code\r\n                <span class=\"token keyword\">break<\/span>  <span class=\"token comment\"># \u5b8c\u6210<\/span>\r\n            \r\n            self<span class=\"token punctuation\">.<\/span>iteration <span class=\"token operator\">+<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">1<\/span>\r\n        \r\n        <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>current_code<\/code><\/pre>\n<ul id=\"code_id_65\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5173\u952e\u70b9:<\/p>\n<ul data-id=\"u738a58b-aYH9nOA1\">\n<li data-id=\"ld70c578-ndL44sI1\">\u5faa\u73af\u7ec8\u6b62\u6761\u4ef6: \u5fc5\u987b\u660e\u786e,\u5426\u5219\u53ef\u80fd\u65e0\u9650\u5faa\u73af<\/li>\n<li data-id=\"ld70c578-rNfmVjJl\">\u72b6\u6001\u4fdd\u6301: \u6bcf\u6b21\u8fed\u4ee3\u7684\u8f93\u51fa\u662f\u4e0b\u6b21\u8fed\u4ee3\u7684\u8f93\u5165<\/li>\n<li data-id=\"ld70c578-9OywRRB7\">\u8d28\u91cf\u95e8: \u6bcf\u4e2a\u9636\u6bb5\u90fd\u6709\u9a8c\u8bc1(\u6d4b\u8bd5\u5931\u8d25\/\u901a\u8fc7)<\/li>\n<\/ul>\n<h3>4.3 \u6700\u4f73\u5b9e\u8df5:\u5982\u4f55\u9ad8\u6548\u4f7f\u7528Claude Code Agents<\/h3>\n<h4>\u5b9e\u8df51:\u6e10\u8fdb\u5f0f\u91c7\u7528(Progressive Adoption)<\/h4>\n<p>\u4e0d\u8981\u4e00\u6b21\u6027\u5207\u6362\u6240\u6709\u5de5\u4f5c\u6d41,\u800c\u662f\u4ece\u4f4e\u98ce\u9669\u573a\u666f\u5f00\u59cb:<\/p>\n<p>\u7b2c1\u5468: \u6587\u6863\u751f\u6210<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_66\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">\/plugin install documentation-generation\r\n# \u7528\u667a\u80fd\u4f53\u751f\u6210API\u6587\u6863\u3001\u6280\u672f\u6587\u6863\r\n# \u98ce\u9669:\u4f4e(\u6587\u6863\u51fa\u9519\u5f71\u54cd\u5c0f)\r\n# \u6536\u76ca:\u7acb\u7aff\u89c1\u5f71(\u6587\u6863\u8d28\u91cf\u63d0\u5347,\u65f6\u95f4\u8282\u770150%)<\/code><\/pre>\n<ul id=\"code_id_66\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c2\u5468: \u4ee3\u7801\u5ba1\u67e5<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_67\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">\/<\/span>plugin install code<span class=\"token operator\">-<\/span>quality<span class=\"token operator\">-<\/span>review\r\n<span class=\"token comment\"># \u7528\u667a\u80fd\u4f53\u5ba1\u67e5\u4ee3\u7801(\u4f46\u4eba\u5de5\u505a\u6700\u7ec8\u51b3\u7b56)<\/span>\r\n<span class=\"token comment\"># \u98ce\u9669:\u4f4e(\u6700\u7ec8\u7531\u4eba\u5ba1\u6838)<\/span>\r\n<span class=\"token comment\"># \u6536\u76ca:\u53d1\u73b0\u4eba\u5de5\u9057\u6f0f\u7684\u95ee\u9898<\/span><\/code><\/pre>\n<ul id=\"code_id_67\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c4\u5468: \u6d4b\u8bd5\u751f\u6210<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_68\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">\/<\/span>plugin install testing<span class=\"token operator\">-<\/span>quality<span class=\"token operator\">-<\/span>suite\r\n<span class=\"token comment\"># \u7528\u667a\u80fd\u4f53\u751f\u6210\u6d4b\u8bd5(\u4eba\u5de5\u5ba1\u6838\u540e\u5408\u5e76)<\/span>\r\n<span class=\"token comment\"># \u98ce\u9669:\u4e2d(\u6d4b\u8bd5\u53ef\u80fd\u9057\u6f0f\u8fb9\u754c\u60c5\u51b5)<\/span>\r\n<span class=\"token comment\"># \u6536\u76ca:\u6d4b\u8bd5\u8986\u76d6\u7387\u4ece40%\u63d0\u5347\u523080%<\/span><\/code><\/pre>\n<ul id=\"code_id_68\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c8\u5468: API\u5f00\u53d1<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_69\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">\/plugin install api-development-kit\r\n# \u7528\u667a\u80fd\u4f53\u751f\u6210API\u811a\u624b\u67b6(\u4eba\u5de5\u5b9a\u5236\u4e1a\u52a1\u903b\u8f91)\r\n# \u98ce\u9669:\u4e2d(\u9700\u8981\u7406\u89e3\u751f\u6210\u7684\u4ee3\u7801)\r\n# \u6536\u76ca:\u5f00\u53d1\u901f\u5ea6\u63d0\u53473\u500d<\/code><\/pre>\n<ul id=\"code_id_69\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c12\u5468: \u5168\u6808\u5de5\u4f5c\u6d41<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_70\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">\/<\/span>plugin install <span class=\"token keyword\">full<\/span><span class=\"token operator\">-<\/span>stack<span class=\"token operator\">-<\/span>development\r\n<span class=\"token comment\"># \u5b8c\u6574\u4f7f\u7528\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u5f00\u53d1\u65b0\u529f\u80fd<\/span>\r\n<span class=\"token comment\"># \u98ce\u9669:\u4e2d(\u9700\u8981\u76d1\u7763\u6574\u4e2a\u6d41\u7a0b)<\/span>\r\n<span class=\"token comment\"># \u6536\u76ca:\u7aef\u5230\u7aef\u5f00\u53d1\u6548\u7387\u63d0\u53475\u500d<\/span><\/code><\/pre>\n<ul id=\"code_id_70\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u5b9e\u8df52:\u5efa\u7acb\u9a8c\u8bc1\u6e05\u5355(Verification Checklist)<\/h4>\n<p>\u667a\u80fd\u4f53\u751f\u6210\u7684\u4ee3\u7801\u4e0d\u662f100%\u5b8c\u7f8e,\u9700\u8981\u4eba\u5de5\u9a8c\u8bc1\u5173\u952e\u70b9:<\/p>\n<p>\u5b89\u5168\u9a8c\u8bc1\u6e05\u5355:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_71\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token operator\">-<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token punctuation\">]<\/span> \u662f\u5426\u5b58\u5728<span class=\"token keyword\">SQL<\/span>\u6ce8\u5165\u98ce\u9669?<span class=\"token punctuation\">(<\/span>\u68c0\u67e5\u52a8\u6001<span class=\"token keyword\">SQL<\/span>\u62fc\u63a5<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token punctuation\">]<\/span> \u662f\u5426\u5b58\u5728XSS\u6f0f\u6d1e?<span class=\"token punctuation\">(<\/span>\u68c0\u67e5\u7528\u6237\u8f93\u5165\u5904\u7406<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token punctuation\">]<\/span> \u654f\u611f\u6570\u636e\u662f\u5426\u52a0\u5bc6?<span class=\"token punctuation\">(<\/span>\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32\u3001\u5bc6\u7801\u3001API\u5bc6\u94a5<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token punctuation\">]<\/span> \u8ba4\u8bc1\u662f\u5426\u6b63\u786e\u5b9e\u73b0?<span class=\"token punctuation\">(<\/span>JWT\u7b7e\u540d\u9a8c\u8bc1\u3001\u8fc7\u671f\u65f6\u95f4<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token punctuation\">[<\/span> <span class=\"token punctuation\">]<\/span> \u6743\u9650\u68c0\u67e5\u662f\u5426\u5b8c\u6574?<span class=\"token punctuation\">(<\/span>\u6bcf\u4e2a\u7aef\u70b9\u90fd\u6709\u6743\u9650\u9a8c\u8bc1<span class=\"token punctuation\">)<\/span><\/code><\/pre>\n<ul id=\"code_id_71\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6027\u80fd\u9a8c\u8bc1\u6e05\u5355:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_72\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">- [ ] \u662f\u5426\u5b58\u5728N+1\u67e5\u8be2?(ORM\u7684\u61d2\u52a0\u8f7d\u9677\u9631)\r\n- [ ] \u7f13\u5b58\u7b56\u7565\u662f\u5426\u5408\u7406?(TTL\u8bbe\u7f6e\u3001\u7f13\u5b58\u5931\u6548)\r\n- [ ] \u662f\u5426\u6709\u8d44\u6e90\u6cc4\u9732?(\u6570\u636e\u5e93\u8fde\u63a5\u3001\u6587\u4ef6\u53e5\u67c4)\r\n- [ ] \u5e76\u53d1\u5904\u7406\u662f\u5426\u6b63\u786e?(\u9501\u3001\u4e8b\u52a1\u3001\u7ade\u6001\u6761\u4ef6)\r\n- [ ] \u662f\u5426\u6709\u6027\u80fd\u6d4b\u8bd5?(\u8d1f\u8f7d\u6d4b\u8bd5\u7ed3\u679c)<\/code><\/pre>\n<ul id=\"code_id_72\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4e1a\u52a1\u903b\u8f91\u9a8c\u8bc1\u6e05\u5355:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_73\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">- [ ] \u8fb9\u754c\u60c5\u51b5\u662f\u5426\u5904\u7406?(\u7a7a\u503c\u3001\u6781\u503c\u3001\u5f02\u5e38\u60c5\u51b5)\r\n- [ ] \u4e1a\u52a1\u89c4\u5219\u662f\u5426\u6b63\u786e?(\u8ba1\u7b97\u516c\u5f0f\u3001\u72b6\u6001\u8f6c\u6362)\r\n- [ ] \u9519\u8bef\u5904\u7406\u662f\u5426\u5b8c\u6574?(\u6240\u6709\u5f02\u5e38\u90fd\u6709catch)\r\n- [ ] \u65e5\u5fd7\u662f\u5426\u5145\u5206?(\u5173\u952e\u64cd\u4f5c\u3001\u9519\u8bef\u90fd\u6709\u65e5\u5fd7)\r\n- [ ] \u662f\u5426\u7b26\u5408\u9886\u57df\u6a21\u578b?(\u5b9e\u4f53\u5173\u7cfb\u3001\u4e1a\u52a1\u7ea6\u675f)<\/code><\/pre>\n<ul id=\"code_id_73\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u5b9e\u8df53:\u5b9a\u5236\u5316\u667a\u80fd\u4f53(Customization)<\/h4>\n<p>\u5185\u7f6e\u768484\u4e2a\u667a\u80fd\u4f53\u8986\u76d6\u4e86\u5927\u90e8\u5206\u573a\u666f,\u4f46\u4f60\u53ef\u4ee5\u521b\u5efa\u81ea\u5df1\u7684\u667a\u80fd\u4f53:<\/p>\n<p>\u793a\u4f8b:\u521b\u5efa\u91d1\u878d\u9886\u57df\u4e13\u5bb6<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_74\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\">---<\/span>\r\nname: fintech<span class=\"token operator\">-<\/span>architect\r\ndescription: Financial technology architect specializing <span class=\"token operator\">in<\/span> payment systems<span class=\"token punctuation\">,<\/span> regulatory compliance <span class=\"token punctuation\">(<\/span>PCI<span class=\"token operator\">-<\/span>DSS<span class=\"token punctuation\">,<\/span> SOX<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> trading platforms<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">and<\/span> risk management<span class=\"token punctuation\">.<\/span> <span class=\"token keyword\">Use<\/span> <span class=\"token keyword\">for<\/span> fintech applications requiring compliance <span class=\"token operator\">and<\/span> security<span class=\"token punctuation\">.<\/span>\r\nmodel: opus  <span class=\"token comment\"># \u91d1\u878d\u7cfb\u7edf\u7528\u6700\u5f3a\u6a21\u578b<\/span>\r\ntools: security<span class=\"token operator\">-<\/span>scan<span class=\"token punctuation\">,<\/span> compliance<span class=\"token operator\">-<\/span><span class=\"token keyword\">check<\/span><span class=\"token punctuation\">,<\/span> api<span class=\"token operator\">-<\/span>scaffold\r\n<span class=\"token comment\">---<\/span>\r\n\r\nYou are a financial technology architect <span class=\"token keyword\">with<\/span> deep expertise <span class=\"token operator\">in<\/span> payment systems <span class=\"token operator\">and<\/span> regulatory compliance<span class=\"token punctuation\">.<\/span>\r\n\r\n<span class=\"token comment\">## Purpose<\/span>\r\nDesign secure<span class=\"token punctuation\">,<\/span> compliant financial systems that meet regulatory requirements <span class=\"token punctuation\">(<\/span>PCI<span class=\"token operator\">-<\/span>DSS<span class=\"token punctuation\">,<\/span> SOX<span class=\"token punctuation\">,<\/span> GDPR<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">while<\/span> ensuring high availability <span class=\"token operator\">and<\/span> performance<span class=\"token punctuation\">.<\/span>\r\n\r\n<span class=\"token comment\">## Capabilities<\/span>\r\n\r\n<span class=\"token comment\">### Payment Systems<\/span>\r\n<span class=\"token operator\">-<\/span> Payment gateway integration: Stripe<span class=\"token punctuation\">,<\/span> PayPal<span class=\"token punctuation\">,<\/span> Adyen<span class=\"token punctuation\">,<\/span> Square\r\n<span class=\"token operator\">-<\/span> Payment orchestration: Multi<span class=\"token operator\">-<\/span>gateway routing<span class=\"token punctuation\">,<\/span> fallback strategies\r\n<span class=\"token operator\">-<\/span> PCI<span class=\"token operator\">-<\/span>DSS compliance: Tokenization<span class=\"token punctuation\">,<\/span> encryption<span class=\"token punctuation\">,<\/span> secure transmission\r\n<span class=\"token operator\">-<\/span> Fraud detection: <span class=\"token keyword\">Rule<\/span> engines<span class=\"token punctuation\">,<\/span> ML models<span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span>D Secure\r\n<span class=\"token operator\">-<\/span> Reconciliation: Payment matching<span class=\"token punctuation\">,<\/span> dispute handling<span class=\"token punctuation\">,<\/span> refunds\r\n\r\n<span class=\"token comment\">### Regulatory Compliance<\/span>\r\n<span class=\"token operator\">-<\/span> PCI<span class=\"token operator\">-<\/span>DSS <span class=\"token keyword\">Level<\/span> <span class=\"token number\">1<\/span>: Network segmentation<span class=\"token punctuation\">,<\/span> access control<span class=\"token punctuation\">,<\/span> logging\r\n<span class=\"token operator\">-<\/span> SOX compliance: Audit trails<span class=\"token punctuation\">,<\/span> separation <span class=\"token keyword\">of<\/span> duties<span class=\"token punctuation\">,<\/span> change management\r\n<span class=\"token operator\">-<\/span> GDPR: <span class=\"token keyword\">Data<\/span> protection<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">right<\/span> <span class=\"token keyword\">to<\/span> be forgotten<span class=\"token punctuation\">,<\/span> consent management\r\n<span class=\"token operator\">-<\/span> AML<span class=\"token operator\">\/<\/span>KYC: <span class=\"token keyword\">Identity<\/span> verification<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">transaction<\/span> monitoring<span class=\"token punctuation\">,<\/span> suspicious activity reporting\r\n\r\n<span class=\"token comment\">### Trading &amp; Risk<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token keyword\">Order<\/span> matching engines: Low<span class=\"token operator\">-<\/span>latency<span class=\"token punctuation\">,<\/span> high<span class=\"token operator\">-<\/span>throughput\r\n<span class=\"token operator\">-<\/span> Risk management: Position limits<span class=\"token punctuation\">,<\/span> margin calculation<span class=\"token punctuation\">,<\/span> circuit breakers\r\n<span class=\"token operator\">-<\/span> Market <span class=\"token keyword\">data<\/span>: <span class=\"token keyword\">Real<\/span><span class=\"token operator\">-<\/span><span class=\"token keyword\">time<\/span> quotes<span class=\"token punctuation\">,<\/span> historical <span class=\"token keyword\">data<\/span><span class=\"token punctuation\">,<\/span> tick<span class=\"token operator\">-<\/span><span class=\"token keyword\">by<\/span><span class=\"token operator\">-<\/span>tick\r\n<span class=\"token operator\">-<\/span> Clearing <span class=\"token operator\">&amp;<\/span> settlement: T<span class=\"token operator\">+<\/span><span class=\"token number\">2<\/span> settlement<span class=\"token punctuation\">,<\/span> netting<span class=\"token punctuation\">,<\/span> DVP\r\n\r\n<span class=\"token comment\">## Behavioral Traits<\/span>\r\n<span class=\"token operator\">-<\/span> Security <span class=\"token operator\">and<\/span> compliance are non<span class=\"token operator\">-<\/span>negotiable<span class=\"token punctuation\">,<\/span> never compromise\r\n<span class=\"token operator\">-<\/span> Design <span class=\"token keyword\">for<\/span> auditability: comprehensive logging<span class=\"token punctuation\">,<\/span> immutable audit trails\r\n<span class=\"token operator\">-<\/span> <span class=\"token keyword\">Plan<\/span> <span class=\"token keyword\">for<\/span> disaster recovery: RPO <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">hour<\/span><span class=\"token punctuation\">,<\/span> RTO <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">4<\/span> hours\r\n<span class=\"token operator\">-<\/span> Consider regulatory reporting requirements <span class=\"token keyword\">from<\/span> <span class=\"token keyword\">day<\/span> one\r\n<span class=\"token operator\">-<\/span> Implement multi<span class=\"token operator\">-<\/span>layer fraud detection <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">rule<\/span><span class=\"token operator\">-<\/span>based <span class=\"token operator\">+<\/span> ML<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token comment\">## Response Approach<\/span>\r\n<span class=\"token number\">1.<\/span> Identify applicable regulations based <span class=\"token keyword\">on<\/span> jurisdiction\r\n<span class=\"token number\">2.<\/span> Design security architecture <span class=\"token punctuation\">(<\/span>encryption<span class=\"token punctuation\">,<\/span> tokenization<span class=\"token punctuation\">,<\/span> access control<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">3.<\/span> <span class=\"token keyword\">Plan<\/span> audit <span class=\"token operator\">and<\/span> logging strategy <span class=\"token punctuation\">(<\/span>what<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">when<\/span><span class=\"token punctuation\">,<\/span> how long <span class=\"token keyword\">to<\/span> retain<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token number\">4.<\/span> Define fraud detection rules <span class=\"token operator\">and<\/span> ML model requirements\r\n<span class=\"token number\">5.<\/span> Design disaster recovery <span class=\"token operator\">and<\/span> business continuity <span class=\"token keyword\">plan<\/span>\r\n<span class=\"token number\">6.<\/span> Provide compliance checklist <span class=\"token operator\">and<\/span> documentation requirements\r\n\r\n<span class=\"token comment\">## Example Interactions<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token string\">\"Design a payment processing system for a European e-commerce platform\"<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token string\">\"Implement PCI-DSS compliant card tokenization\"<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token string\">\"Create an AML transaction monitoring system\"<\/span>\r\n<span class=\"token operator\">-<\/span> <span class=\"token string\">\"Design a low-latency order matching engine for crypto exchange\"<\/span><\/code><\/pre>\n<ul id=\"code_id_74\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<li>36.<\/li>\n<li>37.<\/li>\n<li>38.<\/li>\n<li>39.<\/li>\n<li>40.<\/li>\n<li>41.<\/li>\n<li>42.<\/li>\n<li>43.<\/li>\n<li>44.<\/li>\n<li>45.<\/li>\n<li>46.<\/li>\n<li>47.<\/li>\n<li>48.<\/li>\n<li>49.<\/li>\n<li>50.<\/li>\n<li>51.<\/li>\n<li>52.<\/li>\n<li>53.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u4f7f\u7528\u81ea\u5b9a\u4e49\u667a\u80fd\u4f53:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_75\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\"># 1. \u5c06\u4e0a\u8ff0\u6587\u4ef6\u4fdd\u5b58\u4e3aagents\/fintech-architect.md\r\n# 2. \u91cd\u65b0\u52a0\u8f7d\u63d2\u4ef6\r\n\/plugin reload\r\n\r\n# 3. \u8c03\u7528\r\nTask tool with subagent_type: fintech-architect\r\nPrompt: \"Design payment system for cross-border remittance platform\"<\/code><\/pre>\n<ul id=\"code_id_75\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u5b9e\u8df54:\u5efa\u7acb\u6307\u6807\u4f53\u7cfb(Metrics)<\/h4>\n<p>\u91cf\u5316\u667a\u80fd\u4f53\u7684\u8d21\u732e,\u6301\u7eed\u6539\u8fdb:<\/p>\n<p>\u6548\u7387\u6307\u6807:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_76\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">metrics <span class=\"token operator\">=<\/span> {\r\n    <span class=\"token string\">\"development_time\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"4 weeks\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"1 week\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"75% reduction\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"code_review_time\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"2 days\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"2 hours\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"95% reduction\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"deployment_frequency\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"1x per month\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"10x per week\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"40x increase\"<\/span>\r\n    }\r\n}<\/code><\/pre>\n<ul id=\"code_id_76\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u8d28\u91cf\u6307\u6807:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_77\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">quality_metrics <span class=\"token operator\">=<\/span> {\r\n    <span class=\"token string\">\"test_coverage\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"45%\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"85%\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"+40 percentage points\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"security_vulnerabilities\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"12 high + 35 medium\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"0 high + 2 medium\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"94% reduction\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"production_incidents\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"8 per month\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"1 per month\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"87.5% reduction\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"code_quality_score\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"C (SonarQube)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"A (SonarQube)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"improvement\"<\/span>: <span class=\"token string\">\"2 grades up\"<\/span>\r\n    }\r\n}<\/code><\/pre>\n<ul id=\"code_id_77\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6210\u672c\u6307\u6807:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_78\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">cost_metrics <span class=\"token operator\">=<\/span> {\r\n    <span class=\"token string\">\"engineering_cost\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"$50K\/month (5 devs)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"$30K\/month (3 devs) + $2K Claude API\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"savings\"<\/span>: <span class=\"token string\">\"$18K\/month = $216K\/year\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"infrastructure_cost\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"$10K\/month (over-provisioned)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"$5K\/month (optimized by performance-engineer)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"savings\"<\/span>: <span class=\"token string\">\"$5K\/month = $60K\/year\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"incident_cost\"<\/span>: {\r\n        <span class=\"token string\">\"before\"<\/span>: <span class=\"token string\">\"$20K\/month (downtime + fix time)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"after\"<\/span>: <span class=\"token string\">\"$2K\/month (fewer incidents)\"<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token string\">\"savings\"<\/span>: <span class=\"token string\">\"$18K\/month = $216K\/year\"<\/span>\r\n    }<span class=\"token punctuation\">,<\/span>\r\n    <span class=\"token string\">\"total_annual_savings\"<\/span>: <span class=\"token string\">\"$492K\"<\/span>\r\n}<\/code><\/pre>\n<ul id=\"code_id_78\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>ROI\u8ba1\u7b97:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_79\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">\u6295\u8d44:\r\n- Claude API\u6210\u672c: $2K\/month \u00d7 12 = $24K\/year\r\n- \u5de5\u7a0b\u5e08\u5b66\u4e60\u65f6\u95f4: 40\u5c0f\u65f6 \u00d7 $100\/hour = $4K\r\n- \u603b\u6295\u8d44: $28K\/year\r\n\r\n\u56de\u62a5:\r\n- \u4eba\u529b\u6210\u672c\u8282\u7701: $216K\/year\r\n- \u57fa\u7840\u8bbe\u65bd\u8282\u7701: $60K\/year\r\n- \u4e8b\u6545\u6210\u672c\u8282\u7701: $216K\/year\r\n- \u603b\u56de\u62a5: $492K\/year\r\n\r\nROI = (492K - 28K) \/ 28K = 1657%\r\n\u56de\u6536\u671f = 28K \/ (492K\/12) = 0.68\u4e2a\u6708 \u2248 3\u5468<\/code><\/pre>\n<ul id=\"code_id_79\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u5b9e\u8df55:\u56e2\u961f\u534f\u4f5c\u6a21\u5f0f(Human-AI Collaboration)<\/h4>\n<p>\u6700\u4f73\u534f\u4f5c\u6a21\u5f0f:\u4e0d\u662f&#8221;AI\u66ff\u4ee3\u4eba&#8221;,\u800c\u662f&#8221;AI\u589e\u5f3a\u4eba&#8221;<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_80\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502          \u4eba\u7c7b\u5f00\u53d1\u8005\u7684\u89d2\u8272                 \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 \u2705 \u9700\u6c42\u7406\u89e3: \u4e0e\u4e1a\u52a1\u6c9f\u901a<span class=\"token punctuation\">,<\/span>\u7406\u89e3\u771f\u5b9e\u9700\u6c42      \u2502\r\n\u2502 \u2705 \u67b6\u6784\u51b3\u7b56: \u9009\u62e9\u6280\u672f\u6808<span class=\"token punctuation\">,<\/span>\u5b9a\u4e49\u7cfb\u7edf\u8fb9\u754c      \u2502\r\n\u2502 \u2705 \u4ee3\u7801\u5ba1\u67e5: \u9a8c\u8bc1AI\u751f\u6210\u7684\u4ee3\u7801\u8d28\u91cf         \u2502\r\n\u2502 \u2705 \u4e1a\u52a1\u903b\u8f91: \u5b9e\u73b0\u590d\u6742\u7684\u9886\u57df\u7279\u5b9a\u903b\u8f91       \u2502\r\n\u2502 \u2705 \u521b\u65b0\u8bbe\u8ba1: \u65b0\u9896\u7684\u89e3\u51b3\u65b9\u6848<span class=\"token punctuation\">,<\/span>\u7b97\u6cd5\u521b\u65b0      \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502          AI\u667a\u80fd\u4f53\u7684\u89d2\u8272                   \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 \u2705 \u811a\u624b\u67b6\u751f\u6210: \u5feb\u901f\u642d\u5efa\u9879\u76ee\u7ed3\u6784           \u2502\r\n\u2502 \u2705 \u6837\u677f\u4ee3\u7801: CRUD\u3001\u8ba4\u8bc1\u3001\u65e5\u5fd7\u7b49\u91cd\u590d\u4ee3\u7801   \u2502\r\n\u2502 \u2705 \u6d4b\u8bd5\u751f\u6210: \u5355\u5143\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5           \u2502\r\n\u2502 \u2705 \u4ee3\u7801\u5ba1\u67e5: \u53d1\u73b0\u6f0f\u6d1e\u3001\u6027\u80fd\u95ee\u9898           \u2502\r\n\u2502 \u2705 \u6587\u6863\u751f\u6210: API\u6587\u6863\u3001\u6280\u672f\u6587\u6863            \u2502\r\n\u2502 \u2705 \u914d\u7f6e\u751f\u6210: Docker\u3001K8s\u3001CI<span class=\"token operator\">\/<\/span>CD\u914d\u7f6e       \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<ul id=\"code_id_80\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u534f\u4f5c\u5de5\u4f5c\u6d41\u793a\u4f8b:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_81\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-plain\" tabindex=\"0\"><code class=\"language-plain\">1. \u4eba\u7c7b: \u5b9a\u4e49\u9700\u6c42(\"\u7528\u6237\u79ef\u5206\u7cfb\u7edf,\u652f\u6301\u4efb\u52a1\u5956\u52b1\u548c\u5546\u54c1\u5151\u6362\")\r\n   \u2193\r\n2. AI: \u751f\u6210\u6570\u636e\u5e93\u8bbe\u8ba1(\u79ef\u5206\u8868\u3001\u4efb\u52a1\u8868\u3001\u5546\u54c1\u8868\u3001\u5151\u6362\u8bb0\u5f55\u8868)\r\n   \u2193\r\n3. \u4eba\u7c7b: \u5ba1\u67e5\u5e76\u8c03\u6574(\u6dfb\u52a0\u4e1a\u52a1\u89c4\u5219:\u79ef\u5206\u6709\u6548\u671f\u3001\u5151\u6362\u9650\u5236)\r\n   \u2193\r\n4. AI: \u751f\u6210API\u4ee3\u7801(\u57fa\u4e8e\u8c03\u6574\u540e\u7684\u8bbe\u8ba1)\r\n   \u2193\r\n5. \u4eba\u7c7b: \u5b9e\u73b0\u590d\u6742\u4e1a\u52a1\u903b\u8f91(\u79ef\u5206\u8ba1\u7b97\u89c4\u5219\u3001\u98ce\u63a7\u89c4\u5219)\r\n   \u2193\r\n6. AI: \u751f\u6210\u6d4b\u8bd5\u7528\u4f8b(\u8986\u76d6\u6240\u6709\u4e1a\u52a1\u573a\u666f)\r\n   \u2193\r\n7. \u4eba\u7c7b: \u8865\u5145\u8fb9\u754c\u6d4b\u8bd5(\u6781\u7aef\u60c5\u51b5\u3001\u5e76\u53d1\u60c5\u51b5)\r\n   \u2193\r\n8. AI: \u5b89\u5168\u626b\u63cf+\u6027\u80fd\u4f18\u5316\r\n   \u2193\r\n9. \u4eba\u7c7b: \u6700\u7ec8\u5ba1\u67e5+\u90e8\u7f72\u51b3\u7b56<\/code><\/pre>\n<ul id=\"code_id_81\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>4.4 \u672a\u6765\u5c55\u671b:\u591a\u667a\u80fd\u4f53\u7cfb\u7edf\u7684\u8fdb\u5316\u65b9\u5411<\/h3>\n<h4>\u8d8b\u52bf1:\u4ece\u89c4\u5219\u9a71\u52a8\u5230\u5b66\u4e60\u9a71\u52a8<\/h4>\n<p>\u5f53\u524d: \u667a\u80fd\u4f53\u7684\u884c\u4e3a\u7531\u63d0\u793a\u8bcd(\u89c4\u5219)\u5b9a\u4e49\u672a\u6765: \u667a\u80fd\u4f53\u4ece\u5386\u53f2\u9879\u76ee\u4e2d\u5b66\u4e60,\u81ea\u52a8\u4f18\u5316\u63d0\u793a\u8bcd<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_82\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u6982\u5ff5\u793a\u4f8b<\/span>\r\nclass LearningAgent:\r\n    def __init__<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> base_prompt<span class=\"token punctuation\">)<\/span>:\r\n        self<span class=\"token punctuation\">.<\/span>prompt <span class=\"token operator\">=<\/span> base_prompt\r\n        self<span class=\"token punctuation\">.<\/span>feedback_history <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>\r\n    \r\n    async def <span class=\"token keyword\">execute<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">)<\/span>:\r\n        result <span class=\"token operator\">=<\/span> await llm_call<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>prompt<span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token keyword\">return<\/span> result\r\n    \r\n    def learn_from_feedback<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">,<\/span> result<span class=\"token punctuation\">,<\/span> human_feedback<span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token string\">\"\"\"\u4ece\u4eba\u7c7b\u53cd\u9988\u4e2d\u5b66\u4e60\"\"\"<\/span>\r\n        self<span class=\"token punctuation\">.<\/span>feedback_history<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>{\r\n            <span class=\"token string\">\"task\"<\/span>: task<span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">\"result\"<\/span>: result<span class=\"token punctuation\">,<\/span>\r\n            <span class=\"token string\">\"feedback\"<\/span>: human_feedback<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \"good\" \/ \"needs_improvement\" \/ \"rejected\"<\/span>\r\n            <span class=\"token string\">\"corrections\"<\/span>: human_feedback<span class=\"token punctuation\">.<\/span>corrections\r\n        }<span class=\"token punctuation\">)<\/span>\r\n        \r\n        <span class=\"token comment\"># \u6bcf10\u6b21\u53cd\u9988,\u81ea\u52a8\u4f18\u5316\u63d0\u793a\u8bcd<\/span>\r\n        <span class=\"token keyword\">if<\/span> <span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>feedback_history<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> <span class=\"token number\">10<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span>:\r\n            self<span class=\"token punctuation\">.<\/span>prompt <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>optimize_prompt<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    \r\n    def optimize_prompt<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span>:\r\n        <span class=\"token string\">\"\"\"\u4f7f\u7528meta-learning\u4f18\u5316\u63d0\u793a\u8bcd\"\"\"<\/span>\r\n        <span class=\"token comment\"># \u5206\u6790\u8d1f\u9762\u53cd\u9988\u7684\u5171\u6027<\/span>\r\n        failures <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>f <span class=\"token keyword\">for<\/span> f <span class=\"token operator\">in<\/span> self<span class=\"token punctuation\">.<\/span>feedback_history <span class=\"token keyword\">if<\/span> f<span class=\"token punctuation\">[<\/span><span class=\"token string\">'feedback'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">'rejected'<\/span><span class=\"token punctuation\">]<\/span>\r\n        failure_patterns <span class=\"token operator\">=<\/span> analyze_patterns<span class=\"token punctuation\">(<\/span>failures<span class=\"token punctuation\">)<\/span>\r\n        \r\n        <span class=\"token comment\"># \u751f\u6210\u6539\u8fdb\u5efa\u8bae<\/span>\r\n        improvements <span class=\"token operator\">=<\/span> generate_improvements<span class=\"token punctuation\">(<\/span>failure_patterns<span class=\"token punctuation\">)<\/span>\r\n        \r\n        <span class=\"token comment\"># \u66f4\u65b0\u63d0\u793a\u8bcd<\/span>\r\n        new_prompt <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>prompt <span class=\"token operator\">+<\/span> <span class=\"token string\">\"\\n\\nAdditional Guidelines:\\n\"<\/span> <span class=\"token operator\">+<\/span> improvements\r\n        <span class=\"token keyword\">return<\/span> new_prompt<\/code><\/pre>\n<ul id=\"code_id_82\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<li>31.<\/li>\n<li>32.<\/li>\n<li>33.<\/li>\n<li>34.<\/li>\n<li>35.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u6548\u679c:<\/p>\n<ul data-id=\"u738a58b-r2bFipRb\">\n<li data-id=\"ld70c578-Vw9YDf0c\">\u521d\u59cb\u63d0\u793a\u8bcd\u51c6\u786e\u738770%<\/li>\n<li data-id=\"ld70c578-5JEMplj4\">\u7ecf\u8fc7100\u6b21\u53cd\u9988\u540e,\u51c6\u786e\u7387\u63d0\u5347\u523090%<\/li>\n<li data-id=\"ld70c578-ppRud1Gg\">\u81ea\u52a8\u9002\u5e94\u56e2\u961f\u7684\u7f16\u7801\u98ce\u683c\u548c\u504f\u597d<\/li>\n<\/ul>\n<h4>\u8d8b\u52bf2:\u4ece\u4efb\u52a1\u7ea7\u5230\u9879\u76ee\u7ea7\u667a\u80fd\u4f53<\/h4>\n<p>\u5f53\u524d: \u667a\u80fd\u4f53\u5904\u7406\u5355\u4e2a\u4efb\u52a1(\u8bbe\u8ba1API\u3001\u7f16\u5199\u4ee3\u7801)\u672a\u6765: \u9879\u76ee\u7ecf\u7406\u667a\u80fd\u4f53(Project Manager Agent)\u7edf\u7b79\u6574\u4e2a\u9879\u76ee<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_83\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">ProjectManagerAgent:\r\n  role: <span class=\"token string\">\"Coordinate multi-agent workflows for entire project lifecycle\"<\/span>\r\n  \r\n  capabilities:\r\n    <span class=\"token operator\">-<\/span> Project planning: \u62c6\u89e3\u9879\u76ee\u4e3a\u5b50\u4efb\u52a1<span class=\"token punctuation\">,<\/span>\u5206\u914d\u7ed9\u4e13\u4e1a\u667a\u80fd\u4f53\r\n    <span class=\"token operator\">-<\/span> Progress tracking: \u76d1\u63a7\u5404\u667a\u80fd\u4f53\u8fdb\u5ea6<span class=\"token punctuation\">,<\/span>\u8bc6\u522b\u963b\u585e\r\n    <span class=\"token operator\">-<\/span> Risk management: \u9884\u6d4b\u98ce\u9669<span class=\"token punctuation\">(<\/span>\u65f6\u95f4\u5ef6\u671f\u3001\u8d44\u6e90\u4e0d\u8db3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\u63d0\u524d\u9884\u8b66\r\n    <span class=\"token operator\">-<\/span> Resource optimization: \u52a8\u6001\u8c03\u6574\u667a\u80fd\u4f53\u5206\u914d<span class=\"token punctuation\">(<\/span>\u8d1f\u8f7d\u5747\u8861<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token operator\">-<\/span> Quality control: \u8bbe\u7f6e\u8d28\u91cf\u95e8<span class=\"token punctuation\">,<\/span>\u4e0d\u8fbe\u6807\u81ea\u52a8\u8fd4\u5de5\r\n    <span class=\"token operator\">-<\/span> Stakeholder communication: \u751f\u6210\u8fdb\u5ea6\u62a5\u544a<span class=\"token punctuation\">,<\/span>\u53ef\u89c6\u5316\u4eea\u8868\u677f\r\n  \r\n  workflow:\r\n    <span class=\"token number\">1.<\/span> \u63a5\u6536\u9879\u76ee\u9700\u6c42\r\n    <span class=\"token number\">2.<\/span> \u751f\u6210\u9879\u76ee\u8ba1\u5212<span class=\"token punctuation\">(<\/span>WBS<span class=\"token punctuation\">,<\/span> Gantt\u56fe<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token number\">3.<\/span> \u5e76\u884c\u8c03\u5ea6\u667a\u80fd\u4f53\u6267\u884c\u4efb\u52a1\r\n    <span class=\"token number\">4.<\/span> \u76d1\u63a7\u8fdb\u5ea6<span class=\"token punctuation\">,<\/span>\u52a8\u6001\u8c03\u6574\r\n    <span class=\"token number\">5.<\/span> \u8d28\u91cf\u68c0\u67e5<span class=\"token punctuation\">,<\/span>\u786e\u4fdd\u4ea4\u4ed8\u6807\u51c6\r\n    <span class=\"token number\">6.<\/span> \u751f\u6210\u9879\u76ee\u62a5\u544a<\/code><\/pre>\n<ul id=\"code_id_83\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u793a\u4f8b\u573a\u666f:<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_84\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\">\u7528\u6237\u8f93\u5165: <span class=\"token string\">\"\u6784\u5efa\u4e00\u4e2a\u7535\u5546\u5e73\u53f0,\u5305\u542b\u7528\u6237\u7cfb\u7edf\u3001\u5546\u54c1\u7ba1\u7406\u3001\u8d2d\u7269\u8f66\u3001\u8ba2\u5355\u3001\u652f\u4ed8\"<\/span>\r\n\r\nProjectManagerAgent\u81ea\u52a8\u89c4\u5212:\r\nWeek <span class=\"token number\">1<\/span>:\r\n  <span class=\"token operator\">-<\/span> <span class=\"token keyword\">database<\/span><span class=\"token operator\">-<\/span>architect: \u8bbe\u8ba1\u6570\u636e\u6a21\u578b\r\n  <span class=\"token operator\">-<\/span> backend<span class=\"token operator\">-<\/span>architect: \u8bbe\u8ba1\u5fae\u670d\u52a1\u67b6\u6784\r\n  <span class=\"token operator\">-<\/span> frontend<span class=\"token operator\">-<\/span>developer: \u8bbe\u8ba1UI\u7ec4\u4ef6\u67b6\u6784\r\n\r\nWeek <span class=\"token number\">2<\/span><span class=\"token operator\">-<\/span><span class=\"token number\">3<\/span> <span class=\"token punctuation\">(<\/span>\u5e76\u884c<span class=\"token punctuation\">)<\/span>:\r\n  <span class=\"token operator\">-<\/span> Team A: \u7528\u6237\u7cfb\u7edf<span class=\"token punctuation\">(<\/span>backend <span class=\"token operator\">+<\/span> frontend <span class=\"token operator\">+<\/span> test<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> Team B: \u5546\u54c1\u7ba1\u7406<span class=\"token punctuation\">(<\/span>backend <span class=\"token operator\">+<\/span> frontend <span class=\"token operator\">+<\/span> test<span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token operator\">-<\/span> Team C: \u8d2d\u7269\u8f66<span class=\"token punctuation\">(<\/span>backend <span class=\"token operator\">+<\/span> frontend <span class=\"token operator\">+<\/span> test<span class=\"token punctuation\">)<\/span>\r\n\r\nWeek <span class=\"token number\">4<\/span>:\r\n  <span class=\"token operator\">-<\/span> integration<span class=\"token operator\">-<\/span>tester: \u96c6\u6210\u6d4b\u8bd5\r\n  <span class=\"token operator\">-<\/span> security<span class=\"token operator\">-<\/span>auditor: \u5b89\u5168\u5ba1\u8ba1\r\n  <span class=\"token operator\">-<\/span> performance<span class=\"token operator\">-<\/span>engineer: \u6027\u80fd\u4f18\u5316\r\n\r\nWeek <span class=\"token number\">5<\/span>:\r\n  <span class=\"token operator\">-<\/span> deployment<span class=\"token operator\">-<\/span>engineer: \u751f\u4ea7\u90e8\u7f72\r\n  <span class=\"token operator\">-<\/span> docs<span class=\"token operator\">-<\/span>architect: \u6587\u6863\u751f\u6210\r\n\r\n\u5b9e\u65f6\u76d1\u63a7:\r\n<span class=\"token operator\">-<\/span> Team A\u8fdb\u5ea6: <span class=\"token number\">90<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">(<\/span>\u6b63\u5e38<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> Team B\u8fdb\u5ea6: <span class=\"token number\">60<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">(<\/span>\u26a0\ufe0f \u5ef6\u671f\u98ce\u9669<span class=\"token punctuation\">,<\/span>\u8c03\u5ea6\u989d\u5916\u667a\u80fd\u4f53\u652f\u63f4<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token operator\">-<\/span> Team C\u8fdb\u5ea6: <span class=\"token number\">100<\/span><span class=\"token operator\">%<\/span><span class=\"token punctuation\">(<\/span>\u2705 \u5b8c\u6210<span class=\"token punctuation\">,<\/span>\u667a\u80fd\u4f53\u53ef\u91cd\u65b0\u5206\u914d<span class=\"token punctuation\">)<\/span>\r\n\r\n\u81ea\u52a8\u8c03\u6574:\r\n<span class=\"token operator\">-<\/span> \u4eceTeam C\u8c03\u5ea6python<span class=\"token operator\">-<\/span>pro\u652f\u63f4Team B\r\n<span class=\"token operator\">-<\/span> \u9884\u8ba1Week <span class=\"token number\">4<\/span>\u80fd\u6309\u65f6\u5b8c\u6210<\/code><\/pre>\n<ul id=\"code_id_84\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<li>7.<\/li>\n<li>8.<\/li>\n<li>9.<\/li>\n<li>10.<\/li>\n<li>11.<\/li>\n<li>12.<\/li>\n<li>13.<\/li>\n<li>14.<\/li>\n<li>15.<\/li>\n<li>16.<\/li>\n<li>17.<\/li>\n<li>18.<\/li>\n<li>19.<\/li>\n<li>20.<\/li>\n<li>21.<\/li>\n<li>22.<\/li>\n<li>23.<\/li>\n<li>24.<\/li>\n<li>25.<\/li>\n<li>26.<\/li>\n<li>27.<\/li>\n<li>28.<\/li>\n<li>29.<\/li>\n<li>30.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h4>\u8d8b\u52bf3:\u4ece\u901a\u7528\u5230\u9886\u57df\u4e13\u7cbe<\/h4>\n<p>\u5f53\u524d: \u901a\u7528\u667a\u80fd\u4f53(backend-architect\u9002\u7528\u6240\u6709\u540e\u7aef\u9879\u76ee)\u672a\u6765: \u884c\u4e1a\u4e13\u7cbe\u667a\u80fd\u4f53(healthcare-backend-architect, fintech-backend-architect)<\/p>\n<p>\u884c\u4e1a\u4e13\u7cbe\u667a\u80fd\u4f53\u7684\u4f18\u52bf:<\/p>\n<ul data-id=\"u738a58b-PvrhVo0f\">\n<li data-id=\"ld70c578-d73iUH6f\">\u533b\u7597\u884c\u4e1a:<\/li>\n<\/ul>\n<p>\u5185\u7f6eHIPAA\u5408\u89c4\u68c0\u67e5<\/p>\n<p>HL7\/FHIR\u6807\u51c6\u652f\u6301<\/p>\n<p>\u533b\u7597\u672f\u8bed\u7406\u89e3(ICD-10\u7f16\u7801)<\/p>\n<p>\u60a3\u8005\u9690\u79c1\u4fdd\u62a4(PHI\u6570\u636e\u52a0\u5bc6)<\/p>\n<ul data-id=\"u738a58b-z0Qa1JRA\">\n<li data-id=\"ld70c578-Bo5pHvS4\">\u91d1\u878d\u884c\u4e1a:<\/li>\n<\/ul>\n<p>PCI-DSS\/SOX\u5408\u89c4<\/p>\n<p>\u53cd\u6d17\u94b1(AML)\u89c4\u5219<\/p>\n<p>\u4ea4\u6613\u5b8c\u6574\u6027(ACID\u4fdd\u8bc1)<\/p>\n<p>\u5ba1\u8ba1\u8ffd\u8e2a(immutable logs)<\/p>\n<ul data-id=\"u738a58b-Je9fnuJa\">\n<li data-id=\"ld70c578-y5NgJ0az\">\u7269\u8054\u7f51\u884c\u4e1a:<\/li>\n<\/ul>\n<p>MQTT\/CoAP\u534f\u8bae<\/p>\n<p>\u4f4e\u529f\u8017\u8bbe\u8ba1<\/p>\n<p>\u65f6\u5e8f\u6570\u636e\u5e93(InfluxDB\/TimescaleDB)<\/p>\n<p>\u8fb9\u7f18\u8ba1\u7b97\u4f18\u5316<\/p>\n<h4>\u8d8b\u52bf4:\u4eba\u7c7b\u4e0eAI\u7684\u6df1\u5ea6\u878d\u5408<\/h4>\n<p>L1(\u5f53\u524d): AI\u8f85\u52a9<\/p>\n<ul data-id=\"u738a58b-otrGBjwv\">\n<li data-id=\"ld70c578-k2N8kuyz\">\u4eba\u7c7b\u5199\u4ee3\u7801,AI\u63d0\u4f9b\u5efa\u8bae<\/li>\n<li data-id=\"ld70c578-VoILeH4V\">\u4eba\u7c7b\u505a\u51b3\u7b56,AI\u63d0\u4f9b\u53c2\u8003<\/li>\n<\/ul>\n<p>L2(\u8fd1\u671f): AI\u534f\u4f5c<\/p>\n<ul data-id=\"u738a58b-DYxM9fAQ\">\n<li data-id=\"ld70c578-13fJENhN\">\u4eba\u7c7b\u548cAI\u5171\u540c\u7f16\u7a0b(pair programming)<\/li>\n<li data-id=\"ld70c578-NewgDUxv\">AI\u751f\u6210\u521d\u7a3f,\u4eba\u7c7b\u7cbe\u4fee<\/li>\n<li data-id=\"ld70c578-0PIXz9V2\">\u5b9e\u65f6\u5bf9\u8bdd\u5f0f\u5f00\u53d1<\/li>\n<\/ul>\n<p>L3(\u672a\u6765): AI\u4e3b\u5bfc<\/p>\n<ul data-id=\"u738a58b-rjSMmI5E\">\n<li data-id=\"ld70c578-6RukbezD\">\u4eba\u7c7b\u63d0\u4f9b\u9700\u6c42\u548c\u9a8c\u6536\u6807\u51c6<\/li>\n<li data-id=\"ld70c578-tfTOP9F7\">AI\u81ea\u4e3b\u5b8c\u6210\u5f00\u53d1\u3001\u6d4b\u8bd5\u3001\u90e8\u7f72<\/li>\n<li data-id=\"ld70c578-L9t5k0Qy\">\u4eba\u7c7b\u5b9a\u671f\u5ba1\u67e5\u548c\u6307\u5bfc<\/li>\n<\/ul>\n<p>L4(\u8fdc\u671f): AI\u81ea\u6cbb<\/p>\n<ul data-id=\"u738a58b-sQy2L4KQ\">\n<li data-id=\"ld70c578-ssxRAHTl\">AI\u7406\u89e3\u4e1a\u52a1\u76ee\u6807,\u81ea\u52a8\u63d0\u51fa\u89e3\u51b3\u65b9\u6848<\/li>\n<li data-id=\"ld70c578-2f7kdXhW\">AI\u81ea\u4e3b\u4f18\u5316\u7cfb\u7edf\u6027\u80fd<\/li>\n<li data-id=\"ld70c578-Q3S0obRu\">\u4eba\u7c7b\u53ea\u9700\u8bbe\u5b9a\u5546\u4e1a\u76ee\u6807,AI\u6267\u884c\u6280\u672f\u7ec6\u8282<\/li>\n<\/ul>\n<p>\u6211\u4eec\u73b0\u5728\u5904\u4e8eL1\u5230L2\u7684\u8fc7\u6e21\u9636\u6bb5,Claude Code Agents\u5c31\u662f\u8fd9\u4e2a\u8fc7\u6e21\u671f\u7684\u4ee3\u8868\u4ea7\u54c1\u3002<\/p>\n<h3>4.5 \u6f5c\u5728\u98ce\u9669\u4e0e\u5e94\u5bf9\u7b56\u7565<\/h3>\n<h4>\u98ce\u96691:\u8fc7\u5ea6\u4f9d\u8d56\u5bfc\u81f4\u6280\u80fd\u9000\u5316<\/h4>\n<p>\u98ce\u9669\u63cf\u8ff0: \u5f00\u53d1\u8005\u8fc7\u5ea6\u4f9d\u8d56AI\u751f\u6210\u4ee3\u7801,\u81ea\u8eab\u7f16\u7a0b\u80fd\u529b\u4e0b\u964d<\/p>\n<p>\u5e94\u5bf9\u7b56\u7565:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-SMJ6QXoP\">\n<li data-id=\"ld70c578-tAZFDzjr\">\u5173\u952e\u4ee3\u7801\u4eba\u5de5\u7f16\u5199: \u6838\u5fc3\u4e1a\u52a1\u903b\u8f91\u3001\u590d\u6742\u7b97\u6cd5\u7531\u4eba\u7c7b\u5b9e\u73b0<\/li>\n<li data-id=\"ld70c578-8eDEklcw\">\u5b9a\u671fCode Review Training: \u6bcf\u5468\u5ba1\u67e5AI\u751f\u6210\u7684\u4ee3\u7801,\u7406\u89e3\u5176\u5b9e\u73b0\u903b\u8f91<\/li>\n<li data-id=\"ld70c578-jtNzTJkJ\">\u8f6e\u5c97\u5236\u5ea6: \u6bcf\u4e2a\u6708\u67091\u5468\u4e0d\u4f7f\u7528AI\u5de5\u5177,\u4fdd\u6301\u7f16\u7a0b\u624b\u611f<\/li>\n<li data-id=\"ld70c578-cKknbrnb\">\u6280\u672f\u5206\u4eab: \u5206\u4eab\u4eceAI\u751f\u6210\u4ee3\u7801\u4e2d\u5b66\u5230\u7684\u6280\u5de7\u548c\u6a21\u5f0f<\/li>\n<\/ol>\n<h4>\u98ce\u96692:AI\u751f\u6210\u4ee3\u7801\u7684&#8221;\u9ed1\u76d2&#8221;\u95ee\u9898<\/h4>\n<p>\u98ce\u9669\u63cf\u8ff0: AI\u751f\u6210\u7684\u590d\u6742\u4ee3\u7801\u96be\u4ee5\u7406\u89e3\u548c\u7ef4\u62a4<\/p>\n<p>\u5e94\u5bf9\u7b56\u7565:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-R6fUpJFS\">\n<li data-id=\"ld70c578-IXYkzd5Q\">\u5f3a\u5236\u4ee3\u7801\u6ce8\u91ca: \u8981\u6c42AI\u751f\u6210\u4ee3\u7801\u65f6\u5305\u542b\u8be6\u7ec6\u6ce8\u91ca<\/li>\n<li data-id=\"ld70c578-5z0fAfMd\">\u7b80\u5316\u4f18\u5148: \u914d\u7f6e\u667a\u80fd\u4f53\u504f\u597d\u7b80\u5355\u660e\u4e86\u7684\u5b9e\u73b0,\u800c\u975e\u70ab\u6280<\/li>\n<li data-id=\"ld70c578-F9azuCZ4\">\u4ee3\u7801\u8bb2\u89e3: \u4f7f\u7528<code>code-explain<\/code>\u5de5\u5177\u8ba9AI\u89e3\u91ca\u751f\u6210\u7684\u4ee3\u7801<\/li>\n<li data-id=\"ld70c578-rpuqIrIN\">\u91cd\u6784\u6743\u5229: \u5982\u679cAI\u4ee3\u7801\u96be\u4ee5\u7406\u89e3,\u4eba\u7c7b\u6709\u6743\u91cd\u6784<\/li>\n<\/ol>\n<h4>\u98ce\u96693:\u5b89\u5168\u6f0f\u6d1e\u98ce\u9669<\/h4>\n<p>\u98ce\u9669\u63cf\u8ff0: AI\u53ef\u80fd\u751f\u6210\u5b58\u5728\u5b89\u5168\u6f0f\u6d1e\u7684\u4ee3\u7801<\/p>\n<p>\u5e94\u5bf9\u7b56\u7565:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-sSZ4R0tO\">\n<li data-id=\"ld70c578-9uQFTrSz\">\u5f3a\u5236\u5b89\u5168\u626b\u63cf: \u6240\u6709AI\u751f\u6210\u4ee3\u7801\u5fc5\u987b\u901a\u8fc7<code>security-scan<\/code><\/li>\n<li data-id=\"ld70c578-wwp4mNmD\">\u4eba\u5de5\u5b89\u5168\u5ba1\u67e5: \u5173\u952e\u6a21\u5757(\u8ba4\u8bc1\u3001\u652f\u4ed8)\u5fc5\u987b\u4eba\u5de5\u5ba1\u67e5<\/li>\n<li data-id=\"ld70c578-3SNHXoNd\">\u6e17\u900f\u6d4b\u8bd5: \u5b9a\u671f\u6267\u884c\u6e17\u900f\u6d4b\u8bd5,\u9a8c\u8bc1\u5b89\u5168\u6027<\/li>\n<li data-id=\"ld70c578-hEnixKPI\">\u5b89\u5168\u57f9\u8bad: \u56e2\u961f\u5b9a\u671f\u5b66\u4e60\u6700\u65b0\u7684\u5b89\u5168\u5a01\u80c1\u548c\u9632\u62a4\u624b\u6bb5<\/li>\n<\/ol>\n<h4>\u98ce\u96694:\u6210\u672c\u5931\u63a7<\/h4>\n<p>\u98ce\u9669\u63cf\u8ff0: Claude API\u8c03\u7528\u6210\u672c\u53ef\u80fd\u8d85\u51fa\u9884\u7b97<\/p>\n<p>\u5e94\u5bf9\u7b56\u7565:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-CMVtFOcH\">\n<li data-id=\"ld70c578-lw2AUPYO\">\u6a21\u578b\u5206\u5c42: \u7b80\u5355\u4efb\u52a1\u7528Haiku,\u590d\u6742\u4efb\u52a1\u624d\u7528Opus<\/li>\n<li data-id=\"ld70c578-F4OiKLov\">\u7f13\u5b58\u673a\u5236: \u76f8\u4f3c\u8bf7\u6c42\u4f7f\u7528\u7f13\u5b58\u7ed3\u679c<\/li>\n<li data-id=\"ld70c578-30JeHMxa\">\u6279\u5904\u7406: \u591a\u4e2a\u5c0f\u4efb\u52a1\u5408\u5e76\u6210\u4e00\u4e2a\u5927\u4efb\u52a1<\/li>\n<li data-id=\"ld70c578-4rDKNbBK\">\u9884\u7b97\u544a\u8b66: \u8bbe\u7f6e\u6bcf\u65e5\/\u6bcf\u6708\u9884\u7b97\u4e0a\u9650,\u8d85\u51fa\u81ea\u52a8\u505c\u6b62<\/li>\n<\/ol>\n<h4>\u98ce\u96695:\u77e5\u8bc6\u4ea7\u6743\u95ee\u9898<\/h4>\n<p>\u98ce\u9669\u63cf\u8ff0: AI\u751f\u6210\u7684\u4ee3\u7801\u53ef\u80fd\u4fb5\u72af\u4ed6\u4eba\u7248\u6743<\/p>\n<p>\u5e94\u5bf9\u7b56\u7565:<\/p>\n<ol class=\"list-paddingleft-1\" data-id=\"odd3d8fc-3suDkF9S\">\n<li data-id=\"ld70c578-cZTMpO8p\">\u5f00\u6e90\u534f\u8bae\u68c0\u67e5: \u4f7f\u7528\u5de5\u5177\u68c0\u6d4b\u751f\u6210\u4ee3\u7801\u662f\u5426\u4e0e\u5f00\u6e90\u4ee3\u7801\u9ad8\u5ea6\u76f8\u4f3c<\/li>\n<li data-id=\"ld70c578-LXmRdsta\">\u539f\u521b\u6027\u9a8c\u8bc1: \u5bf9\u5173\u952e\u6a21\u5757\u8fdb\u884c\u4ee3\u7801\u76f8\u4f3c\u5ea6\u68c0\u67e5<\/li>\n<li data-id=\"ld70c578-pCtnTbjV\">\u6cd5\u5f8b\u54a8\u8be2: \u4e0e\u6cd5\u52a1\u56e2\u961f\u786e\u8ba4AI\u8f85\u52a9\u5f00\u53d1\u7684\u5408\u89c4\u6027<\/li>\n<li data-id=\"ld70c578-XSWb5dYZ\">\u5f52\u5c5e\u58f0\u660e: \u5728\u4ee3\u7801\u4e2d\u660e\u786e\u6807\u6ce8&#8221;AI\u8f85\u52a9\u751f\u6210&#8221;<\/li>\n<\/ol>\n<h2>\u7b2c\u4e94\u90e8\u5206\uff1a\u7ed3\u8bed\u4e0e\u884c\u52a8\u6307\u5357<\/h2>\n<h3>5.1 \u6838\u5fc3\u8981\u70b9\u56de\u987e<\/h3>\n<p>\u6211\u4eec\u7528\u8d85\u8fc76000\u5b57\u7684\u7bc7\u5e45,\u6df1\u5165\u63a2\u8ba8\u4e86Claude Code Agents\u8fd9\u4e2a\u9769\u547d\u6027\u7684\u591a\u667a\u80fd\u4f53\u7cfb\u7edf\u3002\u8ba9\u6211\u4eec\u56de\u987e\u6838\u5fc3\u8981\u70b9:<\/p>\n<h4>\u67b6\u6784\u8bbe\u8ba1<\/h4>\n<ul data-id=\"u738a58b-gfR0X8zk\">\n<li data-id=\"ld70c578-U2BYfzA7\">\u4e09\u5c42\u67b6\u6784: 84\u4e2a\u4e13\u4e1a\u667a\u80fd\u4f53 + 15\u4e2a\u5de5\u4f5c\u6d41\u7f16\u6392\u5668 + 42\u4e2a\u5f00\u53d1\u5de5\u5177<\/li>\n<li data-id=\"ld70c578-Ko27YAyN\">\u6a21\u578b\u914d\u7f6e\u7b56\u7565: Haiku\/Sonnet\/Opus\u5206\u5c42\u914d\u7f6e,\u5e73\u8861\u8d28\u91cf\u4e0e\u6210\u672c<\/li>\n<li data-id=\"ld70c578-N42ULJbk\">\u667a\u80fd\u4f53\u5b9a\u4e49\u89c4\u8303: Frontmatter\u9a71\u52a8\u7684\u58f0\u660e\u5f0f\u7f16\u7a0b<\/li>\n<\/ul>\n<h4>\u534f\u4f5c\u6a21\u5f0f<\/h4>\n<ul data-id=\"u738a58b-zHpa5sND\">\n<li data-id=\"ld70c578-lHdFdCim\">\u6d41\u6c34\u7ebf\u6a21\u5f0f: \u4e32\u884c\u5904\u7406,\u804c\u8d23\u6e05\u6670<\/li>\n<li data-id=\"ld70c578-TJuSvVWI\">\u5e76\u884c\u6c47\u805a\u6a21\u5f0f: \u5e76\u53d1\u6267\u884c,\u901f\u5ea6\u63d0\u5347<\/li>\n<li data-id=\"ld70c578-nJyrsSuO\">\u53cd\u9988\u5faa\u73af\u6a21\u5f0f: \u8fed\u4ee3\u4f18\u5316,\u8d28\u91cf\u4fdd\u8bc1<\/li>\n<\/ul>\n<h4>\u5b9e\u8df5\u4ef7\u503c<\/h4>\n<ul data-id=\"u738a58b-25IBDi4O\">\n<li data-id=\"ld70c578-Ps0hDMAy\">\u5f00\u53d1\u6548\u7387: \u4ece4\u5468\u7f29\u77ed\u52301\u5929(95%\u65f6\u95f4\u8282\u7701)<\/li>\n<li data-id=\"ld70c578-EFjbNeg8\">\u4ee3\u7801\u8d28\u91cf: \u6d4b\u8bd5\u8986\u76d685%+,OWASP\u5408\u89c4<\/li>\n<li data-id=\"ld70c578-Xb7at0jx\">\u6210\u672c\u8282\u7701: ROI 1657%,3\u5468\u56de\u6536\u6210\u672c<\/li>\n<\/ul>\n<h3>5.2 \u7acb\u5373\u884c\u52a8\u6307\u5357<\/h3>\n<p>\u7b2c1\u5929: \u73af\u5883\u51c6\u5907<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_85\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># 1. \u5b89\u88c5Claude Code(\u5982\u679c\u8fd8\u6ca1\u6709)<\/span>\r\n<span class=\"token comment\"># 2. \u6dfb\u52a0\u63d2\u4ef6\u5e02\u573a<\/span>\r\n<span class=\"token operator\">\/<\/span>plugin marketplace <span class=\"token keyword\">add<\/span> https:<span class=\"token comment\">\/\/github.com\/wshobson\/agents<\/span>\r\n\r\n<span class=\"token comment\"># 3. \u5b89\u88c5\u7b2c\u4e00\u4e2a\u63d2\u4ef6(\u4f4e\u98ce\u9669\u573a\u666f)<\/span>\r\n<span class=\"token operator\">\/<\/span>plugin install claude<span class=\"token operator\">-<\/span>code<span class=\"token operator\">-<\/span>essentials<\/code><\/pre>\n<ul id=\"code_id_85\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<li>5.<\/li>\n<li>6.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c1\u5468: \u5c0f\u8303\u56f4\u8bd5\u70b9<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_86\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u9009\u62e9\u4e00\u4e2a\u975e\u5173\u952e\u9879\u76ee\u8bd5\u7528<\/span>\r\n<span class=\"token comment\"># \u4f7f\u7528\u573a\u666f: \u6587\u6863\u751f\u6210\u3001\u4ee3\u7801\u5ba1\u67e5\u3001\u6d4b\u8bd5\u751f\u6210<\/span>\r\n<span class=\"token comment\"># \u76ee\u6807: \u719f\u6089\u5de5\u5177,\u5efa\u7acb\u4fe1\u5fc3<\/span><\/code><\/pre>\n<ul id=\"code_id_86\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c1\u6708: \u6269\u5927\u5e94\u7528<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_87\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u5c06\u6210\u529f\u7ecf\u9a8c\u63a8\u5e7f\u5230\u66f4\u591a\u9879\u76ee<\/span>\r\n<span class=\"token operator\">\/<\/span>plugin install api<span class=\"token operator\">-<\/span>development<span class=\"token operator\">-<\/span>kit\r\n<span class=\"token operator\">\/<\/span>plugin install testing<span class=\"token operator\">-<\/span>quality<span class=\"token operator\">-<\/span>suite\r\n<span class=\"token comment\"># \u76ee\u6807: \u5f00\u53d1\u6548\u7387\u63d0\u534750%<\/span><\/code><\/pre>\n<ul id=\"code_id_87\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>\u7b2c3\u6708: \u5168\u9762\u91c7\u7528<\/p>\n<div>\n<div class=\"hljs-cto\">\n<div class=\"hljs-cto\"><button class=\"copy_btn disable\" data-clipboard-target=\"#code_id_88\">\u590d\u5236<\/button><\/p>\n<div class=\"code-toolbar\">\n<pre class=\"has-pre-numbering language-sql\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"token comment\"># \u4f7f\u7528\u591a\u667a\u80fd\u4f53\u5de5\u4f5c\u6d41<\/span>\r\n<span class=\"token operator\">\/<\/span>plugin install <span class=\"token keyword\">full<\/span><span class=\"token operator\">-<\/span>stack<span class=\"token operator\">-<\/span>development\r\n<span class=\"token operator\">\/<\/span>plugin install security<span class=\"token operator\">-<\/span>hardening\r\n<span class=\"token comment\"># \u76ee\u6807: \u7aef\u5230\u7aef\u5f00\u53d1\u6548\u7387\u63d0\u53475\u500d<\/span><\/code><\/pre>\n<ul id=\"code_id_88\" class=\"pre-numbering\">\n<li>1.<\/li>\n<li>2.<\/li>\n<li>3.<\/li>\n<li>4.<\/li>\n<\/ul>\n<div class=\"toolbar\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>5.3 \u6301\u7eed\u5b66\u4e60\u8d44\u6e90<\/h3>\n<ul data-id=\"u738a58b-6NF4w29l\">\n<li data-id=\"ld70c578-pJ5oddXx\">\u5b98\u65b9\u6587\u6863: https:\/\/docs.anthropic.com\/en\/docs\/claude-code<\/li>\n<li data-id=\"ld70c578-W2qawfvx\">GitHub\u4ed3\u5e93: https:\/\/github.com\/wshobson\/agents<\/li>\n<li data-id=\"ld70c578-sMORUpdR\">\u793e\u533a\u8bba\u575b: (\u5206\u4eab\u7ecf\u9a8c\u3001\u63d0\u95ee\u7b54\u7591)<\/li>\n<li data-id=\"ld70c578-B0vbOgwg\">\u6280\u672f\u535a\u5ba2: (\u8ddf\u8e2a\u6700\u65b0\u7279\u6027\u548c\u6700\u4f73\u5b9e\u8df5)<\/li>\n<\/ul>\n<h3>5.4 \u6700\u540e\u7684\u601d\u8003<\/h3>\n<p>Claude Code Agents\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u5de5\u5177,\u5b83\u4ee3\u8868\u4e86\u8f6f\u4ef6\u5f00\u53d1\u7684\u8303\u5f0f\u8f6c\u53d8(Paradigm Shift):<\/p>\n<p>\u4ece:<\/p>\n<ul data-id=\"u738a58b-cmnqz6p5\">\n<li data-id=\"ld70c578-3j1fN3MR\">\u5355\u6253\u72ec\u6597 \u2192\u00a0\u56e2\u961f\u534f\u4f5c(\u867d\u7136\u961f\u53cb\u662fAI)<\/li>\n<li data-id=\"ld70c578-MmbJVITd\">\u4ece\u96f6\u5f00\u59cb \u2192\u00a0\u7ad9\u5728\u5de8\u4eba\u80a9\u8180\u4e0a(\u6700\u4f73\u5b9e\u8df5\u5185\u7f6e)<\/li>\n<li data-id=\"ld70c578-Q6wcmwQ2\">\u4e8b\u540e\u8865\u6551 \u2192\u00a0\u9884\u9632\u4e3a\u4e3b(\u5b89\u5168\u3001\u6027\u80fd\u4ece\u4e00\u5f00\u59cb\u5c31\u8003\u8651)<\/li>\n<li data-id=\"ld70c578-LcipB3IN\">\u624b\u5de5\u4f5c\u574a \u2192\u00a0\u5de5\u4e1a\u5316\u751f\u4ea7(\u6807\u51c6\u5316\u3001\u81ea\u52a8\u5316)<\/li>\n<\/ul>\n<p>\u8fd9\u4e0d\u662f\u53d6\u4ee3\u7a0b\u5e8f\u5458,\u800c\u662f\u89e3\u653e\u7a0b\u5e8f\u5458:<\/p>\n<ul data-id=\"u738a58b-Y5V9GhZJ\">\n<li data-id=\"ld70c578-AIOKfg14\">\u4ece\u91cd\u590d\u52b3\u52a8\u4e2d\u89e3\u653e,\u4e13\u6ce8\u4e8e\u521b\u9020\u6027\u5de5\u4f5c<\/li>\n<li data-id=\"ld70c578-kSCy8z9i\">\u4ece\u4f4e\u7ea7\u9519\u8bef\u4e2d\u89e3\u653e,\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u4ef7\u503c<\/li>\n<li data-id=\"ld70c578-T9t71Z1M\">\u4ece\u5b64\u7acb\u5de5\u4f5c\u4e2d\u89e3\u653e,\u4e0eAI\u667a\u80fd\u4f53\u534f\u4f5c<\/li>\n<\/ul>\n<p>\u672a\u6765\u7684\u8f6f\u4ef6\u5de5\u7a0b\u5e08,\u5c06\u662f:<\/p>\n<ul data-id=\"u738a58b-8TScZFpy\">\n<li data-id=\"ld70c578-20KrJhcs\">\u9700\u6c42\u7ffb\u8bd1\u8005: \u5c06\u4e1a\u52a1\u9700\u6c42\u8f6c\u5316\u4e3aAI\u53ef\u7406\u89e3\u7684\u89c4\u683c<\/li>\n<li data-id=\"ld70c578-FgdGxSLq\">\u67b6\u6784\u8bbe\u8ba1\u8005: \u505a\u51fa\u5173\u952e\u7684\u6280\u672f\u51b3\u7b56\u548c\u67b6\u6784\u9009\u62e9<\/li>\n<li data-id=\"ld70c578-3rHSSRSa\">\u8d28\u91cf\u628a\u5173\u8005: \u5ba1\u67e5AI\u8f93\u51fa,\u786e\u4fdd\u7b26\u5408\u6807\u51c6<\/li>\n<li data-id=\"ld70c578-nqDc6f2O\">\u521b\u65b0\u63a8\u52a8\u8005: \u63a2\u7d22AI\u5c1a\u672a\u6d89\u53ca\u7684\u65b0\u9886\u57df<\/li>\n<\/ul>\n<p>\u7ad9\u57282025\u5e74,\u56de\u671b\u8f6f\u4ef6\u5f00\u53d1\u7684\u5386\u53f2:<\/p>\n<ul data-id=\"u738a58b-xGzcbxF3\">\n<li data-id=\"ld70c578-vlDn2PYh\">1950\u5e74\u4ee3:\u673a\u5668\u8bed\u8a00<\/li>\n<li data-id=\"ld70c578-5ITXAEu4\">1960\u5e74\u4ee3:\u6c47\u7f16\u8bed\u8a00<\/li>\n<li data-id=\"ld70c578-4X3xgRDU\">1970\u5e74\u4ee3:\u9ad8\u7ea7\u8bed\u8a00(C)<\/li>\n<li data-id=\"ld70c578-0EYH4e89\">1980\u5e74\u4ee3:\u9762\u5411\u5bf9\u8c61(C++, Java)<\/li>\n<li data-id=\"ld70c578-zZZWz5D9\">1990\u5e74\u4ee3:Web\u5f00\u53d1(JavaScript)<\/li>\n<li data-id=\"ld70c578-2aNltQVr\">2000\u5e74\u4ee3:\u654f\u6377\u5f00\u53d1<\/li>\n<li data-id=\"ld70c578-tTDDner7\">2010\u5e74\u4ee3:\u4e91\u539f\u751f\u3001\u5fae\u670d\u52a1<\/li>\n<li data-id=\"ld70c578-O7iTmgV1\">2020\u5e74\u4ee3:AI\u8f85\u52a9\u5f00\u53d1\u00a0\u2190 \u6211\u4eec\u5728\u8fd9\u91cc<\/li>\n<\/ul>\n<p>\u6bcf\u4e00\u6b21\u6280\u672f\u9769\u547d,\u90fd\u6709\u4eba\u62c5\u5fc3&#8221;\u6211\u4eec\u4f1a\u88ab\u53d6\u4ee3&#8221;,\u4f46\u5386\u53f2\u544a\u8bc9\u6211\u4eec:\u6280\u672f\u8fdb\u6b65\u521b\u9020\u7684\u5c97\u4f4d,\u8fdc\u591a\u4e8e\u6d88\u706d\u7684\u5c97\u4f4d\u3002<\/p>\n<p>\u62e5\u62b1\u53d8\u5316,\u4e0eAI\u5171\u821e,\u8fd9\u4e0d\u662f\u9009\u62e9\u9898,\u800c\u662f\u5fc5\u7b54\u9898\u3002<\/p>\n<p>Claude Code Agents\u5df2\u7ecf\u4e3a\u6211\u4eec\u94fa\u597d\u4e86\u9053\u8def,\u5269\u4e0b\u7684,\u5c31\u662f\u8fc8\u51fa\u7b2c\u4e00\u6b65\u3002<\/p>\n<p>\u4f60\u51c6\u5907\u597d\u4e86\u5417?<\/p>\n<p>\u6587\u7ae0\u6765\u81ea\uff1a51CTO<\/p>\n<\/div>\n<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_27496\" class=\"pvc_stats total_only  \" data-element-id=\"27496\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewBox=\"0 0 502 315\" preserveAspectRatio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/aif.amtbbs.org\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u60f3\u8c61\u4e00\u4e0b:\u5f53\u4f60\u9700\u8981\u5f00\u53d1\u4e00\u4e2a\u5168\u6808\u529f\u80fd\u65f6,\u540e\u7aef\u67b6\u6784\u5e08\u667a\u80fd\u4f53\u8d1f\u8d23API\u8bbe\u8ba1,\u6570\u636e\u5e93\u67b6\u6784\u5e08\u667a\u80fd\u4f53\u5904\u7406\u6570\u636e\u5efa\u6a21,\u524d\u7aef\u5f00\u53d1 [&hellip;]<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_27496\" class=\"pvc_stats total_only  \" data-element-id=\"27496\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewBox=\"0 0 502 315\" preserveAspectRatio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/aif.amtbbs.org\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":56,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,20,80],"tags":[1902],"class_list":["post-27496","post","type-post","status-publish","format-standard","hentry","category-23","category-20","category-80","tag-aiclaude-code"],"_links":{"self":[{"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/posts\/27496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/users\/56"}],"replies":[{"embeddable":true,"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/comments?post=27496"}],"version-history":[{"count":1,"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/posts\/27496\/revisions"}],"predecessor-version":[{"id":27497,"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/posts\/27496\/revisions\/27497"}],"wp:attachment":[{"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/media?parent=27496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/categories?post=27496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aif.amtbbs.org\/index.php\/wp-json\/wp\/v2\/tags?post=27496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}