{"id":4476,"date":"2026-01-16T15:45:36","date_gmt":"2026-01-16T14:45:36","guid":{"rendered":"https:\/\/chinesische-sprachschule-stuttgart.de\/?page_id=4476"},"modified":"2026-01-22T08:27:30","modified_gmt":"2026-01-22T07:27:30","slug":"fileupload","status":"publish","type":"page","link":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/fileupload\/","title":{"rendered":"\u6587 \u4ef6 \u4e0a \u4f20"},"content":{"rendered":"    <style>\r\n        :root {\r\n            --primary: #0073aa;\r\n            --yt-red: #ff0000;\r\n            --view-green: #2ecc71;\r\n            --bg-light: #f8f9fa;\r\n            --border: #e9ecef;\r\n            --text-main: #333;\r\n            --text-sub: #666;\r\n        }\r\n\r\n        \/* \u4e3b\u5bb9\u5668 - \u76f4\u63a5\u663e\u793a *\/\r\n        #upload-app { max-width: 800px; margin: 20px auto; font-family: -apple-system, system-ui, sans-serif; }\r\n        \r\n        .up-card { background: #fff; padding: 25px; border-radius: 12px; border: 1px solid var(--border); box-shadow: 0 4px 12px rgba(0,0,0,0.05); }\r\n        .tab-group { display: flex; border-bottom: 2px solid var(--border); margin-bottom: 25px; gap: 20px; }\r\n        .tab-btn { padding: 10px 5px; cursor: pointer; font-weight: bold; color: #888; border-bottom: 3px solid transparent; transition: 0.2s; }\r\n        .tab-btn.active { color: var(--primary); border-bottom-color: var(--primary); }\r\n        .tab-btn.disabled { opacity: 0.5; pointer-events: none; }\r\n\r\n        .up-row { display: flex; gap: 15px; margin-bottom: 15px; }\r\n        .up-col { flex: 1; }\r\n        .up-label { display: block; font-weight: bold; margin-bottom: 8px; color: var(--text-main); font-size: 14px; }\r\n        .up-in, .up-sel { width: 100%; padding: 10px 12px; border: 1px solid var(--border); border-radius: 6px; font-size: 14px; box-sizing: border-box; background: #fff; }\r\n        \r\n        \/* \u62d6\u62fd\u4e0a\u4f20\u533a *\/\r\n        .up-drop { border: 2px dashed #cbd5e1; border-radius: 10px; padding: 40px 20px; text-align: center; background: var(--bg-light); cursor: pointer; transition: 0.2s; position: relative; }\r\n        .up-drop:hover, .up-drop.dragging { border-color: var(--primary); background: #f0f7ff; }\r\n        .locked { opacity: 0.6; pointer-events: none; background: #f5f5f5 !important; }\r\n\r\n        \/* \u8fdb\u5ea6\u6761\u4e0e\u72b6\u6001\u5c55\u793a\u4f18\u5316 *\/\r\n        .file-list { margin-top: 20px; border: 1px solid var(--border); border-radius: 8px; max-height: 250px; overflow-y: auto; }\r\n        .f-item { padding: 12px 15px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; font-size: 13px; align-items: center; background: #fff; }\r\n        .f-item:last-child { border-bottom: none; }\r\n        \r\n        .prog-wrap { margin-top: 15px; display: none; }\r\n        .prog-bar-bg { height: 10px; background: #eee; border-radius: 10px; overflow: hidden; }\r\n        .prog-fill { height: 100%; width: 0%; background: linear-gradient(90deg, var(--primary), #4facfe); transition: width 0.3s; }\r\n        \r\n        \/* \u5f7b\u5e95\u89e3\u51b3\u6587\u5b57\u91cd\u53e0 *\/\r\n        .prog-meta { display: flex; justify-content: space-between; gap: 10px; margin-top: 8px; font-size: 12px; color: var(--text-sub); font-family: monospace; flex-wrap: wrap; }\r\n        .stat-group { display: flex; gap: 15px; }\r\n        .stat-val { color: var(--primary); font-weight: bold; }\r\n\r\n        .up-btn { width: 100%; padding: 14px; border: none; border-radius: 8px; cursor: pointer; font-size: 16px; font-weight: bold; transition: 0.3s; margin-top: 20px; }\r\n        .btn-file { background: var(--view-green); color: #fff; opacity: 0.5; pointer-events: none; }\r\n        .btn-file.active { opacity: 1; pointer-events: auto; box-shadow: 0 4px 10px rgba(46,204,113,0.3); }\r\n        .btn-yt { background: var(--yt-red); color: #fff; box-shadow: 0 4px 10px rgba(255,0,0,0.2); }\r\n        \r\n        .mode-box { display: none; }\r\n        .mode-box.active { display: block; }\r\n        .auto-loading { background: #f0f0f0 url('https:\/\/i.gifer.com\/ZZ5H.gif') no-repeat right 10px center; background-size: 20px; }\r\n        .sys-sig { text-align: right; font-size: 10px; color: #cbd5e1; margin-top: 30px; font-family: monospace; user-select: none; }\r\n    <\/style>\r\n\r\n    <div id=\"upload-app\">\r\n        <div class=\"up-card\">\r\n            <div class=\"tab-group\">\r\n                <div class=\"tab-btn active\" id=\"t0\" onclick=\"swTab(0)\">\u666e\u901a\u6587\u4ef6\u4e0a\u4f20<\/div>\r\n                <div class=\"tab-btn\" id=\"t1\" onclick=\"swTab(1)\">YouTube \u89c6\u9891\u4fdd\u5b58<\/div>\r\n            <\/div>\r\n\r\n            <div class=\"up-row\">\r\n                <div class=\"up-col\">\r\n                    <label class=\"up-label\">\u73ed\u7ea7\u4fe1\u606f <span style=\"color:red\">*<\/span><\/label>\r\n                    <input type=\"text\" id=\"c\" class=\"up-in\" placeholder=\"\u5982\uff1a201\u73ed\">\r\n                <\/div>\r\n                <div class=\"up-col\">\r\n                    <label class=\"up-label\">\u6559\u5e08\u59d3\u540d <span style=\"color:red\">*<\/span><\/label>\r\n                    <input type=\"text\" id=\"t\" class=\"up-in\" placeholder=\"\u5982\uff1a\u738b\u8001\u5e08\">\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:20px\">\r\n                <label class=\"up-label\">\u9009\u62e9\u6d3b\u52a8\u76ee\u5f55 <span style=\"color:red\">*<\/span><\/label>\r\n                <select id=\"f\" class=\"up-sel\"><option>\u6b63\u5728\u540c\u6b65\u4e91\u7aef\u76ee\u5f55...<\/option><\/select>\r\n            <\/div>\r\n\r\n            <div id=\"m-file\" class=\"mode-box active\">\r\n                <div style=\"margin-bottom:20px\">\r\n                    <label class=\"up-label\">\u5907\u6ce8\u5185\u5bb9 (\u9009\u586b)<\/label>\r\n                    <textarea id=\"n\" class=\"up-in\" style=\"height:60px; resize: none;\" placeholder=\"\u5173\u4e8e\u4e0a\u4f20\u5185\u5bb9\u7684\u8865\u5145\u8bf4\u660e...\"><\/textarea>\r\n                <\/div>\r\n                <input type=\"file\" id=\"files\" style=\"display:none\" multiple onchange=\"hFiles(this.files)\">\r\n                <div class=\"up-drop\" id=\"drop-zone\" onclick=\"document.getElementById('files').click()\">\r\n                    <div style=\"font-weight:bold; font-size:16px; margin-bottom:8px\">\u70b9\u51fb\u6216\u62d6\u62fd\u6587\u4ef6\u5230\u8fd9\u91cc<\/div>\r\n                    <div style=\"font-size:12px; color:var(--text-sub)\">\u652f\u6301\u591a\u6587\u4ef6\u4e0a\u4f20\uff0c\u5355\u4e2a\u6700\u5927 500MB<\/div>\r\n                <\/div>\r\n                \r\n                <div id=\"preview\" class=\"file-list\" style=\"display:none\"><\/div>\r\n\r\n                <div id=\"prog-area\" class=\"prog-wrap\">\r\n                    <div class=\"prog-bar-bg\"><div id=\"fill\" class=\"prog-fill\"><\/div><\/div>\r\n                    <div class=\"prog-meta\">\r\n                        <div class=\"stat-group\">\r\n                            <span>\u901f\u5ea6: <span id=\"spd\" class=\"stat-val\">0.0 MB\/s<\/span><\/span>\r\n                            <span>\u5269\u4f59\u65f6\u95f4: <span id=\"eta\" class=\"stat-val\">--:--<\/span><\/span>\r\n                        <\/div>\r\n                        <span id=\"pct-txt\" class=\"stat-val\">0%<\/span>\r\n                    <\/div>\r\n                <\/div>\r\n                <button id=\"btn-up\" class=\"up-btn btn-file\" onclick=\"startUpload()\">\u786e\u8ba4\u4e0a\u4f20<\/button>\r\n            <\/div>\r\n\r\n            <div id=\"m-yt\" class=\"mode-box\">\r\n                <div style=\"margin-bottom:15px\">\r\n                    <label class=\"up-label\">YouTube \u89c6\u9891\u94fe\u63a5 <span style=\"color:red\">*<\/span><\/label>\r\n                    <input type=\"text\" id=\"yt-url\" class=\"up-in\" placeholder=\"https:\/\/www.youtube.com\/watch?v=...\" oninput=\"fetchYTTitle(this.value)\">\r\n                <\/div>\r\n                <div style=\"margin-bottom:15px\">\r\n                    <label class=\"up-label\">\u89c6\u9891\u5c55\u793a\u6807\u9898 <span style=\"color:red\">*<\/span><\/label>\r\n                    <input type=\"text\" id=\"yt-title\" class=\"up-in\" placeholder=\"\u81ea\u52a8\u83b7\u53d6\u6216\u624b\u52a8\u8f93\u5165\">\r\n                <\/div>\r\n                <div style=\"margin-bottom:15px\">\r\n                    <label class=\"up-label\">\u89c6\u9891\u5907\u6ce8 (\u9009\u586b)<\/label>\r\n                    <textarea id=\"yt-note\" class=\"up-in\" style=\"height:60px; resize: none;\"><\/textarea>\r\n                <\/div>\r\n                <button id=\"btn-yt\" onclick=\"saveYoutube()\" class=\"up-btn btn-yt\">\u4fdd\u5b58 YouTube \u89c6\u9891\u8d44\u6e90<\/button>\r\n            <\/div>\r\n\r\n            <div id=\"status\" style=\"margin-top:20px; text-align:center; font-size:14px;\"><\/div>\r\n        <\/div>\r\n        <div class=\"sys-sig\">ICHN Driver Uploader v1.0.5<\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n    (function(){\r\n        const GAS_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbxjZP3wtM8jnjS4HQIugIdp1BPG8j8TXXzGpDdBGlcJmBN5MNjCXZNYjmLrxKGeRp1t\/exec'; const GAS_KEY = 'YourSuperSecretKey2026_ChangeMe'; const ICHN_VER = 'v1.0.5';        const MAX_MB = 500, CHUNK = 2 * 1024 * 1024;\r\n        let selFiles = [], isUploading = false, fetchTimer = null;\r\n\r\n        \/\/ \u521d\u59cb\u5316\uff1a\u76f4\u63a5\u6267\u884c\uff0c\u4e0d\u518d\u9700\u8981 Auth \u68c0\u67e5\r\n        document.addEventListener(\"DOMContentLoaded\", () => {\r\n            fetchFolders();\r\n            initDragEvents();\r\n        });\r\n\r\n        \/\/ --- \u62d6\u62fd\u4e8b\u4ef6\u521d\u59cb\u5316 ---\r\n        function initDragEvents() {\r\n            const dz = document.getElementById('drop-zone');\r\n            if (!dz) return;\r\n\r\n            ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {\r\n                dz.addEventListener(eventName, e => {\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                }, false);\r\n            });\r\n\r\n            ['dragenter', 'dragover'].forEach(eventName => {\r\n                dz.addEventListener(eventName, () => dz.classList.add('dragging'), false);\r\n            });\r\n            ['dragleave', 'drop'].forEach(eventName => {\r\n                dz.addEventListener(eventName, () => dz.classList.remove('dragging'), false);\r\n            });\r\n\r\n            dz.addEventListener('drop', e => {\r\n                window.hFiles(e.dataTransfer.files);\r\n            }, false);\r\n        }\r\n\r\n        window.swTab = (i) => {\r\n            if(isUploading) return;\r\n            document.querySelectorAll('.tab-btn').forEach((e,x)=>e.classList.toggle('active',x===i));\r\n            document.getElementById('m-file').classList.toggle('active',i===0);\r\n            document.getElementById('m-yt').classList.toggle('active',i===1);\r\n            document.getElementById('status').innerText = \"\";\r\n        };\r\n\r\n        window.fetchYTTitle = (url) => {\r\n            if(!url.includes('http')) return;\r\n            const titleIn = document.getElementById('yt-title');\r\n            clearTimeout(fetchTimer);\r\n            fetchTimer = setTimeout(() => {\r\n                titleIn.classList.add('auto-loading');\r\n                fetch(`https:\/\/noembed.com\/embed?url=${encodeURIComponent(url)}`).then(r=>r.json()).then(d=>{\r\n                    titleIn.classList.remove('auto-loading');\r\n                    if(d.title) titleIn.value = d.title;\r\n                }).catch(() => titleIn.classList.remove('auto-loading'));\r\n            }, 600);\r\n        };\r\n\r\n        window.hFiles = (files) => {\r\n            if(isUploading || !files) return;\r\n            Array.from(files).forEach(f => {\r\n                if(f.size\/1024\/1024 > MAX_MB) return alert(f.name + \" \u8d85\u8fc7\u9650\u5236\u5927\u5c0f\");\r\n                if(!selFiles.some(x => x.name===f.name && x.size===f.size)) selFiles.push(f);\r\n            });\r\n            render(); chk();\r\n        };\r\n\r\n        window.del = (i) => { if(isUploading) return; selFiles.splice(i,1); render(); chk(); };\r\n\r\n        function render(){\r\n            const d = document.getElementById('preview');\r\n            d.style.display = selFiles.length ? 'block' : 'none';\r\n            d.innerHTML = selFiles.map((f,i) => `<div class=\"f-item\"><span>${f.name}<\/span>${isUploading?'\ud83d\udd12':`<button onclick=\"del(${i})\" style=\"color:red;border:none;background:none;cursor:pointer;\">[\u79fb\u9664]<\/button>`}<\/div>`).join('');\r\n        }\r\n\r\n        function chk(){\r\n            const ok = document.getElementById('c').value && document.getElementById('t').value && document.getElementById('f').value && selFiles.length;\r\n            const b = document.getElementById('btn-up');\r\n            b.classList.toggle('active', !!ok && !isUploading);\r\n            b.disabled = !ok || isUploading;\r\n            b.innerText = isUploading ? \"\u6b63\u5728\u4e0a\u4f20...\" : (ok ? `\u786e\u8ba4\u4e0a\u4f20 (${selFiles.length}\u4e2a\u6587\u4ef6)` : \"\u8bf7\u5b8c\u5584\u5fc5\u586b\u4fe1\u606f\");\r\n        }\r\n        ['c','t','f'].forEach(id => document.getElementById(id).addEventListener('input', chk));\r\n\r\n        function setUILock(locked) {\r\n            isUploading = locked;\r\n            const ids = ['c','t','f','n','yt-url','yt-title','yt-note','btn-up','btn-yt'];\r\n            ids.forEach(id => { const el = document.getElementById(id); if(el) { el.disabled = locked; el.classList.toggle('locked', locked); } });\r\n            document.getElementById('drop-zone').classList.toggle('locked', locked);\r\n            render();\r\n        }\r\n\r\n        window.startUpload = async () => {\r\n            if(isUploading || !selFiles.length) return;\r\n            setUILock(true);\r\n            document.getElementById('prog-area').style.display='block';\r\n            const cls = document.getElementById('c').value, tea = document.getElementById('t').value, fid = document.getElementById('f').value, note = document.getElementById('n').value;\r\n            const desc = `\u73ed\u7ea7:${cls}\\n\u8001\u5e08:${tea}\\n${note}`, meta = {className:cls, teacherName:tea, note:note};\r\n            \r\n            let fails = 0;\r\n            for(let i=0; i<selFiles.length; i++){\r\n                const f = selFiles[i], startTime = Date.now();\r\n                document.getElementById('status').innerText = `\u6b63\u5728\u4f20\u8f93 (${i+1}\/${selFiles.length}): ${f.name}`;\r\n                try {\r\n                    await uploadChunks(f, `[${cls} ${tea}] ${f.name}`, fid, desc, (pct, loaded) => {\r\n                        const totalPct = Math.floor(((i + pct\/100)\/selFiles.length)*100);\r\n                        document.getElementById('fill').style.width = totalPct + \"%\";\r\n                        document.getElementById('pct-txt').innerText = totalPct + \"%\";\r\n                        const elapsed = (Date.now() - startTime) \/ 1000;\r\n                        if(elapsed > 0.5) {\r\n                            const speed = loaded \/ elapsed; \r\n                            const remSec = (f.size - loaded) \/ speed;\r\n                            document.getElementById('spd').innerText = (speed\/1024\/1024).toFixed(2) + \" MB\/s\";\r\n                            document.getElementById('eta').innerText = formatTime(remSec);\r\n                        }\r\n                    }, meta);\r\n                } catch(e) { fails++; }\r\n            }\r\n            if(!fails) document.getElementById('status').innerHTML = \"<b style='color:green'>\u2705 \u5168\u90e8\u6587\u4ef6\u4e0a\u4f20\u6210\u529f\uff01<\/b><br><button onclick='location.reload()' class='up-btn active btn-file' style='width:auto;padding:8px 25px;'>\u7ee7\u7eed\u4e0a\u4f20<\/button>\";\r\n            else { document.getElementById('status').innerHTML = `<b style='color:red'>\u274c \u4e0a\u4f20\u4e2d\u65ad\uff1a${fails} \u4e2a\u6587\u4ef6\u5931\u8d25<\/b>`; setUILock(false); }\r\n        };\r\n\r\n        window.saveYoutube = async () => {\r\n            const cls = document.getElementById('c').value, tea = document.getElementById('t').value, fid = document.getElementById('f').value;\r\n            const url = document.getElementById('yt-url').value, title = document.getElementById('yt-title').value, note = document.getElementById('yt-note').value;\r\n            if(!cls || !tea || !fid || !url || !title) return alert(\"\u8bf7\u586b\u5199\u5b8c\u6574\u5e26\u661f\u53f7\u7684\u5fc5\u586b\u9879\");\r\n            setUILock(true);\r\n            const desc = `YT_LINK:${url}\\n\u73ed\u7ea7:${cls}\\n\u8001\u5e08:${tea}\\n${note}`;\r\n            let fd = new FormData();\r\n            fd.append('action', 'save_youtube'); fd.append('secret', GAS_KEY);\r\n            fd.append('folderId', fid); fd.append('url', url); fd.append('title', title);\r\n            fd.append('description', desc); fd.append('csvMeta', JSON.stringify({className:cls, teacherName:tea, note:note}));\r\n            try {\r\n                let res = await fetch(GAS_URL, {method:'POST', body:fd}).then(r=>r.json());\r\n                if(res.status==='success') document.getElementById('status').innerHTML = \"<b style='color:green'>\u2705 \u94fe\u63a5\u4fdd\u5b58\u6210\u529f<\/b><br><button onclick='location.reload()' class='up-btn active btn-yt' style='width:auto;padding:8px 25px;'>\u8fd4\u56de<\/button>\";\r\n                else throw new Error(res.message);\r\n            } catch(e) { alert(\"\u4fdd\u5b58\u5931\u8d25: \"+e.message); setUILock(false); }\r\n        };\r\n\r\n        async function uploadChunks(file, name, fid, desc, onProg, meta) {\r\n            let fd = new FormData();\r\n            fd.append('action', 'init'); fd.append('secret', GAS_KEY);\r\n            fd.append('folderId', fid); fd.append('fileName', name); fd.append('mimeType', file.type); fd.append('description', desc);\r\n            let init = await fetch(GAS_URL, {method:'POST', body:fd}).then(r=>r.json());\r\n            if(init.status !== 'success') throw new Error();\r\n            let url = init.uploadUrl, start = 0;\r\n            while(start < file.size) {\r\n                let end = Math.min(start + CHUNK, file.size);\r\n                let b64 = await new Promise(r => {\r\n                    let rd = new FileReader(); rd.onload = () => r(rd.result.split(',')[1]); rd.readAsDataURL(file.slice(start, end));\r\n                });\r\n                let cfd = new FormData();\r\n                cfd.append('action', 'upload_chunk'); cfd.append('secret', GAS_KEY);\r\n                cfd.append('uploadUrl', url); cfd.append('fileData', b64);\r\n                cfd.append('chunkStart', start); cfd.append('chunkEnd', end); cfd.append('fileSize', file.size);\r\n                if(end >= file.size) { \r\n                    cfd.append('csvMeta', JSON.stringify(meta));\r\n                    cfd.append('targetFolderId', init.targetFolderId);\r\n                    cfd.append('finalFileName', init.finalFileName);\r\n                }\r\n                await fetch(GAS_URL, {method:'POST', body:cfd});\r\n                start = end; onProg(Math.floor(start\/file.size*100), start);\r\n            }\r\n        }\r\n\r\n        async function fetchFolders() {\r\n            try {\r\n                const r = await fetch(GAS_URL + `?secret=${GAS_KEY}`);\r\n                const d = await r.json();\r\n                const s = document.getElementById('f');\r\n                if (!Array.isArray(d)) return s.innerHTML='<option>\u83b7\u53d6\u5931\u8d25<\/option>';\r\n                s.innerHTML='<option value=\"\">-- \u9009\u62e9\u76ee\u6807\u6587\u4ef6\u5939 --<\/option>' + d.map(x => `<option value=\"${x.id}\" ${x.isDefault?'selected':''}>${x.name}<\/option>`).join('');\r\n            } catch(e) { document.getElementById('f').innerHTML='<option>\u7f51\u7edc\u9519\u8bef<\/option>'; }\r\n        }\r\n\r\n        function formatTime(s) {\r\n            if(isNaN(s) || s <= 0) return \"00:00\";\r\n            let m = Math.floor(s \/ 60);\r\n            let sec = Math.floor(s % 60);\r\n            return `${m.toString().padStart(2,'0')}:${sec.toString().padStart(2,'0')}`;\r\n        }\r\n    })();\r\n    <\/script>\r\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-4476","page","type-page","status-publish","hentry"],"acf":[],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":4484,"url":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/filegallery\/","url_meta":{"origin":4476,"position":0},"title":"\u6587 \u4ef6 \u4e0b \u8f7d","author":"admin","date":"2026\u5e741\u670816\u65e5","format":false,"excerpt":"","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4754,"url":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/filemanager\/","url_meta":{"origin":4476,"position":1},"title":"\u6587 \u4ef6 \u7ba1 \u7406","author":"admin","date":"2026\u5e741\u670822\u65e5","format":false,"excerpt":"","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":903,"url":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/school-rules\/","url_meta":{"origin":4476,"position":2},"title":"Hausordnung","author":"admin","date":"2025\u5e744\u67084\u65e5","format":false,"excerpt":"\u5b89\u5168 \u6211\u4eec\u5171\u540c\u627f\u62c5\u7ef4\u62a4\u6821\u56ed\u5b89\u5168\u7684\u8d23\u4efb\uff0c\u6240\u6709\u5e08\u751f\u53ca\u53c2\u4e0e\u5b66\u6821\u6d3b\u52a8\u7684\u4eba\u5458\u90fd\u5e94\u79c9\u6301\u8c28\u614e\u3001\u8d1f\u8d23\u7684\u6001\u5ea6\uff0c\u9075\u5b88\u4ee5\u4e0b\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":15,"url":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/course-page\/","url_meta":{"origin":4476,"position":3},"title":"Kursangebote","author":"admin","date":"2025\u5e741\u670815\u65e5","format":false,"excerpt":"Stuttgart \u603b\u6821 \u4eb2\u5b50\u5b9d\u5b9d\u5c0f\u73ed\u3001\u5927\u73ed\uff0c\u56db\u4e94\u5feb\u8bfb\u73ed\uff0c\u5e7c\u513f\u73ed\uff084-5\u5c81\uff09\uff0c\u5b66\u524d\u73ed\uff085\u5c81\u4ee5\u4e0a\uff09\uff0c\u5404\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12,"url":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/school-intro-page\/","url_meta":{"origin":4476,"position":4},"title":"\u00dcBER UNS","author":"admin","date":"2025\u5e741\u670815\u65e5","format":false,"excerpt":"\u5b66\u6821\u6982\u51b5 \u5fb7\u56fd\u65af\u56fe\u52a0\u7279\u6c49\u8bed\u5b66\u6821\u521b\u5efa\u4e8e1997\u5e74\uff0c\u5e76\u5206\u522b\u4e8e2016\u5e74\u30012018\u5e74\u5728Ostfildern\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/chinesische-sprachschule-stuttgart.de\/media\/2025\/04\/SZ2-scaled.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/chinesische-sprachschule-stuttgart.de\/media\/2025\/04\/SZ2-scaled.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/chinesische-sprachschule-stuttgart.de\/media\/2025\/04\/SZ2-scaled.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/chinesische-sprachschule-stuttgart.de\/media\/2025\/04\/SZ2-scaled.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/chinesische-sprachschule-stuttgart.de\/media\/2025\/04\/SZ2-scaled.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/chinesische-sprachschule-stuttgart.de\/media\/2025\/04\/SZ2-scaled.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"jetpack_shortlink":"https:\/\/wp.me\/PgAON2-1ac","rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin","author_link":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/author\/admin\/"},"rttpg_comment":0,"rttpg_category":null,"rttpg_excerpt":null,"_links":{"self":[{"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/pages\/4476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/comments?post=4476"}],"version-history":[{"count":5,"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/pages\/4476\/revisions"}],"predecessor-version":[{"id":4483,"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/pages\/4476\/revisions\/4483"}],"wp:attachment":[{"href":"https:\/\/chinesische-sprachschule-stuttgart.de\/de_de\/wp-json\/wp\/v2\/media?parent=4476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}