{"id":122,"date":"2026-01-27T17:16:18","date_gmt":"2026-01-27T09:16:18","guid":{"rendered":"https:\/\/zcc609.online\/?p=122"},"modified":"2026-01-27T17:16:18","modified_gmt":"2026-01-27T09:16:18","slug":"ai-%e7%bc%96%e7%a8%8b%e9%97%af%e5%85%b3%e5%ad%a6%e4%b9%a0%e5%b9%b3%e5%8f%b0-%e6%8a%80%e6%9c%af%e6%80%bb%e7%bb%93","status":"publish","type":"post","link":"https:\/\/zcc609.online\/?p=122","title":{"rendered":"AI \u7f16\u7a0b\u95ef\u5173\u5b66\u4e60\u5e73\u53f0 &#8211; \u6280\u672f\u603b\u7ed3"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u4e00\u3001\u9879\u76ee\u6982\u8ff0<\/h2>\n\n\n\n<p>\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e AI \u667a\u80fd\u5224\u9898\u7684\u5728\u7ebf\u7f16\u7a0b\u5b66\u4e60\u5e73\u53f0\uff0c\u652f\u6301 Python\u3001JavaScript\u3001Java \u4e09\u79cd\u8bed\u8a00\u7684\u5728\u7ebf\u7f16\u5199\u548c\u6267\u884c\u3002\u6838\u5fc3\u7279\u8272\u662f<strong>\u81ea\u7814\u4ee3\u7801\u6267\u884c\u5f15\u64ce<\/strong>\u548c<strong>AI \u667a\u80fd\u53cd\u9988\u7cfb\u7edf<\/strong>\u3002<\/p>\n\n\n\n<p><strong>\u6280\u672f\u6808<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u524d\u7aef\uff1aReact 18 + TypeScript + Monaco Editor + Ant Design + Zustand<\/li>\n\n\n\n<li>\u540e\u7aef\uff1aSpring Boot 3 + MyBatis-Plus + MySQL 8.0<\/li>\n\n\n\n<li>AI \u5224\u9898\uff1a\u7845\u57fa\u6d41\u52a8 DeepSeek-V3 API<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e8c\u3001\u9879\u76ee\u7ed3\u6784<\/h2>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nAI coding game\/\n\u251c\u2500\u2500 frontend\/                          # \u524d\u7aef\u9879\u76ee\n\u2502   \u251c\u2500\u2500 src\/\n\u2502   \u2502   \u251c\u2500\u2500 api\/                      # API \u63a5\u53e3\u5b9a\u4e49\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 auth.ts              # \u8ba4\u8bc1\u76f8\u5173\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 challenge.ts         # \u9898\u76ee\u76f8\u5173\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 submission.ts        # \u63d0\u4ea4\u76f8\u5173\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 leaderboard.ts       # \u6392\u884c\u699c\u76f8\u5173\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 user.ts              # \u7528\u6237\u76f8\u5173\n\u2502   \u2502   \u251c\u2500\u2500 components\/              # \u516c\u5171\u7ec4\u4ef6\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Layout\/              # \u5e03\u5c40\u7ec4\u4ef6\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 LevelProgress\/       # \u7b49\u7ea7\u8fdb\u5ea6\u6761\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 ProtectedRoute\/      # \u8def\u7531\u5b88\u536b\n\u2502   \u2502   \u251c\u2500\u2500 pages\/                   # \u9875\u9762\u7ec4\u4ef6\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Auth\/                # \u767b\u5f55\u6ce8\u518c\u9875\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 ChallengeDetail\/     # \u9898\u76ee\u8be6\u60c5\u9875\uff08\u542b Monaco Editor\uff09\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Challenges\/          # \u9898\u76ee\u5217\u8868\u9875\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Leaderboard\/         # \u6392\u884c\u699c\u9875\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Profile\/             # \u4e2a\u4eba\u4e2d\u5fc3\u9875\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 Admin\/               # \u7ba1\u7406\u540e\u53f0\u9875\n\u2502   \u2502   \u251c\u2500\u2500 store\/                   # \u72b6\u6001\u7ba1\u7406\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 authStore.ts         # Zustand \u8ba4\u8bc1\u72b6\u6001\n\u2502   \u2502   \u251c\u2500\u2500 utils\/                   # \u5de5\u5177\u51fd\u6570\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 request.ts           # Axios \u5c01\u88c5\n\u2502   \u2502   \u2514\u2500\u2500 App.tsx                  # \u6839\u7ec4\u4ef6\n\u2502   \u251c\u2500\u2500 package.json\n\u2502   \u2514\u2500\u2500 vite.config.ts\n\u2502\n\u251c\u2500\u2500 backend\/                          # \u540e\u7aef\u9879\u76ee\n\u2502   \u251c\u2500\u2500 src\/main\/java\/com\/aicode\/platform\/\n\u2502   \u2502   \u251c\u2500\u2500 controller\/              # \u63a7\u5236\u5668\u5c42\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 AuthController.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 ChallengeController.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 SubmissionController.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 LeaderboardController.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 UserController.java\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 AdminController.java\n\u2502   \u2502   \u251c\u2500\u2500 service\/                 # \u4e1a\u52a1\u903b\u8f91\u5c42\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 AuthService.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 ChallengeService.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 SubmissionService.java    # \u4ee3\u7801\u6267\u884c\u5f15\u64ce\u6838\u5fc3\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 AIJudgeService.java       # AI \u5224\u9898\u6838\u5fc3\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 LeaderboardService.java\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 UserService.java\n\u2502   \u2502   \u251c\u2500\u2500 mapper\/                  # \u6570\u636e\u8bbf\u95ee\u5c42\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 UserMapper.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 ChallengeMapper.java\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 SubmissionMapper.java\n\u2502   \u2502   \u251c\u2500\u2500 entity\/                  # \u5b9e\u4f53\u7c7b\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 User.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Challenge.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Submission.java\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 Achievement.java\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 TestCase.java\n\u2502   \u2502   \u251c\u2500\u2500 config\/                  # \u914d\u7f6e\u7c7b\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 SecurityConfig.java\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 CorsConfig.java\n\u2502   \u2502   \u2514\u2500\u2500 util\/                    # \u5de5\u5177\u7c7b\n\u2502   \u2502       \u2514\u2500\u2500 JwtUtil.java\n\u2502   \u2514\u2500\u2500 src\/main\/resources\/\n\u2502       \u251c\u2500\u2500 application.yml          # Spring Boot \u914d\u7f6e\n\u2502       \u2514\u2500\u2500 schema.sql               # \u6570\u636e\u5e93\u5efa\u8868\u8bed\u53e5\n\u2502\n\u251c\u2500\u2500 scripts\/                          # \u811a\u672c\u5de5\u5177\n\u2502   \u251c\u2500\u2500 import_problems.py           # \u9898\u76ee\u5bfc\u5165\u5de5\u5177\n\u2502   \u2514\u2500\u2500 test_executor.py             # \u4ee3\u7801\u6267\u884c\u6d4b\u8bd5\n\u2502\n\u251c\u2500\u2500 data\/                            # \u6570\u636e\u6587\u4ef6\n\u2502   \u2514\u2500\u2500 problems.json                # \u9898\u76ee\u6570\u636e\n\u2502\n\u251c\u2500\u2500 start-all.sh                     # \u542f\u52a8\u811a\u672c\n\u251c\u2500\u2500 stop-all.sh                      # \u505c\u6b62\u811a\u672c\n\u2514\u2500\u2500 README.md\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001\u7cfb\u7edf\u67b6\u6784\u56fe<\/h2>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                         \u6d4f\u89c8\u5668\u7aef                              \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u2502\n\u2502  \u2502  \u9898\u76ee\u5217\u8868\u9875  \u2502  \u2502  \u4ee3\u7801\u7f16\u8f91\u9875  \u2502  \u2502   \u6392\u884c\u699c\u9875   \u2502      \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518      \u2502\n\u2502         \u2502                  \u2502                  \u2502              \u2502\n\u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518              \u2502\n\u2502                            \u2502                                 \u2502\n\u2502                    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                        \u2502\n\u2502                    \u2502 Monaco Editor \u2502 (\u4ee3\u7801\u7f16\u8f91\u5668)           \u2502\n\u2502                    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                        \u2502\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\u253c\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\n                             \u2502 HTTP\/HTTPS\n                             \u2502 (RESTful API + JWT)\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\u25bc\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\n\u2502                      Spring Boot \u540e\u7aef                        \u2502\n\u2502  \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n\u2502  \u2502                    Controller \u5c42                      \u2502  \u2502\n\u2502  \u2502  AuthController  ChallengeController  SubmissionCtrl \u2502  \u2502\n\u2502  \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\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  \u2502\n\u2502               \u2502                                             \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\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  \u2502\n\u2502  \u2502                     Service \u5c42                        \u2502  \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502  \u2502\n\u2502  \u2502  \u2502 Submission   \u2502  \u2502  AIJudge     \u2502  \u2502  Challenge \u2502 \u2502  \u2502\n\u2502  \u2502  \u2502   Service    \u2502  \u2502   Service    \u2502  \u2502   Service  \u2502 \u2502  \u2502\n\u2502  \u2502  \u2502 (\u4ee3\u7801\u6267\u884c)   \u2502  \u2502 (AI \u5224\u9898)    \u2502  \u2502            \u2502 \u2502  \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502  \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\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  \u2502\n\u2502            \u2502                  \u2502                             \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                   \u2502\n\u2502  \u2502 \u8fdb\u7a0b\u6267\u884c\u5f15\u64ce    \u2502  \u2502 \u7845\u57fa\u6d41\u52a8 API    \u2502                   \u2502\n\u2502  \u2502 python3\/node   \u2502  \u2502 DeepSeek-V3     \u2502                   \u2502\n\u2502  \u2502 javac\/java     \u2502  \u2502                 \u2502                   \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                   \u2502\n\u2502            \u2502                                                \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\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    \u2502\n\u2502  \u2502                  Mapper \u5c42                          \u2502    \u2502\n\u2502  \u2502  UserMapper  ChallengeMapper  SubmissionMapper     \u2502    \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\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\u2500\u2500\u2518    \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n             \u2502 MyBatis-Plus\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                        MySQL \u6570\u636e\u5e93                           \u2502\n\u2502  users  challenges  submissions  achievements  leaderboard   \u2502\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u56db\u3001\u6838\u5fc3\u529f\u80fd\u6d41\u7a0b\u56fe<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 \u7528\u6237\u767b\u5f55\u8ba4\u8bc1\u6d41\u7a0b<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u524d\u7aef   \u2502                \u2502 \u540e\u7aef   \u2502              \u2502 \u6570\u636e\u5e93 \u2502\n\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518                \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518              \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518\n    \u2502                         \u2502                       \u2502\n    \u2502  POST \/api\/auth\/login   \u2502                       \u2502\n    \u2502  {username, password}   \u2502                       \u2502\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&gt;\u2502                       \u2502\n    \u2502                         \u2502  \u67e5\u8be2\u7528\u6237\u4fe1\u606f          \u2502\n    \u2502                         \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502\n    \u2502                         \u2502                       \u2502\n    \u2502                         \u2502  \u8fd4\u56de\u7528\u6237\u6570\u636e          \u2502\n    \u2502                         \u2502&amp;lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n    \u2502                         \u2502                       \u2502\n    \u2502                         \u2502  BCrypt \u9a8c\u8bc1\u5bc6\u7801       \u2502\n    \u2502                         \u2502  \u751f\u6210 JWT Token       \u2502\n    \u2502                         \u2502                       \u2502\n    \u2502  \u8fd4\u56de token + userInfo  \u2502                       \u2502\n    \u2502&amp;lt;\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                       \u2502\n    \u2502                         \u2502                       \u2502\n    \u2502  \u5b58\u50a8 token \u5230 Zustand  \u2502                       \u2502\n    \u2502  \u540e\u7eed\u8bf7\u6c42\u643a\u5e26 token     \u2502                       \u2502\n    \u2502  Authorization: Bearer  \u2502                       \u2502\n    \u2502                         \u2502                       \u2502\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">4.2 \u4ee3\u7801\u63d0\u4ea4\u4e0e\u6267\u884c\u6d41\u7a0b<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510           \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510           \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u524d\u7aef    \u2502           \u2502 \u540e\u7aef    \u2502           \u2502 \u4ee3\u7801\u6267\u884c\u5f15\u64ce \u2502        \u2502 \u6570\u636e\u5e93 \u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518           \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518           \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518        \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502 POST \/api\/submit    \u2502                       \u2502                    \u2502\n     \u2502 {challengeId, code} \u2502                       \u2502                    \u2502\n     \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u67e5\u8be2\u9898\u76ee\u6d4b\u8bd5\u7528\u4f8b       \u2502                    \u2502\n     \u2502                     \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\u2500&gt;\u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u8fd4\u56de\u6d4b\u8bd5\u7528\u4f8b          \u2502                    \u2502\n     \u2502                     \u2502&amp;lt;\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\u2500\u2524\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u521b\u5efa\u4e34\u65f6\u6587\u4ef6          \u2502                    \u2502\n     \u2502                     \u2502  \u5305\u88c5\u7528\u6237\u4ee3\u7801          \u2502                    \u2502\n     \u2502                     \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                    \u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502                       \u2502 \u542f\u52a8\u8fdb\u7a0b           \u2502\n     \u2502                     \u2502                       \u2502 python3\/node\/java  \u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502                       \u2502 \u6267\u884c\u4ee3\u7801           \u2502\n     \u2502                     \u2502                       \u2502 \u6355\u83b7\u8f93\u51fa           \u2502\n     \u2502                     \u2502                       \u2502 (\u8d85\u65f6 5\u79d2)         \u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u8fd4\u56de\u6267\u884c\u7ed3\u679c          \u2502                    \u2502\n     \u2502                     \u2502  {output, error, time}\u2502                    \u2502\n     \u2502                     \u2502&amp;lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524                    \u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u5bf9\u6bd4\u8f93\u51fa\u4e0e\u671f\u671b\u503c       \u2502                    \u2502\n     \u2502                     \u2502  \u8ba1\u7b97\u901a\u8fc7\u7387            \u2502                    \u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u4fdd\u5b58\u63d0\u4ea4\u8bb0\u5f55          \u2502                    \u2502\n     \u2502                     \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\u2500&gt;\u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502                     \u2502  \u66f4\u65b0\u7528\u6237\u7ecf\u9a8c\u503c         \u2502                    \u2502\n     \u2502                     \u2502  \u68c0\u67e5\u6210\u5c31\u89e3\u9501          \u2502                    \u2502\n     \u2502                     \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\u2500&gt;\u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n     \u2502  \u8fd4\u56de\u5224\u9898\u7ed3\u679c        \u2502                       \u2502                    \u2502\n     \u2502  {status, results}  \u2502                       \u2502                    \u2502\n     \u2502&amp;lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524                       \u2502                    \u2502\n     \u2502                     \u2502                       \u2502                    \u2502\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">4.3 AI \u667a\u80fd\u5224\u9898\u6d41\u7a0b<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \u524d\u7aef    \u2502        \u2502 \u540e\u7aef    \u2502         \u2502 AIJudge      \u2502       \u2502 \u7845\u57fa\u6d41\u52a8 \u2502\n\u2502         \u2502        \u2502         \u2502         \u2502 Service      \u2502       \u2502 API      \u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518        \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518\n     \u2502                  \u2502                     \u2502                    \u2502\n     \u2502 POST \/api\/ai-hint\u2502                     \u2502                    \u2502\n     \u2502 {submissionId}   \u2502                     \u2502                    \u2502\n     \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                     \u2502                    \u2502\n     \u2502                  \u2502  \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55        \u2502                    \u2502\n     \u2502                  \u2502  \u83b7\u53d6\u9519\u8bef\u4fe1\u606f        \u2502                    \u2502\n     \u2502                  \u2502                     \u2502                    \u2502\n     \u2502                  \u2502  \u6784\u5efa AI Prompt     \u2502                    \u2502\n     \u2502                  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                    \u2502\n     \u2502                  \u2502                     \u2502                    \u2502\n     \u2502                  \u2502                     \u2502  \u8c03\u7528 DeepSeek-V3  \u2502\n     \u2502                  \u2502                     \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502\n     \u2502                  \u2502                     \u2502                    \u2502\n     \u2502                  \u2502                     \u2502  \u6d41\u5f0f\u8fd4\u56de (SSE)    \u2502\n     \u2502                  \u2502                     \u2502&amp;lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n     \u2502                  \u2502                     \u2502                    \u2502\n     \u2502                  \u2502  \u8f6c\u53d1\u6d41\u5f0f\u54cd\u5e94        \u2502                    \u2502\n     \u2502  SSE \u6d41\u5f0f\u54cd\u5e94     \u2502&amp;lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524                    \u2502\n     \u2502&amp;lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524                     \u2502                    \u2502\n     \u2502  (\u6253\u5b57\u673a\u6548\u679c)     \u2502                     \u2502                    \u2502\n     \u2502                  \u2502                     \u2502                    \u2502\n     \u2502  \u663e\u793a AI \u53cd\u9988     \u2502                     \u2502                    \u2502\n     \u2502  - \u9519\u8bef\u5206\u6790      \u2502                     \u2502                    \u2502\n     \u2502  - \u6539\u8fdb\u5efa\u8bae      \u2502                     \u2502                    \u2502\n     \u2502  - \u4ee3\u7801\u793a\u4f8b      \u2502                     \u2502                    \u2502\n     \u2502                  \u2502                     \u2502                    \u2502\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u4e94\u3001\u6570\u636e\u5e93\u8bbe\u8ba1\uff08ER \u56fe\uff09<\/h2>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       users         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 id (PK)            \u2502\n\u2502 username           \u2502\n\u2502 password           \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 email              \u2502         \u2502\n\u2502 experience         \u2502         \u2502 1:N\n\u2502 level              \u2502         \u2502\n\u2502 avatar_url         \u2502         \u2502\n\u2502 role               \u2502         \u2502\n\u2502 created_at         \u2502         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518         \u2502\n         \u2502                      \u2502\n         \u2502 1:N                  \u2502\n         \u2502                      \u2502\n         \u25bc                      \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u2502\n\u2502    submissions      \u2502         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524         \u2502\n\u2502 id (PK)            \u2502         \u2502\n\u2502 user_id (FK)       \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u2502 challenge_id (FK)  \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 code               \u2502         \u2502\n\u2502 language           \u2502         \u2502\n\u2502 status             \u2502         \u2502\n\u2502 execution_result   \u2502         \u2502\n\u2502 submitted_at       \u2502         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518         \u2502\n         \u25b2                      \u2502\n         \u2502                      \u2502\n         \u2502 N:1                  \u2502\n         \u2502                      \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u2502\n\u2502    challenges       \u2502         \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524         \u2502\n\u2502 id (PK)            \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u2502 title              \u2502\n\u2502 description        \u2502\n\u2502 difficulty         \u2502\n\u2502 category           \u2502\n\u2502 language           \u2502\n\u2502 test_cases (JSON)  \u2502\n\u2502 template_code      \u2502\n\u2502 solution_code      \u2502\n\u2502 pass_rate          \u2502\n\u2502 submission_count   \u2502\n\u2502 created_at         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         \u2502\n         \u2502 1:N\n         \u2502\n         \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502    test_cases       \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 id (PK)            \u2502\n\u2502 challenge_id (FK)  \u2502\n\u2502 input              \u2502\n\u2502 expected_output    \u2502\n\u2502 is_sample          \u2502\n\u2502 explanation        \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   achievements      \u2502         \u2502 user_achievements   \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524         \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 id (PK)            \u2502         \u2502 id (PK)            \u2502\n\u2502 name               \u2502\u25c4\u2500\u2500\u2500N:N\u2500\u2500\u2502 user_id (FK)       \u2502\n\u2502 description        \u2502         \u2502 achievement_id (FK)\u2502\n\u2502 icon               \u2502         \u2502 unlocked_at        \u2502\n\u2502 condition_type     \u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u2502 condition_value    \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502    leaderboard      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 id (PK)            \u2502\n\u2502 user_id (FK)       \u2502\n\u2502 username           \u2502\n\u2502 experience         \u2502\n\u2502 solved_count       \u2502\n\u2502 pass_rate          \u2502\n\u2502 rank               \u2502\n\u2502 snapshot_date      \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u6838\u5fc3\u8868\u8bf4\u660e<\/h3>\n\n\n\n<p><strong>1. users \u8868<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b58\u50a8\u7528\u6237\u57fa\u672c\u4fe1\u606f\u3001\u7ecf\u9a8c\u7b49\u7ea7<\/li>\n\n\n\n<li><code class=\"\">experience<\/code>: \u7ecf\u9a8c\u503c\uff08\u5b8c\u6210\u9898\u76ee\u83b7\u5f97\uff09<\/li>\n\n\n\n<li><code class=\"\">level<\/code>: \u7b49\u7ea7\uff08\u6839\u636e experience \u8ba1\u7b97\uff09<\/li>\n<\/ul>\n\n\n\n<p><strong>2. challenges \u8868<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b58\u50a8\u9898\u76ee\u4fe1\u606f<\/li>\n\n\n\n<li><code class=\"\">test_cases<\/code>: JSON \u683c\u5f0f\u5b58\u50a8\u6d4b\u8bd5\u7528\u4f8b\u6570\u7ec4<\/li>\n\n\n\n<li><code class=\"\">template_code<\/code>: \u9884\u586b\u5145\u7684\u4ee3\u7801\u6a21\u677f<\/li>\n<\/ul>\n\n\n\n<p><strong>3. submissions \u8868<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b58\u50a8\u6bcf\u6b21\u4ee3\u7801\u63d0\u4ea4\u8bb0\u5f55<\/li>\n\n\n\n<li><code class=\"\">execution_result<\/code>: JSON \u683c\u5f0f\u5b58\u50a8\u8be6\u7ec6\u6267\u884c\u7ed3\u679c<\/li>\n\n\n\n<li><code class=\"\">status<\/code>: ACCEPTED, WRONG_ANSWER, RUNTIME_ERROR \u7b49<\/li>\n<\/ul>\n\n\n\n<p><strong>4. achievements \u8868<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u4e49\u6210\u5c31\u6761\u4ef6\uff08\u5982&#8221;\u5b8c\u621010\u9053\u9898&#8221;\u3001&#8221;\u8fde\u7eed7\u5929\u6253\u5361&#8221;\uff09<\/li>\n<\/ul>\n\n\n\n<p><strong>5. user_achievements \u8868<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8bb0\u5f55\u7528\u6237\u89e3\u9501\u7684\u6210\u5c31<\/li>\n<\/ul>\n\n\n\n<p><strong>6. leaderboard \u8868<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6392\u884c\u699c\u5feb\u7167\uff0c\u5b9a\u671f\u66f4\u65b0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u516d\u3001\u4ee3\u7801\u6267\u884c\u5f15\u64ce\u5b9e\u73b0\uff08\u6838\u5fc3\uff09<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1 \u6267\u884c\u6d41\u7a0b<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u7528\u6237\u63d0\u4ea4\u4ee3\u7801\n    \u2502\n    \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 1. \u63a5\u6536\u63d0\u4ea4\u8bf7\u6c42      \u2502\n\u2502   - challengeId      \u2502\n\u2502   - code             \u2502\n\u2502   - language         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 2. \u67e5\u8be2\u6d4b\u8bd5\u7528\u4f8b      \u2502\n\u2502   - \u4ece DB \u83b7\u53d6       \u2502\n\u2502   - \u89e3\u6790 JSON        \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 3. \u4ee3\u7801\u5305\u88c5          \u2502\n\u2502   - Python: \u6dfb\u52a0\u6d4b\u8bd5  \u2502\n\u2502     if __name__      \u2502\n\u2502   - Java: \u5305\u88c5 Main  \u2502\n\u2502   - JS: \u6dfb\u52a0 console \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 4. \u521b\u5efa\u4e34\u65f6\u6587\u4ef6      \u2502\n\u2502   - createTempFile() \u2502\n\u2502   - \u5199\u5165\u5305\u88c5\u540e\u4ee3\u7801   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 5. \u542f\u52a8\u8fdb\u7a0b\u6267\u884c      \u2502\n\u2502   - ProcessBuilder   \u2502\n\u2502   - python3\/node\/java\u2502\n\u2502   - \u6355\u83b7 stdout\/err  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 6. \u8d85\u65f6\u63a7\u5236          \u2502\n\u2502   - waitFor(5\u79d2)     \u2502\n\u2502   - \u8d85\u65f6\u5f3a\u5236\u7ec8\u6b62     \u2502\n\u2502   - destroyForcibly()\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 7. \u8bfb\u53d6\u6267\u884c\u7ed3\u679c      \u2502\n\u2502   - \u6807\u51c6\u8f93\u51fa         \u2502\n\u2502   - \u9519\u8bef\u8f93\u51fa         \u2502\n\u2502   - \u6267\u884c\u65f6\u95f4         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 8. \u8f93\u51fa\u5bf9\u6bd4\u5224\u5b9a      \u2502\n\u2502   - trim() \u53bb\u7a7a\u683c    \u2502\n\u2502   - equals() \u6bd4\u8f83    \u2502\n\u2502   - \u8ba1\u7b97\u901a\u8fc7\u7387       \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 9. \u4fdd\u5b58\u63d0\u4ea4\u8bb0\u5f55      \u2502\n\u2502   - status           \u2502\n\u2502   - execution_result \u2502\n\u2502   - \u66f4\u65b0\u7edf\u8ba1\u6570\u636e     \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n       \u2502\n       \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 10. \u6e05\u7406\u4e34\u65f6\u6587\u4ef6     \u2502\n\u2502    - deleteOnExit()  \u2502\n\u2502    - \u9632\u6b62\u78c1\u76d8\u5360\u7528    \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">6.2 \u6838\u5fc3\u4ee3\u7801\u5b9e\u73b0<\/h3>\n\n\n\n<p><strong>SubmissionService.java \u5173\u952e\u65b9\u6cd5<\/strong><\/p>\n\n\n\n<p><strong>java<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npublic SubmissionResult executeCode(String code, String language, List&amp;lt;TestCase&gt; testCases) {\n    \/\/ 1. \u521b\u5efa\u4e34\u65f6\u6587\u4ef6\n    File tempFile = File.createTempFile(&quot;code_&quot;, getFileExtension(language));\n    tempFile.deleteOnExit();\n    \n    \/\/ 2. \u5305\u88c5\u4ee3\u7801\n    String wrappedCode = wrapCode(code, language, testCases);\n    Files.write(tempFile.toPath(), wrappedCode.getBytes());\n    \n    \/\/ 3. \u6784\u5efa\u6267\u884c\u547d\u4ee4\n    ProcessBuilder pb = new ProcessBuilder(getCommand(language, tempFile));\n    pb.redirectErrorStream(true);\n    \n    \/\/ 4. \u542f\u52a8\u8fdb\u7a0b\n    Process process = pb.start();\n    \n    \/\/ 5. \u8bfb\u53d6\u8f93\u51fa\uff08\u5e26\u8d85\u65f6\uff09\n    String output = readOutput(process.getInputStream());\n    \n    \/\/ 6. \u8d85\u65f6\u63a7\u5236\n    if (!process.waitFor(5, TimeUnit.SECONDS)) {\n        process.destroyForcibly();\n        return SubmissionResult.timeout();\n    }\n    \n    \/\/ 7. \u5bf9\u6bd4\u8f93\u51fa\n    boolean allPassed = compareOutput(output, testCases);\n    \n    return SubmissionResult.success(output, allPassed);\n}\n\n<\/pre><\/div>\n\n\n<p><strong>\u4ee3\u7801\u5305\u88c5\u793a\u4f8b\uff08Python\uff09<\/strong><\/p>\n\n\n\n<p><strong>java<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nprivate String wrapPythonCode(String userCode, List&amp;lt;TestCase&gt; testCases) {\n    StringBuilder wrapped = new StringBuilder();\n    wrapped.append(userCode).append(&quot;\\n\\n&quot;);\n    wrapped.append(&quot;if __name__ == '__main__':\\n&quot;);\n    \n    for (TestCase tc : testCases) {\n        String input = tc.getInput();\n        wrapped.append(&quot;    print(solution(&quot;).append(input).append(&quot;))\\n&quot;);\n    }\n    \n    return wrapped.toString();\n}\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">6.3 \u5b89\u5168\u673a\u5236<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8fdb\u7a0b\u9694\u79bb<\/strong>\uff1a\u6bcf\u6b21\u63d0\u4ea4\u72ec\u7acb\u8fdb\u7a0b\uff0c\u4e92\u4e0d\u5f71\u54cd<\/li>\n\n\n\n<li><strong>\u8d85\u65f6\u7ec8\u6b62<\/strong>\uff1a5\u79d2\u81ea\u52a8\u7ec8\u6b62\uff0c\u9632\u6b62\u6b7b\u5faa\u73af<\/li>\n\n\n\n<li><strong>\u8d44\u6e90\u9650\u5236<\/strong>\uff1a\u9650\u5236\u5185\u5b58\u548c CPU \u4f7f\u7528\uff08\u901a\u8fc7\u7cfb\u7edf\u914d\u7f6e\uff09<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u6c99\u7bb1<\/strong>\uff1a\u7981\u6b62\u6587\u4ef6\u64cd\u4f5c\u3001\u7f51\u7edc\u8bbf\u95ee\uff08\u53ef\u6269\u5c55\uff09<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e03\u3001AI \u5224\u9898\u7cfb\u7edf<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 \u6280\u672f\u9009\u578b<\/h3>\n\n\n\n<p><strong>\u7845\u57fa\u6d41\u52a8 DeepSeek-V3<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u63a8\u7406\u80fd\u529b\u5f3a<\/li>\n\n\n\n<li>\u6210\u672c\u4f4e\uff08\u00a51\/\u767e\u4e07 tokens\uff09<\/li>\n\n\n\n<li>\u652f\u6301\u6d41\u5f0f\u8f93\u51fa<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7.2 \u6838\u5fc3\u529f\u80fd<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9519\u8bef\u5206\u6790<\/strong>\uff1a\u8bc6\u522b\u8bed\u6cd5\u9519\u8bef\u3001\u903b\u8f91\u9519\u8bef<\/li>\n\n\n\n<li><strong>\u667a\u80fd\u63d0\u793a<\/strong>\uff1a\u63d0\u4f9b 3 \u7ea7\u6e10\u8fdb\u5f0f\u63d0\u793a<\/li>\n\n\n\n<li><strong>\u89e3\u9898\u601d\u8def<\/strong>\uff1a\u81ea\u52a8\u751f\u6210\u89e3\u9898\u601d\u8def\u6587\u6863<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u4f18\u5316\u5efa\u8bae<\/strong>\uff1a\u6027\u80fd\u3001\u53ef\u8bfb\u6027\u4f18\u5316<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">7.3 \u5b9e\u73b0\u65b9\u5f0f<\/h3>\n\n\n\n<p><strong>AIJudgeService.java<\/strong><\/p>\n\n\n\n<p><strong>java<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npublic String analyzeCode(String code, String error, String problemDesc) {\n    \/\/ \u6784\u5efa Prompt\n    String prompt = buildPrompt(code, error, problemDesc);\n    \n    \/\/ \u8c03\u7528\u7845\u57fa\u6d41\u52a8 API\n    HttpRequest request = HttpRequest.newBuilder()\n        .uri(URI.create(&quot;https:\/\/api.siliconflow.cn\/v1\/chat\/completions&quot;))\n        .header(&quot;Authorization&quot;, &quot;Bearer &quot; + apiKey)\n        .POST(HttpRequest.BodyPublishers.ofString(buildRequestBody(prompt)))\n        .build();\n    \n    \/\/ \u53d1\u9001\u8bf7\u6c42\u5e76\u83b7\u53d6\u54cd\u5e94\n    HttpResponse&amp;lt;String&gt; response = httpClient.send(request);\n    \n    \/\/ \u89e3\u6790 AI \u8fd4\u56de\u7684\u53cd\u9988\n    return parseAIResponse(response.body());\n}\n\n<\/pre><\/div>\n\n\n<p><strong>Prompt \u6a21\u677f<\/strong><\/p>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u4f60\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u7f16\u7a0b\u5bfc\u5e08\uff0c\u8bf7\u5206\u6790\u4ee5\u4e0b\u4ee3\u7801\uff1a\n\n\u9898\u76ee\u63cf\u8ff0\uff1a\n{problemDescription}\n\n\u7528\u6237\u4ee3\u7801\uff1a\n{userCode}\n\n\u9519\u8bef\u4fe1\u606f\uff1a\n{errorMessage}\n\n\u8bf7\u63d0\u4f9b\uff1a\n1. \u9519\u8bef\u539f\u56e0\u5206\u6790\n2. \u6539\u8fdb\u5efa\u8bae\n3. \u793a\u4f8b\u4ee3\u7801\uff08\u4e0d\u8981\u76f4\u63a5\u7ed9\u51fa\u5b8c\u6574\u7b54\u6848\uff09\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u516b\u3001API \u63a5\u53e3\u8bbe\u8ba1<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">8.1 \u8ba4\u8bc1\u76f8\u5173<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nPOST   \/api\/auth\/register    \u6ce8\u518c\nPOST   \/api\/auth\/login       \u767b\u5f55\nGET    \/api\/auth\/me          \u83b7\u53d6\u5f53\u524d\u7528\u6237\u4fe1\u606f\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">8.2 \u9898\u76ee\u76f8\u5173<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nGET    \/api\/challenges              \u83b7\u53d6\u9898\u76ee\u5217\u8868\nGET    \/api\/challenges\/{id}         \u83b7\u53d6\u9898\u76ee\u8be6\u60c5\nGET    \/api\/challenges\/{id}\/hints   \u83b7\u53d6\u63d0\u793a\nPOST   \/api\/challenges              \u521b\u5efa\u9898\u76ee\uff08\u7ba1\u7406\u5458\uff09\nPUT    \/api\/challenges\/{id}         \u66f4\u65b0\u9898\u76ee\uff08\u7ba1\u7406\u5458\uff09\nDELETE \/api\/challenges\/{id}         \u5220\u9664\u9898\u76ee\uff08\u7ba1\u7406\u5458\uff09\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">8.3 \u63d0\u4ea4\u76f8\u5173<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nPOST   \/api\/submissions             \u63d0\u4ea4\u4ee3\u7801\nGET    \/api\/submissions\/{id}        \u83b7\u53d6\u63d0\u4ea4\u8be6\u60c5\nGET    \/api\/submissions\/my          \u83b7\u53d6\u6211\u7684\u63d0\u4ea4\u8bb0\u5f55\nPOST   \/api\/submissions\/{id}\/ai-hint \u83b7\u53d6 AI \u63d0\u793a\uff08SSE\uff09\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">8.4 \u6392\u884c\u699c\u76f8\u5173<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nGET    \/api\/leaderboard             \u83b7\u53d6\u6392\u884c\u699c\nGET    \/api\/leaderboard\/me          \u83b7\u53d6\u6211\u7684\u6392\u540d\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">8.5 \u7528\u6237\u76f8\u5173<\/h3>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nGET    \/api\/users\/{id}              \u83b7\u53d6\u7528\u6237\u4fe1\u606f\nGET    \/api\/users\/{id}\/achievements \u83b7\u53d6\u7528\u6237\u6210\u5c31\nPUT    \/api\/users\/me                \u66f4\u65b0\u4e2a\u4eba\u4fe1\u606f\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">\u4e5d\u3001\u90e8\u7f72\u67b6\u6784<\/h2>\n\n\n\n<p><strong>code<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                    Nginx (\u7aef\u53e3 80\/443)                   \u2502\n\u2502                   \u53cd\u5411\u4ee3\u7406 + \u9759\u6001\u8d44\u6e90                     \u2502\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n             \u2502                      \u2502\n             \u2502 \/api\/*               \u2502 \/*\n             \u2502                      \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Spring Boot \u540e\u7aef     \u2502  \u2502  React \u524d\u7aef\u9759\u6001\u6587\u4ef6        \u2502\n\u2502  \u7aef\u53e3: 9000           \u2502  \u2502  (Vite \u6784\u5efa\u4ea7\u7269)           \u2502\n\u2502  - API \u670d\u52a1           \u2502  \u2502                            \u2502\n\u2502  - \u4ee3\u7801\u6267\u884c\u5f15\u64ce       \u2502  \u2502                            \u2502\n\u2502  - AI \u5224\u9898            \u2502  \u2502                            \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \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\u2518\n            \u2502\n            \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502    MySQL \u6570\u636e\u5e93       \u2502\n\u2502    \u7aef\u53e3: 3306         \u2502\n\u2502    - \u7528\u6237\u6570\u636e         \u2502\n\u2502    - \u9898\u76ee\u6570\u636e         \u2502\n\u2502    - \u63d0\u4ea4\u8bb0\u5f55         \u2502\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\u2518\n\n<\/pre><\/div>\n\n\n<p><strong>\u90e8\u7f72\u6b65\u9aa4<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6784\u5efa\u524d\u7aef\uff1a<code class=\"\">npm run build<\/code><\/li>\n\n\n\n<li>\u6784\u5efa\u540e\u7aef\uff1a<code class=\"\">mvn clean package<\/code><\/li>\n\n\n\n<li>\u542f\u52a8 MySQL \u6570\u636e\u5e93<\/li>\n\n\n\n<li>\u542f\u52a8\u540e\u7aef\u670d\u52a1\uff1a<code class=\"\">java -jar platform-1.0.0.jar<\/code><\/li>\n\n\n\n<li>\u914d\u7f6e Nginx \u53cd\u5411\u4ee3\u7406<\/li>\n\n\n\n<li>\u8bbf\u95ee\uff1a<code class=\"\">http:\/\/localhost<\/code><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u5341\u3001\u6280\u672f\u4eae\u70b9\u603b\u7ed3<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u81ea\u7814\u4ee3\u7801\u6267\u884c\u5f15\u64ce<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u4f9d\u8d56\u7b2c\u4e09\u65b9\u670d\u52a1<\/li>\n\n\n\n<li>\u652f\u6301\u591a\u8bed\u8a00\uff08Python\/JS\/Java\uff09<\/li>\n\n\n\n<li>\u5b8c\u5584\u7684\u5b89\u5168\u673a\u5236<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>AI \u667a\u80fd\u5224\u9898\u7cfb\u7edf<\/strong>\n<ul class=\"wp-block-list\">\n<li>DeepSeek-V3 \u6df1\u5ea6\u96c6\u6210<\/li>\n\n\n\n<li>\u6d41\u5f0f\u54cd\u5e94\uff08SSE\uff09\u63d0\u5347\u4f53\u9a8c<\/li>\n\n\n\n<li>\u4e2a\u6027\u5316\u9519\u8bef\u8bca\u65ad<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b8c\u6574\u7684\u7528\u6237\u6210\u957f\u4f53\u7cfb<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u7ecf\u9a8c\u7b49\u7ea7\u52a8\u6001\u8ba1\u7b97<\/li>\n\n\n\n<li>\u6210\u5c31\u7cfb\u7edf\u6fc0\u52b1\u5b66\u4e60<\/li>\n\n\n\n<li>\u5b9e\u65f6\u6392\u884c\u699c\u7ade\u4e89<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u73b0\u4ee3\u5316\u6280\u672f\u6808<\/strong>\n<ul class=\"wp-block-list\">\n<li>React 18 + TypeScript<\/li>\n\n\n\n<li>Spring Boot 3<\/li>\n\n\n\n<li>Monaco Editor\uff08VS Code \u540c\u6b3e\uff09<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u826f\u597d\u7684\u6269\u5c55\u6027<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u6a21\u5757\u5316\u8bbe\u8ba1<\/li>\n\n\n\n<li>\u63a5\u53e3\u89c4\u8303<\/li>\n\n\n\n<li>\u6613\u4e8e\u6dfb\u52a0\u65b0\u8bed\u8a00\u3001\u65b0\u9898\u76ee<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u9879\u76ee\u6982\u8ff0 \u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e AI \u667a\u80fd\u5224\u9898\u7684\u5728\u7ebf\u7f16\u7a0b\u5b66\u4e60\u5e73\u53f0\uff0c\u652f\u6301 Python\u3001JavaScript\u3001Jav &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/zcc609.online\/?p=122\" class=\"more-link\">Read more<span class=\"screen-reader-text\"> &#8220;AI \u7f16\u7a0b\u95ef\u5173\u5b66\u4e60\u5e73\u53f0 &#8211; \u6280\u672f\u603b\u7ed3&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-122","post","type-post","status-publish","format-standard","hentry","category-1"],"_links":{"self":[{"href":"https:\/\/zcc609.online\/index.php?rest_route=\/wp\/v2\/posts\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zcc609.online\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zcc609.online\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zcc609.online\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zcc609.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=122"}],"version-history":[{"count":1,"href":"https:\/\/zcc609.online\/index.php?rest_route=\/wp\/v2\/posts\/122\/revisions"}],"predecessor-version":[{"id":123,"href":"https:\/\/zcc609.online\/index.php?rest_route=\/wp\/v2\/posts\/122\/revisions\/123"}],"wp:attachment":[{"href":"https:\/\/zcc609.online\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zcc609.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zcc609.online\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}