{"id":20,"date":"2026-03-03T10:32:10","date_gmt":"2026-03-03T02:32:10","guid":{"rendered":"https:\/\/hsydfc.com\/?page_id=20"},"modified":"2026-04-21T08:59:03","modified_gmt":"2026-04-21T00:59:03","slug":"%e9%a6%96%e9%a1%b5","status":"publish","type":"page","link":"https:\/\/hsydfc.com\/","title":{"rendered":"\u6b22\u8fce\u60a8\u7684\u5230\u6765\uff01"},"content":{"rendered":"\n<p class=\"is-style-default has-base-color has-text-color has-link-color wp-elements-ab617eaf21429c13cf056ce50cdbd079\" style=\"line-height:1.9\"><strong>\u8fd9\u662f\u4e00\u4e2a\u667a\u80fd\u5316\u8db3\u7403\u8bad\u7ec3\u7f51\u7ad9\uff0c\u57fa\u4e8e\u56fd\u9645\u4f18\u79c0\u8db3\u7403\u4ff1\u4e50\u90e8\u7684\u8bad\u7ec3\u7279\u70b9\uff0c\u5b9a\u671f\u66f4\u65b0\u8bad\u7ec3\u6570\u636e\u7b97\u6cd5\uff0c\u4e3a\u5e7f\u5927\u8db3\u7403\u7231\u597d\u8005\u63d0\u4f9b\u5b66\u4e60\u53c2\u8003\u3002<\/strong><\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n    <title>\u5f18\u987a\u6bc5\u8fbe\u8db3\u7403\u8bad\u7ec3\u7cfb\u7edf | \u4e13\u4e1a\u6559\u6848\u751f\u6210<\/title>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n    <style>\n        * { margin: 0; padding: 0; box-sizing: border-box; }\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n            background: #000000;\n            color: #ffffff;\n            line-height: 1.47059;\n            letter-spacing: -0.022em;\n            -webkit-font-smoothing: antialiased;\n            overflow-x: hidden;\n        }\n        .ambient-bg { position: fixed; inset: 0; z-index: -2; background: #000000; }\n        .ambient-bg .orb { position: absolute; border-radius: 50%; filter: blur(100px); opacity: 0.35; animation: orbFloat 20s ease-in-out infinite; }\n        .ambient-bg .orb-1 { width: 600px; height: 600px; background: radial-gradient(circle, #bf5af2 0%, transparent 70%); top: -10%; left: -5%; }\n        .ambient-bg .orb-2 { width: 500px; height: 500px; background: radial-gradient(circle, #0a84ff 0%, transparent 70%); bottom: -10%; right: -5%; animation-delay: -7s; }\n        .ambient-bg .orb-3 { width: 400px; height: 400px; background: radial-gradient(circle, #ff375f 0%, transparent 70%); top: 40%; left: 60%; animation-delay: -14s; opacity: 0.25; }\n        @keyframes orbFloat { 0%,100%{transform:translate(0,0) scale(1);} 33%{transform:translate(30px,-30px) scale(1.1);} 66%{transform:translate(-20px,20px) scale(0.9);} }\n        .grid-overlay { position: fixed; inset: 0; z-index: -1; background-image: linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px); background-size: 60px 60px; pointer-events: none; mask-image: radial-gradient(circle at 50% 50%, black 0%, transparent 70%); }\n        .nav-main { position: fixed; top: 0; left: 0; right: 0; height: 68px; background: rgba(0,0,0,0.60); backdrop-filter: blur(24px); border-bottom: 1px solid rgba(255,255,255,0.06); z-index: 1000; display: flex; align-items: center; justify-content: space-between; padding: 0 32px; }\n        .nav-brand { display: flex; align-items: center; gap: 14px; }\n        .brand-icon { width: 36px; height: 36px; background: linear-gradient(135deg, #0a84ff, #bf5af2); border-radius: 10px; display: flex; align-items: center; justify-content: center; font-weight: 800; color: white; font-size: 20px; }\n        .brand-text { font-size: 22px; font-weight: 600; background: linear-gradient(135deg, #fff 0%, rgba(255,255,255,0.8) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n        .nav-actions { display: flex; align-items: center; gap: 20px; }\n        .lang-switch { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); color: rgba(255,255,255,0.7); padding: 8px 18px; border-radius: 980px; font-size: 13px; font-weight: 500; cursor: pointer; backdrop-filter: blur(12px); transition: all 0.45s cubic-bezier(0.25,0.8,0.25,1); display: flex; align-items: center; gap: 8px; }\n        .lang-switch:hover { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.25); color: white; transform: scale(1.05); }\n        .btn { display: inline-flex; align-items: center; justify-content: center; gap: 10px; padding: 12px 28px; border-radius: 980px; font-size: 16px; font-weight: 500; cursor: pointer; transition: all 0.45s cubic-bezier(0.25,0.8,0.25,1); border: none; outline: none; font-family: inherit; }\n        .btn-primary { background: linear-gradient(135deg, #0a84ff, #5e5ce6); color: white; box-shadow: 0 4px 24px rgba(10,132,255,0.35), inset 0 1px 0 rgba(255,255,255,0.2); }\n        .btn-primary:hover { transform: translateY(-2px) scale(1.02); box-shadow: 0 8px 32px rgba(10,132,255,0.45); }\n        .btn-secondary { background: rgba(255,255,255,0.06); color: white; border: 1px solid rgba(255,255,255,0.15); backdrop-filter: blur(12px); }\n        .btn-secondary:hover { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.3); transform: translateY(-2px); }\n        .card { background: rgba(30,30,32,0.65); backdrop-filter: blur(40px); border: 1px solid rgba(255,255,255,0.08); border-radius: 28px; padding: 32px; transition: all 0.45s cubic-bezier(0.25,0.8,0.25,1); position: relative; overflow: hidden; }\n        .selector-title { font-size: 13px; color: rgba(255,255,255,0.45); text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 12px; font-weight: 600; }\n        .input-field { width: 100%; background: #1c1c1e; border: 1.5px solid rgba(255,255,255,0.1); border-radius: 14px; padding: 14px 18px; color: white; font-size: 16px; font-family: inherit; outline: none; transition: all 0.45s cubic-bezier(0.25,0.8,0.25,1); }\n        .input-field:focus { border-color: #0a84ff; background: #2c2c2e; box-shadow: 0 0 0 4px rgba(10,132,255,0.15); }\n        select.input-field { appearance: none; background-image: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.7)' stroke-width='2'><polyline points='6 9 12 15 18 9'\/><\/svg>\"); background-repeat: no-repeat; background-position: right 18px center; }\n        .form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.2rem; }\n        .gender-group { display: flex; gap: 12px; flex-wrap: wrap; }\n        .gender-option { flex: 1; min-width: 80px; background: rgba(255,255,255,0.06); border: 1.5px solid rgba(255,255,255,0.08); border-radius: 980px; padding: 12px 16px; text-align: center; cursor: pointer; transition: all 0.45s cubic-bezier(0.25,0.8,0.25,1); font-size: 15px; font-weight: 500; color: rgba(255,255,255,0.7); }\n        .gender-option.active { background: linear-gradient(135deg, #0a84ff, #5e5ce6); border-color: transparent; color: white; box-shadow: 0 4px 16px rgba(10,132,255,0.3); }\n        .gender-option input { display: none; }\n        .plan-section { opacity: 0; visibility: hidden; transition: opacity 0.5s ease, visibility 0.5s ease; }\n        .plan-section.visible { opacity: 1; visibility: visible; }\n        .plan-header { text-align: center; margin-bottom: 1.5rem; border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 0.8rem; }\n        .plan-title { font-size: 1.8rem; font-weight: 700; background: linear-gradient(135deg, #fff, #64d2ff); -webkit-background-clip: text; background-clip: text; color: transparent; }\n        .plan-subtitle { color: rgba(255,255,255,0.45); font-size: 0.85rem; margin-top: 0.3rem; }\n        .plan-meta { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.8rem; margin: 1rem 0; background: rgba(255,255,255,0.04); padding: 0.6rem; border-radius: 20px; }\n        .meta-item { background: rgba(255,255,255,0.08); padding: 0.2rem 0.8rem; border-radius: 20px; font-size: 0.75rem; font-weight: 500; color: rgba(255,255,255,0.7); }\n        .session-card { margin: 1.2rem 0; page-break-inside: avoid; border-left: 4px solid #0a84ff; background: rgba(255,255,255,0.03); border-radius: 16px; overflow: hidden; }\n        .session-header { background: rgba(255,255,255,0.05); padding: 0.8rem 1.2rem; border-bottom: 1px solid rgba(255,255,255,0.08); display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; }\n        .session-name { font-weight: 700; font-size: 1.1rem; color: white; }\n        .session-time { background: rgba(255,255,255,0.08); padding: 0.2rem 0.8rem; border-radius: 20px; font-size: 0.75rem; font-weight: 500; }\n        .session-body { padding: 1rem 1.2rem; }\n        .session-desc { color: rgba(255,255,255,0.7); line-height: 1.5; margin-bottom: 0.8rem; }\n        .tips-box { background: rgba(10,132,255,0.08); padding: 0.8rem; border-radius: 12px; margin-top: 0.6rem; border-left: 3px solid #0a84ff; }\n        .tips-title { font-weight: 600; font-size: 0.8rem; color: #64d2ff; margin-bottom: 0.3rem; }\n        .safety-tip, .management-tip { background: rgba(255,159,10,0.08); border-left: 4px solid #ff9f0a; padding: 0.8rem; margin: 0.8rem 0; font-size: 0.75rem; color: rgba(255,255,255,0.7); border-radius: 12px; }\n        .management-tip { background: rgba(48,209,88,0.08); border-left-color: #30d158; }\n        .main-container { max-width: 1200px; margin: 0 auto; padding: 100px 32px 80px; }\n        @media (max-width: 768px) { .nav-main { padding: 0 16px; height: 60px; } .main-container { padding: 80px 20px 60px; } .form-grid { grid-template-columns: 1fr; } .gender-group { flex-direction: column; } }\n        .pdf-export-mode { background: white !important; color: black !important; }\n        .pdf-export-mode .plan-section, .pdf-export-mode .session-card, .pdf-export-mode .session-header, .pdf-export-mode .session-body, .pdf-export-mode .tips-box, .pdf-export-mode .safety-tip, .pdf-export-mode .management-tip { background: white !important; color: black !important; border-color: #ddd !important; }\n        .pdf-export-mode .plan-title, .pdf-export-mode .plan-subtitle, .pdf-export-mode .meta-item, .pdf-export-mode .session-name, .pdf-export-mode .session-time, .pdf-export-mode .tips-title, .pdf-export-mode .tips-content, .pdf-export-mode .session-desc { color: black !important; background: transparent !important; -webkit-text-fill-color: black !important; text-shadow: none !important; }\n        .pdf-export-mode .plan-title { background: none !important; -webkit-background-clip: unset !important; }\n        .export-hide { display: none !important; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"ambient-bg\"><div class=\"orb orb-1\"><\/div><div class=\"orb orb-2\"><\/div><div class=\"orb orb-3\"><\/div><\/div>\n    <div class=\"grid-overlay\"><\/div>\n    <nav class=\"nav-main\">\n        <div class=\"nav-brand\"><div class=\"brand-icon\">\u26bd<\/div><div class=\"brand-text\" data-i18n=\"appTitle\">\u5f18\u987a\u6bc5\u8fbe\u8db3\u7403\u8bad\u7ec3\u7cfb\u7edf<\/div><\/div>\n        <div class=\"nav-actions\">\n            <button class=\"lang-switch\" id=\"langSwitchBtn\">\n                <div style=\"width:16px;height:16px;border:2px solid currentColor;border-radius:50%;position:relative;\"><div style=\"position:absolute;top:50%;left:-2px;right:-2px;height:2px;background:currentColor;transform:translateY(-50%);\"><\/div><div style=\"position:absolute;top:50%;left:50%;width:8px;height:8px;border:2px solid currentColor;border-radius:50%;transform:translate(-50%,-50%);\"><\/div><\/div>\n                <span>English<\/span>\n            <\/button>\n        <\/div>\n    <\/nav>\n    <main class=\"main-container\">\n        <div class=\"card\" style=\"margin-bottom: 40px;\">\n            <h2 style=\"font-size: 28px; font-weight: 700; margin-bottom: 8px; text-align: center;\" data-i18n=\"cardTitle\">\u8bad\u7ec3\u53c2\u6570\u914d\u7f6e<\/h2>\n            <p style=\"text-align: center; color: rgba(255,255,255,0.45); margin-bottom: 32px;\" data-i18n=\"cardSubtitle\">\u79d1\u5b66\u5468\u671f \u00b7 \u667a\u80fd\u8d1f\u8377<\/p>\n            <div class=\"form-grid\" id=\"configForm\"><\/div>\n            <div style=\"display: flex; justify-content: center; gap: 1rem; margin-top: 2rem;\">\n                <button class=\"btn btn-primary\" id=\"generateBtn\" data-i18n=\"btnGenerate\">\u751f\u6210\u8bad\u7ec3\u8ba1\u5212<\/button>\n                <button class=\"btn btn-secondary\" id=\"exportPdfBtn\" data-i18n=\"btnExport\">\u5bfc\u51fa PDF<\/button>\n            <\/div>\n        <\/div>\n        <div class=\"plan-section\" id=\"planSection\">\n            <div class=\"plan-header\"><div class=\"plan-title\" id=\"planTitle\" data-i18n=\"planTitle\">\u5f18\u987a\u6bc5\u8fbe\u8db3\u7403\u8bad\u7ec3\u8ba1\u5212<\/div><div class=\"plan-subtitle\" id=\"planSubtitle\" data-i18n=\"planSubtitle\">\u57fa\u4e8e\u9752\u8bad\u4f53\u7cfb \u00b7 \u4e13\u9879\u80fd\u529b\u7ec3\u4e60\u53c2\u8003<\/div><\/div>\n            <div id=\"planContent\"><\/div>\n        <\/div>\n    <\/main>\n\n    <script>\n        (function(){\n            \/\/ ======================= \u8bed\u8a00\u5305 =======================\n            const i18n = {\n                zh: {\n                    appTitle: \"\u5f18\u987a\u6bc5\u8fbe\u8db3\u7403\u8bad\u7ec3\u7cfb\u7edf\",\n                    cardTitle: \"\u8bad\u7ec3\u53c2\u6570\u914d\u7f6e\",\n                    cardSubtitle: \"\u79d1\u5b66\u5468\u671f \u00b7 \u667a\u80fd\u8d1f\u8377\",\n                    btnGenerate: \"\u751f\u6210\u8bad\u7ec3\u8ba1\u5212\",\n                    btnExport: \"\u5bfc\u51fa PDF\",\n                    planTitle: \"\u5f18\u987a\u6bc5\u8fbe\u8db3\u7403\u8bad\u7ec3\u8ba1\u5212\",\n                    planSubtitle: \"\u57fa\u4e8e\u9752\u8bad\u4f53\u7cfb \u00b7 \u4e13\u9879\u80fd\u529b\u7ec3\u4e60\u53c2\u8003\",\n                    labels: {\n                        age: \"\u5e74\u9f84 (5-18)\", gender: \"\u6027\u522b\", players: \"\u4e0a\u8bfe\u4eba\u6570\", duration: \"\u8bad\u7ec3\u65f6\u957f(\u5206\u949f)\",\n                        objectiveCat: \"\u8bad\u7ec3\u8bfe\u76ee\u6807\", objectiveItem: \"\u5de5\u4f5c\u91cd\u70b9\",\n                        drillCategory: \"\u57fa\u7840\u80fd\u529b\", drillItem: \"\u7ec3\u4e60\u5185\u5bb9\",\n                        tacticCategory: \"\u6218\u672f\u5b89\u6392\", tacticItem: \"\u6218\u672f\u5185\u5bb9\",\n                        venue: \"\u8bad\u7ec3\u573a\u5730\", intensity: \"\u8bad\u7ec3\u5f3a\u5ea6\"\n                    },\n                    genderOptions: [\"\u7537\u5b50\",\"\u5973\u5b50\",\"\u6df7\u5408\"],\n                    venueOptions: [\"\u5929\u7136\u8349\u576a\",\"\u4eba\u9020\u8349\u576a\",\"\u6821\u56ed\u64cd\u573a\"],\n                    intensityOptions: [\"\u5eb7\u590d\u8bad\u7ec3\",\"\u4e2d\u7b49\u5f3a\u5ea6\",\"\u9ad8\u5f3a\u5ea6\",\"\u95f4\u6b47\u9ad8\u5f3a\u5ea6\"],\n                    sessionNames: {\n                        warmup: \"\ud83d\udd25 \u52a8\u6001\u6fc0\u6d3b & \u70ed\u8eab\", tech: \"\u26a1 \u6838\u5fc3\u6280\u672f\u73af\u8282\", tactic: \"\ud83d\udd04 \u6218\u672f\u60c5\u666f\u8bad\u7ec3\", game: \"\u26bd \u5bf9\u6297\u6bd4\u8d5b\", cooldown: \"\ud83e\uddd8 \u653e\u677e\u590d\u76d8\"\n                    },\n                    tips: {\n                        warmup: \"\u5fc3\u7387\u63d0\u5347\u81f3\u6700\u5927\u5fc3\u7387\u768460-70%\uff0c\u6ce8\u610f\u52a8\u4f5c\u6807\u51c6\uff0c\u9884\u9632\u635f\u4f24\u3002\",\n                        teaching: \"\u6559\u5b66\u91cd\u70b9\", tacticDetail: \"\u6218\u672f\u7ec6\u5316\", gameRule: \"\u6bd4\u8d5b\u89c4\u5219\", summary: \"\u603b\u7ed3\u8981\u70b9\",\n                        safety: \"\ud83d\udee1\ufe0f \u5b89\u5168\u63d0\u793a\", management: \"\ud83d\udccb \u8bad\u7ec3\u5efa\u8bae\"\n                    },\n                    warmupContent: {\n                        normal: \"\u6162\u8dd1 + \u52a8\u6001\u62c9\u4f38\uff08\u9ad8\u62ac\u817f\u3001\u540e\u8e22\u817f\u3001\u4fa7\u5411\u79fb\u52a8\uff09 + \u7403\u611f\u6fc0\u6d3b\uff08\u8e29\u7403\u3001\u62c9\u7403\uff09\",\n                        high: \"\uff0c\u52a0\u5165\u52a0\u901f\u8dd1\u548c\u53cd\u5e94\u8bad\u7ec3\",\n                        rehab: \"\u4f4e\u5f3a\u5ea6\u6162\u8dd1\u3001\u5173\u8282\u6d3b\u52a8\u3001\u9759\u6001\u62c9\u4f38\u4e3a\u4e3b\uff0c\u907f\u514d\u7206\u53d1\u529b\u52a8\u4f5c\u3002\"\n                    },\n                    gameRuleExtra: \"\u5e94\u7528\u4eca\u65e5\u8bad\u7ec3\u4e3b\u9898\uff0c\u8bbe\u7f6e\u5f97\u5206\u6761\u4ef6\uff08\u5982\u5b8c\u6210{objective}\u52a8\u4f5c\u5f97\u5206\u7ffb\u500d\uff09\u3002\u6839\u636e{intensity}\u5f3a\u5ea6\u63a7\u5236\u4f11\u606f\u65f6\u95f4\u3002\",\n                    coolContent: \"\u9759\u6001\u62c9\u4f38\uff08\u5927\u817f\u3001\u5c0f\u817f\u3001\u8170\u90e8\uff09 + \u6df1\u547c\u5438 + \u6559\u7ec3\u603b\u7ed3\uff0c\u9080\u8bf7\u7403\u5458\u5206\u4eab\u8bad\u7ec3\u611f\u53d7\u3002\u5e03\u7f6e\u8bfe\u540e\u4f5c\u4e1a\uff1a\u89c2\u770b\u76f8\u5173\u6bd4\u8d5b\u89c6\u9891\u7247\u6bb5\u3002\",\n                    techSep: \"\uff1a\", tacticSep: \"\uff1a\", techOrg: \"\u7ec4\u7ec7\", techCoach: \"\u6559\u7ec3\u91cd\u70b9\",\n                    tacticSetup: \"\u534a\u573a\u8bbe\u7f6e\u5f3a\u8c03\", tacticAttackDefend: \"\u8fdb\u653b\/\u9632\u5b88\u5404\", tacticRest: \"\u4eba\uff0c\u5269\u4f59\u4f5c\u4e3a\u4e2d\u7acb\u7403\u5458\",\n                    gameFormat: \"\u5bf9\u6297\u5f62\u5f0f\", gameField: \"\u573a\u5730\", gameGroups: \"\u5206\u7ec4\", gameDuration: \"\u65f6\u957f\", gameRules: \"\u89c4\u5219\",\n                    venueLabel: \"\u573a\u5730\",\n                    minutesUnit: \"\u5206\u949f\",\n                    matchRuleTip: \"\u9f13\u52b1\u5e94\u7528\u4eca\u65e5\u6218\u672f\uff0c\u6ce8\u610f\u4fdd\u62a4\u81ea\u5df1\u548c\u961f\u53cb\uff0c\u907f\u514d\u5371\u9669\u52a8\u4f5c\u3002\",\n                    reviewTip: \"\u56de\u987e\u4eca\u65e5{objective}\u8bad\u7ec3\u6210\u679c\uff0c\u8868\u626c\u4f18\u79c0\u8868\u73b0\uff0c\u5e03\u7f6e\u4e2a\u4eba\u6280\u80fd\u4f5c\u4e1a\u3002\",\n                    gamePlanTexts: {\n                        halfField: \"\u534a\u573a\", halfFieldSize: \"\u7ea640x60\u7c73\", smallPitch: \"\u5c0f\u573a\u5730\", smallPitchSize: \"\u7ea625x35\u7c73\",\n                        floaters: \"\u540d\u81ea\u7531\u4eba\", allSplit: \"\u5168\u4f53\u7403\u5458\u5206\u4e3a\u4e24\u961f\uff0c\u8fdb\u884c\u7edf\u4e00\u5bf9\u6297\u3002\",\n                        splitInto: \"\u5c06{players}\u4eba\u5206\u4e3a{numGroups}\u7ec4\uff0c\u6bcf\u7ec4\u7ea6{groupSize}\u4eba\uff0c\u518d\u5206\u4e3a\u4e24\u961f\u5bf9\u6297\u3002\u6bcf\u7ec4\u6bd4\u8d5b\u65f6\u95f4{rotateTime}\u5206\u949f\uff0c\u5faa\u73af\u8f6e\u6362\u3002\",\n                        rotationalDesc: \"\u5206\u7ec4\u8f6e\u6362\u5bf9\u6297\uff1a\u6bcf\u7ec4\u8fdb\u884c {perTeam} \u5bf9 {perTeam} \u5c0f\u573a\u5730\u6bd4\u8d5b\uff0c\u5171 {numGroups} \u7ec4\u540c\u65f6\u8fdb\u884c\uff0c\u6bcf{rotateTime}\u5206\u949f\u8f6e\u6362\u4e00\u6b21\u3002\",\n                        halfFieldDesc: \"{teamSize} \u5bf9 {teamSize} \u534a\u573a\u5bf9\u6297{floaters}\"\n                    },\n                    techOrgText: \"{players} \u4eba\uff0c\u5206\u6210 {groups} \u7ec4\uff0c\u8f6e\u6362\u8fdb\u884c\u3002\"\n                },\n                en: {\n                    appTitle: \"HSYD Football Training System\",\n                    cardTitle: \"Training Parameters\",\n                    cardSubtitle: \"Scientific Periodization \u00b7 Intelligent Load\",\n                    btnGenerate: \"Generate Plan\",\n                    btnExport: \"Export PDF\",\n                    planTitle: \"HSYD Football Training Plan\",\n                    planSubtitle: \"Based on Youth System \u00b7 Special Ability Practice\",\n                    labels: {\n                        age: \"Age (5-18)\", gender: \"Gender\", players: \"Players\", duration: \"Duration (min)\",\n                        objectiveCat: \"Training Goal\", objectiveItem: \"Key Focus\",\n                        drillCategory: \"Core Ability\", drillItem: \"Practice Content\",\n                        tacticCategory: \"Tactical Arrangement\", tacticItem: \"Tactical Content\",\n                        venue: \"Training Venue\", intensity: \"Intensity\"\n                    },\n                    genderOptions: [\"Male\",\"Female\",\"Mixed\"],\n                    venueOptions: [\"Natural Grass\",\"Artificial Turf\",\"School Field\"],\n                    intensityOptions: [\"Rehab\",\"Moderate\",\"High\",\"HIIT\"],\n                    sessionNames: {\n                        warmup: \"\ud83d\udd25 Dynamic Warm-up\", tech: \"\u26a1 Core Technique\", tactic: \"\ud83d\udd04 Tactical Scenario\", game: \"\u26bd Match Play\", cooldown: \"\ud83e\uddd8 Cool-down\"\n                    },\n                    tips: {\n                        warmup: \"Raise HR to 60-70% of max, focus on movement quality.\",\n                        teaching: \"Coaching Focus\", tacticDetail: \"Tactical Details\", gameRule: \"Match Rules\", summary: \"Key Takeaways\",\n                        safety: \"\ud83d\udee1\ufe0f Safety Tips\", management: \"\ud83d\udccb Coaching Advice\"\n                    },\n                    warmupContent: {\n                        normal: \"Jogging + dynamic stretching (high knees, heel kicks) + ball familiarization\",\n                        high: \", add acceleration and reaction drills\",\n                        rehab: \"Low-intensity jogging, joint mobility, static stretching.\"\n                    },\n                    gameRuleExtra: \"Apply today's theme. Bonus scoring for {objective} actions. Rest per {intensity}.\",\n                    coolContent: \"Static stretching + deep breathing + coach summary. Homework: watch match clips.\",\n                    techSep: \" practice: \", tacticSep: \" tactical drill: \", techOrg: \"Organization\", techCoach: \"Coach focus\",\n                    tacticSetup: \"Half-field setup emphasizing\", tacticAttackDefend: \"Attack\/defend each\", tacticRest: \"players, rest neutrals.\",\n                    gameFormat: \"Format\", gameField: \"Field\", gameGroups: \"Groups\", gameDuration: \"Duration\", gameRules: \"Rules\",\n                    venueLabel: \"Venue\",\n                    minutesUnit: \"min\",\n                    matchRuleTip: \"Encourage tactics. Protect yourself and teammates.\",\n                    reviewTip: \"Review {objective} achievements, praise performance, assign homework.\",\n                    gamePlanTexts: {\n                        halfField: \"Half-field\", halfFieldSize: \"\u224840x60m\", smallPitch: \"Small pitch\", smallPitchSize: \"\u224825x35m\",\n                        floaters: \" floater(s)\", allSplit: \"All players split into two teams.\",\n                        splitInto: \"Split {players} players into {numGroups} groups of ~{groupSize}, each split into two teams. Rotate every {rotateTime} min.\",\n                        rotationalDesc: \"Rotational groups: {perTeam}v{perTeam} small-sided, {numGroups} groups simultaneously, rotate every {rotateTime} min.\",\n                        halfFieldDesc: \"{teamSize} v {teamSize} half-field{floaters}\"\n                    },\n                    techOrgText: \"{players} players split into {groups} groups, rotate.\"\n                }\n            };\n\n            let currentLang = 'zh';\n\n            \/\/ ======================= \u6570\u636e\u5b9a\u4e49 =======================\n            const drillCategories = {\n                zh: { \"\u6280\u672f\u7ec3\u4e60\": [\"\u7403\u611f\u7ec3\u4e60\",\"\u4f20\u63a5\u7403\",\"\u8fd0\u63a7\u7403\",\"\u5c04\u95e8\",\"\u5934\u9876\u7403\",\"1\u5bf91\u7a81\u7834\"], \"\u5c0f\u7ec4\u6218\u672f\u7ec3\u4e60\": [\"2\u5bf91\",\"2\u5bf92\",\"3\u5bf92\",\"3\u5bf93\",\"\u5899\u5f0f\u914d\u5408\",\"\u4e8c\u8fc7\u4e00\",\"\u4ea4\u53c9\u63a9\u62a4\"], \"\u6574\u4f53\u6218\u672f\u7ec3\u4e60\": [\"Rondo\u62a2\u5708\",\"\u5c0f\u573a\u5730\u6bd4\u8d5b\",\"\u4f4d\u7f6e\u6e38\u620f\",\"\u653b\u9632\u8f6c\u6362\",\"\u5b9a\u5411\u6bd4\u8d5b\",\"\u5168\u573a\u5bf9\u6297\"], \"\u4e13\u9879\u529f\u80fd\u7ec3\u4e60\": [\"\u53cd\u51fb\u8bad\u7ec3\",\"\u4f4d\u7f6e\u8f6e\u6362\",\"\u8fb9\u8def\u4f20\u4e2d\",\"\u540e\u573a\u51fa\u7403\",\"\u524d\u573a\u538b\u8feb\",\"\u5b9a\u4f4d\u7403\"], \"\u8eab\u4f53\u4e0e\u5fc3\u7406\u7ec3\u4e60\": [\"\u901f\u5ea6\u7075\u654f\",\"\u6838\u5fc3\u529b\u91cf\",\"\u534f\u8c03\u6027\",\"\u51b3\u7b56\u6e38\u620f\",\"\u626b\u63cf\u7ec3\u4e60\"] },\n                en: { \"Technical\": [\"Ball Familiarity\",\"Passing\",\"Dribbling\",\"Shooting\",\"Heading\",\"1v1 Attacking\"], \"Small Group\": [\"2v1\",\"2v2\",\"3v2\",\"3v3\",\"Wall Pass\",\"Give-and-Go\",\"Overlapping\"], \"Team Tactical\": [\"Rondo\",\"SSG\",\"Positional Game\",\"Transition Game\",\"Conditioned Game\",\"Full-sided\"], \"Specialized\": [\"Counter-attack\",\"Rotation\",\"Crossing\",\"Build-up\",\"Forward Pressing\",\"Set-piece\"], \"Physical & Mental\": [\"Speed\/Agility\",\"Core Strength\",\"Coordination\",\"Decision Game\",\"Scanning\"] }\n            };\n            const tacticCategories = {\n                zh: { \"\u63a7\u7403\u9636\u6bb5\": [\"\u540e\u573a\u7ec4\u7ec7\",\"\u540e\u573a\u957f\u4f20\",\"\u4e2d\u573a\u63a7\u5236\",\"\u8fb9\u8def\u8fdb\u653b\",\"\u4e2d\u8def\u6e17\u900f\",\"\u5feb\u901f\u63a8\u8fdb\",\"\u63a7\u7403\u6d88\u8017\",\"\u5782\u76f4\u8fdb\u653b\"], \"\u65e0\u7403\u9636\u6bb5\": [\"\u9ad8\u4f4d\u538b\u8feb\",\"\u4e2d\u573a\u538b\u8feb\",\"\u4f4e\u4f4d\u9632\u5b88\",\"\u4eba\u76ef\u4eba\",\"\u533a\u57df\u9632\u5b88\",\"\u6df7\u5408\u9632\u5b88\",\"\u9632\u7ebf\u63a7\u5236\"], \"\u8f6c\u6362\u9636\u6bb5\": [\"\u7acb\u5373\u53cd\u62a2\",\"\u5feb\u901f\u56de\u9632\",\"\u5feb\u901f\u53cd\u51fb\",\"\u63a7\u5236\u8f6c\u6362\",\"\u8fb9\u8def\u8f6c\u6362\",\"\u4e2d\u8def\u8f6c\u6362\"], \"\u5b9a\u4f4d\u7403\u9636\u6bb5\": [\"\u89d2\u7403\u8fdb\u653b\",\"\u89d2\u7403\u9632\u5b88\",\"\u4efb\u610f\u7403\u8fdb\u653b\",\"\u4efb\u610f\u7403\u9632\u5b88\",\"\u754c\u5916\u7403\u6218\u672f\",\"\u70b9\u7403\u8bad\u7ec3\"], \"\u9635\u578b\u4f53\u7cfb\": [\"4-3-3\",\"4-2-3-1\",\"4-4-2\",\"3-5-2\",\"3-4-3\",\"5-4-1\"] },\n                en: { \"In Possession\": [\"Build-up\",\"Long ball\",\"Midfield control\",\"Wing play\",\"Central penetration\",\"Fast progression\",\"Possession drain\",\"Vertical attack\"], \"Out of Possession\": [\"High press\",\"Midfield press\",\"Low block\",\"Man-marking\",\"Zonal defense\",\"Mixed defense\",\"Offside trap\"], \"Transitions\": [\"Counter-press\",\"Quick recovery\",\"Fast break\",\"Controlled\",\"Wing transition\",\"Central transition\"], \"Set Pieces\": [\"Corner attack\",\"Corner defense\",\"Free-kick attack\",\"Free-kick defense\",\"Throw-in\",\"Penalty\"], \"Formations\": [\"4-3-3\",\"4-2-3-1\",\"4-4-2\",\"3-5-2\",\"3-4-3\",\"5-4-1\"] }\n            };\n            const objectiveData = {\n                zh: {\n                    \"\u63a7\u7403\u4e0e\u7ec4\u7ec7\": { \"\u63a7\u7403\": \"\u53d7\u538b\u73af\u5883\u4e0b\u4fdd\u6301\u7403\u6743\uff0c\u7b2c\u4e00\u89e6\u7403\u8d28\u91cf\", \"\u4f20\u63a7\": \"\u77ed\u4f20\u914d\u5408\u63a7\u5236\u8282\u594f\uff0c\u5efa\u7acb\u4e09\u89d2\u652f\u63f4\", \"\u540e\u573a\u7ec4\u7ec7\": \"\u95e8\u5c06+\u540e\u536b\u7ebf\u7834\u89e3\u9ad8\u4f4d\u538b\u8feb\", \"\u4e2d\u573a\u63a8\u8fdb\": \"\u7b2c\u4e09\u4eba\u8dd1\u4f4d\u4e0e\u5899\u5f0f\u914d\u5408\u7a81\u7834\u4e2d\u573a\", \"\u7834\u5bc6\u96c6\u9632\u5b88\": \"\u5bbd\u5ea6\u62c9\u626f\u4e0e\u4ea4\u53c9\u6362\u4f4d\u521b\u9020\u7a7a\u95f4\", \"\u8282\u594f\u63a7\u5236\": \"\u5feb\u6162\u8f6c\u6362\u4e0e\u5ef6\u7f13\/\u52a0\u901f\u65f6\u673a\" },\n                    \"\u8fdb\u653b\u4e0e\u7ec8\u7ed3\": { \"\u7ec8\u7ed3\": \"\u5c04\u95e8\u7cbe\u5ea6\u4e0e\u529b\u91cf\uff08\u8fd0\u52a8\u6218\/\u5b9a\u4f4d\u7403\/1v1\uff09\", \"\u8fb9\u8def\u8fdb\u653b\": \"\u8fb9\u950b\u7a81\u7834\u3001\u5957\u8fb9\u63d2\u4e0a\u3001\u4e0b\u5e95\u4f20\u4e2d\", \"\u4e2d\u8def\u6e17\u900f\": \"\u76f4\u585e\u7403\u3001\u649e\u5899\u914d\u5408\u3001\u524d\u8170\u7a7f\u63d2\", \"\u5feb\u901f\u53cd\u51fb\": \"\u7531\u5b88\u8f6c\u653b\u7eb5\u5411\u7a7a\u95f4\u5229\u7528\", \"\u5b9a\u4f4d\u7403\u8fdb\u653b\": \"\u89d2\u7403\/\u4efb\u610f\u7403\/\u754c\u5916\u7403\u6218\u672f\u8bbe\u8ba1\", \"\u4ea4\u53c9\u6362\u4f4d\": \"\u4f4d\u7f6e\u4e92\u6362\u6253\u4e71\u76ef\u4eba\u4f53\u7cfb\", \"\u7b2c\u4e09\u4eba\u63d2\u4e0a\": \"\u5899\u5f0f\u914d\u5408\u540e\u7b2c\u4e09\u540d\u7403\u5458\u65f6\u673a\u628a\u63e1\" },\n                    \"\u9632\u5b88\u4e0e\u538b\u8feb\": { \"\u9632\u5b88\": \"\u79fb\u52a8\u6b65\u4f10\u3001\u62a2\u7403\u3001\u65ad\u7403\u3001\u5c01\u5835\u6280\u672f\", \"\u9ad8\u4f4d\u538b\u8feb\": \"\u524d\u573a\u4e09\u533a\u6574\u4f53\u538b\u8feb\uff0c\u5265\u593a\u6301\u7403\u4eba\u65f6\u95f4\", \"\u4e2d\u573a\u62e6\u622a\": \"\u5efa\u7acb\u4e2d\u573a\u5c4f\u969c\uff0c\u5207\u65ad\u5411\u524d\u4f20\u7403\", \"\u6df1\u5ea6\u9632\u5b88\": \"\u4f4e\u4f4d\u9632\u5b88\u7ec4\u7ec7\uff0c\u9632\u7ebf\u7d27\u51d1\u4fdd\u62a4\u7403\u95e8\", \"\u7531\u653b\u8f6c\u5b88\": \"\u4e22\u7403\u540e\u7acb\u5373\u53cd\u62a2\", \"\u5b9a\u4f4d\u7403\u9632\u5b88\": \"\u4eba\u5899\u7ec4\u7ec7\u3001\u76ef\u4eba\u5206\u5de5\u3001\u7a7a\u95f4\u63a7\u5236\", \"1\u5bf91\u9632\u5b88\": \"\u6b63\u9762\/\u4fa7\u9762\/\u80cc\u540e\u9632\u5b88\u4e0e\u9a71\u8d76\u65b9\u5411\" },\n                    \"\u8f6c\u6362\u4e0e\u8fc7\u6e21\": { \"\u653b\u5b88\u8f6c\u6362\": \"\u56db\u4e2a\u6bd4\u8d5b\u65f6\u523b\u5feb\u901f\u5207\u6362\", \"\u7acb\u5373\u538b\u8feb\": \"\u4e22\u7403\u540e5\u79d2\u5185\u538b\u8feb\u5229\u7528\u5bf9\u624b\u6df7\u4e71\", \"\u5feb\u901f\u56de\u9632\": \"\u56de\u64a4\u5f62\u6210\u4eba\u6570\u4f18\u52bf\u4e0e\u9632\u7ebf\u7d27\u51d1\", \"\u7eb5\u5411\u63a8\u8fdb\": \"\u5f97\u7403\u540e\u7b2c\u4e00\u65f6\u95f4\u5411\u524d\u4f20\u7403\/\u8fd0\u7403\" },\n                    \"\u8eab\u4f53\u7d20\u8d28\": { \"\u901f\u5ea6\": \"\u65e0\u7403\/\u6709\u7403\/\u53cd\u5e94\/\u51b3\u7b56\u901f\u5ea6\u7efc\u5408\", \"\u7075\u654f\u534f\u8c03\": \"\u53d8\u5411\u3001\u5e73\u8861\u3001\u8282\u594f\u611f\u3001\u7a7a\u95f4\u611f\u77e5\", \"\u6838\u5fc3\u529b\u91cf\": \"\u8eaf\u5e72\u7a33\u5b9a\u6027\u3001\u5bf9\u6297\u3001\u4e89\u9876\u3001\u62a4\u7403\", \"\u8010\u529b\": \"\u6709\u6c27\u4e0e\u65e0\u6c27\u8010\u529b\u4fdd\u8bc1\u672b\u6bb5\u8d28\u91cf\", \"\u7206\u53d1\u529b\": \"\u77ed\u51b2\u3001\u8d77\u8df3\u3001\u542f\u52a8\u4e0e\u6025\u505c\u5236\u52a8\" },\n                    \"\u5fc3\u667a\u4e0e\u793e\u4ea4\": { \"\u51b3\u7b56\u80fd\u529b\": \"\u9ad8\u538b\u4e0b\u6b63\u786e\u6280\u672f\u4e0e\u6218\u672f\u9009\u62e9\", \"\u89c2\u5bdf\u626b\u63cf\": \"\u63a5\u7403\u524d360\u5ea6\u89c2\u5bdf\", \"\u6c9f\u901a\u534f\u4f5c\": \"\u8bed\u8a00\/\u624b\u52bf\u6c9f\u901a\u4e0e\u56e2\u961f\u51dd\u805a\u529b\", \"\u6297\u538b\u80fd\u529b\": \"\u75b2\u52b3\/\u843d\u540e\/\u5931\u8bef\u540e\u60c5\u7eea\u8c03\u63a7\", \"\u521b\u9020\u529b\": \"\u975e\u5e38\u89c4\u6280\u672f\u4e0e\u6218\u672f\u5373\u5174\u53d1\u6325\" }\n                },\n                en: {\n                    \"Possession & Build-up\": { \"Possession\": \"Maintain ball under pressure, first touch quality\", \"Passing Control\": \"Short passes to control tempo\", \"Build-up from back\": \"GK+defenders break high press\", \"Midfield Progression\": \"Third-man runs & wall passes\", \"Breaking low block\": \"Width & crosses to create space\", \"Tempo Control\": \"Slow\/fast transitions\" },\n                    \"Attack & Finishing\": { \"Finishing\": \"Shooting accuracy\/power\", \"Wing Play\": \"Winger dribble, overlap, cross\", \"Central Penetration\": \"Through balls, wall passes\", \"Counter-attack\": \"Vertical space exploitation\", \"Set-piece Attack\": \"Corner\/free-kick routines\", \"Interchanging\": \"Position swap\", \"Third-man Run\": \"Timing of the third player\" },\n                    \"Defense & Pressing\": { \"Defending\": \"Footwork, tackling, blocking\", \"High Press\": \"Collective pressure in front third\", \"Midfield Interception\": \"Screen to cut forward passes\", \"Deep Defense\": \"Low block organization\", \"Transition to Defend\": \"Immediate counter-press\", \"Set-piece Defense\": \"Wall organization, marking\", \"1v1 Defense\": \"Front\/side\/back defending\" },\n                    \"Transitions\": { \"Transition\": \"Quick switch between moments\", \"Immediate Press\": \"Press within 5 seconds\", \"Quick Recovery\": \"Drop back to create numbers\", \"Vertical Progression\": \"First-time forward pass\" },\n                    \"Physical\": { \"Speed\": \"Off-ball\/on-ball\/reaction speed\", \"Agility & Coordination\": \"Direction change, balance\", \"Core Strength\": \"Trunk stability, duels\", \"Endurance\": \"Aerobic & anaerobic\", \"Explosiveness\": \"Short sprint, jump\" },\n                    \"Mental & Social\": { \"Decision Making\": \"Correct choice under pressure\", \"Scanning\": \"360\u00b0 observation\", \"Communication\": \"Verbal\/non-verbal cues\", \"Resilience\": \"Emotion regulation\", \"Creativity\": \"Unconventional techniques\" }\n                }\n            };\n            const drillTips = { zh: { \"\u7403\u611f\u7ec3\u4e60\":\"\u6bcf\u4eba\u4e00\u7403\uff0c\u539f\u5730\u8e29\u7403\u3001\u62c9\u7403\u3001\u62e8\u7403\uff0c\u8fdb\u9636\u79fb\u52a8\u4e2d\u5b8c\u6210\u3002\", \"\u4f20\u63a5\u7403\":\"2-3\u4eba\u4e00\u7ec4\uff0c\u77ed\u4f20\u3001\u957f\u4f20\u3001\u4e00\u811a\u4f20\u7403\u3002\" }, en: { \"Ball Familiarity\":\"Toe taps, pulls, rolls, progress to moving.\", \"Passing\":\"Groups of 2-3, short\/long\/one-touch passing.\" } };\n            function getDrillTip(drill, lang) { return (drillTips[lang] && drillTips[lang][drill]) || (lang==='zh'?\"\u6839\u636e\u9879\u76ee\u7279\u70b9\uff0c\u8bbe\u7f6e\u5408\u9002\u573a\u5730\u548c\u5668\u6750\u3002\":\"Set up appropriate area and equipment.\"); }\n            const tacticTips = { zh: { \"\u540e\u573a\u7ec4\u7ec7\":\"\u95e8\u5c06\u53c2\u4e0e\u77ed\u4f20\uff0c\u4e2d\u536b\u62c9\u5f00\u5bbd\u5ea6\uff0c\u540e\u8170\u56de\u64a4\u63a5\u5e94\u3002\", \"\u9ad8\u4f4d\u538b\u8feb\":\"\u524d\u950b\u7ebf\u6574\u4f53\u538b\u8feb\uff0c\u4e22\u7403\u540e6\u79d2\u53cd\u62a2\u3002\" }, en: { \"Build-up\":\"GK joins short passing, CBs spread, DM drops.\", \"High press\":\"Forwards press as unit, 6-sec counter-press.\" } };\n            function getTacticTip(tactic, lang) { return (tacticTips[lang] && tacticTips[lang][tactic]) || (lang==='zh'?\"\u6839\u636e\u6218\u672f\u8981\u6c42\uff0c\u5728\u8bad\u7ec3\u4e2d\u5f3a\u8c03\u4f4d\u7f6e\u804c\u8d23\u3002\":\"Emphasize positional duties.\"); }\n            const safetyTips = { zh: [\"\u8bad\u7ec3\u524d\u5fc5\u987b\u8fdb\u884c\u81f3\u5c1110\u5206\u949f\u52a8\u6001\u70ed\u8eab\u3002\",\"\u8865\u6c34\u539f\u5219\uff1a\u6bcf15-20\u5206\u949f\u8865\u5145150-200ml\u6c34\u5206\u3002\",\"\u9634\u96e8\u5929\u6ce8\u610f\u573a\u5730\u6e7f\u6ed1\uff0c\u51cf\u5c11\u53d8\u5411\u51b2\u523a\u3002\"], en: [\"Warm up dynamically for at least 10 minutes.\",\"Hydrate every 15-20 min with 150-200ml.\",\"Be careful on wet pitches.\"] };\n            const managementTips = { zh: [\"\u6839\u636e\u5e74\u9f84\u548c\u4f53\u80fd\u5dee\u5f02\u5206\u7ec4\uff0c\u907f\u514d\u5f3a\u5f31\u60ac\u6b8a\u3002\",\"\u6bcf\u8282\u8bad\u7ec3\u8bfe\u8bbe\u7f6e\u660e\u786e\u7684\u5c0f\u76ee\u6807\uff0c\u589e\u5f3a\u6210\u5c31\u611f\u3002\",\"\u8bad\u7ec3\u4e2d\u591a\u4f7f\u7528\u79ef\u6781\u9f13\u52b1\uff0c\u5c11\u7528\u6279\u8bc4\u3002\"], en: [\"Group by age and fitness to avoid huge gaps.\",\"Set clear mini-goals for each session.\",\"Use positive reinforcement.\"] };\n            function getRandomItem(arr) { return arr[Math.floor(Math.random() * arr.length)]; }\n            function ageStage(age, lang) { if (age <= 8) return lang==='zh'?\"U8 \u542f\u8499\u9636\u6bb5\":\"U8 Foundation\"; if (age <= 12) return lang==='zh'?\"U12 \u6280\u672f\u9ec4\u91d1\u671f\":\"U12 Technical\"; if (age <= 15) return lang==='zh'?\"U15 \u6218\u672f\u8fdb\u9636\u671f\":\"U15 Tactical\"; return lang==='zh'?\"U18 \u7cbe\u82f1\u8868\u73b0\u671f\":\"U18 Elite\"; }\n            function allocateTime(total) { return { warm: Math.round(total*0.12), tech: Math.round(total*0.28), tactic: Math.round(total*0.52), cool: total - Math.round(total*0.12) - Math.round(total*0.28) - Math.round(total*0.52) }; }\n            function getGamePlan(players, tacticTime, lang) {\n                let gameMinutes = Math.round(tacticTime * 0.6);\n                const txt = i18n[lang].gamePlanTexts;\n                if (players <= 14) {\n                    let teamSize = Math.floor(players\/2), rem = players%2;\n                    let floatersText = rem > 0 ? ` + ${rem}${txt.floaters}` : '';\n                    let description = txt.halfFieldDesc.replace(\/\\{teamSize\\}\/g, teamSize).replace(\/\\{floaters\\}\/g, floatersText);\n                    let field = `${txt.halfField} (${txt.halfFieldSize})`;\n                    let groupInfo = txt.allSplit;\n                    return { description, field, groupInfo, gameMinutes };\n                } else {\n                    let numGroups = Math.ceil(players\/7), groupSize = Math.ceil(players\/numGroups), perTeam = Math.floor(groupSize\/2), rotateTime = Math.ceil(gameMinutes \/ numGroups);\n                    let description = txt.rotationalDesc.replace(\/\\{perTeam\\}\/g, perTeam).replace(\/\\{numGroups\\}\/g, numGroups).replace(\/\\{rotateTime\\}\/g, rotateTime);\n                    let field = `${txt.smallPitch} (${txt.smallPitchSize})`;\n                    let groupInfo = txt.splitInto.replace(\/\\{players\\}\/g, players).replace(\/\\{numGroups\\}\/g, numGroups).replace(\/\\{groupSize\\}\/g, groupSize).replace(\/\\{rotateTime\\}\/g, rotateTime);\n                    return { description, field, groupInfo, gameMinutes };\n                }\n            }\n\n            function generatePlanHTML(lang) {\n                const age = parseInt(document.getElementById('age').value);\n                const genderElem = document.querySelector('input[name=\"gender\"]:checked');\n                const gender = genderElem ? genderElem.value : (lang==='zh'?\"\u7537\u5b50\":\"Male\");\n                const players = parseInt(document.getElementById('players').value);\n                const duration = parseInt(document.getElementById('duration').value);\n                const objectiveCat = document.getElementById('objectiveCat').value;\n                const objectiveItem = document.getElementById('objectiveItem').value;\n                const objectiveDesc = objectiveData[lang][objectiveCat][objectiveItem];\n                const drill = document.getElementById('drillItem').value;\n                const tactic = document.getElementById('tacticItem').value;\n                const intensity = document.getElementById('intensity').value;\n                const venue = document.getElementById('venue').value;\n                const times = allocateTime(duration);\n                const stage = ageStage(age, lang);\n                const drillTip = getDrillTip(drill, lang);\n                const tacticTip = getTacticTip(tactic, lang);\n                const safetyTip = getRandomItem(safetyTips[lang]);\n                const managementTip = getRandomItem(managementTips[lang]);\n                const gamePlan = getGamePlan(players, times.tactic, lang);\n                const txt = i18n[lang];\n                let warmupContent = txt.warmupContent.normal;\n                if (intensity === \"\u9ad8\u5f3a\u5ea6\" || intensity === \"High\") warmupContent += txt.warmupContent.high;\n                if (intensity === \"\u5eb7\u590d\u8bad\u7ec3\" || intensity === \"Rehabilitation\") warmupContent = txt.warmupContent.rehab;\n                let groupsCount = Math.ceil(players\/6);\n                let techOrg = txt.techOrgText.replace(\/\\{players\\}\/g, players).replace(\/\\{groups\\}\/g, groupsCount);\n                let techContent = `${drill}${txt.techSep}${drillTip}<br>${txt.techOrg}\uff1a${techOrg} ${txt.techCoach}\uff1a${objectiveDesc}\u3002`;\n                let tacticContent = `${tactic}${txt.tacticSep}${tacticTip}<br>${txt.tacticSetup} ${objectiveItem}\u3002${txt.tacticAttackDefend} ${Math.floor(players\/2)} ${txt.tacticRest}`;\n                let gameContent = `<strong>${txt.gameFormat}\uff1a<\/strong> ${gamePlan.description}<br><strong>${txt.gameField}\uff1a<\/strong> ${gamePlan.field}<br><strong>${txt.gameGroups}\uff1a<\/strong> ${gamePlan.groupInfo}<br><strong>${txt.gameDuration}\uff1a<\/strong> ${gamePlan.gameMinutes} ${txt.minutesUnit}<br><strong>${txt.gameRules}\uff1a<\/strong> ${txt.gameRuleExtra.replace('{objective}',objectiveItem).replace('{intensity}',intensity)}<br><strong>${txt.venueLabel}\uff1a<\/strong> ${venue}`;\n                let coolContent = txt.coolContent;\n                return `\n                    <div class=\"plan-meta\">\n                        <span class=\"meta-item\">\ud83d\udccc ${stage}<\/span>\n                        <span class=\"meta-item\">\u26a7 ${gender}<\/span>\n                        <span class=\"meta-item\">\ud83d\udc65 ${players}<\/span>\n                        <span class=\"meta-item\">\u23f1\ufe0f ${duration}${txt.minutesUnit}<\/span>\n                        <span class=\"meta-item\">\ud83c\udfaf ${objectiveItem}<\/span>\n                        <span class=\"meta-item\">\ud83d\udd25 ${intensity}<\/span>\n                        <span class=\"meta-item\">\ud83c\udfdf\ufe0f ${venue}<\/span>\n                    <\/div>\n                    <div class=\"session-card\"><div class=\"session-header\"><span class=\"session-name\">${txt.sessionNames.warmup}<\/span><span class=\"session-time\">${times.warm} ${txt.minutesUnit}<\/span><\/div><div class=\"session-body\"><div class=\"session-desc\">${warmupContent}<\/div><div class=\"tips-box\"><div class=\"tips-title\">\ud83d\udca1 ${lang==='zh'?'\u7ec3\u4e60\u63d0\u793a':'Drill Tip'}<\/div><div class=\"tips-content\">${txt.tips.warmup}<\/div><\/div><\/div><\/div>\n                    <div class=\"session-card\"><div class=\"session-header\"><span class=\"session-name\">${txt.sessionNames.tech} - ${drill}<\/span><span class=\"session-time\">${times.tech} ${txt.minutesUnit}<\/span><\/div><div class=\"session-body\"><div class=\"session-desc\">${techContent}<\/div><div class=\"tips-box\"><div class=\"tips-title\">\ud83c\udfaf ${txt.tips.teaching}<\/div><div class=\"tips-content\">${objectiveDesc}<\/div><\/div><\/div><\/div>\n                    <div class=\"session-card\"><div class=\"session-header\"><span class=\"session-name\">${txt.sessionNames.tactic} - ${tactic}<\/span><span class=\"session-time\">${times.tactic} ${txt.minutesUnit}<\/span><\/div><div class=\"session-body\"><div class=\"session-desc\">${tacticContent}<\/div><div class=\"tips-box\"><div class=\"tips-title\">\ud83d\udcd0 ${txt.tips.tacticDetail}<\/div><div class=\"tips-content\">${tacticTip}<\/div><\/div><\/div><\/div>\n                    <div class=\"session-card\"><div class=\"session-header\"><span class=\"session-name\">${txt.sessionNames.game}<\/span><span class=\"session-time\">${gamePlan.gameMinutes} ${txt.minutesUnit}<\/span><\/div><div class=\"session-body\"><div class=\"session-desc\">${gameContent}<\/div><div class=\"tips-box\"><div class=\"tips-title\">\ud83c\udfc6 ${txt.tips.gameRule}<\/div><div class=\"tips-content\">${txt.matchRuleTip}<\/div><\/div><\/div><\/div>\n                    <div class=\"session-card\"><div class=\"session-header\"><span class=\"session-name\">${txt.sessionNames.cooldown}<\/span><span class=\"session-time\">${times.cool} ${txt.minutesUnit}<\/span><\/div><div class=\"session-body\"><div class=\"session-desc\">${coolContent}<\/div><div class=\"tips-box\"><div class=\"tips-title\">\ud83d\udcdd ${txt.tips.summary}<\/div><div class=\"tips-content\">${txt.reviewTip.replace('{objective}',objectiveItem)}<\/div><\/div><\/div><\/div>\n                    <div class=\"safety-tip\"><strong>${txt.tips.safety}<\/strong> ${safetyTip}<\/div>\n                    <div class=\"management-tip\"><strong>${txt.tips.management}<\/strong> ${managementTip}<\/div>\n                `;\n            }\n\n            function buildForm(lang) {\n                const txt = i18n[lang];\n                const container = document.getElementById('configForm');\n                if (!container) return;\n                const genderOptionsHtml = `<div class=\"gender-group\">${txt.genderOptions.map(opt => `<div class=\"gender-option\" data-gender=\"${opt}\">${opt}<\/div>`).join('')}<\/div>`;\n                const venueOptionsHtml = `<select id=\"venue\" class=\"input-field\">${txt.venueOptions.map(v => `<option value=\"${v}\">${v}<\/option>`).join('')}<\/select>`;\n                const drillCatOptions = Object.keys(drillCategories[lang]).map(cat => `<option value=\"${cat}\">${cat}<\/option>`).join('');\n                const tacticCatOptions = Object.keys(tacticCategories[lang]).map(cat => `<option value=\"${cat}\">${cat}<\/option>`).join('');\n                container.innerHTML = `\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.age}<\/label><input type=\"number\" id=\"age\" class=\"input-field\" value=\"12\" min=\"5\" max=\"18\"><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.gender}<\/label>${genderOptionsHtml}<\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.players}<\/label><input type=\"number\" id=\"players\" class=\"input-field\" value=\"14\" min=\"4\" max=\"30\"><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.duration}<\/label><input type=\"number\" id=\"duration\" class=\"input-field\" value=\"75\" min=\"30\" max=\"120\" step=\"5\"><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.objectiveCat}<\/label><select id=\"objectiveCat\" class=\"input-field\"><\/select><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.objectiveItem}<\/label><select id=\"objectiveItem\" class=\"input-field\"><\/select><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.drillCategory}<\/label><select id=\"drillCategory\" class=\"input-field\">${drillCatOptions}<\/select><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.drillItem}<\/label><select id=\"drillItem\" class=\"input-field\"><\/select><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.tacticCategory}<\/label><select id=\"tacticCategory\" class=\"input-field\">${tacticCatOptions}<\/select><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.tacticItem}<\/label><select id=\"tacticItem\" class=\"input-field\"><\/select><\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.venue}<\/label>${venueOptionsHtml}<\/div>\n                    <div class=\"form-group\"><label class=\"selector-title\">${txt.labels.intensity}<\/label><select id=\"intensity\" class=\"input-field\">${txt.intensityOptions.map(opt=>`<option value=\"${opt}\">${opt}<\/option>`).join('')}<\/select><\/div>\n                `;\n                \/\/ \u6027\u522b\u9009\u9879\u4ea4\u4e92\n                document.querySelectorAll('.gender-option').forEach(opt => {\n                    opt.addEventListener('click', function() {\n                        document.querySelectorAll('.gender-option').forEach(o => o.classList.remove('active'));\n                        this.classList.add('active');\n                        let radio = document.querySelector(`input[name=\"gender\"][value=\"${this.getAttribute('data-gender')}\"]`);\n                        if (!radio) {\n                            radio = document.createElement('input');\n                            radio.type = 'radio';\n                            radio.name = 'gender';\n                            radio.value = this.getAttribute('data-gender');\n                            radio.style.display = 'none';\n                            this.appendChild(radio);\n                        }\n                        radio.checked = true;\n                    });\n                });\n                const firstOpt = document.querySelector('.gender-option');\n                if (firstOpt) firstOpt.click();\n                \/\/ \u6559\u5b66\u76ee\u7684\u8054\u52a8\n                const catSelect = document.getElementById('objectiveCat');\n                catSelect.innerHTML = '';\n                for (let cat in objectiveData[lang]) { let opt = document.createElement('option'); opt.value = cat; opt.textContent = cat; catSelect.appendChild(opt); }\n                const updateObjectiveItems = () => {\n                    const cat = catSelect.value;\n                    const items = objectiveData[lang][cat];\n                    const itemSelect = document.getElementById('objectiveItem');\n                    itemSelect.innerHTML = '';\n                    for (let item in items) { let opt = document.createElement('option'); opt.value = item; opt.textContent = item; itemSelect.appendChild(opt); }\n                };\n                updateObjectiveItems();\n                catSelect.addEventListener('change', updateObjectiveItems);\n                \/\/ \u57fa\u7840\u80fd\u529b\u8054\u52a8\n                const drillCatSelect = document.getElementById('drillCategory');\n                const drillItemSelect = document.getElementById('drillItem');\n                const updateDrillItems = () => {\n                    const cat = drillCatSelect.value;\n                    const items = drillCategories[lang][cat] || [];\n                    drillItemSelect.innerHTML = items.map(i => `<option value=\"${i}\">${i}<\/option>`).join('');\n                };\n                updateDrillItems();\n                drillCatSelect.addEventListener('change', updateDrillItems);\n                \/\/ \u6218\u672f\u5b89\u6392\u8054\u52a8\n                const tacticCatSelect = document.getElementById('tacticCategory');\n                const tacticItemSelect = document.getElementById('tacticItem');\n                const updateTacticItems = () => {\n                    const cat = tacticCatSelect.value;\n                    const items = tacticCategories[lang][cat] || [];\n                    tacticItemSelect.innerHTML = items.map(i => `<option value=\"${i}\">${i}<\/option>`).join('');\n                };\n                updateTacticItems();\n                tacticCatSelect.addEventListener('change', updateTacticItems);\n            }\n\n            function updateStaticTexts(lang) {\n                const txt = i18n[lang];\n                document.querySelectorAll('[data-i18n]').forEach(el => {\n                    const key = el.getAttribute('data-i18n');\n                    if (txt[key] !== undefined) {\n                        if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n                            el.placeholder = txt[key];\n                        } else {\n                            el.textContent = txt[key];\n                        }\n                    }\n                });\n                document.getElementById('generateBtn').textContent = txt.btnGenerate;\n                document.getElementById('exportPdfBtn').textContent = txt.btnExport;\n                document.getElementById('planTitle').textContent = txt.planTitle;\n                document.getElementById('planSubtitle').textContent = txt.planSubtitle;\n                const brandText = document.querySelector('.brand-text');\n                if (brandText) brandText.textContent = txt.appTitle;\n                const langSwitchSpan = document.querySelector('.lang-switch span');\n                if (langSwitchSpan) langSwitchSpan.textContent = lang === 'zh' ? 'English' : '\u4e2d\u6587';\n            }\n\n            function generateAndShow(lang) {\n                const newHtml = generatePlanHTML(lang);\n                document.getElementById('planContent').innerHTML = newHtml;\n                const planSection = document.getElementById('planSection');\n                if (!planSection.classList.contains('visible')) planSection.classList.add('visible');\n            }\n\n            async function exportToPdf(lang) {\n                const planSection = document.getElementById('planSection');\n                if (!planSection.classList.contains('visible') || document.getElementById('planContent').innerHTML.trim() === '') {\n                    generateAndShow(lang);\n                    await new Promise(r => setTimeout(r, 100));\n                }\n                const element = planSection;\n                const configCard = document.querySelector('.card');\n                element.classList.add('pdf-export-mode');\n                configCard.classList.add('export-hide');\n                planSection.style.opacity = '1';\n                planSection.style.visibility = 'visible';\n                try {\n                    const canvas = await html2canvas(element, { scale: 2, backgroundColor: '#ffffff', logging: false });\n                    const imgData = canvas.toDataURL('image\/png');\n                    const { jsPDF } = window.jspdf;\n                    const pageWidth = 210, pageHeight = 297, margin = 10;\n                    const maxWidth = pageWidth - margin * 2, maxHeight = pageHeight - margin * 2;\n                    const imgAspect = canvas.width \/ canvas.height;\n                    let finalWidth = maxWidth, finalHeight = finalWidth \/ imgAspect;\n                    if (finalHeight > maxHeight) { finalHeight = maxHeight; finalWidth = finalHeight * imgAspect; }\n                    const x = (pageWidth - finalWidth) \/ 2, y = (pageHeight - finalHeight) \/ 2;\n                    const pdf = new jsPDF('p', 'mm', 'a4');\n                    pdf.addImage(imgData, 'PNG', x, y, finalWidth, finalHeight);\n                    const now = new Date();\n                    const fileName = `${now.getFullYear()}\u5e74${now.getMonth()+1}\u6708${now.getDate()}\u65e5_\u8bad\u7ec3\u8ba1\u5212${lang==='zh'?'':'_en'}.pdf`;\n                    pdf.save(fileName);\n                } catch(e) { alert('\u5bfc\u51fa\u5931\u8d25'); }\n                finally {\n                    element.classList.remove('pdf-export-mode');\n                    configCard.classList.remove('export-hide');\n                    planSection.style.opacity = '';\n                    planSection.style.visibility = '';\n                }\n            }\n\n            function setLanguage(lang) {\n                if (lang === currentLang) return;\n                currentLang = lang;\n                updateStaticTexts(currentLang);\n                buildForm(currentLang);\n                const planSection = document.getElementById('planSection');\n                planSection.classList.remove('visible');\n                document.getElementById('planContent').innerHTML = '';\n            }\n\n            const langBtn = document.getElementById('langSwitchBtn');\n            if (langBtn) {\n                langBtn.addEventListener('click', () => {\n                    const newLang = currentLang === 'zh' ? 'en' : 'zh';\n                    setLanguage(newLang);\n                });\n            }\n\n            document.getElementById('generateBtn').addEventListener('click', () => generateAndShow(currentLang));\n            document.getElementById('exportPdfBtn').addEventListener('click', () => exportToPdf(currentLang));\n\n            buildForm('zh');\n            updateStaticTexts('zh');\n            document.getElementById('planSection').classList.remove('visible');\n            document.getElementById('planContent').innerHTML = '';\n        })();\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<p class=\"has-text-align-center\"><strong>\u514d\u8d23\u58f0\u660e<\/strong><\/p>\n\n\n\n<p class=\"has-small-font-size\">\u6700\u540e\u66f4\u65b0\u65e5\u671f\uff1a2026\u5e744\u670821\u65e5<br>\u9002\u7528\u4ea7\u54c1\uff1a\u5f18\u987a\u6bc5\u8fbe\u8db3\u7403\u8bad\u7ec3\u7cfb\u7edf\uff08HSYD Football Training System\uff0c\u4ee5\u4e0b\u7b80\u79f0\u201c\u672c\u7cfb\u7edf\u201d\uff09<br>\u5728\u4f7f\u7528\u672c\u7cfb\u7edf\u524d\uff0c\u8bf7\u4ed4\u7ec6\u9605\u8bfb\u4ee5\u4e0b\u514d\u8d23\u58f0\u660e\u3002\u60a8\u5bf9\u672c\u7cfb\u7edf\u7684\u8bbf\u95ee\u6216\u4f7f\u7528\u884c\u4e3a\uff0c\u5373\u89c6\u4e3a\u60a8\u5df2\u9605\u8bfb\u3001\u7406\u89e3\u5e76\u540c\u610f\u63a5\u53d7\u672c\u58f0\u660e\u7684\u5168\u90e8\u7ea6\u675f\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u4e00\u3001\u8bad\u7ec3\u5efa\u8bae\u4ec5\u4f9b\u53c2\u8003<br>\u975e\u4e13\u4e1a\u533b\u7597\u6216\u8fd0\u52a8\u5eb7\u590d\u5efa\u8bae<br>\u672c\u7cfb\u7edf\u751f\u6210\u7684\u8bad\u7ec3\u8ba1\u5212\u3001\u6559\u6848\u3001\u7ec3\u4e60\u9879\u76ee\u3001\u6218\u672f\u5b89\u6392\u3001\u5f3a\u5ea6\u5efa\u8bae\u7b49\u6240\u6709\u5185\u5bb9\uff0c\u5747\u57fa\u4e8e\u516c\u5f00\u7684\u8db3\u7403\u9752\u8bad\u65b9\u6cd5\u8bba\u53ca\u8fd0\u52a8\u79d1\u5b66\u539f\u7406\u7f16\u5236\uff0c\u4e0d\u6784\u6210\u4efb\u4f55\u533b\u7597\u3001\u5eb7\u590d\u6216\u4e2a\u6027\u5316\u8fd0\u52a8\u5904\u65b9\u3002\u7528\u6237\u5e94\u6839\u636e\u81ea\u8eab\u5065\u5eb7\u72b6\u51b5\u3001\u4f53\u80fd\u6c34\u5e73\u53ca\u4e13\u4e1a\u533b\u5e08\u6216\u6301\u8bc1\u6559\u7ec3\u7684\u6307\u5bfc\uff0c\u5408\u7406\u8bc4\u4f30\u5e76\u8c03\u6574\u8bad\u7ec3\u5185\u5bb9\u3002<br>\u81ea\u613f\u4f7f\u7528\uff0c\u98ce\u9669\u81ea\u62c5<br>\u7528\u6237\u4f7f\u7528\u672c\u7cfb\u7edf\u751f\u6210\u7684\u8bad\u7ec3\u8ba1\u5212\u8fdb\u884c\u8bad\u7ec3\u65f6\uff0c\u5e94\u5145\u5206\u8ba4\u8bc6\u8db3\u7403\u8fd0\u52a8\u53ef\u80fd\u5e26\u6765\u7684\u8eab\u4f53\u635f\u4f24\u98ce\u9669\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u808c\u8089\u62c9\u4f24\u3001\u5173\u8282\u626d\u4f24\u3001\u9aa8\u6298\u3001\u5934\u90e8\u649e\u51fb\u7b49\uff09\u3002\u7528\u6237\u786e\u8ba4 \u81ea\u613f\u91c7\u7528\u672c\u7cfb\u7edf\u63d0\u4f9b\u7684\u8bad\u7ec3\u65b9\u6848\uff0c\u5e76\u81ea\u884c\u627f\u62c5\u6240\u6709\u8bad\u7ec3\u76f8\u5173\u7684\u98ce\u9669\u4e0e\u8d23\u4efb\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u4e8c\u3001\u5065\u5eb7\u4e0e\u5b89\u5168\u8b66\u793a<br>\u8bad\u7ec3\u524d\u8bc4\u4f30<br>\u5efa\u8bae\u7528\u6237\uff08\u6216\u7403\u5458\uff09\u5728\u5f00\u59cb\u4efb\u4f55\u8bad\u7ec3\u524d\u8fdb\u884c\u5168\u9762\u7684\u8eab\u4f53\u68c0\u67e5\uff0c\u5e76\u54a8\u8be2\u4e13\u4e1a\u533b\u751f\u6216\u8fd0\u52a8\u5eb7\u590d\u5e08\uff0c\u786e\u8ba4\u81ea\u8eab\u65e0\u5fc3\u8840\u7ba1\u75be\u75c5\u3001\u9aa8\u9abc\u808c\u8089\u635f\u4f24\u6216\u5176\u4ed6\u4e0d\u9002\u5b9c\u9ad8\u5f3a\u5ea6\u8fd0\u52a8\u7684\u7981\u5fcc\u75c7\u3002<br>\u8bad\u7ec3\u4e2d\u5f02\u5e38\u5904\u7406<br>\u82e5\u5728\u8bad\u7ec3\u4e2d\u51fa\u73b0\u80f8\u95f7\u3001\u5934\u6655\u3001\u5267\u70c8\u75bc\u75db\u3001\u547c\u5438\u56f0\u96be\u7b49\u5f02\u5e38\u75c7\u72b6\uff0c\u5e94\u7acb\u5373\u505c\u6b62\u8bad\u7ec3\uff0c\u5e76\u53ca\u65f6\u5c31\u533b\u3002\u672c\u7cfb\u7edf\u4e0d\u627f\u62c5\u56e0\u672a\u53ca\u65f6\u4e2d\u6b62\u8bad\u7ec3\u800c\u5bfc\u81f4\u7684\u4efb\u4f55\u540e\u679c\u3002<br>\u672a\u6210\u5e74\u4eba\u4f7f\u7528<br>\u672a\u6210\u5e74\u4eba\u4f7f\u7528\u672c\u7cfb\u7edf\u751f\u6210\u7684\u8bad\u7ec3\u8ba1\u5212\uff0c\u987b\u5728\u5bb6\u957f\u6216\u5408\u6cd5\u76d1\u62a4\u4eba\u7684\u966a\u540c\u4e0e\u76d1\u7763\u4e0b\u8fdb\u884c\u3002\u76d1\u62a4\u4eba\u5e94\u8bc4\u4f30\u8bad\u7ec3\u5f3a\u5ea6\u662f\u5426\u9002\u5408\u8be5\u672a\u6210\u5e74\u4eba\u7684\u8eab\u4f53\u72b6\u51b5\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u4e09\u3001\u77e5\u8bc6\u4ea7\u6743\u58f0\u660e<br>\u7cfb\u7edf\u5f52\u5c5e<br>\u672c\u7cfb\u7edf\u7684\u5168\u90e8\u6e90\u4ee3\u7801\u3001\u754c\u9762\u8bbe\u8ba1\u3001\u4ea4\u4e92\u903b\u8f91\u3001\u6570\u636e\u7ed3\u6784\u3001\u54c1\u724c\u6807\u8bc6\uff08\u201c\u5f18\u987a\u6bc5\u8fbe\u201d\u3001\u201cHSYD\u201d\uff09\u7b49\u77e5\u8bc6\u4ea7\u6743\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u8457\u4f5c\u6743\u3001\u5546\u6807\u6743\u3001\u4e13\u5229\u6743\u3001\u5546\u4e1a\u79d8\u5bc6\uff09\u5747\u5f52\u5f00\u53d1\u8005\u6240\u6709\u3002\u672a\u7ecf\u4e66\u9762\u8bb8\u53ef\uff0c\u4efb\u4f55\u5355\u4f4d\u6216\u4e2a\u4eba\u4e0d\u5f97\u590d\u5236\u3001\u4fee\u6539\u3001\u53cd\u7f16\u8bd1\u3001\u51fa\u552e\u6216\u7528\u4e8e\u5546\u4e1a\u8fd0\u8425\u3002<br>\u8bad\u7ec3\u5185\u5bb9\u6765\u6e90<br>\u7cfb\u7edf\u5185\u5d4c\u7684\u6559\u5b66\u76ee\u7684\u3001\u7ec3\u4e60\u9879\u76ee\u3001\u6218\u672f\u63cf\u8ff0\u7b49\u53c2\u8003\u4e86\u516c\u5f00\u51fa\u7248\u7684\u8db3\u7403\u9752\u8bad\u6559\u6750\u53ca\u6559\u7ec3\u5458\u57f9\u8bad\u8d44\u6599\uff0c\u672a\u4fb5\u72af\u4efb\u4f55\u7b2c\u4e09\u65b9\u7684\u8457\u4f5c\u6743\u3002\u5982\u6709\u6743\u5229\u65b9\u8ba4\u4e3a\u5185\u5bb9\u6d89\u53ca\u4fb5\u6743\uff0c\u8bf7\u901a\u8fc7\u6307\u5b9a\u8054\u7cfb\u65b9\u5f0f\u544a\u77e5\uff0c\u6211\u4eec\u5c06\u53ca\u65f6\u5904\u7406\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u56db\u3001\u6570\u636e\u4e0e\u9690\u79c1<br>\u672c\u5730\u5b58\u50a8<br>\u672c\u7cfb\u7edf\u4e3a\u7eaf\u524d\u7aef\u9759\u6001\u5e94\u7528\uff0c\u4e0d\u4f1a\u4e3b\u52a8\u6536\u96c6\u3001\u4e0a\u4f20\u6216\u5b58\u50a8\u4efb\u4f55\u7528\u6237\u4e2a\u4eba\u4fe1\u606f\u3002\u6240\u6709\u8f93\u5165\u7684\u53c2\u6570\uff08\u5e74\u9f84\u3001\u6027\u522b\u3001\u4eba\u6570\u3001\u8bad\u7ec3\u65f6\u957f\u7b49\uff09\u4ec5\u5728\u7528\u6237\u5f53\u524d\u6d4f\u89c8\u5668\u4f1a\u8bdd\u4e2d\u5904\u7406\uff0c\u5173\u95ed\u9875\u9762\u540e\u5373\u6d88\u5931\u3002<br>\u7f51\u7edc\u4f20\u8f93<br>\u672c\u7cfb\u7edf\u4e0d\u901a\u8fc7\u4efb\u4f55\u540e\u7aef\u63a5\u53e3\u4f20\u8f93\u6570\u636e\uff0c\u4e0d\u5b58\u5728\u6570\u636e\u6cc4\u9732\u98ce\u9669\u3002\u7528\u6237\u81ea\u884c\u4fdd\u5b58\u7684 PDF \u6587\u4ef6\u7531\u6d4f\u89c8\u5668\u76f4\u63a5\u751f\u6210\u5e76\u4e0b\u8f7d\uff0c\u5f00\u53d1\u8005\u4e0d\u5b58\u50a8\u4efb\u4f55\u526f\u672c\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u4e94\u3001\u8d23\u4efb\u9650\u5236<br>\u76f4\u63a5\u4e0e\u95f4\u63a5\u635f\u5931<br>\u5728\u9002\u7528\u6cd5\u5f8b\u5141\u8bb8\u7684\u6700\u5927\u8303\u56f4\u5185\uff0c\u5f00\u53d1\u8005\u4e0d\u5bf9\u56e0\u4f7f\u7528\u6216\u65e0\u6cd5\u4f7f\u7528\u672c\u7cfb\u7edf\u800c\u4ea7\u751f\u7684\u4efb\u4f55\u76f4\u63a5\u3001\u95f4\u63a5\u3001\u9644\u5e26\u3001\u7279\u6b8a\u3001\u60e9\u7f5a\u6027\u6216\u540e\u679c\u6027\u635f\u5931\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u8bad\u7ec3\u53d7\u4f24\u3001\u8bbe\u5907\u635f\u574f\u3001\u6570\u636e\u4e22\u5931\u3001\u5229\u6da6\u635f\u5931\u7b49\uff09\u627f\u62c5\u8d23\u4efb\uff0c\u5373\u4f7f\u5f00\u53d1\u8005\u5df2\u88ab\u544a\u77e5\u53ef\u80fd\u53d1\u751f\u6b64\u7c7b\u635f\u5931\u3002<br>\u7b2c\u4e09\u65b9\u5185\u5bb9<br>\u672c\u7cfb\u7edf\u53ef\u80fd\u5305\u542b\u6307\u5411\u7b2c\u4e09\u65b9\u7f51\u7ad9\u7684\u94fe\u63a5\uff08\u4f8b\u5982\u5b57\u4f53\u3001\u811a\u672c\u5e93\uff09\uff0c\u5f00\u53d1\u8005\u5bf9\u8fd9\u4e9b\u7b2c\u4e09\u65b9\u5185\u5bb9\u7684\u5b89\u5168\u6027\u3001\u51c6\u786e\u6027\u6216\u5408\u6cd5\u6027\u4e0d\u4f5c\u4efb\u4f55\u4fdd\u8bc1\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u516d\u3001\u4fee\u6539\u4e0e\u7ec8\u6b62<br>\u7248\u672c\u66f4\u65b0<br>\u5f00\u53d1\u8005\u4fdd\u7559\u968f\u65f6\u4fee\u6539\u3001\u6682\u505c\u6216\u7ec8\u6b62\u672c\u7cfb\u7edf\u7684\u6743\u5229\u3002\u66f4\u65b0\u540e\u7684\u514d\u8d23\u58f0\u660e\u5c06\u5728\u9875\u9762\u4e2d\u516c\u5e03\uff0c\u7528\u6237\u7ee7\u7eed\u4f7f\u7528\u89c6\u4e3a\u63a5\u53d7\u4fee\u6539\u5185\u5bb9\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\">\u8fdd\u89c4\u4f7f\u7528<br>\u82e5\u7528\u6237\u5229\u7528\u672c\u7cfb\u7edf\u4ece\u4e8b\u8fdd\u6cd5\u6d3b\u52a8\u6216\u4fb5\u72af\u4ed6\u4eba\u6743\u76ca\uff0c\u5f00\u53d1\u8005\u6709\u6743\u7ec8\u6b62\u5176\u4f7f\u7528\u8d44\u683c\uff0c\u5e76\u914d\u5408\u53f8\u6cd5\u673a\u5173\u8c03\u67e5\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u662f\u4e00\u4e2a\u667a\u80fd\u5316\u8db3\u7403\u8bad\u7ec3\u7f51\u7ad9\uff0c\u57fa\u4e8e\u56fd\u9645\u4f18\u79c0\u8db3\u7403\u4ff1\u4e50\u90e8\u7684\u8bad\u7ec3\u7279\u70b9\uff0c\u5b9a\u671f\u66f4\u65b0\u8bad\u7ec3\u6570\u636e\u7b97\u6cd5\uff0c\u4e3a\u5e7f\u5927\u8db3\u7403\u7231\u597d\u8005\u63d0\u4f9b\u5b66\u4e60\u53c2 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-20","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/pages\/20","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/comments?post=20"}],"version-history":[{"count":70,"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/pages\/20\/revisions"}],"predecessor-version":[{"id":242,"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/pages\/20\/revisions\/242"}],"wp:attachment":[{"href":"https:\/\/hsydfc.com\/index.php\/wp-json\/wp\/v2\/media?parent=20"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}